Exit Full View
ZipUp

/House/StepHook.foocad

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


class StepHook : Model {

    var thickness = 6
    var width = 20
    val diameter = 40

    override meth build() : Shape3d {

        val curve = RoundedCircularArc( diameter/2 + thickness, diameter/2, 180,340 )
            .leftTo(0)
        val upright = Square( thickness, diameter )
            .roundCorner( 3, 1 )
            .roundCorner( 2, thickness/2-0.1 )
        val strength = PolygonBuilder().apply {
            moveTo( thickness/2, 0 )
            lineBy(0,-diameter*2)
            lineBy(diameter*0.88 + thickness,diameter*1.65)
        }.buildPath().thickness(thickness)
            .roundCorner(3, 1)
            .roundCorner(0,thickness)


        val shape = (curve + upright + strength).toPolygon()
        val main = shape.smartExtrude( width )
            .edges( Chamfer(1) )

        val screwHoles = Countersink().recess(2)
            .rotateY(90)
            .translateX(thickness)
            .translateZ(width/2)
            .translateY(5).translateY(diameter - 15).also()

        return main - screwHoles

    }

}

/*
class StepHook : Model {

    var diameter = 300
    var size = Vector2( 200, 45 )

    var handleDiameter = 40
    val backMargin = 30
    val extra = 3

    override meth build() : Shape3d {
        val circle = Circle( diameter/2 )
            .backTo( size.y )
        val insideShape = circle.intersection( Square( size.x, size.y ).centerX() )
            .toPolygon()

        val depth = handleDiameter + extra * 2
        val filletSize = handleDiameter/2
        val edge = ProfileEdge.fillet(filletSize).reverse() and ProfileEdge.flat(extra)
        val main = insideShape.smartExtrude( depth )
            .edges( edge )

        val back = Circle( diameter/2 + filletSize + backMargin )
            .translateY( -diameter/2 + size.y )
            .extrude(extra)
            .color("Orange")
            
        val screwHole = KeyholeHanger(5,9).rotateX(90)
            .bottomTo( 15 )
        val screwHoles = screwHole
            .centerXTo( 40 )
            .mirrorX().also()

        val missing = Cube( 70, 300, 100 ).centerX().bottomTo( extra+0.01 ).frontTo(10)

        //return (main + back - missing)
        val sliced = (main + back - missing)
            .rotateX(90)
            .intersection( Cube( insideShape.size.x, depth*2, size.y + filletSize + backMargin ).centerXY() )

        return sliced - screwHoles
    }

}
*/