Exit Full View
ZipUp

/Tools/ZipTie.foocad

ZipTie

Zip ties inspired by SunShine : https://www.youtube.com/watch?v=AJyiSVeIEqY

Thread some TPU through the holes to complete the zip tie.

NOTE. Do NOT try to print one at a time, as the small size will probably prevent one layer cooling before the next layer starts.

FooCAD Source Code
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*
import static uk.co.nickthecoder.foocad.chamferedextrude.v1.ChamferedExtrude.*

class ZipTie : AbstractModel() {

    val size = Vector3( 9.5, 5.5, 2.8 )
    val diameter = 2.15
    val overhang = 2.0
    val offset = 2.75
    val anvilHeight = 2

    val across = 4
    val down = 4
   
    fun one(diameter : float, overhang : float) : Shape3d {
        val base = Square( size.x, size.y )
            .center().roundAllCorners( size.y / 6 )
            .extrude( size.z )

        val hole = Circle( diameter / 2 ).sides(20)
            .chamferedExtrude(size.z+1, -0.8, 0)
            .translate(offset, 0, -0.001)
        val holes = hole.mirrorX().also().translateZ(-0.01)

        val chamfer = 1
        val anvil = ExtrusionBuilder().apply {
            crossSection(Square( offset *2 - diameter, size.y ).center())
            forward( anvilHeight *0.25)
            crossSection(Square( offset *2 - diameter, (size.y + diameter)/2).center())
            forward( anvilHeight *0.75)
            crossSection(Square( offset *2 - diameter + overhang, diameter ).center())
        }.build()
            .bottomTo(base.top)

        return (base + anvil) - holes
    }

    /**
     * 7 clips, each with a different diameters
     * NOTE. The speed and layer height will probably affect the finish result,
     * The center item uses "diameter".
     * Once you have worked out the best diameter (the filament should just fit in the hole),
     * move on to "overhangVariations"
     */
    @Piece
    fun diameterVariations() : Shape3d {
        val variation = 0.05
        val overhangVariation = 0.2

        val items = listOf<Shape3d>()
        for (i in 0 .. 6) {

            items.add(
                one( diameter + variation * (i-3), 0 )
                    .translateY( i * (size.y + 1) )
            )
        }
        items.add(
            Cube( 1.5, (size.y + 1)* 6, 0.4 ).centerX()
        )
        
        return Union3d( items )
    }

    @Piece
    fun overhangVariations() : Shape3d {
        val variation = 0.2

        val items = listOf<Shape3d>()
        for (i in 0 .. 6) {

            items.add(
                one( diameter, overhang + variation * (i-3) )
                    .translateY( i * (size.y + 1) )
            )
        }
        items.add(
            Cube( 1.5, (size.y + 1)* 6, 0.4 ).centerX()
        )
        
        return Union3d( items )
    }

   
    /**
     * 16 clips in a 4x4 grid
     */
    @Piece
    fun many() : Shape3d {
        val one = one( diameter, overhang )
        val many = one
            .tileX(across, 1).tileY(4, 1).centerXY()
        val lineY = Square( 1, many.size.y )
            .repeatX( across, many.size.x/across )
            .center()
            .extrude(0.4)
        val lineX = Square( many.size.x-1, 1 )
            .repeatY( down, one.size.y + 1 )
            .center().frontTo(many.front+0.1)
            .extrude(0.4)
        return many + lineX + lineY
    }

    override fun build() : Shape3d {
        return one(diameter, overhang)
    }
}