跳轉至內容

OpenSCAD 使用者手冊/匯入幾何體

來自華夏公益教科書,開放的書籍,構建開放的世界

匯入透過 import() 命令實現。

[注意: 需要版本 2015.03-2] 可以使用 檔案 >> 開啟 命令插入此命令。開啟檔案對話方塊的檔案型別過濾器可能只顯示 OpenSCAD 檔案,但檔名可以替換為萬用字元(例如 *.stl)以瀏覽到其他檔案型別。

匯入一個檔案以供在當前 OpenSCAD 模型中使用。副檔名用於確定型別。

3D 幾何體格式
  • STL(ASCII 和二進位制)
  • OFF
  • OBJ
  • AMF(已棄用)
  • 3MF
2D 幾何體格式
資料格式
  • JSON [注意: 需要版本 開發快照]
其他
  • CSG 可以使用 include<> 匯入或像 SCAD 檔案一樣載入
  • PNG 可以使用 surface() 匯入
<file>
包含檔案路徑的字串:如果給定路徑不是絕對路徑,則它將相對於匯入指令碼解析。請注意,當使用 include<> 且指令碼使用 import() 時,這將相對於執行 include<> 的指令碼。
<convexity>
整數。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)檔案。

CGAL 錯誤:斷言失敗!

[編輯 | 編輯原始碼]

如果您想稍後渲染匯入的 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 檔案,您可以選擇以下選項

使用 MeshLab,您可以執行以下操作

  • 渲染 - 顯示非流形邊
  • 渲染 - 顯示非流形頂點
  • 如果找到,使用過濾器 - 選擇 - 選擇非流形邊或選擇非流形頂點 - 應用 - 關閉。然後單擊“刪除當前選定的頂點集...”按鈕或檢視 http://www.youtube.com/watch?v=oDx0Tgy0UHo 獲取說明影片。螢幕應顯示“0 個非流形邊”、“0 個非流形頂點”。


接下來,您可以單擊“填充孔”圖示,選擇所有孔,然後單擊“填充”,然後單擊“接受”。您可能需要重複此操作幾次。

使用檔案 - 匯出網格來儲存 STL。


如果 Meshlab 無法填充最後一個孔,那麼 Blender 可能會有所幫助

  1. 啟動 Blender
  2. `X, 1` 刪除預設物件
  3. 檔案,匯入,Stl
  4. `Tab` 編輯網格
  5. `A` 取消選擇所有頂點
  6. `Alt+Ctrl+Shift+M` 選擇所有非流形頂點
  7. `MMB` 旋轉,`Shift+MMB` 平移,`滾輪` 縮放
  8. `C` 用於“圓形”選擇,`Esc` 完成
  9. `Alt+M, 1` 合併或 `Space` 搜尋“合併”作為替代方案
  10. 合併頂點是填充孔的一種有用方法,其中頂點非常緊密地堆積在一起,以至於與典型的 3D 印表機精度相比,幾何形狀的細微變化無關緊要。

匯入 JSON

[編輯 | 編輯原始碼]

這需要在開發版本中啟用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() 將在未來版本中刪除。 請使用import() 代替。]

讀取 DXF 檔案並建立 3D 形狀。

linear_extrude(height = 5, center = true, convexity = 10)
		import_dxf(file = "example009.dxf", layer = "plate");

import_stl

[編輯 | 編輯原始碼]

[已棄用:import_stl() 將在未來版本中刪除。 請使用import() 代替。請參見上文。]

匯入 STL 檔案以供在當前 OpenSCAD 模型中使用

import_stl("body.stl", convexity = 5);

surface() 從文字或影像檔案讀取 高度圖 資訊。它可以讀取PNG 檔案。

file
字串。包含高度圖資料的檔案的路徑。
center
布林值。這決定了生成的物體的位置。如果為真,物體在 X 軸和 Y 軸上居中。否則,物體將放置在正象限中。預設為假。
invert
布林值。反轉匯入影像的顏色值如何轉換為高度值。匯入文字資料檔案時,此選項無效。預設值為 false。 [注意: 需要版本 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);
Input image
輸入影像
Surface output
示例 3a:surface(invert = false)
Surface output inverted
示例 3b:surface(invert = true)
示例 3:使用 surface() 和 PNG 影像作為高度圖輸入。
華夏公益教科書