def processXMLElement(xmlElement): "Process the xml element." fileName = evaluate.getEvaluatedValue('file', xmlElement) if fileName == None: return parserFileName = xmlElement.getRoot().parser.fileName absoluteFileName = archive.getAbsoluteFolderPath(parserFileName, fileName) xmlText = '' if fileName.endswith('.xml'): xmlText = archive.getFileText(absoluteFileName) else: xmlText = getXMLFromCarvingFileName(absoluteFileName) if xmlText == '': print( 'The file %s could not be found in the folder which the fabmetheus xml file is in.' % fileName) return if '_importname' in xmlElement.attributeDictionary: xmlElement.importName = xmlElement.attributeDictionary['_importname'] else: xmlElement.importName = archive.getUntilDot(fileName) xmlElement.attributeDictionary['_importname'] = xmlElement.importName XMLSimpleReader(parserFileName, xmlElement, xmlText) originalChildren = xmlElement.children[:] xmlElement.children = [] for child in originalChildren: for subchild in child.children: subchild.setParentAddToChildren(xmlElement) for attributeDictionaryKey in child.attributeDictionary.keys(): if attributeDictionaryKey != 'version': xmlElement.attributeDictionary[ attributeDictionaryKey] = child.attributeDictionary[ attributeDictionaryKey] group.processShape(group.Group, xmlElement)
def getCarving(fileName=''): "Get the carving for the xml file." xmlText = archive.getFileText(fileName) if xmlText == '': return None xmlParser = XMLSimpleReader( fileName, None, xmlText ) lowerClassName = xmlParser.getRoot().className.lower() pluginModule = archive.getModuleWithDirectoryPath( getPluginsDirectoryPath(), lowerClassName ) if pluginModule == None: return None return pluginModule.getCarvingFromParser( xmlParser )
def parseSVG(self, fileName, svgText): "Parse SVG text and store the layers." self.fileName = fileName xmlParser = XMLSimpleReader(fileName, None, svgText) self.root = xmlParser.getRoot() if self.root == None: print( 'Warning, root was None in parseSVG in SVGReader, so nothing will be done for:' ) print(fileName) return self.parseSVGByXMLElement(self.root)
def __init__(self, fontFamily): "Initialize." self.fontFamily = fontFamily self.glyphDictionary = {} self.glyphXMLElementDictionary = {} self.missingGlyph = None fileName = os.path.join(getFontsDirectoryPath(), fontFamily + '.svg') self.xmlParser = XMLSimpleReader(fileName, None, gcodec.getFileText(fileName)) self.fontXMLElement = self.xmlParser.getRoot().getFirstChildWithClassName('defs').getFirstChildWithClassName('font') self.fontFaceXMLElement = self.fontXMLElement.getFirstChildWithClassName('font-face') self.unitsPerEM = float(self.fontFaceXMLElement.attributeDictionary['units-per-em']) glyphXMLElements = self.fontXMLElement.getChildrenWithClassName('glyph') for glyphXMLElement in glyphXMLElements: self.glyphXMLElementDictionary[glyphXMLElement.attributeDictionary['unicode']] = glyphXMLElement
def getCraftedGcode(self, fileName, repository, svgText): "Parse svgText and store the bottom svgText." xmlParser = XMLSimpleReader(fileName, None, svgText) root = xmlParser.getRoot() sliceElements = getSliceElements(root) sliceDictionary = svg_writer.getSliceDictionary(root) decimalPlacesCarried = int(sliceDictionary['decimalPlacesCarried']) layerThickness = float(sliceDictionary['layerThickness']) procedures = sliceDictionary['procedureDone'].split(',') procedures.append('bottom') sliceDictionary['procedureDone'] = ','.join(procedures) zMinimum = 987654321.0 for sliceElement in sliceElements: zMinimum = min(getSliceElementZ(sliceElement), zMinimum) deltaZ = repository.altitude.value + 0.5 * layerThickness - zMinimum for sliceElementIndex, sliceElement in enumerate(sliceElements): z = getSliceElementZ(sliceElement) + deltaZ setSliceElementZ(decimalPlacesCarried, sliceElement, sliceElementIndex, z) output = cStringIO.StringIO() root.addXML(0, output) return output.getvalue()
def getReplacedSVGTemplate(self, fileName, procedureName, rotatedLoopLayers, xmlElement=None): 'Get the lines of text from the layer_template.svg file.' self.extent = self.cornerMaximum - self.cornerMinimum svgTemplateText = archive.getFileText( archive.getTemplatesPath('layer_template.svg')) self.xmlParser = XMLSimpleReader(fileName, None, svgTemplateText) self.svgElement = self.xmlParser.getRoot() svgElementDictionary = self.svgElement.attributeDictionary self.sliceDictionary = getSliceDictionary(self.svgElement) self.controlBoxHeight = float(self.sliceDictionary['controlBoxHeight']) self.controlBoxWidth = float(self.sliceDictionary['controlBoxWidth']) self.margin = float(self.sliceDictionary['margin']) self.marginTop = float(self.sliceDictionary['marginTop']) self.textHeight = float(self.sliceDictionary['textHeight']) self.unitScale = float(self.sliceDictionary['unitScale']) svgMinWidth = float(self.sliceDictionary['svgMinWidth']) self.controlBoxHeightMargin = self.controlBoxHeight + self.marginTop if not self.addLayerTemplateToSVG: self.svgElement.getXMLElementByID( 'layerTextTemplate').removeFromIDNameParent() del self.svgElement.getXMLElementByID( 'sliceElementTemplate').attributeDictionary['transform'] self.graphicsXMLElement = self.svgElement.getXMLElementByID( 'sliceElementTemplate') self.graphicsXMLElement.attributeDictionary['id'] = 'z:' self.addRotatedLoopLayersToOutput(rotatedLoopLayers) self.setMetadataNoscriptElement('layerThickness', 'Layer Thickness: ', self.layerThickness) self.setMetadataNoscriptElement('maxX', 'X: ', self.cornerMaximum.x) self.setMetadataNoscriptElement('minX', 'X: ', self.cornerMinimum.x) self.setMetadataNoscriptElement('maxY', 'Y: ', self.cornerMaximum.y) self.setMetadataNoscriptElement('minY', 'Y: ', self.cornerMinimum.y) self.setMetadataNoscriptElement('maxZ', 'Z: ', self.cornerMaximum.z) self.setMetadataNoscriptElement('minZ', 'Z: ', self.cornerMinimum.z) self.textHeight = float(self.sliceDictionary['textHeight']) controlTop = len(rotatedLoopLayers) * ( self.margin + self.extent.y * self.unitScale + self.textHeight) + self.marginTop + self.textHeight self.svgElement.getFirstChildByLocalName( 'title').text = os.path.basename(fileName) + ' - Slice Layers' svgElementDictionary['height'] = '%spx' % self.getRounded( max(controlTop, self.controlBoxHeightMargin)) width = max(self.extent.x * self.unitScale, svgMinWidth) svgElementDictionary['width'] = '%spx' % self.getRounded(width) self.sliceDictionary['decimalPlacesCarried'] = str( self.decimalPlacesCarried) if self.perimeterWidth != None: self.sliceDictionary['perimeterWidth'] = self.getRounded( self.perimeterWidth) self.sliceDictionary['yAxisPointingUpward'] = 'true' self.sliceDictionary['procedureName'] = procedureName self.setDimensionTexts('dimX', 'X: ' + self.getRounded(self.extent.x)) self.setDimensionTexts('dimY', 'Y: ' + self.getRounded(self.extent.y)) self.setDimensionTexts('dimZ', 'Z: ' + self.getRounded(self.extent.z)) self.setTexts('numberOfLayers', 'Number of Layers: %s' % len(rotatedLoopLayers)) volume = 0.0 for rotatedLoopLayer in rotatedLoopLayers: volume += euclidean.getAreaLoops(rotatedLoopLayer.loops) volume *= 0.001 self.setTexts('volume', 'Volume: %s cm3' % self.getRounded(volume)) if not self.addLayerTemplateToSVG: self.svgElement.getFirstChildByLocalName( 'script').removeFromIDNameParent() self.svgElement.getXMLElementByID( 'isoControlBox').removeFromIDNameParent() self.svgElement.getXMLElementByID( 'layerControlBox').removeFromIDNameParent() self.svgElement.getXMLElementByID( 'scrollControlBox').removeFromIDNameParent() self.graphicsXMLElement.removeFromIDNameParent() self.addOriginalAsComment(xmlElement) output = cStringIO.StringIO() output.write(self.xmlParser.beforeRoot) self.svgElement.addXML(0, output) return xml_simple_writer.getBeforeRootOutput(self.xmlParser)
def parseSVG(self, fileName, svgText): "Parse SVG text and store the layers." self.fileName = fileName xmlParser = XMLSimpleReader(fileName, None, svgText) self.parseSVGByXMLElement(xmlParser.getRoot())
def getReplacedSVGTemplate(self, fileName, procedureName, rotatedBoundaryLayers, xmlElement=None): "Get the lines of text from the layer_template.svg file." # ( layers.length + 1 ) * (margin + sliceDimY * unitScale + txtHeight) + margin + txtHeight + margin + 110 cornerMaximum = self.carving.getCarveCornerMaximum() cornerMinimum = self.carving.getCarveCornerMinimum() self.extent = cornerMaximum - cornerMinimum svgTemplateText = archive.getFileTextInFileDirectory( __file__, os.path.join('templates', 'layer_template.svg')) self.xmlParser = XMLSimpleReader(fileName, None, svgTemplateText) self.svgElement = self.xmlParser.getRoot() if not self.addLayerTemplateToSVG: self.svgElement.getXMLElementByID( 'layerTextTemplate').removeFromIDNameParent() del self.svgElement.getXMLElementByID( 'sliceElementTemplate').attributeDictionary['transform'] svgElementDictionary = self.svgElement.attributeDictionary self.graphicsXMLElement = self.svgElement.getXMLElementByID( 'sliceElementTemplate') self.graphicsXMLElement.attributeDictionary['id'] = 'z:' self.addRotatedLoopLayersToOutput(rotatedBoundaryLayers) self.sliceDictionary = getSliceDictionary(self.svgElement) self.setMetadataNoscriptElement('layerThickness', self.carving.getCarveLayerThickness()) self.setMetadataNoscriptElement('maxX', cornerMaximum.x) self.setMetadataNoscriptElement('minX', cornerMinimum.x) self.setMetadataNoscriptElement('maxY', cornerMaximum.y) self.setMetadataNoscriptElement('minY', cornerMinimum.y) self.setMetadataNoscriptElement('maxZ', cornerMaximum.z) self.setMetadataNoscriptElement('minZ', cornerMinimum.z) self.margin = float(self.sliceDictionary['margin']) self.textHeight = float(self.sliceDictionary['textHeight']) javascriptControlBoxWidth = float( self.sliceDictionary['javascriptControlBoxWidth']) noJavascriptControlBoxHeight = float( self.sliceDictionary['noJavascriptControlBoxHeight']) controlTop = len(rotatedBoundaryLayers) * ( self.margin + self.extent.y * self.unitScale + self.textHeight) + 2.0 * self.margin + self.textHeight self.svgElement.getFirstChildWithClassName( 'title').text = os.path.basename(fileName) + ' - Slice Layers' svgElementDictionary['height'] = '%spx' % self.getRounded( controlTop + noJavascriptControlBoxHeight + self.margin) # width = margin + (sliceDimX * unitScale) + margin; width = 2.0 * self.margin + max(self.extent.x * self.unitScale, javascriptControlBoxWidth) svgElementDictionary['width'] = '%spx' % self.getRounded(width) self.sliceDictionary['decimalPlacesCarried'] = str( self.decimalPlacesCarried) if self.perimeterWidth != None: self.sliceDictionary['perimeterWidth'] = self.getRounded( self.perimeterWidth) self.sliceDictionary['yAxisPointingUpward'] = 'true' self.sliceDictionary['procedureDone'] = procedureName noJavascriptDictionary = self.svgElement.getXMLElementByID( 'noJavascriptControls').attributeDictionary noJavascriptDictionary['transform'] = 'translate(%s, %s)' % ( self.getRounded(self.margin), self.getRounded(controlTop)) self.svgElement.getXMLElementByID( 'dimXNoJavascript').text = self.getRounded(self.extent.x) self.svgElement.getXMLElementByID( 'dimYNoJavascript').text = self.getRounded(self.extent.y) self.svgElement.getXMLElementByID( 'dimZNoJavascript').text = self.getRounded(self.extent.z) if not self.addLayerTemplateToSVG: self.svgElement.getFirstChildWithClassName( 'script').removeFromIDNameParent() self.svgElement.getXMLElementByID( 'beginningOfControlSection').removeFromIDNameParent() self.svgElement.getXMLElementByID( 'noJavascriptControls').removeFromIDNameParent() self.graphicsXMLElement.removeFromIDNameParent() self.addOriginalAsComment(xmlElement) output = cStringIO.StringIO() output.write(self.xmlParser.beforeRoot) self.svgElement.addXML(0, output) return output.getvalue()