# 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.