openscad
Create parametric 3D models using OpenSCAD, a script-based solid CAD modeler. Use when the user asks to create 3D printable objects, parametric designs, mechanical parts, CAD models, or requests .scad files. OpenSCAD uses constructive solid geometry (CSG) and extrusion of 2D shapes to create 3D models through code.
When & Why to Use This Skill
This Claude skill empowers users to generate precise, parametric 3D models using OpenSCAD, a script-based solid CAD modeler. It bridges the gap between natural language requirements and technical 3D geometry, allowing for the automated creation of .scad files optimized for 3D printing, mechanical engineering, and rapid prototyping through Constructive Solid Geometry (CSG).
Use Cases
- Parametric Mechanical Design: Creating adjustable parts like gears, brackets, or enclosures where dimensions are defined by variables for instant customization.
- 3D Printing Preparation: Generating watertight, manifold 3D models (STL-ready) for functional prototypes, household repairs, or custom hardware components.
- Algorithmic & Mathematical Modeling: Constructing complex geometric shapes and patterns derived from mathematical formulas that are difficult to draw in traditional GUI-based CAD.
- 2D to 3D Transformation: Converting 2D profiles into 3D objects using linear and rotational extrusion for tasks like logo embossing or creating symmetrical mechanical parts.
| name | openscad |
|---|---|
| description | Create parametric 3D models using OpenSCAD, a script-based solid CAD modeler. Use when the user asks to create 3D printable objects, parametric designs, mechanical parts, CAD models, or requests .scad files. OpenSCAD uses constructive solid geometry (CSG) and extrusion of 2D shapes to create 3D models through code. |
OpenSCAD Skill
Generate OpenSCAD (.scad) files for parametric 3D modeling. OpenSCAD is a functional programming language for creating solid 3D CAD objects using CSG (Constructive Solid Geometry).
Core Concepts
OpenSCAD scripts describe geometry through:
- Primitives - Basic 2D/3D shapes (cube, sphere, cylinder, circle, square, polygon)
- Transformations - Position/modify objects (translate, rotate, scale, mirror, color)
- Boolean Operations - Combine shapes (union, difference, intersection)
- Modules - Reusable parametric components
- Extrusion - Convert 2D to 3D (linear_extrude, rotate_extrude)
Workflow
- Define parameters as variables at the top for easy customization
- Create modules for reusable components
- Build geometry using primitives and boolean operations
- Use comments to explain complex sections
- Set
$fnfor curved surface resolution (higher = smoother but slower)
Quick Reference
3D Primitives
cube([x, y, z], center=false);
cube(size, center=false);
sphere(r=radius); // or d=diameter
cylinder(h=height, r=radius, center=false);
cylinder(h=height, r1=bottom_r, r2=top_r); // cone
polyhedron(points=[[x,y,z],...], faces=[[p0,p1,p2],...]);
2D Primitives
square([x, y], center=false);
circle(r=radius); // or d=diameter
polygon(points=[[x,y],...]);
text("string", size=10, font="Liberation Sans");
Transformations
translate([x, y, z]) object();
rotate([x_deg, y_deg, z_deg]) object();
rotate(a=degrees, v=[x,y,z]) object(); // rotate around axis
scale([x, y, z]) object();
mirror([x, y, z]) object(); // mirror across plane
color("red") object();
color([r, g, b, a]) object(); // 0-1 values
Boolean Operations
union() { obj1(); obj2(); } // combine (implicit if no operator)
difference() { base(); cut1(); } // subtract from first child
intersection() { obj1(); obj2(); } // keep only overlap
Extrusion (2D to 3D)
linear_extrude(height=h, twist=deg, scale=s, slices=n, center=false)
2d_shape();
rotate_extrude(angle=360, $fn=n)
2d_shape(); // shape must be on positive X side
Control Structures
// Loops
for (i = [0:10]) translate([i*5, 0, 0]) cube(3);
for (i = [0:2:10]) ...; // start:step:end
for (pos = [[0,0], [10,5], [5,10]]) translate(pos) sphere(2);
// Conditionals
if (condition) { ... } else { ... }
variable = condition ? value_if_true : value_if_false;
Modules and Functions
// Module (creates geometry)
module my_part(size=10, holes=true) {
difference() {
cube(size);
if (holes) cylinder(h=size+1, r=size/4, center=true);
}
}
my_part(20, holes=false);
// Function (returns value)
function circumference(r) = 2 * PI * r;
Special Variables
$fn = 100; // fragments for full circle (overrides $fa/$fs)
$fa = 12; // minimum angle per fragment
$fs = 2; // minimum size per fragment
$preview // true during F5 preview, false during F6 render
Best Practices
Parametric Design
// Define all dimensions as variables
wall_thickness = 2;
inner_diameter = 20;
height = 30;
// Derive other values
outer_diameter = inner_diameter + 2*wall_thickness;
Avoiding Rendering Issues
// Use epsilon to prevent z-fighting in boolean operations
eps = 0.01;
difference() {
cube([10, 10, 10]);
translate([2, 2, -eps])
cylinder(h=10 + 2*eps, r=3); // slightly taller than parent
}
Manifold Geometry for 3D Printing
- Ensure all geometry is watertight (no gaps)
- Holes must fully penetrate surfaces
- Use
render()to verify complex geometry - Check face orientation with F12 (Thrown Together view)
Detailed References
- For complete syntax: See
references/language_reference.md - For example patterns: See
references/examples.md
Output
Save generated code as .scad files. Users can open in OpenSCAD for:
- F5: Quick preview
- F6: Full render (required before export)
- Export to STL/AMF/3MF for 3D printing