FooCAD Source Codeimport uk.co.nickthecoder.foocad.smartextrusion.v1.*
import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*
import uk.co.nickthecoder.foocad.screws.v3.*
import uk.co.nickthecoder.foocad.extras.v1.*
import static uk.co.nickthecoder.foocad.extras.v1.Extras.*
class BikeRackClip : Model {
var size = Vector3( 100, 20, 0.9 )
var prongSize = Vector2( 30, 10 )
var blockSize = Vector2( 30, 10 )
var gap = 60
var countersink = Countersink()
var radius = 3
var runnerSize = Vector3( 16, 12, 2 )
var runnerBlockSize = Vector3( 0, 14, 4 )
@Piece
meth runner() : Shape3d {
val profile = Square( runnerSize.z + runnerBlockSize.z, runnerSize.y + runnerBlockSize.y ) -
Square( runnerBlockSize.z, runnerSize.y )
.roundCorner(2,runnerBlockSize.z)
.toPolygon()
val main = profile
.extrude( runnerSize.x )
.rotateY(90)
.bottomTo(0)
.centerXY()
val envelope = Square( runnerSize.x, runnerSize.y + runnerBlockSize.y )
.roundAllCorners( 4 )
.extrude( runnerSize.z + runnerBlockSize.z + 2 )
.centerXY().bottomTo(-1)
val holes = countersink.mirrorZ()
.spreadX(3,main.size.x, 0.25)
.centerX()
//.centerYTo(main.back - runnerBlockSize.y/2)
.frontTo( main.front + runnerSize.y )
return main.intersection( envelope ) //- holes
}
@Piece
meth clip() : Shape3d {
val base = Square( size.x, size.y )
.centerY()
.roundCorner( 3, radius )
.roundCorner( 0, radius )
.extrude( size.z )
val prongProfile = Triangle( prongSize.x, prongSize.y, -1 ) -
Square( 7, 4 )
.frontTo( 1 )
.leftTo( 2 )
val prong = prongProfile
.extrude( size.y )
.rotateX(90)
.bottomTo( size.z )
.centerY()
.rightTo( base.right )
val block = Square( blockSize.x, size.y )
.centerY()
.roundAllCorners( radius )
.extrude( blockSize.y )
val holes = countersink.mirrorZ()
.centerXTo( blockSize.x / 4 )
.centerXTo( blockSize.x * 3 / 4 ).also()
return base + prong //+ block - holes
}
@Piece
meth lever() : Shape3d {
val leverProfile = Square( 8, 100 ).centerX() +
Square( 20, 30 )
.centerX()
.roundAllCorners(5) +
Square( 14, 4 )
.centerX()
.roundAllCorners(1)
.translateY( 50 ).translateY(-12).also().translateY(24).also()
val lever = leverProfile
.smartExtrude( 3 )
.bottom( Chamfer(1) )
.top( Fillet( 1 ) )
// Not used any more
val spine = Square( 3, lever.size.y - 24 )
.roundAllCorners(1)
.smartExtrude( 6 )
.top( Fillet(1) )
.centerX()
.backTo(lever.back-3)
val tip = Square( 5, size.y/2 + 1 ).centerX().frontTo(lever.back-2)
.extrude( 3 )
return (lever + tip).color("Green")
}
meth pivotProfile() = Square( 40, 10 )
.roundAllCorners(2)
.center()
@Piece
meth pivot() : Shape3d {
val main = pivotProfile()
.smartExtrude(14)
val crossProfile = Square( 10, 20 ).center() +
Square( 16, 5).center()
val cross = crossProfile
.extrude( 8 )
.topTo( main.top + 0.1 )
val holes = countersink
.topTo(main.top+2)
.centerXTo( main.left + 6 )
.mirrorX().also()
return main - cross - holes
}
@Piece
meth pivotLid() : Shape3d {
val main = pivotProfile().extrude(2)
val holes = countersink
.topTo(main.top)
.centerXTo( main.left + 6 )
.mirrorX().also()
return (main - holes).color("Orange").darker()
}
@Piece( printable = false )
override meth build() : Shape3d {
val clip = clip().centerX()
val lever = lever().mirrorZ()
.backTo(-2)
.translate( 25.5, 0, 6 )
.rotateX(2.5)
val pivot = pivot()
val lid = pivotLid().bottomTo(pivot.top)
val pivotAndLid = (pivot + lid)
.mirrorZ()
.centerXTo( lever.middle.x )
.centerYTo(-59)
.topTo(clip.top)
val runner = runner()
.leftTo(60)
.frontTo( clip.back + 10 ).mirrorY().also()
return clip + lever + pivotAndLid + runner
}
}