FooCAD Source Codeimport uk.co.nickthecoder.foocad.smartextrusion.v1.*
import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.*
import static uk.co.nickthecoder.foocad.chamferedextrude.v1.ChamferedExtrude.*
import static uk.co.nickthecoder.foocad.arrange.v1.Arrange.*
class VapeTorch : Model {
var batterySize = Vector2( 40, 14 )
var chargerSize = Vector3( 18, 29, 4 )
var clearance = 0.1
var thickness = 1.2
var lipSize = 3
var usbSize = Vector2( 10, 3.5 )
var switchBodySize = Vector2( 11, 6 )
var switchHeadSize = Vector3( 3.5, 3.5, 6 )
fun battery() = Circle( batterySize.y/2 ).extrude( batterySize.x ).previewOnly()
fun chargerModule() : Shape3d {
val board = Square( chargerSize.x + 0.1, chargerSize.y ).centerX().extrude(2)
val usb = Cube( 6, 6, 3 ).centerX().frontTo( board.front - 2 ).bottomTo( board.top )
return (board + usb).color("Green")
}
fun profile() = Square( chargerSize.x, chargerSize.z ).centerX() hull
Circle( batterySize.y / 2 ).frontTo( chargerSize.z )
@Piece
fun chargerEnd() : Shape3d {
val profile = profile()
val height = Math.max( chargerSize.y, batterySize.x ) + thickness * 2 + lipSize + clearance
val chamfer = thickness * 0.8
val case = ExtrusionBuilder().apply {
crossSection( profile.offset(thickness - chamfer) )
forward( chamfer )
crossSection( chamfer )
forward( height + thickness - chamfer )
crossSection()
crossSection( - thickness )
forward( -height )
crossSection()
}.build()
val battery = battery().translateY(5)
.bottomTo( thickness )
.frontTo( chargerSize.z )
val module = chargerModule().rotateX(90).mirrorY()
.translateZ( thickness + 0 )
.previewOnly()
val endStop = Cube( case.size.x, thickness + 2, thickness ).centerX()
.bottomTo( chargerSize.y + thickness )
.frontTo( case.front )
.color("Orange")
val usbHole = Square( usbSize ).centerX().translateY(0.5)
.extrude(4)
.bottomTo(-1)
val batteryRing = (
Circle( thickness + batterySize.y / 2 ) -
Circle( batterySize.y / 2 ) -
Square( batterySize.y ).centerX().translateY(batterySize.y* 0.38)
).extrude( 15 )
val batteryShelf = (batteryRing - Cube( 100 ).centerX().rotateX(-45))
.rotateZ(180)
.translateY( chargerSize.z + batterySize.y/2 )
.translateZ(10)
return case - usbHole + endStop + batteryShelf
}
@Piece
fun ledEnd() : Shape3d {
val profile = profile()
val chamfer = thickness * 0.8
val height = 10
val case = ExtrusionBuilder().apply {
crossSection( profile.offset(thickness - chamfer) )
forward( chamfer )
crossSection( chamfer )
forward( height + thickness - chamfer )
crossSection()
crossSection( - thickness - clearance )
forward( lipSize )
crossSection()
crossSection( -thickness )
forward( -lipSize - thickness )
crossSection()
forward( - thickness )
crossSection( thickness + clearance )
forward( -height + thickness*2 )
crossSection()
}.build()
val ledHeight = 8
val ledRadius = 2.5
val offset = chargerSize.z + batterySize.y/2 + 2
val ledHole = Cylinder( ledHeight+1, ledRadius )
.bottomTo(-0.1)
.centerYTo( offset )
val ledCase = Cylinder( ledHeight, ledRadius + thickness )
.centerYTo( offset )
val switchHole = Cube( switchBodySize.x, switchBodySize.y, thickness*3 )
.center()
.centerYTo( switchBodySize.y / 2 + thickness )
return case + ledCase - ledHole.color("Red") - switchHole
}
@Piece
fun switchKnob() : Shape3d {
val block = (
profile().offset( thickness ) intersection
Square( 100, 14 ).center()
)
.toPolygon()
.roundAllCorners(2)
.smartExtrude( switchHeadSize.z + 1 )
.top( Fillet( 1.5 ) )
val hole = Square( switchHeadSize.x, switchHeadSize.y )
.center()
.centerYTo( switchBodySize.y / 2 )
.translateX( switchHeadSize.x / 2 )
.chamferedExtrude( switchHeadSize.z, -0.6, 0 )
return block - hole
}
@Piece
fun all() = arrangeX( 2, chargerEnd(), ledEnd(), switchKnob() )
override fun build() : Shape3d {
val chargerEnd = chargerEnd()
val ledEnd = ledEnd().mirrorZ().bottomTo( chargerEnd.top - lipSize+clearance )
val battery = battery().backTo( chargerEnd.back-thickness ).bottomTo( thickness * 2 )
return chargerEnd + ledEnd + battery
}
}