跳到内容

OpenSCAD 用户手册/2D 图元

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

所有 2D 图元都可以使用 3D 变换进行变换。它们通常用作 3D 挤出的部分。虽然它们无限薄,但它们以 1 个单位的厚度渲染。

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

正方形

[编辑 | 编辑源代码]

在第一象限创建一个正方形或矩形。当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 坐标列表创建一个多边形。多边形是最强大的 2D 对象。它可以创建圆形和正方形可以创建的任何东西,以及更多。这包括具有凹边和凸边的不规则形状。此外,它可以在该形状内放置孔。

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);

第一个路径向量 [0,1,2] 选择点 [0,0]、[100,0]、[0,100] 作为主要形状。第二个路径向量 [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]);

从多边形挤出 3D 形状

[编辑 | 编辑源代码]

   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 的 2D 形状,因为以红色指示的射线交叉了 2D 形状,外部⇒内部(或内部⇒外部)最多 2 次。3D 形状的凸性将以类似的方式确定。将其设置为 10 应该适用于大多数情况。

import_dxf

[编辑 | 编辑源代码]

[已弃用: import_dxf() 将在将来的版本中删除。 请改用import()]

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

示例

linear_extrude(height = 5, center = true, convexity = 10)
		import_dxf(file = "example009.dxf", layer = "plate");
华夏公益教科书