Exit Full View
Up

/Tools/CornerClamp.foocad

CornerClamp
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.arrange.v1.Arrange.*
import uk.co.nickthecoder.foocad.threaded.v2.*
import static uk.co.nickthecoder.foocad.threaded.v2.Thread.*
import static uk.co.nickthecoder.foocad.extras.v1.Extras.*

class CornerClamp : Model {

    @Custom( about="Max width of wood that can fit in the clamp" )
    var gap = 65

    @Custom( about="Length,thickness,height" )
    var blockSize = Vector3(60, 5, 30)

    @Custom
    var baseThickness = 3

    @Custom
    var endSize = Vector3(20, 30, 20)

    @Custom
    var footThickness = 5

    @Custom
    var thread = Thread(10)
        .headSize(Vector2(20,10))
        .headChamfer(1)
        .rodChamfer(0.1)
        .clearance(0.3)


    fun end() : Shape3d {

        val end = Square( endSize.x, endSize.y )
            .roundAllCorners(3)
            .leftTo( gap )
            .extrude( baseThickness + endSize.z )

        val hole = thread.threadedHole( endSize.x )
            .rotateY(90)
            .rightTo( end.right )
            .centerYTo( end.middle.y )
            .centerZTo( baseThickness + endSize.z/2 )

        return end - hole
    }

    @Piece
    fun bolt() : Shape3d {
        return thread.bolt( gap + endSize.x + footThickness ).color("Orange")
    }
    
    @Piece
    fun foot() : Shape3d {
        val base = Square( endSize.x, blockSize.z - 2 )
            .center()
            .roundAllCorners(3)
            .extrude( footThickness )
        val hole = thread.threadedHole( base.size.z - 0.5 )
            .clipped(true)
            .topTo( base.top )

        return (base - hole).color("Orange").darker()
    }

    @Piece
    fun clamp() : Shape3d {
    
        val triangle = Triangle( blockSize.x, blockSize.x )
            .roundAllCorners(2)
            .rotate(180)

        val block = (triangle - triangle.offset(-blockSize.y))
            .extrude( blockSize.z )

        val base = Square( blockSize.x + gap + endSize.x )
            .roundCorner(2,blockSize.x + (blockSize.x - endSize.y)/2,1)
            .roundCorner(0,blockSize.x,1)
            .roundAllCorners(10)
            .extrude( baseThickness )
            .leftTo( -blockSize.x )
            .frontTo( -blockSize.x )

        val xEnd = end().centerYTo( triangle.middle.y )
        val yEnd = end().rotateZ(90).centerXTo( triangle.middle.x )

        return base + block + xEnd + yEnd
    }

    override fun build() : Shape3d {
        val bolts = bolt().tileY(2,1).rightTo(-1).frontTo(1)
        val feet = foot().tileY(2,1).rightTo(-1).backTo(-1)
        val clamp = clamp().leftTo(1)

        return bolts + feet + clamp 
    }

}