import static uk.co.nickthecoder.foocad.chamferedextrude.v1.ChamferedExtrude.* import uk.co.nickthecoder.foocad.threaded.v2.* import static uk.co.nickthecoder.foocad.threaded.v2.Thread.* class Clamp : AbstractModel() { @Custom( about="The internal size of the clamp" ) var size = Vector2(20,25) @Custom( about="Width and thickness" ) var thickness = 10 @Custom var threadDiameter = 6.0 @Custom var footSize = Vector2(9,4) @Custom var clearance = 0.35 meth thread() = Thread(threadDiameter) .headSize(Vector2(threadDiameter*2,threadDiameter*8/6)) .headChamfer(threadDiameter/6) .rodChamfer(threadDiameter/60) .clearance(clearance) @Piece fun clamp() : Shape3d { val thread = thread() val profile = Square( size.x + thickness, size.y + thickness * 2 ).centerY() - Square( size ).centerY() val c = profile.toPolygon().roundAllCorners(2).chamferedExtrude( thickness, 1 ) val hole = thread.threadedHole( thickness*2 + 2 ) .center() .rotateX(90) .translate( thickness/2, 0, thickness/2 ) .frontTo( profile.front - 1 ) return c - hole } @Piece fun bolt() : Shape3d { return thread().bolt( size.y + thickness + 2 ) } @Piece fun boltFlat() : Shape3d { val thread = thread() val bolt = thread.bolt( size.y ) .rotateX(90) .translateZ(thread.coreRadius() * 0.8 ) val slice = Cube( size.y*2 ).centerX().topTo(0).backTo(0) return bolt - slice } @Piece fun foot() : Shape3d { val thread = thread() val foot = Circle( footSize.x/2 ) .chamferedExtrude( footSize.y, 0.4, 1 ) val hole = thread.threadedHole( foot.top ).clipped().bottomTo( 1 ) return foot - hole } @Piece fun bigBase() : Shape3d { val base = Square( size.x+thickness-2 ).center().roundAllCorners(1) .chamferedExtrude( thickness*0.7, 0.4, 1 ) val slot = Cube(100, thickness+0.3, 100).centerY() .leftTo(base.left + thickness) .bottomTo(2) return base - slot } meth preview() : Shape3d { val clamp = clamp().mirrorY() val bolt = bolt().rotateX(90).translate( thickness/2, -clamp.front + thickness, thickness/2 ) return clamp + bolt.previewOnly() } override fun build() : Shape3d { return foot().translateX(-thickness*1.5) + bolt() + clamp().translateX(-thickness/2) } }