Exit Full View
Up

/Tools/StrapWratchet.foocad

StrapWratchet
FooCAD Source Code
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*
import static uk.co.nickthecoder.foocad.extras.v1.Extras.*
import static uk.co.nickthecoder.foocad.arrange.v1.Arrange.*
class StrapWratchet : Model {

    @Custom
    var webbingThickness = 20

    var slotThickness = 3
    var diameter = 30
    var axelDiameter = 3

    fun axelHole() = Circle(axelDiameter + 0.5)
        .extrude(2.2).bottomTo(-0.1)

    fun drumSide() : Shape3d {
        val circle = Circle(diameter/2)
        val tooth = PolygonBuilder().apply {
            moveTo( circle.right, 0 )
            lineBy( -2, 0 )
            bezierBy( Vector2( 1,1 ), Vector2( 0, 1 ), Vector2( 2, 8 ) )
        }.build()

        val teeth = tooth.repeatAround(15)

        return (circle - teeth).extrude( 1 ) - axelHole()
    }

    @Piece
    fun otherSide() : Shape3d {
        val indents = Square( 4 ).center().translateX(7)
            .repeatAround(4)
            .extrude(10)
            .center()

        return drumSide() - indents
    }

    @Piece
    fun drum() : Shape3d {
    
        val side = drumSide()

        val core = Circle(diameter/2 - 5)
            .extrude( webbingThickness + 3 )
            .bottomTo( side.top )
        val outdents = Square(4-0.2).center().translateX(7)
            .roundAllCorners(0.5)
            .repeatAround(4)
            .extrude(1)
            .bottomTo( core.top )

        val gap = Square( slotThickness, webbingThickness + 1 )
            .extrude( core.size.x )
            .rotateX(90)
            .center()
            .centerZTo( core.middle.z )

        val axelHoles = axelHole().topTo( core.top + side.size.z ).also()

        return side + core + outdents - gap - axelHoles
    
    }

    override fun build() : Shape3d {
        return arrangeX(5,
            drum(), otherSide()
        ).centerX()
    }

}