summaryrefslogtreecommitdiffstats
path: root/share/extensions
diff options
context:
space:
mode:
authorMarc Jeanmougin <marc@jeanmougin.fr>2015-04-26 09:46:39 +0000
committerMarc Jeanmougin <mc@M0nst3r.bouyguesbox.fr>2015-04-26 09:46:39 +0000
commitac6617a55b9f7c05db084eeaa5684fb42d5e1406 (patch)
tree1fc8e668890618463d48298074559c7fe6bc5040 /share/extensions
parentmerge (diff)
parentextensions. ink2canvas.py - do not parse html comments. (Bug 1446204) (diff)
downloadinkscape-ac6617a55b9f7c05db084eeaa5684fb42d5e1406.tar.gz
inkscape-ac6617a55b9f7c05db084eeaa5684fb42d5e1406.zip
merging
(bzr r13922.1.13)
Diffstat (limited to 'share/extensions')
-rwxr-xr-xshare/extensions/convert2dashes.py9
-rwxr-xr-xshare/extensions/dxf_outlines.py13
-rwxr-xr-xshare/extensions/funcplot.py2
-rw-r--r--share/extensions/hpgl_encoder.py77
-rw-r--r--share/extensions/hpgl_output.inx14
-rwxr-xr-xshare/extensions/hpgl_output.py4
-rwxr-xr-xshare/extensions/ink2canvas.py2
-rwxr-xr-xshare/extensions/pathalongpath.py4
-rwxr-xr-xshare/extensions/pathscatter.py6
-rw-r--r--share/extensions/plotter.inx44
-rw-r--r--share/extensions/plotter.py106
-rwxr-xr-xshare/extensions/restack.py8
-rw-r--r--share/extensions/seamless_pattern_procedural.inx4
-rwxr-xr-xshare/extensions/svg2xaml.xsl26
-rwxr-xr-xshare/extensions/text_extract.py24
-rw-r--r--share/extensions/text_merge.py4
16 files changed, 222 insertions, 125 deletions
diff --git a/share/extensions/convert2dashes.py b/share/extensions/convert2dashes.py
index 9e7f6d439..1228b247c 100755
--- a/share/extensions/convert2dashes.py
+++ b/share/extensions/convert2dashes.py
@@ -54,17 +54,24 @@ class SplitIt(inkex.Effect):
for id, node in self.selected.iteritems():
if node.tag == inkex.addNS('path','svg'):
dashes = []
+ offset = 0
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 style.has_key('stroke-dashoffset'):
+ offset = style['stroke-dashoffset']
if dashes:
p = cubicsuperpath.parsePath(node.get('d'))
new = []
for sub in p:
idash = 0
dash = dashes[0]
- length = 0
+ length = float (offset)
+ while dash < length:
+ length = length - dash
+ idash = (idash + 1) % len(dashes)
+ dash = dashes[idash]
new.append([sub[0][:]])
i = 1
while i < len(sub):
diff --git a/share/extensions/dxf_outlines.py b/share/extensions/dxf_outlines.py
index f7e57c32e..091606ba3 100755
--- a/share/extensions/dxf_outlines.py
+++ b/share/extensions/dxf_outlines.py
@@ -113,14 +113,17 @@ class MyEffect(inkex.Effect):
self.poly = [csp[0]] # initiallize new polyline
self.color_LWPOLY = self.color
self.layer_LWPOLY = self.layer
- self.closed_LWPOLY = self.closed
self.poly.append(csp[1])
def LWPOLY_output(self):
if len(self.poly) == 1:
return
self.handle += 1
- self.dxf_add(" 0\nLWPOLYLINE\n 5\n%x\n100\nAcDbEntity\n 8\n%s\n 62\n%d\n100\nAcDbPolyline\n 90\n%d\n 70\n%d\n" % (self.handle, self.layer_LWPOLY, self.color_LWPOLY, len(self.poly), self.closed_LWPOLY))
- for i in range(len(self.poly)):
+ closed = 1
+ if (abs(self.poly[0][0] - self.poly[-1][0]) > .0001
+ or abs(self.poly[0][1] - self.poly[-1][1]) > .0001):
+ closed = 0
+ self.dxf_add(" 0\nLWPOLYLINE\n 5\n%x\n100\nAcDbEntity\n 8\n%s\n 62\n%d\n100\nAcDbPolyline\n 90\n%d\n 70\n%d\n" % (self.handle, self.layer_LWPOLY, self.color_LWPOLY, len(self.poly) - closed, closed))
+ for i in range(len(self.poly) - closed):
self.dxf_add(" 10\n%f\n 20\n%f\n 30\n0.0\n" % (self.poly[i][0],self.poly[i][1]))
def dxf_spline(self,csp):
knots = 8
@@ -195,7 +198,6 @@ class MyEffect(inkex.Effect):
if style['stroke'] and style['stroke'] != 'none' and style['stroke'][0:3] != 'url':
rgb = simplestyle.parseColor(style['stroke'])
hsl = coloreffect.ColorEffect.rgb_to_hsl(coloreffect.ColorEffect(),rgb[0]/255.0,rgb[1]/255.0,rgb[2]/255.0)
- self.closed = 0 # only for LWPOLYLINE
self.color = 7 # default is black
if hsl[2]:
self.color = 1 + (int(6*hsl[0] + 0.5) % 6) # use 6 hues
@@ -203,11 +205,8 @@ class MyEffect(inkex.Effect):
d = node.get('d')
if not d:
return
- if (d[-1] == 'z' or d[-1] == 'Z'):
- self.closed = 1
p = cubicsuperpath.parsePath(d)
elif node.tag == inkex.addNS('rect','svg'):
- self.closed = 1
x = float(node.get('x'))
y = float(node.get('y'))
width = float(node.get('width'))
diff --git a/share/extensions/funcplot.py b/share/extensions/funcplot.py
index 606fb0c28..f37bf335e 100755
--- a/share/extensions/funcplot.py
+++ b/share/extensions/funcplot.py
@@ -45,7 +45,7 @@ def drawfunction(xstart, xend, ybottom, ytop, samples, width, height, left, bott
# coords and scales based on the source rect
if xstart == xend:
- inkex.errormsg(_("x-interval cannot be zero. Please modify 'Start X value' or 'End X alue'"))
+ inkex.errormsg(_("x-interval cannot be zero. Please modify 'Start X value' or 'End X value'"))
return []
scalex = width / (xend - xstart)
xoff = left
diff --git a/share/extensions/hpgl_encoder.py b/share/extensions/hpgl_encoder.py
index a16561e97..83b1b7297 100644
--- a/share/extensions/hpgl_encoder.py
+++ b/share/extensions/hpgl_encoder.py
@@ -23,7 +23,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import math
import re
import string
-#from StringIO import StringIO
# local libraries
import bezmisc
import cspsubdiv
@@ -66,6 +65,7 @@ class hpglEncoder:
self.sizeY = 'False'
self.dryRun = True
self.lastPoint = [0, 0, 0]
+ self.lastPen = -1
self.offsetX = 0
self.offsetY = 0
self.scaleX = self.options.resolutionX / effect.unittouu("1.0in") # dots per inch to dots per user unit
@@ -109,7 +109,7 @@ class hpglEncoder:
# dryRun to find edges
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.vData = [['', 'False', 0, 0], ['', 'False', 0, 0], ['', 'False', 0, 0], ['', 'False', 0, 0]]
self.processGroups(self.doc, groupmat)
if self.divergenceX == 'False' or self.divergenceY == 'False' or self.sizeX == 'False' or self.sizeY == 'False':
raise Exception('NO_PATHS')
@@ -156,11 +156,11 @@ class hpglEncoder:
groupmat = [[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, -self.divergenceX + self.offsetX],
[0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, -self.divergenceY + self.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]]
+ self.vData = [['', 'False', 0, 0], ['', 'False', 0, 0], ['', 'False', 0, 0], ['', 'False', 0, 0]]
# add move to zero point and precut
if self.toolOffset > 0.0 and self.options.precut:
if self.options.center:
- # position precut outside of drawing plus one times the tooloffset
+ # position precut outside of drawing plus one time the tooloffset
if self.offsetX >= 0.0:
precutX = self.offsetX + self.toolOffset
else:
@@ -169,17 +169,16 @@ class hpglEncoder:
precutY = self.offsetY + self.toolOffset
else:
precutY = self.offsetY - self.toolOffset
- self.processOffset('PU', precutX, precutY)
- self.processOffset('PD', precutX, precutY + self.toolOffset * 8)
+ self.processOffset('PU', precutX, precutY, self.options.pen)
+ self.processOffset('PD', precutX, precutY + self.toolOffset * 8, self.options.pen)
else:
- self.processOffset('PU', 0, 0)
- self.processOffset('PD', 0, self.toolOffset * 8)
- else:
- self.processOffset('PU', 0, 0)
+ self.processOffset('PU', 0, 0, self.options.pen)
+ self.processOffset('PD', 0, self.toolOffset * 8, self.options.pen)
# start conversion
self.processGroups(self.doc, groupmat)
# shift an empty node in in order to process last node in cache
- self.processOffset('PU', 0, 0)
+ if self.toolOffset > 0.0 and not self.dryRun:
+ self.processOffset('PU', 0, 0, 0)
if self.options.debug:
return self.hpgl, self
else:
@@ -190,7 +189,7 @@ class hpglEncoder:
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)])
+ paths.append([node.tag, node, self.mergeTransform(node, groupmat), self.getPenNumber(node)])
doc = ''
hasGroups = True
while hasGroups:
@@ -200,11 +199,19 @@ class hpglEncoder:
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.insert(i + 1, [path.tag, path, self.mergeTransform(path, paths[i][2]), paths[i][3]])
paths[i][0] = ''
for node in paths:
if node[0] == inkex.addNS('path', 'svg'):
- self.processPath(node[1], node[2])
+ self.processPath(node[1], node[2], node[3])
+
+ def getPenNumber(self, doc):
+ penNum = str(doc.get('{' + inkex.NSS['inkscape'] + '}label')).lower().strip(' \t\n\r')
+ if re.search(r'( |\A)pen *\d+( |\Z)', penNum):
+ penNum = re.sub(r'(.* |\A)pen *(\d+)( .*|\Z)', r'\2', penNum, 1)
+ return int(penNum)
+ else:
+ return self.options.pen
def mergeTransform(self, doc, matrix):
# get and merge two matrixes into one
@@ -222,7 +229,7 @@ class hpglEncoder:
return False
return True
- def processPath(self, node, mat):
+ def processPath(self, node, mat, pen):
# process path
path = node.get('d')
if path:
@@ -239,7 +246,7 @@ class hpglEncoder:
posX, posY = singlePathPoint[1]
# check if point is repeating, if so, ignore
if int(round(posX)) != int(round(oldPosX)) or int(round(posY)) != int(round(oldPosY)):
- self.processOffset(cmd, posX, posY)
+ self.processOffset(cmd, posX, posY, pen)
cmd = 'PD'
oldPosX = posX
oldPosY = posY
@@ -255,10 +262,10 @@ class hpglEncoder:
overcutLength += self.getLength(oldPosX, oldPosY, posX, posY)
if overcutLength >= self.overcut:
newLength = self.changeLength(oldPosX, oldPosY, posX, posY, - (overcutLength - self.overcut))
- self.processOffset(cmd, newLength[0], newLength[1])
+ self.processOffset(cmd, newLength[0], newLength[1], pen)
break
else:
- self.processOffset(cmd, posX, posY)
+ self.processOffset(cmd, posX, posY, pen)
oldPosX = posX
oldPosY = posY
@@ -277,34 +284,34 @@ class hpglEncoder:
y = y2 + (y2 - y1) / self.getLength(x1, y1, x2, y2, False) * offset
return [x, y]
- def processOffset(self, cmd, posX, posY):
+ def processOffset(self, cmd, posX, posY, pen):
# calculate offset correction (or dont)
if self.toolOffset == 0.0 or self.dryRun:
- self.storePoint(cmd, posX, posY)
+ self.storePoint(cmd, posX, posY, pen)
else:
# insert data into cache
self.vData.pop(0)
- self.vData.insert(3, [cmd, posX, posY])
+ self.vData.insert(3, [cmd, posX, posY, pen])
# decide if enough data is availabe
- if self.vData[2][1] != -1.0:
- if self.vData[1][1] == -1.0:
- self.storePoint(self.vData[2][0], self.vData[2][1], self.vData[2][2])
+ if self.vData[2][1] != 'False':
+ if self.vData[1][1] == 'False':
+ self.storePoint(self.vData[2][0], self.vData[2][1], self.vData[2][2], self.vData[2][3])
else:
# perform tool offset correction (It's a *tad* complicated, if you want to understand it draw the data as lines on paper)
if self.vData[2][0] == 'PD': # If the 3rd entry in the cache is a pen down command make the line longer by the tool offset
pointThree = self.changeLength(self.vData[1][1], self.vData[1][2], self.vData[2][1], self.vData[2][2], self.toolOffset)
- self.storePoint('PD', pointThree[0], pointThree[1])
- elif self.vData[0][1] != -1.0:
+ self.storePoint('PD', pointThree[0], pointThree[1], self.vData[2][3])
+ elif self.vData[0][1] != 'False':
# Elif the 1st entry in the cache is filled with data and the 3rd entry is a pen up command shift
# the 3rd entry by the current tool offset position according to the 2nd command
pointThree = self.changeLength(self.vData[0][1], self.vData[0][2], self.vData[1][1], self.vData[1][2], self.toolOffset)
pointThree[0] = self.vData[2][1] - (self.vData[1][1] - pointThree[0])
pointThree[1] = self.vData[2][2] - (self.vData[1][2] - pointThree[1])
- self.storePoint('PU', pointThree[0], pointThree[1])
+ self.storePoint('PU', pointThree[0], pointThree[1], self.vData[2][3])
else:
# Else just write the 3rd entry
pointThree = [self.vData[2][1], self.vData[2][2]]
- self.storePoint('PU', pointThree[0], pointThree[1])
+ self.storePoint('PU', pointThree[0], pointThree[1], self.vData[2][3])
if self.vData[3][0] == 'PD':
# If the 4th entry in the cache is a pen down command guide tool to next line with a circle between the prolonged 3rd and 4th entry
if self.getLength(self.vData[2][1], self.vData[2][2], self.vData[3][1], self.vData[3][2]) >= self.toolOffset:
@@ -324,16 +331,16 @@ class hpglEncoder:
if angleVector >= 0:
angle = angleStart + self.toolOffsetFlat
while angle < angleStart + angleVector:
- self.storePoint('PD', self.vData[2][1] + math.cos(angle) * self.toolOffset, self.vData[2][2] + math.sin(angle) * self.toolOffset)
+ self.storePoint('PD', self.vData[2][1] + math.cos(angle) * self.toolOffset, self.vData[2][2] + math.sin(angle) * self.toolOffset, self.vData[2][3])
angle += self.toolOffsetFlat
else:
angle = angleStart - self.toolOffsetFlat
while angle > angleStart + angleVector:
- self.storePoint('PD', self.vData[2][1] + math.cos(angle) * self.toolOffset, self.vData[2][2] + math.sin(angle) * self.toolOffset)
+ self.storePoint('PD', self.vData[2][1] + math.cos(angle) * self.toolOffset, self.vData[2][2] + math.sin(angle) * self.toolOffset, self.vData[2][3])
angle -= self.toolOffsetFlat
- self.storePoint('PD', pointFour[0], pointFour[1])
+ self.storePoint('PD', pointFour[0], pointFour[1], self.vData[3][3])
- def storePoint(self, command, x, y):
+ def storePoint(self, command, x, y, pen):
x = int(round(x))
y = int(round(y))
# skip when no change in movement
@@ -357,11 +364,15 @@ class hpglEncoder:
x = 0
if y < 0:
y = 0
+ # select correct pen
+ if self.lastPen != pen:
+ self.hpgl += ';SP%d' % pen
# do not repeat command
- if command == 'PD' and self.lastPoint[0] == 'PD':
+ if command == 'PD' and self.lastPoint[0] == 'PD' and self.lastPen == pen:
self.hpgl += ',%d,%d' % (x, y)
else:
self.hpgl += ';%s%d,%d' % (command, x, y)
+ self.lastPen = pen
self.lastPoint = [command, x, y]
# 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.inx b/share/extensions/hpgl_output.inx
index bfb3e3567..7fa900dc8 100644
--- a/share/extensions/hpgl_output.inx
+++ b/share/extensions/hpgl_output.inx
@@ -22,14 +22,16 @@
</param>
<param name="mirrorX" type="boolean" _gui-text="Mirror X axis" _gui-description="Check this to mirror the X axis (Default: Unchecked)">false</param>
<param name="mirrorY" type="boolean" _gui-text="Mirror Y axis" _gui-description="Check this to mirror the Y axis (Default: Unchecked)">false</param>
- <param name="center" type="boolean" _gui-text="Center zero point" _gui-description="Check this if your plotter uses a centered zero point (Default: Unchecked)">false</param>
+ <param name="center" type="boolean" _gui-text="Center zero point" _gui-description="Check this if your plotter uses a centered zero point (Default: Unchecked)">false</param>
+ <param name="space" type="description">&#xa0;</param>
+ <_param name="multiplePensHelp" type="description">If you want to use multiple pens on your pen plotter create one layer for each pen, name the layers "Pen 1", "Pen 2", etc., and put your drawings in the corresponding layers. This overrules the pen number option above.</_param>
</page>
<page name="overcutToolOffset" _gui-text="Plot Features ">
- <param name="overcut" type="float" min="0.0" max="100.0" precision="2" _gui-text="Overcut (mm):" _gui-description="The distance in mm that will be cut over the starting point of the path to prevent open paths, set to 0.0 to omit command (Default: 1.00)">1.00</param>
- <param name="toolOffset" type="float" min="0.0" max="20.0" precision="2" _gui-text="Tool offset (mm):" _gui-description="The offset from the tool tip to the tool axis in mm, set to 0.0 to omit command (Default: 0.25)">0.25</param>
- <param name="precut" type="boolean" _gui-text="Use precut" _gui-description="Check this to cut a small line before the real drawing starts to correctly align the tool orientation. (Default: Checked)">true</param>
- <param name="flat" type="float" min="0.1" max="10.0" precision="1" _gui-text="Curve flatness:" _gui-description="Curves are divided into lines, this number controls how fine the curves will be reproduced, the smaller the finer (Default: '1.2')">1.2</param>
- <param name="autoAlign" type="boolean" _gui-text="Auto align" _gui-description="Check this to auto align the drawing to the zero point (Plus the tool offset if used). If unchecked you have to make sure that all parts of your drawing are within the document border! (Default: Checked)">true</param>
+ <param name="overcut" type="float" min="0.0" max="100.0" precision="2" _gui-text="Overcut (mm):" _gui-description="The distance in mm that will be cut over the starting point of the path to prevent open paths, set to 0.0 to omit command (Default: 1.00)">1.00</param>
+ <param name="toolOffset" type="float" min="0.0" max="20.0" precision="2" _gui-text="Tool offset (mm):" _gui-description="The offset from the tool tip to the tool axis in mm, set to 0.0 to omit command (Default: 0.25)">0.25</param>
+ <param name="precut" type="boolean" _gui-text="Use precut" _gui-description="Check this to cut a small line before the real drawing starts to correctly align the tool orientation. (Default: Checked)">true</param>
+ <param name="flat" type="float" min="0.1" max="10.0" precision="1" _gui-text="Curve flatness:" _gui-description="Curves are divided into lines, this number controls how fine the curves will be reproduced, the smaller the finer (Default: '1.2')">1.2</param>
+ <param name="autoAlign" type="boolean" _gui-text="Auto align" _gui-description="Check this to auto align the drawing to the zero point (Plus the tool offset if used). If unchecked you have to make sure that all parts of your drawing are within the document border! (Default: Checked)">true</param>
</page>
</param>
<_param name="settingsHelp" type="description">All these settings depend on the plotter you use, for more information please consult the manual or homepage for your plotter.</_param>
diff --git a/share/extensions/hpgl_output.py b/share/extensions/hpgl_output.py
index c6713cb65..fc4f248af 100755
--- a/share/extensions/hpgl_output.py
+++ b/share/extensions/hpgl_output.py
@@ -62,12 +62,12 @@ class HpglOutput(inkex.Effect):
type, value, traceback = sys.exc_info()
raise ValueError, ("", type, value), traceback
# convert raw HPGL to HPGL
- hpglInit = 'IN;SP%d' % self.options.pen
+ hpglInit = 'IN'
if self.options.force > 0:
hpglInit += ';FS%d' % self.options.force
if self.options.speed > 0:
hpglInit += ';VS%d' % self.options.speed
- self.hpgl = hpglInit + self.hpgl + ';PU0,0;SP0;IN;'
+ self.hpgl = hpglInit + self.hpgl + ';SP0;PU0,0;IN; '
def output(self):
# print to file
diff --git a/share/extensions/ink2canvas.py b/share/extensions/ink2canvas.py
index d1e11a7c2..b5c0fbb7b 100755
--- a/share/extensions/ink2canvas.py
+++ b/share/extensions/ink2canvas.py
@@ -59,6 +59,8 @@ class Ink2Canvas(inkex.Effect):
def walk_tree(self, root):
for node in root:
+ if node.tag is inkex.etree.Comment:
+ continue
tag = self.get_tag_name(node)
class_name = tag.capitalize()
if not hasattr(svg, class_name):
diff --git a/share/extensions/pathalongpath.py b/share/extensions/pathalongpath.py
index 7da7f1797..234430acd 100755
--- a/share/extensions/pathalongpath.py
+++ b/share/extensions/pathalongpath.py
@@ -66,7 +66,7 @@ def stretch(pathcomp,xscale,yscale,org):
def linearize(p,tolerance=0.001):
'''
- This function recieves a component of a 'cubicsuperpath' and returns two things:
+ This function receives a component of a 'cubicsuperpath' and returns two things:
The path subdivided in many straight segments, and an array containing the length of each segment.
We could work with bezier path as well, but bezier arc lengths are (re)computed for each point
@@ -153,7 +153,7 @@ class PathAlongPath(pathmodifier.Diffeo):
def lengthtotime(self,l):
'''
Recieves an arc length l, and returns the index of the segment in self.skelcomp
- containing the coresponding point, to gether with the position of the point on this segment.
+ containing the corresponding point, to gether with the position of the point on this segment.
If the deformer is closed, do computations modulo the toal length.
'''
diff --git a/share/extensions/pathscatter.py b/share/extensions/pathscatter.py
index 268e31069..5c2857979 100755
--- a/share/extensions/pathscatter.py
+++ b/share/extensions/pathscatter.py
@@ -80,7 +80,7 @@ def stretch(pathcomp,xscale,yscale,org):
def linearize(p,tolerance=0.001):
'''
- This function recieves a component of a 'cubicsuperpath' and returns two things:
+ This function receives a component of a 'cubicsuperpath' and returns two things:
The path subdivided in many straight segments, and an array containing the length of each segment.
We could work with bezier path as well, but bezier arc lengths are (re)computed for each point
@@ -186,7 +186,7 @@ class PathScatter(pathmodifier.Diffeo):
def lengthtotime(self,l):
'''
Recieves an arc length l, and returns the index of the segment in self.skelcomp
- containing the coresponding point, to gether with the position of the point on this segment.
+ containing the corresponding point, to gether with the position of the point on this segment.
If the deformer is closed, do computations modulo the toal length.
'''
@@ -203,7 +203,7 @@ class PathScatter(pathmodifier.Diffeo):
def localTransformAt(self,s,follow=True):
'''
- recieves a length, and returns the coresponding point and tangent of self.skelcomp
+ receives a length, and returns the coresponding point and tangent of self.skelcomp
if follow is set to false, returns only the translation
'''
i,t=self.lengthtotime(s)
diff --git a/share/extensions/plotter.inx b/share/extensions/plotter.inx
index 5a6d8ce06..17b2ff185 100644
--- a/share/extensions/plotter.inx
+++ b/share/extensions/plotter.inx
@@ -27,7 +27,25 @@
<item value="57600">57600</item>
<item value="115200">115200</item>
</param>
- <param name="flowControl" type="enum" _gui-text="Flow control:" _gui-description="The Software / Hardware flow control of your serial connection (Default: Software)">
+ <param name="serialByteSize" type="enum" _gui-text="Serial byte size:" _gui-description="The Byte size of your serial connection, 99% of all plotters use the default setting (Default: 8 Bits)">
+ <item value="eight">8 Bits</item>
+ <item value="seven">7 Bits</item>
+ <item value="six">6 Bits</item>
+ <item value="five">5 Bits</item>
+ </param>
+ <param name="serialStopBits" type="enum" _gui-text="Serial stop bits:" _gui-description="The Stop bits of your serial connection, 99% of all plotters use the default setting (Default: 1 Bit)">
+ <item value="one">1 Bit</item>
+ <item value="onePointFive">1.5 Bits</item>
+ <item value="two">2 Bits</item>
+ </param>
+ <param name="serialParity" type="enum" _gui-text="Serial parity:" _gui-description="The Parity of your serial connection, 99% of all plotters use the default setting (Default: None)">
+ <item value="none">None</item>
+ <item value="even">Even</item>
+ <item value="odd">Odd</item>
+ <item value="mark">Mark</item>
+ <item value="space">Space</item>
+ </param>
+ <param name="serialFlowControl" type="enum" _gui-text="Serial flow control:" _gui-description="The Software / Hardware flow control of your serial connection (Default: Software)">
<_item value="xonxoff">Software (XON/XOFF)</_item>
<_item value="rtscts">Hardware (RTS/CTS)</_item>
<_item value="dsrdtrrtscts">Hardware (DSR/DTR + RTS/CTS)</_item>
@@ -47,9 +65,9 @@
<page name="plotter" _gui-text="Plotter Settings ">
<param name="resolutionX" type="float" min="1.0" max="4096.0" precision="1" _gui-text="Resolution X (dpi):" _gui-description="The amount of steps the plotter moves if it moves for 1 inch on the X axis (Default: 1016.0)">1016.0</param>
<param name="resolutionY" type="float" min="1.0" max="4096.0" precision="1" _gui-text="Resolution Y (dpi):" _gui-description="The amount of steps the plotter moves if it moves for 1 inch on the Y axis (Default: 1016.0)">1016.0</param>
- <param name="pen" type="int" min="0" max="99" _gui-text="Pen number:" _gui-description="The number of the pen (tool) to use (Standard: '1')">1</param>
- <param name="force" type="int" min="0" max="1000" _gui-text="Pen force (g):" _gui-description="The amount of force pushing down the pen in grams, set to 0 to omit command; most plotters ignore this command (Default: 0)">0</param>
- <param name="speed" type="int" min="0" max="10000" _gui-text="Pen speed (cm/s or mm/s):" _gui-description="The speed the pen will move with in centimeters or millimeters per second (depending on your plotter model), set to 0 to omit command. Most plotters ignore this command. (Default: 0)">0</param>
+ <param name="pen" type="int" min="0" max="99" _gui-text="Pen number:" _gui-description="The number of the pen (tool) to use (Standard: '1')">1</param>
+ <param name="force" type="int" min="0" max="1000" _gui-text="Pen force (g):" _gui-description="The amount of force pushing down the pen in grams, set to 0 to omit command; most plotters ignore this command (Default: 0)">0</param>
+ <param name="speed" type="int" min="0" max="10000" _gui-text="Pen speed (cm/s or mm/s):" _gui-description="The speed the pen will move with in centimeters or millimeters per second (depending on your plotter model), set to 0 to omit command. Most plotters ignore this command. (Default: 0)">0</param>
<param name="orientation" type="enum" _gui-text="Rotation (°, clockwise):" _gui-description="Rotation of the drawing (Default: 0°)">
<item value="0">0</item>
<item value="90">90</item>
@@ -58,16 +76,18 @@
</param>
<param name="mirrorX" type="boolean" _gui-text="Mirror X axis" _gui-description="Check this to mirror the X axis (Default: Unchecked)">false</param>
<param name="mirrorY" type="boolean" _gui-text="Mirror Y axis" _gui-description="Check this to mirror the Y axis (Default: Unchecked)">false</param>
- <param name="center" type="boolean" _gui-text="Center zero point" _gui-description="Check this if your plotter uses a centered zero point (Default: Unchecked)">false</param>
+ <param name="center" type="boolean" _gui-text="Center zero point" _gui-description="Check this if your plotter uses a centered zero point (Default: Unchecked)">false</param>
+ <param name="space" type="description">&#xa0;</param>
+ <_param name="multiplePensHelp" type="description">If you want to use multiple pens on your pen plotter create one layer for each pen, name the layers "Pen 1", "Pen 2", etc., and put your drawings in the corresponding layers. This overrules the pen number option above.</_param>
</page>
<page name="misc" _gui-text="Plot Features ">
- <param name="overcut" type="float" min="0.0" max="100.0" precision="2" _gui-text="Overcut (mm):" _gui-description="The distance in mm that will be cut over the starting point of the path to prevent open paths, set to 0.0 to omit command (Default: 1.00)">1.00</param>
- <param name="toolOffset" type="float" min="0.0" max="20.0" precision="2" _gui-text="Tool offset (mm):" _gui-description="The offset from the tool tip to the tool axis in mm, set to 0.0 to omit command (Default: 0.25)">0.25</param>
- <param name="precut" type="boolean" _gui-text="Use precut" _gui-description="Check this to cut a small line before the real drawing starts to correctly align the tool orientation. (Default: Checked)">true</param>
- <param name="flat" type="float" min="0.1" max="10.0" precision="1" _gui-text="Curve flatness:" _gui-description="Curves are divided into lines, this number controls how fine the curves will be reproduced, the smaller the finer (Default: '1.2')">1.2</param>
- <param name="autoAlign" type="boolean" _gui-text="Auto align" _gui-description="Check this to auto align the drawing to the zero point (Plus the tool offset if used). If unchecked you have to make sure that all parts of your drawing are within the document border! (Default: Checked)">true</param>
- <param name="space" type="description">&#xa0;</param>
- <param name="debug" type="boolean" _gui-text="Show debug information" _gui-description="Check this to get verbose information about the plot without actually sending something to the plotter (A.k.a. data dump) (Default: Unchecked)">false</param>
+ <param name="overcut" type="float" min="0.0" max="100.0" precision="2" _gui-text="Overcut (mm):" _gui-description="The distance in mm that will be cut over the starting point of the path to prevent open paths, set to 0.0 to omit command (Default: 1.00)">1.00</param>
+ <param name="toolOffset" type="float" min="0.0" max="20.0" precision="2" _gui-text="Tool offset (mm):" _gui-description="The offset from the tool tip to the tool axis in mm, set to 0.0 to omit command (Default: 0.25)">0.25</param>
+ <param name="precut" type="boolean" _gui-text="Use precut" _gui-description="Check this to cut a small line before the real drawing starts to correctly align the tool orientation. (Default: Checked)">true</param>
+ <param name="flat" type="float" min="0.1" max="10.0" precision="1" _gui-text="Curve flatness:" _gui-description="Curves are divided into lines, this number controls how fine the curves will be reproduced, the smaller the finer (Default: '1.2')">1.2</param>
+ <param name="autoAlign" type="boolean" _gui-text="Auto align" _gui-description="Check this to auto align the drawing to the zero point (Plus the tool offset if used). If unchecked you have to make sure that all parts of your drawing are within the document border! (Default: Checked)">true</param>
+ <param name="space" type="description">&#xa0;</param>
+ <param name="debug" type="boolean" _gui-text="Show debug information" _gui-description="Check this to get verbose information about the plot without actually sending something to the plotter (A.k.a. data dump) (Default: Unchecked)">false</param>
</page>
</param>
<_param name="settingsHelp" type="description">All these settings depend on the plotter you use, for more information please consult the manual or homepage for your plotter.</_param>
diff --git a/share/extensions/plotter.py b/share/extensions/plotter.py
index 7e24d0824..c0f180f60 100644
--- a/share/extensions/plotter.py
+++ b/share/extensions/plotter.py
@@ -34,27 +34,30 @@ class Plot(inkex.Effect):
def __init__(self):
inkex.Effect.__init__(self)
- self.OptionParser.add_option('--tab', action='store', type='string', dest='tab')
- 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')
- self.OptionParser.add_option('--initCommands', action='store', type='string', dest='initCommands', default='', help='Initialization commands')
- 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('--center', action='store', type='inkbool', dest='center', default='FALSE', help='Center zero point')
- self.OptionParser.add_option('--overcut', action='store', type='float', dest='overcut', default=1.0, help='Overcut (mm)')
- 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('--flat', action='store', type='float', dest='flat', default=1.2, help='Curve flatness')
- self.OptionParser.add_option('--autoAlign', action='store', type='inkbool', dest='autoAlign', default='TRUE', help='Auto align')
- self.OptionParser.add_option('--debug', action='store', type='inkbool', dest='debug', default='FALSE', help='Show debug information')
+ self.OptionParser.add_option('--tab', action='store', type='string', dest='tab')
+ 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('--serialByteSize', action='store', type='string', dest='serialByteSize', default='eight', help='Serial byte size')
+ self.OptionParser.add_option('--serialStopBits', action='store', type='string', dest='serialStopBits', default='one', help='Serial stop bits')
+ self.OptionParser.add_option('--serialParity', action='store', type='string', dest='serialParity', default='none', help='Serial parity')
+ self.OptionParser.add_option('--serialFlowControl', action='store', type='string', dest='serialFlowControl', 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('--initCommands', action='store', type='string', dest='initCommands', default='', help='Initialization commands')
+ 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('--center', action='store', type='inkbool', dest='center', default='FALSE', help='Center zero point')
+ self.OptionParser.add_option('--overcut', action='store', type='float', dest='overcut', default=1.0, help='Overcut (mm)')
+ 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('--flat', action='store', type='float', dest='flat', default=1.2, help='Curve flatness')
+ self.OptionParser.add_option('--autoAlign', action='store', type='inkbool', dest='autoAlign', default='TRUE', help='Auto align')
+ self.OptionParser.add_option('--debug', action='store', type='inkbool', dest='debug', default='FALSE', help='Show debug information')
def effect(self):
# get hpgl data
@@ -98,12 +101,12 @@ class Plot(inkex.Effect):
def convertToHpgl(self):
# convert raw HPGL to HPGL
- hpglInit = 'IN;SP%d' % self.options.pen
+ hpglInit = 'IN'
if self.options.force > 0:
hpglInit += ';FS%d' % self.options.force
if self.options.speed > 0:
hpglInit += ';VS%d' % self.options.speed
- self.hpgl = hpglInit + self.hpgl + ';PU0,0;SP0;IN; '
+ self.hpgl = hpglInit + self.hpgl + ';SP0;PU0,0;IN; '
def convertToDmpl(self):
# convert HPGL to DMPL
@@ -119,22 +122,23 @@ class Plot(inkex.Effect):
# Z = Reset plotter
# n,n, = Coordinate pair
self.hpgl = self.hpgl.replace(';', ',')
+ self.hpgl = self.hpgl.replace('SP', 'P')
self.hpgl = self.hpgl.replace('PU', 'U')
self.hpgl = self.hpgl.replace('PD', 'D')
- dmplInit = ';:HAL0P%d' % self.options.pen
+ dmplInit = ';:HAL0'
if self.options.speed > 0:
dmplInit += 'V%d' % self.options.speed
dmplInit += 'EC1'
- self.hpgl = dmplInit + self.hpgl[1:] + ',U0,0,P0Z '
+ self.hpgl = dmplInit + self.hpgl[1:] + ',P0,U0,0,Z '
def convertToKNK(self):
# convert HPGL to KNK Plotter Language
- hpglInit = 'ZG;SP%d' % self.options.pen
+ hpglInit = 'ZG'
if self.options.force > 0:
hpglInit += ';FS%d' % self.options.force
if self.options.speed > 0:
hpglInit += ';VS%d' % self.options.speed
- self.hpgl = hpglInit + self.hpgl + ';PU0,0;SP0;@ '
+ self.hpgl = hpglInit + self.hpgl + ';SP0;PU0,0;@ '
def sendHpglToSerial(self):
# gracefully exit script when pySerial is missing
@@ -146,17 +150,49 @@ class Plot(inkex.Effect):
+ "\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
+ # init serial framework
mySerial = serial.Serial()
+ # set serial port
mySerial.port = self.options.serialPort
+ # set baudrate
mySerial.baudrate = self.options.serialBaudRate
+ # set bytesize
+ if self.options.serialByteSize == 'five':
+ mySerial.bytesize = serial.FIVEBITS
+ if self.options.serialByteSize == 'six':
+ mySerial.bytesize = serial.SIXBITS
+ if self.options.serialByteSize == 'seven':
+ mySerial.bytesize = serial.SEVENBITS
+ if self.options.serialByteSize == 'eight':
+ mySerial.bytesize = serial.EIGHTBITS
+ # set stopbits
+ if self.options.serialStopBits == 'one':
+ mySerial.stopbits = serial.STOPBITS_ONE
+ if self.options.serialStopBits == 'onePointFive':
+ mySerial.stopbits = serial.STOPBITS_ONE_POINT_FIVE
+ if self.options.serialStopBits == 'two':
+ mySerial.stopbits = serial.STOPBITS_TWO
+ # set parity
+ if self.options.serialParity == 'none':
+ mySerial.parity = serial.PARITY_NONE
+ if self.options.serialParity == 'even':
+ mySerial.parity = serial.PARITY_EVEN
+ if self.options.serialParity == 'odd':
+ mySerial.parity = serial.PARITY_ODD
+ if self.options.serialParity == 'mark':
+ mySerial.parity = serial.PARITY_MARK
+ if self.options.serialParity == 'space':
+ mySerial.parity = serial.PARITY_SPACE
+ # set short timeout to avoid locked up interface
mySerial.timeout = 0.1
- if self.options.flowControl == 'xonxoff':
+ # set flow control
+ if self.options.serialFlowControl == 'xonxoff':
mySerial.xonxoff = True
- if self.options.flowControl == 'rtscts' or self.options.flowControl == 'dsrdtrrtscts':
+ if self.options.serialFlowControl == 'rtscts' or self.options.serialFlowControl == 'dsrdtrrtscts':
mySerial.rtscts = True
- if self.options.flowControl == 'dsrdtrrtscts':
+ if self.options.serialFlowControl == 'dsrdtrrtscts':
mySerial.dsrdtr = True
+ # try to establish connection
try:
mySerial.open()
except Exception as inst:
@@ -166,6 +202,7 @@ class Plot(inkex.Effect):
else:
type, value, traceback = sys.exc_info()
raise ValueError, ('', type, value), traceback
+ # send data to plotter
if self.options.initCommands != '':
mySerial.write(self.options.initCommands.decode('string_escape'))
mySerial.write(self.hpgl)
@@ -177,7 +214,10 @@ class Plot(inkex.Effect):
inkex.errormsg("---------------------------------\nDebug information\n---------------------------------\n\nSettings:\n")
inkex.errormsg(' Serial Port: ' + self.options.serialPort)
inkex.errormsg(' Serial baud rate: ' + self.options.serialBaudRate)
- inkex.errormsg(' Flow control: ' + self.options.flowControl)
+ inkex.errormsg(' Serial byte size: ' + self.options.serialByteSize + ' Bits')
+ inkex.errormsg(' Serial stop bits: ' + self.options.serialStopBits + ' Bits')
+ inkex.errormsg(' Serial parity: ' + self.options.serialParity)
+ inkex.errormsg(' Serial Flow control: ' + self.options.serialFlowControl)
inkex.errormsg(' Command language: ' + self.options.commandLanguage)
inkex.errormsg(' Initialization commands: ' + self.options.initCommands)
inkex.errormsg(' Resolution X (dpi): ' + str(self.options.resolutionX))
@@ -223,7 +263,7 @@ class Plot(inkex.Effect):
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)
+ inkex.errormsg(self.options.initCommands + self.hpgl)
if __name__ == '__main__':
# start extension
diff --git a/share/extensions/restack.py b/share/extensions/restack.py
index 615b41527..507353025 100755
--- a/share/extensions/restack.py
+++ b/share/extensions/restack.py
@@ -54,9 +54,9 @@ class Restack(inkex.Effect):
svg = self.document.getroot()
parentnode = self.current_layer
file = self.args[ -1 ]
-
+
#get all bounding boxes in file by calling inkscape again with the --query-all command line option
- #it returns a comma seperated list structured id,x,y,w,h
+ #it returns a comma separated list structured id,x,y,w,h
if bsubprocess:
p = Popen('inkscape --query-all "%s"' % (file), shell=True, stdout=PIPE, stderr=PIPE)
err = p.stderr
@@ -65,12 +65,12 @@ class Restack(inkex.Effect):
reader=csv.CSVParser().parse_string(f) #there was a module cvs.py in earlier inkscape that behaved differently
except:
reader=csv.reader(f.split( os.linesep ))
- err.close()
+ err.close()
else:
_,f,err = os.popen3('inkscape --query-all "%s"' % ( file ) )
reader=csv.reader( f )
err.close()
-
+
#build a dictionary with id as the key
dimen = dict()
for line in reader:
diff --git a/share/extensions/seamless_pattern_procedural.inx b/share/extensions/seamless_pattern_procedural.inx
index f9800c63d..0c173fd0c 100644
--- a/share/extensions/seamless_pattern_procedural.inx
+++ b/share/extensions/seamless_pattern_procedural.inx
@@ -5,8 +5,8 @@
<dependency type="executable" location="extensions">seamless_pattern.py</dependency>
<dependency type="executable" location="extensions">inkex.py</dependency>
- <param name="width" _gui-text="Custom Width (px.):" type="int" min="1" max="99999999">100</param>
- <param name="height" _gui-text="Custom Height (px.):" type="int" min="1" max="99999999">100</param>
+ <param name="width" _gui-text="Custom Width (px):" type="int" min="1" max="99999999">100</param>
+ <param name="height" _gui-text="Custom Height (px):" type="int" min="1" max="99999999">100</param>
<effect needs-live-preview="false">
<object-type>all</object-type>
diff --git a/share/extensions/svg2xaml.xsl b/share/extensions/svg2xaml.xsl
index fa785fa4f..d2796c93c 100755
--- a/share/extensions/svg2xaml.xsl
+++ b/share/extensions/svg2xaml.xsl
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
-Copyright (c) 2005-2007 authors:
+Copyright (c) 2005-2015 authors:
Original version: Toine de Greef (a.degreef@chello.nl)
-Modified (2010-2014) by Nicolas Dufour (nicoduf@yahoo.fr) (blur support, units
+Modified (2010-2015) by Nicolas Dufour (nicoduf@yahoo.fr) (blur support, units
convertion, comments, and some other fixes)
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -34,7 +34,8 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:exsl="http://exslt.org/common"
xmlns:libxslt="http://xmlsoft.org/XSLT/namespace"
-exclude-result-prefixes="rdf xlink xs exsl libxslt">
+xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+exclude-result-prefixes="rdf xlink xs exsl libxslt inkscape">
<xsl:strip-space elements="*" />
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
@@ -80,9 +81,8 @@ exclude-result-prefixes="rdf xlink xs exsl libxslt">
<Canvas>
<xsl:apply-templates mode="id" select="." />
<xsl:apply-templates mode="filter_effect" select="." />
- <!--
<xsl:apply-templates mode="clip" select="." />
- -->
+
<xsl:if test="@style and contains(@style, 'display:none')">
<xsl:attribute name="Visibility">Collapsed</xsl:attribute>
</xsl:if>
@@ -178,6 +178,7 @@ exclude-result-prefixes="rdf xlink xs exsl libxslt">
* Parse transform
* Apply transform
+ * Rotation center
-->
<!--
@@ -417,6 +418,20 @@ exclude-result-prefixes="rdf xlink xs exsl libxslt">
</xsl:template>
<!--
+ // Rotation center //
+ In XAML, relative to the object's bounding box (RenderTransformOrigin="0.5,0.5" is the center)
+ Unfortunately, converting would require that the bounding box of all objects and groups is calculated, which is rather complex...
+-->
+<xsl:template mode="rotation-center" match="*">
+ <xsl:if test="@inkscape:transform-center-x">
+<!-- <xsl:attribute name="RenderTransformOrigin">
+ <xsl:value-of select="concat(@inkscape:transform-center-x, ',', @inkscape:transform-center-y)" />
+ </xsl:attribute>
+-->>
+ </xsl:if>
+</xsl:template>
+
+<!--
// Resources (defs) //
* Resources ids
@@ -2566,6 +2581,7 @@ exclude-result-prefixes="rdf xlink xs exsl libxslt">
<xsl:apply-templates mode="desc" select="." />
<xsl:apply-templates mode="clip" select="." />
+
<xsl:apply-templates mode="transform" select=".">
<xsl:with-param name="mapped_type" select="'Rectangle'" />
</xsl:apply-templates>
diff --git a/share/extensions/text_extract.py b/share/extensions/text_extract.py
index bf263ef39..dfcddefdc 100755
--- a/share/extensions/text_extract.py
+++ b/share/extensions/text_extract.py
@@ -42,15 +42,15 @@ class Extract(inkex.Effect):
def __init__(self):
inkex.Effect.__init__(self)
self.OptionParser.add_option("-d", "--direction",
- action="store", type="string",
+ action="store", type="string",
dest="direction", default="tb",
help="direction to extract text")
self.OptionParser.add_option("-x", "--xanchor",
- action="store", type="string",
+ action="store", type="string",
dest="xanchor", default="m",
help="horizontal point to compare")
self.OptionParser.add_option("-y", "--yanchor",
- action="store", type="string",
+ action="store", type="string",
dest="yanchor", default="m",
help="vertical point to compare")
@@ -58,15 +58,15 @@ class Extract(inkex.Effect):
if len(self.selected)==0:
for node in self.document.xpath('//svg:text | //svg:flowRoot', namespaces=inkex.NSS):
self.selected[node.get('id')] = node
-
+
if len( self.selected ) > 0:
objlist = []
svg = self.document.getroot()
parentnode = self.current_layer
file = self.args[ -1 ]
-
- #get all bounding boxes in file by calling inkscape again with the --query-all command line option
- #it returns a comma seperated list structured id,x,y,w,h
+
+ # get all bounding boxes in file by calling inkscape again with the --query-all command line option
+ # it returns a comma separated list structured id,x,y,w,h
if bsubprocess:
p = Popen('inkscape --query-all "%s"' % (file), shell=True, stdout=PIPE, stderr=PIPE)
err = p.stderr
@@ -75,12 +75,12 @@ class Extract(inkex.Effect):
reader=csv.CSVParser().parse_string(f) #there was a module cvs.py in earlier inkscape that behaved differently
except:
reader=csv.reader(f.split( os.linesep ))
- err.close()
+ err.close()
else:
_,f,err = os.popen3('inkscape --query-all "%s"' % ( file ) )
reader=csv.reader( f )
err.close()
-
+
#build a dictionary with id as the key
dimen = dict()
for line in reader:
@@ -89,7 +89,7 @@ class Extract(inkex.Effect):
if not bsubprocess: #close file if opened using os.popen3
f.close
-
+
#find the center of all selected objects **Not the average!
x,y,w,h = dimen[self.selected.keys()[0]]
minx = x
@@ -131,7 +131,7 @@ class Extract(inkex.Effect):
cy = y + h
else: # middle
cy = y + h / 2
-
+
#direction chosen
if self.options.direction == "tb":
objlist.append([cy,id])
@@ -146,7 +146,7 @@ class Extract(inkex.Effect):
#move them to the top of the object stack in this order.
for item in objlist:
self.recurse(deepcopy(self.selected[item[1]]))
-
+
def recurse(self, node):
istext = (node.tag == '{http://www.w3.org/2000/svg}flowPara' or node.tag == '{http://www.w3.org/2000/svg}flowDiv' or node.tag == '{http://www.w3.org/2000/svg}text')
if node.text != None or node.tail != None:
diff --git a/share/extensions/text_merge.py b/share/extensions/text_merge.py
index dc6ee331c..625f14b75 100644
--- a/share/extensions/text_merge.py
+++ b/share/extensions/text_merge.py
@@ -73,8 +73,8 @@ class Merge(inkex.Effect):
parentnode = self.current_layer
file = self.args[ -1 ]
- #get all bounding boxes in file by calling inkscape again with the --query-all command line option
- #it returns a comma seperated list structured id,x,y,w,h
+ # get all bounding boxes in file by calling inkscape again with the --query-all command line option
+ # it returns a comma separated list structured id,x,y,w,h
if bsubprocess:
p = Popen('inkscape --query-all "%s"' % (file), shell=True, stdout=PIPE, stderr=PIPE)
err = p.stderr