跳转到内容

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