def getTopAddBiconicOutput(bottomRadians, height, outputs, radius, sides, start, tipRadius, topRadians):
 radiusMaximum = max(radius.real, radius.imag)
 topRadiusMaximum = (radiusMaximum - (height * math.tan(bottomRadians)))
 trunkEndZ = (start.z + height)
 trunkTopOverBottom = (topRadiusMaximum / radiusMaximum)
 topRadiusComplex = (trunkTopOverBottom * radius)
 cylinder.addCylinderOutputByEndStart(trunkEndZ, radius, outputs, sides, start, trunkTopOverBottom)
 tipOverTop = (tipRadius / topRadiusMaximum)
 if (tipOverTop >= 1.0):
  return trunkEndZ
 capStart = Vector3(start.x, start.y, trunkEndZ)
 capEndZ = (trunkEndZ + ((topRadiusMaximum - tipRadius) / math.tan(topRadians)))
 cylinder.addCylinderOutputByEndStart(capEndZ, topRadiusComplex, outputs, sides, capStart, tipOverTop)
 return capEndZ

def getTopAddBiconicOutput ( bottomRadians , height , outputs , radius , sides , start , tipRadius , topRadians ) : radiusMaximum = max ( radius . real , radius . imag ) topRadiusMaximum = ( radiusMaximum - ( height * math . tan ( bottomRadians ) ) ) trunkEndZ = ( start . z + height ) trunkTopOverBottom = ( topRadiusMaximum / radiusMaximum ) topRadiusComplex = ( trunkTopOverBottom * radius ) cylinder . addCylinderOutputByEndStart ( trunkEndZ , radius , outputs , sides , start , trunkTopOverBottom ) tipOverTop = ( tipRadius / topRadiusMaximum ) if ( tipOverTop >= 1.0 ) : return trunkEndZ capStart = Vector3 ( start . x , start . y , trunkEndZ ) capEndZ = ( trunkEndZ + ( ( topRadiusMaximum - tipRadius ) / math . tan ( topRadians ) ) ) cylinder . addCylinderOutputByEndStart ( capEndZ , topRadiusComplex , outputs , sides , capStart , tipOverTop ) return capEndZ
get top and add biconic cylinder to outputs .