import uk.co.nickthecoder.foocad.smartextrusion.v1.* import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.* class HollowTubeConnectors : Model { var id = 12 var od = 16 val clearance = 0.3 var radius = 20 var extra = 1 var connectorLength = 20 meth halve( piece : Shape3d ) : Shape3d { return piece.translateZ(-clearance) - piece.boundingCube().topTo(0) } meth angle( r : double, angle : double ) : Shape3d { val path = PolygonBuilder().apply { moveTo( -r, -extra ) lineTo( -r, 0 ) circularArcTo( Vector2(-r,0).rotateDegrees(angle), r, false, false ) lineBy( Vector2(0,extra).rotateDegrees(angle) ) }.buildPath() val outside = Circle( od/2 ).extrude( path ) val connectors = Circle( id/2 - clearance ) .smartExtrude( connectorLength ) .rotateX(90).centerZ() .translateX(-r).translateY(-extra) .mirrorY().rotateZ(-angle).also(2) return halve(outside + connectors) .translate( r, extra, 0 ) .color("Orange") } @Piece meth angle90() = angle( radius, 90 ) @Piece meth angle60() = angle( radius, 60 ) @Piece meth angle120() = angle( radius, 45 ) meth tube(length : double) = (Circle( od/2 ) - Circle( id/2 )).extrude( length ) override fun build() : Shape3d { val tube = tube( 50 ).rotateX(-90) val tube1 = tube.translateY(4) val tube2 = tube.rotateZ(-90).translate(24,-21,0) val angle90 = angle90().mirrorY() val angle120 = angle120().translateY(58) val angle60 = angle60().rotateZ(-90).translateX(tube2.right+3).translateY(tube2.middle.y) return tube1 + tube2 + angle90 + angle120 + angle60 } }