summaryrefslogtreecommitdiffstats
path: root/share/extensions
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-07-24 23:26:11 +0000
committerJabiertxof <jtx@jtx.marker.es>2015-07-24 23:26:11 +0000
commit7b6ffd82650ee1e20a53b0631d5c2dddef58e8d5 (patch)
tree48cae26bf789b11d79f72efc16a6676f960eaaa6 /share/extensions
parentupdate to trunk (diff)
parent3D box tool: the shift key must not prevent snapping of the vanishing point. ... (diff)
downloadinkscape-7b6ffd82650ee1e20a53b0631d5c2dddef58e8d5.tar.gz
inkscape-7b6ffd82650ee1e20a53b0631d5c2dddef58e8d5.zip
update to trunk
(bzr r12588.1.45)
Diffstat (limited to 'share/extensions')
-rw-r--r--share/extensions/CMakeLists.txt49
-rw-r--r--share/extensions/Makefile.am3
-rw-r--r--share/extensions/image_attributes.inx82
-rwxr-xr-xshare/extensions/image_attributes.py169
-rwxr-xr-xshare/extensions/inkex.py31
-rw-r--r--share/extensions/layout_nup.inx1
-rwxr-xr-xshare/extensions/layout_nup.py216
-rwxr-xr-xshare/extensions/layout_nup_pageframe.py230
-rwxr-xr-xshare/extensions/measure.py2
-rw-r--r--share/extensions/scour.inx8
-rw-r--r--share/extensions/scour/Makefile.am13
-rw-r--r--[-rwxr-xr-x]share/extensions/scour/scour.inkscape.py (renamed from share/extensions/scour.inkscape.py)0
-rw-r--r--share/extensions/scour/scour.py (renamed from share/extensions/scour.py)0
-rw-r--r--[-rwxr-xr-x]share/extensions/scour/svg_regex.py (renamed from share/extensions/svg_regex.py)0
-rw-r--r--[-rwxr-xr-x]share/extensions/scour/svg_transform.py (renamed from share/extensions/svg_transform.py)0
-rw-r--r--[-rwxr-xr-x]share/extensions/scour/yocto_css.py (renamed from share/extensions/yocto_css.py)0
-rwxr-xr-xshare/extensions/svg2xaml.xsl27
-rwxr-xr-xshare/extensions/synfig_prepare.py2
-rwxr-xr-xshare/extensions/webslicer_export.py8
19 files changed, 572 insertions, 269 deletions
diff --git a/share/extensions/CMakeLists.txt b/share/extensions/CMakeLists.txt
new file mode 100644
index 000000000..280abd0a7
--- /dev/null
+++ b/share/extensions/CMakeLists.txt
@@ -0,0 +1,49 @@
+file(GLOB _FILES
+ "README"
+ "fontfix.conf"
+ "inkweb.js"
+ "jessyInk.js"
+ "jessyInk_core_mouseHandler_noclick.js"
+ "jessyInk_core_mouseHandler_zoomControl.js"
+ "aisvg.xslt"
+ "colors.xml"
+ "jessyInk_video.svg"
+ "seamless_pattern.svg"
+ "svg2fxg.xsl"
+ "svg2xaml.xsl"
+ "xaml2svg.xsl"
+ "inkscape.extension.rng"
+ "*.py"
+ "*.pl"
+ "*.sh"
+ "*.rb"
+ "*.inx"
+ )
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions)
+
+file(GLOB _FILES "alphabet_soup/*.svg")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/alphabet_soup)
+
+file(GLOB _FILES "Barcode/*.py")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/Barcode)
+
+file(GLOB _FILES "Poly3DObjects/*.obj")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/Poly3DObjects)
+
+# file(GLOB _FILES
+# "test/*.svg"
+# "test/*.sh"
+# "test/*.py"
+# "test/*.js"
+# "test/run-all-extension-tests"
+# )
+# install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/test)
+
+file(GLOB _FILES "ink2canvas/*.py")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/ink2canvas)
+
+file(GLOB _FILES "scour/*.py")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/scour)
+
+file(GLOB _FILES "xaml2svg/*.xsl")
+install(FILES ${_FILES} DESTINATION ${SHARE_INSTALL}/inkscape/extensions/xaml2svg)
diff --git a/share/extensions/Makefile.am b/share/extensions/Makefile.am
index 130ed6e40..765f18a02 100644
--- a/share/extensions/Makefile.am
+++ b/share/extensions/Makefile.am
@@ -2,9 +2,10 @@
SUBDIRS = \
alphabet_soup \
Barcode \
+ ink2canvas \
Poly3DObjects \
+ scour \
test \
- ink2canvas \
xaml2svg
extensiondir = $(datadir)/inkscape/extensions
diff --git a/share/extensions/image_attributes.inx b/share/extensions/image_attributes.inx
new file mode 100644
index 000000000..a353d17e5
--- /dev/null
+++ b/share/extensions/image_attributes.inx
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
+
+ <_name>Set Image Attributes</_name>
+ <id>org.inkscape.effect.image_attributes</id>
+
+ <dependency type="executable" location="extensions">image_attributes.py</dependency>
+ <dependency type="executable" location="extensions">inkex.py</dependency>
+
+ <param name="tab_main" type="notebook">
+
+ <!-- render images like in 0.48 -->
+ <page name="tab_basic" _gui-text="Basic">
+ <_param name="basic_desc1" type="description">Render all bitmap images like in older Inskcape versions.
+
+Available options:</_param>
+ <param name="fix_scaling" type="boolean" _gui-text="Support non-unifom scaling">true</param>
+ <param name="fix_rendering" type="boolean" _gui-text="Render images blocky">false</param>
+ </page>
+
+ <!-- image aspect ratio -->
+ <page name="tab_aspectRatio" _gui-text="Image Aspect Ratio">
+ <param name="aspect_ratio" type="enum" _gui-text="preserveAspectRatio attribute:">
+ <item value="none">none</item>
+ <_item value="unset">Unset</_item>
+ <item value="xMinYMin">xMinYMin</item>
+ <item value="xMidYMin">xMidYMin</item>
+ <item value="xMaxYMin">xMaxYMin</item>
+ <item value="xMinYMid">xMinYMid</item>
+ <item value="xMidYMid">xMidYMid</item>
+ <item value="xMaxYMid">xMaxYMid</item>
+ <item value="xMinYMax">xMinYMax</item>
+ <item value="xMidYMax">xMidYMax</item>
+ <item value="xMaxYMax">xMaxYMax</item>
+ </param>
+ <param name="aspect_clip" type="enum" _gui-text="meetOrSlice:">
+ <item value="unset">-</item>
+ <item value="meet">meet</item>
+ <item value="slice">slice</item>
+ </param>
+ <param name="aspect_ratio_scope" type="enum" _gui-text="Scope:">
+ <_item value="selected_only">Change only selected image(s)</_item>
+ <_item value="in_selection">Change all images in selection</_item>
+ <_item value="in_document">Change all images in document</_item>
+ </param>
+ </page>
+
+ <!-- image-rendering -->
+ <page name="tab_image_rendering" _gui-text="Image Rendering Quality">
+ <param name="image_rendering" type="enum" _gui-text="Image rendering attribute:">
+ <_item value="unset">Unset</_item>
+ <item value="auto">auto</item>
+ <item value="optimizeQuality">optimizeQuality</item>
+ <item value="optimizeSpeed">optimizeSpeed</item>
+ <item value="inherit">inherit</item>
+ </param>
+ <param name="image_rendering_scope" type="enum" _gui-text="Scope:">
+ <_item value="selected_only">Change only selected image(s)</_item>
+ <_item value="in_selection">Change all images in selection</_item>
+ <_item value="in_document">Change all images in document</_item>
+ <_item value="on_parent_group">Apply attribute to parent group of selection</_item>
+ <_item value="on_root_only" >Apply attribute to SVG root</_item>
+ </param>
+ </page>
+
+ </param>
+
+ <effect needs-document="true" needs-live-preview="true">
+ <object-type>all</object-type>
+ <effects-menu>
+ <submenu _name="Images"/>
+ </effects-menu>
+ </effect>
+
+ <script>
+ <command reldir="extensions" interpreter="python">image_attributes.py</command>
+ </script>
+
+ <options silent="false"></options>
+
+</inkscape-extension>
+
diff --git a/share/extensions/image_attributes.py b/share/extensions/image_attributes.py
new file mode 100755
index 000000000..ddd5a8b87
--- /dev/null
+++ b/share/extensions/image_attributes.py
@@ -0,0 +1,169 @@
+#!/usr/bin/env python
+'''
+image_attributes.py - adjust image attributes which don't have global
+GUI options yet
+
+Tool for Inkscape 0.91 to adjust rendering of drawings with linked
+or embedded bitmap images created with older versions of Inkscape
+or third-party applications.
+
+Copyright (C) 2015, ~suv <suv-sf@users.sf.net>
+
+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 inkex
+import simplestyle
+
+try:
+ inkex.localize()
+except:
+ import gettext
+ _ = gettext.gettext
+
+
+class SetAttrImage(inkex.Effect):
+ def __init__(self):
+ inkex.Effect.__init__(self)
+ # main options
+ self.OptionParser.add_option("--fix_scaling",
+ action="store", type="inkbool",
+ dest="fix_scaling", default=True,
+ help="")
+ self.OptionParser.add_option("--fix_rendering",
+ action="store", type="inkbool",
+ dest="fix_rendering", default=False,
+ help="")
+ self.OptionParser.add_option("--aspect_ratio",
+ action="store", type="string",
+ dest="aspect_ratio", default="none",
+ help="Value for attribute 'preserveAspectRatio'")
+ self.OptionParser.add_option("--aspect_clip",
+ action="store", type="string",
+ dest="aspect_clip", default="unset",
+ help="optional 'meetOrSlice' value")
+ self.OptionParser.add_option("--aspect_ratio_scope",
+ action="store", type="string",
+ dest="aspect_ratio_scope", default="selected_only",
+ help="scope within which to edit 'preserveAspectRatio' attribute")
+ self.OptionParser.add_option("--image_rendering",
+ action="store", type="string",
+ dest="image_rendering", default="unset",
+ help="Value for attribute 'image-rendering'")
+ self.OptionParser.add_option("--image_rendering_scope",
+ action="store", type="string",
+ dest="image_rendering_scope", default="selected_only",
+ help="scope within which to edit 'image-rendering' attribute")
+ # tabs
+ self.OptionParser.add_option("--tab_main",
+ action="store", type="string",
+ dest="tab_main")
+
+ # core method
+
+ def change_attribute(self, node, attribute):
+ for key, value in attribute.items():
+ if key == 'preserveAspectRatio':
+ # set presentation attribute
+ if value != "unset":
+ node.set(key, str(value))
+ else:
+ if node.get(key):
+ del node.attrib[key]
+ elif key == 'image-rendering':
+ node_style = simplestyle.parseStyle(node.get('style'))
+ if key not in node_style:
+ # set presentation attribute
+ if value != "unset":
+ node.set(key, str(value))
+ else:
+ if node.get(key):
+ del node.attrib[key]
+ else:
+ # set style property
+ if value != "unset":
+ node_style[key] = str(value)
+ else:
+ del node_style[key]
+ node.set('style', simplestyle.formatStyle(node_style))
+ else:
+ pass
+
+ def change_all_images(self, node, attribute):
+ path = 'descendant-or-self::svg:image'
+ for img in node.xpath(path, namespaces=inkex.NSS):
+ self.change_attribute(img, attribute)
+
+ # methods called via dispatcher
+
+ def change_selected_only(self, selected, attribute):
+ if selected:
+ for node_id, node in selected.iteritems():
+ if node.tag == inkex.addNS('image', 'svg'):
+ self.change_attribute(node, attribute)
+
+ def change_in_selection(self, selected, attribute):
+ if selected:
+ for node_id, node in selected.iteritems():
+ self.change_all_images(node, attribute)
+
+ def change_in_document(self, selected, attribute):
+ self.change_all_images(self.document.getroot(), attribute)
+
+ def change_on_parent_group(self, selected, attribute):
+ if selected:
+ for node_id, node in selected.iteritems():
+ self.change_attribute(node.getparent(), attribute)
+
+ def change_on_root_only(self, selected, attribute):
+ self.change_attribute(self.document.getroot(), attribute)
+
+ # main
+
+ def effect(self):
+ attr_val = []
+ attr_dict = {}
+ cmd_scope = None
+ if self.options.tab_main == '"tab_basic"':
+ cmd_scope = "in_document"
+ attr_dict['preserveAspectRatio'] = ("none" if self.options.fix_scaling else "unset")
+ attr_dict['image-rendering'] = ("optimizeSpeed" if self.options.fix_rendering else "unset")
+ elif self.options.tab_main == '"tab_aspectRatio"':
+ attr_val = [self.options.aspect_ratio]
+ if self.options.aspect_clip != "unset":
+ attr_val.append(self.options.aspect_clip)
+ attr_dict['preserveAspectRatio'] = ' '.join(attr_val)
+ cmd_scope = self.options.aspect_ratio_scope
+ elif self.options.tab_main == '"tab_image_rendering"':
+ attr_dict['image-rendering'] = self.options.image_rendering
+ cmd_scope = self.options.image_rendering_scope
+ else: # help tab
+ pass
+ # dispatcher
+ if cmd_scope is not None:
+ try:
+ change_cmd = getattr(self, 'change_{0}'.format(cmd_scope))
+ change_cmd(self.selected, attr_dict)
+ except AttributeError:
+ inkex.errormsg('Scope "{0}" not supported'.format(cmd_scope))
+
+
+if __name__ == '__main__':
+ e = SetAttrImage()
+ e.affect()
+
+
+# vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99
diff --git a/share/extensions/inkex.py b/share/extensions/inkex.py
index 19e860b9a..6eb229885 100755
--- a/share/extensions/inkex.py
+++ b/share/extensions/inkex.py
@@ -207,7 +207,7 @@ class Effect:
x = self.unittouu( xattr[0] + 'px' )
y = self.unittouu( yattr[0] + 'px')
doc_height = self.unittouu(self.document.getroot().get('height'))
- if x and y:
+ if x and y and doc_height is not None:
self.view_center = (float(x), doc_height - float(y)) # FIXME: y-coordinate flip, eliminate it when it's gone in Inkscape
def getselected(self):
@@ -297,7 +297,7 @@ class Effect:
svgwidth = self.document.getroot().get('width')
viewboxstr = self.document.getroot().get('viewBox')
- if viewboxstr:
+ if viewboxstr and svgwidth is not None:
unitmatch = re.compile('(%s)$' % '|'.join(self.__uuconv.keys()))
param = re.compile(r'(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)')
@@ -340,19 +340,22 @@ class Effect:
unit = re.compile('(%s)$' % '|'.join(self.__uuconv.keys()))
param = re.compile(r'(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)')
- p = param.match(string)
- u = unit.search(string)
- if p:
- retval = float(p.string[p.start():p.end()])
+ if string is not None:
+ p = param.match(string)
+ u = unit.search(string)
+ if p:
+ retval = float(p.string[p.start():p.end()])
+ else:
+ retval = 0.0
+ if u:
+ try:
+ return retval * (self.__uuconv[u.string[u.start():u.end()]] / self.__uuconv[self.getDocumentUnit()])
+ except KeyError:
+ pass
+ else: # default assume 'px' unit
+ return retval / self.__uuconv[self.getDocumentUnit()]
else:
- retval = 0.0
- if u:
- try:
- return retval * (self.__uuconv[u.string[u.start():u.end()]] / self.__uuconv[self.getDocumentUnit()])
- except KeyError:
- pass
- else: # default assume 'px' unit
- return retval / self.__uuconv[self.getDocumentUnit()]
+ retval = None
return retval
diff --git a/share/extensions/layout_nup.inx b/share/extensions/layout_nup.inx
index 2b7734fc3..1d4d1ef0f 100644
--- a/share/extensions/layout_nup.inx
+++ b/share/extensions/layout_nup.inx
@@ -3,7 +3,6 @@
<_name>N-up layout</_name>
<id>org.greygreen.inkscape.effects.nup</id>
<dependency type="executable" location="extensions">layout_nup.py</dependency>
- <dependency type="executable" location="extensions">layout_nup_pageframe.py</dependency>
<dependency type="executable" location="extensions">inkex.py</dependency>
<param name="tab" type="notebook">
diff --git a/share/extensions/layout_nup.py b/share/extensions/layout_nup.py
index 5f8451c45..266a3950d 100755
--- a/share/extensions/layout_nup.py
+++ b/share/extensions/layout_nup.py
@@ -19,7 +19,19 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import inkex
import sys
-import layout_nup_pageframe
+try:
+ import xml.etree.ElementTree as ElementTree
+except:
+ try:
+ from lxml import etree as ElementTree
+ except:
+ try:
+ from elementtree.ElementTree import ElementTree
+ except:
+ sys.stderr.write("""Requires ElementTree module, included
+in Python 2.5 or supplied by lxml or elementtree modules.
+
+""")
class Nup(inkex.Effect):
def __init__(self):
@@ -64,7 +76,7 @@ class Nup(inkex.Effect):
if getattr(self.options, i):
showList.append(i.lower().replace('show', ''))
o = self.options
- self.pf = layout_nup_pageframe.GenerateNup(
+ self.pf = self.GenerateNup(
unit=o.unit,
pgSize=(o.pgSizeX,o.pgSizeY),
pgMargin=(o.pgMarginTop,o.pgMarginRight,o.pgMarginBottom,o.pgMarginLeft),
@@ -84,7 +96,203 @@ class Nup(inkex.Effect):
def output(self):
sys.stdout.write(self.pf)
+ def expandTuple(self, unit, x, length = 4):
+ try:
+ iter(x)
+ except:
+ return None
+
+ if len(x) != length: x = x*2
+ if len(x) != length:
+ raise Exception("expandTuple: requires 2 or 4 item tuple")
+ try:
+ return tuple(map(lambda ev: (self.unittouu(str(eval(str(ev)))+unit)/self.unittouu('1px')), x))
+ except:
+ return None
+
+ def GenerateNup(self,
+ unit="px",
+ pgSize=("8.5*96","11*96"),
+ pgMargin=(0,0),
+ pgPadding=(0,0),
+ num=(2,2),
+ calculateSize=True,
+ size=None,
+ margin=(0,0),
+ padding=(20,20),
+ show=['default'],
+ container='svg',
+ returnTree = False,
+ ):
+ """Generate the SVG. Inputs are run through 'eval(str(x))' so you can use
+ '8.5*72' instead of 612. Margin / padding dimension tuples can be
+ (top & bottom, left & right) or (top, right, bottom, left).
+
+ Keyword arguments:
+ pgSize -- page size, width x height
+ pgMargin -- extra space around each page
+ pgPadding -- added to pgMargin
+ n -- rows x cols
+ size -- override calculated size, width x height
+ margin -- white space around each piece
+ padding -- inner padding for each piece
+ show -- list of keywords indicating what to show
+ - 'crosses' - cutting guides
+ - 'inner' - inner boundary
+ - 'outer' - outer boundary
+ container -- 'svg' or 'g'
+ returnTree -- whether to return the ElementTree or the string
+ """
+
+ if 'default' in show:
+ show = set(show).union(['inner', 'innerbox', 'holder', 'crosses'])
+
+ pgMargin = self.expandTuple(unit, pgMargin)
+ pgPadding = self.expandTuple(unit, pgPadding)
+ margin = self.expandTuple(unit, margin)
+ padding = self.expandTuple(unit, padding)
+
+ pgSize = self.expandTuple(unit, pgSize, length = 2)
+ # num = tuple(map(lambda ev: eval(str(ev)), num))
+
+ pgEdge = map(sum,zip(pgMargin, pgPadding))
+
+ top, right, bottom, left = 0,1,2,3
+ width, height = 0,1
+ rows, cols = 0,1
+ size = self.expandTuple(unit, size, length = 2)
+ if size == None or calculateSize == True or len(size) < 2 or size[0] == 0 or size[1] == 0:
+ size = ((pgSize[width]
+ - pgEdge[left] - pgEdge[right]
+ - num[cols]*(margin[left] + margin[right])) / num[cols],
+ (pgSize[height]
+ - pgEdge[top] - pgEdge[bottom]
+ - num[rows]*(margin[top] + margin[bottom])) / num[rows]
+ )
+ else:
+ size = self.expandTuple(unit, size, length = 2)
+
+ # sep is separation between same points on pieces
+ sep = (size[width]+margin[right]+margin[left],
+ size[height]+margin[top]+margin[bottom])
+
+ style = 'stroke:#000000;stroke-opacity:1;fill:none;fill-opacity:1;'
+
+ padbox = 'rect', {
+ 'x': str(pgEdge[left] + margin[left] + padding[left]),
+ 'y': str(pgEdge[top] + margin[top] + padding[top]),
+ 'width': str(size[width] - padding[left] - padding[right]),
+ 'height': str(size[height] - padding[top] - padding[bottom]),
+ 'style': style,
+ }
+ margbox = 'rect', {
+ 'x': str(pgEdge[left] + margin[left]),
+ 'y': str(pgEdge[top] + margin[top]),
+ 'width': str(size[width]),
+ 'height': str(size[height]),
+ 'style': style,
+ }
+
+ doc = ElementTree.ElementTree(ElementTree.Element(container,
+ {'xmlns:inkscape':"http://www.inkscape.org/namespaces/inkscape",
+ 'xmlns:xlink':"http://www.w3.org/1999/xlink",
+ 'width':str(pgSize[width]),
+ 'height':str(pgSize[height]),
+ }))
+
+ sub = ElementTree.SubElement
+
+ root = doc.getroot()
+
+ def makeClones(under, to):
+ for r in range(0,num[rows]):
+ for c in range(0,num[cols]):
+ if r == 0 and c == 0: continue
+ sub(under, 'use', {
+ 'xlink:href': '#' + to,
+ 'transform': 'translate(%f,%f)' %
+ (c*sep[width], r*sep[height])})
+
+ # guidelayer #####################################################
+ if set(['inner', 'outer']).intersection(show):
+ layer = sub(root, 'g', {'id':'guidelayer',
+ 'inkscape:groupmode':'layer'})
+ if 'inner' in show:
+ padbox[1]['id'] = 'innerguide'
+ padbox[1]['style'] = padbox[1]['style'].replace('stroke:#000000',
+ 'stroke:#8080ff')
+ sub(layer, *padbox)
+ del padbox[1]['id']
+ padbox[1]['style'] = padbox[1]['style'].replace('stroke:#8080ff',
+ 'stroke:#000000')
+ makeClones(layer, 'innerguide')
+ if 'outer' in show:
+ margbox[1]['id'] = 'outerguide'
+ margbox[1]['style'] = padbox[1]['style'].replace('stroke:#000000',
+ 'stroke:#8080ff')
+ sub(layer, *margbox)
+ del margbox[1]['id']
+ margbox[1]['style'] = padbox[1]['style'].replace('stroke:#8080ff',
+ 'stroke:#000000')
+ makeClones(layer, 'outerguide')
+
+ # crosslayer #####################################################
+ if set(['crosses']).intersection(show):
+ layer = sub(root, 'g', {'id':'cutlayer',
+ 'inkscape:groupmode':'layer'})
+
+ if 'crosses' in show:
+ crosslen = 12
+ group = sub(layer, 'g', id='cross')
+ x,y = 0,0
+ path = 'M%f %f' % (x+pgEdge[left] + margin[left],
+ y+pgEdge[top] + margin[top]-crosslen)
+ path += ' L%f %f' % (x+pgEdge[left] + margin[left],
+ y+pgEdge[top] + margin[top]+crosslen)
+ path += ' M%f %f' % (x+pgEdge[left] + margin[left]-crosslen,
+ y+pgEdge[top] + margin[top])
+ path += ' L%f %f' % (x+pgEdge[left] + margin[left]+crosslen,
+ y+pgEdge[top] + margin[top])
+ sub(group, 'path', style=style+'stroke-width:0.05',
+ d = path, id = 'crossmarker')
+ for r in 0, 1:
+ for c in 0, 1:
+ if r or c:
+ x,y = c*size[width], r*size[height]
+ sub(group, 'use', {
+ 'xlink:href': '#crossmarker',
+ 'transform': 'translate(%f,%f)' %
+ (x,y)})
+ makeClones(layer, 'cross')
+
+ # clonelayer #####################################################
+ layer = sub(root, 'g', {'id':'clonelayer', 'inkscape:groupmode':'layer'})
+ makeClones(layer, 'main')
+
+ # mainlayer ######################################################
+ layer = sub(root, 'g', {'id':'mainlayer', 'inkscape:groupmode':'layer'})
+ group = sub(layer, 'g', {'id':'main'})
+
+ if 'innerbox' in show:
+ sub(group, *padbox)
+ if 'outerbox' in show:
+ sub(group, *margbox)
+ if 'holder' in show:
+ x, y = (pgEdge[left] + margin[left] + padding[left],
+ pgEdge[top] + margin[top] + padding[top])
+ w, h = (size[width] - padding[left] - padding[right],
+ size[height] - padding[top] - padding[bottom])
+ path = 'M%f %f' % (x + w/2., y)
+ path += ' L%f %f' % (x + w, y + h/2.)
+ path += ' L%f %f' % (x + w/2., y + h)
+ path += ' L%f %f' % (x, y + h/2.)
+ path += ' Z'
+ sub(group, 'path', style=style, d = path)
+
+ if returnTree:
+ return doc
+ else:
+ return ElementTree.tostring(root)
+
e = Nup()
e.affect()
-
-
diff --git a/share/extensions/layout_nup_pageframe.py b/share/extensions/layout_nup_pageframe.py
deleted file mode 100755
index 471a75dd3..000000000
--- a/share/extensions/layout_nup_pageframe.py
+++ /dev/null
@@ -1,230 +0,0 @@
-#!/usr/bin/env python
-#@+leo-ver=4-thin
-#@+node:tbrown.20070622094435.1:@thin pageframe.py
-"""Create n-up SVG layouts"""
-
-#@+others
-#@+node:tbrown.20070622103716:imports
-import sys, inkex
-
-try:
- import xml.etree.ElementTree as ElementTree
-except:
- try:
- from lxml import etree as ElementTree
- except:
- try:
- from elementtree.ElementTree import ElementTree
- except:
- sys.stderr.write("""Requires ElementTree module, included
-in Python 2.5 or supplied by lxml or elementtree modules.
-
-""")
-#@-node:tbrown.20070622103716:imports
-#@+node:tbrown.20070622103716.1:expandTuple
-def expandTuple(unit, x, length = 4):
- try:
- iter(x)
- except:
- return None
-
- if len(x) != length: x = x*2
- if len(x) != length:
- raise Exception("expandTuple: requires 2 or 4 item tuple")
- try:
- return tuple(map(lambda ev: (self.unittouu(str(eval(str(ev)))+unit)), x))
- except:
- return None
-#@-node:tbrown.20070622103716.1:expandTuple
-#@+node:tbrown.20070622103716.2:GenerateNup
-def GenerateNup(unit="px",
- pgSize=("8.5*96","11*96"),
- pgMargin=(0,0),
- pgPadding=(0,0),
- num=(2,2),
- calculateSize=True,
- size=None,
- margin=(0,0),
- padding=(20,20),
- show=['default'],
- container='svg',
- returnTree = False,
- ):
- """Generate the SVG. Inputs are run through 'eval(str(x))' so you can use
-'8.5*72' instead of 612. Margin / padding dimension tuples can be
-(top & bottom, left & right) or (top, right, bottom, left).
-
-Keyword arguments:
-pgSize -- page size, width x height
-pgMargin -- extra space around each page
-pgPadding -- added to pgMargin
-n -- rows x cols
-size -- override calculated size, width x height
-margin -- white space around each piece
-padding -- inner padding for each piece
-show -- list of keywords indicating what to show
- - 'crosses' - cutting guides
- - 'inner' - inner boundary
- - 'outer' - outer boundary
-container -- 'svg' or 'g'
-returnTree -- whether to return the ElementTree or the string
-"""
-
- if 'default' in show:
- show = set(show).union(['inner', 'innerbox', 'holder', 'crosses'])
-
- pgMargin = expandTuple(unit, pgMargin)
- pgPadding = expandTuple(unit, pgPadding)
- margin = expandTuple(unit, margin)
- padding = expandTuple(unit, padding)
-
- pgSize = expandTuple(unit, pgSize, length = 2)
-# num = tuple(map(lambda ev: eval(str(ev)), num))
-
- pgEdge = map(sum,zip(pgMargin, pgPadding))
-
- top, right, bottom, left = 0,1,2,3
- width, height = 0,1
- rows, cols = 0,1
- size = expandTuple(unit, size, length = 2)
- if size == None or calculateSize == True or len(size) < 2 or size[0] == 0 or size[1] == 0:
- size = ((pgSize[width]
- - pgEdge[left] - pgEdge[right]
- - num[cols]*(margin[left] + margin[right])) / num[cols],
- (pgSize[height]
- - pgEdge[top] - pgEdge[bottom]
- - num[rows]*(margin[top] + margin[bottom])) / num[rows]
- )
- else:
- size = expandTuple(unit, size, length = 2)
-
- # sep is separation between same points on pieces
- sep = (size[width]+margin[right]+margin[left],
- size[height]+margin[top]+margin[bottom])
-
- style = 'stroke:#000000;stroke-opacity:1;fill:none;fill-opacity:1;'
-
- padbox = 'rect', {
- 'x': str(pgEdge[left] + margin[left] + padding[left]),
- 'y': str(pgEdge[top] + margin[top] + padding[top]),
- 'width': str(size[width] - padding[left] - padding[right]),
- 'height': str(size[height] - padding[top] - padding[bottom]),
- 'style': style,
- }
- margbox = 'rect', {
- 'x': str(pgEdge[left] + margin[left]),
- 'y': str(pgEdge[top] + margin[top]),
- 'width': str(size[width]),
- 'height': str(size[height]),
- 'style': style,
- }
-
- doc = ElementTree.ElementTree(ElementTree.Element(container,
- {'xmlns:inkscape':"http://www.inkscape.org/namespaces/inkscape",
- 'xmlns:xlink':"http://www.w3.org/1999/xlink",
- 'width':str(pgSize[width]),
- 'height':str(pgSize[height]),
- }))
-
- sub = ElementTree.SubElement
-
- root = doc.getroot()
-
- def makeClones(under, to):
- for r in range(0,num[rows]):
- for c in range(0,num[cols]):
- if r == 0 and c == 0: continue
- sub(under, 'use', {
- 'xlink:href': '#' + to,
- 'transform': 'translate(%f,%f)' %
- (c*sep[width], r*sep[height])})
-
- # guidelayer #####################################################
- if set(['inner', 'outer']).intersection(show):
- layer = sub(root, 'g', {'id':'guidelayer',
- 'inkscape:groupmode':'layer'})
- if 'inner' in show:
- padbox[1]['id'] = 'innerguide'
- padbox[1]['style'] = padbox[1]['style'].replace('stroke:#000000',
- 'stroke:#8080ff')
- sub(layer, *padbox)
- del padbox[1]['id']
- padbox[1]['style'] = padbox[1]['style'].replace('stroke:#8080ff',
- 'stroke:#000000')
- makeClones(layer, 'innerguide')
- if 'outer' in show:
- margbox[1]['id'] = 'outerguide'
- margbox[1]['style'] = padbox[1]['style'].replace('stroke:#000000',
- 'stroke:#8080ff')
- sub(layer, *margbox)
- del margbox[1]['id']
- margbox[1]['style'] = padbox[1]['style'].replace('stroke:#8080ff',
- 'stroke:#000000')
- makeClones(layer, 'outerguide')
-
- # crosslayer #####################################################
- if set(['crosses']).intersection(show):
- layer = sub(root, 'g', {'id':'cutlayer',
- 'inkscape:groupmode':'layer'})
-
- if 'crosses' in show:
- crosslen = 12
- group = sub(layer, 'g', id='cross')
- x,y = 0,0
- path = 'M%f %f' % (x+pgEdge[left] + margin[left],
- y+pgEdge[top] + margin[top]-crosslen)
- path += ' L%f %f' % (x+pgEdge[left] + margin[left],
- y+pgEdge[top] + margin[top]+crosslen)
- path += ' M%f %f' % (x+pgEdge[left] + margin[left]-crosslen,
- y+pgEdge[top] + margin[top])
- path += ' L%f %f' % (x+pgEdge[left] + margin[left]+crosslen,
- y+pgEdge[top] + margin[top])
- sub(group, 'path', style=style+'stroke-width:0.05',
- d = path, id = 'crossmarker')
- for r in 0, 1:
- for c in 0, 1:
- if r or c:
- x,y = c*size[width], r*size[height]
- sub(group, 'use', {
- 'xlink:href': '#crossmarker',
- 'transform': 'translate(%f,%f)' %
- (x,y)})
- makeClones(layer, 'cross')
-
- # clonelayer #####################################################
- layer = sub(root, 'g', {'id':'clonelayer', 'inkscape:groupmode':'layer'})
- makeClones(layer, 'main')
-
- # mainlayer ######################################################
- layer = sub(root, 'g', {'id':'mainlayer', 'inkscape:groupmode':'layer'})
- group = sub(layer, 'g', {'id':'main'})
-
- if 'innerbox' in show:
- sub(group, *padbox)
- if 'outerbox' in show:
- sub(group, *margbox)
- if 'holder' in show:
- x, y = (pgEdge[left] + margin[left] + padding[left],
- pgEdge[top] + margin[top] + padding[top])
- w, h = (size[width] - padding[left] - padding[right],
- size[height] - padding[top] - padding[bottom])
- path = 'M%f %f' % (x + w/2., y)
- path += ' L%f %f' % (x + w, y + h/2.)
- path += ' L%f %f' % (x + w/2., y + h)
- path += ' L%f %f' % (x, y + h/2.)
- path += ' Z'
- sub(group, 'path', style=style, d = path)
-
- if returnTree:
- return doc
- else:
- return ElementTree.tostring(root)
-
-if __name__ == '__main__':
- print GenerateNup(num=(10,3), margin=(5,5), show=['default', 'outer'])
-#@-node:tbrown.20070622103716.2:GenerateNup
-#@-others
-#@-node:tbrown.20070622094435.1:@thin pageframe.py
-#@-leo
-
-
diff --git a/share/extensions/measure.py b/share/extensions/measure.py
index cdccb6bb8..e7c91feec 100755
--- a/share/extensions/measure.py
+++ b/share/extensions/measure.py
@@ -188,13 +188,13 @@ class Length(inkex.Effect):
factor = self.unittouu(doc.get('height'))/float(viewh)
factor /= self.unittouu('1px')
self.options.fontsize /= factor
+ factor *= scale/self.unittouu('1'+self.options.unit)
# loop over all selected paths
for id, node in self.selected.iteritems():
if node.tag == inkex.addNS('path','svg'):
mat = simpletransform.composeParents(node, [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]])
p = cubicsuperpath.parsePath(node.get('d'))
simpletransform.applyTransformToPath(mat, p)
- factor *= scale/self.unittouu('1'+self.options.unit)
if self.options.type == "length":
slengths, stotal = csplength(p)
self.group = inkex.etree.SubElement(node.getparent(),inkex.addNS('text','svg'))
diff --git a/share/extensions/scour.inx b/share/extensions/scour.inx
index 45719deeb..c97eec502 100644
--- a/share/extensions/scour.inx
+++ b/share/extensions/scour.inx
@@ -2,9 +2,9 @@
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
<_name>Optimized SVG Output</_name>
<id>org.inkscape.output.scour</id>
- <dependency type="executable" location="extensions">scour.py</dependency>
- <dependency type="executable" location="extensions">svg_regex.py</dependency>
- <dependency type="executable" location="extensions">yocto_css.py</dependency>
+ <dependency type="executable" location="extensions">scour/scour.py</dependency>
+ <dependency type="executable" location="extensions">scour/svg_regex.py</dependency>
+ <dependency type="executable" location="extensions">scour/yocto_css.py</dependency>
<param name="tab" type="notebook">
<page name="Options" _gui-text="Options">
<param name="simplify-colors" type="boolean" _gui-text="Shorten color values">true</param>
@@ -63,6 +63,6 @@
<_filetypetooltip>Scalable Vector Graphics</_filetypetooltip>
</output>
<script>
- <command reldir="extensions" interpreter="python">scour.inkscape.py</command>
+ <command reldir="extensions" interpreter="python">scour/scour.inkscape.py</command>
</script>
</inkscape-extension>
diff --git a/share/extensions/scour/Makefile.am b/share/extensions/scour/Makefile.am
new file mode 100644
index 000000000..8a6f42544
--- /dev/null
+++ b/share/extensions/scour/Makefile.am
@@ -0,0 +1,13 @@
+
+scourdir = $(datadir)/inkscape/extensions/scour
+
+scour_DATA = \
+ scour.py \
+ scour.inkscape.py \
+ svg_regex.py \
+ svg_transform.py \
+ yocto_css.py
+
+EXTRA_DIST = \
+ $(scour_DATA)
+
diff --git a/share/extensions/scour.inkscape.py b/share/extensions/scour/scour.inkscape.py
index f161a09c2..f161a09c2 100755..100644
--- a/share/extensions/scour.inkscape.py
+++ b/share/extensions/scour/scour.inkscape.py
diff --git a/share/extensions/scour.py b/share/extensions/scour/scour.py
index 236529daa..236529daa 100644
--- a/share/extensions/scour.py
+++ b/share/extensions/scour/scour.py
diff --git a/share/extensions/svg_regex.py b/share/extensions/scour/svg_regex.py
index 6321bff0e..6321bff0e 100755..100644
--- a/share/extensions/svg_regex.py
+++ b/share/extensions/scour/svg_regex.py
diff --git a/share/extensions/svg_transform.py b/share/extensions/scour/svg_transform.py
index 860c1df5d..860c1df5d 100755..100644
--- a/share/extensions/svg_transform.py
+++ b/share/extensions/scour/svg_transform.py
diff --git a/share/extensions/yocto_css.py b/share/extensions/scour/yocto_css.py
index c6bd0c37e..c6bd0c37e 100755..100644
--- a/share/extensions/yocto_css.py
+++ b/share/extensions/scour/yocto_css.py
diff --git a/share/extensions/svg2xaml.xsl b/share/extensions/svg2xaml.xsl
index d2796c93c..c384b022f 100755
--- a/share/extensions/svg2xaml.xsl
+++ b/share/extensions/svg2xaml.xsl
@@ -1266,25 +1266,28 @@ exclude-result-prefixes="rdf xlink xs exsl libxslt inkscape">
-->
<xsl:template mode="fill_rule" match="*">
<xsl:choose>
- <xsl:when test="@fill-rule and (@fill-rule = 'nonzero' or @fill-rule = 'evenodd')">
- <xsl:attribute name="FillRule">
- <xsl:value-of select="normalize-space(@fill-rule)" />
- </xsl:attribute>
+ <xsl:when test="@fill-rule and (@fill-rule = 'nonzero')">
+ <xsl:attribute name="FillRule">NonZero</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@fill-rule and (@fill-rule = 'evenodd')">
+ <xsl:attribute name="FillRule">EvenOdd</xsl:attribute>
</xsl:when>
<xsl:when test="@style and contains(@style, 'fill-rule:')">
<xsl:variable name="FillRule" select="normalize-space(substring-after(@style, 'fill-rule:'))" />
<xsl:choose>
<xsl:when test="contains($FillRule, ';')">
- <xsl:if test="substring-before($FillRule, ';') = 'nonzero' or substring-before($FillRule, ';') = 'evenodd'">
- <xsl:attribute name="FillRule">
- <xsl:value-of select="substring-before($FillRule, ';')" />
- </xsl:attribute>
+ <xsl:if test="substring-before($FillRule, ';') = 'nonzero'">
+ <xsl:attribute name="FillRule">NonZero</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="substring-before($FillRule, ';') = 'evenodd'">
+ <xsl:attribute name="FillRule">EvenOdd</xsl:attribute>
</xsl:if>
</xsl:when>
- <xsl:when test="$FillRule = 'nonzero' or $FillRule = 'evenodd'">
- <xsl:attribute name="FillRule">
- <xsl:value-of select="$FillRule" />
- </xsl:attribute>
+ <xsl:when test="$FillRule = 'nonzero'">
+ <xsl:attribute name="FillRule">NonZero</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$FillRule = 'evenodd'">
+ <xsl:attribute name="FillRule">EvenOdd</xsl:attribute>
</xsl:when>
</xsl:choose>
</xsl:when>
diff --git a/share/extensions/synfig_prepare.py b/share/extensions/synfig_prepare.py
index c6ad48c97..ebc50fd8e 100755
--- a/share/extensions/synfig_prepare.py
+++ b/share/extensions/synfig_prepare.py
@@ -86,7 +86,7 @@ class InkscapeActionGroup(object):
def select_id(self, object_id):
"""Select object with given id"""
- self.command += "--select='%s' " % (object_id)
+ self.command += "--select=%s " % (object_id)
if not self.has_selection:
self.has_selection = True
diff --git a/share/extensions/webslicer_export.py b/share/extensions/webslicer_export.py
index c9ea761a7..a8a3c67ba 100755
--- a/share/extensions/webslicer_export.py
+++ b/share/extensions/webslicer_export.py
@@ -72,7 +72,13 @@ class WebSlicer_Export(WebSlicer_Effect):
else:
inkex.errormsg(_('The directory "%s" does not exists.') % self.options.dir)
return
- self.unique_html_id( self.get_slicer_layer() )
+ # Check whether slicer layer exists (bug #1198826)
+ slicer_layer = self.get_slicer_layer()
+ if slicer_layer is None:
+ inkex.errormsg(_('No slicer layer found.'))
+ return {'error':'No slicer layer found.'}
+ else:
+ self.unique_html_id( slicer_layer )
return None