Revit中圆弧的轨线分割(分段、分节)逻辑

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!

posted @ 2024-03-16 14:55  杂鱼Tong  阅读(28)  评论(0编辑  收藏  举报