Exit Full View
Up

/New/LampShade.foocad

LampShade
FooCAD Source Code
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*

class LightShade : Model {
    
    var tubeHeight = 150
    var tubeDiameter = 70
    var tubeInterior = 64

    var ledLength = 150
    var ledWidth = 20
    var ledCount = 6

    fun topClip() : Shape3d {

        val ring = (Circle( tubeInterior /2 ) - Circle( tubeInterior /2 - 4 ))
            .extrude( 12 ).convexity(4)
        val spokes = Cube( tubeInterior / 2, 6, 6 )
            .centerY()
            .rotateZ(45)
            .repeatAroundZ( 4 )

        val tie = Cylinder( 20, 10 )
        val hole = Cylinder( 60, 5 ).center()
        val slot = Cube( tubeInterior, 3, 100).center()
        val tabs = PolygonBuilder().apply {
            moveTo( -tubeInterior/2 + 4, 0 )
            lineTo( -tubeInterior/2 + 4, 10 )
            bezierTo(
                Vector2(-tubeInterior/2 + 5, 12),
                Vector2(-20,20),
                Vector2(-10, 20)
            )
            lineTo( 10, 20 )
            bezierTo(
                Vector2(10, 20),
                Vector2(20,20),
                Vector2(tubeInterior/2 - 4, 12)
            )
            lineTo( tubeInterior/2 - 4, 0 )
        }.build().extrude( 10 ).centerZ().rotateX(90)
            //Cube( tubeInterior-5, 10, 20 ).centerXY()

        return tie + tabs - hole - slot + ring
    }

    override fun build() : Shape3d {

        val tube = (Circle( tubeDiameter/2 ) - Circle( tubeDiameter/2-2 ))
            .extrude( tubeHeight )
            .center()
            .color("Silver")
            
        val led = Cube( 2, ledWidth, ledLength )
            .centerY().centerZ()
            .translateX( tubeDiameter / 2 )

        val leds = led.repeatAroundZ( ledCount )

        val topClip = topClip()

        return leds + tube +
            topClip.translateZ( tubeHeight / 2 - 12 )
    }
}