OpenJSCAD

What follows is concise documentation for the core of OpenJSCAD (the official docs are a bit confusing as cover both V1 and 2 and include lots of deprecated stuff). I recommend opening OpenJSCAD and playing around while looking at these docs. I've used it to produce many objects for 3D printing. While it has its limitations it is a very quick way to get started (assuming you know JS).

0. 3D

  • x,y,z coordinates
  • Architecture-style (x,y are the surface of a table/floor plan, z is vertical/out of page).

1. main

Always have a main function which returns an object

function main() {
  return union(
    difference(cube({ size: 3, center: true }), sphere({ r: 2, center: true })),
    intersection(
      sphere({ r: 1.3, center: true }),
      cube({ size: 2.1, center: true })
    )
  )
    .translate([0, 0, 1.5])
    .scale(10)
}

2. Basic Shapes: Cube

cube({ size: 1, center: true })
cube({ size: [1, 2, 3] })
  • size s or [x,y,z]
  • center (location) false by default (at 'bottom' corner)

All shapes follow this pattern, simple function + options

3. Basic Shapes: Cylinder

cylinder({ r: 1, h: 10 })
  • r for radius
  • h for height
  • again can center or not (default)
  • fn to control detail

4. Transforms: Scale

scale(2, obj)
scale([1, 2, 3], obj)
  • can scale in simple way
  • or per x,y,z

All transformations follow this pattern, function which takes options first then thing(s) to be transformed. Note that official docs can be confusing as cover old OOP-style cube().scale(2) approach, which you shouldn't use.

5. Transforms: Translate

translate([5, 4, 3], obj)
  • Move by [x,y,z]
  • e.g. move up 5 units:
translate([0, 0, 5], obj)

6. Transforms: Rotation

rotate([90, 0, 45], obj)
  • Rotate about [x,y,z] (respectively)
  • e.g. rotate about vertical by 90 degrees:
rotate([0, 0, 90], obj)

NB Degrees not radians

7. Operations: Union

  • Glue stuff together
union([obj, another])
union(obj, another)

All the composition operations take either an array of shapes or can take multiple shapes as arguments. You can't mix and match.

8. Basic Shapes: Sphere

sphere({ r: 4 })
  • r for radius
  • center is true by default (unlike other primitive objects)
  • fn to control detail

9. Basic Shapes: Polygon + linear_extrude

List of points to make a (2D) polygon on x,y plane

let p1 = polygon([
  [0, 0],
  [3, 0],
  [3, 3],
])
let p2 = polygon({
  points: [
    [0, 0],
    [3, 0],
    [3, 3],
  ],
})

Then extrude with linear_extrude:

linear_extrude({ height: 10 }, p1)
linear_extrude({ height: 1 }, p2)

10. Operations: Intersect

  • Bit in all the shapes
intersection(
  sphere({ r: 1.3, center: true }),
  cube({ size: 2.1, center: true })
)
  • Can take bunch of arguments or array

11. Operations: Difference

  • First shape with rest carved out
difference(cube({ size: 3, center: true }), sphere({ r: 2, center: true }))
  • Can take bunch of arguments or array

Onward

You now know enough to do create nearly any 3D shape (or an approximation to it) with OpenJSCAD.

Original Post