FooCAD Source Codeclass Buttons : Model {
@Custom
var piece = "all"
var slack = 0.5
var thickness = 4
var raised = 1
var extra = 3
val extraThickness = 1
fun outline() : Shape2d {
//println( SVGParser().parseFile("kobo.svg").shapes )
return SVGParser().parseFile("kobo.svg").shapes["buttons"].center()
//return Square( width - slack*2, height - slack*2 ).center()
// .roundAllCorners(radius-slack)
}
fun button( profile : Shape2d, middle : bool ) : Shape3d {
return ExtrusionBuilder().apply {
crossSection(profile.offset( extraThickness ))
forward(extraThickness)
if (!middle) crossSection( )
crossSection( profile )
forward( thickness - extraThickness )
crossSection()
forward( raised )
crossSection( profile.offset( -raised / 2 ) )
}.build()
}
fun explode( shape : Shape3d ) : Shape3d {
return shape.translate(
0.3*(shape.corner.x + shape.size.x/2),
0.3*(shape.corner.y + shape.size.y/2),
0
)
}
fun exclusion( shape : Shape2d ) : Shape3d {
return ExtrusionBuilder().apply {
forward( -0.1 )
crossSection( shape.offset( extraThickness*1.5 ) )
forward( extraThickness*1.5 + 0.2 )
crossSection( -extraThickness*1.5 )
}.build().color( "Red" )
}
fun scale(buttonP : Shape2d) = buttonP.scale( 1.4,1.25 )
override fun build() : Shape3d {
val middleP = scale(Square( 6 ).center())
val upP1 = PolygonBuilder().apply {
moveTo( -3, 3 )
lineTo( 3, 3 )
lineTo( 2, 9 )
lineTo( -2, 9 )
}.build()
val rightP1 = PolygonBuilder().apply {
moveTo( 3, -3 )
lineTo( 9, -2.5 )
lineTo( 9, 2.5 )
lineTo( 3, 3 )
}.build()
val upP = scale(upP1)
val rightP = scale(rightP1)
val middleExclusion = exclusion( middleP )
val middle = button( middleP, true )
val up = button( upP, false ) - middleExclusion.scaleX(4)
val right = button( rightP, false ) - middleExclusion.scaleY(4)
val down = up.mirrorY()
val left = right.mirrorX()
val center = middleP.offset(slack) +
(upP.offset(slack).mirrorY().also()) +
(rightP.offset(slack).mirrorX().also())
val hole = center.extrude(40).center().color("Red")
val cover = outline()
.extrude( thickness - extraThickness )
.translateZ(extraThickness+0.1)
.color("Green") -
hole
val base = outline().offset(extra)
.extrude( extraThickness )
.color("LightGreen") -
center.offset(extraThickness+0.2).extrude(extraThickness+1).translateZ(-0.5)
// The tramlines were designed to make the button press easier, by
// pressing along the middle of the switch, rather than across the
// whole of the switch's surface.
// Not sure if it works!
val tramLines = (
Cube( 100, 2, 0.6 ).centerX()
.translateY(0.5).mirrorY().also().color("Blue") +
Cube(2,100,0.6)
.translateY(6).mirrorY().also()
.translateX(0.5).mirrorX().also().color("LightBlue")
).translateZ(1000)
val buttons = explode(middle) +
explode(up) + explode(right) +
explode(left) + explode(down)
return if (piece == "base") {
base
} else if (piece == "cover") {
cover
} else if (piece == "buttons" ) {
buttons-tramLines
} else if (piece == "center" ) {
middle - tramLines
} else if (piece == "up" ) {
up - tramLines
} else if (piece == "left" ) {
left - tramLines
} else {
buttons-tramLines +
base.rotateX(180).translateY(35).toOriginZ() +
cover.rotateY(180).translateX(35).toOriginZ()
}
}
}