通过Revit二次开发实现对平行轴网的快速标注。交互操作是框选轴网->点选尺寸标注出现的位置->生成两道尺寸标注。

要达到设想的结果一些地方需要特殊考虑:

  1. 框选操作容易误选轴网,起码要把与所选轴网不平行的轴网过滤出来。选用了第二步操作所选点的最近轴网作为轴网平行的参考基准。遍历所有框选的轴网,如果轴网与基准轴网的向量相同或相反,则判定为平行轴网;
  2. 外侧的尺寸标注需要标识最外侧的两根轴网,取得外侧两根轴网的方法也比较简单,遍历轴网,判断另外的轴网是否都在这根轴网的左边,或者都不在这根轴网的左边,即可获得最外侧的两根轴网;
  3. 在不同的视图比例下,尺寸标注的字体高度是不一样的,所以需要读取字体高度,根据当前视图的比例,计算出内侧尺寸标注的合适位置。

以下代码:

    class QGridDimension : IExternalCommand{public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){UIDocument uidoc = commandData.Application.ActiveUIDocument;Document doc = uidoc.Document;//获取轴网类型DimensionType dimType = null;FilteredElementCollector elems = new FilteredElementCollector(doc);foreach (DimensionType dt in elems.OfClass(typeof(DimensionType))){if (dt.Name == "轴网尺寸标注"){dimType = dt;//dimensionGrid(uidoc, dt);break;}}if (dimType != null){Document document = uidoc.Document;IList<Element> grids = uidoc.Selection.PickElementsByRectangle(new GridFilter(), "框选轴网");if (grids.Count > 1){XYZ selPoint = uidoc.Selection.PickPoint(ObjectSnapTypes.None, "选择尺寸定位位置");View activeView = uidoc.ActiveView;ReferenceArray referenceArray1 = new ReferenceArray();ReferenceArray referenceArray2 = new ReferenceArray();//获得最靠近选择点的轴网为参照基准List<Grid> lineGrid = new List<Grid>();Line referenceLine = null;double dis = double.MaxValue;foreach (Grid g in grids){double d = g.Curve.Distance(selPoint);Line line = g.Curve as Line;if (line != null){lineGrid.Add(g);if (d < dis){referenceLine = line;dis = d;}}}//获得内侧尺寸标注的引用foreach (Grid g in lineGrid){Line line = g.Curve as Line;if (line.Direction.IsAlmostEqualTo(referenceLine.Direction) || line.Direction.IsAlmostEqualTo(referenceLine.Direction.Multiply(-1))){referenceArray1.Append(new Reference(g));}}//获取外侧尺寸标注的引用foreach (Reference refGrid in referenceArray1){Grid g = doc.GetElement(refGrid) as Grid;Line line = g.Curve as Line;XYZ point1 = line.GetEndPoint(0);XYZ point2 = line.GetEndPoint(1);int i = 0;foreach (Reference _refGrid in referenceArray1){Grid _g = doc.GetElement(_refGrid) as Grid;Line _line = _g.Curve as Line;//XYZ point1 = _line.GetEndPoint(0);//XYZ point2 = _line.GetEndPoint(1);XYZ point = _line.GetEndPoint(0);if (PointOnTheLeft(point1, point2, point)){i += 1;}}if (i == 0 || i == referenceArray1.Size - 1){referenceArray2.Append(new Reference(g));}}//计算尺寸标注位置XYZ lineDir = referenceLine.Direction.CrossProduct(new XYZ(0, 0, 1));XYZ point_s = referenceLine.GetEndPoint(0);XYZ point_e = referenceLine.GetEndPoint(1);if (point_s.DistanceTo(selPoint) > point_e.DistanceTo(selPoint)){XYZ temPoint = point_s;point_s = point_e;point_e = temPoint;}XYZ offsetDir = point_e - point_s;double lenght = dimType.get_Parameter(BuiltInParameter.TEXT_SIZE).AsDouble();Line line_o = Line.CreateUnbound(selPoint, lineDir);Line line_i = Line.CreateUnbound(selPoint + offsetDir.Normalize() * lenght * activeView.Scale * 1.9, lineDir);//创建尺寸标注using (Transaction tran = new Transaction(document, "轴网尺寸标注")){tran.Start();document.Create.NewDimension(activeView, line_o, referenceArray2, dimType);document.Create.NewDimension(activeView, line_i, referenceArray1, dimType);tran.Commit();}}}else{TaskDialog.Show("err", "未有轴网尺寸标注类型");}return Result.Succeeded;}bool PointOnTheLeft(XYZ point1, XYZ point2, XYZ point){double r = (point1.X - point2.X) / (point1.Y - point2.Y) * (point.Y - point2.Y) + point2.X;if (r > point.X){return true;}return false;}}internal class GridFilter : ISelectionFilter{public bool AllowElement(Element elem){if (elem is Grid){return true;}return false;}public bool AllowReference(Reference reference, XYZ position){return true;}}

Revit二次开发_轴网快速标注相关推荐

  1. Revit二次开发之轴网标注

    Revit二次开发之轴网标注 using System; using System.Collections.Generic; using Autodesk.Revit.DB; using Autode ...

  2. Revit二次开发_显示最近的轴网交点

    做项目的时候有时要通过轴网定位与别人交流,常规操作是点选最近的两根轴网,看轴网的名称.可能我记性太差,一个地方总是要确认几次才放心.现在也有一些插件可以将轴圈显示在工作视图最外侧,但在轴网比较多且密集 ...

  3. Revit二次开发_修改快捷键

    目录 示例代码 Revit 2019命令ID 快捷键设置规则 保留的快捷键 Revit官方的似乎并没有提供修改快捷键的api,感谢@魏无忌的这篇博文--Revit开发之快捷键相关类_魏无忌的博客-CS ...

  4. Revit二次开发_将数据导入Excel

    有时需要将Revit模型的一些信息提取到Excel中进行处理或者是作为记录进行储存,但也许是因为Revit的数据结构相对复杂,并不支持直接将数据导出Excel,所以平时通过二次开发将信息输出到Exce ...

  5. Revit二次开发_快速切换快捷键的插件

    以前在办公室总要去同事电脑排查问题,或者有时要用公用电脑进行Revit演示,但不同使用者的快捷键方案不一样 而Revit的快捷键管理只能通过手动导入导出的方式进行快捷键的批量替换 通过这个扩展工具,R ...

  6. Revit二次开发_获取视图样式替换

    目的是用于导出视图样板中的图形替换,但Revit中视图样板其实也属于视图,所以对于所有视图都通用. 方法十分简单,视图中的样式替换都可以通过OverrideGraphicSettings读取,要注意的 ...

  7. Revit二次开发_计算管道长度时折算管件

    Revit中统计出来的管道长度是实际的管道长度,而传统算量是把管件占的长度也计算到管道中的,虽说从理论来说Revit的量更准确,但在不讨论对错的情况下,倘若我希望兼容传统的算量规则的话,也是可以让Re ...

  8. C# Revit二次开发基础/核心编程---建筑建模-标高和轴网

    一.本节课程 C# Revit二次开发基础/核心编程---建筑建模-标高和轴网 二.本节要讲解的知识点 1.标高的高度.创建标高 2.轴网曲线.创建轴网 具体内容 1.标高 标高是有限水平平面,大多数 ...

  9. Revit二次开发入门捷径_升维学习、降维打击

    问题 入门Revit二次开发有捷径吗? 答案 量子力学:有也没有.(皮一下:叠加态) 没有:目的地只有一个,路只有一条,学习没有捷径. 有:虽然路只有一条,但我们可以借助交通工具,缩短时间就是捷径. ...

最新文章

  1. 数据结构与算法:06 线性表
  2. golang exec cmd pipeline zombile 进程
  3. mysql数据库的打开失败_MySQL数据库启动失败解决
  4. html语言中span,html元素span标签的使用方法及作用
  5. 【转】上篇:陈皓谈程序员升级:职业规划就像软件工程
  6. boost::ReadablePropertyMapConcept用法的测试程序
  7. OpenCV在G-API上移植各向异性图像分割
  8. python绘制坐标点画出半径_24行Python代码让小球“弹”起来
  9. 2017西安交大ACM小学期数据结构 [又是树状数组、异或]
  10. JQuery. Parse XML children recursively. How? - Stack Overflow
  11. 数据库事务ACID详解(转载)
  12. Redis学习---(14)Redis 事务
  13. Axure经典案例高保真下载(智慧水务、智慧泵房、水厂监控、营收管理、DMA漏损、维护管理、档案管理、仓库管理、水质监控、数据中心、调度指挥中心)
  14. LInux终端中Ctrl+S卡死
  15. SHA1hash算法C语言实现
  16. 微信小程序入门9-微信开放平台unionId机制介绍
  17. extjs6 desktop 桌面多主题切换
  18. java调用 火眼臻睛,火眼臻睛车牌识别SDK评测
  19. Mac好用的硬盘数据恢复软件推荐
  20. 手披云雾开鸿蒙,描写泰山的诗句不是整首诗、注明作者

热门文章

  1. ✖ 2 problems (0 errors, 2 warnings) 0 errors and 2 warnings potentially fixable with the `--fix`
  2. random.RandomState()用处
  3. python求均方根,python中函数的均方根
  4. 现代汉语常用字与国标一级字的比较
  5. JAVA正则表达式判断字符串不能为空和空格、回车\n(Enter)
  6. 34. 实战:基于某api实现歌曲检索与下载(附完整源代码)
  7. UE4中蓝图实现输入框输入关键字搜索对应东西
  8. Intel8086处理器使用NASM汇编语言实现操作系统08-关于负数的相关处理idiv/cbw/cwde/cdqu/cwd/cdq/cdo/
  9. 集成微信支付后每次打开app都会跳转到微信显示正在连接
  10. 原理图,PCB设计软件