OpenSCAD 使用者手冊/匯入幾何
匯入是透過 import() 命令實現的。
[注意: 需要版本 2015.03-2] 檔案 >> 開啟 命令可用於插入此命令。開啟檔案對話方塊的檔案型別過濾器可能只顯示 OpenSCAD 檔案,但檔名可以用萬用字元 (例如 *.stl) 替換以瀏覽到其他檔案型別。
匯入檔案以在當前 OpenSCAD 模型中使用。副檔名用於確定型別。
- 3D 幾何格式
- STL (ASCII 和二進位制)
- OFF
- OBJ
- AMF (已棄用)
- 3MF
- 2D 幾何格式
- DXF
- SVG
- 資料格式
- JSON [注意: 需要版本 開發快照]
- 其他
- CSG 可以使用 include<> 匯入或像 SCAD 檔案一樣載入
- PNG 可以使用 surface() 匯入
- <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` 合併或 `Space` 並搜尋“合併”作為替代方案
- 合併頂點是填充孔的一種有用方法,在這些孔中,頂點非常靠近,以至於幾何形狀的細微變化與典型 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 檔案。
- file
- 字串。包含高度圖資料的檔案的路徑。
- center
- 布林值。這決定了生成的物體的定位。如果為真,則物體在 X 和 Y 軸上居中。否則,物體將放置在正象限中。預設為 false。
- invert
- 布林值。反轉匯入影像的顏色值如何轉換為高度值。這在匯入文字資料檔案時沒有影響。預設為 false。 [注意: 需要版本 2015.03]
- convexity
- 整數。凸度引數指定光線與物體相交時可能穿過的正面(背面)的最大數量。此引數僅在 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);

