堆疊與選擇器
November 25, 2021Workplane
的方法操作後,都會傳回 Workplane
實例,因而可接續執行方法,形成方法鏈操作風格,CadQuery 也鼓勵你這麼做。
檢視堆疊
呼叫 Workplane
方法後若傳回新的 Workplane
實例,會記得它是由哪個 Workplane
操作而來,透過 parent
特性就可以取得,Workplane
有個 end
方法,可以指定取得第 n
個前代 Workplane
,n
預設值為 1。
Workplane
是個容器,用來管理 2D/3D 等幾何資訊,例如,在〈Workplane 入門〉中,有個範例建立了一堆方塊,加入 circled_boxes
之中,它是個 Worlplane
實例,被加入的物件會被放入 objects
特性,如果你對 circled_boxes
進行 translate
等操作,那麼就是對 objects
特性中全部的物件進行操作。
在使用 Worlplane
進行方法鏈風格的操作時,相關的幾何物件也會以堆疊的方式放入 objects
,例如:
import logging
import cadquery as cq
boxes = cq.Workplane().box(1, 1, 1)
logging.info(boxes.objects)
CQ-editor 雖然有 Debugger,不過還不是很完善,當然,你可以另外選擇別的編輯器,使用它的 Debugger 來除錯,不過這邊為了方便說明,使用了 logging
模組,這是為了能在 CQ-editor 的 Log viewer 檢視資訊,就上例而言,你會看到它顯示了:
INFO: root: [<cadquery.occ_impl.shapes.Solid object at 0x0000023938B33940>]
這表示 objects
,也就是堆疊中有個方塊的實體物件,來加入另一個方塊:
import logging
import cadquery as cq
boxes = cq.Workplane().box(1, 1, 1).box(0.5, 0.5, 2)
logging.info(boxes.objects)
這時會看到:
INFO: root: [<cadquery.occ_impl.shapes.Compound object at 0x000002393A70CFA0>]
CadQuery 會看看鏈上每個 Workplane
的 objects
,有無可合併的實體,也就是預設會將找到的實體聯集,合為一個 Compound
以便於管理,並放入 objects
,也就是堆疊中有個 Compound
,接著呼叫 vertices
,這會取得堆疊中的 Compound
,找出它的頂點:
import logging
import cadquery as cq
boxes = (cq.Workplane()
.box(1, 1, 1)
.box(0.5, 0.5, 2)
.vertices()
)
logging.info(boxes.objects)
這時你會看到,objects
中有了 24 個頂點:
INFO: root:
[<cadquery.occ_impl.shapes.Vertex object at 0x000002393CA40400>,
<cadquery.occ_impl.shapes.Vertex object at 0x000002393CA40B20>,
<cadquery.occ_impl.shapes.Vertex object at 0x000002393CA40970>,
<cadquery.occ_impl.shapes.Vertex object at 0x000002393CA40F10>,
...略]
接著若呼叫 sphere
,就會使用堆疊中這 24 個頂點的位置來建立球:
import logging
import cadquery as cq
boxes = (cq.Workplane()
.box(1, 1, 1)
.box(0.5, 0.5, 2)
.vertices()
.sphere(0.1)
)
logging.info(boxes.objects)
新建立的球會與循著方法鏈,與方才看到 Workplane
的 Compound
聯集,構成新的 Compound
:
INFO: root: [<cadquery.occ_impl.shapes.Compound object at 0x000002393CA40700>]
這時的模型會長這樣:
在〈Stack and Selector Methods〉中,可以看到 Workplane
有 all
、size
、vals
到 last
等方法,它們都是針對 objects
的簡便方法。
使用選擇器
在〈Stack and Selector Methods〉中也可以看到,vertices
、faces
等方法,可以指定選擇器(Selector),例如,想取得 Z 座標大於 0 的頂點來建球,可以先取得 Z 座標大於 0 的面,再取得面的頂點:
import cadquery as cq
boxes = (cq.Workplane()
.box(1, 1, 1)
.box(0.5, 0.5, 2)
.faces('+Z') # 取得 Z 座標大於 0 的面
.vertices() # 取得面之頂點
.sphere(.1)
)
這會建立以下的模型:
使用字串指定選擇器的語法,可以在〈String Selectors Reference〉找到,透過點、線、面等的選取,在建立模型時,可以很大程度上免於一些複雜的數學計算。
大部份的情況下,CadQuery 的操作組合都蠻直覺的,到這篇文件為止談到的,入門 CadQuery 必要知道的基本觀念,應該足以應付設計上的需求,後續會來實作一些具體的題目,從中熟悉 CadQuery 的使用。
不過,CadQuery 背後其實還有待處理物件的的概念,如果你還想更深入掌握 CadQuery 這些觀念,可以參考〈CadQuery Concepts〉,特別是其中的〈An Introspective Example〉,這算是更接近底處實作的細節了,不過可以更瞭解 CadQuery 的運作方式,