import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.* import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.* import static uk.co.nickthecoder.foocad.arrange.v1.Arrange.* import uk.co.nickthecoder.foocad.threaded.v2.* import static uk.co.nickthecoder.foocad.threaded.v2.Thread.* import static uk.co.nickthecoder.foocad.extras.v1.Extras.* class CornerClamp : Model { @Custom( about="Max width of wood that can fit in the clamp" ) var gap = 65 @Custom( about="Length,thickness,height" ) var blockSize = Vector3(60, 5, 30) @Custom var baseThickness = 3 @Custom var endSize = Vector3(20, 30, 20) @Custom var footThickness = 5 @Custom var thread = Thread(10) .headSize(Vector2(20,10)) .headChamfer(1) .rodChamfer(0.1) .clearance(0.3) fun end() : Shape3d { val end = Square( endSize.x, endSize.y ) .roundAllCorners(3) .leftTo( gap ) .extrude( baseThickness + endSize.z ) val hole = thread.threadedHole( endSize.x ) .rotateY(90) .rightTo( end.right ) .centerYTo( end.middle.y ) .centerZTo( baseThickness + endSize.z/2 ) return end - hole } @Piece fun bolt() : Shape3d { return thread.bolt( gap + endSize.x + footThickness ).color("Orange") } @Piece fun foot() : Shape3d { val base = Square( endSize.x, blockSize.z - 2 ) .center() .roundAllCorners(3) .extrude( footThickness ) val hole = thread.threadedHole( base.size.z - 0.5 ) .clipped(true) .topTo( base.top ) return (base - hole).color("Orange").darker() } @Piece fun clamp() : Shape3d { val triangle = Triangle( blockSize.x, blockSize.x ) .roundAllCorners(2) .rotate(180) val block = (triangle - triangle.offset(-blockSize.y)) .extrude( blockSize.z ) val base = Square( blockSize.x + gap + endSize.x ) .roundCorner(2,blockSize.x + (blockSize.x - endSize.y)/2,1) .roundCorner(0,blockSize.x,1) .roundAllCorners(10) .extrude( baseThickness ) .leftTo( -blockSize.x ) .frontTo( -blockSize.x ) val xEnd = end().centerYTo( triangle.middle.y ) val yEnd = end().rotateZ(90).centerXTo( triangle.middle.x ) return base + block + xEnd + yEnd } override fun build() : Shape3d { val bolts = bolt().tileY(2,1).rightTo(-1).frontTo(1) val feet = foot().tileY(2,1).rightTo(-1).backTo(-1) val clamp = clamp().leftTo(1) return bolts + feet + clamp } }