跳轉到內容

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 上下文中工作,但因此匯入的模組和函式在它們被基本上下文看到之前就超出了上下文範圍。

華夏公益教科書