70bbc16abe
Inspecting sys.version_info using named component attributes was added in the patch "Some fixes to start support for python3." Named component attributes were only added to sys.version_info in Python 2.7 so their use breaks Cura for Python 2.6. As Cura otherwise works in the still widely used Python 2.6 it seems best to maintain this compatibility.
137 lines
4.4 KiB
Python
137 lines
4.4 KiB
Python
"""
|
|
XML tag writer utilities.
|
|
|
|
"""
|
|
|
|
|
|
from __future__ import absolute_import
|
|
#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.
|
|
import __init__
|
|
|
|
import sys
|
|
|
|
if sys.version_info[0] < 3:
|
|
import cStringIO
|
|
else:
|
|
import io as cStringIO
|
|
|
|
|
|
__author__ = 'Enrique Perez (perez_enrique@yahoo.com)'
|
|
__credits__ = 'Nophead <http://hydraraptor.blogspot.com/>\nArt of Illusion <http://www.artofillusion.org/>'
|
|
__date__ = '$Date: 2008/21/04 $'
|
|
__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
|
|
|
|
|
|
def addBeginEndInnerXMLTag(attributes, depth, innerText, localName, output, text=''):
|
|
'Add the begin and end xml tag and the inner text if any.'
|
|
if len( innerText ) > 0:
|
|
addBeginXMLTag(attributes, depth, localName, output, text)
|
|
output.write( innerText )
|
|
addEndXMLTag(depth, localName, output)
|
|
else:
|
|
addClosedXMLTag(attributes, depth, localName, output, text)
|
|
|
|
def addBeginXMLTag(attributes, depth, localName, output, text=''):
|
|
'Add the begin xml tag.'
|
|
depthStart = '\t' * depth
|
|
output.write('%s<%s%s>%s\n' % (depthStart, localName, getAttributesString(attributes), text))
|
|
|
|
def addClosedXMLTag(attributes, depth, localName, output, text=''):
|
|
'Add the closed xml tag.'
|
|
depthStart = '\t' * depth
|
|
attributesString = getAttributesString(attributes)
|
|
if len(text) > 0:
|
|
output.write('%s<%s%s >%s</%s>\n' % (depthStart, localName, attributesString, text, localName))
|
|
else:
|
|
output.write('%s<%s%s />\n' % (depthStart, localName, attributesString))
|
|
|
|
def addEndXMLTag(depth, localName, output):
|
|
'Add the end xml tag.'
|
|
depthStart = '\t' * depth
|
|
output.write('%s</%s>\n' % (depthStart, localName))
|
|
|
|
def addXMLFromLoopComplexZ(attributes, depth, loop, output, z):
|
|
'Add xml from loop.'
|
|
addBeginXMLTag(attributes, depth, 'path', output)
|
|
for pointComplexIndex in xrange(len(loop)):
|
|
pointComplex = loop[pointComplexIndex]
|
|
addXMLFromXYZ(depth + 1, pointComplexIndex, output, pointComplex.real, pointComplex.imag, z)
|
|
addEndXMLTag(depth, 'path', output)
|
|
|
|
def addXMLFromObjects(depth, objects, output):
|
|
'Add xml from objects.'
|
|
for object in objects:
|
|
object.addXML(depth, output)
|
|
|
|
def addXMLFromVertexes(depth, output, vertexes):
|
|
'Add xml from loop.'
|
|
for vertexIndex in xrange(len(vertexes)):
|
|
vertex = vertexes[vertexIndex]
|
|
addXMLFromXYZ(depth + 1, vertexIndex, output, vertex.x, vertex.y, vertex.z)
|
|
|
|
def addXMLFromXYZ(depth, index, output, x, y, z):
|
|
'Add xml from x, y & z.'
|
|
attributes = {'index' : str(index)}
|
|
if x != 0.0:
|
|
attributes['x'] = str(x)
|
|
if y != 0.0:
|
|
attributes['y'] = str(y)
|
|
if z != 0.0:
|
|
attributes['z'] = str(z)
|
|
addClosedXMLTag(attributes, depth, 'vertex', output)
|
|
|
|
def compareAttributeKeyAscending(key, otherKey):
|
|
'Get comparison in order to sort attribute keys in ascending order, with the id key first and name second.'
|
|
if key == 'id':
|
|
return - 1
|
|
if otherKey == 'id':
|
|
return 1
|
|
if key == 'name':
|
|
return - 1
|
|
if otherKey == 'name':
|
|
return 1
|
|
if key < otherKey:
|
|
return - 1
|
|
return int(key > otherKey)
|
|
|
|
def getAttributesString(attributes):
|
|
'Add the closed xml tag.'
|
|
attributesString = ''
|
|
attributesKeys = attributes.keys()
|
|
attributesKeys.sort(compareAttributeKeyAscending)
|
|
for attributesKey in attributesKeys:
|
|
valueString = str(attributes[attributesKey])
|
|
if "'" in valueString:
|
|
attributesString += ' %s="%s"' % (attributesKey, valueString)
|
|
else:
|
|
attributesString += " %s='%s'" % (attributesKey, valueString)
|
|
return attributesString
|
|
|
|
def getBeginGeometryXMLOutput(elementNode=None):
|
|
'Get the beginning of the string representation of this boolean geometry object info.'
|
|
output = getBeginXMLOutput()
|
|
attributes = {}
|
|
if elementNode != None:
|
|
documentElement = elementNode.getDocumentElement()
|
|
attributes = documentElement.attributes
|
|
addBeginXMLTag(attributes, 0, 'fabmetheus', output)
|
|
return output
|
|
|
|
def getBeginXMLOutput():
|
|
'Get the beginning of the string representation of this object info.'
|
|
output = cStringIO.StringIO()
|
|
output.write("<?xml version='1.0' ?>\n")
|
|
return output
|
|
|
|
def getDictionaryWithoutList(dictionary, withoutList):
|
|
'Get the dictionary without the keys in the list.'
|
|
dictionaryWithoutList = {}
|
|
for key in dictionary:
|
|
if key not in withoutList:
|
|
dictionaryWithoutList[key] = dictionary[key]
|
|
return dictionaryWithoutList
|
|
|
|
def getEndGeometryXMLString(output):
|
|
'Get the string representation of this object info.'
|
|
addEndXMLTag(0, 'fabmetheus', output)
|
|
return output.getvalue()
|