def getReplacedSVGTemplateLines(self, fileName, rotatedBoundaryLayers): "Get the lines of text from the svg_template.txt file." #( layers.length + 1 ) * (margin + sliceDimY * unitScale + txtHeight) + margin + txtHeight + margin + 110 svgTemplateText = gcodec.getFileTextInFileDirectory( __file__, 'svg_template.svg') originalTextLines = gcodec.getTextLines(svgTemplateText) self.margin = getParameterFromJavascript(originalTextLines, 'margin', self.margin) self.textHeight = getParameterFromJavascript(originalTextLines, 'textHeight', self.textHeight) javascriptControlsWidth = getParameterFromJavascript( originalTextLines, 'javascripControlBoxX', 510.0) noJavascriptControlsHeight = getParameterFromJavascript( originalTextLines, 'noJavascriptControlBoxY', 110.0) controlTop = len(rotatedBoundaryLayers) * ( self.margin + self.extent.y * self.unitScale + self.textHeight) + 2.0 * self.margin + self.textHeight # width = margin + (sliceDimX * unitScale) + margin; svgTemplateText = getReplacedInQuotes( 'height', self.getRounded(controlTop + noJavascriptControlsHeight + self.margin), svgTemplateText) width = 2.0 * self.margin + max(self.extent.y * self.unitScale, javascriptControlsWidth) svgTemplateText = getReplacedInQuotes('width', self.getRounded(width), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'layerThickness', self.getRounded(self.layerThickness), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'maxX', self.getRounded(self.cornerMaximum.x), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'minX', self.getRounded(self.cornerMinimum.x), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'dimX', self.getRounded(self.extent.x), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'maxY', self.getRounded(self.cornerMaximum.y), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'minY', self.getRounded(self.cornerMinimum.y), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'dimY', self.getRounded(self.extent.y), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'maxZ', self.getRounded(self.cornerMaximum.z), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'minZ', self.getRounded(self.cornerMinimum.z), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'dimZ', self.getRounded(self.extent.z), svgTemplateText) summarizedFilename = gcodec.getSummarizedFilename( fileName) + ' SVG Slice File' svgTemplateText = getReplacedWordAndInQuotes('Title', summarizedFilename, svgTemplateText) noJavascriptControlsTagString = '<g id="noJavascriptControls" fill="#000" transform="translate(%s, %s)">' % ( self.getRounded(self.margin), self.getRounded(controlTop)) svgTemplateText = getReplacedTagString(noJavascriptControlsTagString, 'noJavascriptControls', svgTemplateText) # <g id="noJavascriptControls" fill="#000" transform="translate(20, 1400)"> return gcodec.getTextLines(svgTemplateText)
def getReplacedSVGTemplateLines( self, fileName, rotatedBoundaryLayers ): "Get the lines of text from the svg_template.tmpl file." #( layers.length + 1 ) * (margin + sliceDimY * unitScale + txtHeight) + margin + txtHeight + margin + 110 svgTemplateText = gcodec.getFileTextInFileDirectory( __file__, 'svg_template.tmpl' ) originalTextLines = gcodec.getTextLines( svgTemplateText ) self.margin = getParameterFromJavascript( originalTextLines, 'margin', self.margin ) self.textHeight = getParameterFromJavascript( originalTextLines, 'textHeight', self.textHeight ) javascriptControlsWidth = getParameterFromJavascript( originalTextLines, 'javascripControlBoxX', 510.0 ) noJavascriptControlsHeight = getParameterFromJavascript( originalTextLines, 'noJavascriptControlBoxY', 110.0 ) controlTop = len( rotatedBoundaryLayers ) * ( self.margin + self.extent.y * self.unitScale + self.textHeight ) + 2.0 * self.margin + self.textHeight # width = margin + (sliceDimX * unitScale) + margin; svgTemplateText = getReplacedInQuotes( 'height', self.getRounded( controlTop + noJavascriptControlsHeight + self.margin ), svgTemplateText ) width = 2.0 * self.margin + max( self.extent.y * self.unitScale, javascriptControlsWidth ) svgTemplateText = getReplacedInQuotes( 'width', self.getRounded( width ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'layerThickness', self.getRounded( self.layerThickness ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'maxX', self.getRounded( self.cornerMaximum.x ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'minX', self.getRounded( self.cornerMinimum.x ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'dimX', self.getRounded( self.extent.x ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'maxY', self.getRounded( self.cornerMaximum.y ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'minY', self.getRounded( self.cornerMinimum.y ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'dimY', self.getRounded( self.extent.y ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'maxZ', self.getRounded( self.cornerMaximum.z ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'minZ', self.getRounded( self.cornerMinimum.z ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'dimZ', self.getRounded( self.extent.z ), svgTemplateText ) summarizedFilename = gcodec.getSummarizedFilename( fileName ) + ' SVG Slice File' svgTemplateText = getReplacedWordAndInQuotes( 'Title', summarizedFilename, svgTemplateText ) noJavascriptControlsTagString = '<g id="noJavascriptControls" fill="#000" transform="translate(%s, %s)">' % ( self.getRounded( self.margin ), self.getRounded( controlTop ) ) svgTemplateText = getReplacedTagString( noJavascriptControlsTagString, 'noJavascriptControls', svgTemplateText ) # <g id="noJavascriptControls" fill="#000" transform="translate(20, 1400)"> return gcodec.getTextLines( svgTemplateText )
def execute( self ): "Export the canvas as an svg file." svgFileName = gcodec.getFilePathWithUnderscoredBasename( self.fileName, self.suffix ) boundingBox = self.canvas.bbox( settings.Tkinter.ALL ) # tuple (w, n, e, s) self.boxW = boundingBox[ 0 ] self.boxN = boundingBox[ 1 ] boxWidth = boundingBox[ 2 ] - self.boxW boxHeight = boundingBox[ 3 ] - self.boxN print( 'Exported svg file saved as ' + svgFileName ) svgTemplateText = gcodec.getFileTextInFileDirectory( settings.__file__, 'svg_canvas.template' ) output = cStringIO.StringIO() lines = gcodec.getTextLines( svgTemplateText ) firstWordTable = {} firstWordTable[ 'height="999px"' ] = ' height="%spx"' % int( round( boxHeight ) ) firstWordTable[ '<!--replaceLineWith_coloredLines-->' ] = self.getCanvasLinesOutput() firstWordTable[ 'replaceLineWithTitle' ] = gcodec.getSummarizedFileName( self.fileName ) firstWordTable[ 'width="999px"' ] = ' width="%spx"' % int( round( boxWidth ) ) for line in lines: parseLineReplace( firstWordTable, line, output ) gcodec.writeFileText( svgFileName, output.getvalue() ) fileExtension = self.fileExtension.value svgProgram = self.svgProgram.value if svgProgram == '': return if svgProgram == 'webbrowser': settings.openWebPage( svgFileName ) return svgFilePath = '"' + os.path.normpath( svgFileName ) + '"' # " to send in file name with spaces shellCommand = svgProgram + ' ' + svgFilePath print( '' ) if fileExtension == '': print( 'Sending the shell command:' ) print( shellCommand ) commandResult = os.system( shellCommand ) if commandResult != 0: print( 'It may be that the system could not find the %s program.' % svgProgram ) print( 'If so, try installing the %s program or look for another one, like the Gnu Image Manipulation Program (Gimp) which can be found at:' % svgProgram ) print( 'http://www.gimp.org/' ) return convertedFileName = gcodec.getFilePathWithUnderscoredBasename( svgFilePath, '.' + fileExtension + '"' ) shellCommand += ' ' + convertedFileName print( 'Sending the shell command:' ) print( shellCommand ) commandResult = os.system( shellCommand ) if commandResult != 0: print( 'The %s program could not convert the svg to the %s file format.' % ( svgProgram, fileExtension ) ) print( 'Try installing the %s program or look for another one, like Image Magick which can be found at:' % svgProgram ) print( 'http://www.imagemagick.org/script/index.php' )
def getReplacedSVGTemplate( self, fileName, procedureName, rotatedBoundaryLayers ): "Get the lines of text from the svg_layer.template file." #( layers.length + 1 ) * (margin + sliceDimY * unitScale + txtHeight) + margin + txtHeight + margin + 110 self.extent = self.cornerMaximum - self.cornerMinimum self.addRotatedLoopLayersToOutput( rotatedBoundaryLayers ) svgTemplateText = gcodec.getFileTextInFileDirectory( __file__, 'svg_layer.template' ) svgTemplateText = getReplacedWordAndInQuotes( 'layerThickness', self.getRounded( self.layerThickness ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'maxX', self.getRounded( self.cornerMaximum.x ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'minX', self.getRounded( self.cornerMinimum.x ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'maxY', self.getRounded( self.cornerMaximum.y ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'minY', self.getRounded( self.cornerMinimum.y ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'maxZ', self.getRounded( self.cornerMaximum.z ), svgTemplateText ) svgTemplateText = getReplacedWordAndInQuotes( 'minZ', self.getRounded( self.cornerMinimum.z ), svgTemplateText ) lines = gcodec.getTextLines( svgTemplateText ) self.margin = getParameterFromJavascript( lines, 'margin', self.margin ) self.textHeight = getParameterFromJavascript( lines, 'textHeight', self.textHeight ) javascriptControlsWidth = getParameterFromJavascript( lines, 'javascripControlBoxX', 510.0 ) noJavascriptControlsHeight = getParameterFromJavascript( lines, 'noJavascriptControlBoxY', 110.0 ) controlTop = len( rotatedBoundaryLayers ) * ( self.margin + self.extent.y * self.unitScale + self.textHeight ) + 2.0 * self.margin + self.textHeight # width = margin + (sliceDimX * unitScale) + margin; width = 2.0 * self.margin + max( self.extent.x * self.unitScale, javascriptControlsWidth ) summarizedFileName = gcodec.getSummarizedFileName( fileName ) + ' SVG Slice File' noJavascriptControlsTagString = ' <g id="noJavascriptControls" fill="#000" transform="translate(%s, %s)">' % ( self.getRounded( self.margin ), self.getRounded( controlTop ) ) firstWordTable = {} firstWordTable[ 'height="999px"' ] = ' height="%spx"' % self.getRounded( controlTop + noJavascriptControlsHeight + self.margin ) firstWordTable[ 'width="999px"' ] = ' width="%spx"' % self.getRounded( width ) firstWordTable[ '<!--replaceLineWith_boundaryLayerLines-->' ] = self.output.getvalue() firstWordTable[ '<!--replaceLineWith_emptyString-->' ] = '' firstWordTable[ '<!--replaceLineWith_noJavascriptControls-->' ] = noJavascriptControlsTagString firstWordTable[ '<!--replaceLineWith_sliceVariableLines-->' ] = self.getInitializationForOutputSVG( procedureName ) replaceWithTable = {} replaceWithTable[ 'replaceWith_Title' ] = summarizedFileName replaceWithTable[ 'replaceWith_dimX' ] = self.getRounded( self.extent.x ) replaceWithTable[ 'replaceWith_dimY' ] = self.getRounded( self.extent.y ) replaceWithTable[ 'replaceWith_dimZ' ] = self.getRounded( self.extent.z ) output = cStringIO.StringIO() for line in lines: parseLineReplaceWithTable( firstWordTable, line, output, replaceWithTable ) return output.getvalue()
def getReplacedSVGTemplate(self, fileName, procedureName, rotatedBoundaryLayers): "Get the lines of text from the svg_layer.template file." #( layers.length + 1 ) * (margin + sliceDimY * unitScale + txtHeight) + margin + txtHeight + margin + 110 self.extent = self.cornerMaximum - self.cornerMinimum self.addRotatedLoopLayersToOutput(rotatedBoundaryLayers) svgTemplateText = gcodec.getFileTextInFileDirectory( __file__, 'svg_layer.template') svgTemplateText = getReplacedWordAndInQuotes( 'layerThickness', self.getRounded(self.layerThickness), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'maxX', self.getRounded(self.cornerMaximum.x), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'minX', self.getRounded(self.cornerMinimum.x), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'maxY', self.getRounded(self.cornerMaximum.y), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'minY', self.getRounded(self.cornerMinimum.y), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'maxZ', self.getRounded(self.cornerMaximum.z), svgTemplateText) svgTemplateText = getReplacedWordAndInQuotes( 'minZ', self.getRounded(self.cornerMinimum.z), svgTemplateText) lines = gcodec.getTextLines(svgTemplateText) self.margin = getParameterFromJavascript(lines, 'margin', self.margin) self.textHeight = getParameterFromJavascript(lines, 'textHeight', self.textHeight) javascriptControlsWidth = getParameterFromJavascript( lines, 'javascripControlBoxX', 510.0) noJavascriptControlsHeight = getParameterFromJavascript( lines, 'noJavascriptControlBoxY', 110.0) controlTop = len(rotatedBoundaryLayers) * ( self.margin + self.extent.y * self.unitScale + self.textHeight) + 2.0 * self.margin + self.textHeight # width = margin + (sliceDimX * unitScale) + margin; width = 2.0 * self.margin + max(self.extent.x * self.unitScale, javascriptControlsWidth) summarizedFileName = gcodec.getSummarizedFileName( fileName) + ' SVG Slice File' noJavascriptControlsTagString = ' <g id="noJavascriptControls" fill="#000" transform="translate(%s, %s)">' % ( self.getRounded(self.margin), self.getRounded(controlTop)) firstWordTable = {} firstWordTable['height="999px"'] = ' height="%spx"' % self.getRounded( controlTop + noJavascriptControlsHeight + self.margin) firstWordTable['width="999px"'] = ' width="%spx"' % self.getRounded( width) firstWordTable[ '<!--replaceLineWith_boundaryLayerLines-->'] = self.output.getvalue( ) firstWordTable['<!--replaceLineWith_emptyString-->'] = '' firstWordTable[ '<!--replaceLineWith_noJavascriptControls-->'] = noJavascriptControlsTagString firstWordTable[ '<!--replaceLineWith_sliceVariableLines-->'] = self.getInitializationForOutputSVG( procedureName) replaceWithTable = {} replaceWithTable['replaceWith_Title'] = summarizedFileName replaceWithTable['replaceWith_dimX'] = self.getRounded(self.extent.x) replaceWithTable['replaceWith_dimY'] = self.getRounded(self.extent.y) replaceWithTable['replaceWith_dimZ'] = self.getRounded(self.extent.z) output = cStringIO.StringIO() for line in lines: parseLineReplaceWithTable(firstWordTable, line, output, replaceWithTable) return output.getvalue()