def addCollarShaftSetDerivation(collarDerivation, collarLength, derivation, elementNode, negatives, positives):
 collarSides = evaluate.getSidesMinimumThreeBasedOnPrecision(elementNode, derivation.shaftRimRadius)
 collarProfile = euclidean.getComplexPolygon(complex(), derivation.shaftRimRadius, collarSides)
 vector3CollarProfile = euclidean.getVector3Path(collarProfile)
 extrude.addPositives(collarDerivation, [vector3CollarProfile], positives)
 addShaft(derivation, negatives, positives)
 drillZ = (derivation.faceWidth + (0.5 * collarLength))
 drillEnd = Vector3(0.0, derivation.shaftRimRadius, drillZ)
 drillStart = Vector3(0.0, 0.0, drillZ)
 teardrop.addNegativesByRadius(elementNode, drillEnd, negatives, derivation.keywayRadius, drillStart)

def addCollarShaftSetDerivation ( collarDerivation , collarLength , derivation , elementNode , negatives , positives ) : collarSides = evaluate . getSidesMinimumThreeBasedOnPrecision ( elementNode , derivation . shaftRimRadius ) collarProfile = euclidean . getComplexPolygon ( complex ( ) , derivation . shaftRimRadius , collarSides ) vector3CollarProfile = euclidean . getVector3Path ( collarProfile ) extrude . addPositives ( collarDerivation , [ vector3CollarProfile ] , positives ) addShaft ( derivation , negatives , positives ) drillZ = ( derivation . faceWidth + ( 0.5 * collarLength ) ) drillEnd = Vector3 ( 0.0 , derivation . shaftRimRadius , drillZ ) drillStart = Vector3 ( 0.0 , 0.0 , drillZ ) teardrop . addNegativesByRadius ( elementNode , drillEnd , negatives , derivation . keywayRadius , drillStart )
add collar and shaft .