八、元素几何信息的获取(1)
8.1几何(Geometry)
-
在Atuodesk.Revit.DB里包含了一些几何图形相关的类型,在API中用于几何图形的表示和处理,分为三大几何类型:
几何基元类:包括所有从GeometryObject派生出来的类
几何辅助类:包括一些从APIObject派生出来的几何相关的子类和一些值类型
几何集合类:包括一些实现了IEnumerable或者IEnumerator接口的几何相关的类型
-
几何基元类
**轮廓(Profile):**轮廓是可用来生成形状的单条线、一串连接起来的线或闭合的环。可以通过操纵轮廓来修改形状的几何图形。
**面(Face):**三维空间的实体面。其子类有:平面(PlanarFace)、规则曲面(RuledFace)、旋转面(RevolvedFace)、圆锥面(ConicalFace)、圆柱面(CylindricalFace)、Hermite曲面(HermiteFace)
**边(Edge)😗*三维空间实体边
**线(Curve):**参数曲线。其子类有:直线(Line)、圆弧线(Arc)、椭圆线(Ellipse)、螺旋线(CylindrcalHelix)、Hermite样条曲线(HermiteSpline)、NURBS样条曲线(NurbSpline)
**点(Point):**三维空间的点
**几何元素(GeometryElement):**一个元素的几何表示,包含了所有的几何信息
**几何实例(GeometryInstance):**一个类型图元的实例,可以取得与该实例相关的类型图元的几何信息
**网格(Mesh):**三角化网格用于描述三维面的形状
**实体(Solid):**三维实体
8.2几何信息
-
位置
在revit二次开发中用 Location 来表达
在revit中所有长度的尺寸用的单位都是英尺。1英尺=304.8mm。在编程中有关长度内容时一定要进行转换。转换有两种方式一个是用除以304.8 另一个是用UnitUtils这个类来转换。
using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using Autodesk.Revit.UI.Selection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GetInformation { [Transaction(TransactionMode.ReadOnly)] //事件 public class Information : IExternalCommand //实现接口 { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { //通过commandData获取UIDocument UIDocument uidoc = commandData.Application.ActiveUIDocument; //通过uidoc获取revit当前文档 Document doc = uidoc.Document; try { //新建一个wallFilter对象(或者叫实例化WallSelectionFilter类) var wallFilter = new WallSelectionFilter(); 将元素ID为428745的元素添加到选择集里面 //uidoc.Selection.SetElementIds(new List<ElementId> { new ElementId(428745) }); //在revit当前文档下,进行选择元素的操作 var reference = uidoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, wallFilter); //获取直接选择的这个元素 var element = doc.GetElement(reference.ElementId); //对所选择的元素进行类型转换(或者可以理解成指定获取元素的类别,比如:墙、楼板、屋顶等等) var wall = element as Wall; //墙的位置是基于线的 var location = wall.Location as LocationCurve; //获得线的数学表达 var curve = location.Curve; //选择墙的起点 var start = curve.GetEndPoint(0); //选择墙的终点 var end = curve.GetEndPoint(1); //选择墙的长度,把内部的单位转换出来成为毫米 var lenth = UnitUtils.ConvertFromInternalUnits(curve.Length, DisplayUnitType.DUT_MILLIMETERS); //用英尺=304.8mm直接转换长度单位 var lenth1 = curve.Length * 304.8; //输出 TaskDialog.Show("zzw", $"选择墙的起点{start}\n,选择墙的终点{end}\n,选择墙的长度{lenth}\n,或者输出为{lenth1}"); } catch (Autodesk.Revit.Exceptions.OperationCanceledException e) //注意,这里的OperationCanceledException一定要选用revit下的,而不能用system自带的 { } return Result.Succeeded; } public class WallSelectionFilter : ISelectionFilter //新建一个WallSelectionFilter类,实现ISelectionFilter接口 { public bool AllowElement(Element elem) //方法:允许什么样的元素 { //通过指定元素的category来,确定哪些元素被选择 if (elem.Category.Id.IntegerValue == (int)BuiltInCategory.OST_Walls) //如果他的ID对应的整型数值等于revit中墙的内置枚举类型参数的数值(这里需要强制转换为int类型) { return true; } else return false; } public bool AllowReference(Reference reference, XYZ position) //方法:是否允许引用 { return false; //设置为不允许 } } } }