Packages

Composable, native Elixir CAD with sketches, assemblies, and verified printable exports

Current section

Files

Jump to
smith examples plate.livemd
Raw

examples/plate.livemd

# A plate, step by step

```elixir
Mix.install([{:smith, "~> 0.4.0"}, {:kino, "~> 0.19.0"}])
```

## First lesson

Build one plate, round its corners, drill a hole, and export it. No CAD background is assumed; the [CAD concepts guide](https://hexdocs.pm/smith/cad-basics.html) explains the terms.

Run cells in order. Lengths are millimeters and modeling angles are degrees.
Each 3D preview supports orbit, zoom, and fullscreen.


## Start with a blank

Lengths are millimeters. Each stage is a reusable recipe; evaluating one does not
change any earlier stage. Drag the preview to rotate, scroll to zoom, or download PNG.

```elixir
blank = Smith.box(60, 40, 5)
Smith.Kino.render(blank, label: "1 · Blank")
```

## Round the corners

A fillet replaces a sharp edge with a rounded transition. Rounding the four
vertical edges changes the plate's footprint while keeping its top and bottom flat.

Select the four vertical edges with a reusable query. Smith resolves the query
against the body at this step; `count:` catches an unintended selection if you
change the design. You can add filters to the query with a pipeline.

```elixir
alias Smith.Selector
vertical = Selector.parallel(:z)
rounded = blank |> Smith.fillet(edges: vertical, count: 4, radius: 2)
Smith.Kino.render(rounded, label: "2 · Rounded corners")
```

## Drill the plate

The top-face shortcut places the hole at the face's area-weighted center. This
plate is symmetric, so that is its geometric center. For a fixed pattern of
holes, use an explicit plane as in [mechanical parts](mechanical-parts.livemd).

```elixir
finished = rounded |> Smith.hole(on: :top, diameter: 8, through: :all)
{:ok, result} = Smith.evaluate(finished)
Smith.Kino.render(result, label: "3 · Through hole")
```

## Check and export

The analytic volume is a rectangular plate minus four rounded corner cutouts and
a cylindrical bore. Export additionally verifies topology, the printable mesh,
and a STEP round trip. Inspect the returned paths for STL and 3MF.

```elixir
{:ok, volume} = OCEx.volume(result.shape)
expected = (60 * 40 - (4 - :math.pi()) * 2 * 2 - :math.pi() * 4 * 4) * 5
true = abs(volume - expected) < 1.0e-6
{:ok, files} = Smith.export(result, "output/livebook", name: "plate", on_bed: true)
files
```