跳转到内容

OpenSCAD 用户手册/STL 导入和导出

来自维基教科书,开放世界中的开放书籍

任何 3D 设计流程中最重要的部分之一就是能够从其他工具导入和导出。目前,STL 文件格式 是最常用的格式。

导入通过 import() 命令实现。

[注意: 需要 2015.03-2 版本] 可以使用 文件 >> 打开 命令插入此命令。打开文件对话框的文件类型过滤器可能只显示 OpenSCAD 文件,但文件名可以替换为通配符(例如 *.stl)以浏览其他文件类型。

导入文件以供在当前 OpenSCAD 模型中使用。文件扩展名用于确定文件类型。

3D 几何图形格式
  • STL(ASCII 和二进制)
  • OFF
  • OBJ
  • AMF(已弃用)
  • 3MF
2D 几何图形格式
数据格式
  • 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)文件。

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` 以合并或`空格` 然后搜索“合并”作为替代方案
  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 文件。

文件
字符串。包含高度图数据的文件的路径。
中心
布尔值。这决定了生成的物体的位置。如果为真,则物体在 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);
Input image
输入图像
Surface output
示例 3a: surface(invert = false)
Surface output inverted
示例 3b: surface(invert = true)
示例 3: 使用 surface() 将 PNG 图像作为高度图输入。

使用 F6 渲染后,可以使用“文件 -> 导出”菜单导出为 STL、OFF、AMF、3MF、DXF、SVG、CSG、PNG(图像)或 PDF。

务必检查控制台窗口是否有错误消息。

  • STL、OFF 和 DXF 使用 import() 导入
  • CSG 可以使用 include<> 导入或像 SCAD 文件一样加载
  • PNG 可以使用 surface() 导入
  • 针对 SVG 和 AMF 有未合并的拉取请求,需要更多工作/测试
  • 文件后缀用于确定类型

STL 导出

[编辑 | 编辑源代码]

要导出您的设计,从“文件 -> 导出”菜单中选择“导出为 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 将这样渲染

无效的 2 流形立方体(简单 = 否)

示例 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);
华夏公益教科书