OpenSCAD:修订间差异
(创建页面,内容为“==简介== ===时间轴=== ==快速入门== == 速查表格 == === 语法 === {| class="wikitable" ! 内容 !! 描述 !! 示例 |- | <code>var = value;</code> || 变量赋值 || <code>size = 10;</code> |- | <code>var = cond ? value_if_true : value_if_false;</code> || 条件赋值 || <code>result = (x > 5) ? "large" : "small";</code> |- | <code>var = function (x) x + x;</code> || 匿名函数 || <code>double = function (x) x * 2;</code> |- | <code>module name(…”) |
无编辑摘要 |
||
| 第3行: | 第3行: | ||
==快速入门== | ==快速入门== | ||
==执行顺序== | |||
在OpenSCAD中,变换的执行顺序是从右向左(或者说从内向外)的。如 | |||
<syntaxhighlight lang="text" line='line'> | |||
translate([0, 1.4, 0]) | |||
rotate([90, 0, 0]) | |||
my_box(...); | |||
</syntaxhighlight> | |||
执行顺序是: | |||
*先执行 rotate([90, 0, 0]) - 旋转物体 | |||
*后执行 translate([0, 1.4, 0]) - 平移已旋转的物体 | |||
== 速查表格 == | == 速查表格 == | ||
2026年3月23日 (一) 02:24的版本
简介
时间轴
快速入门
执行顺序
在OpenSCAD中,变换的执行顺序是从右向左(或者说从内向外)的。如
translate([0, 1.4, 0])
rotate([90, 0, 0])
my_box(...);
执行顺序是:
- 先执行 rotate([90, 0, 0]) - 旋转物体
- 后执行 translate([0, 1.4, 0]) - 平移已旋转的物体
速查表格
语法
| 内容 | 描述 | 示例 |
|---|---|---|
var = value; |
变量赋值 | size = 10;
|
var = cond ? value_if_true : value_if_false; |
条件赋值 | result = (x > 5) ? "large" : "small";
|
var = function (x) x + x; |
匿名函数 | double = function (x) x * 2;
|
module name(…) { … }name(); |
定义模块并调用 | module box(size) { cube(size); }
|
function name(…) = …name(); |
定义函数并调用 | function square(x) = x * x;
|
include <….scad>use <….scad> |
包含或使用外部文件 | include <MCAD/boxes.scad>
|
常量
| 内容 | 描述 | 示例 |
|---|---|---|
undef |
未定义的值 | if (value == undef) echo("未定义");
|
PI |
数学常量 π (~3.14159) | circumference = 2 * PI * 5;
|
运算符
| 内容 | 描述 | 示例 |
|---|---|---|
n + m |
加法 | sum = 5 + 3; // 结果为8
|
n - m |
减法 | diff = 10 - 4; // 结果为6
|
n * m |
乘法 | product = 6 * 7; // 结果为42
|
n / m |
除法 | quotient = 15 / 3; // 结果为5
|
n % m |
模运算(取余) | remainder = 17 % 5; // 结果为2
|
n ^ m |
幂运算 | power = 2 ^ 4; // 结果为16
|
n < m |
小于 | isLess = 3 < 5; // 结果为true
|
n <= m |
小于等于 | isLE = 4 <= 4; // 结果为true
|
b == c |
等于 | isEqual = (5 == 5); // 结果为true
|
b != c |
不等于 | isNotEqual = (5 != 3); // 结果为true
|
n >= m |
大于等于 | isGE = 8 >= 6; // 结果为true
|
n > m |
大于 | isGreater = 10 > 7; // 结果为true
|
b && c |
逻辑与 | result = (x > 0) && (y > 0);
|
b || c |
逻辑或 | result = (x > 0) || (y > 0);
|
!b |
逻辑非(取反) | isNot = !(x > 5);
|
特殊变量
| 内容 | 描述 | 示例 |
|---|---|---|
$fa |
最小角度(影响圆弧分段) | $fa = 12; circle(10);
|
$fs |
最小尺寸(影响圆弧分段) | $fs = 1; circle(10);
|
$fn |
圆弧分段数 | $fn = 24; sphere(10);
|
$t |
动画步进值 | translate([0, $t * 100, 0]) cube(10);
|
$vpr |
视口旋转角度(度) | echo($vpr); // 输出当前视口旋转
|
$vpt |
视口平移 | echo($vpt); // 输出当前视口平移
|
$vpd |
视口相机距离 | echo($vpd); // 输出相机距离
|
$vpf |
视口相机视野 | echo($vpf); // 输出视野角度
|
$children |
子模块数量 | module test() echo($children); test() { cube(5); sphere(3); }
|
$preview |
F5预览时为true,F6渲染时为false | if ($preview) color("red") cube(10);
|
修饰符字符
| 内容 | 描述 | 示例 |
|---|---|---|
! |
仅显示此模块 | !cube(); sphere(); // 只显示cube
|
# |
高亮/调试 | #cube(); // 高亮显示cube
|
% |
透明/背景 | %cube(); // 半透明显示cube
|
* |
禁用 | *cube(); sphere(); // cube被禁用不显示
|
2D图形
| 内容 | 描述 | 示例 |
|---|---|---|
circle(radius | d=diameter) |
创建圆形 | circle(r=10); circle(d=20);
|
square(size,center)square([width,height],center) |
创建正方形或矩形 | square(10); square([20,10], center=true);
|
polygon([points])polygon([points],[paths]) |
创建多边形 | polygon([[0,0],[10,0],[5,10]]);
|
text(t, size, font, halign, valign, spacing) |
创建2D文本 | text("Hello", size=10, halign="center");
|
import("….extformats: DXF|SVG", convexity) |
导入2D文件(DXF/SVG) | import("logo.svg", convexity=10);
|
projection(cut) |
投影 | projection(cut=true) cylinder(h=10,r=5);
|
3D图形
| 内容 | 描述 | 示例 |
|---|---|---|
sphere(radius | d=diameter) |
创建球体 | sphere(r=10); sphere(d=20);
|
cube(size, center)cube([width,depth,height], center) |
创建立方体 | cube(10); cube([20,10,5], center=true);
|
cylinder(h,r|d,center)cylinder(h,r1|d1,r2|d2,center) |
创建圆柱体或圆锥体 | cylinder(h=10,r=5); cylinder(h=10,r1=5,r2=2);
|
polyhedron(points, faces, convexity) |
创建多面体 | polyhedron(points=[[0,0,0],[10,0,0],[0,10,0],[0,0,10]], faces=[[0,1,2],[0,2,3],[0,3,1],[1,2,3]]);
|
import("….extformats: STL|OFF|AMF|3MF", convexity) |
导入3D文件(STL/OFF/AMF/3MF) | import("model.stl", convexity=10);
|
linear_extrude(height,center,convexity,twist,slices) |
线性拉伸2D图形为3D | linear_extrude(height=10) square(10);
|
rotate_extrude(angle,convexity) |
旋转拉伸2D图形为3D | rotate_extrude(angle=360) translate([10,0]) circle(2);
|
surface(file = "….extformats: DAT|PNG",center,convexity) |
根据高度图文件创建3D表面 | surface(file="heightmap.png", center=true);
|
变换
| 内容 | 描述 | 示例 |
|---|---|---|
translate([x,y,z]) |
平移 | translate([10,20,5]) cube(10);
|
rotate([x,y,z])rotate(a, [x,y,z]) |
旋转 | rotate([45,0,0]) cube(10); rotate(45, [0,0,1]) cube(10);
|
scale([x,y,z]) |
缩放 | scale([2,1,0.5]) sphere(5);
|
resize([x,y,z],auto,convexity) |
调整大小 | resize([20,10,5]) sphere(10);
|
mirror([x,y,z]) |
镜像 | mirror([1,0,0]) cube(10);
|
multmatrix(m) |
应用变换矩阵 | multmatrix([[1,0,0,10],[0,1,0,0],[0,0,1,0],[0,0,0,1]]) cube(5);
|
color("colorname",alpha)color([r,g,b,a]) |
设置颜色 | color("red") cube(10); color([1,0,0,0.5]) sphere(5);
|
offset(r|delta,chamfer) |
2D偏移 | offset(r=2) square(10); offset(delta=1, chamfer=true) circle(5);
|
hull() |
凸包运算 | hull() { cube(5); translate([10,10,0]) sphere(3); }
|
minkowski(convexity) |
闵可夫斯基和 | minkowski() { cube(5); sphere(2); }
|
列表
| 内容 | 描述 | 示例 |
|---|---|---|
list = […, …, …]; |
创建列表 | myList = [1, 3, 5, 7, 9];
|
var = list[2]; |
索引列表(从0开始) | value = myList[2]; // 结果为5
|
var = list.x;var = list.y;var = list.z; |
点表示法索引(x/y/z) | point = [10,20,30]; xCoord = point.x; // 结果为10
|
布尔运算
| 内容 | 描述 | 示例 |
|---|---|---|
union() |
并集 | union() { cube(10); translate([5,0,0]) sphere(5); }
|
difference() |
差集 | difference() { cube(10); translate([5,5,0]) cylinder(h=10,r=3); }
|
intersection() |
交集 | intersection() { cube(10); translate([5,0,0]) sphere(8); }
|
列表推导式
| 内容 | 描述 | 示例 |
|---|---|---|
[ for (i = range|list) i ] |
基于范围或列表生成 | list = [ for (i = [0:5]) i * i ]; // [0,1,4,9,16,25]
|
[ for (init;condition;next) i ] |
C风格循环生成 | list = [ for (i = 0; i < 10; i = i + 1) i ];
|
[ each i ] |
展平列表 | flat = [ each [[1,2],[3,4]] ]; // [1,2,3,4]
|
[ for (i = …) if (condition(i)) i ] |
带条件的生成 | evens = [ for (i = [0:10]) if (i % 2 == 0) i ];
|
[ for (i = …) if (condition(i)) x else y ] |
带条件分支的生成 | result = [ for (i = [0:5]) if (i < 3) i else i*2 ];
|
[ for (i = …) let (assignments) a ] |
带局部变量赋值的生成 | result = [ for (i = [1:5]) let (square = i*i) square + i ];
|
流程控制
| 内容 | 描述 | 示例 |
|---|---|---|
for (i = [start:end]) { … } |
for循环(步长1) | for (i = [0:5]) { translate([i*10,0,0]) cube(5); }
|
for (i = [start:step:end]) { … } |
for循环(指定步长) | for (i = [0:2:10]) { translate([i,0,0]) sphere(2); }
|
for (i = […,…,…]) { … } |
for循环(遍历列表) | for (i = [2,4,6,8]) { cube(i); }
|
for (i = …, j = …, …) { … } |
多重for循环 | for (x = [0:2], y = [0:2]) { translate([x*10,y*10,0]) cube(5); }
|
intersection_for(i = [start:end]) { … } |
交集for循环 | intersection_for(i = [0:2]) { rotate([0,i*45,0]) cube(10); }
|
if (…) { … } |
条件判断 | if (x > 5) { cube(10); } else { sphere(5); }
|
let (…) { … } |
局部变量赋值 | let (radius = 5, height = 10) cylinder(r=radius, h=height);
|
类型测试函数
| 内容 | 描述 | 示例 |
|---|---|---|
is_undef |
检查是否为未定义 | is_undef(someVar); // 如果未定义返回true
|
is_bool |
检查是否为布尔值 | is_bool(true); // 返回true
|
is_num |
检查是否为数字 | is_num(3.14); // 返回true
|
is_string |
检查是否为字符串 | is_string("hello"); // 返回true
|
is_list |
检查是否为列表 | is_list([1,2,3]); // 返回true
|
is_function |
检查是否为函数 | is_function(function(x) x*x); // 返回true
|
其他
| 内容 | 描述 | 示例 |
|---|---|---|
echo(…) |
输出调试信息 | echo("Value =", x, "Size =", size);
|
render(convexity) |
强制渲染 | render(convexity=5) difference() { cube(10); sphere(6); }
|
children([idx]) |
引用子模块 | module wrap() { children(); sphere(5); } wrap() cube(10);
|
assert(condition, message) |
断言检查 | assert(x > 0, "x must be positive");
|
assign (…) { … } |
变量赋值(已废弃) | assign (x = 5, y = 10) { cube([x,y,2]); }
|
函数
| 内容 | 描述 | 示例 |
|---|---|---|
concat |
连接列表 | newList = concat([1,2], [3,4], [5,6]); // [1,2,3,4,5,6]
|
lookup |
查表 | value = lookup(5, [[0,0],[3,10],[6,20]]); // 插值结果约16.67
|
str |
转换为字符串 | text = str("Value: ", 42); // "Value: 42"
|
chr |
将ASCII码转换为字符 | char = chr(65); // "A"
|
ord |
将字符转换为ASCII码 | code = ord("A"); // 65
|
search |
搜索 | index = search("apple", ["banana","apple","orange"]); // 返回1
|
version |
返回OpenSCAD版本 | ver = version(); // [2021, 1, 0]
|
version_num |
返回OpenSCAD版本号 | verNum = version_num(); // 20210100
|
parent_module(idx) |
返回父模块信息 | module test() echo(parent_module(0)); test();
|
数学函数
| 内容 | 描述 | 示例 |
|---|---|---|
abs |
绝对值 | abs(-5); // 结果为5
|
sign |
符号函数 | sign(-3); // 结果为-1, sign(0)为0, sign(4)为1
|
sin |
正弦 | sin(30); // 结果为0.5
|
cos |
余弦 | cos(60); // 结果为0.5
|
tan |
正切 | tan(45); // 结果为1
|
acos |
反余弦 | acos(0.5); // 结果为60度
|
asin |
反正弦 | asin(0.5); // 结果为30度
|
atan |
反正切 | atan(1); // 结果为45度
|
atan2 |
两参数反正切 | atan2(1, 1); // 结果为45度
|
floor |
向下取整 | floor(3.7); // 结果为3
|
round |
四舍五入 | round(3.5); // 结果为4
|
ceil |
向上取整 | ceil(3.2); // 结果为4
|
ln |
自然对数 | ln(2.71828); // 结果约1
|
len |
长度 | len([1,2,3,4]); // 结果为4, len("hello")为5
|
log |
常用对数 | log(100); // 结果为2
|
pow |
幂运算 | pow(2, 3); // 结果为8
|
sqrt |
平方根 | sqrt(16); // 结果为4
|
exp |
指数函数 | exp(1); // 结果约2.71828
|
rands |
随机数 | rands(0, 10, 5); // 生成5个0-10之间的随机数
|
min |
最小值 | min(3, 7, 2, 9); // 结果为2
|
max |
最大值 | max(3, 7, 2, 9); // 结果为9
|
norm |
范数 | norm([3, 4]); // 结果为5 (3²+4²的平方根)
|
cross |
向量叉积 | cross([1,0,0], [0,1,0]); // 结果为[0,0,1]
|