Exit Full View
Up

/Garden/SimplePlantPotGrid.foocad

SimplePlantPotGrid
FooCAD Source Code
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*
include SimplePlantPot.foocad

class SimplePlantPotGrid : Model {

    // "standard" Wilko sizes : Small67x80.  Medium=90x100
    @Custom( about="Exterior size of the pot. Does not include the feet thickness" )
    var potSize = Vector2( 67, 80 )

    @Custom( about= "Exterior width of the bottom of the pot" )
    var potBottomWidth = 52


    @Custom
    var potCornerRadius = 10

    @Custom( about="The thickness of the pot's rim" )
    var rimThickness = 2.0

    @Custom
    var gridAcross = 3

    @Custom 
    var gridDown = 3

    @Custom
    var gridThickness = 1.2

    @Custom
    var gridHeight = 6.0

    // NOTE, we need individual margins, because I will be printing the grid in two parts,
    // and gluing them together. Each piece will have 3 margins set, and the other at 0.
    @Custom( about="The height that this grid meets the pot. 0 for ground level")
    var forHeight = 0.0

    @Custom( about="Additional margin left/right (to overlap a tray?)" )
    var extraMarginX = 0.0

    @Custom( about="Additional margin front/back (to overlap a tray?)" )
    var extraMarginY = 0.0

    @Custom
    var extraMarginIgnoreFront = true


    @Piece
    fun grid() : Shape3d {

        val simplePlantPot = SimplePlantPot().apply {
            size = potSize
            bottomWidth = potBottomWidth
            cornerRadius = potCornerRadius
        }
        val pot = simplePlantPot.pot()

        val offset = 1 + (potSize.x - potBottomWidth)/2 * (forHeight / potSize.y)

        val inside = simplePlantPot.bottom().offset(offset)
        val profile = inside.offset( gridThickness ) - inside

        val margin = (pot.size.x - profile.size.x ) / 2

        val grid = profile
            .repeatX( gridAcross, pot.size.x )
            .repeatY( gridDown, pot.size.y )
            .extrude( gridHeight )
            .centerXY()
            .color("Red")

        val wings = Square( margin + gridThickness, gridThickness )
            .frontTo( profile.front + potCornerRadius + gridThickness + offset )
            .rightTo( profile.left + gridThickness )
            .mirrorX().also()
            .mirrorY().also()
            .rotate(90).also()
            .extrude( gridHeight )


        val gridOfWings = wings
            .repeatX( gridAcross, pot.size.x )
            .repeatY( gridDown, pot.size.y )
            .centerXY()

        val borderOut = Square(
                grid.size.x + margin*2 + extraMarginX*2,
                grid.size.y + margin*2 + extraMarginY + (if extraMarginIgnoreFront 0 else extraMarginY)
            )
            .roundAllCorners( potCornerRadius + margin + offset )
        val border = (borderOut - borderOut.offset(-gridThickness ) )
            .extrude( gridHeight )
            .centerXY()
            .translateY(if (extraMarginIgnoreFront) extraMarginY/2 else 0)
            .color("Green")


        val wingsLeft = if ( extraMarginX < 0 ) {
            Square(0)
        } else {
            Square( extraMarginX, gridThickness )
                .frontTo( profile.front + potCornerRadius + gridThickness + offset )
                .mirrorY().also()
                .repeatY( gridDown, pot.size.y )
                .centerY()
                .leftTo( border.left )
        }

        val wingsRight = if ( extraMarginX < 0 ) {
            Square(0)
        } else {
            Square( extraMarginX, gridThickness )
                .frontTo( profile.front + potCornerRadius + gridThickness + offset )
                .mirrorY().also()
                .repeatY( gridDown, pot.size.y )
                .centerY()
                .rightTo( border.right )
        }

        val wingsFront = if ( extraMarginY < 0 || extraMarginIgnoreFront ) {
            Square(0)
        } else {
            Square( gridThickness, extraMarginY )
                .leftTo( profile.left + potCornerRadius + gridThickness + offset )
                .mirrorX().also()
                .repeatX( gridAcross, pot.size.x )
                .centerX()
                .frontTo( border.front )
        }

        val wingsBack = if ( extraMarginY < 0 ) {
            Square(0)
        } else {
            Square( gridThickness, extraMarginY )
                .leftTo( profile.left + potCornerRadius + gridThickness + offset )
                .mirrorX().also()
                .repeatX( gridAcross, pot.size.x )
                .centerX()
                .backTo( border.back )
        }


        val marginWings = (wingsLeft + wingsRight + wingsFront + wingsBack).extrude(gridHeight)

        val pots = pot.tileX(gridAcross).tileY(gridDown).previewOnly().centerXY()
        return grid + border + gridOfWings + marginWings//+ xLine + yLine //+ pots
    }

    override fun build() = grid()
}