def getGeometryOutput(derivation, elementNode):
	"Get vector3 vertexes from attribute dictionary."
	if derivation is None:
		derivation = SpongeSliceDerivation(elementNode)
	awayPoints = []
	vector3Path = euclidean.getVector3Path(euclidean.getSquareLoopWiddershins(-derivation.inradius, derivation.inradius))
	geometryOutput = lineation.SideLoop(vector3Path).getManipulationPluginLoops(elementNode)
	minimumDistanceFromOther = derivation.wallThickness + derivation.minimumRadius + derivation.minimumRadius
	if derivation.inradiusMinusRadiusThickness.real <= 0.0 or derivation.inradiusMinusRadiusThickness.imag <= 0.0:
		return geometryOutput
	for point in derivation.path:
		if abs(point.x) <= derivation.inradiusMinusRadiusThickness.real and abs(point.y) <= derivation.inradiusMinusRadiusThickness.imag:
			awayPoints.append(point)
	awayCircles = []
	for point in awayPoints:
		if getIsPointAway(minimumDistanceFromOther, point, awayCircles):
			awayCircles.append(SpongeCircle(point, derivation.minimumRadius))
	averagePotentialBubbleArea = derivation.potentialBubbleArea / float(len(awayCircles))
	averageBubbleRadius = math.sqrt(averagePotentialBubbleArea / math.pi) - 0.5 * derivation.wallThickness
	sides = -4 * (max(evaluate.getSidesBasedOnPrecision(elementNode, averageBubbleRadius), 4) / 4)
	sideAngle = math.pi / sides
	cosSide = math.cos(sideAngle)
	overlapArealRatio = (1 - cosSide) / cosSide
	for circleIndex, circle in enumerate(awayCircles):
		otherCircles = awayCircles[: circleIndex] + awayCircles[circleIndex + 1 :]
		circle.radius = circle.getRadius(circle.center, derivation, otherCircles, overlapArealRatio)
	if derivation.searchAttempts > 0:
		for circleIndex, circle in enumerate(awayCircles):
			otherCircles = awayCircles[: circleIndex] + awayCircles[circleIndex + 1 :]
			circle.moveCircle(derivation, otherCircles, overlapArealRatio)
	for circle in awayCircles:
		vector3Path = euclidean.getVector3Path(euclidean.getComplexPolygon(circle.center.dropAxis(), circle.radius, sides, sideAngle))
		geometryOutput += lineation.SideLoop(vector3Path).getManipulationPluginLoops(elementNode)
	return geometryOutput
示例#2
0
def getLighteningHoles(gearDerivation, pitchRadius, shaftRimRadius, teeth):
	'Get cutout circles.'
	innerRadius = pitchRadius - gearDerivation.dedendum
	lighteningHoleOuterRadius = innerRadius - gearDerivation.rimWidth
	shaftRimRadius = max(shaftRimRadius, (lighteningHoleOuterRadius) * (0.5 - math.sqrt(0.1875)))
	lighteningHoleRadius = 0.5 * (lighteningHoleOuterRadius - shaftRimRadius)
	if lighteningHoleRadius < gearDerivation.lighteningHoleMinimumRadius:
		return []
	lighteningHoles = []
	numberOfLighteningHoles = 3
	polygonRadius = lighteningHoleOuterRadius - lighteningHoleRadius
	rimDemiwidth = 0.5 * gearDerivation.lighteningHoleMargin
	axialMargin = getAxialMargin(lighteningHoleRadius, numberOfLighteningHoles, polygonRadius)
	if axialMargin < rimDemiwidth:
		while axialMargin < rimDemiwidth:
			lighteningHoleRadius *= 0.999
			if lighteningHoleRadius < gearDerivation.lighteningHoleMinimumRadius:
				return []
			axialMargin = getAxialMargin(lighteningHoleRadius, numberOfLighteningHoles, polygonRadius)
	else:
		newNumberOfLighteningHoles = numberOfLighteningHoles
		while axialMargin > rimDemiwidth:
			numberOfLighteningHoles = newNumberOfLighteningHoles
			newNumberOfLighteningHoles += 2
			axialMargin = getAxialMargin(lighteningHoleRadius, newNumberOfLighteningHoles, polygonRadius)
	sideAngle = 2.0 * math.pi / float(numberOfLighteningHoles)
	startAngle = 0.0
	for lighteningHoleIndex in xrange(numberOfLighteningHoles):
		unitPolar = euclidean.getWiddershinsUnitPolar(startAngle)
		lighteningHole = euclidean.getComplexPolygon(unitPolar * polygonRadius, lighteningHoleRadius, -13)
		lighteningHoles.append(lighteningHole)
		startAngle += sideAngle
	return euclidean.getVector3Paths(lighteningHoles)
示例#3
0
def addCollarShaftSetDerivation(collarDerivation, collarThickness, derivation, negatives, positives, xmlElement):
	'Add collar and shaft.'
	collarSides = evaluate.getSidesMinimumThreeBasedOnPrecision(derivation.shaftRimRadius, xmlElement)
	collarProfile = euclidean.getComplexPolygon(complex(), derivation.shaftRimRadius, collarSides)
	vector3CollarProfile = euclidean.getVector3Path(collarProfile)
	extrude.addNegativesPositives(collarDerivation, negatives, [vector3CollarProfile], positives)
	addShaft(derivation, negatives, positives)
	drillZ = derivation.pinionThickness + 0.5 * collarThickness
	drillEnd = Vector3(0.0, derivation.shaftRimRadius, drillZ)
	drillStart = Vector3(0.0, 0.0, drillZ)
	teardrop.addNegativesByRadius(drillEnd, negatives, derivation.keywayRadius, drillStart, xmlElement)
示例#4
0
def getLighteningHoles(gearDerivation, pitchRadius, shaftRimRadius, teeth):
    'Get cutout circles.'
    innerRadius = pitchRadius - gearDerivation.dedendum
    lighteningHoleOuterRadius = innerRadius - gearDerivation.rimWidth
    shaftRimRadius = max(shaftRimRadius, (lighteningHoleOuterRadius) *
                         (0.5 - math.sqrt(0.1875)))
    lighteningHoleRadius = 0.5 * (lighteningHoleOuterRadius - shaftRimRadius)
    if lighteningHoleRadius < gearDerivation.lighteningHoleMinimumRadius:
        return []
    lighteningHoles = []
    numberOfLighteningHoles = 3
    polygonRadius = lighteningHoleOuterRadius - lighteningHoleRadius
    rimDemiwidth = 0.5 * gearDerivation.lighteningHoleMargin
    axialMargin = getAxialMargin(lighteningHoleRadius, numberOfLighteningHoles,
                                 polygonRadius)
    if axialMargin < rimDemiwidth:
        while axialMargin < rimDemiwidth:
            lighteningHoleRadius *= 0.999
            if lighteningHoleRadius < gearDerivation.lighteningHoleMinimumRadius:
                return []
            axialMargin = getAxialMargin(lighteningHoleRadius,
                                         numberOfLighteningHoles,
                                         polygonRadius)
    else:
        newNumberOfLighteningHoles = numberOfLighteningHoles
        while axialMargin > rimDemiwidth:
            numberOfLighteningHoles = newNumberOfLighteningHoles
            newNumberOfLighteningHoles += 2
            axialMargin = getAxialMargin(lighteningHoleRadius,
                                         newNumberOfLighteningHoles,
                                         polygonRadius)
    sideAngle = 2.0 * math.pi / float(numberOfLighteningHoles)
    startAngle = 0.0
    for lighteningHoleIndex in xrange(numberOfLighteningHoles):
        unitPolar = euclidean.getWiddershinsUnitPolar(startAngle)
        lighteningHole = euclidean.getComplexPolygon(unitPolar * polygonRadius,
                                                     lighteningHoleRadius, -13)
        lighteningHoles.append(lighteningHole)
        startAngle += sideAngle
    return euclidean.getVector3Paths(lighteningHoles)
示例#5
0
def getGearProfileAnnulus(derivation, pitchRadius, teeth, toothProfile):
	'Get gear profile for an annulus gear.'
	gearProfileCylinder = getGearProfileCylinder(teeth, toothProfile)
	annulusRadius = derivation.dedendum + derivation.rimWidth - pitchRadius
	return [euclidean.getComplexPolygon(complex(), annulusRadius, -teeth, 0.5 * math.pi), gearProfileCylinder]
示例#6
0
def addRackHole(derivation, vector3RackProfiles, x, xmlElement):
	"Add rack hole to vector3RackProfiles."
	rackHole = euclidean.getComplexPolygon(complex(x, -derivation.rackHoleBelow), derivation.rackHoleRadius, -13)
	vector3RackProfiles.append(euclidean.getVector3Path(rackHole))