Exit Full View
Up

/Tools/RouterRadius.foocad

RouterRadius
FooCAD Source Code
import static uk.co.nickthecoder.foocad.chamferedextrude.v1.ChamferedExtrude.*
/**
    Use a "follower" bit on a router to make rounded corners.

    For small radii, solid jobbies such as these are good :
        https://www.printables.com/model/191576-router-radius-jig-r51015202530

    However, for a one-off template for a larger radius, I've created my own model.
*/

class RouterRadius : Model {

    @Custom    
    var radius = 80

    var extra = 20
    var width = 10
    var thickness = 7

    var chamfer = 0.8
    var engraveDepth = 1.0

    override fun build() : Shape3d {

        val r0 = 1
        val r1 = 5
        val r2 = 20


        val profile = PolygonBuilder().apply {
            moveTo( 0, -radius )
            Quality.push()
            Quality.quality( 6 ) // The circular arc must be high res, we don't want to see the mesh!
            circularArcBy( radius, radius, radius, false, false )
            Quality.pop() // Everything else can use the normal quality setting
            radius(r1)
            lineBy(extra,0)
            radius(r0)
            lineBy( 0, width )
            lineBy( extra, 0 )
            lineBy( 0,-width )

            radius(r2)
            lineBy( 0, -width )
            lineBy( -radius -width - extra, -radius - width - extra )
            lineBy( -width, 0 )
            radius(r0)

            lineBy( -width, 0 )

            lineBy( 0, extra )
            radius(r1)
            lineBy( width, 0 )
            radius(0)
            lineBy(0, extra)
        }.build()

        val locators = Square( extra, width ).leftTo(radius+extra) +
            Square( width, extra ).backTo(-radius-extra).rightTo(0)

        val markers = Square( 1, width/2 ).leftTo(radius).backTo(-width/4) +
            Square( width/2, 1 ).leftTo(width/4).backTo(-radius)

        val textOffset = (radius+extra*2+width/2)/2-1
        val text = Text("R$radius", BOLD).center()
        val positionedText = text.mirrorX()
            .rotate(45).translate(textOffset, -textOffset)
            
        val blob = text.margin(4, 2).boundingSquare().roundAllCorners(2)
                .rotate(45).translate(textOffset, -textOffset)

        val line = PolygonBuilder().apply {
            moveTo( blob.middle )
            lineTo( radius*0.3, -radius*0.3 )
        }.buildPath().thickness(width)

        val hollow = profile - (profile-locators).offset(-width) + blob + line
            


        return hollow.chamferedExtrude( thickness, chamfer ) +
            locators.roundAllCorners(r0).chamferedExtrude( thickness+chamfer, 0, chamfer ).bottomTo(thickness-chamfer) -
            (markers + positionedText).extrude(engraveDepth+1).bottomTo(-1)
    }
}