summaryrefslogtreecommitdiffstats
path: root/share/extensions/plotter.py
diff options
context:
space:
mode:
Diffstat (limited to 'share/extensions/plotter.py')
-rw-r--r--share/extensions/plotter.py129
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()