import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.* import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.* import static uk.co.nickthecoder.foocad.extras.v1.Extras.* import static uk.co.nickthecoder.foocad.screws.v1.Screws.* /** I don't like this design... The most stress is going through the small parts along the layer lines. Bad! */ class CableTieMount : Model { @Custom var tieWidth = 8.0 // Thickness of the slot (so this should be slightly larger than the // thickness of the cable tie). The final piece is 3 times this thickness. @Custom var thickness = 2 // If you change tieWidth, change this appropriately too. @Custom var width = 20 // Can be as long as you like (the minimum size relates to the screwHeadD // as the difference between these two is the "strength" in the X axis. @Custom var depth = 25 // The size of the hole - make this a little larger than your screw head size. @Custom var screwHeadD = 8 // Make this slightly larger than your screw's shank. @Custom var holeDiameter = 3 // Size of the chamfer. Note I chose not to use rounding, because printing the // piece upright would then be problematic. @Custom var chamfer = 2 // How many pieces to print in one go. @Custom var across = 2 @Custom var down = 5 /** The shape is defined with the base on the Z=0 plane, but it stood up on end for strength. Otherwise the strain would be through the layer lines. */ override fun build() : Shape3d { val profile = Square( depth, width ) .center() .roundAllCorners( chamfer, 1 ) val base = profile.extrude( thickness*3 ) //(profile - profile.offset(-thickness/2)).extrude( thickness * 2 ) val hole = countersink( holeDiameter, screwHeadD, thickness*2, thickness*4 ) .translateZ( thickness * 3 ) val slot = Cube( depth + 2, tieWidth, thickness ) .centerXY() .translateZ(thickness) val result = base - hole - slot return result.rotateX(90).toOriginZ() .tileX( across, 2 ) .tileY( down, 2 ) } }