import uk.co.nickthecoder.foocad.gears.v1.* import uk.co.nickthecoder.foocad.gears.v1.* import uk.co.nickthecoder.foocad.screws.v3.* import uk.co.nickthecoder.foocad.extras.v1.* import static uk.co.nickthecoder.foocad.extras.v1.Extras.* import uk.co.nickthecoder.foocad.smartextrusion.v1.* import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.* include Bumper.foocad class Box : Model { var size = Vector3( 450, 550, 350 ) var thickness = 9 @Custom val rackSize = Vector3( 180, 450, 10 ) meth rack() : Shape3d { val outside = Square( rackSize.x, rackSize.y ).roundAllCorners(20).center() return (outside - outside.offset(-rackSize.z )).extrude( rackSize.z ) .previewOnly() .topTo(0).translateY(160) } @Piece meth ramp() : Shape3d { val height = 6 val width = 50 val flat = 10 val shape = Triangle( 60, height ).roundCorner(1,1,1) + Square( flat, height ).rightTo(0) val solid = shape.extrude( width ).rotateX(90).centerY() val screwHoles = Countersink().recess(solid.size.z-4) .topTo(solid.top).translateX(-flat/2) .translateY( solid.size.y/3.5 ) .mirrorY().also() return solid - screwHoles } var gearThickness = 8 val gearConfig = GearConfig.lego().module(3) val gear = InvoluteGear( gearConfig, 17 ) @Piece meth plainCog() : Shape3d { val hole = Circle(3).extrude(gearThickness*3).center() val spur = gear.spurProfile().smartExtrude(gearThickness) .edges(Chamfer(0.4)) return spur - hole } @Piece meth lockingCog() = lockingCog(false) @Piece meth lockingCogAlt() = lockingCog(true) meth lockingCog(alt : bool) : Shape3d { val fatProfile = Square( 10 ).center().roundAllCorners(2,1) val fatPath = PolygonBuilder().apply { moveTo( 0, -18 ) lineTo( 0, -40 ) circularArcBy( Vector2( 10, -10 ), 10, false, true ) lineBy( 10, 0 ) }.buildPath() val leverPath = PolygonBuilder().apply { moveTo( 18,0 ) lineTo( 80,0 ) }.buildPath() val extrusions = ( fatProfile.extrude(fatPath).translateX(-2) + fatProfile.extrude(leverPath).rotateZ(35) ).bottomTo(0) val main = if (alt) { extrusions.mirrorX() } else { extrusions } return main + plainCog() } @Piece meth previewCogs() : Shape3d { val plainA = plainCog().translateX( gear.pitchRadius() ) val plainB = plainCog().translateX( -gear.pitchRadius() ) val lockingA = lockingCog().translateX( gear.pitchRadius() * 3 ) val lockingB = lockingCogAlt().translateX( -gear.pitchRadius() * 3 ) val cogs = (plainA + plainB + lockingA + lockingB) .rotateX(90).mirrorY() .frontTo(size.y/2) .bottomTo(-20) return cogs + rack() } @Piece meth guide() : Shape3d { val width = 10 val height = 7 val shape = Square( width, height ) .roundCorner(1,1) .roundCorner(0,1) .center() val path = PolygonBuilder().apply { moveTo(0,-50) radius(9) lineTo(0,0) radius(0) lineTo(100,0) bezierBy( Vector2( 40, 0 ), Vector2(30,0), Vector2( 100, 30 ) ) lineBy( 10, 0 ) }.buildPath() val main = shape.extrude(path).bottomTo(0) val ends = Circle( width/2 ) .translate( path.points[0] ) .centerTo( path.points[path.points.size()-1] ).also() .smartExtrude(height) .top( Fillet(1) ) val screwHole = Countersink() .topTo( main.top ) val screwHoles = screwHole.translateX(10) .translateX(80).also() + screwHole.centerXTo( main.right - 10).centerYTo(30) + screwHole.translateY(-40) return main + ends - screwHoles } override meth build() : Shape3d { val outline = Cube( size ).centerXY().previewOnly() val rack = rack() val bumper = Bumper().apply { } val corners = bumper.cornerBumper().mirrorZ().color("DimGray") .leftTo( outline.left ).frontTo( outline.front ).topTo( outline.top ) .mirrorX().also() .mirrorY().also() .mirrorZ().bottomTo(0).also(2) val edges = bumper.screwEdgeBumper().color( "DimGray" ) .leftTo( outline.left ).frontTo( outline.front ).centerZTo( size.z/2 ) .mirrorX().also() .mirrorY().also() val base = Square( size.x, size.y ).extrude( thickness ).centerXY() .color( "Green" ) val ends = Cube( size.x - thickness*2, thickness, size.z - thickness ) .centerX().frontTo( outline.front ).bottomTo( base.top ) .mirrorY().also() .color( "Orange" ) val sides = Cube( thickness, size.y, size.z - thickness ) .centerY().rightTo( outline.right ).bottomTo( base.top ) .mirrorX().also() .color( "Yellow" ) val ramp = ramp().rotateZ(90).mirrorZ() .frontTo( rack.front + 10 ) val guides = guide().mirrorZ().rotateZ(90) .frontTo( rack.front-10 ) .rightTo( rack.left+45 ) .mirrorX().also() val lockingCogs = previewCogs() return base + ends + sides + corners + edges + rack + ramp + guides + lockingCogs } }