Exit Full View
Up

/GardenFurniture/Hardware/SpurGearMount.foocad

SpurGearMount
FooCAD Source Code
import uk.co.nickthecoder.foocad.threaded.v2.*
import uk.co.nickthecoder.foocad.screws.v3.*
import uk.co.nickthecoder.foocad.smartextrusion.v1.*
import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.*
import uk.co.nickthecoder.foocad.gears.v1.*

class SpurGearMount : Model {

    var thickness = 6.0
    var gearConfig = GearConfig.lego().module(3)
    var axelDiameter = 13.0
    var axelClearance = 0.3
    var washerSize = Vector2(20, 0.6)
    var extraHeight = washerSize.y + 0.3
    var capSize = Vector2( 20, 2 )
    var screwHole : Shape3d = Countersink().mirrorZ()
    var capThread = Thread(9)

    meth spur( teeth : int ) : Shape3d {
        val shape = InvoluteGear( gearConfig, teeth ).spurProfile()
        val solid = shape.smartExtrude( thickness )
            .edges( Chamfer(0.6) )
        val hole = Circle( axelDiameter/2 )
            .extrude( thickness * 3 ).center()

        return solid - hole
    }

    @Piece
    meth washer() : Shape3d {
        val shape = Circle( washerSize.x/2 ) - Circle( axelDiameter/2 + axelClearance )
        return shape.extrude( washerSize.y )
    }

    @Piece
    meth mount() : Shape3d {
        val post = Circle( axelDiameter/2 - axelClearance )
            .smartExtrude( capSize.y + thickness + extraHeight )

        val cap = Circle( capSize.x/2 )
            .smartExtrude(capSize.y)
            .bottom( Chamfer( capSize.y*0.6 ) )

        return post + cap - screwHole
    }

    @Piece
    meth mountScrewCap() : Shape3d {
        val post = Circle( axelDiameter/2 - axelClearance )
            .smartExtrude( thickness + extraHeight )
        val screwHole = Countersink().recess( post.top - 3 ).topTo(post.top)
        val threadedHole = capThread.threadedHole( post.size.z - 3 )
            .bottomTo( 3 )
        return post - screwHole - threadedHole
    }

    @Piece
    meth cap() : Shape3d {
        val cap = Circle( capSize.x/2 )
            .smartExtrude(capSize.y)
            .bottom( Chamfer( capSize.y*0.6 ) )
        val thread = capThread.threadedRod( thickness + extraHeight + cap.top - 3 )

        return cap + thread
    }

    override fun build() : Shape3d {
        //val onePieceMount = mount().mirrorZ().bottomTo(0) // One piece mount.
        val mount = mountScrewCap()
        val cap = cap().mirrorZ().bottomTo(3.5).color("violet")
        val washer = washer().color("Orange")
        val spur = spur(20).previewOnly().bottomTo( washer.top )
        val washers = washer.bottomTo(spur.top).also()
        return mount + cap + washers + spur
    }

}