FooCAD Source Codeimport 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 )
}
}