FooCAD Source Codeclass RotatingJoint : Model {
var inner = 6
var outer = 8
var height = 6
val slack = 0.3
val vSlack = 0.2
var sides = 20
// I have problems calibrating my printer - often the bed is too high,
// and the first layer is smudged outwards. A chamfer will help
// prevent the two parts from fusing.
var chamfer = 0.4
fun axel() : Shape3d {
val largeP = Circle(inner/2).sides(sides)
val smallP = Circle(inner/2-height/4).sides(sides)
val fullP = Circle(outer/2).sides(sides)
val result = ExtrusionBuilder().apply {
if (chamfer != 0) {
crossSection( largeP.offset( -chamfer ) )
forward(chamfer)
}
crossSection( largeP )
forward( height/2 -chamfer )
crossSection( smallP )
forward( height/2 )
crossSection( fullP )
crossSection()
}.build()
return result
}
fun void() : Shape3d {
val largeP = Circle.hole( inner/2 + slack ).sides(sides)
val smallP = Circle( inner/2-height/4 + slack).sides(sides)
val fullP = Circle(outer/2 + slack).sides(sides)
val result = ExtrusionBuilder().apply {
forward( -0.001 )
crossSection( largeP )
forward( height/2 )
crossSection( smallP )
forward( height/2 + 0.002 )
crossSection( fullP )
}.build()
return result
}
fun bottom() : Shape3d {
val solid = Cylinder( height/2, outer/2 ).sides(sides) +
Cube( 10, inner/2, height ).centerY().translateX(-10)
return solid - void()
}
fun top() : Shape3d {
val axel : Shape3d = axel()
val top = Cube( 10, inner/2, height/2-vSlack).centerY()
.translateZ(height/2+vSlack)
val bottom = Cube( 10, inner/2, height).centerY() -
Cylinder( height + 0.002, outer/2 + slack ).sides(sides).translateZ(-0.001) -
Cylinder( chamfer + 0.002, outer/2 + slack + chamfer , outer/2 + slack ).sides(sides).translateZ(-0.001)
return axel + top + bottom
}
fun join( a : Shape3d, b : Shape3d, atX : double, atY : double ) : Shape3d {
val axel : Shape3d = axel()
val remove = Cylinder( height/2 + vSlack + 0.002, outer/2 + slack ).sides(sides).translateZ(-0.001) +
Cylinder( chamfer + 0.002, outer/2 + slack + chamfer , outer/2 + slack ).sides(sides).translateZ(-0.001)
val bottomRing = Cylinder( height/2, outer/2 ).sides(sides)
return (a + bottomRing.translate(atX, atY,0) - void().translate(atX, atY,0)) +
axel.translate(atX, atY,0) +
(b - remove.translate(atX, atY,0))
}
override fun build() : Shape3d {
return join(
Cube( 10, inner/2, height ).centerY().translateX(-10).color("Blue"),
Cube( 10, inner/2, height ).centerY().color("Green").brighter(),
0,0
) +
join(
Cube( 10, inner/2, height ).centerY().translateX(-110).color("Blue"),
Cube( 10, inner/2, height ).centerY().translateX(-100).color("Green").brighter(),
-100,0
)
}
}