OctoPrint/Cura/cura_sf/fabmetheus_utilities/xml_simple_writer.py
Stefan Blanke 70bbc16abe Fix version detection for all Python versions
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.
2012-06-22 14:37:52 +01:00

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()