/Christmas/Baubles.foocad

Inspired by 3D scroll saw designs, such as the onese here : [https://bijaju54.wordpress.com/tag/free-3d-christmas-ornament-scroll-saw-patterns/]
These take quite a while to render - over 3 minutes on my crusty old laptop.
Take two profiles (Shape2d) from an SVG document. The first profile determines the general shape of the bauble. We use "revolve" to create a "solid of revolution". But rather than have a solid object we create "slices" The number of slices is given by @Custom slices.
The widths of these these slices is determined by the other profile from the SVG document. The thickness of the slices is a constant ( @Custom thickness ).
Use inkscape to edit the profiles in the SVG document to create your own shapes. Also consider combining this model with something else inside the bauble. A tiny bird for example, as it it were in a bird cage. Or maybe an intial, so each person has their own personal bauble.
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*
class Baubles : AbstractModel() {
@Custom
var thickness = 1.0
@Custom
var slices = 5
val doc = SVGParser().parseFile( "Baubles.svg" )
fun make( profile : Shape2d, profile2 : Shape2d ) : Shape3d {
val outside = profile.toOrigin().translateX(0.001)
val inside = outside.offset( -thickness ) +
Square( thickness+0.1, outside.size.y - thickness* 2 )
.translateY( thickness )
val rev = (outside - inside).revolve()
val other = profile2.toOrigin().mirrorX().also().extrude( rev.size.x )
.rotateX(90)
//.centerY()
val slice = rev / other
val hanger : Shape3d = hanger().translateZ(slice.size.z - 0.5)
return slice.repeatAroundZ(slices, 360/slices) + hanger
}
fun hanger() = (Circle( 3 ) - Circle( 2 )).extrude(2).rotateX(90).toOriginZ().centerY()
fun make( doc : SVGDocument, name : String ) : Shape3d {
val profile = doc.shapes[ "${name}a" ]
val thickness = doc.shapes[ "${name}b" ]
return make( profile, thickness )
}
@Piece
fun one() = make( doc, "1" )
@Piece
fun two() = make( doc, "2" )
@Piece
fun three() = make( doc, "3" )
@Piece
fun four() = make( doc, "4" )
@Piece( printable = false )
override fun build() : Shape3d {
return make( doc, "1" ) +
make( doc, "2" ).translateX(30) +
make( doc, "3" ).translateY(30) +
make( doc, "4" ).translate(30, 30, 0)
}
}

