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