Exit Full View
ZipUp

/Hardware/CableTie.foocad

CableTie
FooCAD Source Code
import uk.co.nickthecoder.foocad.smartextrusion.v1.*
import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.*

class CableTie : Model {

    var size = Vector3( 20, 20, 6 )

    var holeSize = Vector2( 2, 2.3 )

    var wiggle = 1.0

    var chamfer = 0.4

    meth hole( length : double ) : Shape3d {
        val dir = Vector2( 0, length / 6 )
        val path = PolygonBuilder().apply {
            moveTo(0,-1)
            lineBy(0,1)
            bezierBy( dir, dir,Vector2( wiggle/2, length * 0.3 ) )
            bezierBy( dir, dir,Vector2( -wiggle, length * 0.4 ) )
            bezierBy( dir, dir,Vector2( wiggle/2, length * 0.3 ) )
            lineBy(0,1)

        }.buildPath()

        return Square( holeSize ).center()
            .extrude( path )
            .centerY()
    }

    @Piece
    meth parallel() : Shape3d {
        val block = Square( size.x, size.y ).center()
            .roundAllCorners( chamfer )
            .smartExtrude( size.z )
                .edges( Chamfer(chamfer) )

        val offset = size.x*0.25
        val hole = hole( size.y )
            .centerZTo( block.middle.z )
            .translateX( offset )
            .translateX( -offset * 2).also()
        
        return block - hole
    }

    @Piece
    meth cross() : Shape3d {
        val block = Square( size.x, size.y ).center()
            .roundAllCorners( chamfer )
            .smartExtrude( size.z + holeSize.y + 1 )
                .edges( Chamfer(chamfer) )
        val hole = hole( size.y )
            .rotateZ(90).translateZ(holeSize.y + 1).also(2)
            .centerZTo( block.middle.z )

        return block - hole
    }

    override meth build() : Shape3d {
        return parallel() + cross().translateX(20)
    }
}