模型的檢視與除錯


在建立模型的過程中,經常要做許多基本模型的組合,而 OpenSCAD 呈現給你最後的運算結果,然而,有時左看右看,可能就是看不到自己想檢視的細節,也許是被另一個模型遮住了,也許是想知道某個部份到底是放了什麼模型,才會有這種結果,這該怎麼辦呢?

# 突顯模型

舉個例子來說,在〈布林運算與 hull 轉換〉看過怎麼建一個愛心:

radius = 10;

module heart(radius) {
    rotated_angle = 45;
    diameter = radius * 2;
    $fn = 48;

    rotate(-rotated_angle) union() {
        circle(radius);
        translate([0, -radius, 0]) 
            square(diameter);
    }

    translate([cos(rotated_angle) * diameter, 0, 0]) 
        circle(radius);
}

heart(radius);

這個模型是由一個正方形與兩個圓形組合而成,如果想分別檢視正方形或圓形,可以在模型的程式碼前頭放上個 #,這會將模型以紅色突顯出來,例如:

radius = 10;

module heart(radius) {
    rotated_angle = 45;
    diameter = radius * 2;
    $fn = 48;

    rotate(-rotated_angle) union() {
        #circle(radius);
        #translate([0, -radius, 0]) 
            square(diameter);
    }

    #translate([cos(rotated_angle) * diameter, 0, 0]) 
        circle(radius);
}

heart(radius);

這樣你就會看到以下的畫面:

模型的檢視與除錯

% 半透明檢視

在〈布林運算與 hull 轉換〉也談過怎麼建立中空球:

radius = 10;
thickness = 1;

module hollow_sphere(radius, thickness) {
    $fn = 48;
    inner_radius = radius - thickness;

    difference() {
        sphere(radius);
        sphere(inner_radius);
    }   
}

hollow_sphere(radius, thickness);

不過模型建立出來後,你只能看到這樣的結果:

模型的檢視與除錯

這是因為大球體遮住了小球體,如果你想檢視一下內外兩球體的差異,可以使用 %,這會將被標示的模型以半透明顯示,例如:

...
    difference() {
        %sphere(radius);
        sphere(inner_radius);
    }   
...

這樣就可以看出內外兩個球體了:

模型的檢視與除錯

! 單獨顯示

有時候,你只想看看模型中某個子模型,例如,在〈布林運算與 hull 轉換〉中談過怎麼在一個球體上放一個字母:

character = "A";
font_size = 10;
thickness = 1;

module hollow_sphere(radius, thickness) {
    $fn = 48;
    inner_radius = radius - thickness;

    difference() {
        sphere(radius);
        sphere(inner_radius);
    }   
}

module sphere_character(ch, font_size, thickness) {
    font_offset = font_size / 2;

    intersection() {
        hollow_sphere(font_size, thickness);
        linear_extrude(font_size * 2) 
            translate([-font_offset, -font_offset, 0]) 
                text(ch, size = font_size);
    }
}

sphere_character(character[0], font_size, thickness);
sphere(font_size - thickness, $fn = 48);

如果你只想看看其中這段的效果呢?

...
linear_extrude(font_size * 2) 
    translate([-font_offset, -font_offset, 0]) 
        text(ch, size = font_size);
...

你可能會想要註解掉其他程式碼,這是個方式,不過有點麻煩,你只要在子模型前頭放上一個 ! 就可以了:

...
!linear_extrude(font_size * 2) 
    translate([-font_offset, -font_offset, 0]) 
        text(ch, size = font_size);
...

這樣你就只會看到子模型單獨顯示:

模型的檢視與除錯

* 停用模型

有時候你會想要停用某個子模型,看看結果如何,比方說,在上頭的 sphere_character 模組中,想停用這個部份:

...
linear_extrude(font_size * 2) 
    translate([-font_offset, -font_offset, 0]) 
        text(ch, size = font_size);
...

使用註解嗎?也可以,不過,得全部加上註解,像是:

...
// linear_extrude(font_size * 2) 
//     translate([-font_offset, -font_offset, 0]) 
//         text(ch, size = font_size);
...

或者是這樣:

...
/*
linear_extrude(font_size * 2) 
    translate([-font_offset, -font_offset, 0]) 
        text(ch, size = font_size);
*/
...

兩種方式都有點麻煩,最方便的方式是使用 *,例如:

...
*linear_extrude(font_size * 2) 
    translate([-font_offset, -font_offset, 0]) 
        text(ch, size = font_size);
...

這樣就可以停用整個子模型的運算了。

render() 強制繪製子模型

OpenSCAD 有時候預覽模型,會產生破圖的結果,例如在一個球體上放一個字母,會看到這種結果:

模型的檢視與除錯

你是可以按下 F6 執行 Render,建立完整的模型資訊,就可以看到沒有破圖了,不過,有時只是某個子模型產生預覽破圖,卻要整個模型進行 Render,有點浪費時間,這時你可以單獨對某個子模型使用 render(),強制它建立完整的模型資訊。例如:

...
#render() sphere_character(character[0], font_size, thickness);
sphere(font_size - thickness, $fn = 48);

這樣的話,就不會產生破圖了,為了突顯字母的部份,上頭的例子還加上了 # 對子模型做了突顯,你會看到以下的結果:

模型的檢視與除錯

以上幾個檢視與除錯模型的方式,可以交相運用,在建立模型的過程中,會是很方便的輔助!