跳转到内容

OpenSCAD 用户手册/WIP/迁移指南

来自维基教科书,开放的书籍,面向开放的世界

OpenSCAD 2019 包含了一些破坏旧设计或对之前没有错误和警告的代码产生错误和警告的更改。

重复赋值警告

[编辑 | 编辑源代码]

在以下情况下,OpenSCAD 2019 会在重复赋值的情况下产生警告

  • 在同一个文件和范围内覆盖变量
  • 主文件中的赋值被包含文件覆盖

在以下情况下,变量会由最后一个赋值静默覆盖

  • 通过命令行赋值
  • 包含文件中的变量被主文件覆盖

未初始化的特殊变量

[编辑 | 编辑源代码]

这段代码现在会导致警告,因为 $test 没有被初始化

test = $test==undef ? 1 : $test ;

解决方法是使用新的 is_undef() 函数

test = is_undef($test) ? 1 : $test ;

模块和函数参数

[编辑 | 编辑源代码]

参数类型

[编辑 | 编辑源代码]

内置函数和模块现在会在参数类型不匹配时发出警告。

由于类型检查以前是通过使用内置函数返回 undef 来完成的,因此现在建议/要求使用 is_list()、is_num()、is_bool() 和 is_string() 来进行类型检查。

重复参数

[编辑 | 编辑源代码]

OpenSCAD 2019 会在多次提供命名参数时发出警告。

cube(size=2,size=1);

未指定参数

[编辑 | 编辑源代码]

OpenSCAD 现在会在模块或函数参数未声明时发出警告。

用户模块

[编辑 | 编辑源代码]

这意味着现在会导致警告

a=1;

module test(){
    cube(a);
}

test();

translate([2,0,0])
test(a=2);

如果您打算这样做 - 比如在 Write.scad 库中 - 您可以按如下方式更新代码

a=1;

module test(a){
    cube(a);
}

test();

translate([2,0,0])
test(a=2);

对于 Write.scad,具体来说:像这样的定义

module writecircle(text,where,radius){

需要更改为

module writecircle(text, where, radius, rotate, font, h, t, spac, east, west, middle, ccw){
</syntaxhighlight lang="unknown">
==== builtin modules ====
Same goes for builtin modules, so this now creates a warning:
<syntaxhighlight lang="text">
sphere(center=true);

以及

circle(center=true);

circle 和 sphere 都不支持 center 参数 - circle 和 sphere 始终居中。

另一个例子是

circle(radius=5);

因为 circle 接受 r,而不是 radius。

参数被文字覆盖

[编辑 | 编辑源代码]
module test(a){
    a=2;
    sphere(a);
}

test();

translate([4,0,0])
test(a=1);

请注意,这个非常类似的示例不会触发警告,因为实现中有缺陷

module test(a){
    a=1+1;
    sphere(a);
}

test();

translate([4,0,0])
test(a=2);

内置模块的参数范围检查

[编辑 | 编辑源代码]

像这样的

cube(-1);
cube([1,1,-1]);
cube(0);
cube([1,1,0]);

内置模块的参数冲突检查

[编辑 | 编辑源代码]
cylinder(h = 1, r1 = 0, r2 = 1, d = 2, center = true);

内置函数的参数计数

[编辑 | 编辑源代码]

如果内置函数的参数计数不匹配,OpenSCAD 2019 会显示警告

echo(abs(123,456));

内置 Assert 不能被用户函数或模块覆盖。如果您有一个名为 assert 的函数或模块,则必须重命名它。

华夏公益教科书