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);