OpenSCAD

Eric讨论 | 贡献2026年3月23日 (一) 02:26的版本 →‎执行顺序

简介

时间轴

快速入门

执行顺序

在OpenSCAD中,变换的执行顺序是从右向左(或者说从内向外)的。如

// 添加坐标轴参考线,便于观察
color("red") translate([0,0,0]) cube([10,0.1,0.1]);  // X轴
color("green") translate([0,0,0]) cube([0.1,10,0.1]); // Y轴
color("blue") translate([0,0,0]) cube([0.1,0.1,10]);  // Z轴

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); }
box(10);
function name(…) = …
name();
定义函数并调用 function square(x) = x * x;
area = square(5);
include <….scad>
use <….scad>
包含或使用外部文件 include <MCAD/boxes.scad>
use <utils.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]

了解更多 >> https://openscad.org/cheatsheet/index.html


资源

官网

网站

文章