FooCAD Source Codeimport static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*
/**
A Chess board made from jigsaw style pieces.
For a full set, print "edges" in both colours,
"corner1", "corner4" in one colour, and "corner2" and "corner3" in the other,
finally, two lots of "middles" in each colour.
*/
class ChessSaw : Model {
// Size of a square
val size = 30.0
val thickness = 3.0
var slack = 0.1
@Custom
var piece : String = ""
fun nobble() : Shape2d {
val xa = size* 0.11
val xb = size* 0.2
val yb = size* 0.2
val yc = size* 0.35
val delta = size * 0.1
return PolygonBuilder().apply {
moveTo( xa, -slack )
bezierTo( Vector2(xa-delta, delta), Vector2(xb, yb-delta), Vector2(xb, yb) )
bezierTo( Vector2(xb, yb+delta), Vector2(delta, yc), Vector2(0, yc) )
bezierTo( Vector2(-delta,yc), Vector2(-xb,yb+delta), Vector2(-xb, yb) )
bezierTo( Vector2(-xb,yb-delta), Vector2(-xa+delta, delta), Vector2(-xa, -slack) )
}.build().scale(0.7).translate(size*0.07, size*0.5).color("Green")
}
fun square() : Shape2d {
return Square( size-slack ).center()
}
fun make3d( shape : Shape2d ) : Shape3d {
return shape.extrude( thickness )
}
override fun build() : Shape3d {
val square : Shape2d = square()
val nobble : Shape2d = nobble()
val nibble = nobble.offset(slack).translateY(-size)
val corner1 = make3d(square +
nobble +
nobble.mirrorX().rotate(-90)
)
val edge1 = make3d(square +
nobble +
nobble.mirrorX().rotate(-90) -
nibble
)
val corner2 = make3d(square +
nobble.mirrorX().rotate(-90) -
nibble
)
val edge2 = make3d(square +
nobble +
nobble.mirrorX().rotate(-90) -
nibble.mirrorX().rotate(-90)
)
val corner3 = make3d(square +
nobble -
nibble.mirrorX().rotate(-90)
)
val edge3 = make3d( square +
nobble -
nibble.mirrorX().rotate(-90) -
nibble
)
val corner4 = make3d(
square -
nibble.mirrorX().rotate(-90) -
nibble.rotate(0)
)
val edge4 = make3d( square +
nobble.mirrorX().rotate(-90) -
nibble -
nibble.mirrorX().rotate(-90)
)
val middle = make3d( square +
nobble +
nobble.mirrorX().rotate(-90) -
nibble -
nibble.mirrorX().rotate(-90)
)
return if (piece == "middle" ) {
middle
} else if (piece == "corner1" ) {
corner1
} else if (piece == "corner2" ) {
corner2
} else if (piece == "corner3" ) {
corner3
} else if (piece == "corner4" ) {
corner4
} else if (piece == "edge1" ) {
edge1
} else if (piece == "edge2" ) {
edge2
} else if (piece == "edge3" ) {
edge3
} else if (piece == "edge4" ) {
edge4
} else if (piece == "edges" ) {
edge1.tileX(3,3) +
edge2.tileX(3,3).translateY(size*1.5) +
edge3.tileX(3,3).translateY(size*3) +
edge4.tileX(3,3).translateY(size*4.5)
} else if (piece == "middles" ) {
middle.tileX(3,3).tileY(3,3)
} else {
corner1.color("Yellow") +
(
edge1.color("Blue") +
edge1.color("Yellow").translateY(size)
).repeatY( 3, size*2 ).translateY(size) +
corner2.color("Blue").translateY(size*7) +
(
edge2.color("Blue") +
edge2.color("Yellow").translateX(size)
).repeatX( 3, size * 2 ).translateX(size) +
corner3.color("Blue").translateX(size*7) +
(
edge3.color("Yellow") +
edge3.color("Blue").translateY(size)
).repeatY(3, size * 2 ).translate(size*7, size, 0 ) +
corner4.color("Yellow").translate(size*7,size*7,0) +
(
edge4.color("Yellow") +
edge4.color("Blue").translateX(size)
).repeatX(3, size * 2).translate(size, size*7,0) +
(
middle.color("Yellow") +
middle.color("Blue").translateX(size) +
middle.color("Blue").translateY(size) +
middle.color("Yellow").translate(size,size,0)
).repeatX(3,size*2).repeatY(3,size*2).translate(size, size, 0 )
}
}
}