Revit CurveLoop、Plane和多边形面积比(一)
前言
同前几篇一样,还是记录一些开发过程中遇到的问题,给出一些处理方法。
与前几篇相比,这篇可能要杂乱许多。
本来是想分几篇来写,每个点都写详细一些,但想想还是就这么写吧。一是由于近来事儿较多,想写的一些东西在脑袋里一闪而过,不记下来就要忘记了。二是这些在我的开发过程中是有些许关联的,索性就一块儿写了。
CurveLoop
上一篇中,写了获取元素Solid和计算其包围盒相关的内容,在获取元素Solid的部分,提到了不能使用Solid.Edges
来过滤空Solid,得使用Solid.Faces
。这节要写的CurveLoop
,便能够从中获取。
我们知道,Revit中模型使用B-Rep
表示法表示,一个Solid由面+边构成,如果要自己完全按面、边生产一个Revit Solid还是比较困难的,Revit也提供相关构造器BRepBuilder
,感兴趣的小伙伴可以去看看。
一个Face
,由其Surface
确定表面,由其EdgeLoops
确定范围。
CurveLoop:主要在创建几何体时使用,用以表示轮廓,如
GeometryCreationUtilities
和FamilyCreate
。EdgeLoops:一般是获取几何体结构时使用,其类型为
EdgeArrayArray
,一个EdgeArray
对应一个CurveLoop
。
由曲线集合创建CurveLoop
无论是从Solid.Faces中,还是从族的拉伸、放样、融合中,我们都能很轻易的拿到组成面的曲线集合,但是需要注意的是直接拿到的曲线集合不一定能够直接组成CurveLoop
。我们必须对曲线集合进行处理。
CurveLoop需要满足条件:① 必须连续(曲线之间首位相连),② 不能自交
这里解释,为什么拿到的曲线集合不能直接使用。
如下图:AB-BC-CA组成一个面Ⅰ,BD-DC-CB组成另一个面Ⅱ,其中BC共线。显然若面Ⅰ的曲线是直接可以使用的(B->C),那面Ⅱ的BC边就需要翻转(C->B)。
可以肯定的是,Revit是记录了这种曲线翻转信息的,但遗憾的是,我们似乎并不能获取到。
// BRepBuilder.AddCoEdge Method
public BRepBuilderGeometryId AddCoEdge(
BRepBuilderGeometryId loopId,
BRepBuilderGeometryId edgeId,
bool bCoEdgeIsReversed // 共边是否翻转
)
计算方法:
Curve.GetEndPoint(0|1)
获取曲线的两个端点,按端点相等(需添加误差)拼接即可。
CreateViaOffset方法
该方法用于对CurveLoop曲线轮廓进行放大、缩小
。
对于曲线上一点,其偏移方向为:该点切向量与(CurveLoop)法向量的叉乘
方向。
看图理解,清晰易懂。
CurveLoop打括号,不一定是用这个,若不存在平面,可能会用到曲线本身的法向量。Curve上也存在计算偏移的方法CreateOffset()
,推测CurveLoop偏移,就是调用了各个曲线的偏移方法。
// Curve.CreateOffset Method
public Curve CreateOffset(double offsetDist,XYZ referenceVector) // 偏移量,参照向量
GetPlane方法
好了,总算讲到题目上写的Plane
了,上面提到CurveLoop法向量,可以使用GetPlane()
方法获取,也可以先用HasPlane()
方法判断是否存在平面。
但是这里,要讲的显然不是这么点东西,具体的我们第二篇讲。
写在后面
怎么就这么结束了呢,晚了,有点困了,有空再写。
我的猫猫前几天做了绝育,带着脖套,一直冲着我喵喵叫(⓿_⓿),想让我给摘下来。
叫一下就要摸摸脑袋,写得慢了点。