diff options
Diffstat (limited to 'share/extensions/plotter.py')
| -rw-r--r-- | share/extensions/plotter.py | 129 |
1 files changed, 110 insertions, 19 deletions
diff --git a/share/extensions/plotter.py b/share/extensions/plotter.py index 78d480f05..394f83786 100644 --- a/share/extensions/plotter.py +++ b/share/extensions/plotter.py @@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # standard library import re +import string import sys # local libraries import gettext @@ -38,9 +39,11 @@ class MyEffect(inkex.Effect): self.OptionParser.add_option('--resolutionX', action='store', type='float', dest='resolutionX', default=1016.0, help='Resolution X (dpi)') self.OptionParser.add_option('--resolutionY', action='store', type='float', dest='resolutionY', default=1016.0, help='Resolution Y (dpi)') self.OptionParser.add_option('--pen', action='store', type='int', dest='pen', default=1, help='Pen number') + self.OptionParser.add_option('--force', action='store', type='int', dest='force', default=24, help='Pen force (g)') + self.OptionParser.add_option('--speed', action='store', type='int', dest='speed', default=20, help='Pen speed (cm/s)') self.OptionParser.add_option('--orientation', action='store', type='string', dest='orientation', default='90', help='Rotation (Clockwise)') - self.OptionParser.add_option('--mirrorX', action='store', type='inkbool', dest='mirrorX', default='FALSE', help='Mirror X-axis') - self.OptionParser.add_option('--mirrorY', action='store', type='inkbool', dest='mirrorY', default='FALSE', help='Mirror Y-axis') + self.OptionParser.add_option('--mirrorX', action='store', type='inkbool', dest='mirrorX', default='FALSE', help='Mirror X axis') + self.OptionParser.add_option('--mirrorY', action='store', type='inkbool', dest='mirrorY', default='FALSE', help='Mirror Y axis') self.OptionParser.add_option('--center', action='store', type='inkbool', dest='center', default='FALSE', help='Center zero point') self.OptionParser.add_option('--flat', action='store', type='float', dest='flat', default=1.2, help='Curve flatness') self.OptionParser.add_option('--useOvercut', action='store', type='inkbool', dest='useOvercut', default='TRUE', help='Use overcut') @@ -54,21 +57,13 @@ class MyEffect(inkex.Effect): self.OptionParser.add_option('--serialBaudRate', action='store', type='string', dest='serialBaudRate', default='9600', help='Serial Baud rate') self.OptionParser.add_option('--flowControl', action='store', type='string', dest='flowControl', default='0', help='Flow control') self.OptionParser.add_option('--commandLanguage', action='store', type='string', dest='commandLanguage', default='hpgl', help='Command Language') + self.OptionParser.add_option('--debug', action='store', type='inkbool', dest='debug', default='FALSE', help='Show debug information') def effect(self): - # gracefully exit script when pySerial is missing - try: - import serial - except ImportError, e: - inkex.errormsg(_("pySerial is not installed." - + "\n\n1. Download pySerial here (not the \".exe\"): http://pypi.python.org/pypi/pyserial" - + "\n2. Extract the \"serial\" subfolder from the zip to the following folder: C:\\[Program files]\\inkscape\\python\\Lib\\" - + "\n3. Restart Inkscape.")) - return # get hpgl data myHpglEncoder = hpgl_encoder.hpglEncoder(self) try: - self.hpgl = myHpglEncoder.getHpgl() + self.hpgl, debugObject = myHpglEncoder.getHpgl() except Exception as inst: if inst.args[0] == 'NO_PATHS': # issue error if no paths found @@ -90,13 +85,54 @@ class MyEffect(inkex.Effect): # deliver document to inkscape self.document = doc ''' - if self.options.commandLanguage == 'dmpl': - # convert HPGL to DMPL - self.hpgl = self.hpgl.replace(';', ',') - self.hpgl = self.hpgl.replace('PU', 'U') - self.hpgl = self.hpgl.replace('PD', 'D') - self.hpgl = re.sub(r'IN,SP([0-9]{1,2}),', r';:HAL0P\1EC1', self.hpgl) - self.hpgl += 'Z' + # convert to other formats + if self.options.commandLanguage == 'DMPL': + self.convertToDmpl() + if self.options.commandLanguage == 'ZING': + self.convertToZing() + # output + if self.options.debug: + self.showDebugInfo(debugObject) + else: + self.sendHpglToSerial() + + def convertToDmpl(self): + # convert HPGL to DMPL + # ;: = Initialise plotter + # H = Home position + # A = Absolute pen positioning + # Ln = Line type + # Pn = Pen select + # Vn = velocity + # ECn = Coordinate addressing, 1: 0.001 inch, 5: 0.005 inch, M: 0.1 mm + # D = Pen down + # U = Pen up + # Z = Reset plotter + # n,n, = Coordinate pair + self.hpgl = self.hpgl.replace(';', ',') + self.hpgl = self.hpgl.replace('PU', 'U') + self.hpgl = self.hpgl.replace('PD', 'D') + velocity = '' + if self.options.speed > 0: + velocity = 'V' + str(self.options.speed) + self.hpgl = re.sub(r'IN,SP[0-9]+(,FS[0-9]+)?(,VS[0-9]+)?,', r';:HAL0P' + str(self.options.pen) + velocity + 'EC1', self.hpgl) + self.hpgl += 'Z' + + def convertToZing(self): + # convert HPGL to Zing + self.hpgl = self.hpgl.replace('IN;', 'ZG;') + self.hpgl += '@' + + def sendHpglToSerial(self): + # gracefully exit script when pySerial is missing + try: + import serial + except ImportError, e: + inkex.errormsg(_("pySerial is not installed." + + "\n\n1. Download pySerial here (not the \".exe\"!): http://pypi.python.org/pypi/pyserial" + + "\n2. Extract the \"serial\" subfolder from the zip to the following folder: C:\\[Program files]\\inkscape\\python\\Lib\\" + + "\n3. Restart Inkscape.")) + return # send data to plotter mySerial = serial.Serial() mySerial.port = self.options.serialPort @@ -121,6 +157,61 @@ class MyEffect(inkex.Effect): mySerial.read(2) mySerial.close() + def showDebugInfo(self, debugObject): + # show debug information + inkex.errormsg("---------------------------------\nDebug information\n---------------------------------\n\nSettings:\n") + inkex.errormsg(' Serial Port: ' + str(self.options.serialPort)) + inkex.errormsg(' Serial baud rate: ' + str(self.options.serialBaudRate)) + inkex.errormsg(' Flow control: ' + str(self.options.flowControl)) + inkex.errormsg(' Command language: ' + str(self.options.commandLanguage)) + inkex.errormsg(' Resolution X (dpi): ' + str(self.options.resolutionX)) + inkex.errormsg(' Resolution Y (dpi): ' + str(self.options.resolutionY)) + inkex.errormsg(' Pen number: ' + str(self.options.pen)) + inkex.errormsg(' Pen force (g): ' + str(self.options.force)) + inkex.errormsg(' Pen speed (cm/s): ' + str(self.options.speed)) + inkex.errormsg(' Rotation (Clockwise): ' + str(self.options.orientation)) + inkex.errormsg(' Mirror X axis: ' + str(self.options.mirrorX)) + inkex.errormsg(' Mirror Y axis: ' + str(self.options.mirrorY)) + inkex.errormsg(' Center zero point: ' + str(self.options.center)) + inkex.errormsg(' Use overcut: ' + str(self.options.useOvercut)) + inkex.errormsg(' Overcut (mm): ' + str(self.options.overcut)) + inkex.errormsg(' Use tool offset correction: ' + str(self.options.useToolOffset)) + inkex.errormsg(' Tool offset (mm): ' + str(self.options.toolOffset)) + inkex.errormsg(' Use precut: ' + str(self.options.precut)) + inkex.errormsg(' Curve flatness: ' + str(self.options.flat)) + inkex.errormsg(' X offset (mm): ' + str(self.options.offsetX)) + inkex.errormsg(' Y offset (mm): ' + str(self.options.offsetY)) + inkex.errormsg(' Show debug information: ' + str(self.options.debug)) + inkex.errormsg("\nDocument properties:\n") + version = self.document.getroot().xpath('//@inkscape:version', namespaces=inkex.NSS) + if version: + inkex.errormsg(' Inkscape version: ' + version[0]) + fileName = self.document.getroot().xpath('//@sodipodi:docname', namespaces=inkex.NSS) + if fileName: + inkex.errormsg(' Filename: ' + fileName[0]) + inkex.errormsg(' Document unit: ' + debugObject.documentUnit) + inkex.errormsg(' Width: ' + str(debugObject.debugValues[0]) + ' ' + debugObject.documentUnit) + inkex.errormsg(' Height: ' + str(debugObject.debugValues[1]) + ' ' + debugObject.documentUnit) + if debugObject.debugValues[2] == 0: + inkex.errormsg(' Viewbox Width: -') + inkex.errormsg(' Viewbox Height: -') + else: + inkex.errormsg(' Viewbox Width: ' + str(debugObject.debugValues[2]) + ' ' + debugObject.documentUnit) + inkex.errormsg(' Viewbox Height: ' + str(debugObject.debugValues[3]) + ' ' + debugObject.documentUnit) + inkex.errormsg("\n" + self.options.commandLanguage + " properties:\n") + inkex.errormsg(' Drawing width: ' + str(debugObject.debugValues[6]) + ' ' + debugObject.documentUnit) + inkex.errormsg(' Drawing height: ' + str(debugObject.debugValues[7]) + ' ' + debugObject.documentUnit) + inkex.errormsg(' Drawing width: ' + str(debugObject.debugValues[4]) + ' plotter steps') + inkex.errormsg(' Drawing height: ' + str(debugObject.debugValues[5]) + ' plotter steps') + inkex.errormsg(' Offset X: ' + str(debugObject.offsetX) + ' plotter steps') + inkex.errormsg(' Offset Y: ' + str(debugObject.offsetX) + ' plotter steps') + inkex.errormsg(' Overcut: ' + str(debugObject.overcut) + ' plotter steps') + inkex.errormsg(' Tool offset: ' + str(debugObject.toolOffset) + ' plotter steps') + inkex.errormsg(' Flatness: ' + str(debugObject.flat) + ' plotter steps') + inkex.errormsg(' Tool offset flatness: ' + str(debugObject.toolOffsetFlat) + ' plotter steps') + inkex.errormsg("\n" + self.options.commandLanguage + " data:\n") + inkex.errormsg(self.hpgl) + if __name__ == '__main__': # start extension e = MyEffect() |
