殼的建立

November 26, 2021

很多時候,需要為模型建立一層殼,像是盒子、筆筒、花瓶、中空球等。

運用減集

如果是具有輻射概念的形狀,例如方形、圓等,要建立殼很簡單,將形狀大的包住小的後擠出,就會有殼了。例如:

import cadquery as cq

w = 100
thickness = 1
height = 50

box = (cq.Workplane()
         .rect(w, w).rect(w - thickness, w - thickness).extrude(height) # 牆
         .box(w, w, thickness)  # 底部
      )

這會建立以下的模型:

殼的建立

然而,對於複雜的形狀,如上減去一個厚度,或者單純地縮放形狀,無法剛好讓殼的厚度相同,這時可以透過 offset2D 方法,例如:

import cadquery as cq

thickness = 1
height = 50

result = (cq.Workplane()
            # 牆
            .threePointArc((10, 20), (0, 10)).close().offset2D(-thickness)
            .moveTo(0, 0).threePointArc((10, 20), (0, 10)).close()
            .extrude(height)
            # 底部
            .moveTo(0, 0).threePointArc((10, 20), (0, 10)).close()
            .extrude(thickness)
         )

offset2D 方法的作用,相當於沿著形狀邊緣,依指定的距離走一圈,距離可以是正或負數,正數的話就是沿著形狀外圍走,負就是沿著形狀內緣走,這會建立以下的模型:

殼的建立

offset2D 針對的是 Workplane 中管理的物件,也就是說,如果 Workplane 中有多個物件,就會各自 offset。例如:

import cadquery as cq

r1 = (cq.Workplane().rect(100, 100).rect(50, 50)
        .offset2D(11)
        .extrude(1)
     )
r2 = (cq.Workplane().rect(100, 100).rect(50, 50)
        .offset2D(11, 'intersection')
        .extrude(1)
        .translate((150, 0)
     )

offset2D 預設在邊角處會使用圓弧,若指定 'intersection' 則會採用尖角,這會顯示以下的圖形:

殼的建立

也可以建立 3D 實體,以減集的方式來製作殼。例如:

import cadquery as cq

r = 10
thickness = 2

result = (
            cq.Workplane().sphere(r) - 
            cq.Workplane().sphere(r - thickness) - 
            cq.Workplane().box(r / 2, r / 2, r * 3)
         )

因為球殼構成了封閉空間,這個範例故意將球打穿,只是為了看得出確實構成了球殼:

殼的建立

shell 方法

只不過這種減集的方式,對於複雜的模型就不適用了,你需要 3D 版本的 offset,才能運用減集製作殼,不過這很複雜,然而,Workplane 提供了方便的 shell 方法來製作殼:

import cadquery as cq

thickness = 2
height = 50

result = (cq.Workplane()
            .center(0, 0).threePointArc((10, 20), (0, 10)).close()
            .extrude(height)
            .shell(thickness)
            .faces('>Z')
            .hole(10)
         )

shell 可以指定正或負值,若是正,往外增殼,若是負,往內做殼,做出來的殼會是封閉的,因此範例中故意打了個洞,這樣才看得出殼:

殼的建立

shell 預設會在每個面建立殼,若某些面不想建立殼,可以用 faces 選擇,被選擇的面會被「剔除」,未被選擇的面會建立殼。例如:

import cadquery as cq

result = (cq.Workplane()
            .box(2, 2, 2)
            .faces('>X or <X')
            .shell(-0.2)
         )

這個範例選擇了 X 軸上的兩個最遠面,因此這兩個面不會有殼,結果會是:

殼的建立

選擇面不建立殼的方式,最後必須至少留下兩個連續的面,shell 方法才能運作。