堆疊與選擇器


Workplane 的方法操作後,都會傳回 Workplane 實例,因而可接續執行方法,形成方法鏈操作風格,CadQuery 也鼓勵你這麼做。

呼叫 Workplane 方法後若傳回新的 Workplane 實例,會記得它是由哪個 Workplane 操作而來,透過 parent 特性就可以取得,Workplane 有個 end 方法,可以指定取得第 n 個前代 Workplanen 預設值為 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 會看看鏈上每個 Workplaneobjects,有無可合併的實體,也就是預設會將找到的實體聯集,合為一個 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)

新建立的球會與循著方法鏈,與方才看到 WorkplaneCompound 聯集,構成新的 Compound

INFO: root: [<cadquery.occ_impl.shapes.Compound object at 0x000002393CA40700>]

這時的模型會長這樣:

堆疊與選擇器

在〈Stack and Selector Methods〉中,可以看到 Workplaneallsizevalslast 等方法,它們都是針對 objects 的簡便方法。

在〈Stack and Selector Methods〉中也可以看到,verticesfaces 等方法,可以指定選擇器(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 的運作方式,