Exit Full View
Up

/Torch/NineVolter.foocad

NineVolter
FooCAD Source Code
import static uk.co.nickthecoder.foocad.chamferedextrude.v1.ChamferedExtrude.*
import uk.co.nickthecoder.foocad.drawerclip.v1.DrawerClip

/**
    A torch which uses a 9V battery, and a COB LED.
    Customise the "ledBase" piece for particular LED, and also use it to
    hold a buck or boost module to drive the COB LED at the correct voltage.
*/
class NineVolter : Model {
    
    var thickness = 1.8

    // Internal dimensions of the body
    // Note, mmust be bigger than the battery to account for the lip, slack
    // and the switch.
    var width = 21
    var height = 32
    var frontLength = 35
    var backLength = 50
    
    var buttonD = 12.8

    var ledZ = 3.5

    var lip = 9
    var lipT = 2

    var openingD = 7
    //var openingX = 10
    //var openingY = 10

    var chamfer = 2
    var slack= 0.1

    fun clip() = DrawerClip().apply {
        thin = 0
        span = 20
    }

    @Piece
    fun back() : Shape3d {

        val internalChamfer = chamfer / Math.sqrt(2)

        val profile = Square(
            width + thickness*2,
            height + thickness *2
        ).center().roundAllCorners( chamfer )

        val solid = ExtrusionBuilder().apply {
            crossSection( profile.offset( -chamfer ) )
            forward( chamfer )
            crossSection( profile )
            forward( backLength - chamfer )
            crossSection()
            crossSection( -thickness )

            forward( -backLength + thickness + internalChamfer )

            crossSection()
            forward( -internalChamfer )
            crossSection( - internalChamfer )
        }.build()

        return solid
    }

    @Piece
    fun front() : Shape3d {

        val internalChamfer = chamfer / Math.sqrt(2)

        val profile = Square(
            width + thickness*2,
            height + thickness *2
        ).center().roundAllCorners( chamfer )

        val outerLip = Square(
            width - slack,
            height -slack
        ).center().roundAllCorners( chamfer )

        val solid = ExtrusionBuilder().apply {
            crossSection( profile.offset( -chamfer ) )
            forward( chamfer )
            crossSection( profile )
            forward( frontLength - chamfer )
            crossSection()
            crossSection( outerLip )


            // Lip
            forward( lip )
            crossSection()
            crossSection( -lipT )
            forward( -lip-lipT )
            crossSection()
            forward( -lipT )
            crossSection( profile.offset(-thickness)  )

            forward( -frontLength + lipT*2 + thickness + internalChamfer )

            crossSection()
            forward( -internalChamfer )
            crossSection( - internalChamfer )
        }.build()
    
        val shelf = Cube( width, 6, thickness ).centerX()
            .backTo( height/2 - 2 )
            .topTo( frontLength - 6 )

        val wireSlot = Cube( 4, lipT+slack, frontLength ).centerX()
            .backTo( height/2 -0.01 )
            .translateZ(10)

        val opening = Circle( openingD/2 ).sides(24)
              .internalChamferedExtrude( thickness, chamfer, 0 )
        //val opening = Square( openingX, openingY ).center()
        //    .roundAllCorners(chamfer)
        //    .internalChamferedExtrude( thickness, chamfer, 0 )

        val buttonHole = Cylinder( height, buttonD/2 ).centerX()
            .rotateX(90).translateZ(thickness*2 + buttonD/2 +ledZ + 7)

        return (solid+ shelf).color("Green") - wireSlot - opening - buttonHole
    }

    // Glue the LED to this base, and then glue this into the body.
    // Drill holes as needed for the wires.
    @Piece
    fun ledBase() : Shape3d {
        val profile = Square( width-6, height-0.5 )
                .center() -
            Square( 2,5 ).centerY().translate(-width/2+3, 12)
                .rotate(180).also()

        val floor = profile.extrude(thickness)
        val spacer = Cube( 10, thickness*3, ledZ+thickness )
            .centerX()
            .translateY(-height/2+thickness)
            .mirrorY().also()

        return (floor+spacer).color("Violet")
    }

    fun battery() : Shape3d {
       val body = Square( 26.5, 17.5 ).center().roundAllCorners(2)
           .extrude(45.5)
        val connectors = Cylinder(3,4).translateX(6)
            .mirrorX().also()
            .translateZ(45.5)

        return body + connectors  
    }

    override fun build() : Shape3d {
        return front() +
            back().mirrorZ().translateZ(86) +
            ledBase().mirrorZ().bottomTo(thickness*2) +
            battery().rotateZ(90).translateZ(30).previewOnly()
    }

}