import uk.co.nickthecoder.foocad.smartextrusion.v1.* import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.* import uk.co.nickthecoder.foocad.extras.v1.* import static uk.co.nickthecoder.foocad.extras.v1.Extras.* class FoldingBox : Model { var size = Vector3( 300, 350, 250 ) var tubeDiameter = 20 var cornerSize = 50 var cornerThickness = 2 var clearance = 0.3 meth corner() : Shape3d { val thickness = tubeDiameter + cornerThickness * 2 val shape = Circle( thickness / 2 ) + Square( cornerSize - thickness, thickness ).centerY() + Square( thickness, cornerSize - thickness ).centerX() val solid = shape.smartExtrude( thickness ) .bottom( Chamfer( 2 ) ) .top( Fillet( thickness/2-2 ) ) val holes = Circle( tubeDiameter/2 + clearance ) .extrude( 100 ) .rotateY(90) .translateZ( thickness/2 ) .rotateZ(90).also() return (solid - holes).color("Orange") } meth side() : Shape3d { val sideLength = size.y - 50 val leftRight = Circle( tubeDiameter/2 ).extrude( size.z ) .translateY( -sideLength/2 ).mirrorY().also() val top = Circle( tubeDiameter/2 ).extrude( sideLength ) .rotateX(90) .centerY() .translateZ( size.z ) val corners = corner().opacity(0.75) .rotateY(90).centerX() .translateY( -sideLength/2 ) .translateZ( size.z ) .mirrorY().also() val pieces = leftRight + top + corners return pieces.translateX( size.x/2 ) } meth end() : Shape3d { val leftRight = Circle( tubeDiameter/2 ).extrude( size.z ) .translateX( -size.x/2 ).mirrorX().also() val topBottom = Circle( tubeDiameter/2 ).extrude( size.x ) .rotateY(90) .centerX() .translateZ( size.z ).also() val corners = corner().opacity(0.75) .rotateZ(180) .rotateX(-90).centerY() .translateX( size.x/2 ) .mirrorX().also() .mirrorZ().translateZ( size.z ).also(2) val pieces = leftRight + topBottom + corners return pieces.translateY( size.y/2 ) } @Piece meth material() : Shape3d { val hem = 25 val width = size.x + tubeDiameter val depth = size.y + tubeDiameter val height = size.z + tubeDiameter/2 val end = Square( width, height ).extrude(1).color( "orange" ).centerX() val sides = Square( depth, height ).extrude(1).leftTo(end.right).mirrorX().also().color( "yellow" ) val otherEnd = end.scaleX( 0.5 ).leftTo( sides.right ).mirrorX().also() val overlap = Square( hem, height ).extrude(1).color( "green" ).leftTo(otherEnd.right).mirrorX().also() val main = end + sides + otherEnd + overlap val forBase = Square( main.size.x, hem ).extrude(1).color("green").centerX().backTo(0) val wrap = Square( main.size.x, hem + tubeDiameter*2 ).extrude(1).color("green").centerX().frontTo(main.back) val forTubes = Square( tubeDiameter*2 + hem *2, height - tubeDiameter ).extrude(1).color( "violet" ) .centerXTo( width/2 ) .translateX( depth ).also() .mirrorX().also() .translateZ(20) val cornerCutouts = Square( tubeDiameter* 2 + 20, 100 ) .roundAllCorners(5) .centerX().frontTo( height - tubeDiameter) .extrude(3).centerZ() .translateX( width/2 ) .translateX( depth ).also().mirrorX().also() .color("Red") return main + forBase + wrap - cornerCutouts + forTubes } override fun build() : Shape3d { val outline = Cube(size).centerXY().previewOnly() val sides = side().mirrorX().also() val ends = end().mirrorY().also() return ends + outline } }