import static uk.co.nickthecoder.foocad.arrange.v1.Arrange.* import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.* import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.* /** A shallow drawer for my Mum's over-bed table. */ class TableDrawer : Model { @Custom var size = Vector3( 150, 180, 30 ) @Custom( about="Unused space, so that the draw can be fully extended, without it coming out" ) var unused = 40 @Custom( about="The thickness of the plywood base, plus a little extra slack" ) var baseThickness = 6.2 val thickness = 4 val frontThickness = 2 val chunk = 10 val rabbitSize = Vector2( 8, 8 ) val slack = Vector2(0.5, 0.5) val curveRadius = (size.z - thickness)/2 fun rabbit() = Cube( rabbitSize.x + 1, size.y *2, rabbitSize.y ) .leftTo( -size.x/2 - thickness - 1) .centerZTo( size.z / 2 ) .centerY() .color("Red") fun curve() : Shape3d { val length = size.x - chunk*2 - slack.x val curve = Cube( length, curveRadius, curveRadius ).centerX() - Cylinder( length+2, curveRadius ).rotateY(90).toOrigin().centerX() return curve } fun front() : Shape3d { val front = Square( size.x + thickness*4 + slack.x*2, size.z ) .roundAllCorners(2) .extrude( frontThickness ) .rotateX(90) .centerX().backTo( -size.y/2 ) val curve = curve().frontTo(front.back).bottomTo(baseThickness) return (front + curve).color( "Green" ) } fun back() : Shape3d { val length = size.x - chunk*2 - slack.x val back = Square( length, size.z - thickness ) .roundAllCorners(2) .extrude( frontThickness ) .rotateX(90) .centerX().frontTo( size.y/2 ) val curve = curve().mirrorY().backTo(back.front).bottomTo(baseThickness) return (back + curve).color( "Green" ) } fun side() : Shape3d { val side = Cube( thickness, size.y, size.z - thickness - slack.y ) .rightTo(0) .translateX( -size.x / 2 ) .centerY() val forBase = Cube( chunk, size.y, size.z - baseThickness - thickness - slack.y ) .bottomTo( baseThickness ) .leftTo(side.right) .centerY() val holes = Cylinder( chunk, 1.5 ).sides(4) .centerXTo( forBase.middle.x ) .spreadY( 3, size.y - 20 ) .centerY() return (side + forBase).color("Orange") - rabbit() //- holes } fun runner() : Shape3d { val rabbit = rabbit() val inRabbit = Cube( rabbitSize.x, size.y, rabbitSize.y - slack.y*2 ) .frontTo(-size.y/2) .centerZTo( rabbit.middle.z) .leftTo( -size.x / 2 - thickness ) val side = Cube( thickness, inRabbit.size.y, size.z - inRabbit.bottom ) .rightTo( inRabbit.left ) .frontTo( inRabbit.front ) .bottomTo( inRabbit.bottom ) val top = Cube( chunk + thickness, inRabbit.size.y, thickness ) .topTo(side.top) .frontTo(side.front) .leftTo(side.right) return (inRabbit + side + top).color( "Blue" ).translateX(-slack.x) } @Piece fun printRunner() = runner().rotateY(-90).bottomTo(0) @Piece fun printSide() = side().rotateY(-90).bottomTo(0) @Piece fun printFront() = front().rotateX(90).bottomTo(0) @Piece fun printBack() = back().rotateX(-90).bottomTo(0) override fun build() : Shape3d { val open = 0// 120 val base = Cube( size.x, size.y - unused, baseThickness ) .centerX().frontTo(-size.y/2) .previewOnly() println( "Base = ${base.size}" ) val side = side() val draw = base + side.mirrorX().also() + front() + back() .translateY(-unused) return draw.translateY(-open) + runner().translateX(-0).mirrorX().also() } @Piece fun all() = arrangeX( 2, printSide(), printSide(), printRunner(), printRunner(), printFront().rotateZ(90), printBack().rotateZ(90) ) }