pandascad/examples/pandahome.rb

55 lines
1.5 KiB
Ruby

#!/usr/bin/env ruby
load 'openscad.rb'
s = OpenSCAD.new
def r code
OpenSCAD::Code.new code
end
s.module :roundedBox, 'size[3]', :radius, :sidesonly do
s.rot = s[ [0,0,0], [90,0,90], [90,90,0] ]
s-:rot
s.if s.sidesonly do
s.cube s.size - s[s.radius*2,0,0], true
s.cube s.size - s[0,s.radius*2,0], true
s.for x: s[s.radius-s.size[0], -s.radius+s.size[0]] / 2,
y: s[s.radius-s.size[1], -s.radius+s.size[1]] / 2 do
s.translate( s[s.x,s.y,0]) { s.cylinder s: s.radius, h: s.size[2], center: true }
end
end
s.else do
s.cube s.size-s[0,s.radius,s.radius]*2, center: true
s.cube s.size-s[s.radius,0,s.radius]*2, center: true
s.cube s.size-s[s.radius,s.radius,0]*2, center: true
end
s.for axis: 0..2 do
s.for x: s.radius*s[1,-1] + s.size[s.axis] / 2 * s[-1,1],
y: s.radius*s[1,-1] + s.size[(s.axis+1)%3] / 2 *s[-1,1] do
s.rotate( (s+:rot)[s.axis]) do
s.translate s[s.x,s.y,0] do
s.cylinder h: s.size[(s.axis+2)%3]-s.radius*2, r: s.radius, center: true
end
end
end
end
s.for x: (s.radius*s[1,-1] + s.size[0]*s[-1,1]) / 2,
y: (s.radius*s[1,-1] + s.size[1]*s[-1,1]) / 2,
z: (s.radius*s[1,-1] + s.size[2]*s[-1,1]) / 2 do
s.translate(s[s.x,s.y,s.z]) { s.sphere s.radius }
end
end
s.body = s[ 114.3, 101.6, 40 ]
s.gap = 0.2
s.thick = 1
s.body_inner = s.body+s.gap
s.body_outer = s.body_inner+s.thick
s.difference do
s.roundedBox s.body_outer, 2, true
s.translate( s[1,1,1] * s.thick) { s.roundedBox s.body_inner, 2, true }
s.translate( s[0,0,24]) { s.cube s[150,120,10], true }
end