Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # To Run:
- # elixir xscad.exs > out.scad && openscad out.scad
- defmodule XSCAD.Writer do
- def generate({:color, model, name}) do
- ~s|color("#{name}") #{generate(model)}|
- end
- def generate({:color, model, r, g, b, a}) do
- "color([#{r}, #{g}, #{b}, #{a}]) #{generate(model)}"
- end
- def generate({:sphere, diameter}) do
- "sphere(d=#{diameter})"
- end
- def generate({:cube, x, y, z}) do
- "cube([#{x}, #{y}, #{z}])"
- end
- def generate({:rotate, model, x, y, z}) do
- "rotate([#{x}, #{y}, #{z}]) #{generate(model)}"
- end
- def generate({:scale, model, x, y, z}) do
- "scale([#{x}, #{y}, #{z}]) #{generate(model)}"
- end
- def generate({:union, models}) do
- "union() {#{generate_multiple(models)}}"
- end
- def generate({:intersection, models}) do
- "intersection() {#{generate_multiple(models)}}"
- end
- def generate({:difference, models}) do
- "difference() {#{generate_multiple(models)}}"
- end
- defp generate_multiple(models) do
- Enum.map_join(models, ";", &generate/1) <> ";"
- end
- end
- defmodule XSCAD do
- def color(model, name) do
- {:color, model, name}
- end
- def color(model, r, g, b, a \\ 1) do
- {:color, model, r, g, b, a}
- end
- def rotate(model, degrees) do
- rotate(model, degrees, degrees, degrees)
- end
- def rotate(model, x, y, z) do
- {:rotate, model, x, y, z}
- end
- def scale(model, degrees) do
- scale(model, degrees, degrees, degrees)
- end
- def scale(model, x, y, z) do
- {:scale, model, x, y, z}
- end
- def sphere([diameter: diameter]) do
- {:sphere, diameter}
- end
- def sphere([radius: radius]) do
- {:sphere, radius * 2}
- end
- def sphere(radius) do
- sphere(radius: radius)
- end
- def cube(x, y, z) do
- {:cube, x, y, z}
- end
- def cube(size) do
- {:cube, size, size, size}
- end
- def union(models) do
- {:union, models}
- end
- def intersection(models) do
- {:intersection, models}
- end
- def difference(models) do
- {:difference, models}
- end
- def output(mod) do
- model = mod.run
- IO.puts XSCAD.Writer.generate(model) <> ";"
- end
- end
- defmodule Example do
- import XSCAD
- def run do
- union [
- sphere(7) |> scale(0.5) |> color("blue"),
- cube(10) |> rotate(50) |> scale(0.5, 2, 0.1) |> color(0, 255, 0, 0.5)
- ]
- end
- end
- XSCAD.output(Example)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement