diff --git a/sendto_silhouette.inx b/sendto_silhouette.inx
index f77bc8e3..a7afb32a 100644
--- a/sendto_silhouette.inx
+++ b/sendto_silhouette.inx
@@ -50,6 +50,7 @@ Pressure values of 19 or more make the machine misbehave. Beware.
0
0
Use speed=0, pressure=0 to take the media defaults.
+ false Convert paths with dashed strokes to separate subpaths for perforated cuts.
false Shift to the top lefthand corner, then do offsets.
false
To see the used area, tick the checkmark above and use pressure=1 (or better remove tool)
diff --git a/sendto_silhouette.py b/sendto_silhouette.py
index ed65ece1..44874a8b 100644
--- a/sendto_silhouette.py
+++ b/sendto_silhouette.py
@@ -119,6 +119,7 @@
from silhouette.Graphtec import SilhouetteCameo
from silhouette.Strategy import MatFree
+from silhouette.convert2dashes import splitPath
N_PAGE_WIDTH = 3200
N_PAGE_HEIGHT = 800
@@ -254,6 +255,9 @@ def __init__(self):
self.OptionParser.add_option('--active-tab', action = 'store', dest = 'active_tab',
help=SUPPRESS_HELP)
+ self.OptionParser.add_option('-d', '--dashes',
+ action = 'store', dest = 'dashes', type = 'inkbool', default = False,
+ help='convert paths with dashed strokes to separate subpaths for perforated cuts')
self.OptionParser.add_option('-a', '--autocrop',
action = 'store', dest = 'autocrop', type = 'inkbool', default = False,
help='trim away top and left margin (before adding offsets)')
@@ -508,6 +512,9 @@ def recursivelyTraverseSvg( self, aNodeList,
elif node.tag == inkex.addNS( 'path', 'svg' ):
+ if self.options.dashes:
+ splitPath(inkex, node)
+
self.pathcount += 1
# if we're in resume mode AND self.pathcount < self.svgLastPath,
diff --git a/silhouette/convert2dashes.py b/silhouette/convert2dashes.py
new file mode 100755
index 00000000..c1a93fd3
--- /dev/null
+++ b/silhouette/convert2dashes.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python
+
+# Extracted from inkscape extension; original comments below:
+'''
+This extension converts a path into a dashed line using 'stroke-dasharray'
+It is a modification of the file addnodes.py
+
+Copyright (C) 2005,2007 Aaron Spike, aaron@ekips.org
+Copyright (C) 2009 Alvin Penner, penner@vaxxine.com
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+'''
+# local library
+import cubicsuperpath
+import bezmisc
+import simplestyle
+
+def tpoint((x1,y1), (x2,y2), t = 0.5):
+ return [x1+t*(x2-x1),y1+t*(y2-y1)]
+def cspbezsplit(sp1, sp2, t = 0.5):
+ m1=tpoint(sp1[1],sp1[2],t)
+ m2=tpoint(sp1[2],sp2[0],t)
+ m3=tpoint(sp2[0],sp2[1],t)
+ m4=tpoint(m1,m2,t)
+ m5=tpoint(m2,m3,t)
+ m=tpoint(m4,m5,t)
+ return [[sp1[0][:],sp1[1][:],m1], [m4,m,m5], [m3,sp2[1][:],sp2[2][:]]]
+def cspbezsplitatlength(sp1, sp2, l = 0.5, tolerance = 0.001):
+ bez = (sp1[1][:],sp1[2][:],sp2[0][:],sp2[1][:])
+ t = bezmisc.beziertatlength(bez, l, tolerance)
+ return cspbezsplit(sp1, sp2, t)
+def cspseglength(sp1,sp2, tolerance = 0.001):
+ bez = (sp1[1][:],sp1[2][:],sp2[0][:],sp2[1][:])
+ return bezmisc.bezierlength(bez, tolerance)
+
+def splitPath(inkex, node):
+ dashes = []
+ style = simplestyle.parseStyle(node.get('style'))
+ if style.has_key('stroke-dasharray'):
+ if style['stroke-dasharray'].find(',') > 0:
+ dashes = [float (dash) for dash in style['stroke-dasharray'].split(',') if dash]
+ if dashes:
+ p = cubicsuperpath.parsePath(node.get('d'))
+ new = []
+ for sub in p:
+ idash = 0
+ dash = dashes[0]
+ length = 0
+ new.append([sub[0][:]])
+ i = 1
+ while i < len(sub):
+ dash = dash - length
+ length = cspseglength(new[-1][-1], sub[i])
+ while dash < length:
+ new[-1][-1], next, sub[i] = cspbezsplitatlength(new[-1][-1], sub[i], dash/length)
+ if idash % 2: # create a gap
+ new.append([next[:]])
+ else: # splice the curve
+ new[-1].append(next[:])
+ length = length - dash
+ idash = (idash + 1) % len(dashes)
+ dash = dashes[idash]
+ if idash % 2:
+ new.append([sub[i]])
+ else:
+ new[-1].append(sub[i])
+ i+=1
+ node.set('d',cubicsuperpath.formatPath(new))
+ del style['stroke-dasharray']
+ node.set('style', simplestyle.formatStyle(style))
+ if node.get(inkex.addNS('type','sodipodi')):
+ del node.attrib[inkex.addNS('type', 'sodipodi')]