import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.* import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.* import java.util.ArrayList /* A circular table, with a removable lid, which reveals a bucket. Fill the bucket with ice cold water, and use it to keep drinks during a garden party. NOTE. My bucket has handles, so two of the yellow connectors are lower than the others. I used decking for all of the parts. https://www.wickes.co.uk/Wickes-Deck-Board---25mm-x-120mm-x-2-4m/p/114551 https://www.wickes.co.uk/Wickes-Plasterer%27s-Rigid-Bucket---30L/p/103976 */ class Cooler : Model { var ww=120 // wood width var wt=25 // wood thickness var gap=5 // Gap to allow for expansion of the lid and base. var diameter = 415 var connectorWidth = 35 var height = 440 // Height of the side pieces. The total height is height + wt * 2 (top and feet) var pieces = 12 // Number of pieces of wood which make up the main body. fun angle() = 360/pieces fun lumber() = Lumber( "boards", ww, wt, "LightGreen" ) .stockLength(2400) fun angled() = Lumber( "angled", PolygonBuilder() .moveTo( wt*Degrees.sin(angle()/2), 0 ) .lineTo( ww-wt*Degrees.sin(angle()/2), 0 ) .lineTo( ww, wt) .lineTo( 0, wt) .build() ) fun slattedCircle (d: double) : Shape3d { val pieces : int = Math.ceil(d / (ww+gap)) val slat = lumber().cut(d).rotate(90,0,0) val slats = slat.repeatX( pieces, ww+gap ).centerX().centerY() return slats.intersection( Cylinder( wt*3, d/2 ).center() ) } fun top() = slattedCircle( diameter + wt*3 ) + slattedCircle( diameter ).rotate( 0,0,90 ).translate(0,0,-wt) fun base() = slattedCircle( diameter ) fun sides() : Shape3d { val side = angled().cut(height).translate( -ww/2, diameter/2, 0 ) val sidesList = ArrayList() for ( i in 1..pieces ) { sidesList.add(side.rotate( 0, 0, angle()*i )) } return Union3d( sidesList ).color("Green") } fun connector() = (( Square( ww*0.4, connectorWidth*2 ).rotate( 360/pieces ).translate(ww/2,0) + Square( ww, connectorWidth*2 ).translate(-ww/2,0) + Square( ww*0.4, connectorWidth*2 ).translate(-ww*0.4,0).rotate( -360/pieces ).translate(-ww/2,0) ).translate(0,-diameter/2) - Circle( diameter/2 - connectorWidth ) ).extrude( wt ) fun foot() = Cylinder( wt, ww/2 ).translate(diameter/2-ww/2+wt/2,0,-wt).color( "Blue" ) override fun build() : Shape3d { return top().translate( 0,0,height + 200) + sides() + connector().translate( 0,0, height*0.8).repeatAroundZ(pieces/2) + connector().translate( 0,0, height*0.3).repeatAroundZ(pieces/2) + base() + foot().repeatAroundZ(3) } }