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() 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() 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() } }