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 ) } }