跳转到内容

OpenSCAD 用户手册/使用二维子系统

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

所有二维基本图形都可以使用三维变换进行变换。它们通常用作三维挤出的部分。虽然它们无限薄,但以 1 个单位的厚度渲染。

注意:尝试使用 difference() 从三维对象中减去会导致最终渲染中出现意外结果。

正方形

[编辑 | 编辑源代码]

在第一象限创建正方形或矩形。当 center 为真时,正方形以原点为中心。如果按此处显示的顺序给出,参数名称是可选的。

square(size = [x, y], center = true/false);
square(size =  x    , center = true/false);
参数:
大小
单个值,两边都具有该长度的正方形
2 值数组 [x,y],尺寸为 x 和 y 的矩形
中心
false(默认),第 1 象限(正),一个角在 (0,0)
true,正方形以 (0,0) 为中心
default values:  square();   yields:  square(size = [1, 1], center = false);
示例:

10x10 square

equivalent scripts for this example
 square(size = 10);
 square(10);
 square([10,10]);
 .
 square(10,false);
 square([10,10],false);
 square([10,10],center=false);
 square(size = [10, 10], center = false);
 square(center = false,size = [10, 10] );

OpenScad square 20x10

equivalent scripts for this example
 square([20,10],true);
 a=[20,10];square(a,true);

在原点创建圆形。除 r 外,所有参数必须命名。

circle(r=radius | d=diameter);
参数
r : 圆形半径。r 名称是唯一可选的圆形参数。
圆形分辨率基于大小,使用 $fa 或 $fs。
对于一个小的,高分辨率的圆形,您可以创建一个大圆形,然后将其缩小,或者您可以设置 $fn 或其他特殊变量。注意:这些示例超过了 3D 打印机的分辨率以及显示屏的分辨率。
scale([1/100, 1/100, 1/100]) circle(200); // create a high resolution circle with a radius of 2.
circle(2, $fn=50);                        // Another way.
d  : 圆形直径(仅在 2014.03 之后的版本中可用)。
$fa : 每个片段的最小角度(以度为单位)。
$fs : 每个片段的最小圆周长度。
$fn : 360 度中的固定片段数。3 或更大的值会覆盖 $fa 和 $fs。
如果使用它们,$fa、$fs 和 $fn 必须是命名参数。点击此处了解更多详情,.
defaults:  circle(); yields:  circle($fn = 0, $fa = 12, $fs = 2, r = 1);

circle for user manual description

此示例的等效脚本

 circle(10);
 circle(r=10);
 circle(d=20);
 circle(d=2+9*2);

可以通过使用 scale()resize() 使 x 和 y 尺寸不相等来从圆形创建椭圆。参见 OpenSCAD 用户手册/变换

Ellipse from circle Ellipse from circle top view

equivalent scripts for this example
 resize([30,10])circle(d=20);
 scale([1.5,.5])circle(d=20);

规则多边形

[编辑 | 编辑源代码]

可以通过使用 circle() 并将 $fn 设置为边数来创建 3 个或更多边的规则多边形。以下两段代码等效。

 circle(r=1, $fn=4);
 module regular_polygon(order = 4, r=1){
     angles=[ for (i = [0:order-1]) i*(360/order) ];
     coords=[ for (th=angles) [r*cos(th), r*sin(th)] ];
     polygon(coords);
 }
 regular_polygon();

这些结果是以下形状,其中多边形内接于圆形,所有边(和角)相等。一个角指向正 x 方向。对于不规则形状,请参见下面的多边形基本图形。

script for these examples
 translate([-42,  0]){circle(20,$fn=3);%circle(20,$fn=90);}
 translate([  0,  0]) circle(20,$fn=4);
 translate([ 42,  0]) circle(20,$fn=5);
 translate([-42,-42]) circle(20,$fn=6);
 translate([  0,-42]) circle(20,$fn=8);
 translate([ 42,-42]) circle(20,$fn=12);
 
 color("black"){
     translate([-42,  0,1])text("3",7,,center);
     translate([  0,  0,1])text("4",7,,center);
     translate([ 42,  0,1])text("5",7,,center);
     translate([-42,-42,1])text("6",7,,center);
     translate([  0,-42,1])text("8",7,,center);
     translate([ 42,-42,1])text("12",7,,center);
 }

多边形

[编辑 | 编辑源代码]

polygon() 函数从 x、y 坐标列表中创建多边形形状。多边形是最强大的二维对象。它可以创建圆形和正方形所能创建的任何东西,以及更多。这包括具有凹边和凸边的不规则形状。此外,它可以在该形状内放置孔洞。

polygon(points = [ [x, y], ... ], paths = [ [p1, p2, p3..], ...], convexity = N);
参数
多边形的 x、y 点列表。 : 2 元素向量组成的向量。
注意:点从 0 到 n-1 索引。
路径
默认
如果未指定路径,则所有点都按列出的顺序使用。
单个向量
遍历点的顺序。使用 0 到 n-1 的索引。可能以不同的顺序使用,并使用列出的所有点或部分点。
多个向量
创建主要和次要形状。次要形状从主要形状中减去(如 difference())。次要形状可能完全或部分位于主要形状内。
通过从指定的最后一点返回到第一点来创建封闭形状。
凸度
"内向"曲线的整数,即通过多边形的任意直线预期的路径交叉。见下文。
defaults:   polygon();  yields:  polygon(points = undef, paths = undef, convexity = 1);

无孔洞

[编辑 | 编辑源代码]

equivalent scripts for this example
 polygon(points=[[0,0],[100,0],[130,50],[30,50]]);
 polygon([[0,0],[100,0],[130,50],[30,50]], paths=[[0,1,2,3]]);
 polygon([[0,0],[100,0],[130,50],[30,50]],[[3,2,1,0]]);
 polygon([[0,0],[100,0],[130,50],[30,50]],[[1,0,3,2]]);
    
 a=[[0,0],[100,0],[130,50],[30,50]];
 b=[[3,0,1,2]];
 polygon(a);
 polygon(a,b);
 polygon(a,[[2,3,0,1,2]]);

一个孔洞

[编辑 | 编辑源代码]

equivalent scripts for this example
 polygon(points=[[0,0],[100,0],[0,100],[10,10],[80,10],[10,80]], paths=[[0,1,2],[3,4,5]],convexity=10);

 triangle_points =[[0,0],[100,0],[0,100],[10,10],[80,10],[10,80]];
 triangle_paths =[[0,1,2],[3,4,5]];
 polygon(triangle_points,triangle_paths,10);

第 1 个路径向量 [0,1,2] 选择点 [0,0],[100,0],[0,100] 用于主要形状。第 2 个路径向量 [3,4,5] 选择点 [10,10],[80,10],[10,80] 用于次要形状。次要形状从主要形状中减去(想想 difference())。由于次要形状完全位于主要形状内,它会留下一个有孔洞的形状。

多个孔洞

[编辑 | 编辑源代码]

[注意: 需要版本 2015.03] (用于使用 concat())


      //example polygon with multiple holes
a0 = [[0,0],[100,0],[130,50],[30,50]];     // main
b0 = [1,0,3,2];
a1 = [[20,20],[40,20],[30,30]];            // hole 1
b1 = [4,5,6];
a2 = [[50,20],[60,20],[40,30]];            // hole 2
b2 = [7,8,9];
a3 = [[65,10],[80,10],[80,40],[65,40]];    // hole 3
b3 = [10,11,12,13];
a4 = [[98,10],[115,40],[85,40],[85,10]];   // hole 4
b4 = [14,15,16,17];
a  = concat (a0,a1,a2,a3,a4);
b  = [b0,b1,b2,b3,b4];
polygon(a,b);
      //alternate 
polygon(a,[b0,b1,b2,b3,b4]);

从多边形挤出三维形状

[编辑 | 编辑源代码]

   translate([0,-20,10]) {
       rotate([90,180,90]) {
           linear_extrude(50) {
               polygon(
                   points = [
                      //x,y
                       /*
                                  O  .
                       */
                       [-2.8,0],
                       /*
                                O__X  .
                       */
                       [-7.8,0],
                       /*
                              O
                               \
                                X__X  .
                       */
                       [-15.3633,10.30],
                       /*
                              X_______._____O
                               \         
                                X__X  .
                       */
                       [15.3633,10.30],
                       /*
                              X_______._______X
                               \             /
                                X__X  .     O
                       */
                       [7.8,0],
                       /*
                              X_______._______X
                               \             /
                                X__X  .  O__X
                       */
                       [2.8,0],
                       /*
                           X__________.__________X
                            \                   /
                             \              O  /
                              \            /  /
                               \          /  /
                                X__X  .  X__X
                       */
                       [5.48858,5.3],
                       /*
                           X__________.__________X
                            \                   /
                             \   O__________X  /
                              \            /  /
                               \          /  /
                                X__X  .  X__X
                       */
                       [-5.48858,5.3],
                                   ]
                               );
                           }
       }
   }

凸度参数指定与对象相交的射线可能穿透的最大正面(背面)数。此参数仅在 OpenCSG 预览模式下正确显示对象时需要,对多面体渲染没有影响。

此图像显示了一个凸度为 2 的二维形状,因为以红色指示的射线与二维形状的交叉从外到内(或从内到外)最多 2 次。三维形状的凸度将以类似的方式确定。将其设置为 10 应该适用于大多数情况。

import_dxf

[编辑 | 编辑源代码]

[已弃用: import_dxf() 将在未来的版本中删除。使用 import() 代替。]

读取 DXF 文件并创建一个 2D 形状。

示例

linear_extrude(height = 5, center = true, convexity = 10)
		import_dxf(file = "example009.dxf", layer = "plate");

text 模块使用本地系统安装的字体或单独提供的字体文件创建文本作为 2D 几何对象。

[注意: 需要版本 2015.03]

参数

text
字符串。要生成的文本。
大小
十进制。生成的文本的升高(高于基线的距离)大约为给定值。默认值为 10。不同的字体会有所不同,可能无法完全填充指定的大小,通常会略微小一些。在公制系统中,大小为 25.4(英制 1 英寸)对应于 100pt ⇒ 12pt 字号将为 12×0.254 用于公制转换或 0.12 用于英制。
font
字符串。要使用的字体的名称。这不是字体文件的名字,而是逻辑字体名称(由 fontconfig 库内部处理)。这也可以包括样式参数,见下文。可以使用字体列表对话框(帮助 -> 字体列表)获取已安装字体的列表和样式。
halign
字符串。文本的水平对齐方式。可能的取值是 "left"、"center" 和 "right"。默认值为 "left"。
valign
字符串。文本的垂直对齐方式。可能的取值是 "top"、"center"、"baseline" 和 "bottom"。默认值为 "baseline"。
spacing
十进制。增加/减少字符间距的因子。默认值 1 导致字体具有正常间距,给出大于 1 的值会导致字母间距更大。
direction
字符串。文本流向。可能的取值是 "ltr"(从左到右)、"rtl"(从右到左)、"ttb"(从上到下)和 "btt"(从下到上)。默认值为 "ltr"。
language
字符串。文本的语言(例如 "en"、"ar"、"ch")。默认值为 "en"。
script
字符串。文本的文字(例如 "latin"、"arabic"、"hani")。默认值为 "latin"。
$fn
用于细分 freetype 提供的曲线路径段

示例

示例 1: 结果。
text("OpenSCAD");



注意

为了允许指定特定的 Unicode 字符,您可以在字符串中使用以下转义代码指定它们;

  • \x03    - 十六进制字符值(仅支持从017f的十六进制值)
  • \u0123  - 使用 4 个十六进制数字的 Unicode 字符(注意:小写\u)
  • \U012345- 使用 6 个十六进制数字的 Unicode 字符(注意:大写\U)

空字符 (NUL) 映射到空格字符 (SP)。

 assert(version() == [2019, 5, 0]);
 assert(ord(" ") == 32);
 assert(ord("\x00") == 32);
 assert(ord("\u0000") == 32);
 assert(ord("\U000000") == 32);

示例

t="\u20AC10 \u263A"; // 10 euro and a smilie

使用字体和样式

[编辑 | 编辑源代码]

字体由其逻辑字体名称指定;此外,可以添加样式参数来选择特定的字体样式,如 "粗体" 或 "斜体",例如

font="Liberation Sans:style=Bold Italic"

字体列表对话框(在帮助 > 字体列表中可用)显示每个可用字体的字体名称和字体样式。为了参考,对话框还会显示字体文件的路径。您可以将字体列表中的字体拖放到编辑器窗口中以在 text() 语句中使用。

OpenSCAD 字体列表对话框

OpenSCAD 包含 Liberation MonoLiberation SansLiberation Serif 字体。因此,由于字体通常因平台类型而异,因此使用这些包含的字体很可能在平台之间可移植。

对于常见/休闲文本使用,出于这个原因,建议指定这些字体之一。Liberation Sans 是默认字体,以鼓励这样做。


除了已安装的字体(对于 Windows,仅以管理员身份安装的所有用户的字体),还可以添加特定于项目的字体文件。支持的字体文件格式为 TrueType 字体 (*.ttf) 和 OpenType 字体 (*.otf)。这些文件需要使用 use<> 注册。

 use <ttf/paratype-serif/PTF55F.ttf>

注册后,字体将列在字体列表对话框中,因此如果不知道字体的逻辑名称,可以在注册后查找。

OpenSCAD 使用 fontconfig 来查找和管理字体,因此可以使用命令行上的 fontconfig 工具以类似于 GUI 对话框的格式列出系统配置的字体。

$ fc-list -f "%-60{{%{family[0]}%{:style[0]=}}}%{file}\n" | sort

...
Liberation Mono:style=Bold Italic /usr/share/fonts/truetype/liberation2/LiberationMono-BoldItalic.ttf
Liberation Mono:style=Bold        /usr/share/fonts/truetype/liberation2/LiberationMono-Bold.ttf
Liberation Mono:style=Italic      /usr/share/fonts/truetype/liberation2/LiberationMono-Italic.ttf
Liberation Mono:style=Regular     /usr/share/fonts/truetype/liberation2/LiberationMono-Regular.ttf
...

在 Windows 下,字体存储在 Windows 注册表中。要获取包含字体文件名的文件,请使用以下命令

reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" /s > List_Fonts_Windows.txt


示例

示例 2: 结果。
 square(10);
 
 translate([15, 15]) {
   text("OpenSCAD", font = "Liberation Sans");
 }
 
 translate([15, 0]) {
   text("OpenSCAD", font = "Liberation Sans:style=Bold Italic");
 }


垂直对齐

[编辑 | 编辑源代码]
top
文本与给定 Y 坐标处边界框的顶部对齐。
中心
文本与给定 Y 坐标处边界框的中心对齐。
baseline
文本与给定 Y 坐标处字体基线对齐。这是默认值。
bottom
文本与给定 Y 坐标处边界框的底部对齐。
OpenSCAD 垂直文本对齐
 text = "Align";
 font = "Liberation Sans";
 
 valign = [
   [  0, "top"],
   [ 40, "center"],
   [ 75, "baseline"],
   [110, "bottom"]
 ];
 
 for (a = valign) {
   translate([10, 120 - a[0], 0]) {
     color("red") cube([135, 1, 0.1]);
     color("blue") cube([1, 20, 0.1]);
     linear_extrude(height = 0.5) {
       text(text = str(text,"_",a[1]), font = font, size = 20, valign = a[1]);
     }
   }
 }


多行文本不支持 `text()`,但将每行大小 × .72 平移将导致 1em 的行间距(em= 字体的正文高度或磅值)。可以添加 20%(× 1.2)。

水平对齐

[编辑 | 编辑源代码]
left
文本与给定 X 坐标处边界框的左侧对齐。这是默认值。
中心
文本与给定 X 坐标处边界框的中心对齐。
right
文本与给定 X 坐标处边界框的右侧对齐。
OpenSCAD 水平文本对齐
 text = "Align";
 font = "Liberation Sans";
 
 halign = [
   [10, "left"],
   [50, "center"],
   [90, "right"]
 ];
 
 for (a = halign) {
   translate([140, a[0], 0]) {
     color("red") cube([115, 2,0.1]);
     color("blue") cube([2, 20,0.1]);
     linear_extrude(height = 0.5) {
       text(text = str(text,"_",a[1]), font = font, size = 20, halign = a[1]);
     }
   }
 }


3D 文本

[编辑 | 编辑源代码]

文本可以通过使用 linear_extrude 函数从二维对象变为三维对象。

//3d Text Example
linear_extrude(4)
    text("Text");
3D 文本示例

使用 projection() 函数,您可以从 3D 模型创建 2d 图纸,并将其导出为 dxf 格式。它通过将 3D 模型投影到 (x,y) 平面(z 为 0)来工作。如果 cut=true,则仅考虑 z=0 的点(有效地切割对象),如果 cut=false默认值),则也考虑平面之上和之下的点(创建适当的投影)。

示例:考虑随 OpenSCAD 提供的 example002.scad。

然后,您可以进行“切割”投影,它将为您提供 z=0 的 x-y 平面的“切片”。

projection(cut = true) example002();

您还可以进行“普通”投影,这将为对象在 xy 平面上的“阴影”。

projection(cut = false) example002();

另一个示例

您也可以使用投影来获取对象的“侧视图”。让我们以 example002 为例,将其向上移动到 X-Y 平面之外,然后旋转它

translate([0,0,25]) rotate([90,0,0]) example002();

现在,我们可以使用 projection() 获取侧视图

projection() translate([0,0,25]) rotate([90,0,0]) example002();

链接

挤压 是使用固定横截面轮廓创建物体的过程。OpenSCAD 提供两个命令来从二维形状创建三维实体:linear_extrude() 和 rotate_extrude()。线性挤压类似于将橡皮泥通过带有特定形状模具的压机挤压。

linear_extrude() 的工作原理类似于橡皮泥挤压机

旋转挤压类似于车削 或在陶轮 上“抛制”碗的过程。

rotate_extrude() 模拟抛制容器

两种挤压方法都作用于位于 XY 平面的(可能分离的)二维形状。虽然作用于二维形状和三维实体的变换可以将形状移出 XY 平面,但在执行挤压时,最终结果并不直观。实际发生的是,任何三维坐标(Z 坐标)中的信息都会被任何二维形状忽略,这个过程相当于在执行挤压之前对任何二维形状执行隐式projection()。建议对严格保留在 XY 平面的形状执行挤压。

linear_extrude

[edit | edit source]

线性挤压是一个操作,它以二维对象作为输入,生成三维对象作为结果。

挤压遵循 **V** 向量,该向量默认为 **Z** 轴,为了指定自定义值,需要版本 > 2021.01。

在 OpenSCAD 中,挤压始终在二维对象的 xy 平面投影(阴影)上执行;因此,如果您在挤压之前旋转或对二维对象应用其他变换,它的阴影形状将被挤压。

虽然挤压沿着 **V** 向量是线性的,但有一个扭曲参数可用,它会导致对象在向上挤压时围绕 **V** 向量旋转。这可以用来围绕其中心旋转对象,就像螺旋柱一样,或者产生围绕 **V** 向量的螺旋挤压,就像猪尾巴一样。

还包括一个缩放参数,以便可以扩展或收缩对象在挤压范围内的尺寸,从而使挤压向内或向外扩展。

用法

[edit | edit source]
linear_extrude(height = 5, v = [0, 0, 1], center = true, convexity = 10, twist = -fanrot, slices = 20, scale = 1.0, $fn = 16) {...}

由于向后兼容性问题,您必须使用参数名称。

height 必须为正。

v 是一个三维向量,它必须指向正 Z 方向 [注意: 需要版本 开发快照]

$fn 是可选的,它指定 linear_extrude 的分辨率(数字越大,"平滑度"越高,但需要更多计算时间)。

如果对非平凡的二维形状挤压失败,请尝试设置凸度参数(默认值不是 10,但 10 是一个 "好" 的值,可以尝试)。有关解释,请参见下面的内容。

扭曲

[edit | edit source]

扭曲是形状挤压的度数。设置参数 twist = 360 表示挤压一个完整的旋转。扭曲方向遵循左手定则。

twist = 0

0° 扭曲

linear_extrude(height = 10, center = true, convexity = 10, twist = 0)
translate([2, 0, 0])
circle(r = 1);

twist = -100

-100° 扭曲

linear_extrude(height = 10, center = true, convexity = 10, twist = -100)
translate([2, 0, 0])
circle(r = 1);

twist = 100

100° 扭曲

linear_extrude(height = 10, center = true, convexity = 10, twist = 100)
translate([2, 0, 0])
circle(r = 1);

twist = -500

-500° 扭曲

linear_extrude(height = 10, center = true, convexity = 10, twist = -500)
translate([2, 0, 0])
circle(r = 1);

中心

[edit | edit source]

它类似于圆柱体的参数 center。如果 center 为 false,则线性挤压 Z 范围为从 0 到 height;如果为 true,则范围为从 -height/2 到 height/2。


center = true

center = true

linear_extrude(height = 10, center = true, convexity = 10, twist = -500)
translate([2, 0, 0])
circle(r = 1);


center = false

center = false

linear_extrude(height = 10, center = false, convexity = 10, twist = -500)
translate([2, 0, 0])
circle(r = 1);

网格细化

[edit | edit source]

slices 参数定义挤压的 Z 轴上中间点的数量。它的默认值随着 twist 值的增加而增加。显式设置 slices 可能会提高输出细化程度。此外,segments 参数会向挤压的多边形添加顶点(点),从而产生更平滑的扭曲几何形状。Segments 需要是多边形片段的倍数才能产生效果(对于 circle($fn=3),为 6 或 9..;对于 square(),为 8、12..)。

slices = 100

linear_extrude(height = 10, center = false, convexity = 10, twist = 360, slices = 100)
translate([2, 0, 0])
circle(r = 1);

特殊变量 $fn、$fs 和 $fa 也可以用来提高输出效果。如果未定义 slices,则它的值将从定义的 $fn 值中获取。

$fn = 100

linear_extrude(height = 10, center = false, convexity = 10, twist = 360, $fn = 100)
translate([2, 0, 0])
circle(r = 1);

缩放

[edit | edit source]

在挤压的高度上,根据此值缩放二维形状。Scale 可以是标量或向量

 linear_extrude(height = 10, center = true, convexity = 10, scale=3)
 translate([2, 0, 0])
 circle(r = 1);

OpenScad linear_extrude scale example

 linear_extrude(height = 10, center = true, convexity = 10, scale=[1,5], $fn=100)
 translate([2, 0, 0])
 circle(r = 1);

OpenScad linear_extrude scale example2

请注意,如果 scale 是向量,则生成的侧壁可能是非平面的。使用 twist=0slices 参数来避免 不对称

 linear_extrude(height=10, scale=[1,0.1], slices=20, twist=0)
 polygon(points=[[0,0],[20,10],[20,-10]]);

与导入的 SVG 一起使用

[edit | edit source]

此函数的常见用法是导入二维 svg

 linear_extrude(height = 10, center = true)
 import("knight.svg");

rotate_extrude

[edit | edit source]

旋转挤压使二维形状围绕 Z 轴旋转,形成具有旋转对称性的实体。理解此操作的一种方法是想象一个放置在 XY 平面上的陶轮,其旋转轴指向 +Z 方向。然后将要制作的物体放置在这个虚拟陶轮上(可能延伸到 XY 平面下方,指向 -Z 方向)。要制作的物体是物体在 XY 平面上的横截面(仅保留右侧,X >= 0)。这就是将作为子元素馈送到 rotate_extrude() 以生成此实体的二维形状。请注意,物体最初位于 XY 平面,但倾斜向上(围绕 X 轴旋转 +90 度)以挤压。

由于二维形状由 OpenSCAD 在 XY 平面渲染,因此理解此操作的另一种方法如下:使二维形状围绕 Y 轴旋转以形成实体。生成的实体放置的位置使其旋转轴位于 Z 轴上。

就像 linear_extrude 一样,挤压始终在二维多边形到 XY 平面的投影上执行。应用于二维多边形的 rotate、translate 等变换会修改二维多边形到 XY 平面的投影,因此也会修改最终三维物体的外观。

  • 二维多边形的 Z 方向平移对结果没有影响(因为投影也不受影响)。
  • X 方向平移会增加最终物体的直径。
  • Y 方向平移会导致最终物体在 Z 方向上发生偏移。
  • 围绕 X 轴或 Y 轴旋转会扭曲最终物体的横截面,因为到 XY 平面的投影也会被扭曲。

不要混淆,因为 OpenSCAD 会在 Z 方向上渲染二维多边形,并具有一定的高度,所以二维对象(及其高度)似乎对 XY 平面具有更大的投影。但是,对于到 XY 平面的投影以及随后的挤压,仅使用没有高度的底座多边形。

它不能用来产生螺旋或螺纹。(这些可以通过 linear_extrude() 使用扭曲参数来完成。)

二维形状**必须**完全位于 Y 轴的右侧(建议)或左侧。更准确地说,形状的**每个**顶点都必须满足 x >= 0 或 x <= 0。如果形状跨越 X 轴,控制台窗口中会出现警告,并且 rotate_extrude() 将被忽略。如果二维形状接触 Y 轴,即 x=0,则**必须**是一条接触的直线,而不是一个点,因为一个点会导致一个厚度为零的三维物体,这是无效的,会导致 CGAL 错误。对于 2016.xxxx 之前的 OpenSCAD 版本,如果形状位于负轴上,则生成的面的方向是内向的,这可能会导致意外效果。

用法

[edit | edit source]
rotate_extrude(angle = 360, convexity = 2) {...}
右手定则

由于向后兼容性问题,您必须使用参数名称。

convexity : 如果对非平凡的二维形状挤压失败,请尝试设置凸度参数(默认值不是 10,但 10 是一个 "好" 的值,可以尝试)。有关解释,请参见下面的内容。
angle [注意: 需要版本 2019.05] : 默认为 360。指定要扫描的度数,从正 X 轴开始。扫描方向遵循右手定则,因此负角度表示顺时针扫描。
$fa : 每个片段的最小角度(以度为单位)。
$fs : 每个片段的最小圆周长度。
$fn : 360 度中**固定**的片段数量。3 或更大的值会覆盖 $fa 和 $fs
$fa、$fs 和 $fn 必须是命名参数。点击此处了解更多详细信息

可以使用旋转拉伸创建一个简单的圆环。

rotate_extrude(convexity = 10)
translate([2, 0, 0])
circle(r = 1);

网格细化

[编辑 | 编辑源代码]

增加组成 2D 形状的片段数量可以提高网格质量,但渲染时间会更长。

rotate_extrude(convexity = 10)
translate([2, 0, 0])
circle(r = 1, $fn = 100);

也可以增加拉伸使用的片段数量。

rotate_extrude(convexity = 10, $fn = 100)
translate([2, 0, 0])
circle(r = 1, $fn = 100);

使用参数角度(在 OpenSCAD 版本 2016.xx 中),可以建模一个钩子。

OpenSCAD - 一个钩子
eps = 0.01;
translate([eps, 60, 0])
   rotate_extrude(angle=270, convexity=10)
       translate([40, 0]) circle(10);
rotate_extrude(angle=90, convexity=10)
   translate([20, 0]) circle(10);
translate([20, eps, 0])
   rotate([90, 0, 0]) cylinder(r=10, h=80+eps);

拉伸一个多边形

[编辑 | 编辑源代码]

也可以对用户选择点的多边形进行拉伸。

这是一个简单的多边形及其 200 步旋转拉伸。(注意它已经旋转了 90 度,以显示旋转是如何出现的;rotate_extrude() 需要它平放)。

rotate([90,0,0])        polygon( points=[[0,0],[2,1],[1,2],[1,3],[3,4],[0,5]] );
rotate_extrude($fn=200) polygon( points=[[0,0],[2,1],[1,2],[1,3],[3,4],[0,5]] );

有关多边形的更多信息,请参见:2D 基本图形:多边形

拉伸参数说明

[编辑 | 编辑源代码]

所有拉伸模式的拉伸参数

[编辑 | 编辑源代码]
凸度 整数。凸度参数指定与对象相交的射线可能穿透的最大正面(或背面)数量。此参数仅在使用标准 Goldfeather 算法时,在 OpenCSG 预览模式下正确显示对象时才需要,对多面体渲染(网格生成)没有影响。


基本图形的凸度是在单个位置上的基本图形的最大正面(或背面)数量。例如,球体的凸度为 1,圆环的凸度为 2。


此图像显示了一个凸度为 2 的 2D 形状,因为以红色指示的射线最多与 2D 形状相交 4 次(2 个正面和 2 个背面)。3D 形状的凸度将以类似的方式确定。将其设置为 10 对大多数情况都适用。一般情况下,只设置高数字可能会导致预览渲染速度变慢。

仅用于线性拉伸的拉伸参数

[编辑 | 编辑源代码]
高度 拉伸高度
中心 如果为真,则在拉伸后将实体居中
扭曲 拉伸扭曲角度(度)
缩放 在拉伸高度上,按此值缩放 2D 形状。
切片 类似于特殊变量 $fn,但不会传递给子 2D 形状。
类似于切片,但在多边形的段上添加点,而不会改变多边形的形状。

使用 import() 和拉伸模块,可以将从 DXF 文件中读取的 2D 对象转换为 3D 对象。另请参见2D 到 3D 拉伸

线性拉伸

[编辑 | 编辑源代码]

从 DXF 文件导入的 2D 对象的线性拉伸示例。

linear_extrude(height = fanwidth, center = true, convexity = 10)
   import (file = "example009.dxf", layer = "fan_top");

旋转拉伸

[编辑 | 编辑源代码]

从 DXF 文件导入的 2D 对象的旋转拉伸示例。

rotate_extrude(convexity = 10)
   import (file = "example009.dxf", layer = "fan_side", origin = fan_side_center);

让 Inkscape 正常工作

[编辑 | 编辑源代码]

Inkscape 是一个开源绘图程序。有关将 2d DXF 图纸从 Inkscape 传输到 OpenSCAD 的教程,请参见此处

上一个

[编辑 | 编辑源代码]

CSG 导出

下一个

[编辑 | 编辑源代码]

其他 2D 格式

华夏公益教科书