八、元素几何信息的获取(1)

本文详细介绍了Autodesk.Revit.DB中的几何图形类型,如轮廓、面、边、线、点等,以及如何在Revit中获取和处理元素的位置、长度单位转换。通过实例展示了如何获取选定墙的起点、终点和长度,以及使用WallSelectionFilter进行元素筛选。
摘要由CSDN通过智能技术生成

八、元素几何信息的获取(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;  //设置为不允许
                }
            }
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值