SuperAPI AI 工具集

openscad

设计与创作

查看项目

更新于 10-14 20:22

技能介绍

用途

OpenSCAD Skill 用于创建、校验和导出 OpenSCAD 3D 模型。它支持参数自定义、多角度可视化预览,以及为 MakerWorld 等 3D 打印平台导出 STL 文件。

前置条件

必须已安装 OpenSCAD。可通过 Homebrew 安装:

brew install openscad

工具

该技能在 tools/ 目录下提供以下工具。

预览生成

生成单张预览图:

./tools/preview.sh model.scad output.png [--camera=x,y,z,tx,ty,tz,dist] [--size=800x600]

生成多角度预览(前、后、左、右、顶、等轴测):

./tools/multi-preview.sh model.scad output_dir/

STL 导出

# Export to STL for 3D printing
./tools/export-stl.sh model.scad output.stl [-D 'param=value']

参数提取

# Extract customizable parameters from an OpenSCAD file
./tools/extract-params.sh model.scad

校验

# Check for syntax errors and warnings
./tools/validate.sh model.scad

视觉校验(必需)

创建或修改 OpenSCAD 模型后,始终要对模型进行视觉校验。

编写或编辑任何 OpenSCAD 文件后:

  1. 使用 multi-preview.sh 生成多角度预览
  2. 使用 read 工具查看每张生成的图片
  3. 从多个视角检查问题:
    • 前/后:验证对称性、特征和比例
    • 左/右:检查深度和侧面轮廓
    • 顶:确保顶部特征正确
    • 等轴测:整体形状校验
  4. 必要时迭代:如果看起来有问题,修复代码并重新校验

这能捕获仅靠语法校验无法发现的问题:

  • 法线反转或内外翻转的几何体
  • 特征错位或布尔运算错误
  • 与预期设计不符的比例
  • 缺失或悬浮的几何体
  • Z 冲突或重叠表面

绝不能在未从多个角度视觉确认模型正确的情况下交付 OpenSCAD 模型。

工作流程

1. 创建 OpenSCAD 模型

编写 OpenSCAD 代码,在顶部放置可自定义参数:

// Customizable parameters
wall_thickness = 2;        // [1:0.5:5] Wall thickness in mm
width = 50;                // [20:100] Width in mm
height = 30;               // [10:80] Height in mm
rounded = true;            // Add rounded corners

// Model code below
module main_shape() {
    if (rounded) {
        minkowski() {
            cube([width - 4, width - 4, height - 2]);
            sphere(r = 2);
        }
    } else {
        cube([width, width, height]);
    }
}

difference() {
    main_shape();
    translate([wall_thickness, wall_thickness, wall_thickness])
        scale([1 - 2*wall_thickness/width, 1 - 2*wall_thickness/width, 1])
        main_shape();
}

参数注释格式:

  • // [min:max] - 数值范围
  • // [min:step:max] - 带步长的数值范围
  • // [opt1, opt2, opt3] - 下拉选项
  • // Description text - 纯描述

2. 校验模型

./tools/validate.sh model.scad

3. 生成预览

生成预览图以视觉校验模型:

./tools/multi-preview.sh model.scad ./previews/

这会从多个角度创建 PNG 图片。使用 read 工具查看它们。

4. 导出为 STL

./tools/export-stl.sh model.scad output.stl
# With custom parameters:
./tools/export-stl.sh model.scad output.stl -D 'width=60' -D 'height=40'

相机位置

预览常用相机角度:

  • 等轴测:--camera=0,0,0,45,0,45,200
  • 前:--camera=0,0,0,90,0,0,200
  • 顶:--camera=0,0,0,0,0,0,200
  • 右:--camera=0,0,0,90,0,90,200

格式:x,y,z,rotx,roty,rotz,distance

MakerWorld 发布

对于 MakerWorld,通常需要:

  • 通过 export-stl.sh 导出的 STL 文件
  • 预览图(至少一张好的等轴测视图)
  • 可自定义参数的描述

可考虑创建带元数据的 model.json:

{
  "name": "Model Name",
  "description": "Description for MakerWorld",
  "parameters": [...],
  "tags": ["functional", "container", "organizer"]
}

示例:完整工作流

# 1. Create the model (write .scad file)

# 2. Validate syntax
./tools/validate.sh box.scad

# 3. Generate multi-angle previews
./tools/multi-preview.sh box.scad ./previews/

# 4. IMPORTANT: View and validate ALL preview images
#    Use the read tool on each PNG file to visually inspect:
#    - previews/box_front.png
#    - previews/box_back.png
#    - previews/box_left.png
#    - previews/box_right.png
#    - previews/box_top.png
#    - previews/box_iso.png
#    Look for geometry issues, misalignments, or unexpected results.
#    If anything looks wrong, go back to step 1 and fix it!

# 5. Extract and review parameters
./tools/extract-params.sh box.scad

# 6. Export STL with default parameters
./tools/export-stl.sh box.scad box.stl

# 7. Export STL with custom parameters
./tools/export-stl.sh box.scad box_large.stl -D 'width=80' -D 'height=60'

记住:绝不要跳过视觉校验步骤。许多问题(错误尺寸、布尔运算错误、几何体反转)只有在你真正查看渲染模型时才可见。

OpenSCAD 快速参考

基础形状

cube([x, y, z]);
sphere(r = radius);
cylinder(h = height, r = radius);
cylinder(h = height, r1 = bottom_r, r2 = top_r);  // cone

变换

translate([x, y, z]) object();
rotate([rx, ry, rz]) object();
scale([sx, sy, sz]) object();
mirror([x, y, z]) object();

布尔运算

union() { a(); b(); }        // combine
difference() { a(); b(); }   // subtract b from a
intersection() { a(); b(); } // overlap only

高级

linear_extrude(height) 2d_shape();
rotate_extrude() 2d_shape();
hull() { objects(); }        // convex hull
minkowski() { a(); b(); }    // minkowski sum (rounding)

2D 形状

circle(r = radius);
square([x, y]);
polygon(points = [[x1,y1], [x2,y2], ...]);
text("string", size = 10);