Exit Full View
ZipUp

/Furniture/LandingCabinet.foocad

LandingCabinet
FooCAD Source Code
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*
import uk.co.nickthecoder.foocad.woodworking.v1.*
import static uk.co.nickthecoder.foocad.woodworking.v1.Woodworking.*

include AdjustableFoot.foocad

class LandingCabinet : Model {

    @Custom( about="Overall size of the cabinet (not including the feet)" )
    var size = Vector3( 1000, 220, 700 )

    @Custom( about="Thicknessness of the plywood" )
    var sheetThickness = 12

    @Custom( about="The shelves are inset from the front" )
    var shelfOffset = 8

    @Custom( about="The rounded corner has a flat part, i.e. the rounding does go all the way to the back." )
    var flat = 50
    

    meth adjustableFoot() = AdjustableFoot().apply {
        diameter = 20
        height = 11
        holeCount = 1
        extraRodHeight = 0
    }

    @Piece
    meth foot() : Shape3d {
        val width = 28
        val height = 30
        val taper = 4
        val profile = PolygonBuilder().apply {
            moveTo(0,0)
            lineBy(width/2, 0)
            lineBy(-taper, height)
            lineBy(-width/2+taper,0)
        }.build().roundCorner(2, 2, 1)
        return adjustableFoot().customFoot( profile )
    }

    @Piece
    meth footBase() : Shape3d {
        return adjustableFoot().rod().rotateX(180).bottomTo(0)
    }
    

    override fun build() : Shape3d {

        val bottom = Square( size.x, size.y )
            .roundCorner(1, size.y - flat )
            .extrude( sheetThickness )
            .label( "bottom" )
            .centerXY()
            .color("Green")
        val top = bottom.topTo( size.z )
            //.previewOnly()

        val side = Cube( sheetThickness, size.y, size.z - sheetThickness*2 )
            .label( "side" )
            .backTo( bottom.back ).leftTo( bottom.left ).bottomTo( bottom.top )
            .color( "LightGreen" )

        val shelfWidth = size.x - size.y - sheetThickness

        val cornerBack = Cube( size.y - sheetThickness, sheetThickness, size.z - sheetThickness*2  )
            .label( "cornerBack" )
            .backTo( bottom.back )
            .rightTo( bottom.right )
            .bottomTo( bottom.top )
            .color( "LightBlue" ).darker()

        val divider = Cube( sheetThickness, size.y, size.z - sheetThickness*2 )
            .label( "divider" )
            .backTo( bottom.back ).leftTo( bottom.left ).bottomTo( bottom.top )
            .rightTo( cornerBack.left )
            .color( "LightBlue" )
    
        val curvedShelf = Square( size.y - sheetThickness - shelfOffset  )
            .roundCorner( 1, size.y - flat - shelfOffset )
            .extrude( sheetThickness )
            .label( "curvedShelf" )
            .leftTo( divider.right )
            .backTo( cornerBack.front  )
            .centerZTo( size.z * 0.5 )

        val shelves = Cube( shelfWidth, size.y - shelfOffset, sheetThickness )
            .label( "shelf" )
            .leftTo( side.right )
            .backTo( bottom.back )
            .repeatZ( 2, size.z/3 )
            .centerZTo( size.z / 2 )

        val feet = foot().mirrorZ()
            .leftTo( bottom.left + 20 )
            .frontTo( bottom.front + 20 )
            .mirrorY().also()
            .rightTo( divider.left - 20 ).also() +
        foot()
            .mirrorZ()
            .rightTo( bottom.right - 20 )
            .backTo( bottom.back - 20 )    

        return bottom + top + side +
            divider + cornerBack +
            shelves + curvedShelf +
            feet
    }
}