def getOutputCylinder( collarThickness, derivation, gearHolePaths, pitchRadius, teeth, twist, vector3GearProfile, xmlElement): "Get extrude output for a cylinder gear." extrudeDerivation = extrude.ExtrudeDerivation() extrudeDerivation.offsetPathDefault = [Vector3(), Vector3(0.0, 0.0, derivation.pinionThickness)] extrudeDerivation.setToXMLElement(derivation.copyShallow) negatives = [] positives = [] if twist != 0.0: twistDegrees = math.degrees(twist) extrudeDerivation.twistPathDefault = [] for complexPoint in derivation.helixPath: extrudeDerivation.twistPathDefault.append(Vector3(complexPoint.real, twistDegrees * complexPoint.imag)) extrude.insertTwistPortions(extrudeDerivation, xmlElement) if derivation.operatingAngle != 180.0: addBevelGear(derivation, extrudeDerivation, pitchRadius, positives, teeth, vector3GearProfile) addCollarShaft(collarThickness, derivation, negatives, positives, xmlElement) return extrude.getGeometryOutputByNegativesPositives(extrudeDerivation, negatives, positives, xmlElement) if pitchRadius > 0: extrude.addNegativesPositives(extrudeDerivation, negatives, vector3GearProfile, positives) addLighteningHoles(derivation, gearHolePaths, negatives, pitchRadius, positives) addCollarShaft(collarThickness, derivation, negatives, positives, xmlElement) return extrude.getGeometryOutputByNegativesPositives(extrudeDerivation, negatives, positives, xmlElement) if derivation.plateThickness <= 0.0: extrude.addNegativesPositives(extrudeDerivation, negatives, vector3GearProfile, positives) return extrude.getGeometryOutputByNegativesPositives(extrudeDerivation, negatives, positives, xmlElement) portionDirections = extrude.getSpacedPortionDirections(extrudeDerivation.interpolationDictionary) outerGearProfile = vector3GearProfile[0] outerLoopLists = extrude.getLoopListsByPath(extrudeDerivation, None, outerGearProfile, portionDirections) addBottomLoop(-derivation.plateClearance, outerLoopLists[0]) geometryOutput = trianglemesh.getPillarsOutput(outerLoopLists) positives.append(geometryOutput) innerLoopLists = extrude.getLoopListsByPath(extrudeDerivation, None, vector3GearProfile[1], portionDirections) addBottomLoop(-derivation.plateClearance, innerLoopLists[0]) geometryOutput = trianglemesh.getPillarsOutput(innerLoopLists) negatives.append(geometryOutput) connectionStart = Vector3(0.0, 0.0, -derivation.plateThickness) plateDerivation = extrude.ExtrudeDerivation() plateDerivation.offsetPathDefault = [connectionStart, Vector3(0.0, 0.0, -derivation.plateClearance)] plateDerivation.setToXMLElement(derivation.copyShallow) extrude.addNegativesPositives(plateDerivation, negatives, [outerGearProfile], positives) vector3LighteningHoles = getLighteningHoles(derivation, gearHolePaths, pitchRadius) extrude.addNegativesPositives(plateDerivation, negatives, vector3LighteningHoles, positives) addShaft(derivation, negatives, positives) connectionEnd = Vector3(0.0, 0.0, derivation.pinionThickness) positiveOutput = trianglemesh.getUnifiedOutput(positives) annulusPlateOutput = {'difference' : {'shapes' : [positiveOutput] + negatives}} if collarThickness <= 0.0: outputCylinder = extrude.getGeometryOutputByConnection(connectionEnd, connectionStart, annulusPlateOutput, xmlElement) return getLiftedOutput(derivation, outputCylinder, xmlElement) negatives = [] positives = [] connectionEnd = Vector3(0.0, 0.0, derivation.pinionThickness + collarThickness) collarDerivation = extrude.ExtrudeDerivation() collarDerivation.offsetPathDefault = [Vector3(0.0, 0.0, -derivation.plateClearance), connectionEnd] addCollarShaftSetDerivation(collarDerivation, collarThickness, derivation, negatives, positives, xmlElement) collarOutput = {'difference' : {'shapes' : positives + negatives}} cylinderOutput = {'union' : {'shapes' : [annulusPlateOutput, collarOutput]}} outputCylinder = extrude.getGeometryOutputByConnection(connectionEnd, connectionStart, cylinderOutput, xmlElement) return getLiftedOutput(derivation, outputCylinder, xmlElement)
def getOutputCylinder(gearDerivation, pitchRadius, shaftRimRadius, teeth, twist, vector3GearProfile, vector3ShaftPath, xmlElement): "Get extrude output for a cylinder gear." vector3LighteningHoles = getLighteningHoles(gearDerivation, pitchRadius, shaftRimRadius, teeth) extrudeDerivation = extrude.ExtrudeDerivation() extrudeDerivation.offsetPathDefault = [ Vector3(), Vector3(0.0, 0.0, gearDerivation.thickness) ] extrudeDerivation.setToXMLElement(xmlElement) negatives = [] positives = [] extrude.addNegativesPositives(extrudeDerivation, negatives, vector3LighteningHoles + [vector3ShaftPath], positives) if twist != 0.0: twistDegrees = math.degrees(twist) extrudeDerivation.twistPathDefault = [] for complexPoint in getHelixComplexPath(gearDerivation, xmlElement): extrudeDerivation.twistPathDefault.append( Vector3(complexPoint.real, twistDegrees * complexPoint.imag)) extrude.insertTwistPortions(extrudeDerivation, xmlElement) extrude.addNegativesPositives(extrudeDerivation, negatives, [vector3GearProfile], positives) return extrude.getGeometryOutputByNegativesPositives( extrudeDerivation, negatives, positives, xmlElement)
def addSlab(derivation, positives): 'Add slab.' copyShallow = derivation.xmlElement.getCopyShallow() copyShallow.attributeDictionary['path'] = [Vector3(), Vector3(0.0, 0.0, derivation.height)] extrudeDerivation = extrude.ExtrudeDerivation(copyShallow) beveledRectangle = getBeveledRectangle(derivation.bevel, -derivation.topRight) outsidePath = euclidean.getVector3Path(beveledRectangle) extrude.addPositives(extrudeDerivation, [outsidePath], positives)
def addNegativesByRadius(end, negatives, radius, start, xmlElement): "Add teardrop drill hole to negatives." copyShallow = xmlElement.getCopyShallow() extrude.setXMLElementToEndStart(end, start, copyShallow) extrudeDerivation = extrude.ExtrudeDerivation(copyShallow) extrude.addNegatives( extrudeDerivation, negatives, [getTeardropPathByEndStart(end, radius, start, xmlElement)])
def addCollarShaft(collarThickness, derivation, negatives, positives, xmlElement): 'Add collar.' if collarThickness <= 0.0: addShaft(derivation, negatives, positives) return connectionEnd = Vector3(0.0, 0.0, derivation.pinionThickness + collarThickness) collarDerivation = extrude.ExtrudeDerivation() collarDerivation.offsetPathDefault = [Vector3(0.0, 0.0, derivation.pinionThickness), connectionEnd] addCollarShaftSetDerivation(collarDerivation, collarThickness, derivation, negatives, positives, xmlElement)
def addLighteningHoles(derivation, gearHolePaths, negatives, pitchRadius, positives): "Add lightening holes." extrudeDerivation = extrude.ExtrudeDerivation() positiveVertexes = matrix.getVertexes(positives) bottomPath = euclidean.getTopPath(positiveVertexes) topPath = euclidean.getBottomPath(positiveVertexes) extrudeDerivation.offsetPathDefault = [Vector3(0.0, 0.0, bottomPath), Vector3(0.0, 0.0, topPath)] extrudeDerivation.setToXMLElement(derivation.copyShallow) vector3LighteningHoles = getLighteningHoles(derivation, gearHolePaths, pitchRadius) extrude.addNegativesPositives(extrudeDerivation, negatives, vector3LighteningHoles, positives)
def addLighteningHoles(derivation, gearHolePaths, negatives, pitchRadius, positives): "Add lightening holes." positiveVertexes = matrix.getVertexes(positives) bottomPath = euclidean.getTopPath(positiveVertexes) topPath = euclidean.getBottomPath(positiveVertexes) copyShallow = derivation.xmlElement.getCopyShallow() copyShallow.attributeDictionary['path'] = [Vector3(0.0, 0.0, bottomPath), Vector3(0.0, 0.0, topPath)] extrudeDerivation = extrude.ExtrudeDerivation(copyShallow) vector3LighteningHoles = getLighteningHoles(derivation, gearHolePaths, pitchRadius) extrude.addNegativesPositives(extrudeDerivation, negatives, vector3LighteningHoles, positives)
def addCage(derivation, height, negatives, positives): 'Add linear bearing cage.' copyShallow = derivation.elementNode.getCopyShallow() copyShallow.attributes['path'] = [Vector3(), Vector3(0.0, 0.0, height)] extrudeDerivation = extrude.ExtrudeDerivation(copyShallow) roundedExtendedRectangle = getRoundedExtendedRectangle(derivation.demiwidth, derivation.rectangleCenterX, 14) outsidePath = euclidean.getVector3Path(roundedExtendedRectangle) extrude.addPositives(extrudeDerivation, [outsidePath], positives) for bearingCenterX in derivation.bearingCenterXs: addNegativeSphere(derivation, negatives, bearingCenterX)
def addNegativesByRadius(elementNode, end, negatives, radius, start): "Add teardrop drill hole to negatives." if radius <= 0.0: return copyShallow = elementNode.getCopyShallow() extrude.setElementNodeToEndStart(copyShallow, end, start) extrudeDerivation = extrude.ExtrudeDerivation(copyShallow) extrude.addNegatives( extrudeDerivation, negatives, [getTeardropPathByEndStart(elementNode, end, radius, start)])
def addCollarShaft(collarThickness, derivation, negatives, positives, xmlElement): 'Add collar.' if collarThickness <= 0.0: addShaft(derivation, negatives, positives) return connectionEnd = Vector3(0.0, 0.0, derivation.pinionThickness + collarThickness) copyShallow = derivation.xmlElement.getCopyShallow() copyShallow.attributeDictionary['path'] = [Vector3(0.0, 0.0, derivation.pinionThickness), connectionEnd] collarDerivation = extrude.ExtrudeDerivation(copyShallow) addCollarShaftSetDerivation(collarDerivation, collarThickness, derivation, negatives, positives, xmlElement)
def addShaft(derivation, negatives, positives): "Add shaft." if len(derivation.shaftPath) < 3: return extrudeDerivation = extrude.ExtrudeDerivation() positiveVertexes = matrix.getVertexes(positives) bottomPath = euclidean.getTopPath(positiveVertexes) topPath = euclidean.getBottomPath(positiveVertexes) extrudeDerivation.offsetPathDefault = [Vector3(0.0, 0.0, bottomPath), Vector3(0.0, 0.0, topPath)] extrudeDerivation.setToXMLElement(derivation.copyShallow) extrude.addNegativesPositives(extrudeDerivation, negatives, [derivation.shaftPath], positives)
def addShaft(derivation, negatives, positives): "Add shaft." if len(derivation.shaftPath) < 3: return positiveVertexes = matrix.getVertexes(positives) bottomPath = euclidean.getTopPath(positiveVertexes) topPath = euclidean.getBottomPath(positiveVertexes) copyShallow = derivation.xmlElement.getCopyShallow() copyShallow.attributeDictionary['path'] = [Vector3(0.0, 0.0, bottomPath), Vector3(0.0, 0.0, topPath)] extrudeDerivation = extrude.ExtrudeDerivation(copyShallow) extrude.addNegativesPositives(extrudeDerivation, negatives, [derivation.shaftPath], positives)
def getGeometryOutput(derivation, xmlElement): "Get vector3 vertexes from attribute dictionary." if derivation == None: derivation = DrillDerivation() derivation.setToXMLElement(xmlElement) extrudeDerivation = extrude.ExtrudeDerivation() negatives = [] teardrop.addNegativesByDerivation(derivation.end, extrudeDerivation, negatives, derivation.radius, derivation.start, xmlElement) return extrude.getGeometryOutputByNegativesPositives( extrudeDerivation, [], negatives, xmlElement)
def getOutputRack(gearDerivation, vector3GearProfile, xmlElement): "Get extrude output for a rack." extrudeDerivation = extrude.ExtrudeDerivation() helixComplexPath = getHelixComplexPath(gearDerivation, xmlElement) extrudeDerivation.offsetPathDefault = [] for complexPoint in getHelixComplexPath(gearDerivation, xmlElement): point = Vector3(gearDerivation.helixThickness * complexPoint.imag, 0.0, gearDerivation.thickness * complexPoint.real) extrudeDerivation.offsetPathDefault.append(point) extrudeDerivation.setToXMLElement(xmlElement) negatives = [] positives = [] extrude.addNegativesPositives(extrudeDerivation, negatives, [vector3GearProfile], positives) return extrude.getGeometryOutputByNegativesPositives( extrudeDerivation, negatives, positives, xmlElement)
def addGroove(derivation, negatives): 'Add groove on each side of cage.' copyShallow = derivation.elementNode.getCopyShallow() extrude.setElementNodeToEndStart(copyShallow, Vector3(-derivation.demilength), Vector3(derivation.demilength)) extrudeDerivation = extrude.ExtrudeDerivation(copyShallow) bottom = derivation.demiheight - 0.5 * derivation.grooveWidth outside = derivation.demiwidth top = derivation.demiheight leftGroove = [ complex(-outside, bottom), complex(-derivation.innerDemiwidth, derivation.demiheight), complex(-outside, top)] rightGroove = [ complex(outside, top), complex(derivation.innerDemiwidth, derivation.demiheight), complex(outside, bottom)] extrude.addNegatives(extrudeDerivation, negatives, euclidean.getVector3Paths([leftGroove, rightGroove]))
def addGroove(derivation, negatives): 'Add groove on each side of cage.' copyShallow = derivation.xmlElement.getCopyShallow() extrude.setXMLElementToEndStart(Vector3(-derivation.demilength), Vector3(derivation.demilength), copyShallow) extrudeDerivation = extrude.ExtrudeDerivation(copyShallow) bottom = derivation.demiheight - 0.5 * derivation.grooveWidth outside = derivation.demiwidth top = derivation.demiheight leftGroove = [ complex(-outside, bottom), complex(-derivation.innerDemiwidth, derivation.demiheight), complex(-outside, top)] rightGroove = [ complex(outside, top), complex(derivation.innerDemiwidth, derivation.demiheight), complex(outside, bottom)] groovesComplex = [leftGroove, rightGroove] groovesVector3 = euclidean.getVector3Paths(groovesComplex) extrude.addPositives(extrudeDerivation, groovesVector3, negatives)
def getOutputRack(derivation, vector3GearProfile, xmlElement): "Get extrude output for a rack." path = [] for complexPoint in derivation.helixPath: point = Vector3(derivation.helixThickness * complexPoint.imag, 0.0, derivation.pinionThickness * complexPoint.real) path.append(point) copyShallow = derivation.xmlElement.getCopyShallow() copyShallow.attributeDictionary['path'] = path extrudeDerivation = extrude.ExtrudeDerivation(copyShallow) negatives = [] positives = [] vector3RackProfiles = [vector3GearProfile] if derivation.extraRackDemilength > 0.0: yMaximum = -912345678.0 yMinimum = 912345678.0 for point in vector3GearProfile: yMaximum = max(point.y, yMaximum) yMinimum = min(point.y, yMinimum) muchLessThanWidth = 0.01 * derivation.rackWidth yMaximum += muchLessThanWidth yMinimum -= muchLessThanWidth extraRackLength = derivation.extraRackDemilength + derivation.extraRackDemilength rackDemilengthPlus = derivation.rackDemilength + extraRackLength leftNegative = [ Vector3(-derivation.rackDemilength, yMaximum), Vector3(-derivation.rackDemilength, yMinimum), Vector3(-rackDemilengthPlus, yMinimum), Vector3(-rackDemilengthPlus, yMaximum)] vector3RackProfiles.append(leftNegative) rightNegative = [ Vector3(rackDemilengthPlus, yMaximum), Vector3(rackDemilengthPlus, yMinimum), Vector3(derivation.rackDemilength, yMinimum), Vector3(derivation.rackDemilength, yMaximum)] vector3RackProfiles.append(rightNegative) addRackHoles(derivation, vector3RackProfiles, xmlElement) extrude.addNegativesPositives(extrudeDerivation, negatives, vector3RackProfiles, positives) return extrude.getGeometryOutputByNegativesPositives(extrudeDerivation, negatives, positives, xmlElement)
def addNegativesByRadius(end, negatives, radius, start, xmlElement): "Add teardrop drill hole to negatives." extrudeDerivation = extrude.ExtrudeDerivation() addNegativesByDerivation(end, extrudeDerivation, negatives, radius, start, xmlElement)