Example #1
0
	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()
Example #2
0
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)
Example #3
0
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
Example #4
0
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)
    ]
Example #5
0
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)
Example #6
0
 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()
Example #7
0
	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()
Example #8
0
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 )
Example #9
0
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)
Example #10
0
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
Example #11
0
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)]
Example #12
0
def getFloatByPrefixSide( prefix, side, xmlElement ):
	"Get float by prefix and side."
	floatByDenominatorPrefix = evaluate.getEvaluatedFloatZero(prefix, xmlElement)
	return floatByDenominatorPrefix + evaluate.getEvaluatedFloatZero( prefix + 'OverSide', xmlElement ) * side
Example #13
0
def getFloatByPrefixSide(prefix, side, xmlElement):
    "Get float by prefix and side."
    floatByDenominatorPrefix = evaluate.getEvaluatedFloatZero(
        prefix, xmlElement)
    return floatByDenominatorPrefix + evaluate.getEvaluatedFloatZero(
        prefix + 'OverSide', xmlElement) * side