Exit Full View
ZipUp

/Tools/RotaryTool.foocad

RotaryTool
FooCAD Source Code
import uk.co.nickthecoder.foocad.smartextrusion.v1.*
import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.*
import uk.co.nickthecoder.foocad.extras.v1.*
import static uk.co.nickthecoder.foocad.extras.v1.Extras.*

class RotaryTool : Model {

    var thickness = 2.0
    var batterySize = Vector2( 20, 65 )
    var jointLength = 3.0
    var clearance = 0.3
    var switchSize = Vector2( 12, 10 )
    var chargerSize = Vector2( 18, 20 )
    
    meth batteryCircle() = Circle( batterySize.x / 2 )
    meth batteryBump() = Square( 6.0, batterySize.x/2 ).centerX().backTo( batterySize.x / 2 + 2).roundAllCorners(2,6)
    meth batteryInside() = batteryCircle() + batteryBump()
    meth batteryOutside() = ( batteryCircle() hull batteryBump() ).toPolygon().offset(thickness)

    @Piece
    meth batteryTube() : Shape3d {
        
        val main = (batteryOutside() - batteryInside())
            .extrude( batterySize.y + jointLength*2 )

        return main
    }

    @Piece
    meth chargerCap() : Shape3d {

        val inside = batteryInside() - Square( 30 ).centerX().backTo(0)
        val outside = batteryOutside()
        val baseThickness = 2
        val thin = 0.8

        val main = outside.smartExtrude( baseThickness + chargerSize.y )
            .bottom( Chamfer( 1.6 ) )

        // TODO Check USB size 8x3?? Check chargerSize
        val forCharger = Square( 8, 3 ).centerX().mirrorY().extrude(chargerSize.y + 10) +
            (Square( chargerSize.x, 3 ).centerX().mirrorY() + inside).extrude(chargerSize.y + 10).translateZ(thin)
    
        val lid = Square( chargerSize.x + 1, 3 ).centerX().mirrorY().extrude(1.2).bottomTo( thin + chargerSize.y )

        val connection = (batteryInside() - batteryInside().offset(-thickness)).extrude(4)
            .bottomTo( main.top )

        return main - forCharger + lid //+ connection
    }

    override fun build() : Shape3d {
        val cap = chargerCap().color("Green")

        val batteryTube = batteryTube().bottomTo( cap.top - jointLength + clearance + 40 )
        
        val battery = Cylinder( 65, 18/2 ).previewOnly().bottomTo( batteryTube.bottom )    

        return cap + batteryTube + battery
    }

}