FooCAD Source Codeimport 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()
}
}