Exit Full View
Up

/New/SheetEdge.foocad

SheetEdge
FooCAD Source Code
import static uk.co.nickthecoder.foocad.layout.Debug.*

class SheetEdge : Model {
    
    val name = "Sheet Edge"
    var sheetThickness = 4 // Including any slack
    val slotDepth = 5
    val thickness = 2

    val radius = 8
    val roundedSides = 8

    fun profile2() : Shape2d {
        val width = slotDepth + thickness*2 + sheetThickness
        val shape = PolygonBuilder().apply {
            moveTo(0,0)
            lineTo(width,0)
            lineTo(width, width)
            lineTo(width-thickness, width)
            lineTo(width-thickness, width-slotDepth)
            lineTo(width-thickness-sheetThickness, width-slotDepth)
            lineTo(width-thickness-sheetThickness, width)
            lineTo(slotDepth, width)
            lineTo(slotDepth, width-slotDepth)
            lineTo(0, width-slotDepth)
            lineTo(0, thickness + sheetThickness )
            lineTo(slotDepth, thickness + sheetThickness )
            lineTo(slotDepth, thickness)
            lineTo(0,thickness)
        }.build()
        return if (roundedSides > 0) {
            shape.roundCorner(1, radius, roundedSides)
        } else {
            shape
        }
    }

    fun plainProfile() : Shape2d {
        val width = slotDepth + thickness*2 + sheetThickness
        val shape = PolygonBuilder().apply {
            moveTo(0,0)
            lineTo(width,0)
            lineTo(width, width)
            lineTo(slotDepth,width)
            //lineTo(slotDepth,width-slotDepth)
            lineTo(0,width-slotDepth)
        }.build()
        return if (roundedSides > 0) {
            shape.roundCorner(1, radius, roundedSides)
        } else {
            shape
        }
    }

    fun lumber() = Lumber( name, plainProfile() )

    fun plain(length : double) : Shape3d {
        return lumber().cut(length)
    }

    fun mitred(length : double) : Shape3d {
        val lumber = lumber()
        val result = lumber.cut( length )
            .cutZRatio( MitreJoint( lumber, 1 ), 0 )
            .cutZRatio( MitreJoint( lumber, 1 ).otherEnd(), 1 )
        return result
    }

    fun corner() : Shape3d {
        return plainProfile().revolve(90).sides(roundedSides*8)
    }

    override fun build() : Shape3d {
        val plain = plain(104).rotateZ(-90).toOrigin().center()
        
        //val corner = corner(30,20)

        val end = plain.translateX(-60).mirrorX().also() +
            plain.rotateY(90).translateZ(60).mirrorZ().also()

        val edges = plain.rotateX(90).translate(-60,0,-60).mirrorX().also()
            .mirrorZ().also()

        val square = PolygonBuilder().apply {
            moveTo(140,0)
            lineTo(0,0)
            lineTo(0,140)
        }.build().roundAllCorners(3) // Square(100).roundAllCorners(3)
        val side = plainProfile().mirrorY().extrude( square ).toOrigin()

        val cube = corner().translate(60-9,60-9,-60-9).color("Green") +
            edges + end.translateY(-60).mirrorY().also()

        val all = side + side.rotateY(90).mirrorZ() + side.rotateX(90).mirrorY()

        val foo = thickness*2 + sheetThickness //slotDepth
        val glass = Cube( 50,50, sheetThickness ).color("Red")
            .translate(foo, foo,thickness)
 
        val glasses =  glass + glass.rotateX(90).mirrorY() + glass.rotateY(90).mirrorZ()
        val cut = all - glasses

        return cut.intersection( Cube(30) )
    }

}