跳转到内容

OpenSCAD 用户手册/包含语句

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

要在 OpenSCAD 中包含来自外部文件代码,可以使用两个命令

  • include <filename> 就像将包含文件的全部内容写入了包含文件一样,而
  • use <filename> 导入模块和函数,但不执行除这些定义以外的任何命令。

库文件在与打开设计的文件夹相同的文件夹中,在 OpenSCAD 安装的库文件夹中以及在 OPENSCADPATH 环境变量给出的文件夹中搜索。您可以使用相对于两者之一的相对路径规范。如果它们位于其他位置,则必须给出完整路径。较新的版本具有预定义的用户库,请参阅 OpenSCAD_User_Manual/Libraries 页面,其中还记录了 OpenSCAD 中包含的一些库文件。

通配符 (*,例如 include <MCAD/*.scad>) 不能用于包含多个文件。

目录分隔符

[编辑 | 编辑源代码]

Windows 和 Linux/Mac 使用不同的目录分隔符。Windows 使用 \,例如 directory\file.ext,而其他使用 /,例如 directory/file.ext。这会导致跨平台问题。但是 Windows 上的 OpenSCAD 正确处理了 / 的使用,因此在所有 includeuse 语句中使用 / 在所有平台上都有效。

要访问父目录,../ 可在 Linux 下使用。

变量作用域
[编辑 | 编辑源代码]

使用 include <filename> 允许在库中指定默认变量。这些默认值可以在主代码中覆盖。OpenSCAD 变量在程序的整个生命周期中只有一个值。当有多个赋值时,它取最后一个值,但在变量首次创建时分配。当在库中分配时,这会产生影响,因为您后来用于更改默认值的任何变量必须在 include 语句之前分配。请参阅下面的第二个示例。

覆盖变量
[编辑 | 编辑源代码]

include 中的默认变量可以被覆盖,例如

lib.scad

i=1;
k=3;
module x() {
    echo("hello world");
    echo("i=",i,"j=",j,"k=",k);
}

hello.scad

j=4;
include <lib.scad>
x();
i=5;
x();
k=j;
x();

产生以下结果

ECHO: "hello world"
ECHO: "i=", 5, "j=", 4, "k=", 4
ECHO: "hello world"
ECHO: "i=", 5, "j=", 4, "k=", 4
ECHO: "hello world"
ECHO: "i=", 5, "j=", 4, "k=", 4

然而,将 j=4; 放在 include 之后会失败,产生

ECHO: "hello world"
ECHO: "i=", 5, "j=", 4, "k=", undef
ECHO: "hello world"
ECHO: "i=", 5, "j=", 4, "k=", undef
ECHO: "hello world"
ECHO: "i=", 5, "j=", 4, "k=", undef

示例 "Ring-Library"

[编辑 | 编辑源代码]

用于生成环的库文件可能如下所示(定义一个函数并提供一个示例)

ring.scad

module ring(r1, r2, h) {
    difference() {
        cylinder(r = r1, h = h);
        translate([ 0, 0, -1 ]) cylinder(r = r2, h = h+2);
    }
}

ring(5, 4, 10);

使用以下命令包含库

include <ring.scad>
rotate([90, 0, 0]) ring(10, 1, 1);

将导致显示示例环和旋转环,但是

use <ring.scad>
rotate([90, 0, 0]) ring(10, 1, 1);

仅显示旋转环。

如果使用 use 函数,请确保将 use 语句放在文件顶部,或者至少不要放在模块内!

这可以正常工作

 // a.scad
 use <ring.scad>
 module a() {
   ring();
 }

但这会导致语法错误

 //a.scad
 module a() {
   use <ring.scad>
   ring();
 }


嵌套包含和使用

[编辑 | 编辑源代码]

OpenSCAD 执行对 includeuse 的嵌套调用。有一个需要注意的地方,即 use 仅将函数和模块带入本地文件上下文。因此,对 use 的嵌套调用对基本文件的环境没有影响;子 use 调用在父 use 上下文中工作,但因此导入的模块和函数在它们被基本上下文看到之前就超出了上下文范围。

华夏公益教科书