Revit中圆弧的轨线分割(分段、分节)逻辑
问题由来
早先开发一个插件,有个为风管模型内外都套一层模型的(内衬、外衬)的需求。
Revit管类(管道、风管)模型本身就有添加内外衬的功能,但是对于复杂的族,添加的就有问题了,可能无法将模型包裹,也可能会出现突出的边角。而且Revit管类模型是实心表示的,生成的覆盖模型也是实心的(数值上是空心计算的),这也是上面需求的由来。
回到问题,那这与圆弧的轨线分割逻辑什么关系呢?
嘿,一些管道进行了分段(分节),也就是其放样路径勾选了轨线分割
,那我们自己生成的内外衬自然是也需要进行分段的。
轨线分割:Revit
放样
中,圆弧
(Arc
)部分可以进行轨线分割,其它类型线条不支持。
分段逻辑
分段逻辑如下图,看图就行。
分段数计算
轨线分割中,有个叫“最大分段角度
”的属性,设置这个属性可以改变管道分段的数目。
PS:作为不会操作Revit的开发者,我不太理解为啥用角度来控制分段数,因为分段数对应的是一个角度区间
。
分段数 = (圆弧角度 / 分段角度)向上取整
int arc_segment_count = (int)Math.Ceiling(arc_angle / angle);
如圆弧总150°,这样分段角度设定在[50°,75°)区间内的,都是分3大段。
注意弧线端点处是“半段”,所以总体可以视为 2倍的“半段”。
分段路径计算
我们知道半径,知道“半段”的角度,就可以算到图中点P了。
而路径就是由原弧线一个端点经由转折点(点P),到达另一个端点的线段组成。
// 伪代码
double L = r / Math.Cos(segment_angle_half);
XYZ B = arc.Evaluate(i / segment_count); // segment_count 半段数
XYZ normal = (B - O).Normalize();
XYZ P = O + noraml * L;
XYZ
是Revit API 中的三维点,同Vector3;
i
:“半段”的下标。i
为奇数时,计算到转折点;为偶数时,计算到切点
算到各转折点后,把点串起来,就行了。
Over!
标签:分割,轨线,半段,圆弧,Revit,分段 From: https://www.cnblogs.com/tzq0307/p/18077070