OpenSCAD 使用者手冊/OpenSCAD 語言/快速指南(c.t.chin)
OpenSCAD 提供了四個 3D 基元實體:cube()、sphere()、cylinder() 和 polyhedron()。請注意,surface() 和 import() 也可被視為基元實體。
OpenSCAD 提供了四個 2D 基元形狀:square()、circle()、polygon() 和 text()。
| 條件物件 | if (expr_Q) object_T; |
| 條件物件 | if (expr_Q) object_T; else object_F; |
條件物件執行測試(計算查詢 expr_Q),並根據測試結果的 真值 呈現 object_T 或 object_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.");
}
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)
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
include <>
use <>
$t
$fn 等
$vpn 等
$parent_modules
修飾符在物件前面時,會修改直譯器在預覽和渲染該物件或程式中所有其他物件的時的行為。它們是使用者在設計即使是最簡單的複雜物件時不可或缺的輔助工具。