# OpenJSCAD

I recommend opening OpenJSCAD and playing around while looking at these docs.

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

```js 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

```
js
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

```
js
cylinder({r: 1, h: 10})
```

* r for radius
* h for height
* again can `center`

or not (default)
* `fn`

to control detail

## 4. Transforms: Scale

```
js
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

```
js
translate([5,4,3], obj)
```

- Move by
`[x,y,z]`

- e.g. move up 5 units:

```
js
translate([0,0,5], obj)
```

## 6. Transforms: Rotation

```
js
rotate([90,0,45], obj)
```

- Rotate about
`[x,y,z]`

(respectively) - e.g. rotate about vertical by 90 degrees:

```
js
rotate([0,0,90], obj)
```

**NB Degrees not radians**

## 7. Operations: Union

- Glue stuff together

```
js
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

```
js
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

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

Then extrude with `linear_extrude`

:

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

## 10. Operations: Intersect

- Bit in all the shapes

```
js
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

```
js
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.