Exit Full View
Up

/GardenFurniture/ColdFrameFlatPack.foocad

ColdFrameFlatPack
FooCAD Source Code
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*
import static uk.co.nickthecoder.foocad.extend.v1.Extend.*
import uk.co.nickthecoder.foocad.extras.v1.*
import static uk.co.nickthecoder.foocad.extras.v1.Extras.*
import uk.co.nickthecoder.foocad.smartextrusion.v1.*
import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.*
import uk.co.nickthecoder.foocad.threaded.v2.*
import static uk.co.nickthecoder.foocad.along.v3.Along.*
import uk.co.nickthecoder.foocad.woodworking.v1.*
import static uk.co.nickthecoder.foocad.woodworking.v1.Woodworking.*

class ColdFrameFlatPack : Model {

    //val wood = Wood("main", 63/2-3, 38/2-3  ) // Quarter of a common CLS timber
    val wood = Wood("main", 38, 62/2-3 ) // 38x29 Half of a common CLS timber

    // My sheets are 1150 x 610
    // The size of the box is
    @Custom
    var size = Vector3( 1150 + 20, (1150 /2) + 20 + wood.thickness*2, 610 + 20 )

    @Custom
    var cornerLength = 130


    @Custom
    var thread = Thread( 7 )

    @Custom
    var insertDiameter = 9.8

    @Custom
    var insertLength = 20

    @Custom
    var cornerSize = Vector3( 80, 20, 20 )


    meth panel( name : String, x : double, z : double ) : Shape3d {
        val bottom = wood.cut( x )
            .label( "$name-topBottom" )
            .edgeDownAlongX()
            .centerX()

        val topBottom = bottom
            .topTo( z ).also()

        val left =  wood.cut( z - wood.width*2 )
            .label( "$name-side" )
            .leftTo( topBottom.left )
            .bottomTo( wood.width )
            .darker()

        val sides = left
            .mirrorX().also()

        val corners = wood.cut( cornerLength )
            .mitre( OPPOSITE_SIDE ).bothEnds()
            .rotateY(-45)
            .translateX( -left.right - 2)
            .translateZ( z - wood.width - cornerLength / Math.sqrt(2) - 2)
            .mirrorX().also()
            .mirrorZ().translateZ( z ).also(2)

        return topBottom + sides + corners
    }

    @Piece
    meth corners() = corner().leftTo(1).frontTo(1).mirrorX().also().mirrorY().also()

    @Piece
    meth corner() : Shape3d {

        val shape = (
            Square( cornerSize.x, cornerSize.y ) +
            Square( cornerSize.y, cornerSize.x )
        )
        val solid = shape.smartExtrude( cornerSize.z )
            .edges( Chamfer(1) ) 

        val corner = (
            Triangle( cornerSize.y*3.2, cornerSize.y*3.2 ) -
            Circle( 5 )
                .translate(cornerSize.y*1.3, cornerSize.y*1.3 )
        ).smartExtrude( cornerSize.z /2 )
                .edges(Chamfer(1))

        val slots = Hull2d(
                Circle( thread.diameter/2 + 1 )
                    .sides(8).rotate(22.5)
                    .translateX(10).also()
                )
            .smartExtrude( cornerSize.y )
                .edges(Chamfer(1).reverse())
            .rotateX(-90)
            .centerZTo( cornerSize.z/2 )
            .rightTo( cornerSize.x - cornerSize.z/2 )
            .rotateZ(90).mirrorX().also(2)

        return solid + corner - slots 
    }

    var lidAdjustmentSize = Vector3( 200, 10, 8 )

    @Piece
    meth lidAdjustment() : Shape3d {
        val size = lidAdjustmentSize

        val notch = Hull2d(
            Circle( thread.diameter/2 + 1 )
                .translate( thread.diameter*1.5, thread.diameter*1.8 ).also()
        )
        val notches = notch.tileXWithin( size.x, 5 )

        val along = Hull2d(
            Circle( thread.diameter/2 + 1 )
                .translateX( notches.size.x - thread.diameter * 3 ).also()
        ).translate(thread.diameter*1.5, thread.diameter*1.8 )

        val end = Circle( thread.diameter/2 + 1 )
            .rightTo(-thread.diameter*3)

        val inside = (notches + along + end)
            .leftTo( size.y/2 )
        val outside = inside.offset( size.y )
        val shape = outside - inside    

        return shape.smartExtrude(size.z)
            .edges(Chamfer(1))
            
    }

    @Piece
    meth threadedInsert() = threadedInsert( insertLength, 0 )
    meth threadedInsert( length : double, barbHeight : double ) : Shape3d {
        val barbSize = 1.2

        val solid = Circle( insertDiameter/2 )
            .smartExtrude( length )
            .top( Chamfer(0.5) )

        val hole = thread.threadedHole( solid.size.z )

        val ribs = Triangle( barbSize*2, insertLength/2 )
            .extrude(barbSize)
            .rotateX(90)
            .centerY()
            .leftTo( insertDiameter/2 -barbSize )
            .bottomTo( barbHeight )
            .repeatAroundZ(4)

        return (solid+ribs) remove hole
    }

    @Piece
    meth threadedInsertWithOffset() : Shape3d {
        val extraZ = 4.2
        val plain = threadedInsert(insertLength + extraZ, extraZ )
        val offset = Square( plain.size.y + 2 ).scaleY(2)
            .roundAllCorners(2)
            .center()
            .smartExtrude( extraZ )
            .bottom( Chamfer(1) )

        return plain and offset
    }

    @Piece
    meth cornerBolt() : Shape3d {
        return thread
            .bolt( insertLength-1 + cornerSize.y )
            .bareLength( cornerSize.y )
    }

    @Piece
    meth lidAdjustmentBolt() : Shape3d {
        return thread
            .headSize( 20, 5 )
            .bolt( insertLength-1 + lidAdjustmentSize.z )
            .bareLength( lidAdjustmentSize.z )
    }

    override fun build() : Shape3d {
        val corners = corner()
            .leftTo( -size.x/2 + wood.thickness )
            .frontTo( -size.y/2 + wood.thickness )
            .centerZTo( wood.width/2 )
            .centerZTo( size.z - wood.width/2 ).also()

        val frontBack = panel( "front", size.x, size.z )
            .frontTo( -size.y/2 )
            .mirrorY().also()
            .color("lightGreen")

        val sides = panel( "side", size.y - wood.thickness*2, size.z )
            .rotateZ(90)
            .leftTo( frontBack.left )
            .mirrorX().also()
            .color("lightGreen").darker()

        val lid = panel( "lid", size.y, size.x )
            .rotateZ(90)
            .rotateY(90)
            .centerX()
            .bottomTo( size.z )

        val lidAdjustment = lidAdjustment()
            .rotateY(90)
            .leftTo( lid.right + 4 )
            .topTo( lid.top - 0 )
            .backTo( lid.back - 20 )

        val backSheet = Cube( 1150, 4, 610 )
            .frontTo( frontBack.back )
            .centerX()
            .centerZTo( frontBack.middle.z )
            .previewOnly()

        val sideSheet = Cube( 4, 1150/2, 610 )
            .leftTo( sides.right )
            .centerY()
            .centerZTo( frontBack.middle.z )
            .previewOnly()

        val topSheet = Cube( 1150, 610, 4 )
            .centerXY()
            .bottomTo( lid.top )
            .previewOnly()

        return frontBack + sides + corners + lid + lidAdjustment + backSheet + sideSheet + topSheet
    }

}