Advertisement
Guest User

Untitled

a guest
Dec 21st, 2014
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1. # To Run:
  2. # elixir xscad.exs > out.scad && openscad out.scad
  3.  
  4. defmodule XSCAD.Writer do
  5. def generate({:color, model, name}) do
  6. ~s|color("#{name}") #{generate(model)}|
  7. end
  8.  
  9. def generate({:color, model, r, g, b, a}) do
  10. "color([#{r}, #{g}, #{b}, #{a}]) #{generate(model)}"
  11. end
  12.  
  13. def generate({:sphere, diameter}) do
  14. "sphere(d=#{diameter})"
  15. end
  16.  
  17. def generate({:cube, x, y, z}) do
  18. "cube([#{x}, #{y}, #{z}])"
  19. end
  20.  
  21. def generate({:rotate, model, x, y, z}) do
  22. "rotate([#{x}, #{y}, #{z}]) #{generate(model)}"
  23. end
  24.  
  25. def generate({:scale, model, x, y, z}) do
  26. "scale([#{x}, #{y}, #{z}]) #{generate(model)}"
  27. end
  28.  
  29. def generate({:union, models}) do
  30. "union() {#{generate_multiple(models)}}"
  31. end
  32.  
  33. def generate({:intersection, models}) do
  34. "intersection() {#{generate_multiple(models)}}"
  35. end
  36.  
  37. def generate({:difference, models}) do
  38. "difference() {#{generate_multiple(models)}}"
  39. end
  40.  
  41. defp generate_multiple(models) do
  42. Enum.map_join(models, ";", &generate/1) <> ";"
  43. end
  44. end
  45.  
  46. defmodule XSCAD do
  47. def color(model, name) do
  48. {:color, model, name}
  49. end
  50.  
  51. def color(model, r, g, b, a \\ 1) do
  52. {:color, model, r, g, b, a}
  53. end
  54.  
  55. def rotate(model, degrees) do
  56. rotate(model, degrees, degrees, degrees)
  57. end
  58.  
  59. def rotate(model, x, y, z) do
  60. {:rotate, model, x, y, z}
  61. end
  62.  
  63. def scale(model, degrees) do
  64. scale(model, degrees, degrees, degrees)
  65. end
  66.  
  67. def scale(model, x, y, z) do
  68. {:scale, model, x, y, z}
  69. end
  70.  
  71. def sphere([diameter: diameter]) do
  72. {:sphere, diameter}
  73. end
  74.  
  75. def sphere([radius: radius]) do
  76. {:sphere, radius * 2}
  77. end
  78.  
  79. def sphere(radius) do
  80. sphere(radius: radius)
  81. end
  82.  
  83. def cube(x, y, z) do
  84. {:cube, x, y, z}
  85. end
  86.  
  87. def cube(size) do
  88. {:cube, size, size, size}
  89. end
  90.  
  91. def union(models) do
  92. {:union, models}
  93. end
  94.  
  95. def intersection(models) do
  96. {:intersection, models}
  97. end
  98.  
  99. def difference(models) do
  100. {:difference, models}
  101. end
  102.  
  103. def output(mod) do
  104. model = mod.run
  105. IO.puts XSCAD.Writer.generate(model) <> ";"
  106. end
  107. end
  108.  
  109. defmodule Example do
  110. import XSCAD
  111.  
  112. def run do
  113. union [
  114. sphere(7) |> scale(0.5) |> color("blue"),
  115. cube(10) |> rotate(50) |> scale(0.5, 2, 0.1) |> color(0, 255, 0, 0.5)
  116. ]
  117. end
  118. end
  119.  
  120. XSCAD.output(Example)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement