fillet 與 chamfer

November 26, 2021

使用 OpenSCAD、CadQuery 這類 Code + CAD 方案,建模的對象多半是硬表面物件,也就是模型最後多半稜角分明,若想建立「軟」一點的物件,會是一個挑戰,我的 OpenSCAD 作品,就嘗試過不少的「軟」類型。

在 OpenSCAD 的領域,針對物件的稜角修飾,fillet 與 chamfer 是常見的需求,fillet 是稜角具有圓弧外觀,chamfer 是讓稜角可以成為「倒角」,也就是像是多做了一次切面。

基本使用

Workplane 針對 3D 實體,提供了 filletchamfer 方法,來看看它們最基本的用法:

import cadquery as cq

box = cq.Workplane().box(3, 3, 3)
filleted = box.fillet(radius = .5)
chamfered = box.chamfer(length = .5)

show_object(box)
show_object(filleted.translate((4, 0)))
show_object(chamfered.translate((8, 0)))

fillet 要指定圓弧半徑,chamfer 要指定建立倒角的邊距,一個邊會兩個邊距,預設第二個邊距會與第一個邊距相同,結果會顯示如下:

fillet 與 chamfer

filletchamfer 的對象是邊,可以選取特定的邊後再執行方法,例如:

import cadquery as cq

box = cq.Workplane().box(3, 3, 3)

filleted = box.edges('>Z').fillet(radius = .5)
chamfered = box.edges('<Y').chamfer(length = .5)

show_object(box)
show_object(filleted.translate((4, 0)))
show_object(chamfered.translate((8, 0)))

這會顯示以下的結果:

fillet 與 chamfer

併用 fillet、chamfer

當然,必要時可以併用:

import cadquery as cq

wired_box = (cq.Workplane()
        .box(3, 3, 3)
        .edges('>Z').fillet(radius = .5)
        .edges('>X and <Z').chamfer(.25, 1)
        .edges('<Y').chamfer(.25)
        .edges('<Y').fillet(radius = .5)
      )

以上的組合是隨意的,純示範邊的選取、filletchamfer 間可以併用罷了,這會建立以下的模型:

fillet 與 chamfer

因為 filletchamfer 是針對邊,也可以如下:

import cadquery as cq

frame = (cq.Workplane()
           .box(5, 5, 5)
           .faces('>X or <X')
           .shell(-1)
        )

filleted = (frame.faces('>X')
                 .edges('not(>Y or <Y or >Z or <Z)')
                 .fillet(.5)
           )
           
chamfered = (frame.faces('>X')
                  .edges('not(>Y or <Y or >Z or <Z)')
                  .chamfer(.5)
            )
           
show_object(frame)
show_object(filleted.translate((0, 6)))
show_object(chamfered.translate((0, 12)))

這會建立以下的結果:

fillet 與 chamfer