Revit中圓弧的軌線分割(分段、分節)邏輯

5YWo發表於2024-03-16

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!

相關文章