操作 children()



如果想要做個圓環要怎麼做呢?基本上可以有兩種方式。第一個方式是畫一個大圓、一個小圓,然後用 difference()。例如:

module circle_ring(radius, thickness) {
    difference() {
        circle(radius, $fn = 48);
        circle(radius - thickness, , $fn = 48);
    }
}

circle_ring(3, 1);

這就會建立一個圓環:

操作 children()

另一個方式是使用 offset(),例如:

module circle_ring(radius, thickness) {
    difference() {
        circle(radius, $fn = 48);
        offset(r = -thickness) circle(radius, , $fn = 48);
    }
}

circle_ring(3, 1);

結果基本上是一樣的,offset() 可以指定 rdeltachamfer,在官方說明文件中有兩張圖,馬上就可以知道三個參數的作用:

offset()

offset()

那麼要做一個框呢?類似地…

module square_frame(dimension, thickness) {
    difference() {
        square(dimension);
        offset(r = -thickness) square(dimension);
    }
}

square_frame([10, 5], 1);

這會產生的結果是…

操作 children()

接下來如果要做一個三角形的框呢?接下來如果要做一個星星的框呢?接下來如果要做個愛心的框呢?你應該都會吧!

只是問題是,既然這個需求這麼常見,有沒有辦法寫個通用的 frame(),可以指定一個模型,自動變出框呢?可以喔!

module frame(thickness) {
    difference() {
        children();
        offset(r = -thickness) children();
    }
}

frame(1) circle(3, $fn = 48);
frame(1) square([10, 5]);

原本 circle_ring()square_frame() 中的同樣的程式碼部份被抽取出來了,然後,呼叫 circle()square() 的部份,被換成了 children(),這表示實際上會操作的子模組,必須進一步在呼叫 frame() 時指定,指定方式是在 frame() 之後接上子模組呼叫,像是 frame(1) circle(3, $fn = 48)frame(1) square([10, 5]),執行的結果會是:

操作 children()

如果要操作的子模組不只一個,可以使用索引來指定操作的子模組是第幾個,例如:

module lineup(space) {
  for (i = [0 : $children - 1])
    translate([space * i, 0, 0 ]) children(i);
}

lineup(100) { sphere(10); sphere(10); }
lineup(100) { cube(35); cube(35); cube(35); }

指定多個子模組時,記得要使用 {} 括住,上面的程式中,$children 可以得知指定的子模組數量,因此,你指定了幾個子模組,就會將那幾個子模組排成一行:

操作 children()

因此,如果發現到有些操作,其實是通用的,可以抽取出來,像是移動、旋轉之類的,這類通用操作累積的越多,將來在設計模型時就會越方便。