def rotate(self, xmlElement): "Rotate." rotation = math.radians( evaluate.getEvaluatedFloatZero('rotation', xmlElement ) ) rotation += evaluate.getEvaluatedFloatZero('rotationOverSide', xmlElement ) * self.sideAngle if rotation != 0.0: planeRotation = euclidean.getWiddershinsUnitPolar( rotation ) for vertex in self.loop: rotatedComplex = vertex.dropAxis() * planeRotation vertex.x = rotatedComplex.real vertex.y = rotatedComplex.imag if 'clockwise' in xmlElement.attributeDictionary: isClockwise = euclidean.getBooleanFromValue( evaluate.getEvaluatedValueObliviously('clockwise', xmlElement ) ) if isClockwise == euclidean.getIsWiddershinsByVector3( self.loop ): self.loop.reverse()
def getGeometryOutput(xmlElement): "Get vector3 vertices from attribute dictionary." radius = complex(1.0, 1.0) radius = lineation.getComplexByPrefixes(['demisize', 'radius'], radius, xmlElement) radius = lineation.getComplexByMultiplierPrefixes(2.0, ['diameter', 'size'], radius, xmlElement) sides = evaluate.getSidesMinimumThree(max(radius.real, radius.imag), xmlElement) sides = evaluate.getEvaluatedFloatDefault(sides, 'sides', xmlElement) loop = [] start = evaluate.getEvaluatedFloatZero('start', xmlElement) start = getWrappedFloat(start, 360.0) extent = evaluate.getEvaluatedFloatDefault(360.0 - start, 'extent', xmlElement) end = evaluate.getEvaluatedFloatDefault(start + extent, 'end', xmlElement) end = getWrappedFloat(end, 360.0) revolutions = evaluate.getEvaluatedFloatOne('revolutions', xmlElement) if revolutions > 1: end += 360.0 * (revolutions - 1) sidesCeiling = int(math.ceil(abs(sides) * extent / 360.0)) sideAngle = math.radians(extent) / sidesCeiling startAngle = math.radians(start) for side in xrange(sidesCeiling + (extent != 360.0)): angle = float(side) * sideAngle + startAngle point = euclidean.getWiddershinsUnitPolar(angle) vertex = Vector3(point.real * radius.real, point.imag * radius.imag) loop.append(vertex) sideLength = sideAngle * lineation.getAverageRadius(radius) return lineation.getGeometryOutputByLoop(lineation.SideLoop(loop, sideAngle, sideLength), xmlElement)
def getArcPath(xmlElement): "Get the arc path.rx ry x-axis-rotation large-arc-flag sweep-flag" begin = xmlElement.getPreviousVertex(Vector3()) end = evaluate.getVector3FromXMLElement(xmlElement) largeArcFlag = evaluate.getEvaluatedBooleanDefault(True, 'largeArcFlag', xmlElement) radius = lineation.getComplexByPrefix('radius', complex(1.0, 1.0), xmlElement) sweepFlag = evaluate.getEvaluatedBooleanDefault(True, 'sweepFlag', xmlElement) xAxisRotation = math.radians( evaluate.getEvaluatedFloatZero('xAxisRotation', xmlElement)) arcComplexes = svg_reader.getArcComplexes(begin.dropAxis(), end.dropAxis(), largeArcFlag, radius, sweepFlag, xAxisRotation) path = [] incrementZ = (end.z - begin.z) / float(len(arcComplexes)) z = begin.z for pointIndex in xrange(len(arcComplexes)): pointComplex = arcComplexes[pointIndex] z += incrementZ path.append(Vector3(pointComplex.real, pointComplex.imag, z)) if len(path) > 0: path[-1] = end return path
def getManipulatedPaths(close, loop, prefix, xmlElement): "Get path with overhangs removed or filled in." if len(loop) < 3: return [loop] overhangAngle = math.radians( xmlElement.getCascadeFloat(45.0, 'overhangangle')) overhangPlaneAngle = euclidean.getWiddershinsUnitPolar(0.5 * math.pi - overhangAngle) overhangVerticalAngle = math.radians( evaluate.getEvaluatedFloatZero(prefix + 'verticalangle', xmlElement)) if overhangVerticalAngle != 0.0: overhangVerticalCosine = abs(math.cos(overhangVerticalAngle)) if overhangVerticalCosine == 0.0: return [loop] imaginaryTimesCosine = overhangPlaneAngle.imag * overhangVerticalCosine overhangPlaneAngle = euclidean.getNormalized( complex(overhangPlaneAngle.real, imaginaryTimesCosine)) alongAway = AlongAway(loop, overhangPlaneAngle) if euclidean.getIsWiddershinsByVector3(loop): alterWiddershinsSupportedPath(alongAway, close) else: alterClockwiseSupportedPath(alongAway, xmlElement) return [ euclidean.getLoopWithoutCloseSequentialPoints(close, alongAway.loop) ]
def getGeometryOutput(xmlElement): "Get vector3 vertexes from attribute dictionary." radius = lineation.getRadiusComplex(complex(1.0, 1.0), xmlElement) sides = evaluate.getSidesMinimumThreeBasedOnPrecisionSides(max(radius.real, radius.imag), xmlElement) loop = [] start = evaluate.getEvaluatedFloatZero('start', xmlElement) start = getWrappedFloat(start, 360.0) extent = evaluate.getEvaluatedFloatDefault(360.0 - start, 'extent', xmlElement) end = evaluate.getEvaluatedFloatDefault(start + extent, 'end', xmlElement) end = getWrappedFloat(end, 360.0) revolutions = evaluate.getEvaluatedFloatOne('revolutions', xmlElement) if revolutions > 1: end += 360.0 * (revolutions - 1) angleTotal = math.radians(start) extent = end - start sidesCeiling = int(math.ceil(abs(sides) * extent / 360.0)) sideAngle = math.radians(extent) / sidesCeiling spiral = lineation.Spiral(0.5 * sideAngle / math.pi, xmlElement) for side in xrange(sidesCeiling + (extent != 360.0)): unitPolar = euclidean.getWiddershinsUnitPolar(angleTotal) vertex = spiral.getSpiralPoint(unitPolar, Vector3(unitPolar.real * radius.real, unitPolar.imag * radius.imag)) angleTotal += sideAngle loop.append(vertex) sideLength = sideAngle * lineation.getAverageRadius(radius) lineation.setClosedAttribute(revolutions, xmlElement) return lineation.getGeometryOutputByLoop(lineation.SideLoop(loop, sideAngle, sideLength), xmlElement)
def rotate(self, xmlElement): "Rotate." rotation = math.radians( evaluate.getEvaluatedFloatZero('rotation', xmlElement)) rotation += evaluate.getEvaluatedFloatZero('rotationOverSide', xmlElement) * self.sideAngle if rotation != 0.0: planeRotation = euclidean.getWiddershinsUnitPolar(rotation) for vertex in self.loop: rotatedComplex = vertex.dropAxis() * planeRotation vertex.x = rotatedComplex.real vertex.y = rotatedComplex.imag if 'clockwise' in xmlElement.attributeDictionary: isClockwise = euclidean.getBooleanFromValue( evaluate.getEvaluatedValueObliviously('clockwise', xmlElement)) if isClockwise == euclidean.getIsWiddershinsByVector3(self.loop): self.loop.reverse()
def centerRotate( self, xmlElement ): "Add a wedge center and rotate." wedgeCenter = evaluate.getVector3ByKey( 'wedgecenter', None, xmlElement ) if wedgeCenter != None: self.loop.append( wedgeCenter ) rotation = math.radians( evaluate.getEvaluatedFloatZero( 'rotation', xmlElement ) ) rotation += evaluate.getEvaluatedFloatZero( 'rotationoverside', xmlElement ) * self.sideAngle if rotation != 0.0: planeRotation = euclidean.getWiddershinsUnitPolar( rotation ) for vertex in self.loop: rotatedComplex = vertex.dropAxis() * planeRotation vertex.x = rotatedComplex.real vertex.y = rotatedComplex.imag if 'clockwise' in xmlElement.attributeDictionary: isClockwise = euclidean.getBooleanFromValue( evaluate.getEvaluatedValueObliviously( 'clockwise', xmlElement ) ) if isClockwise == euclidean.getIsWiddershinsByVector3( self.loop ): self.loop.reverse()
def insertTwistPortions( interpolationDictionary, xmlElement ): "Insert twist portions and radian the twist." twist = evaluate.getEvaluatedFloatZero('twist', xmlElement ) twistPathDefault = [ Vector3(), Vector3( 1.0, twist ) ] interpolationTwist = Interpolation().getByPrefixX( twistPathDefault, 'twist', xmlElement ) interpolationDictionary['twist'] = interpolationTwist for point in interpolationTwist.path: point.y = math.radians( point.y ) remainderPortionDirections = interpolationTwist.portionDirections[ 1 : ] interpolationTwist.portionDirections = [ interpolationTwist.portionDirections[0] ] twistPrecision = math.radians( xmlElement.getCascadeFloat( 5.0, 'twistprecision') ) for remainderPortionDirection in remainderPortionDirections: addTwistPortions( interpolationTwist, remainderPortionDirection, twistPrecision ) interpolationTwist.portionDirections.append( remainderPortionDirection )
def insertTwistPortions(interpolationDictionary, xmlElement): "Insert twist portions and radian the twist." twist = evaluate.getEvaluatedFloatZero('twist', xmlElement) twistPathDefault = [Vector3(), Vector3(1.0, twist)] interpolationTwist = evaluate.Interpolation().getByPrefixX( twistPathDefault, 'twist', xmlElement) interpolationDictionary['twist'] = interpolationTwist for point in interpolationTwist.path: point.y = math.radians(point.y) remainderPortionDirections = interpolationTwist.portionDirections[1:] interpolationTwist.portionDirections = [ interpolationTwist.portionDirections[0] ] twistPrecision = math.radians( xmlElement.getCascadeFloat(5.0, 'twistprecision')) for remainderPortionDirection in remainderPortionDirections: addTwistPortions(interpolationTwist, remainderPortionDirection, twistPrecision) interpolationTwist.portionDirections.append(remainderPortionDirection)
def getArcPath(xmlElement): "Get the arc path.rx ry x-axis-rotation large-arc-flag sweep-flag" begin = xmlElement.getPreviousVertex(Vector3()) end = evaluate.getVector3FromXMLElement(xmlElement) largeArcFlag = evaluate.getEvaluatedBooleanDefault(True, 'largeArcFlag', xmlElement) radius = lineation.getComplexByPrefix('radius', complex(1.0, 1.0), xmlElement ) sweepFlag = evaluate.getEvaluatedBooleanDefault(True, 'sweepFlag', xmlElement) xAxisRotation = math.radians(evaluate.getEvaluatedFloatZero('xAxisRotation', xmlElement )) arcComplexes = svg_reader.getArcComplexes(begin.dropAxis(), end.dropAxis(), largeArcFlag, radius, sweepFlag, xAxisRotation) path = [] incrementZ = (end.z - begin.z) / float(len(arcComplexes)) z = begin.z for pointIndex in xrange(len(arcComplexes)): pointComplex = arcComplexes[pointIndex] z += incrementZ path.append(Vector3(pointComplex.real, pointComplex.imag, z)) if len(path) > 0: path[-1] = end return path
def getManipulatedPaths(close, loop, prefix, xmlElement): "Get path with overhangs removed or filled in." if len(loop) < 3: return [loop] overhangAngle = math.radians(xmlElement.getCascadeFloat(45.0, "overhangangle")) overhangPlaneAngle = euclidean.getWiddershinsUnitPolar(0.5 * math.pi - overhangAngle) overhangVerticalAngle = math.radians(evaluate.getEvaluatedFloatZero(prefix + "verticalangle", xmlElement)) if overhangVerticalAngle != 0.0: overhangVerticalCosine = abs(math.cos(overhangVerticalAngle)) if overhangVerticalCosine == 0.0: return [loop] imaginaryTimesCosine = overhangPlaneAngle.imag * overhangVerticalCosine overhangPlaneAngle = euclidean.getNormalized(complex(overhangPlaneAngle.real, imaginaryTimesCosine)) alongAway = AlongAway(loop, overhangPlaneAngle) if euclidean.getIsWiddershinsByVector3(loop): alterWiddershinsSupportedPath(alongAway, close) else: alterClockwiseSupportedPath(alongAway, xmlElement) return [euclidean.getLoopWithoutCloseSequentialPoints(close, alongAway.loop)]
def getFloatByPrefixSide( prefix, side, xmlElement ): "Get float by prefix and side." floatByDenominatorPrefix = evaluate.getEvaluatedFloatZero(prefix, xmlElement) return floatByDenominatorPrefix + evaluate.getEvaluatedFloatZero( prefix + 'OverSide', xmlElement ) * side
def getFloatByPrefixSide(prefix, side, xmlElement): "Get float by prefix and side." floatByDenominatorPrefix = evaluate.getEvaluatedFloatZero( prefix, xmlElement) return floatByDenominatorPrefix + evaluate.getEvaluatedFloatZero( prefix + 'OverSide', xmlElement) * side