鏡像

November 26, 2021

如果 2D 形狀或 3D 實體具有對稱性,運用鏡像來繪製是個方便的方式。

2D 鏡像

Workplane 在 2D 部份,提供有 mirrorXmirrorY 方法,可以針對 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 中管理的實體鏡像:

鏡像

若要建立一個原實體,一個鏡像實體,可以指定 unionTrue

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)

這會建立以下的結果:

鏡像