5 http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands
9 from __future__ import absolute_import
10 #Init has to be imported first because it has code to workaround the python bug where relative imports don't work if the module is imported as a main module.
13 from fabmetheus_utilities.geometry.creation import lineation
14 from fabmetheus_utilities.geometry.geometry_utilities import evaluate
15 from fabmetheus_utilities.vector3 import Vector3
16 from fabmetheus_utilities import euclidean
17 from fabmetheus_utilities import svg_reader
21 __author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
22 __credits__ = 'Art of Illusion <http://www.artofillusion.org/>'
23 __date__ = '$Date: 2008/02/05 $'
24 __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
27 def getArcPath(elementNode):
28 "Get the arc path.rx ry x-axis-rotation large-arc-flag sweep-flag"
29 begin = elementNode.getPreviousVertex(Vector3())
30 end = evaluate.getVector3FromElementNode(elementNode)
31 largeArcFlag = evaluate.getEvaluatedBoolean(True, elementNode, 'largeArcFlag')
32 radius = lineation.getComplexByPrefix(elementNode, 'radius', complex(1.0, 1.0))
33 sweepFlag = evaluate.getEvaluatedBoolean(True, elementNode, 'sweepFlag')
34 xAxisRotation = math.radians(evaluate.getEvaluatedFloat(0.0, elementNode, 'xAxisRotation'))
35 arcComplexes = svg_reader.getArcComplexes(begin.dropAxis(), end.dropAxis(), largeArcFlag, radius, sweepFlag, xAxisRotation)
37 if len(arcComplexes) < 1:
39 incrementZ = (end.z - begin.z) / float(len(arcComplexes))
41 for pointIndex in xrange(len(arcComplexes)):
42 pointComplex = arcComplexes[pointIndex]
44 path.append(Vector3(pointComplex.real, pointComplex.imag, z))
49 def processElementNode(elementNode):
50 "Process the xml element."
51 elementNode.parentNode.xmlObject.vertexes += getArcPath(elementNode)