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