Exit Full View
Up

/Games/SpinningTurtles.foocad

SpinningTurtles
FooCAD Source Code
import static uk.co.nickthecoder.foocad.chamferedextrude.v1.ChamferedExtrude.*

class SpinningTurtles : Model {

    @Custom
    var size = Vector3( 80, 20, 15 )

    @Custom
    var pegSize = Vector2( 6, 10 )

    @Custom
    var turtleSize = Vector3( 30, 20, 7 )

    @Piece
    fun base() : Shape3d {
        val top = Circle( 50 ).scale(1/100).scaleX(size.x).scaleY(size.y)
            .extrude( size.z * 0.1 )
        val partSphere = ( Sphere(50).translateZ(-5) intersection Cube( 200 ).centerXY() )
            .scale(1/100).scale(size)
            .bottomTo( top.top )

        val holes = Circle( pegSize.x/2+0.3 ).chamferedExtrude(pegSize.y/2, -1, 0)
            .bottomTo(-0.1)
            .translateX( size.x * 0.25 )
            .mirrorX().also()

        return partSphere + top - holes
    }

    @Piece
    fun turtle() : Shape3d {
        val hemiSphere = Sphere( 50 ) intersection Cube( 200 ).centerXY()

        val shell = hemiSphere.scale( 1/100 ).scale( turtleSize ).scaleZ(2)
            .translateX(turtleSize.x* 0.2)

        val hole = Circle( pegSize.x/2+0.15 ).chamferedExtrude(pegSize.y/2, -1, 0)
            .bottomTo(-0.1)

        return shell - hole
    }

    @Piece
    fun peg() : Shape3d {
        return Cylinder( pegSize.y, pegSize.x/2 )
    }


    override fun build() : Shape3d {
        val base = base().mirrorZ().bottomTo(0)
        val pegs = peg()
            .translateX( base.size.x * 0.25 )            
            .mirrorX().also()
            .bottomTo( base.top + 5 )
            .color("Orange")

        val turtle = turtle()
            .translateX( base.size.x * 0.25 )
            .bottomTo( pegs.top + 5 )


        return base + pegs + turtle
    }
}