OpenSCAD 使用者手冊/STL 匯入和匯出
任何 3D 設計流程中最重要的部分之一就是能夠從其他工具匯入和匯出。目前,STL 檔案格式 是最常用的格式。
匯入透過 import() 命令實現。
[注意: 需要 2015.03-2 版本] 可以使用 檔案 >> 開啟 命令插入此命令。開啟檔案對話方塊的檔案型別過濾器可能只顯示 OpenSCAD 檔案,但檔名可以替換為萬用字元(例如 *.stl)以瀏覽其他檔案型別。
匯入檔案以供在當前 OpenSCAD 模型中使用。副檔名用於確定檔案型別。
- 3D 幾何圖形格式
- STL(ASCII 和二進位制)
- OFF
- OBJ
- AMF(已棄用)
- 3MF
- 2D 幾何圖形格式
- DXF
- SVG
- 資料格式
- JSON [注意: 需要 開發快照 版本]
- 其他
- 可以使用 include<> 匯入 CSG 或像 SCAD 檔案一樣載入
- 可以使用 surface() 匯入 PNG
- <file>
- 包含檔案路徑的字串:如果給定的路徑不是絕對路徑,則它將相對於匯入指令碼進行解析。請注意,當使用
include<>匯入使用import()的指令碼時,這將相對於執行include<>的指令碼。 - <convexity>
- 整數。凸性引數指定光線與物體相交時可能穿過的最大正面(或背面)數量。此引數僅在 OpenCSG 預覽模式下正確顯示物體時才需要,對多面體渲染沒有影響。可選。
- <id>
- 字串。僅限於 SVG 匯入,要匯入的元素或組的 ID。可選。[注意: 需要 開發快照 版本]
- <layer>
- 僅限於 DXF 和 SVG 匯入,指定要匯入的特定圖層。可選。
- $fn
- 雙精度浮點數。將圓形、圓弧和曲線轉換為多邊形時使用的多邊形段數。[注意: 需要 開發快照 版本]
- $fa
- 雙精度浮點數。將圓形和圓弧轉換為多邊形時使用的最小角度步長。[注意: 需要 開發快照 版本]
- $fs
- 雙精度浮點數。將圓形和圓弧轉換為多邊形時使用的最小段長度。[注意: 需要 開發快照 版本]
import("example012.stl", convexity=3);
import("D:/Documents and Settings/User/My Documents/Gear.stl", convexity=3);
(Windows users must "escape" the backslashes by writing them doubled, or replace the backslashes with forward slashes.)
data = import("data.json"); // for data formats the file content is assigned to a variable
讀取 2D DXF 檔案的圖層並建立一個 3D 形狀。
linear_extrude(height = 5, center = true, convexity = 10) import_dxf(file = "example009.dxf", layer = "plate");
此影像顯示了一個凸性為 2 的 2D 形狀,因為紅色指示的光線與 2D 形狀最多相交兩次。3D 形狀的凸性將以類似的方式確定。將它設定為 10 對於大多數情況應該可以正常工作。
在最新版本的 OpenSCAD 中,import() 現在用於匯入 2D(用於擠出的 DXF)和 3D(STL)檔案。
如果你想稍後渲染匯入的 STL 檔案,你必須確保 STL 檔案是“乾淨的”。這意味著網格必須是流形的,並且不應該包含孔或自相交。如果 STL 不乾淨,它可能會最初匯入並預覽正常,但一旦你嘗試透過將它與其他內容結合來執行計算幾何,你可能會收到有關它不是流形的警告,你匯入的 stl 可能會從輸出中完全消失,或者你可能會收到以下錯誤
CGAL error in CGAL_Build_PolySet: CGAL ERROR: assertion violation! Expr: check_protocoll == 0 File: /home/don/openscad_deps/mxe/usr/i686-pc-mingw32/include/CGAL/Polyhedron_incremental_builder_3.h Line: 199
或
CGAL error in CGAL_Nef_polyhedron3(): CGAL ERROR: assertion violation! Expr: pe_prev->is_border() || !internal::Plane_constructor<Plane>::get_plane(pe_prev->facet(),pe_prev->facet()->plane()).is_degenerate() File: /home/don/openscad_deps/mxe/usr/i686-pc-mingw32/include/CGAL/Nef_3/polyhedron_3_to_nef_3.h Line: 253
為了清理 STL 檔案,你可以選擇以下方法
- 使用 http://wiki.netfabb.com/Semi-Automatic_Repair_Options 修復孔,但不修復自相交。
- 使用 netfabb basic。這款免費軟體沒有關閉孔的功能,也無法修復自相交。
- 使用 MeshLab。這款免費軟體可以修復所有問題。
使用 MeshLab,你可以執行以下操作
- 渲染 - 顯示非流形邊
- 渲染 - 顯示非流形頂點
- 如果找到,請使用 過濾器 - 選擇 - 選擇非流形邊或選擇非流形頂點 - 應用 - 關閉。然後單擊“刪除當前選定的頂點集...”按鈕,或檢視 http://www.youtube.com/watch?v=oDx0Tgy0UHo 以獲取說明影片。螢幕上應該顯示“0 個非流形邊”、“0 個非流形頂點”。
接下來,你可以單擊“填充孔”圖示,選擇所有孔,然後單擊“填充”,最後單擊“接受”。你可能需要重複此操作幾次。
使用檔案 - 匯出網格儲存 STL。
如果 Meshlab 無法填充最後一個孔,那麼 Blender 可能會有幫助
- 啟動 Blender
- `X, 1` 以移除預設物件
- 檔案,匯入,Stl
- `Tab` 以編輯網格
- `A` 以取消選擇所有頂點
- `Alt+Ctrl+Shift+M` 以選擇所有非流形頂點
- `MMB` 以旋轉,`Shift+MMB` 以平移,`滾輪` 以縮放
- `C` 用於“圓形”選擇,`Esc` 用於完成
- `Alt+M, 1` 以合併或`空格` 然後搜尋“合併”作為替代方案
- 合併頂點是填充孔的有用方法,在這些孔中,頂點非常緊密地堆積在一起,以至於與典型的 3D 印表機精度相比,幾何形狀的細微變化並不重要
這需要在開發版本中啟用import-function 功能。如果你匯入字尾為“json”或“csv”的檔案,import 將返回一個 JSON 物件資料型別,該資料型別無法表示為文字值——它只能被匯入。
注意:字尾為“.csv”的檔案也被視為 JSON 檔案,但這些格式並不相同——從電子表格程式儲存的 CSV 檔案不能在這裡使用。
/* input file contains:
{"people":[{"name":"Helen", "age":19}, {"name":"Chris", "age":32}]}
*/
t = import("people.json");
echo(t);
people = t.people;
for(i=[0:len(people)-1]) {
person = people[i];
echo(str(person.name, ": ", person.age));
}
這將產生以下輸出
ECHO: { people = [{ age = 19; name = "Helen"; }, { age = 32; name = "Chris"; }]; }
ECHO: "Helen: 19"
ECHO: "Chris: 32"
[已棄用: import_dxf() 將在未來的版本中移除。請使用 import() 代替。]
讀取 DXF 檔案並建立一個 3D 形狀。
linear_extrude(height = 5, center = true, convexity = 10) import_dxf(file = "example009.dxf", layer = "plate");
[已棄用: import_stl() 將在未來的版本中移除。請改用 import()。見上文。]
匯入 STL 檔案以在當前 OpenSCAD 模型中使用
import_stl("body.stl", convexity = 5);
surface() 從文字或影像檔案中讀取 高度圖 資訊。它可以讀取 PNG 檔案。
- 檔案
- 字串。包含高度圖資料的檔案的路徑。
- 中心
- 布林值。這決定了生成的物體的位置。如果為真,則物體在 X 軸和 Y 軸上居中。否則,物體放置在正象限。預設為假。
- 反轉
- 布林值。反轉匯入影像的顏色值如何轉換為高度值。這在匯入文字資料檔案時無效。預設為假。 [注意: 需要版本 2015.03]
- 凸度
- 整數。凸度引數指定與物體相交的光線可能穿過的正面(背面)的最大數量。此引數僅在 OpenCSG 預覽模式下正確顯示物體時才需要,對最終渲染沒有影響。
基於文字的高度圖的格式是表示特定點高度的數字矩陣。行對映到 Y 軸,列對映到 X 軸。數字必須用空格或製表符分隔。空行和以 # 字元開頭的行將被忽略。
[注意: 需要版本 2015.03]
目前只支援 PNG 影像。影像的 Alpha 通道資訊將被忽略,畫素的高度是透過將顏色值轉換為 灰度 來確定的,使用 sRGB 顏色空間的線性亮度(Y = 0.2126R + 0.7152G + 0.0722B)。灰度值按比例縮放,範圍在 0 到 100 之間。
示例 1
//surface.scad surface(file = "surface.dat", center = true, convexity = 5); %translate([0,0,5])cube([10,10,10], center =true);
#surface.dat 10 9 8 7 6 5 5 5 5 5 9 8 7 6 6 4 3 2 1 0 8 7 6 6 4 3 2 1 0 0 7 6 6 4 3 2 1 0 0 0 6 6 4 3 2 1 1 0 0 0 6 6 3 2 1 1 1 0 0 0 6 6 2 1 1 1 1 0 0 0 6 6 1 0 0 0 0 0 0 0 3 1 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0
結果
示例 2
// example010.dat generated using octave:
// d = (sin(1:0.2:10)' * cos(1:0.2:10)) * 10;
// save("example010.dat", "d");
intersection() {
surface(file = "example010.dat", center = true, convexity = 5);
rotate(45, [0, 0, 1]) surface(file = "example010.dat", center = true, convexity = 5);
}
示例 3
[注意: 需要版本 2015.03]
// Example 3a scale([1, 1, 0.1]) surface(file = "smiley.png", center = true);
// Example 3b scale([1, 1, 0.1]) surface(file = "smiley.png", center = true, invert = true);
使用 F6 渲染後,可以使用“檔案 -> 匯出”選單匯出為 STL、OFF、AMF、3MF、DXF、SVG、CSG、PNG(影像)或 PDF。
務必檢查控制檯視窗是否有錯誤訊息。
- STL、OFF 和 DXF 使用
import()匯入 - CSG 可以使用
include<>匯入或像 SCAD 檔案一樣載入 - PNG 可以使用
surface()匯入 - 針對 SVG 和 AMF 有未合併的拉取請求,需要更多工作/測試
- 檔案字尾用於確定型別
要匯出您的設計,從“檔案 -> 匯出”選單中選擇“匯出為 STL...”,然後在隨後的對話方塊中輸入檔名。不要忘記新增“.stl”副檔名。
故障排除:
在編譯並渲染 CGAL(F6)之後,您可能會發現您的設計是簡單的:否。這是個壞訊息。
請參見以下OpenSCAD 2010.02輸出中的第 8 行
Parsing design (AST generation)...
Compiling design (CSG Tree generation)...
Compilation finished.
Rendering Polygon Mesh using CGAL...
Number of vertices currently in CGAL cache: 732
Number of objects currently in CGAL cache: 12
Top level object is a 3D object:
Simple: no <*****************
Valid: yes
Vertices: 22
Halfedges: 70
Edges: 35
Halffacets: 32
Facets: 16
Volumes: 2
Total rendering time: 0 hours, 0 minutes, 0 seconds
Rendering finished.
當您嘗試將其匯出到 .STL 時,會出現此訊息
Object isn't a valid 2-manifold! Modify your design..
“流形”表示它是“水密”的,幾何體中沒有孔。在有效的 2 流形中,每個邊必須連線正好兩個面。這意味著該程式必須能夠將一個面與一個物體連線起來。例如,如果您使用高度為 10 的立方體從高度為 10 的較寬立方體中挖出東西,則不清楚頂部或底部屬於哪個立方體。因此,使小的提取立方體“更長”(或“更短”)
difference() {
// original
cube (size = [2,2,2]);
// object that carves out
# translate ([0.5,0.5,-0.5]) {
cube (size = [1,1,3]);
}
}

以下是一個更復雜的例子,取自 OpenSCAD 論壇(檢索時間 2010 年 3 月 22 日 15:13 UTC)
module example1() {
cube([20, 20, 20]);
translate([-20, -20, 0]) cube([20, 20, 20]);
cube([50, 50, 5], center = true);
}
module example2() {
cube([20.1, 20.1, 20]);
translate([-20, -20, 0]) cube([20.1, 20.1, 20]);
cube([50, 50, 5], center = true);
}
示例 1 將這樣渲染

示例 1 模組不是有效的 2 流形,因為兩個立方體共享一條邊。它們相互接觸,但沒有相交。
示例 2 是一個有效的 2 流形,因為存在相交。現在,該構造滿足 2 流形約束,該約束規定每個邊必須連線正好兩個面。
您要減去的部分必須延伸到原始部分之外。(OpenSCAD 提示:流形空間和時間,檢索時間 2010 年 3 月 22 日 18:40 UTC)。
作為參考,導致設計無法匯出的一種情況是,兩個分別是減法結果的面相互接觸。然後會出現錯誤訊息。
difference () {
cube ([20,10,10]);
translate ([10,0,0]) cube (10);
}
difference () {
cube ([20,10,10]);
cube (10);
}
簡單接觸的表面將被正確處理。
translate ([10,0,0]) cube (10);
cube (10);

