跳轉到內容

OpenSCAD 使用者手冊/OpenSCAD 語言/快速指南(c.t.chin)

來自華夏公益教科書

基元實體

[編輯 | 編輯原始碼]

OpenSCAD 提供了四個 3D 基元實體:cube()、sphere()、cylinder() 和 polyhedron()。請注意,surface() 和 import() 也可被視為基元實體。

基元形狀

[編輯 | 編輯原始碼]

OpenSCAD 提供了四個 2D 基元形狀:square()、circle()、polygon() 和 text()。

流程控制

[編輯 | 編輯原始碼]

if() ... else ...

[編輯 | 編輯原始碼]
條件物件 if (expr_Q) object_T;
條件物件 if (expr_Q) object_T; else object_F;

條件物件執行測試(計算查詢 expr_Q),並根據測試結果的 真值 呈現 object_Tobject_F。如果 object_F 是空,則 else object_F; 部分是可選的。

更常見的是,if() 的複合語句形式被使用,例如

if (a1 > a2) {
    // stack cube(a2) on top of cube(a1)
    cube(a1);
    translate([0,0,a1]) cube(a2);
} else {
    // stack cube(a1) on top of cube(a2)
    cube(a2);
    translate([0,0,a2]) cube(a1);
}

如果條件計算的結果不是物件,而是一個數量,則使用 ? : 條件運算子

雖然允許在複合形式中分配變數,但這些變數的作用域僅限於花括號。

a = 5;
translate([0,0,0]) sphere(a);
if (a > 0) {
    echo("Let's change!  a = ", a); 
    translate([20,0,0]) sphere(a);
    a = 10;
}
echo("We don't forget!  a = ", a);

結果是一個小的球體和一個大的球體,在控制檯中

ECHO: "Let's change!  a = ", 10
ECHO: "We don't forget!  a = ", 5

注意,“a 是 10” 在花括號的作用域內,對應的語句 a = 10; 不需要在 echo() 和 sphere() 語句之前為了使它的效果生效。在 if() 語句之後,對 a 的賦值丟失了,所以我們“回憶”a 仍然是 5。有關更多詳細資訊,請參閱 變數的作用域

巢狀 if

由於一個完整的 if() 語句是一個物件,它可以巢狀在另一個 if() 語句中。一種常見的形式是多層巢狀的“else if”語句

if (a > 100) {
    echo("HUGE!");
    sphere(a);
    // etc...
} else if (a > 10) {
    echo("big.");
    translate([0,0,10]) sphere(a);
    // etc...
} else if (a > 1) {
    echo("not so big...");
    color("red") sphere(a);
} else {
    echo("Sorry, I lost it.");
}

for() ...

[編輯 | 編輯原始碼]

intersection_for() ...

[編輯 | 編輯原始碼]

匯入物件

[編輯 | 編輯原始碼]

import()

surface()

空物件

[編輯 | 編輯原始碼]

echo()

運算子

[編輯 | 編輯原始碼]

算術運算子

[編輯 | 編輯原始碼]

標量算術運算子以數字作為運算元併產生一個新的數字。

+
-
- 取反(一元)
*
/
%

比較運算子

[編輯 | 編輯原始碼]

邏輯運算子

[編輯 | 編輯原始碼]

條件運算子 ? 

[編輯 | 編輯原始碼]
條件運算子 expr_Q ? expr_T : expr_F

一個運算子,根據查詢表示式的真值返回兩個表示式中的一個。例如

var = expr_Q ? expr_T : expr_F;

表示式 expr_Q 被計算,如果為真,則計算 expr_T 並將其賦值給 var;否則,計算 expr_F 並將其賦值給 var。如果 expr_Q 計算結果為非布林值,則將其轉換為布林值; 請參閱此處

條件運算子在建立遞迴函式呼叫時至關重要,因為它用於終止遞迴;請參閱此處

條件運算子也可以用作巢狀的 if ,如以下示例所示

NSides = (FF=="triangular") ? 3 : (FF=="hexagonal") ? 6 (FF=="octagonal") ? 8 : (FF=="circular") ? 180 : 0;

數學函式

[編輯 | 編輯原始碼]

三角函式

[編輯 | 編輯原始碼]

三角函式使用 C 語言數學庫函式。請記住,OpenSCAD 中的所有數字都是 IEEE 雙精度浮點數。有關 C 數學庫的具體細節,請參閱 Open Group 網站上的 (math.h)(acos)。有關相關數學的快速參考,請參閱 三角函式

請注意,三角函式不適用於向量。無效輸入將產生 nan(例如 acos(2))或 undef(例如 sin("2"))。

函式 描述 備註
sin(x) x 的三角正弦 -inf < x < inf 以度為單位,返回值在 [-1,+1] 之間
cos(x) x 的三角餘弦 -inf < x < inf 以度為單位,返回值在 [-1,+1] 之間
tan(x) x 的三角正切 -inf < x < inf 以度為單位,返回值在 (-inf, inf) 之間
asin(x) x 的反正弦 -1 <= x <= 1,返回值在 [-90,+90] 之間(度)
acos(x) x 的反餘弦 -1 <= x <= 1,返回值在 [0,+180] 之間(度)
atan(x) x 的反正切 -inf <= x <= inf,返回值在 [-90,+90] 之間(度)
atan2(y, x) y/x 的反正切 -inf <= x,y <= inf,返回值在 [-180,+180] 之間(度)另請參閱:atan2

更準確地說,返回值是連線原點到點 (x,y) 的直線與 X 軸之間的夾角

實數函式

[編輯 | 編輯原始碼]

實數函式需要數值輸入併產生數字,除了 rands() 返回一個數字向量。

函式 描述 備註
abs(x) x 的絕對值 -inf < x < inf,返回值在 [0,+inf) 之間
sign(x) x 的符號,另請參閱 符號函式 -inf < x < inf,返回值為 1、0 或 -1,如果 x 大於、等於或小於 0
ceil(x) 實數 x 的上取整(整數),另請參閱:上取整函式 -inf < x < inf,返回值是不小於 x 的最小整數

也稱為向上取整一個數字到 +inf

floor(x) 實數 x 的下取整(整數),另請參閱:下取整函式 -inf < x < inf,返回值是不大於 x 的最大整數

也稱為向下取整一個數字到 -inf

round(x) 實數 x 的舍入函式 -inf < x < inf,返回值最接近 x 的整數
pow(x,y) x 的 y 次方,即 -inf < x,y < inf
sqrt(x) x 的平方根,即 0 <= x < inf,返回值最接近 x 的整數,如果 x 為負,則返回 nan
exp(x) x 的指數函式,即 ,另請參閱:指數 -inf < x < inf
ln(x) x 的自然對數,即 ,另請參閱:自然對數 0 <= x < inf,如果 x 為負,則返回 nan
log(x) x 的對數(以 10 為底),即 ,另請參閱:對數 0 <= x < inf,如果 x 為負,則返回 nan
rands(a,b,n) 偽隨機數生成器,請參閱 主要文章 返回一個包含 [a, b] 範圍內 n 個隨機數的向量


一些示例

echo(ceil(4.4),ceil(-4.4));      // ECHO: 5, -4
echo(floor(4.4),floor(-4.4));    // ECHO: 4, -5
echo(exp(1),exp(ln(3)*4));       // ECHO: 2.71828, 81
sign(-5.0); // ECHO -1
sign(0);// ECHO 0
sign(8.0);// ECHO 1
round(5.4); //-> 5
round(5.5); //-> 6
round(5.6); //-> 6
round(-5.4); //-> -5
round(-5.5); //-> -6
round(-5.6); //-> -6

偽隨機數生成器

[編輯 | 編輯原始碼]

生成一個偽隨機數向量。為了生成一個作為數字的單個隨機值,而不是長度為 1 的向量,請使用 x = rands(a,b,1)[0];。可以可選地提供一個種子值。從提供種子值的那一刻起,生成的偽隨機數序列是確定的。這提供了一種方便的方式,使用重複執行程式之間的恆定種子值來除錯程式。

引數

min_value
隨機數範圍的最小值
max_value
隨機數範圍的最大值
value_count
要作為向量返回的隨機數數量
seed_value(可選)
用於隨機數生成器的種子值,用於生成可重複的結果。在 2015 年底之前的版本中,seed_value 將被四捨五入到最接近的整數

使用示例

// get a single number
vec_rand = rands(0,10,1);
single_rand = rands(0,10,1)[0];
echo(vec_rand);    // ECHO: [4.44795]
echo(single_rand); // ECHO: 7.86455
 
// get a vector of 4 random numbers with seed value 42
random_vect=rands(5,15,4,42);
echo(random_vect); // ECHO: [8.7454, 12.9654, 14.5071, 6.83435]

向量函式

[編輯 | 編輯原始碼]

cross、norm

max、min

len、concat

lookup

search()

字串函式

[編輯 | 編輯原始碼]

str()、chr()

search()

匯入函式

[編輯 | 編輯原始碼]

dxf_cross()

dxf_dim()

除錯函式

[編輯 | 編輯原始碼]

parent_module(n)

特殊表示式

[編輯 | 編輯原始碼]

let() 表示式

[編輯 | 編輯原始碼]

列表推導

[編輯 | 編輯原始碼]

函式和模組定義

[編輯 | 編輯原始碼]

函式定義

[編輯 | 編輯原始碼]

function name(param_list) = expr;

請注意,在函式定義內部,主作用域中定義的變數是可以訪問的。請參閱 變數和作用域.


遞迴函式呼叫

[編輯 | 編輯原始碼]

支援遞迴函式呼叫。使用 條件運算子 可以確保遞迴終止。請注意:存在一個內建的遞迴限制,以防止應用程式崩潰。如果達到限制,函式將返回 undef。

示例
 // recursion - find the sum of the values in a vector (array) by calling itself
 // from the start (or s'th element) to the i'th element - remember elements are zero based
 
 function sumv(v,i,s=0) = (i==s ? v[i] : v[i] + sumv(v,i-1,s));
 
 vec=[ 10, 20, 30, 40 ];
 echo("sum vec=", sumv(vec,2,1)); // calculates 20+30=50

模組定義

[編輯 | 編輯原始碼]

children()

[編輯 | 編輯原始碼]

預處理器指令

[編輯 | 編輯原始碼]

include <>

use <>

關於庫管理的說明

[編輯 | 編輯原始碼]

特殊變數

[編輯 | 編輯原始碼]

$t

$fn 等

$vpn 等

$parent_modules

修飾符

[編輯 | 編輯原始碼]

修飾符在物件前面時,會修改直譯器在預覽和渲染該物件或程式中所有其他物件的時的行為。它們是使用者在設計即使是最簡單的複雜物件時不可或缺的輔助工具。

背景 (%)

[編輯 | 編輯原始碼]

除錯 (#)

[編輯 | 編輯原始碼]

停用 (*)

[編輯 | 編輯原始碼]
華夏公益教科書