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!