前言

本文介绍 Revit API 的尺寸标注。

内容

在 Revit API 中,尺寸标注相关的有三个类:DimensionAngularDimensionSpotDimension
后两者是 Dimension 的子类。

对应到 UI:

创建标注

Revit 中创建标注的地方并不统一。分别在 Autodesk.Revit.Creation.ItemFactoryBaseAutodesk.Revit.Creation.FamilyItemFactoryAutodesk.Revit.Creation.Document中。其中,后两者继承自第一个类。

Autodesk.Revit.Creation.ItemFactoryBase, 创建对齐标注和线型标注,Alignment 是约束:

namespace Autodesk.Revit.Creation
{public class ItemFactoryBase : APIObject{public Dimension NewAlignment(View view, Reference reference1, Reference reference2);public Dimension NewDimension(View view, Line line, ReferenceArray references, DB.DimensionType dimensionType);public Dimension NewDimension(View view, Line line, ReferenceArray references);}
}

在实际使用中,Revit 文件和 Revit 族文件使用上稍有差异。
Revit 文件:

Dimension newDimension = doc.Create.NewDimension(doc.ActiveView, newLine2, referenceArray);

Revit 族文件,实际对应的是 FamilyItemFactory 里面的方法:

dim = m_document.FamilyCreate.NewDimension(view, line, refArray);

如下所示,在族文件里,除了对齐标注和线型标注,可以做角度、半径、直径、弧长的尺寸标注。从另一个角度可以说明,在 Revit 文件中,可能不能创建这些类型的尺寸标注,需要自己去验证一下。

namespace Autodesk.Revit.Creation
{public class FamilyItemFactory : ItemFactoryBase{public Dimension NewAngularDimension(View view, Arc arc, Reference firstRef, Reference secondRef);public Dimension NewAngularDimension(View view, Arc arc, Reference firstRef, Reference secondRef, DB.DimensionType dimensionType);public Dimension NewArcLengthDimension(View view, Arc arc, Reference arcRef, Reference firstRef, Reference secondRef);public Dimension NewArcLengthDimension(View view, Arc arc, Reference arcRef, Reference firstRef, Reference secondRef, DB.DimensionType dimensionType);public Dimension NewDiameterDimension(View view, Reference arcRef, DB.XYZ origin);public Dimension NewLinearDimension(View view, Line line, ReferenceArray references);public Dimension NewLinearDimension(View view, Line line, ReferenceArray references, DB.DimensionType dimensionType);public Dimension NewRadialDimension(View view, Reference arcRef, DB.XYZ origin);public Dimension NewRadialDimension(View view, Reference arcRef, DB.XYZ origin, DB.DimensionType dimensionType);}
}

创建高程点标注:

namespace Autodesk.Revit.Creation
{public class Document : ItemFactoryBase{public SpotDimension NewSpotCoordinate(View view, Reference reference, DB.XYZ origin, DB.XYZ bend, DB.XYZ end, DB.XYZ refPt, bool hasLeader);public SpotDimension NewSpotElevation(View view, Reference reference, DB.XYZ origin, DB.XYZ bend, DB.XYZ end, DB.XYZ refPt, bool hasLeader);}
}

创建的过程是类似的,以 NewDimension 为例:
Revit API 开发(3):用两个点创建一个标注

线性标注的例子


逻辑:

  1. 用户选中墙(这个例子仅仅支持墙的方向在平面视图中从左往右,其它方向自行修改代码)
  2. 检测墙的几何图形,找到端点的两个面(通过法线来判断)
  3. 从一个面计算得到坐标在 UV(0,0) 的点,然后投影到另一个面
  4. 把这两个点都平移一段距离(吐槽 line.CreateOffset 健壮性太差)
  5. 创建线性标注,doc.Create.NewDimension(uiDoc.ActiveView, line, referenceArray)

完整代码:

class CreateDimensionCommand : IExternalCommand
{public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){UIDocument uiDoc = commandData.Application.ActiveUIDocument;Document doc = uiDoc.Document;Face face1 = null;Face face2 = null;Reference reference = uiDoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);Element elem = doc.GetElement(reference.ElementId);Options options = new Options();options.View = uiDoc.ActiveView;options.ComputeReferences = true;GeometryElement geometryElement = elem.get_Geometry(options);foreach (GeometryObject gObj in geometryElement){Solid solid = gObj as Solid;foreach (Face face in solid.Faces){XYZ normal = face.ComputeNormal(new UV(0, 0));if (Math.Abs(normal.X) > 0.1){if (normal.X > 0.1){face1 = face;}else{face2 = face;}}}}if (face1 != null && face2 != null){Transaction tran = new Transaction(doc, "Create Dimension");tran.Start();XYZ p1 = face1.Evaluate(new UV(0, 0));XYZ p2 = face2.Project(p1).XYZPoint;p1 = new XYZ(p1.X, p1.Y + 10.0, p1.Z);p2 = new XYZ(p2.X, p2.Y + 10.0, p2.Z);Line line = Line.CreateBound(p1, p2);ReferenceArray referenceArray = new ReferenceArray();referenceArray.Append(face1.Reference);referenceArray.Append(face2.Reference);doc.Create.NewDimension(uiDoc.ActiveView, line, referenceArray);tran.Commit();}return Result.Succeeded;}
}

高程点的例子


逻辑:

  1. 用户选中墙(这个例子仅仅支持墙的方向在平面视图中从左往右,其它方向自行修改代码)
  2. 检测墙的几何图形,找到顶面(通过法线来判断)
  3. 从一个面计算得到坐标在 UV(0,20) 的点作为 origin(注意和你选的面有关,不一定是这个点作为起点)
  4. 计算几个转角点 bend,终点 end,以及 refPt,这个点似乎没有什么作用
  5. 设置是否需要箭头
  6. 创建线性标注,doc.Create.NewSpotElevation(uiDoc.ActiveView, topFaceRef, origin, bend, end, refPt, hasLeader)
class CreateSpotDimensionCommand : IExternalCommand
{public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements){UIDocument uiDoc = commandData.Application.ActiveUIDocument;Document doc = uiDoc.Document;Reference reference = uiDoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);Face upFace = null;Element elem = doc.GetElement(reference.ElementId);Options options = new Options();options.View = uiDoc.ActiveView;options.ComputeReferences = true;GeometryElement geometryElement = elem.get_Geometry(options);foreach (GeometryObject gObj in geometryElement){Solid solid = gObj as Solid;foreach (Face face in solid.Faces){XYZ normal = face.ComputeNormal(new UV(0, 0));if (normal.Z > 0.1){upFace = face;}}}if (upFace != null){Reference topFaceRef = upFace.Reference;Transaction tran = new Transaction(doc, "Create Dimension");tran.Start();XYZ origin = upFace.Evaluate(new UV(0, 20));XYZ bend = new XYZ(origin.X + 10.0, origin.Y, origin.Z + 10.0);XYZ end = new XYZ(bend.X + 10.0, bend.Y, bend.Z);XYZ refPt = origin;bool hasLeader = true;doc.Create.NewSpotElevation(uiDoc.ActiveView, topFaceRef, origin, bend, end, refPt, hasLeader);tran.Commit();}return Result.Succeeded;}
}

Revit API: Dimension 尺寸标注相关推荐

  1. Revit API:找到轮廓族的路径

    前言 以封檐板为例,介绍如何找到某个族中使用的轮廓族. 内容 如下图所示,这是在屋顶边缘家的封檐板: 封檐板的类型中有一个轮廓的属性: 如何通过 Revit API 去获取这个轮廓? 从封檐板获取类型 ...

  2. Revit API、AddInManager、RevitLookup、SDK的用途

    关注公众号及时获取文章更新 NET versions are: .NET 4.0 for Revit 2014, .NET 4.5 for Revit 2015/2016/2017, .NET 4.5 ...

  3. Revit API:View 视图概述

    前言 本文介绍 Revit 视图相关的基本接口. 内容 View 继承结构 所有的视图都是继承自 Autodesk.Revit.DB.View,分别对应各种视图类型. View 的实例 以官方给的文件 ...

  4. 为 Revit API 插件创建 WPF 窗口的基本项目(Revit API+WPF 系列 2/3)

    在本系列的第二部分中,我们将讨论在创建 WPF 窗口时应用的基本项目. 为了继续,请确保您的插件项目能够创建 WPF 窗口.如果没有,您最好创建一个具有 WPF 功能的项目模板并创建另一个新项目.然后 ...

  5. Revit API 开发 (10): ExtensibleStorage 外部存储

    前言 很多时候,需要往Revit的文件里面放自己的数据.这里简单介绍一下 Revit API 如何处理数据的保存和读取,并且这些数据是绑定到具体的构件上的.另外,也可以自己创建一个 DataStora ...

  6. Revit API:Element 继承体系

    继 "Revit API 开发周边:得到 Element 的所有子类" 之后,整理了一下所有 Element 的子类,内容源自 Revit SDK 中的 RevitAPI.chm ...

  7. 如何调用Revit API实现风道末端与风管连接?

    将风道末端连接到风管上,在Revit的UI界面上操作步骤如下:选择"风道末端"->"风道末端安装到风管上"->"拾取风管". 那 ...

  8. Revit API:预制零件 Fabrication Part

    前言 预制零件是 Revit 系统的功能,这个系统指的是水暖电系统.预制零件在 Revit 的软件系统中以 FabricationPart 的形式出现,它的数据源头并不在 Revit 里,而是从 Au ...

  9. Revit API: DWG翻模的基本原理

    前言 市场上把 DWG 翻模成 Revit 的软件有很多,主要还是有很大的需求.Revit 相比与 CAD, 门槛还是要高很多.那么 DWG 翻模的基本原理是什么?如何自己也简单的翻个模呢? DWG ...

最新文章

  1. Clion 远程开发 配置
  2. 一个黑魔法,竟能让Python支持方法重载
  3. vc mysql封装类_Oracle OCI API封装类VC数据库源码下载-华软网
  4. DIV背景半透明,DIV中的字不半透明
  5. C#通过属性名字符串获取、设置对象属性值
  6. 国产木乃伊走进CTO编辑部
  7. python 单位根检验代码_python时间序列分析
  8. 随机生成指定个数学生的语文数学外语成绩并求平均值
  9. idea类文件前面有个小叉号
  10. v3 微信api 请求微信_GitHub - helibin/wechatpay-postman-script: 微信支付API v3的调试工具...
  11. vivo x6plus支持html,vivo x6plus手机USB驱动
  12. matlab的hilbert变换的实现
  13. 基于WinPcap的网络流量在线分析系统的设计与实现
  14. java 查询条件的封装_java封装前端查询条件通用版|chu
  15. (转载)Linux内核源代码情景分析---第四章 进程与进程调度
  16. HTML 与 CSS
  17. 网站提供的下载IE8很慢 由于Microsoft 联机服务暂时不可用,SmartScreen筛选器无法检查此网站。...
  18. 知识蒸馏-Yolov3
  19. 【D3D11游戏编程】学习笔记十一:基本几何体绘制
  20. 飞桨分布式训练又推新品,4D混合并行可训千亿级AI模型

热门文章

  1. OpenCV学习17_ 分水岭算法
  2. 6:求指定范围内的素数
  3. JavaWeb知识点总结
  4. iphone SE 自带视频播放器要求的视频格式转换参数
  5. Go语言Seelog入门
  6. mac浏览器打不开html,Mac电脑能联网但是浏览器打不开网页怎么解决
  7. 项目一 认识Linux操作系统
  8. 社团管理系统软件测试,软件测试大作业——社团管理系统(19页)-原创力文档...
  9. 阿里云天池大赛赛题(机器学习)——天猫用户重复购买预测(完整代码)
  10. 11 万字的字节码编程系列合集放送(ASM、Javassist、Byte-buddy、Javaagent)