OpenSCAD 用户手册/常见问题解答
预期发音为:Open - ESS - CAD
S 代表Solid,如 实体建模.
您的 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,预览应该正常工作。
某些系统,特别是 Windows 上的英特尔 GPU,往往具有旧的或损坏的 OpenGL 驱动程序。这在使用差值或交集运算符时会影响预览渲染。
以下方法通常可以改善这种情况:编辑->首选项->高级->强制使用 Goldfeather(参见截图)。
这通常是由对共享一个或多个面的对象进行差值引起的,例如:
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 值对其进行调整。有关其他详细信息,请参见 此讨论。
当使用 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() 强制生成网格,即使是在预览模式下。
difference() {
sphere(10);
cube(100);
}
在透视模式下,预览器不会处理相机位于不可见物体内部的差集或交集。这在使用大型物体切除模型的很大一部分时最为常见。
解决方法
- 将相机保持在不可见物体之外。
- 将不可见物体的大小保持适中,以便更容易将相机保持在它们之外。
- 将 render() 包裹在差集或交集中。
- 使用正交模式。
这可能是由 多面体 的翻转面造成的。
这可以在 “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 文件引起的,最好的方法是在 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 导入有时会产生警告信息,例如 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 = 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
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 本身中这样做,并且有一个很好的语言支持候选者之前,最好将这些事情分开。
您可能需要在基于 Debian 的系统上安装包“qt5-style-plugins”,在基于 Fedora 的系统上安装包“qt5-qtstyleplugins”,然后在调用 openscad 时设置环境变量 QT_QPA_PLATFORMTHEME=gtk2 openscad
要使设置永久生效,请将 export QT_QPA_PLATFORMTHEME=gtk2
添加到您的用户的 ~/.profile
中
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 干预 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 编辑器会写入一个备份文件,以防存在未保存的更改。
此文件存储在用户的文档文件夹中的单独目录中(例如,在 Linux 上,通常是 $HOME/.local/share/OpenSCAD/backups
)。可以在 帮助
->库信息
对话框中查看实际路径,该路径列为“备份路径”。
OpenSCAD 在一些安装了英特尔显卡驱动程序的机器上崩溃,有关更多详细信息,请参阅 https://github.com/openscad/openscad/issues/2442
这是 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 版本通常由与发行版合作的人员/团队维护。
可以在各自的错误跟踪系统中报告特定错误,例如:
- Debian - 请参阅 https://bugs.debian.org/cgi-bin/pkgreport.cgi?package=openscad 中的“请报告”说明
- Ubuntu - 请参阅 https://launchpad.net/ubuntu/+source/openscad 中的“报告错误”说明
- Fedora / Red Hat - 请参阅 https://apps.fedoraproject.org/packages/openscad/bugs 和 https://bugzilla.redhat.com/buglist.cgi?component=openscad
- Arch Linux - 请参阅 https://bugs.archlinux.org/index.php?string=openscad&status%5B%5D= 中的“报告错误指南”说明
托管在 openSUSE 构建服务 上的 每日构建 由 OpenSCAD 团队维护,因此请使用 github 问题跟踪器 报告这些软件包的问题。