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