鏡像
November 26, 2021如果 2D 形狀或 3D 實體具有對稱性,運用鏡像來繪製是個方便的方式。
2D 鏡像
Workplane
在 2D 部份,提供有 mirrorX
、mirrorY
方法,可以針對 2D 形狀建立鏡像。例如:
import cadquery as cq
heart = (cq.Workplane()
.moveTo(0, -10)
.lineTo(10, 0).threePointArc((10, 5), (0, 5)) # 一半的愛心
.mirrorY() # 以 Y 軸進行鏡像
)
這會建立以下的愛心:
必須注意的是,繪製形狀時,都是相對於目前工作平面的原點,因此,以下建立雖然會兩個方形,不過會疊在一起:
import cadquery as cq
rects = (cq.Workplane()
.center(10, 10)
.rect(5, 5)
.mirrorY()
)
雖然預覽時,在執行鏡像前,方形似乎是在 (10, 10) 的位置,不過,就方形所在的工作平面而言,方形還是在 (0, 0) 的位置,你其實是將方形所在工作平面的原點,置於預覽時的座標 (10, 10),由於方形本身就是對稱,你只是建立了兩個一模一樣的方形疊在一起:
如果你真的想以鏡像建立不相疊的方形,你要使用另一個工作平面來收集方塊。例如:
import cadquery as cq
rect = (cq.Workplane()
.center(10, 10)
.rect(5, 5)
)
rects = (cq.Workplane()
.add(rect).mirrorX() # 鏡像後的方形
.add(rect) # 原方塊
)
show_object(rects)
或者是自行繪製方形,而不是透過 rect
(因為 rect
的中心是原點):
import cadquery as cq
rects = (cq.Workplane()
.moveTo(5, 5)
.lineTo(10, 5)
.lineTo(10, 10)
.lineTo(5, 10)
.close()
.mirrorX())
這樣就會是不相疊的兩個方形了:
3D 鏡像
如果是 3D 實體要進行鏡像,要使用 mirror
方法,指定對哪個平面進行鏡像,例如:
import cadquery as cq
boxes = (cq.Workplane()
.moveTo(5, 5)
.lineTo(10, 5)
.lineTo(10, 10)
.lineTo(5, 10)
.close()
.extrude(10)
.mirror(mirrorPlane = 'YZ')
)
不過呢!mirror
方法預設不會複製實體,它只將 Workplane
中管理的實體鏡像:
若要建立一個原實體,一個鏡像實體,可以指定 union
為 True
:
import cadquery as cq
boxes = (cq.Workplane()
.moveTo(5, 5)
.lineTo(10, 5)
.lineTo(10, 10)
.lineTo(5, 10)
.close()
.extrude(10)
.mirror(mirrorPlane = 'YZ', union = True)
)
這樣就會有兩個方塊:
由於 CadQuery 中,可以選擇面,需要基於某個面進行鏡像時就是簡單的一件事:
import cadquery as cq
boxes = (cq.Workplane()
.moveTo(5, 5)
.lineTo(10, 5)
.lineTo(10, 10)
.lineTo(5, 10)
.close()
.extrude(10)
)
# 基於方塊在 X 方向最遠面進行鏡像
boxes = boxes.mirror(boxes.faces('>X'), union = True)
這會建立以下的結果: