20. Revit API: 几何对象(一)

一、前言

这篇开始,讲Revit GeoemtryObject(几何对象)与其派生。

这个我们很早就接触到了,打开Revit项目,入眼的各种模型、线条,基本都有GeometryObject。它作为Element的属性,我们在使用lookup插件的时候,肯定也点开看过。

第一篇,就大致看一下几何对象的整体结构吧。


二、类层次结构与关联关系

2.1. 类层次结构

下图展示了几何对象的继承/派生结构。

加粗的是会着重讲的,其它的可能就会简单带过了。

在这里插入图片描述

2.2. 类关联关系

  1. 几何元素(G_Ele)包含几何实例(G_Instance)、几何实体(Solid)。
  2. 几何实例会包含几何元素,形成嵌套。(例:桌子->桌面、桌腿;桌腿->主干、腿垫)
  3. Solid 由 Edge 和 Face 组成。
  4. Solid 可以转化为 Mesh,但无法反过来。
  5. 具体的 Edge 中可以获取到抽象的 Curve。
  6. Profile、Point、PolyLine 这里暂时用不到。

在这里插入图片描述


三、GeometryObject

GeoemtryObject是一众几何相关类的基类,这种基类上的东西一般是很少的。

这里呢,就3属性,全是只读

属性描述
GraphicsStyleId几何对象的图形样式
IsElementGeometry是否直接从Element上获取
Visibility可见性

image.png


四、GeometryElement & GeoemtryInstance

这俩玩意儿类成员也很少。

先举个例子:
现在有一台破电脑,它现在只有主机、显示器、控制器了。控制器倒是键鼠手柄齐全,主机呢,就剩下纸壳箱、主板和俩硬盘了。emm…确实破,垃圾佬都不要。

这就是GeoemtryElement和GeoemtryInstance的关系了。
在这里插入图片描述

4.1. 几何元素

GeoemtryElement,有什么好讲的,啥也木有。
image.png
方法就:① 获取包围盒,② 获取当前节点的变换,③ 拿到子构件
属性就:材质。

Solid获取,与基于Solid的包围盒计算,写过了,看这里

4.2. 几何实例

GeometryInstance,也就那么几个。
之前写的包围盒计算那篇没讲清楚的,在这里解释下。
image.png

GetInstanceGeoemtry:获取基于实例拥有者坐标系的几何体。所以计算全局坐标系下的位置时,直接拿。

GetSymbolGeoemtry:获取基于自身坐标系的几何体。所以计算全局坐标系下的位置时,需要应用父节点的变换矩阵。

所以呢,包围盒那篇中,采用以下任意一种写法都可以:

var transformedGeomElem1 = geometryInstance.GetInstanceGeometry(); 
var transformedGeomElem2 = geometryInstance.GetSymbolGeometry(geometryInstance.Transform);

// transformedGeomElem1 等同于 transformedGeomElem2

很好,又填坑了。


五、Solid

Solid(实体)是由边界和面构成的,也就是采用的B-Rep表示法。前面提到的Mesh,则是采用顶点和三角面进行表示。

在这里插入图片描述

Solid也就这么点东西:

● 方法:① 计算重心,② 计算包围盒,③ 与线相交检测
● 属性:① 边的集合,② 面的集合,③ 表面积, ④ 体积。

需要注意的是,Solid可能没有边,但是一定有面。
比如放样路径和轮廓都为闭合圆的结构。

六、总结

  1. 这篇看了GeoemtryObject类的派生,各类的关联关系。
  2. 简单看了几何元素和几何实例。顺便填上了之前写计算包围盒时留下的坑。
  3. 材质也出现了,在GeoemtryElement上,但是我没有用过这玩意儿。想起来之前看到过一个插件,说是可以任意物体进行剪切。然后给了一个图,是在窗户上开了个口。有点意思,猜测是用材质、Solid、Cut、DirectShape这个来做的。以后再说吧
  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Revit API 中,CurveLoop 表示一个封闭的曲线路径,可以用于表示详图线的几何图形。要判断 CurveLoop 是否闭合,可以通过判断起点和终点是否重合来实现。具体方法是获取 CurveLoop 的第一个和最后一个 Curve 对象的起点和终点坐标,然后通过比较这两个坐标是否相等来判断 CurveLoop 是否闭合。 以下是一个示例代码: ```csharp // 获取详图线元素 Element elem = ...; // 获取详图线的 CurveLoop 对象 CurveLoop curveLoop = ((DetailCurve)elem).GeometryCurveLoop; // 获取 CurveLoop 的第一个和最后一个 Curve 对象 Curve firstCurve = curveLoop.First(); Curve lastCurve = curveLoop.Last(); // 获取第一个 Curve 的起点和终点坐标 XYZ firstStartPoint = firstCurve.GetEndPoint(0); XYZ firstEndPoint = firstCurve.GetEndPoint(1); // 获取最后一个 Curve 的起点和终点坐标 XYZ lastStartPoint = lastCurve.GetEndPoint(0); XYZ lastEndPoint = lastCurve.GetEndPoint(1); // 判断 CurveLoop 是否闭合 if (firstStartPoint.IsAlmostEqualTo(lastEndPoint) && firstEndPoint.IsAlmostEqualTo(lastStartPoint)) { // CurveLoop 闭合 } else { // CurveLoop 不闭合 } ``` 需要注意的是,以上代码适用于 CurveLoop 是单个封闭路径的情况。如果 CurveLoop 由多个路径构成,需要遍历所有路径进行判断。另外,以上代码中的 elem 变量需要根据具体场景进行获取,可以使用 Revit API 的 FilteredElementCollector 类来获取 DetailCurve 元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值