Exit Full View
Up

/GardenFurniture/General.foocad

General
FooCAD Source Code
import static uk.co.nickthecoder.foocad.along.v2.Along.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*

import java.util.ArrayList

class General : Model {
    
    var ww =120
    var wt = 24

    var gap = 5

    var lumber = Lumber( "decking", ww, wt, "ForestGreen" ).stockLength(2400)

    fun ring( lumber : Lumber, length : double, width : double, withCorner : bool ) : Shape3d {
        val insideWidth = width - lumber.thickness()*2
        val side = lumber.cut( length ).label("side").alongX()
        val end = lumber.cut( insideWidth ).label("end").rotate(0,0,90).alongY2()

        val ring = side.translate( -length/2, -width/2, 0 ).mirrorY().also() +
            end.translate( length/2-wt, -insideWidth/2, 0 ).mirrorX().also().darker()
        return if ( withCorner ) {
            ring + ringCorners( length, width )
        } else {
            ring
        }
    }

    fun ringCorners( length : double, width : double ) : Shape3d {
        return Cube( wt, wt, 100 ).translate( - length/2 + wt, -width/2 + wt, ww - 50 )
            .mirrorX().also()
            .mirrorY().also()
    }

    fun rings( lumber: Lumber, length : double, width : double, gap : int, n : int ) : Shape3d {
        return rings( lumber, length, width, gap, n, true )
    }

    fun rings( lumber: Lumber, length : double, width : double, gap : int, n : int, withCorner : bool) : Shape3d {
        val list = ArrayList<Shape3d>()
        for ( i in 0 until n ) {
            list.add( ring( lumber, length, width, i < n-1 && withCorner ).translate( 0, 0, i * (lumber.width()+gap) ) )
        }
        return Union3d( list )
    }

    /*
        Note, the corners are only screwed to the BOTTOM piece. This allows each ring to be removed,
        and also allows it to take on different shapes, either symetrical, or overhanging on one side onljy
        (which is better when used as a seat).
    */
    fun expandingRings( lumber: Lumber, length : double, width : double, gap : int, n : int ) : Shape3d {
        val list = ArrayList<Shape3d>()
        for ( i in 0 until n ) {
            list.add( ring( lumber, length, width + wt*i, i < n-1 ).translate( 0, 0, i * (lumber.width()+gap) ) )
        }
        return Union3d( list )
    }

    fun slattedFloor( length : double, width: double ) : Shape3d {
        val slats = Math.ceil( length / 250 )
        val slat = Cube( wt, width - wt * 2, wt * 2 ).center().translate(0,0,ww/2)
        return slat.spreadX( slats, length, 0.5 ).translate( -length/2, 0, 0 )
    }

    fun foot() : Shape3d {
        return lumber.cut( 100 ).alongX().color( "Blue" )
    }

    fun feet( length : int, width : int ) : Shape3d {
        return foot().translate( -length*0.4, -width/2 + wt, -50 )
            .mirrorX().also()
            .mirrorY().also()
    }

    fun lid( length : int, width : int, height : int ) : Shape3d {
        val pieceCount = Math.floor( width / (lumber.width() + gap ) )
        val piece = lumber.cut( length ).alongX().rotate(90,0,0).color( "LightGreen")
        val pieces = piece.spreadY(pieceCount, width).centerY().centerX()

        val slat = Cube( wt, width - ww, wt )
        val slats = slat.spreadX( 3, length / 1.4 ).translate( 0,0,-wt).centerY().centerX()

        return (pieces + slats).translate(0,0,height)
    }

    override fun build() : Shape3d {
        return Cube(1)
    }

}