Exit Full View
Up

/Misc/WonkyChestOfDrawers.foocad

WonkyChestOfDrawers
FooCAD Source Code
import static uk.co.nickthecoder.foocad.chamferedextrude.v1.ChamferedExtrude.*

class WonkyChestOfDrawers : Model {
    
    var height = 100

    @Custom
    var depth = 30

    @Custom
    var topDepth = 35

    var includeTop = false

    @Custom
    var handleT = 5

    var backT = 1.6

    var chamfer = 1

    var gap = 0.5

    var slack = 0.2


    val shapes = SVGParser().parseFile( "wonkyChestOfDrawers.svg").shapes
    fun shape(name: String) = shapes[name].scale(height/shapes["chest1"].size.y)
 
    fun chest(n:int, startDrawer:int, endDrawer:int ,includeTop : bool) : Shape3d {

        var main : Shape3d = shape("chest$n").chamferedExtrude(depth,chamfer,chamfer)
        for (d in startDrawer..endDrawer) {
            main -= shape("drawer$d").offset(gap)
                .internalChamferedExtrude(depth-backT,0,chamfer/2)
                .translateZ(backT)
        }
        main = main.color("Blue")

        val top = shape("top$n").chamferedExtrude( topDepth,0,chamfer )
            .color("Orange")

        return if (includeTop) {
            main + top
        } else {
            main - top
        }
    }

    fun top(n:int) = shape("top$n").chamferedExtrude( topDepth,0,chamfer )

    fun drawer( n:int ) = drawer(n,false)
    fun drawer( n: int, includeHandle : bool ) : Shape3d {
        val shape = shape("drawer$n")
        val inside = shape("drawer${n}Void")
        val back = shape.chamferedExtrude(backT,chamfer,0)
        val front = shape.chamferedExtrude(backT,0,chamfer).topTo(depth-backT-gap)
        val handleVoid = shape("handle$n").offset(slack).extrude(handleT)
            .bottomTo(front.top-0.3)

        val sides = (shape - inside).chamferedExtrude(depth-backT*3-gap,0).translateZ(backT)

        val drawer = (front + back + sides- handleVoid)
            .color("Orange")

        return if (includeHandle) {
            val handle = shape("handle$n").extrude(handleT).bottomTo(drawer.top)
                .color("Blue")
            drawer+handle
    
        } else {
            drawer
        }
    }

    fun drawer( piece : String ) : Shape3d {
        return if (piece == "drawer1" ) {
            drawer(1).rotateX(90).rotateY(-10).centerXY().bottomTo(0)
        } else if (piece == "drawer2") {
            drawer(2).rotateX(90).rotateY(-15).centerXY().bottomTo(0)
        } else if (piece == "drawer3") {
            drawer(3).rotateX(90).rotateY(-5).centerXY().bottomTo(0)
        } else if (piece == "drawer4") {
            drawer(4).rotateX(90).rotateY(-2).centerXY().bottomTo(0)
        } else if (piece == "drawer5") {
            drawer(5).rotateX(90).rotateY(-2).centerXY().bottomTo(0)
        } else if (piece == "drawer6") {
            drawer(6).rotateX(90).rotateY(1).centerXY().bottomTo(0)
        } else if (piece == "drawer7") {
            drawer(7).rotateX(90).rotateY(-4).centerXY().bottomTo(0)
        } else if (piece == "drawer8") {
            drawer(8).rotateX(90).rotateY(-5).centerXY().bottomTo(0)
        } else if (piece == "drawer9") {
            drawer(9).rotateX(90).rotateY(0).centerXY().bottomTo(0)
        } else {
            Cube(0)
        }
    }

    fun handles(from : int, to : int):Shape3d{
        val result = listOf<Shape3d>()
        var y = 0
        for ( n in from..to ) {
            val handle = shape("handle$n").chamferedExtrude(handleT,0,0.2)
                .centerXY().translateY(y)
            result.add( handle )
            y += handle.size.y + 2
        }
        return Union3d(result).color("Blue")
    }

    fun handles( piece : String ) : Shape3d {
        return if (piece == "handles1") {
            handles(1, 3)
        } else if (piece == "handles2") {
            handles(4, 5)
        } else if (piece == "handles3") {
            handles(7, 9)
        } else {
            handles(1, 9)
        }
    }

    @Piece
    fun chest1() = chest(1,1,4, includeTop)

    @Piece
    fun chest2() = chest(2,5,6, includeTop)

    @Piece
    fun chest3() = chest(3,7,9, includeTop)

    @Piece
    fun top1() = top(1).centerXY()

    @Piece
    fun top2() = top(2).centerXY()
    
    @Piece
    fun top3() = top(3).centerXY()

    @Piece
    fun drawer1() = drawer("1")

    @Piece
    fun drawer2() = drawer("2")

    @Piece
    fun drawer3() = drawer("3")

    @Piece
    fun drawer4() = drawer("4")

    @Piece
    fun drawer5() = drawer("5")

    @Piece
    fun drawer6() = drawer("6")

    @Piece
    fun drawer7() = drawer("7")

    @Piece
    fun drawer8() = drawer("8")

    @Piece
    fun drawer9() = drawer("9")

    @Piece
    fun handles1() = handles("")

    override fun build() : Shape3d {

        val drawersList = listOf<Shape3d>()
        for (n in 1..9){
            drawersList.add(drawer(n, true))
        }
        val drawers = Union3d(drawersList)
        
        return (
            chest(1, 1,4, true) +
            chest(2, 5,6, true) +
            chest(3, 7,9, true) +
            drawers.translateZ(backT+gap)
        ).centerXY()
    }  
}