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) } }