znlgis 博客

GIS开发与技术分享

第07章:二维图形、拉伸、旋转与投影

1. 为什么重视 2D

许多机械零件本质上是二维轮廓加厚度:板件、垫片、面板、齿轮、支架、铭牌、盒体截面。OpenSCAD 提供一组强大的二维建模能力,再通过 linear_extruderotate_extrude 生成三维实体。

二维建模通常比直接三维布尔更稳定、更快,也更接近激光切割、CNC 轮廓加工和板材设计流程。

2. square 与 circle

square([40, 20], center = true);
circle(r = 10, $fn = 64);

二维对象位于 XY 平面,没有厚度。导出 SVG、DXF 或进行拉伸时非常有用。

3. polygon

polygon 用点列表定义二维多边形:

points = [[0,0], [40,0], [30,20], [10,20]];
polygon(points);

复杂多边形可使用 paths 指定外轮廓和孔洞路径。顶点顺序、自交和闭合性会影响结果。建议先用简单点集验证,再生成复杂路径。

4. offset

offset 可对二维轮廓扩张、收缩或圆角处理:

offset(r = 2) square([30, 20], center = true);
offset(delta = -1) circle(10);

二维 offset 常用于生成壁厚、间隙、圆角矩形和刀具补偿。相比三维 minkowski,二维偏移再拉伸通常更高效。

5. linear_extrude

线性拉伸把二维对象沿 Z 方向变成三维实体:

linear_extrude(height = 5, center = true)
    circle(d = 20, $fn = 64);

可选参数包括 twistscaleslices 等,可制作扭转体或渐变体:

linear_extrude(height = 40, twist = 180, slices = 80)
    square([10, 4], center = true);

扭转模型面数增长快,应控制 $fnslices

6. rotate_extrude

旋转拉伸将二维截面绕 Z 轴旋转,适合旋钮、轮子、管件、碗形件、环形件:

rotate_extrude($fn = 96)
    translate([20, 0, 0]) circle(d = 4);

注意二维截面通常需要放在 X 轴正侧,不要穿过旋转轴,否则可能产生自交。

7. projection

projection 可把三维对象投影到二维:

projection(cut = true)
    translate([0,0,5]) cube([30, 20, 10], center = true);

这适合从三维模型生成切割轮廓、检查截面、导出 SVG/DXF。cut = true 表示取 Z=0 截面,false 表示投影轮廓。

8. text 文本

OpenSCAD 支持文本生成二维轮廓:

linear_extrude(1)
    text("OpenSCAD", size = 8, halign = "center", valign = "center");

文本可用于铭牌、面板标记、浮雕和凹刻。注意字体在不同系统上可能不同,团队协作时应明确字体或把最终轮廓导出固定。

9. DXF 与 SVG 工作流

OpenSCAD 可以导入 DXF、SVG 等二维资源,也可以导出二维轮廓。常见流程:

  1. 在 Inkscape、QCAD、LibreCAD 中绘制二维图形。
  2. 清理重复线、断线、自交和单位。
  3. 导入 OpenSCAD 作为轮廓。
  4. 通过 linear_extrude 生成实体。
  5. 加入孔、倒角、文字或装配结构。

导入外部轮廓时要检查比例和坐标原点。很多问题来自单位不一致或路径未闭合。

10. 二维参数化案例:法兰盘

$fn = 80;
outer_d = 60;
inner_d = 25;
hole_d = 5;
hole_circle_d = 45;
thickness = 6;

module flange_2d() {
    difference() {
        circle(d = outer_d);
        circle(d = inner_d);
        for (a = [0:90:270])
            rotate(a) translate([hole_circle_d/2, 0]) circle(d = hole_d);
    }
}

linear_extrude(thickness, center = true)
    flange_2d();

这个例子展示了“先二维、后拉伸”的清晰结构。后续可增加沉孔、倒角和型号文字。

11. 二维建模检查清单

  • 轮廓是否闭合且不自交?
  • 坐标原点是否适合装配?
  • 外部导入文件单位是否正确?
  • 拉伸高度是否满足制造要求?
  • 孔位是否用参数或极坐标生成?
  • 文本字体是否可复现?
  • 导出 SVG/DXF 前是否隐藏了三维参考对象?