From 297f45e2e4ab293f036a7199ec80f9c3008cdcb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20W=C3=BCst?= Date: Sun, 10 Nov 2013 14:06:03 +0100 Subject: fixed and optimized pyserial usage, added dmpl support, small stuff (bzr r12787) --- share/extensions/hpgl_decoder.py | 13 ++++--- share/extensions/hpgl_encoder.py | 2 +- share/extensions/hpgl_input.py | 14 ++++--- share/extensions/hpgl_output.py | 8 ++-- share/extensions/plotter.inx | 10 +++-- share/extensions/plotter.py | 84 ++++++++++++++++++++++------------------ 6 files changed, 74 insertions(+), 57 deletions(-) diff --git a/share/extensions/hpgl_decoder.py b/share/extensions/hpgl_decoder.py index 870775cb2..0af2d5f5f 100644 --- a/share/extensions/hpgl_decoder.py +++ b/share/extensions/hpgl_decoder.py @@ -38,17 +38,18 @@ class hpglDecoder: self.options = options self.scaleX = options.resolutionX / 90.0 # dots/inch to dots/pixels self.scaleY = options.resolutionY / 90.0 # dots/inch to dots/pixels - self.warnings = [] + self.warning = '' + self.textMovements = _("Movements") + self.textPenNumber = _("Pen #") def getSvg(self): - # parse hpgl data # prepare document self.doc = inkex.etree.parse(StringIO('' % (self.options.docWidth, self.options.docHeight))) actualLayer = 0 self.layers = {} if self.options.showMovements: - self.layers[0] = inkex.etree.SubElement(self.doc.getroot(), 'g', {inkex.addNS('groupmode', 'inkscape'): 'layer', inkex.addNS('label', 'inkscape'): 'Movements'}) + self.layers[0] = inkex.etree.SubElement(self.doc.getroot(), 'g', {inkex.addNS('groupmode', 'inkscape'): 'layer', inkex.addNS('label', 'inkscape'): self.textMovements}) # parse paths hpglData = self.hpglString.split(';') if len(hpglData) < 3: @@ -89,14 +90,14 @@ class hpglDecoder: parameterString = ','.join(parameter) path += ' L %s' % parameterString else: - self.warnings.append('UNKNOWN_COMMANDS') + self.warning = 'UNKNOWN_COMMANDS' if ' L ' in path: self.addPathToLayer(path, actualLayer) - return (self.doc, self.warnings) + return (self.doc, self.warning) def createLayer(self, layerNumber): self.layers[layerNumber] = inkex.etree.SubElement(self.doc.getroot(), 'g', - {inkex.addNS('groupmode', 'inkscape'): 'layer', inkex.addNS('label', 'inkscape'): 'Drawing Pen ' + layerNumber}) + {inkex.addNS('groupmode', 'inkscape'): 'layer', inkex.addNS('label', 'inkscape'): self.textPenNumber + layerNumber}) def addPathToLayer(self, path, layerNumber): lineColor = '000000' diff --git a/share/extensions/hpgl_encoder.py b/share/extensions/hpgl_encoder.py index 90d2734be..4523afb7f 100644 --- a/share/extensions/hpgl_encoder.py +++ b/share/extensions/hpgl_encoder.py @@ -125,7 +125,7 @@ class hpglEncoder: style = group.get('style') if style: style = simplestyle.parseStyle(style) - if style.has_key('display'): + if 'display' in style: if style['display'] == 'none': return trans = group.get('transform') diff --git a/share/extensions/hpgl_input.py b/share/extensions/hpgl_input.py index d1d46c76f..93dd5a6c2 100644 --- a/share/extensions/hpgl_input.py +++ b/share/extensions/hpgl_input.py @@ -53,18 +53,20 @@ hpglString = ';'.join(hpglString) myHpglDecoder = hpgl_decoder.hpglDecoder(hpglString, options) try: doc, warnings = myHpglDecoder.getSvg() - # issue warning if unknown commands where found - if 'UNKNOWN_COMMANDS' in warnings: - inkex.errormsg(_("The HPGL data contained unknown (unsupported) commands, there is a possibility that the drawing is missing some content.")) - # deliver document to inkscape - doc.write(inkex.sys.stdout) except Exception as inst: if inst.args[0] == 'NO_HPGL_DATA': # issue error if no hpgl data found inkex.errormsg(_("No HPGL data found.")) - print 1 + exit(1) else: type, value, traceback = sys.exc_info() raise ValueError, ("", type, value), traceback +# issue warning if unknown commands where found +if 'UNKNOWN_COMMANDS' in warnings: + inkex.errormsg(_("The HPGL data contained unknown (unsupported) commands, there is a possibility that the drawing is missing some content.")) + +# deliver document to inkscape +doc.write(inkex.sys.stdout) + # vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99 \ No newline at end of file diff --git a/share/extensions/hpgl_output.py b/share/extensions/hpgl_output.py index c5fec0ec8..94596a4a0 100755 --- a/share/extensions/hpgl_output.py +++ b/share/extensions/hpgl_output.py @@ -35,7 +35,7 @@ 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('--orientation', action='store', type='string', dest='orientation', default='90', help='orientation') + 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('--center', action='store', type='inkbool', dest='center', default='FALSE', help='Center zero point') @@ -57,14 +57,16 @@ class MyEffect(inkex.Effect): if inst.args[0] == 'NO_PATHS': # issue error if no paths found inkex.errormsg(_("No paths where found. Please convert all objects you want to save into paths.")) - self.hpgl = 1 + self.hpgl = '' + return else: type, value, traceback = sys.exc_info() raise ValueError, ("", type, value), traceback def output(self): # print to file - print self.hpgl + if self.hpgl != '': + print self.hpgl if __name__ == '__main__': # Raise recursion limit to avoid exceptions on big documents diff --git a/share/extensions/plotter.inx b/share/extensions/plotter.inx index 526ab1bd3..49bcf837e 100644 --- a/share/extensions/plotter.inx +++ b/share/extensions/plotter.inx @@ -26,11 +26,15 @@ - - <_option value="">None + <_option value="xonxoff">Software (XON/XOFF) <_option value="rtscts">Hardware (RTS/CTS) <_option value="dsrdtrrtscts">Hardware (DSR/DTR + RTS/CTS) + <_option value="">None + + + +   <_param name="serialHelp" type="description">This can be a physical serial connection or a USB-to-Serial bridge. Ask your plotter manufacturer for drivers if needed. @@ -38,7 +42,7 @@ <_param name="hpglNote" type="description">Please note that only the HPGL command language is supported at the moment. - 1 + 1 1016.0 1016.0 false diff --git a/share/extensions/plotter.py b/share/extensions/plotter.py index d518de4c9..e1d20c01b 100644 --- a/share/extensions/plotter.py +++ b/share/extensions/plotter.py @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ''' # standard library +import re import sys # local libraries import gettext @@ -28,31 +29,31 @@ import inkex inkex.localize() -# TODO: Unittests -# TODO: Material feed after plot, plot rectangles +# TODO: Unittests, Material feed after plot, plot rectangles and circles (convert to paths), maybe interpret layers as pens class MyEffect(inkex.Effect): def __init__(self): inkex.Effect.__init__(self) - self.OptionParser.add_option('--tab', action='store', type='string', dest='tab') - 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('--orientation', action='store', type='string', dest='orientation', default='90', help='orientation') - 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') - self.OptionParser.add_option('--overcut', action='store', type='float', dest='overcut', default=1.0, help='Overcut (mm)') - self.OptionParser.add_option('--useToolOffset', action='store', type='inkbool', dest='useToolOffset', default='TRUE', help='Correct tool offset') - self.OptionParser.add_option('--toolOffset', action='store', type='float', dest='toolOffset', default=0.25, help='Tool offset (mm)') - self.OptionParser.add_option('--precut', action='store', type='inkbool', dest='precut', default='TRUE', help='Use precut') - self.OptionParser.add_option('--offsetX', action='store', type='float', dest='offsetX', default=0.0, help='X offset (mm)') - self.OptionParser.add_option('--offsetY', action='store', type='float', dest='offsetY', default=0.0, help='Y offset (mm)') - self.OptionParser.add_option('--serialPort', action='store', type='string', dest='serialPort', default='COM1', help='Serial port') - 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('--tab', action='store', type='string', dest='tab') + 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('--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('--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') + self.OptionParser.add_option('--overcut', action='store', type='float', dest='overcut', default=1.0, help='Overcut (mm)') + self.OptionParser.add_option('--useToolOffset', action='store', type='inkbool', dest='useToolOffset', default='TRUE', help='Correct tool offset') + self.OptionParser.add_option('--toolOffset', action='store', type='float', dest='toolOffset', default=0.25, help='Tool offset (mm)') + self.OptionParser.add_option('--precut', action='store', type='inkbool', dest='precut', default='TRUE', help='Use precut') + self.OptionParser.add_option('--offsetX', action='store', type='float', dest='offsetX', default=0.0, help='X offset (mm)') + self.OptionParser.add_option('--offsetY', action='store', type='float', dest='offsetY', default=0.0, help='Y offset (mm)') + self.OptionParser.add_option('--serialPort', action='store', type='string', dest='serialPort', default='COM1', help='Serial port') + 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') def effect(self): # gracefully exit script when pySerial is missing @@ -64,7 +65,6 @@ class MyEffect(inkex.Effect): + "\n2. Extract the \"serial\" subfolder from the zip to the following folder: C:\\[Program files]\\inkscape\\python\\Lib\\" + "\n3. Restart Inkscape.")) return - # TODO: Maybe implement DMPL? # get hpgl data myHpglEncoder = hpgl_encoder.hpglEncoder(self) try: @@ -76,7 +76,7 @@ class MyEffect(inkex.Effect): return 1 else: type, value, traceback = sys.exc_info() - raise ValueError, ("", type, value), traceback + raise ValueError, ('', type, value), traceback # TODO: Get preview to work. This requires some work on the C++ side to be able to determine if it is # a preview or a final run. (Remember to set to true) ''' @@ -95,31 +95,39 @@ class MyEffect(inkex.Effect): pass else: type, value, traceback = sys.exc_info() - raise ValueError, ("", type, value), traceback + raise ValueError, ('', type, value), traceback ''' + 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';:HAEC1L0P\1', self.hpgl) + self.hpgl += 'Z' # send data to plotter + mySerial = serial.Serial() + mySerial.port = self.options.serialPort + mySerial.baudrate = self.options.serialBaudRate if self.options.flowControl == 'xonxoff': - mySerial = serial.Serial(port=self.options.serialPort, baudrate=self.options.serialBaudRate, timeout=0.1, writeTimeout=10, xonxoff=True) - elif self.options.flowControl == 'rtscts': - mySerial = serial.Serial(port=self.options.serialPort, baudrate=self.options.serialBaudRate, timeout=0.1, writeTimeout=10, rtscts=True) - elif self.options.flowControl == 'dsrdtrrtscts': - mySerial = serial.Serial(port=self.options.serialPort, baudrate=self.options.serialBaudRate, timeout=0.1, writeTimeout=10, dsrdtr=True, rtscts=True) - else: - mySerial = serial.Serial(port=self.options.serialPort, baudrate=self.options.serialBaudRate, timeout=0.1, writeTimeout=10) + mySerial.xonxoff = True + if self.options.flowControl == 'rtscts' or self.options.flowControl == 'dsrdtrrtscts': + mySerial.rtscts = True + if self.options.flowControl == 'dsrdtrrtscts': + mySerial.dsrdtr = True try: - mySerial.write(self.hpgl) + mySerial.open() except Exception as inst: - if inst.args[0] == 'Write timeout': - inkex.errormsg(_("Could not send data. Please check that your plotter is running, connected and the settings are correct.")) + if 'ould not open port' in inst.args[0]: + inkex.errormsg(_("Could not open port. Please check that your plotter is running, connected and the settings are correct.")) + return else: type, value, traceback = sys.exc_info() - raise ValueError, ("", type, value), traceback - # Read back 2 chars to avoid plotter not plotting last command (I have no idea why this is necessary) - mySerial.read(2) + raise ValueError, ('', type, value), traceback + mySerial.write(self.hpgl) mySerial.close() if __name__ == '__main__': - # Raise recursion limit to avoid exceptions on big documents + # raise recursion limit to avoid exceptions on big documents sys.setrecursionlimit(20000) # start extension e = MyEffect() -- cgit v1.2.3 From 31200d3808485f03fdd4606a22674a3e085e6cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20W=C3=BCst?= Date: Sun, 10 Nov 2013 16:36:52 +0100 Subject: fixed dmpl init sequence (bzr r12788) --- share/extensions/plotter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/extensions/plotter.py b/share/extensions/plotter.py index e1d20c01b..d2ca75fb3 100644 --- a/share/extensions/plotter.py +++ b/share/extensions/plotter.py @@ -102,7 +102,7 @@ class MyEffect(inkex.Effect): 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';:HAEC1L0P\1', self.hpgl) + self.hpgl = re.sub(r'IN,SP([0-9]{1,2}),', r';:HAL0P\1EC1', self.hpgl) self.hpgl += 'Z' # send data to plotter mySerial = serial.Serial() -- cgit v1.2.3 From 952d5210c91247e02ab1204017c2686f90554854 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Sun, 10 Nov 2013 22:21:30 +0100 Subject: Fix make check. (bzr r12789) --- po/POTFILES.in | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index 1e7d89cbd..4550df1b3 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,16 +1,13 @@ # List of source files containing translatable strings. # Please keep this file sorted alphabetically. -# Generated by ./generate_POTFILES.sh at nie, 1 wrz 2013, 17:32:54 CEST +# Generated by ./generate_POTFILES.sh at So 10. Nov 22:17:04 CET 2013 [encoding: UTF-8] inkscape.desktop.in share/filters/filters.svg.h share/palettes/palettes.h share/patterns/patterns.svg.h -src/arc-context.cpp -src/box3d-context.cpp src/box3d.cpp src/color-profile.cpp -src/connector-context.cpp src/context-fns.cpp src/desktop.cpp src/desktop-events.cpp @@ -18,11 +15,6 @@ src/display/canvas-axonomgrid.cpp src/display/canvas-grid.cpp src/display/snap-indicator.cpp src/document.cpp -src/draw-context.cpp -src/dropper-context.cpp -src/dyna-draw-context.cpp -src/eraser-context.cpp -src/event-context.cpp src/event-log.cpp src/extension/dependency.cpp src/extension/effect.cpp @@ -115,9 +107,7 @@ src/extension/prefdialog.cpp src/extension/system.cpp src/file.cpp src/filter-enums.cpp -src/flood-context.cpp src/gradient-chemistry.cpp -src/gradient-context.cpp src/gradient-drag.cpp src/inkscape.cpp src/interface.cpp @@ -182,22 +172,16 @@ src/live_effects/parameter/random.cpp src/live_effects/parameter/text.cpp src/live_effects/parameter/unit.cpp src/live_effects/parameter/vector.cpp -src/lpe-tool-context.cpp src/main-cmdlineact.cpp src/main.cpp src/menus-skeleton.h -src/mesh-context.cpp src/object-edit.cpp src/path-chemistry.cpp -src/pencil-context.cpp -src/pen-context.cpp src/persp3d.cpp src/preferences.cpp src/preferences-skeleton.h src/rdf.cpp -src/rect-context.cpp src/resource-manager.cpp -src/select-context.cpp src/selection-chemistry.cpp src/selection-describer.cpp src/seltrans.cpp @@ -209,7 +193,6 @@ src/sp-flowregion.cpp src/sp-flowtext.cpp src/sp-guide.cpp src/sp-image.cpp -src/spiral-context.cpp src/sp-item.cpp src/sp-item-group.cpp src/sp-line.cpp @@ -220,7 +203,6 @@ src/sp-offset.cpp src/sp-path.cpp src/sp-polygon.cpp src/sp-polyline.cpp -src/spray-context.cpp src/sp-rect.cpp src/sp-spiral.cpp src/sp-star.cpp @@ -229,14 +211,11 @@ src/sp-text.cpp src/sp-tref.cpp src/sp-tspan.cpp src/sp-use.cpp -src/star-context.cpp src/text-chemistry.cpp -src/text-context.cpp src/text-editing.cpp src/tools-switch.cpp src/trace/potrace/inkscape-potrace.cpp src/trace/trace.cpp -src/tweak-context.cpp src/ui/clipboard.cpp src/ui/dialog/aboutbox.cpp src/ui/dialog/align-and-distribute.cpp @@ -286,8 +265,29 @@ src/ui/dialog/xml-tree.cpp src/ui/tool/curve-drag-point.cpp src/ui/tool/multi-path-manipulator.cpp src/ui/tool/node.cpp -src/ui/tool/node-tool.cpp src/ui/tool/path-manipulator.cpp +src/ui/tools/arc-tool.cpp +src/ui/tools/box3d-tool.cpp +src/ui/tools/calligraphic-tool.cpp +src/ui/tools/connector-tool.cpp +src/ui/tools/dropper-tool.cpp +src/ui/tools/eraser-tool.cpp +src/ui/tools/flood-tool.cpp +src/ui/tools/freehand-base.cpp +src/ui/tools/gradient-tool.cpp +src/ui/tools/lpe-tool.cpp +src/ui/tools/mesh-tool.cpp +src/ui/tools/node-tool.cpp +src/ui/tools/pencil-tool.cpp +src/ui/tools/pen-tool.cpp +src/ui/tools/rect-tool.cpp +src/ui/tools/select-tool.cpp +src/ui/tools/spiral-tool.cpp +src/ui/tools/spray-tool.cpp +src/ui/tools/star-tool.cpp +src/ui/tools/text-tool.cpp +src/ui/tools/tool-base.cpp +src/ui/tools/tweak-tool.cpp src/ui/tool/transform-handle-set.cpp src/ui/widget/combo-enums.h src/ui/widget/entity-entry.cpp @@ -441,6 +441,7 @@ share/extensions/wireframe_sphere.py [type: gettext/xml] share/extensions/edge3d.inx [type: gettext/xml] share/extensions/embedimage.inx [type: gettext/xml] share/extensions/embedselectedimages.inx +[type: gettext/xml] share/extensions/empty_page.inx [type: gettext/xml] share/extensions/eps_input.inx [type: gettext/xml] share/extensions/eqtexsvg.inx [type: gettext/xml] share/extensions/export_gimp_palette.inx -- cgit v1.2.3 From 2115fb7086af14160a0a0cc30534d23eea7fd801 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Mon, 11 Nov 2013 17:24:12 +0100 Subject: Fix for Bug #1249390 (filter with feImage with empty href crashes inkscape). Fixed bugs: - https://launchpad.net/bugs/1249390 (bzr r12790) --- src/display/nr-filter-image.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/display/nr-filter-image.cpp b/src/display/nr-filter-image.cpp index 4ca4cd07c..92bb9dcaa 100644 --- a/src/display/nr-filter-image.cpp +++ b/src/display/nr-filter-image.cpp @@ -163,6 +163,10 @@ void FilterImage::render_cairo(FilterSlot &slot) broken_ref = false; } + if (broken_ref) { + return; + } + cairo_surface_t *image_surface = image->getSurfaceRaw(); Geom::Rect sa = slot.get_slot_area(); -- cgit v1.2.3 From a2ff4f311743bf5dc3ace8f60d0969f92ace6a2d Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Mon, 11 Nov 2013 16:30:38 -0500 Subject: extensions. dxf output. do not output arc where start = end (Bug 1248104) Fixed bugs: - https://launchpad.net/bugs/1248104 (bzr r12791) --- share/extensions/cubicsuperpath.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/share/extensions/cubicsuperpath.py b/share/extensions/cubicsuperpath.py index da46f8080..925efdb04 100755 --- a/share/extensions/cubicsuperpath.py +++ b/share/extensions/cubicsuperpath.py @@ -46,8 +46,8 @@ def ArcToPath(p1,params): rx,ry,teta,longflag,sweepflag,x2,y2=params[:] teta = teta*pi/180.0 B=[x2,y2] - if rx==0 or ry==0: - return([[A,A,A],[B,B,B]]) + if rx==0 or ry==0 or A==B: + return([[A[:],A[:],A[:]],[B[:],B[:],B[:]]]) mat=matprod((rotmat(teta),[[1/rx,0],[0,1/ry]],rotmat(-teta))) applymat(mat, A) applymat(mat, B) -- cgit v1.2.3 From 4c0b8ebe91ff2d79424662a9be246597d08236fa Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Mon, 11 Nov 2013 22:58:43 +0100 Subject: Fix make check again, new translatable strings have been added in r12787. (bzr r12792) --- po/POTFILES.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index 4550df1b3..3a1bfbfbb 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,6 +1,6 @@ # List of source files containing translatable strings. # Please keep this file sorted alphabetically. -# Generated by ./generate_POTFILES.sh at So 10. Nov 22:17:04 CET 2013 +# Generated by ./generate_POTFILES.sh at Mo 11. Nov 22:57:25 CET 2013 [encoding: UTF-8] inkscape.desktop.in share/filters/filters.svg.h @@ -364,6 +364,7 @@ share/extensions/generate_voronoi.py share/extensions/gimp_xcf.py share/extensions/guides_creator.py share/extensions/guillotine.py +share/extensions/hpgl_decoder.py share/extensions/hpgl_input.py share/extensions/hpgl_output.py share/extensions/inkex.py -- cgit v1.2.3 From e58d9e092e8717807db86836c65845d1a52be6d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20W=C3=BCst?= Date: Tue, 12 Nov 2013 00:52:44 +0100 Subject: removed recursion to avoid problems on big documents (bzr r12793) --- share/extensions/hpgl_encoder.py | 63 +++++++++++++++++++++++++--------------- share/extensions/hpgl_output.py | 2 -- share/extensions/plotter.py | 2 -- 3 files changed, 40 insertions(+), 27 deletions(-) diff --git a/share/extensions/hpgl_encoder.py b/share/extensions/hpgl_encoder.py index 4523afb7f..7623751b6 100644 --- a/share/extensions/hpgl_encoder.py +++ b/share/extensions/hpgl_encoder.py @@ -88,10 +88,10 @@ class hpglEncoder: def getHpgl(self): # dryRun to find edges - self.groupmat = [[[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, 0.0], [0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, 0.0]]] - self.groupmat[0] = simpletransform.composeTransform(self.groupmat[0], simpletransform.parseTransform('rotate(' + self.options.orientation + ')')) + groupmat = [[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, 0.0], [0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, 0.0]] + groupmat = simpletransform.composeTransform(groupmat, simpletransform.parseTransform('rotate(' + self.options.orientation + ')')) self.vData = [['', -1.0, -1.0], ['', -1.0, -1.0], ['', -1.0, -1.0], ['', -1.0, -1.0]] - self.process_group(self.doc, self.groupmat) + self.process_groups(self.doc, groupmat) if self.divergenceX == 'False' or self.divergenceY == 'False' or self.sizeX == 'False' or self.sizeY == 'False': raise Exception('NO_PATHS') # live run @@ -102,9 +102,9 @@ class hpglEncoder: elif self.options.useToolOffset: self.options.offsetX += self.options.toolOffset self.options.offsetY += self.options.toolOffset - self.groupmat = [[[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, - self.divergenceX + self.options.offsetX], - [0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, - self.divergenceY + self.options.offsetY]]] - self.groupmat[0] = simpletransform.composeTransform(self.groupmat[0], simpletransform.parseTransform('rotate(' + self.options.orientation + ')')) + groupmat = [[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, - self.divergenceX + self.options.offsetX], + [0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, - self.divergenceY + self.options.offsetY]] + groupmat = simpletransform.composeTransform(groupmat, simpletransform.parseTransform('rotate(' + self.options.orientation + ')')) self.vData = [['', -1.0, -1.0], ['', -1.0, -1.0], ['', -1.0, -1.0], ['', -1.0, -1.0]] # store first hpgl commands self.hpgl = 'IN;SP%d' % self.options.pen @@ -113,32 +113,49 @@ class hpglEncoder: self.calcOffset('PU', 0, 0) self.calcOffset('PD', 0, self.options.toolOffset * 8) # start conversion - self.process_group(self.doc, self.groupmat) + self.process_groups(self.doc, groupmat) # shift an empty node in in order to process last node in cache self.calcOffset('PU', 0, 0) # add return to zero point self.hpgl += ';PU0,0;' return self.hpgl - def process_group(self, group, groupmat): - # process groups + def process_groups(self, doc, groupmat): + # flatten groups to avoid recursion + paths = [] + for node in doc: + if (node.tag == inkex.addNS('g', 'svg') and self.isGroupVisible(node)) or node.tag == inkex.addNS('path', 'svg'): + paths.append([node.tag, node, self.mergeTransform(node, groupmat)]) + doc = '' + hasGroups = True + while hasGroups: + hasGroups = False + for i, elm in enumerate(paths): + if paths[i][0] == inkex.addNS('g', 'svg') and self.isGroupVisible(paths[i][1]): + hasGroups = True + for path in paths[i][1]: + if (path.tag == inkex.addNS('g', 'svg') and self.isGroupVisible(path)) or path.tag == inkex.addNS('path', 'svg'): + paths.append([path.tag, path, self.mergeTransform(path, paths[i][2])]) + paths[i][0] = '' + for node in paths: + if node[0] == inkex.addNS('path', 'svg'): + self.process_path(node[1], node[2]) + + def mergeTransform(self, doc, matrix): + # get and merge two matrixes into one + trans = doc.get('transform') + if trans: + return simpletransform.composeTransform(matrix, simpletransform.parseTransform(trans)) + else: + return matrix + + def isGroupVisible(self, group): style = group.get('style') if style: style = simplestyle.parseStyle(style) - if 'display' in style: - if style['display'] == 'none': - return - trans = group.get('transform') - if trans: - groupmat.append(simpletransform.composeTransform(groupmat[-1], simpletransform.parseTransform(trans))) - for node in group: - if node.tag == inkex.addNS('path', 'svg'): - self.process_path(node, groupmat[-1]) - if node.tag == inkex.addNS('g', 'svg'): - # TODO: Remove recursion - self.process_group(node, groupmat) - if trans: - groupmat.pop() + if 'display' in style and style['display'] == 'none': + return False + return True def process_path(self, node, mat): # process path diff --git a/share/extensions/hpgl_output.py b/share/extensions/hpgl_output.py index 94596a4a0..93be82980 100755 --- a/share/extensions/hpgl_output.py +++ b/share/extensions/hpgl_output.py @@ -69,8 +69,6 @@ class MyEffect(inkex.Effect): print self.hpgl if __name__ == '__main__': - # Raise recursion limit to avoid exceptions on big documents - sys.setrecursionlimit(20000) # start extension e = MyEffect() e.affect() diff --git a/share/extensions/plotter.py b/share/extensions/plotter.py index d2ca75fb3..6cc235228 100644 --- a/share/extensions/plotter.py +++ b/share/extensions/plotter.py @@ -127,8 +127,6 @@ class MyEffect(inkex.Effect): mySerial.close() if __name__ == '__main__': - # raise recursion limit to avoid exceptions on big documents - sys.setrecursionlimit(20000) # start extension e = MyEffect() e.affect() -- cgit v1.2.3 From f8a064e45c3d5571d27bbda9ffcfeacd22398b49 Mon Sep 17 00:00:00 2001 From: Markus Engel Date: Tue, 12 Nov 2013 01:51:18 +0100 Subject: Fix bug in SPSwitch. Fixed bugs: - https://launchpad.net/bugs/1249862 (bzr r12794) --- src/sp-item-group.h | 2 +- src/sp-switch.cpp | 1 + src/sp-switch.h | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/sp-item-group.h b/src/sp-item-group.h index deb80a641..2004a72b8 100644 --- a/src/sp-item-group.h +++ b/src/sp-item-group.h @@ -55,7 +55,7 @@ public: void scaleChildItemsRec(Geom::Scale const &sc, Geom::Point const &p); gint getItemCount() const; - void _showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags); + virtual void _showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags); private: void _updateLayerMode(unsigned int display_key=0); diff --git a/src/sp-switch.cpp b/src/sp-switch.cpp index 5c88d7af8..b4841c0d0 100644 --- a/src/sp-switch.cpp +++ b/src/sp-switch.cpp @@ -40,6 +40,7 @@ SPSwitch::SPSwitch() : SPGroup() { } SPSwitch::~SPSwitch() { + _releaseLastItem(_cached_item); } SPObject *SPSwitch::_evaluateFirst() { diff --git a/src/sp-switch.h b/src/sp-switch.h index 3ccc9e3b7..c35982860 100644 --- a/src/sp-switch.h +++ b/src/sp-switch.h @@ -28,7 +28,7 @@ public: void resetChildEvaluated() { _reevaluate(); } GSList *_childList(bool add_ref, SPObject::Action action); - void _showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags); + virtual void _showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags); SPObject *_evaluateFirst(); void _reevaluate(bool add_to_arena = false); -- cgit v1.2.3