Exit Full View
Up

/Hardware/TelescopicRod.foocad

TelescopicRod
FooCAD Source Code
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<Shape3d>()
        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 )
    }
}
*/