跳转至内容

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 图像作为高度图输入。
华夏公益教科书