Exit Full View
Up

/Kitchen/CutleryDrawer.foocad

CutleryDrawer

Inserts for my cutlery drawer.

The "back" piece is there just to take up space (I won't store things in it).

The "big" piece is too large for any of my printers, so I'll print it in two pieces. The curve prevents a weak corner, and avoids a vertical line that won't line up!

FooCAD Source Code
import uk.co.nickthecoder.foocad.smartextrusion.v1.*
import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.*
import uk.co.nickthecoder.foocad.cup.v1.*
import static uk.co.nickthecoder.foocad.cup.v1.Cup.*

class CutleryDrawer : Model {

    var baseThickness = 0.8
    var thickness = 3
    var wallThickness = 1.6

    var defaultHeight = 50.0
    val defaultWidth = 60

    var drawerSize = Vector3( 430, 480, 110 )

    var backDepth = 50

    var knifeSize = Vector2( defaultWidth, 250 )
    var forkSize = Vector2( defaultWidth, 220 )
    var extraSize = Vector2( defaultWidth + thickness+wallThickness, drawerSize.y - backDepth - knifeSize.y - thickness * 4 )

    var teaSize = Vector2( defaultWidth + thickness*2 - wallThickness, drawerSize.y -backDepth - knifeSize.y - thickness * 4)
    var miscSize = Vector2( defaultWidth * 2 - thickness*0 + wallThickness, drawerSize.y - backDepth - forkSize.y - thickness * 4)
    var sharpSize = Vector2( defaultWidth, knifeSize.y )

    var bigSize = Vector3( 60, drawerSize.y - thickness * 2, defaultHeight )

    meth inside() = Cube( drawerSize ).centerXY()

    meth outside( shape : Shape2d ) = outside( shape, defaultHeight )
    meth outside( shape : Shape2d, height : double ) : Shape3d {
        
        var combined : Shape2d = null
        for ( path in shape.paths ) {
            combined = Polygon( path ).offset(wallThickness*2) + combined
        }

        val topStep = ProfileEdge.combine(
            ProfileEdge.chamferedStep(thickness-wallThickness, 4).reverse(),
            ProfileEdge.chamfer(1)
        )

        val bottomStep = ProfileEdge.combine(
            ProfileEdge.chamferedStep(thickness-wallThickness, 3).reverse(),
            ProfileEdge.chamfer(0.5)
        )

        return combined.toPolygon().offset(-wallThickness).roundAllCorners(1)
            .smartExtrude( height )
            .top(topStep)
            .bottom( bottomStep )
    }

    meth cutout( shapes : Shape2d ) = cutout( shapes, defaultHeight )
    meth cutout( shapes : Shape2d, height : double ) : Shape3d {

        return shapes
            .roundAllCorners(10)
            .smartExtrude( height - baseThickness+ 0.1 )
            .top( Chamfer(0.3).reverse() )
            .bottom(Fillet(10))
            .bottomTo( baseThickness )
    }

    meth section( shape : Shape2d ) = section( shape, defaultHeight )
    meth section( shape : Shape2d, height : double ) : Shape3d {
        return outside( shape, height ) - cutout( shape, height )
    }

    @Piece
    meth back() : Shape3d {

        val inside = inside()
        val width = backRight().size.x - thickness*2

        val back = Square( width, backDepth - thickness*2 )
        return section( back ).centerXY()
    }

    @Piece
    meth backRight() : Shape3d {

        val knife = Square( knifeSize )
        val fork = Square( forkSize ).leftTo( knife.right + wallThickness ).backTo( knife.back )
        val spoon = Square( forkSize ).leftTo( fork.right + wallThickness ).backTo( knife.back )
        val extra = Square( extraSize ).leftTo( spoon.right + wallThickness ).backTo( knife.back )

        return section( knife + fork + spoon + extra ).centerXY()
    }

    @Piece
    meth frontRight() : Shape3d {

        val tea = Square( teaSize )
        val misc = Square( miscSize ).leftTo( tea.right + wallThickness )
        val sharp = Square( sharpSize ).leftTo( misc.right + wallThickness )

        return section( tea + misc + sharp ).centerXY()
    }

    @Piece
    meth bigHalf() : Shape3d {
        val shape = Square( bigSize.x, bigSize.y ).centerY()
        val plain = section(shape, bigSize.z)

        val envelope = Square( bigSize.z, bigSize.y + 4 )
            .roundCorner(1, bigSize.z - 1)
            .smartExtrude( bigSize.x + thickness*4 )
            .rotateY(-90)
            .bottomTo(-1).leftTo( plain.left-1 )

        // Doesn't work :-(        
        val transform = BigTransform( 0.005 )
        return plain.intersection( envelope ).transform( transform )

        return plain.intersection( envelope )
    }

    @Piece( about="Glue to the inside of the drawer to keep the pots in place. TPU" )
    meth bumper() : Shape3d {
        return Square( 30, 6 ).roundAllCorners(2)
            .smartExtrude( 6 )
            .top( Fillet( 3 ) )
    }

    override fun build() : Shape3d {

        val inside = inside()

        val drawer = Square(drawerSize.x,drawerSize.y).offset(20).center()
            .cup(drawerSize.z + 20, 20)
            .bottomTo(-20)
            .previewOnly()

        val back = back().color( "Yellow" ).backTo( inside.back ).rightTo( inside.right )
        val backRight = backRight().color( "Green" ).backTo( back.front ).rightTo( inside.right )
        val frontRight = frontRight().color( "Orange" ).frontTo( inside.front ).rightTo( inside.right )

        val big = bigHalf().mirrorY().also().rightTo( back.left ).color( "Red" )

        return drawer + back + backRight + frontRight + big

    }

}

class BigTransform( val foo : double ) : Transform3d {
    override meth transform( from : Vector3 ) = Vector3( from.x, from.y, from.z - foo * from.x * from.z )
}