跳转到内容

OpenSCAD 用户手册/常见问题解答

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

OpenSCAD 如何发音?

[编辑 | 编辑源代码]

预期发音为:Open - ESS - CAD

OpenSCAD 中 S 的含义是什么?

[编辑 | 编辑源代码]

S 代表Solid,如 实体建模.

在 VM 或远程桌面(Windows RDP 或 Linux XfreeRDP 等)中使用 Windows 的 OpenSCAD

[编辑 | 编辑源代码]

您的 VM 或会话可能不支持 OpenSCAD 预览所需的 OpenCSG/OpenGL 版本。

这可以通过使用 MSYS2 包中的 Mesa 驱动程序进行软件渲染来解决。

下载仓库(下面 URL 中的“文件:”链接),选择适合您的 Windows 安装的 64 位或 32 位版本。

64bit - mingw64 Repo at https://packages.msys2.org/package/mingw-w64-x86_64-mesa?repo=mingw64
32bit - mingw32 Repo at https://packages.msys2.org/package/mingw-w64-i686-mesa?repo=mingw32

该文件是一个 ...pkg.tar.xz 压缩文件,Windows 不支持该格式。使用 7-zip 或 WinRAR 解压缩文件内容。

解压缩文件 mingw[64 或 32]\bin\opengl32.dll(对于 64 位版本,文件仍然命名为 opengl32.dll)。

将 opengl32.dll 复制到 OpenSCAD 安装目录(即包含 openscad.exe 文件的目录,通常是 c:\program files [对于 64 位] 或 c:\program files(x86) [对于 32 位] 的子目录)。

重新启动 OpenSCAD,预览应该正常工作。

预览似乎根本不起作用

[编辑 | 编辑源代码]
强制使用 Goldfeather

某些系统,特别是 Windows 上的英特尔 GPU,往往具有旧的或损坏的 OpenGL 驱动程序。这在使用差值或交集运算符时会影响预览渲染。

以下方法通常可以改善这种情况:编辑->首选项->高级->强制使用 Goldfeather(参见截图)。

预览中那些奇怪的闪烁伪像是什么?

[编辑 | 编辑源代码]
OpenSCAD 显示问题,存在重合面

这通常是由对共享一个或多个面的对象进行差值引起的,例如:

cube_size = 20;
difference() {
  cube(cube_size, center = true);
  cylinder(r = 10, h = cube_size, center = true);
}

在某些情况下,最终渲染效果很好,但具有重合结果面的设计应被视为具有未定义行为的设计,因为无法保证适当的渲染结果。问题的根本原因不是 bug,而是无法严格比较浮点数的内在属性,这些浮点数可能已经过三角运算(如旋转)从而导致无法以任何方式精确表示的无理数。因此,您可能会遇到几乎重合的表面,其中一部分表面在内部,一部分表面在外部,或者存在零体积区域,从而导致渲染错误,即输出不是流形。在像这个例子这样简单的测试中,渲染通常会很好,给这种方法带来错误的信心,但是如果这两个部件都受到相同的旋转,它可能会以一种略微依赖于程序运行平台的方式失败。这通常会导致渲染时出现警告,并且最终输出中会删除渲染的部件。

解决方法是始终为要移除的表面提供明确的重叠,例如通过添加一个称为 epsilon 的小值。

cube_size = 20;
difference() {
  cube(cube_size, center = true);
  cylinder(r = 10, h = cube_size+0.01, center = true);
}

请注意,联合也会出现类似问题,其中要合并的重合面也必须给出 epsilon 值才能保证它们始终在内部。

还有一种只在预览中出现的闪烁结果,它也可能发生在即使在最终结果中也不应该可见的面,例如,因为它们是用于通过 difference() 操作进行移除的负面。第二种情况是对完全正确移除的面(或负面)的影响,这是用于绘制预览的库的伪像,不会影响渲染。如果需要干净的预览结果(例如用于图像输出),可以通过相同的方式使用 epsilon 值对其进行调整。有关其他详细信息,请参见 此讨论

另请参见:w:Z 冲突

为什么模型的某些部分(例如孔)渲染不正确?

[编辑 | 编辑源代码]
OpenSCAD 显示问题,凸性设置过低

当使用 linear_extrude() 等功能或导入对象时,可能会发生这种情况。对象的凸性是未知的。对于更复杂的对象,可以使用 convexity 参数来指定值。请注意,较高的值会导致预览速度变慢。

difference() {
    linear_extrude(height = 15 /* , convexity = 2 */) {
        difference() {
            square([50, 50]);
            translate([10, 10]) circle(5);
        }
    }
    translate([25, 25]) cube([5, 5, 40], center = true);
}

用户手册(第 拉伸所有拉伸模式的参数 节)描述了如何计算应该赋予凸性参数的数字。

另一个解决方法可能是使用 render() 强制生成网格,即使是在预览模式下。

参见: w:凸性_(数学)

为什么差集 (或交集) 有时在预览中不起作用?

[编辑 | 编辑源代码]
球体减去立方体,相机位于不可见立方体之外。
相同的模型,视角略微旋转,使相机位于不可见立方体内部。
difference() {
    sphere(10);
    cube(100);
}

在透视模式下,预览器不会处理相机位于不可见物体内部的差集或交集。这在使用大型物体切除模型的很大一部分时最为常见。

解决方法

  • 将相机保持在不可见物体之外。
  • 将不可见物体的大小保持适中,以便更容易将相机保持在它们之外。
  • render() 包裹在差集或交集中。
  • 使用正交模式。


为什么我的模型使用 F5 显示,但使用 F6 不显示?

[编辑 | 编辑源代码]
具有翻转面的 OpenSCAD 多面体

这可能是由 多面体 的翻转面造成的。

这可以在 “Thrown Together” 显示模式下可视化。有关详细信息,请参阅 无序面

points = [[5,5,0],[5,-5,0],[-5,-5,0],[-5,5,0],[0,0,3]];
faces = [[0,1,4],[1,2,4],[2,3,4],[3,4,0],[1,0,3],[2,1,3]];
polyhedron(points, faces);

如果模型导入外部 STL 文件,请参阅 导入相关问题。令人困惑的是,错误只在涉及多个物体时才会出现,即在你添加另一个项目之前它 “起作用”。

为什么预览速度如此之慢?

[编辑 | 编辑源代码]

http://forum.openscad.org/Why-is-for-so-slow-tp11511p11531.html

这很难解释,但本质上,将交集(或差集)作为差集中的负物体是昂贵的。预览渲染算法允许只有基本物体作为负物体,而其他所有物体都必须解包。

例如(使用 A+B = union() / A-B = difference() / A*B = intersection()

A - B*C - D*E

变为:A-B-D + A-B-E + A-C-D + A-C-E

.. 并且如果 A 更复杂

A+B - C*D - E*F

变为:A-C-E + A-C-F + A-D-E + A-D-F + B-C-E + B-C-F + B-D-E + B-D-F

必须渲染所有组合,这可能需要一些时间,尤其是在旧的 GPU 上,以及在低端英特尔 GPU 上。

为什么我导入的 STL 文件使用 F5 显示,但使用 F6 不显示?

[编辑 | 编辑源代码]

这主要是由不良的 STL 文件引起的,最好的方法是在 Blender、MeshLab 或 NetFabb 等工具中验证 STL 文件并修复问题。本质上,模型需要是流形才能在 OpenSCAD 中进行处理。

模型仍然出现在预览模式中的原因是,还没有进行真正的几何计算。预览只是从 STL 中绘制三角形。

有一个会导致问题的特定问题,称为 “零面”(意味着 STL 包含面积为零的三角形,因为所有 3 个点都在一条线上),OpenSCAD 目前对它的处理不好。

使用 MeshLab

MeshLab 具有一个过滤器,可以通过翻转多边形的边来删除零面

过滤器 -> 清理和修复 -> 通过边翻转删除 T 顶点.

将比率设置为高值(例如 1000000),否则模型可能会变形。

使用 Blender

Blender 有一个 3D 打印工具箱插件(需要在用户设置中启用),可以显示 STL 文件中的问题。请参阅 http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Modeling/PrintToolbox

使用 NetFabb/微软云服务

微软 3D 模型修复服务可以帮助修复 STL 文件。在发布文件之前,请确保阅读服务条款。请参阅 https://modelrepair.azurewebsites.net/

我在导入 DXF 文件时收到 “不支持的 DXF 实体” 警告。这是什么意思?

[编辑 | 编辑源代码]

DXF 导入有时会产生警告信息,例如 Unsupported DXF Entity 'SPLINE' (1c1) in "file.dxf"。这意味着 DXF 文件正在使用 OpenSCAD 导入器无法处理的功能。导入器只是忽略这些未知实体,这会导致模型不完整。

使用 Inkscape 时,生成不包含不支持实体的 DXF 文件的最简单方法是使用以下方法将所有贝塞尔曲线转换为短线段

扩展 -> 修改路径 -> 平滑贝塞尔曲线

对话框中给出的值决定线段的长度。较低的值会产生更平滑的结果,但也产生更多的线段。作为导出文件格式,使用 “台式切割绘图仪 (AutoCAD DXF R14)”。

更详细的教程可在 http://repraprip.blogspot.de/2011/05/inkscape-to-openscad-dxf-tutorial.html 找到

如何从一个脚本导出多个部件?

[编辑 | 编辑源代码]

答案基于 github 相关问题中的评论 https://github.com/openscad/openscad/pull/1534#issuecomment-227024209

有一种方法可以生成一堆几何基元并将它们作为 STL 文件从单个脚本导出,而无需注释/取消注释代码。

变量 PARTNO 指示在当前运行中导出哪个部件。如果 PARTNO 为 ‘undef’,则不会导出任何内容。

使用 PARTNO=0 导出的图像
 PARTNO = undef; // default part number
 
 module tree() {
   color("green") cylinder(r1 = 12, r2 = 1, h = 30);
   // ...
 }
 
 module trunk() {
   color("brown") cylinder(r = 3, h = 10);
   // ...
 }
 
 module base() {
   color("white") translate([-10, -10, 0]) cube([20, 20, 5]);
   // ...
 }
 
 if (PARTNO == 1) tree();
 if (PARTNO == 2) trunk();
 if (PARTNO == 3) base();
 
 // optionally use 0 for whole object
 if (PARTNO == 0) {
   base();
   translate([0, 0, 5]) trunk();
   translate([0, 0, 15]) tree();
 }

在交互式工作时,可以在文件顶部的 PARTNO 变量中设置要从 GUI 中显示/导出的部件的编号。

可以通过在 MacOS 或 Linux 上编写 shell 脚本,或在 Windows 上编写批处理文件,来自动执行导出所有部件的过程。shell 脚本看起来像这样

 # export parts as STL
 openscad -DPARTNO=1 -o tree.stl model.scad
 openscad -DPARTNO=2 -o trunk.stl model.scad
 openscad -DPARTNO=3 -o base.stl model.scad
 
 # export image of all the parts combined
 openscad -DPARTNO=0 -o model.png model.scad

从命令行运行此脚本一次,会将所有部件导出到单独的文件中。

如何导出比当前窗口分辨率更高的屏幕截图

[编辑 | 编辑源代码]

现在,无法从 GUI 中进行操作,因为图像被限制在实际显示上下文中。使用 文件->导出->导出为图像 菜单始终以视口分辨率导出。

但是,可以使用 --imgsize 参数通过命令行生成更高分辨率的图像。这使用单独的绘图上下文(大小受内存和图形驱动程序限制)来生成图像。例如,在 Linux 上,英特尔 UHD Graphics 620 (Kabylake GT2) 的 Mesa 驱动程序似乎在图像分辨率约为 16000×16000 时达到最大值。

 $ openscad --imgsize 16000,16000 -o CSG.png CSG.scad
 ECHO: version = [2019, 1, 0]
 Compiling design (CSG Products normalization)...
 Normalized CSG tree has 6 elements
 $ file CSG.png 
 CSG.png: PNG image data, 16000 x 16000, 8-bit/color RGB, non-interlaced

为什么我在编写 a = a + 1 时出现错误?

[编辑 | 编辑源代码]

http://forum.openscad.org/A-A-1-tp11385p11411.html

首先,当我们开始更好地利用这些机会时,问题 **为什么** 我们有这些“限制”变得更加清晰。

  • 我们需要一个“reduce”函数来帮助根据输入列表收集信息。递归很好,但人们往往难以理解它,我们可以提供一些帮助。
  • 我们应该禁止任何重新赋值的尝试,以便更清楚地了解发生了什么。我们部分允许它的唯一真正原因是为了允许命令行变量覆盖。

帮助思考

  • 想象 OpenCAD 中的每个表达式都是并行执行的。任何现有表达式的依赖性必须通过层次结构分组来明确表示。这应该消除为收集信息而进行迭代的想法。
  • 就函数而言:想象一个函数表达式是你在电子表格单元格中键入的内容。并非完全可映射,但这可能有助于框架它。
  • 电子表格类比也适用于迭代。电子表格中的单元格无法自行递增;尝试这样做会导致电子表格中出现循环引用错误。

现在,我们可以添加各种糖来帮助人们应用他们现有的编程问题解决技能。问题更多的是它是否真的对我们有帮助,以及谁将带头设计这种语言扩展,因为我们目前对开发团队没有真正认同这些想法。

如果你将 OpenSCAD 语言视为类似于 HTML,但用于 3D 建模,那么你仍然需要各种程序用这种语言生成代码(类似于现有的 HTML 生成器)。存在许多工具可以帮助从现有编程语言(python、ruby、C++、haskell、clojure 等)生成 OpenSCAD 代码,并且也有一些工具提供了用于类似目的的 Javascript 接口(OpenJSCAD、CoffeeSCAD)。在我们有充分的理由在 OpenSCAD 本身中这样做,并且有一个很好的语言支持候选者之前,最好将这些事情分开。

另请参阅以下内容以获取帮助:列表推导技巧与窍门递归函数

用户界面

[编辑 | 编辑源代码]

OpenSCAD 未遵循我的 GTK 桌面主题

[编辑 | 编辑源代码]

您可能需要在基于 Debian 的系统上安装包“qt5-style-plugins”,在基于 Fedora 的系统上安装包“qt5-qtstyleplugins”,然后在调用 openscad 时设置环境变量 QT_QPA_PLATFORMTHEME=gtk2 openscad

要使设置永久生效,请将 export QT_QPA_PLATFORMTHEME=gtk2 添加到您的用户的 ~/.profile

OpenSCAD GUI 在 Gnome 上的 4K / HIDPI 显示器上未缩放

[编辑 | 编辑源代码]

OpenSCAD 使用的 GUI 框架 Qt 似乎需要额外的提示才能在 Gnome/X11 上的 4K / HIDPI 显示器上自动正确缩放(例如,在 Ubuntu 22.10 上报告,其中分数缩放设置为 125%)。

  • openscad.desktop/usr/share/applications/ 复制到 ~/.local/share/applications
  • Exec=openscad 更改为 Exec=env QT_AUTO_SCREEN_SCALE_FACTOR=1 openscad

我在 Ubuntu 中运行 OpenSCAD 时没有菜单栏,如何找回它?

[编辑 | 编辑源代码]

这似乎是由 Ubuntu 干预 Qt 将菜单栏移动到其他地方(例如,屏幕顶部)导致的。

这个问题也会影响其他应用程序,请参阅 https://bugs.launchpad.net/ubuntu/+source/appmenu-qt5/+bug/1307619

有两件事可能有所帮助

  • QT_QPA_PLATFORMTHEME 环境变量设置为一个空字符串(默认值为“appmenu-qt5”),或者简单地使用 QT_QPA_PLATFORMTHEME= openscad 运行 OpenSCAD
  • 删除 appmenu-qt5 包以全局禁用所有应用程序的菜单栏更改

为什么错误行号不正确?

[编辑 | 编辑源代码]

这是当前解析器中的一个限制/错误,它基本上将 include<> 视为内容的复制和粘贴。在某些情况下,可以通过将 include<> 语句放在文件末尾来解决此问题。

在依赖库时,建议使用 use<>,它没有此问题,还会自动禁止该文件中的任何顶级几何图形(可能是该库的演示)。

我不喜欢这个编辑器,我可以使用我最喜欢的编辑器吗?

[编辑 | 编辑源代码]

是的,OpenSCAD 支持一种特殊模式,如果文件在外部修改,它将重新加载这些文件。要启用此模式,请选中“设计”->“自动重新加载和预览”选项,然后只需关闭编辑器窗口(或使用“查看”->“隐藏编辑器”)。

另请参阅用户手册中的部分:使用外部编辑器与 OpenSCAD

例如,以下脚本将 vim 作为编辑器运行,并将 OpenSCAD 作为模型查看器角色运行。

它支持 3 种模式

  • 不带参数运行,它将打开一个临时文件以进行快速测试,该文件会被删除。
  • 使用不存在的文件名称运行,它将使用默认许可证头启动该文件。
  • 使用现有文件的名称运行,它只会打开它。
#!/bin/bash
  
FILE="$1"
AUTHOR="Your Name Here"
YEAR="$(date "+%Y")"
LICENSE="// Created in $YEAR by $AUTHOR.\n// This work is released with CC0 into the public domain.\n// https://creativecommons.org/publicdomain/zero/1.0/"

# increase stack size to allow deeper recursion
ulimit -s 65536

if [ "$FILE" == "" ]
then
  TEMPF=`mktemp --suffix=.scad`
  openscad "$TEMPF" >/dev/null 2>/dev/null &
  vim "$TEMPF"
  rm -f "$TEMPF"
  exit
fi

if [ ! -e "$FILE" ]
then
  echo -e "$LICENSE" >> "$FILE"
fi

openscad "$FILE" >/dev/null 2>/dev/null &
vim "$FILE"

错误/问题

[编辑 | 编辑源代码]

为什么我收到“没有要渲染的顶级几何图形”?

[编辑 | 编辑源代码]

这可能有多种原因,一些常见的原因包括

缺少/注释掉的模块调用
module model() {
  cube(20);
}
%model();

使用 % 修饰符不仅会使部件透明,还会导致部件在最终渲染中被排除!

差集/交集与错误的平移对象

解决此类问题的最简单方法是使用 # 修饰符突出显示对象,看看对象是否放置在它们应该在的位置。

导入损坏的 STL 文件

请参阅 为什么我的导入的 STL 文件在 F5 中显示,但在 F6 中不显示?

OpenSCAD 崩溃/被杀死了,我未保存的更改丢失了吗?

[编辑 | 编辑源代码]

在开始预览或渲染过程之前,OpenSCAD 编辑器会写入一个备份文件,以防存在未保存的更改。

此文件存储在用户的文档文件夹中的单独目录中(例如,在 Linux 上,通常是 $HOME/.local/share/OpenSCAD/backups)。可以在 帮助->库信息 对话框中查看实际路径,该路径列为“备份路径”。

OpenSCAD 在 Windows 上单击“新建”或加载文件时崩溃

[编辑 | 编辑源代码]

OpenSCAD 在一些安装了英特尔显卡驱动程序的机器上崩溃,有关更多详细信息,请参阅 https://github.com/openscad/openscad/issues/2442

OpenSCAD 在 Windows 上无法运行,并引用 EVR.dll、MF.dll 或 MFPlat.dll

[编辑 | 编辑源代码]

这是 Windows N(欧洲)和 KN(韩国)版本特有的问题,由于 2004 年欧洲委员会针对反竞争行为的裁决,这些版本删除了 Windows Media Framework。

OpenSCAD 从 2019.05 版本开始依赖一些功能,因此在这些系统上无法运行。

可以通过安装 Microsoft 在 KB3145500 中提供的列表中的正确“适用于 N 版本的媒体功能包”来添加缺少的 Windows Media Framework。对于 Windows 10 N 版本,有一个专门的下载页面,包含 Windows 版本选择器:https://www.microsoft.com/en-us/software-download/mediafeaturepack

从 Windows 10 1909 开始,您无法直接从 Microsoft 网站下载媒体功能 - 您必须使用 Windows 设置 > 应用 > 应用和功能 > 可选功能 > 添加功能并在可用的可选功能列表中找到媒体功能包。之后重启,它应该可以工作。

报告错误,请求功能

[编辑 | 编辑源代码]

如何报告错误?

[编辑 | 编辑源代码]

OpenSCAD 中的错误最好在 github 的问题跟踪系统中报告,地址为 https://github.com/openscad/openscad/issues。如果您不确定是否是错误,在 邮件列表/论坛 上询问可以帮助澄清问题。

如果您发现该错误已在以前报告过,请尝试在现有问题中搜索。如果您发现类似的问题或不确定,请创建新的问题,但要提及可能相关的现有问题。

错误报告应尽可能多地提供信息以帮助重现错误,包括但不限于

  • OpenSCAD 版本
  • 操作系统名称和版本
  • 产生问题的场景描述
  • 在图形问题的情况下,OpenGL 驱动程序信息
  • 如果可能,一个精简的脚本来重现问题

大多数技术版本信息可以在菜单 “帮助 -> 库信息” 中找到,或者通过命令行 openscad --info 获取。

如何请求新功能?

[编辑 | 编辑源代码]

新的功能或对现有功能的更改/扩展可以在 github 的问题跟踪系统中请求,地址为 https://github.com/openscad/openscad/issues

请努力尽可能详细地解释新功能/更改。包括一些关于您为什么认为此功能对您和其他用户有用的背景信息,这将非常有帮助,并增加其被实现的可能性。

[编辑 | 编辑源代码]

Windows 版本目前由 OpenSCAD 团队维护,因此请使用 github 问题跟踪器 报告错误。

Mac OS X 版本目前由 OpenSCAD 团队维护,因此请使用 github 问题跟踪器 报告错误。

包含在/由各种 Linux 发行版分发的 OpenSCAD 版本通常由与发行版合作的人员/团队维护。

可以在各自的错误跟踪系统中报告特定错误,例如:

托管在 openSUSE 构建服务 上的 每日构建 由 OpenSCAD 团队维护,因此请使用 github 问题跟踪器 报告这些软件包的问题。

华夏公益教科书