使用 cqMore


在先前的文件中,也開發了不少的函式,像是 polyhedronsurfacehull轉換矩陣sweep 等,如果可以將這些整理一下,作為一個程式庫,就不用每次想使用某個功能時,就得複製貼上相關的程式碼,而且程式碼也可以比較簡潔,專注在想解決的任務上。

為此,我開發了個 CadQuery plugin,我命名為 cqMore,有個 more 字的意思是「比 CadQuery 更多一點基礎功能」,除了將之前看過的函式整理了一下之外,也將一些使用 OpenSCAD 的經驗且適用於 CadQuery 的功能放進去。

(OpenSCAD 與 CadQuery 兩者在方法與風格上並不相同,彼此並不是互斥選項,有些功能適合 OpenSCAD,有些適合 CadQuery。)

你可以從 Github 直接安裝 cqMore,為此,必須先有 git,如果沒有的話,可以如下安裝:

conda install git

接著安裝 cqMore:

pip install git+git://github.com/JustinSDK/cqMore.git

除了 CadQuery,cqMore 目前沒有相依在其他的程式庫,想使用 cqMore,跟 CadQuery 一樣,基本上是從 Workplane 開始,這有兩種方式,其中一種是使用 cqmore.Workplane,它是 cadquery.Workplane 的子類別。例如:

from cqmore import Workplane

result = (Workplane()
            .rect(10, 10)
            .makePolygon(((-2, -2), (2, -2), (2, 2), (-2, 2)))
            .extrude(1)
         )

這邊使用了 cqmore.Workplane 定義的 makePolygon,它可以逆時針指定點座標來建立多邊形,也就是相當於〈認識 BREP〉中實作的 polygon 函式之作用,你會看到以下的結果:

使用 cqMore

你可能會說,這不符合 CadQuery 官方建議的 plugin 寫法啊?是沒錯!不過,我選擇繼承 cadquery.Workplane 的原因是開發上的便利性(特別是在配合 Python 的 Type hinting 方面),如果你不想直接使用 cqmore.Workplane,也可以透過 cqmore.extend 來擴充 cadquery.Workplane

from cadquery import Workplane
import cqmore
cqmore.extend(Workplane) # 擴充 cqmore.Workplane

result = (Workplane()
            .rect(10, 10)
            .makePolygon(((-2, -2), (2, -2), (2, 2), (-2, 2)))
            .extrude(1)
         )

執行結果是相同的,基本上,cqMore 的 API Reference 中寫到的範例,都可以改用為 cqmore.extend 後,直接使用 cadquery.Workplane 來完成。

各個 API 的使用方式,API Reference 中都可以查詢到相關說明,不過,這邊還是來示範幾個基本的使用,例如〈實作 polyhedron〉的正四面體:

from cqmore import Workplane

points = (
    (5, -5, -5), (-5, 5, -5), (5, 5, 5), (-5, -5, 5)
)

faces = (
    (0, 1, 2), (0, 3, 1), (1, 3, 2), (0, 2, 3)
)

solid = Workplane().polyhedron(points, faces)

在〈建立 Convex hull〉談到建立凸包,對於二維的凸包,可以使用 hull2D 方法:

from random import random
from cqmore import Workplane

points = [(random(), random()) for i in range(20)]
convex_hull = Workplane().hull2D(points)

對於三維的凸包,可以使用 hull

from cqmore import Workplane

points = (
    (50, 50, 50),
    (50, 50, 0),
    (-50, 50, 0),
    (-50, -50, 0),
    (50, -50, 0),
    (0, 0, 50),
    (0, 0, -50)
)

convex_hull = Workplane().hull(points)

在〈建立網格面〉中談到,cadquery.Workplane 本身的 parametricSurface 沒有厚度選項,為此,我建立了一個 splineApproxSurface,可以指定控制點來建立曲面,而且可以指定厚度,例如,來建立一個鞍型曲面:

from cqmore import Workplane

def paraboloid(x, y):
    return (x, y, ((y ** 2) - (x ** 2)) / 4)

min_value = -30
max_value = 30
step = 5
thickness = 0.5

points = [[
        paraboloid(x / 10, y / 10) 
    for y in range(min_value, max_value + step, step)
] for x in range(min_value, max_value + step, step)]

surface = Workplane().splineApproxSurface(points, thickness)

這會得到以下的結果:

使用 cqMore

這邊先介紹一些基本的功能,其他 API 逐一介紹,沒有太大的意義,基本上 API Reference 都有寫,我會配合後續的文件主題適當地使用…