一、前言
这篇开始,讲Revit GeoemtryObject
(几何对象)与其派生。
这个我们很早就接触到了,打开Revit项目,入眼的各种模型、线条,基本都有GeometryObject。它作为Element的属性,我们在使用lookup插件的时候,肯定也点开看过。
第一篇,就大致看一下几何对象的整体结构吧。
二、类层次结构与关联关系
2.1. 类层次结构
下图展示了几何对象的继承/派生结构。
加粗的是会着重讲的,其它的可能就会简单带过了。
2.2. 类关联关系
- 几何元素(G_Ele)包含几何实例(G_Instance)、几何实体(Solid)。
- 几何实例会包含几何元素,形成嵌套。(例:桌子->桌面、桌腿;桌腿->主干、腿垫)
- Solid 由 Edge 和 Face 组成。
- Solid 可以转化为 Mesh,但无法反过来。
- 具体的 Edge 中可以获取到抽象的 Curve。
- Profile、Point、PolyLine 这里暂时用不到。
三、GeometryObject
GeoemtryObject
是一众几何相关类的基类,这种基类上的东西一般是很少的。
这里呢,就3属性,全是只读。
属性 | 描述 |
---|---|
GraphicsStyleId | 几何对象的图形样式 |
IsElementGeometry | 是否直接从Element上获取 |
Visibility | 可见性 |
四、GeometryElement & GeoemtryInstance
这俩玩意儿类成员也很少。
先举个例子:
现在有一台破电脑,它现在只有主机、显示器、控制器了。控制器倒是键鼠手柄齐全,主机呢,就剩下纸壳箱、主板和俩硬盘了。emm…确实破,垃圾佬都不要。
这就是GeoemtryElement和GeoemtryInstance的关系了。
4.1. 几何元素
GeoemtryElement
,有什么好讲的,啥也木有。
方法就:① 获取包围盒,② 获取当前节点的变换,③ 拿到子构件
属性就:材质。
Solid获取,与基于Solid的包围盒计算,写过了,看这里。
4.2. 几何实例
GeometryInstance
,也就那么几个。
之前写的包围盒计算那篇没讲清楚的,在这里解释下。
GetInstanceGeoemtry
:获取基于实例拥有者坐标系的几何体。所以计算全局坐标系下的位置时,直接拿。
GetSymbolGeoemtry
:获取基于自身坐标系的几何体。所以计算全局坐标系下的位置时,需要应用父节点的变换矩阵。
所以呢,包围盒那篇中,采用以下任意一种写法都可以:
var transformedGeomElem1 = geometryInstance.GetInstanceGeometry();
var transformedGeomElem2 = geometryInstance.GetSymbolGeometry(geometryInstance.Transform);
// transformedGeomElem1 等同于 transformedGeomElem2
很好,又填坑了。
五、Solid
Solid
(实体)是由边界和面构成的,也就是采用的B-Rep
表示法。前面提到的Mesh
,则是采用顶点和三角面进行表示。
Solid也就这么点东西:
● 方法:① 计算重心,② 计算包围盒,③ 与线相交检测
● 属性:① 边的集合,② 面的集合,③ 表面积, ④ 体积。
需要注意的是,Solid可能没有边,但是一定有面。
比如放样路径和轮廓都为闭合圆的结构。
六、总结
- 这篇看了GeoemtryObject类的派生,各类的关联关系。
- 简单看了几何元素和几何实例。顺便填上了之前写计算包围盒时留下的坑。
- 材质也出现了,在GeoemtryElement上,但是我没有用过这玩意儿。想起来之前看到过一个插件,说是可以任意物体进行剪切。然后给了一个图,是在窗户上开了个口。有点意思,猜测是用材质、Solid、Cut、DirectShape这个来做的。以后再说吧