Exit Full View
ZipUp

/Util/Standards.foocad

Standards

Some standard code snippets to copy/paste. These are mostly sizes of standard hardware. For example, coutersink sizes for wood screws.

woodScrewThreadXX

Create threaded holes suitable for metric wood screws. Plastic is not suitable for metal bolts, as the threads and the required tolerances are too small. But rather than using metal inserts, why not try woodscrews instead!

FooCAD Source Code
import static uk.co.nickthecoder.foocad.arrange.v1.Arrange.*
import uk.co.nickthecoder.foocad.compound.v1.*
import uk.co.nickthecoder.foocad.threaded.v2.*

class Standards : Model {

    // ~ 3mm diameter, pitch 1mm. (often shorter than 15mm long).
    val woodscrewPitch1 = Thread( 3.1 )
        .pitch(1)
        .threadSize(Vector2(0.4,0.8))
        .rodChamfer(0.8)

    // ~ 4mm diameter, pitch 1.5mm. (often longer than 15 mm long).
    val woodscrewPitch1_5 = Thread( 4 )
        .pitch(1.5)
        .threadSize(Vector2(0.75, 1.2))
        .rodChamfer(1.2)

    // ~ 4mm diameter, pitch 2.0mm. (Rare in my small sample of wood screws)
    val woodscrewPitch2 = Thread( 4 )
        .pitch(2.0)
        .threadSize(Vector2(0.75, 1.5))
        .rodChamfer(1.5)

    // ~ 5mm diameter, pitch 3.0mm. (Very chunky)
    val woodscrewPitch3 = Thread( 5 )
        .pitch(3.0)
        .threadSize(Vector2(1.0, 2.5))
        .rodChamfer(1.5)

    meth block( size : double, height : double, label : String ) : Shape3d {
        val block = Square( size ).center().roundAllCorners( size/5 )
            .extrude( height )

        val text = Text(label, 8).rotate(90)
            .centerX()
            .extrude(0.4)
            .rotateX(90)
            .frontTo( block.front - 0.1 )
            .centerZTo( block.middle.z )
            .color("Red")

        return block - text + text.previewOnly()
    }

    @Piece
    meth testWoodscrew1() : Shape3d {
        val block = block(10, 7, "1")
        val hole = woodscrewPitch1.threadedHole( block.top )
            .chamferStart(false)
            .translateY(-1)

        return block remove hole.centerYTo(block.back).also()
    }

    @Piece
    meth testWoodscrew1_5() : Shape3d {
        val block = block(12, 10, "1.5")
        val hole = woodscrewPitch1_5.threadedHole( block.top )
            .chamferStart(false)
            .translateY(-1)

        return block remove hole.centerYTo(block.back).also()
    }

    @Piece
    meth testWoodscrew2() : Shape3d {
        val block = block( 13, 12, "2" )
        val hole = woodscrewPitch2.threadedHole( block.top )
            .chamferStart(false)
            .translateY(-1.25)

        return block remove hole.centerYTo(block.back).also()
    }


    @Piece
    meth testWoodscrew3() : Shape3d {
        val block = block( 14, 14, "3" )
        val hole = woodscrewPitch3.threadedHole( block.top )
            .chamferStart(false)
            .translateY(-1.25)

        return block remove hole.centerYTo(block.back).also()
    }

    func labelY( name : String, shape : Shape3d ) : Shape3d {
        val style = TextStyle().fontSize(8).hAlign(HAlignment.CENTER).lineSpacing(0.8)
        val text = Text(name, style)
            .extrude(1)
            .backTo( shape.front - 1 )
            .centerXTo( shape.middle.x )
            .previewOnly()

        return shape + text
    }

    @Piece
    meth woodScrewThreads() : Shape3d {
        val ws1 = testWoodscrew1()
        val ws1_5 = testWoodscrew1_5().leftTo(ws1.right+1)
        val ws2 = testWoodscrew2()
        val ws3 = testWoodscrew3()

        val all = arrangeX( ws1, ws1_5, ws2, ws3 ).centerXY()
        
        val base = Square( all.size.x + 1, all.size.y + 1 )
            .center()
            .roundAllCorners(2)
            .extrude(1)

        return all and base
    }

    override fun build() : Shape3d {
        
        return Compound().apply {
            + labelY( "Wood\nScrew\nThreads", woodScrewThreads() )
        }.build()
    }

}