基本 2D 操作


在 CadQuery 中,Workplane 提供了一組 2D 操作方法,必須知道的是,CadQuery 不具備 2D 繪圖的功能,它提供的 2D 操作建立的幾何資訊,目的都是為了用來建立 3D 實體。

(OpenSCAD 可以做些 2D 繪圖,並輸出 SVG 之類的。)

舉個最簡單的例子,Workplanecircle 可以用來建立圓:

import cadquery as cq

radius = 10
c = cq.Workplane().circle(radius)

這不是繪製圓,只是建立了圍成圓的線(Wire),雖然 CQ-editor 中會顯示一個圓,這只是為了便於檢視:

基本 2D 操作

建立圍成特定形狀的線後,最常做的一個動作是進行擠出(extrude),這就像是透過建立的形狀,將牙膏擠出來,是從形狀構造 3D 實體最簡單的一個方式:

import cadquery as cq

radius = 10
thickness = 1

plate = cq.Workplane().circle(radius).extrude(thickness)

線其實可以做布林運算,不過在行為上,與其他繪圖軟體中很直覺的交集、聯集、減集操作並不相同,想知道為什麼,必須知道 CadQuery 的 BREP 觀念,以及相對應的物件該如何操作,這是個進階議題,之後文件再來談。

你會在 Workplane 上看到 intersectunioncut 等方法,這些交集、聯集、減集的方法,是歸在 3D 操作,無法使用於 2D 概念的物件。

然而,2D 操作若構成了兩個以上的封閉曲線,若其中一個封閉曲線涵蓋了其他封閉曲線,在擠出時,其他封閉曲線會用來挖洞:

import cadquery as cq

radius = 10
thickness = 1

plate = (cq.Workplane()
           .circle(radius)
           .center(radius / 2, 0)
               .rect(radius / 4, radius / 4)
           .center(-radius / 2, radius / 2)
               .rect(radius / 4, radius / 4)
           .center(-radius / 2, -radius / 2)
               .rect(radius / 4, radius / 4)
           .center(radius / 2, -radius / 2)
               .rect(radius / 4, radius / 4)
           .extrude(thickness)
        )

在上例中使用了 center 方法,用來設定繪圖的原點,指定的新位置是相對於目前的原點位置(而不是絕對位置,基本上,Worksplane 的座標指定都是相對於自身目前的座標系統),這會構成以下的 3D 實體:

基本 2D 操作

如果在同一條方法鏈操作中建立了多個形狀,CQ-editor 只會顯示最後一次操作所建立的形狀。例如:

import cadquery as cq

radius = 10

plate = (cq.Workplane()
           .circle(radius)
           .rect(radius / 2, radius / 2)
        )

這只會看到最後的方形:

基本 2D 操作

如果需要檢視建立的多個形狀,就要個別顯示每次操作後的 Workplane

import cadquery as cq

radius = 10

plate = cq.Workplane().circle(radius)
show_object(plate)

plate = plate.rect(radius / 2, radius / 2)
show_object(plate)

這樣就會顯示出兩個被建立的形狀:

基本 2D 操作

2D 操作建立的幾何物件,除了可以用來進行擠出,也可以進一步作為其他形狀或實體建構的資訊之用,例如,可以在建立方形後,使用它的四個頂點作為建立圓的位置:

import cadquery as cq

radius = 3
width = 10

circles = (cq.Workplane()
             .rect(width, width, forConstruction = True) # 幾何資訊會作為進一步建構之用
             .vertices() # 取得頂點
             .circle(radius)
          )

這會在方形的四個頂點處建立四個圍成圓的線:

基本 2D 操作

因此,類似方才要在圓盤中挖洞的需求,也可以用以下的程式碼來完成:

import cadquery as cq

radius = 10
thickness = 1

plate = (cq.Workplane()
           .circle(radius)
           .rect(radius / 2, radius / 2, forConstruction = True)
           .vertices()
           .rect(radius / 4, radius / 4)
           .extrude(thickness)
        )

這邊的重點在於 forConstruction 要設為 True,如此就能取得形狀的幾何資訊,例如透過 vertices 方法取得頂點位置,然後用這些位置建立新的形狀,這會產生以下的結果:

基本 2D 操作

CadQuery 提供了 circlerectellipse,可以建立圍成圓、方形與橢圓等形狀的線,更複雜的形狀,可以藉由其他方法來建立,這之後再來談。