跳轉到內容

OpenSCAD 使用者手冊/匯入幾何

來自 Wikibooks,開放世界中的開放書籍

匯入是透過 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>
整數。凸性引數指定與物件相交的光線可能穿透的最大正面(或背面)數量。此引數僅在 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 軸上居中。否則,物體將放置在正象限中。預設為 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);
Input image
輸入影像
Surface output
示例 3a: surface(invert = false)
Surface output inverted
示例 3b: surface(invert = true)
示例 3:使用 surface() 以 PNG 影像作為高度圖輸入。
華夏公益教科書