import static uk.co.nickthecoder.foocad.arrange.v1.Arrange.* import uk.co.nickthecoder.foocad.smartextrusion.v1.* import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.* class TelescopicRod : Model { var sectionNumber = 0 var innerDiameter = 20 var sectionHeight = 30 var thickness = 0.8 var lipSize = Vector2( 1, 6 ) var clearance = 0.25 meth edgeProfile() = PolygonBuilder().apply { moveTo( 0,0 ) lineTo( lipSize.x, lipSize.x ) lineTo( lipSize.x, lipSize.y ) }.buildPath() meth one( sectionNumber : double ) : Shape3d { val radius = radius( sectionNumber ) val edge = ProfileEdge( edgeProfile() ).reverse() val circle = Circle( radius ) val ring = circle - circle.offset( - thickness ) val tube = ring .smartExtrude( sectionHeight ) .insideTop( edge ) .outsideBottom( edge ) return tube } meth radius( sectionNumber : int ) = innerDiameter/2 + sectionNumber * (thickness + lipSize.x + clearance ) @Piece( printable=false ) meth nested3() : Shape3d { var result : Shape3d = Cube(0) for ( n in 0 until 3 ) { result += one( n ) } return result } @Piece meth arranged2() = arranged( 2 ) @Piece meth arranged3() = arranged( 3 ) meth arranged( count : int ) : Shape3d { val sections = listOf() for ( n in 0 until count ) { sections.add( one( n ) ) } return arrange( sections ) } @Piece( print="all" ) override fun build() : Shape3d { return nested3() } } /* class TelescopicRod : Model { var innerDiameter = 50 var sectionHeight = 30 var thickness = 0.8 var sections = 2 var clearance = 0.5 var delta = 1 meth one( radius : double ) : Shape3d { val circle = Circle( radius ) val ring = circle.offset(thickness) - circle val tube = ring .smartExtrude( sectionHeight ) .offsetTop( -delta ) return tube } // meth insideRadius() = outerDiameter / 2 - (sections-1) * (thickness + lip + clearance ) //@Piece //meth outer() = one( outerDiameter/2 ) //@Piece //meth inner() = one( insideRadius() ) @Piece meth all() : Shape3d { var result : Shape3d = Cube(0) var radius = innerDiameter / 2 for ( n in 0 until sections ) { result += one( radius ) radius += thickness + clearance } return result } @Piece( print="all" ) override fun build() : Shape3d { return all() //+ //outer().translateY( outerDiameter + 10 )// + //inner().translateY( -outerDiameter ) } } */