6

OpenSCAD入门笔记

 2 years ago
source link: https://hypersharp.net/geek/101-open-scad-getting-start/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
OpenSCAD入门笔记 - HyperSharp.NET

OpenSCAD是一款功能强大的免费开源建模工具,只需几行代码即可制作精确的3D模型。通过正确的设置,你甚至可以制作适应性强的“参数化”模型。

不像大多数自由软件创建3D 模型 (如著名的 Application Blender),OpenSCAD 专注于 CAD 方面,而不是艺术方面的3D 造型。因此这可能是您正计划创建3D 模型的机器零件,而不是制作电脑动画电影的工具。

OpenSCAD 不是一个交互式建模器。相反它更像一个 3D 编译器,读取描述对象并呈现的脚本文件 这个脚本文件中的3D 模型(参见下面的示例)。这软件是对建模过程进行完全的控制,使您能够轻松地完成改变建模过程中的任何步骤或设计。

OpenSCAD提供了两种主要的建模技术:首先是建设性的实体几何(又名CSG),其次是2D轮廓的制作。作为这些2D轮廓的数据交换格式,使用Autocad DXF文件。除了用于制作的2D路径之外,还可以从DXF文件中读取设计参数。除DXF文件外,OpenSCAD还可以读取和创建STL和OFF文件格式的3D模型。

下载并安装OpenSCAD

最新的稳定版OpenSCAD可以从openscad.org/downloads.html下载。页面顶部的正常下载提供了该软件的最新“稳定”版本,而“开发快照”提供了具有一些额外功能的OpenSCAD的实验版本,但可能比稳定版本具有更多错误。选择适合你操作系统的版本,打开.exe或.dmg,然后按照说明安装OpenSCAD。

openscad_01.jpeg

当你第一次打开OpenSCAD时,应该会遇到启动画面。在此窗口中,你可以创建新文件,打开现有文件或打开示例。所有示例文件都写得非常好,并展示了如何使用OpenSCAD的关键概念。

openscad_02.jpeg

在示例框中,转到Basics> CSG.scad,然后单击“打开示例”以打开简单的CSG示例文件。

OpenSCAD接口:文本编辑器

openscad_03.jpeg

让我们首先查看OpenSCAD窗口的基本部分。OpenSCAD的界面非常简单,仅包含文本编辑器,查看区域和控制台。使用编辑器输入代码,结果模型显示在查看区域中。编辑器中的大多数按钮都是不言自明的(New,Open,Save等)。有趣的是预览,渲染和导出为STL按钮。

点击预览将在查看区域中生成快速模型。这个快速模型显示了模型外观的一般概念,但它不是最终计算的3D模型。按Render告诉OpenSCAD计算最终的3D模型,它会显示精确的读数,但生成时需要比预览更长的时间。渲染模型后,Export as STL将打开一个窗口,将模型另存为STL。

OpenSCAD接口:可视区域

openscad_04.jpeg

“查看区域”显示3D模型。“预览”和“渲染”按钮与编辑器中的相同。两个中间的按钮组控制着查看器中的“摄像机”:左侧的按钮可以缩放或重置视图,而右侧的按钮可以将摄像机捕捉到标准视图。

最后一组按钮包括Perspective / Orthogonal按钮,Show Axes和Show Scale Marker按钮以及Show Edges按钮。在Orthogonal和Perspective之间切换会更改模型是以等距还是透视显示。(正交视图通常更适合制作机械模型,而透视更适合装饰模型)。

OpenSCAD接口:控制台

openscad_05.jpeg

控制台显示在查看区域下方,并显示有关计算模型的技术信息。它还显示保存或导出模型的记录,并显示echo语句的读数。那些不关心引擎技术计算的人不必担心控制台。

对象,动作,操作符和变量

OpenSCAD构建的每个模型都是由对象组合构建的。物体是原始形状,如立方体,圆柱体和球体,并形成每个模型的主干。对象由Actions创建并由Operators修改,Variables和Comments进一步增强了代码。

动作用于创建对象或定义变量。例如,Cube,CylinderSphere是创建其对应的原始对象的动作。

操作员修改对象。有许多不同的运算符,它们用于更改对象的许多不同属性,例如其大小或位置。

变量包含数字,字符串(即文本),向量和列表等值。存储在变量中的信息可以由Actions,Operators或其他变量使用。(变量将在本节的OpenSCAD教程中稍后讨论)

注释用于为阅读代码的任何人提供额外信息。它们通常用于提供有关代码的一般信息(如原作者和发布日期),并解释特定行背后的逻辑和推理。注释不会影响对象,并且在OpenSCAD解释和呈现代码时会被忽略。

(还有矢量,列表,模块和函数,但我们将在不同的OpenSCAD教程中处理这些高级概念!)

可以在OpenSCAD用户手册中找到OpenSCAD可用的所有对象,操作和操作符,以及有关如何使用它们的信息。我们将坚持使用本教程中最简单的一个,但请记住,一旦你熟悉了基础知识,就可以使用一个巨大的工具箱。

有了这个,让我们来看看CSG.scad,看看一些动作和操作符的实例!

CSG.scad示例:将对象与Union结合使用

openscad_06.jpeg

操作员以绿色突出显示,操作以橙色突出显示。(绿色文本是注释。)

在做任何事情之前,我们应该以不同的名称保存文件。我们将在本教程中使用代码,因此我们希望保留原始版本的安全副本。转到文件>另存为…并将其另存为“CSG_tutorial.scad”。完成后,点击“渲染”按钮以查看CSG.scad生成的对象。此示例使用Operators和Actions的不同组合生成三个单独的对象。

我们仔细看看代码。在阅读OpenSCAD代码时,更容易将事物视为代码的“块”,而不是逐行读取。CSG.scad中有三个块,其边界由代码左侧的黑线标记。每个块包含两个动作(立方体和球体)以及一个或两个操作符(平移,联合,交集,差异)。

让我们看看第一个代码块(从第3行开始到第8行结束)。此块定义了“查看区域”左侧的形状,即立方体内的球体。这段代码包含两个Operators和两个Actions:

Translate是一个根据给定的[X,Y,Z]参数移动对象的运算符。在这种情况下,它向下移动一个物体-24毫米的X轴。

Union是一个运算符,它将大括号内的所有对象组合到一个Object中。

Cube是一个创建立方体对象的Action。在这种情况下,每个立方体的边设置为15 mm,“center = true”语句告诉Action从中心绘制立方体。

Sphere是一个创建球体对象的Action。由于该数字尚未定义为半径或直径,因此OpenSCAD假定它是半径。

该块演示了在OpenSCAD中工作的两个关键概念。第一个是操作符仅应用于其边界内的对象。第一个块中的Union运算符仅组合其边界内的Cube和Sphere,并且不包含此文件中的其他对象。同样,第一个块中的Translate Operator仅适用于Unioned Object。如果没有,则此文件中的所有对象将在X轴上以-24为中心!(另请注意,运算符的边界由一对花括号定义,并且其边界内的所有内容都缩进一级。)

下一个重要概念是OpenSCAD始终按顺序执行操作,从最接近Object的Operator开始并向外工作。因此,在此块中,首先在Cube和Sphere上执行Union操作,然后通过Translate移动Unioned对象。即使在处理大型复杂的Operators和Actions组合时,也要从最里面的Objects / Actions开始,然后向后工作,直到到达最上面的Operator。

(眼尖的读者可能会注意到,在这个块中交换操作符不会对生成的对象产生任何影响,因为即使首先移动Cube和Sphere,Union也会起作用。但是,有很多次你在需要按特定顺序应用操作,因此习惯于按顺序考虑应用操作符!)

CSG.scad示例:关于语法的注释

openscad_07.jpeg

现在是提及语法的一些重要观点的好时机。我们刚刚看到操作符的边界由花括号定义。但是,在整个代码中也可以找到其他语法,如分号和缩进。其中一些对于文件运行至关重要,而另一些则不重要。

关键语法对于代码运行是绝对必要的。如果它丢失或写入不正确,当你尝试预览或渲染模型时,OpenSCAD将抛出错误消息。

以下是OpenSCAD中的关键语法:

每个Action语句的结尾必须以分号结尾。这包括创建对象的操作以及定义变量的操作。

如上所述,花括号(又名大括号,花括号)表示Operator语句的边界。在处理复杂的OpenSCAD项目时,很容易丢失所有大括号。但是,当你单击大括号时,OpenSCAD会突出显示其匹配的伙伴,这会使事情变得复杂时更容易。

在非关键的语法是没有必要的模型进行编译。但是,它使代码更容易阅读和编辑。非关键语法的示例包括以下内容:

当你在新的操作员中时,缩进通常会增加,而当操作员完成时,缩进会减少。(在此示例中,因为Union运算符位于Translate运算符内,所以Union缩进了一个级别。因为Cube和Sphere在Union中,它们缩进了两个级别。)OpenSCAD实际上不需要缩进,但是让代码看起来干净整洁。

为了运行OpenSCAD,并不是严格需要换行符(即按Enter键)和空格。从理论上讲,你可以把整个第一个块写成一行,代码仍然可以工作:translate{union{cube(15,center = true); sphere(10);}}但是,把它们拿出来使代码难以阅读。

注释用一对斜杠(“//”)表示。OpenSCAD会忽略一对斜杠后面的所有内容,直到下一行的开头。

(附注:对于熟悉计算机编程的人,你可能会注意到这种语法与C ++基本相同.OpenSCAD主要用C ++编写,因此,从其母语继承了大部分语法。所以对任何人来说都是如此。熟悉Arduino编程,这应该是轻而易举的!)

CSG.scad示例:交叉点运算符

openscad_08.jpeg

对于中间对象,再次使用立方体和球体,但使用交叉点运算符而不是联合进行组合。当给定多个对象时,Intersection会生成一个Object,该Object仅由每个重叠的Object的部分组成。换句话说,如果一个对象的任何部分不与其他对象的任何部分相交,则将其从最终的交叉形状中移除。

在第二个块中的Sphere Action之后,将以下行添加到代码中,然后点击Render按钮以显示你的更改:

translate([7.5,0,0]){cube(15,center = true); }这会增加一个额外的立方体,它通过额外的Translate语句向右移动一半长度。请注意,交叉点运算符仅考虑属于所有三个对象的段,并且不与其他两个对象重叠的部分不包含在最终的交叉对象中。

另请注意第二个Translate如何仅在第二个Cube语句中运行。操作符按顺序工作,因此仅在移动第二个多维数据集后才执行“交点操作”。

CSG.scad示例:差异运算符

openscad_09.jpeg

最右边的形状使用差分算子。差异从另一个对象中减去一个对象,使其对创建孔和其他空间很有用。

差异如何工作(对联盟或交集)的一个重大变化是创建的对象取决于动作/对象在运算符中出现的顺序。尝试在第三个块中切换Cube和Sphere的顺序。请注意,在原始版本的代码中,如何从Cube中减去Sphere,但切换它们会强制相反。

参数化OpenSCAD

现在我们已经了解了CSG.scad示例,让我们来谈谈参数化设计。

在参数化设计中,用户可以更改模型的某些元素,并且设计的其余部分可以适应这些变化。例如,这允许一个人定义不同的螺杆直径,而不必手动筛选代码并替换每个值。

让我们尝试使我们的CSG_tutorial.scad中的三个对象更大。首先用“球体(15)”替换“球体(10)”的所有实例,从球体开始。我们还需要使立方体更大,所以将“cube(15,center = true)”替换为“cube(20,center = true)”。如果使用这些更改呈现代码,则可以看到一些问题:

球体半径与立方体尺寸的比例已经被抛弃,这意味着最终的物体看起来不再像原件那样。

对于我们修改过的中间(交点)对象,对象不再向下拆分,因为我们没有移动第二个立方体。

交点和差异对象彼此重叠,因为它们没有使用翻译运算符分开很远。

对于本OpenSCAD教程的最后一部分,我们将把简单的示例设计转换为参数设计。

制作参数模型:定义变量

openscad_10.jpeg

我们可以尝试手动修复这些问题,但是每次我们想要更改对象的大小时我们都需要修复它们。相反,让我们做一个适当的参数化设计。

制作参数文件的关键步骤是定义变量而不是使用普通数字。变量是使用一种Action语句创建的,一旦定义了变量,我们就可以在任何可以使用数字的地方使用变量。

在文件顶部的某处添加以下Action语句(可以在第一行的注释之前或之后,但不能在第一个代码块之后):sphere_radius = 10;这将创建一个名为“sphere_radius”的变量,并使其等于10。

接下来,浏览代码并用sphere_radius 替换每个Sphere Action中的每个数字(如上图所示)。尝试渲染文件,然后更改sphere_radius并再次渲染文件。你应该看到每个球体的半径随着sphere_radius的变化而变化。

制作参数模型:定义更多变量

openscad_11.jpeg

通过定义变量cube_length并将其设置为15(现在),使多维数据集大小的参数化方式与球半径相同。如上所述,用cube_length替换每个Cube语句中的所有数字。

现在我们可以为模型中的所有对象设置球体半径和立方体长度。但是我们怎样才能保持立方体和球体彼此成比例而不自己计算呢?是时候制作一些相关的变量了!

制作参数模型:依赖变量

openscad_12.jpeg

关于变量的一个方便的事情是它们可以使用其他变量来定义。在其定义中使用其他变量的变量称为从属变量(与独立变量相对,不依赖于任何变量)。

如果我们独立设置sphere_radius和cube_length,我们可能会失去立方体大小与球体大小的原始比例。但是,我们可以通过将cube_length的定义更改为以下内容来将cube_length更改为从属变量:cube_length = sphere_radius * 1.5;

当我们讨论这个主题时,你也可以通过用translate替换translate([7.5,0,0]),将我们在步骤4c中添加的Translate运算符从一个公司X坐标更改为一个参数。现在,中间的物体每次都会干净利落地中间!

请注意,始终需要在 它使用的变量定义之后定义从属变量。OpenSCAD逐行读取代码,因此如果你尝试定义cube_length而不定义sphere_radius,OpenSCAD将不知道该怎么做。

制作参数模型:附加的相关变量

openscad_13.jpeg

最后要修复的是每当球体大小改变时对象之间的间距差。要解决此问题,请创建一个变量来控制每个对象之间的间距:object_separation = sphere_radius * 2 + 4;

在定义cube_length之后插入此Action,然后替换在第7行和第20行的[24,0,0]中和,分别。现在,尝试使用不同的sphere_radius值渲染代码:即使对象变大,它们也应该始终彼此分开4 mm!

下一步是什么?

openscad_14.jpeg

现在你已经掌握了这个OpenSCAD教程的基础知识,现在是时候开始制作自己的一些设计了!阅读文档并使用OpenSCAD提供的不同操作符和操作。你甚至可以开始研究诸如矢量和循环等棘手的概念,这使得设计复杂模型变得更加容易。

命令速查表

1. 语法
var = value; //变量赋值
module name(…) { … } //模块定义,openscad中利用类C语言的模块的概念,通过重复利用的方式,减轻工作量
name(); //调用指定名字的模块,进行绘制
function name(…) = … //函数定义
name(); //函数调用
include <….scad> //包含头文件,通常用于包含一些通用的配置文件
use <….scad> //复用文件,可以将指定文件中的模块包含进来,方便在当前边的设计中,调用那些模块

2. 2D图形绘制
circle(radius) //以radius为半径画圆
square(size,center) //以size为边长绘制正方形
square([width,height],center) //以width,height长宽绘制长方形
polygon([points]) //按点坐标作多边形
polygon([points],[paths]) //依照点坐标和路径,作多边形

3. 3D图形绘制
sphere(radius) //以radius为半径绘制球
cube(size) //以size为边长作正方体
cube([width,height,depth]) //以width,height,depth作为长宽高作长方体
cylinder(h,r,center) //以h作高,r作半径,绘制圆柱
cylinder(h,r1,r2,center) //以h作高,r1,r2分别为上下圆半径作,圆锥体。
polyhedron(points, triangles, convexity) //多面体

4. 变形
translate([x,y,z]) //依照[x,y,z]响量进行平移
rotate([x,y,z]) //围绕 XYZ轴,分别作x,y,z度的旋转。
scale([x,y,z]) //沿XYZ轴,以x,y,z为比例缩放
resize([x,y,z],auto) //
mirror([x,y,z]) //镜像
multmatrix(m)
color(“colorname”)
color([r, g, b, a])
hull()
minkowski() //敏可夫斯基运算,对两个多面体进行运算。得到由一个多面体遍历另一个多面体的结果。常用来作圆角。
逻辑操作
union() //多个多面体的总和,(或运算)
difference() //由第一个多面体,减去除第一个以外的多面体
intersection() //得出多个多面体相交的部分,(与运算)
操作字符,标记出指定多边形,以方便调整

5. 数学函数
abs
sign
acos
asin
atan
atan2
sin
cos
floor
round
ceil
ln
len
log
lookup
min
max
pow
sqrt
exp
rands
其他
echo(…)
str(…)
for (i = [start:end]) { … } //for循环
for (i = [start:step:end]) { … }
for (i = […,…,…]) { … }
intersection_for(i = [start:end]) { … }
intersection_for(i = [start:step:end]) { … }
intersection_for(i = […,…,…]) { … }
if (…) { … }
assign (…) { … }
search(…)
import(“….stl”) //导入stl模型
linear_extrude(height,center,convexity,twist,slices) //挤出
rotate_extrude(convexity)
surface(file = “….dat”,center,convexity)
projection(cut) //投影
render(convexity)
特殊变量
$fa 最小角度
$fs 最小长度
$fn 最小分段
$t 动画分步


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK