summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsu_v <suv-sf@users.sourceforge.net>2015-10-20 11:49:11 +0000
committer~suv <suv-sf@users.sourceforge.net>2015-10-20 11:49:11 +0000
commit9fa924d089746158ea4721a4a0e2dcab08f92121 (patch)
tree27cb4d567af5a3c33ada0832e221008216c3d88f
parentExtensions. Fix for bug #1506043 (PDF import options always default to Popple... (diff)
downloadinkscape-9fa924d089746158ea4721a4a0e2dcab08f92121.tar.gz
inkscape-9fa924d089746158ea4721a4a0e2dcab08f92121.zip
Extensions. Restack - add options to reverse, shuffle Z-order of selection (bug #1498583)
Fixed bugs: - https://launchpad.net/bugs/1498583 (bzr r14424)
-rw-r--r--po/POTFILES.in3
-rw-r--r--share/extensions/restack.inx62
-rwxr-xr-xshare/extensions/restack.py77
3 files changed, 114 insertions, 28 deletions
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 7aa4c7e64..468fd434b 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 Mon Aug 24 22:47:33 CEST 2015
+# Generated by ./generate_POTFILES.sh at Tue Sep 22 20:20:22 CEST 2015
[encoding: UTF-8]
inkscape.desktop.in
share/filters/filters.svg.h
@@ -403,6 +403,7 @@ share/extensions/print_win32_vector.py
share/extensions/render_barcode_datamatrix.py
share/extensions/render_barcode_qrcode.py
share/extensions/replace_font.py
+share/extensions/restack.py
share/extensions/summersnight.py
share/extensions/svg_and_media_zip_output.py
share/extensions/svgcalendar.py
diff --git a/share/extensions/restack.inx b/share/extensions/restack.inx
index 67f0f777a..4f5f577cb 100644
--- a/share/extensions/restack.inx
+++ b/share/extensions/restack.inx
@@ -4,25 +4,49 @@
<id>org.inkscape.filter.restack</id>
<dependency type="executable" location="extensions">restack.py</dependency>
<dependency type="executable" location="extensions">inkex.py</dependency>
- <param name="direction" type="enum" _gui-text="Restack Direction:">
- <_item value="lr">Left to Right (0)</_item>
- <_item value="bt">Bottom to Top (90)</_item>
- <_item value="rl">Right to Left (180)</_item>
- <_item value="tb">Top to Bottom (270)</_item>
- <_item value="ro">Radial Outward</_item>
- <_item value="ri">Radial Inward</_item>
- <_item value="aa">Arbitrary Angle</_item>
- </param>
- <param name="angle" type="float" min="0.0" max="360.0" _gui-text="Angle:">0.00</param>
- <param name="xanchor" type="enum" _gui-text="Horizontal Point:">
- <_item value="l">Left</_item>
- <_item value="m">Middle</_item>
- <_item value="r">Right</_item>
- </param>
- <param name="yanchor" type="enum" _gui-text="Vertical Point:">
- <_item value="t">Top</_item>
- <_item value="m">Middle</_item>
- <_item value="b">Bottom</_item>
+ <param name="tab" type="notebook">
+ <page name="positional" _gui-text="Based on Position">
+ <_param name="desc_dir" type="description" appearance="header">Restack Direction</_param>
+ <param name="nb_direction" type="notebook">
+ <page name="presets" _gui-text="Presets">
+ <param name="direction" type="enum" _gui-text="">
+ <_item value="lr">Left to Right (0)</_item>
+ <_item value="bt">Bottom to Top (90)</_item>
+ <_item value="rl">Right to Left (180)</_item>
+ <_item value="tb">Top to Bottom (270)</_item>
+ <_item value="ro">Radial Outward</_item>
+ <_item value="ri">Radial Inward</_item>
+ </param>
+ </page>
+ <page name="custom" _gui-text="Custom">
+ <param name="angle" type="float" min="0.0" max="360.0" _gui-text="Angle:">0.00</param>
+ </page>
+ </param>
+ <_param name="desc_ref" type="description" appearance="header">Object Reference Point</_param>
+ <param name="xanchor" type="enum" _gui-text="Horizontal:">
+ <_item value="l">Left</_item>
+ <_item value="m">Middle</_item>
+ <_item value="r">Right</_item>
+ </param>
+ <param name="yanchor" type="enum" _gui-text="Vertical:">
+ <_item value="t">Top</_item>
+ <_item value="m">Middle</_item>
+ <_item value="b">Bottom</_item>
+ </param>
+ </page>
+ <page name="z_order" _gui-text="Based on Z-Order">
+ <_param name="desc_zsort" type="description" appearance="header">Restack Mode</_param>
+ <param name="zsort" type="enum" _gui-text="">
+ <_item value="rev">Reverse Z-Order</_item>
+ <_item value="rand">Shuffle Z-Order</_item>
+ </param>
+ </page>
+ <page name="help" _gui-text="Help">
+ <_param name="desc_help" type="description">This extension changes the z-order of objects based on their position on the canvas or their current z-order.
+
+Selection:
+The extension restacks either objects inside a single selected group, or a selection of multiple objects on the current drawing level (layer or group).</_param>
+ </page>
</param>
<effect>
<object-type>path</object-type>
diff --git a/share/extensions/restack.py b/share/extensions/restack.py
index dc877cd9e..b76e0f765 100755
--- a/share/extensions/restack.py
+++ b/share/extensions/restack.py
@@ -21,7 +21,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
"""
-import inkex, os, csv, math
+import inkex, os, csv, math, random
+from pathmodifier import zSort
+
+inkex.localize()
try:
from subprocess import Popen, PIPE
@@ -48,13 +51,49 @@ class Restack(inkex.Effect):
action="store", type="string",
dest="yanchor", default="m",
help="vertical point to compare")
+ self.OptionParser.add_option("--zsort",
+ action="store", type="string",
+ dest="zsort", default="rev",
+ help="Restack mode based on Z-Order")
+ self.OptionParser.add_option("--tab",
+ action="store", type="string",
+ dest="tab",
+ help="The selected UI-tab when OK was pressed")
+ self.OptionParser.add_option("--nb_direction",
+ action="store", type="string",
+ dest="nb_direction",
+ help="The selected UI-tab when OK was pressed")
+
def effect(self):
- if len( self.selected ) > 0:
+ if self.options.tab == '"help"':
+ pass
+ elif len(self.selected) > 0:
+ if self.options.tab == '"positional"':
+ self.restack_positional()
+ elif self.options.tab == '"z_order"':
+ self.restack_z_order()
+ else:
+ inkex.errormsg(_("There is no selection to restack."))
+
+ def restack_positional(self):
+ if 1: # to be removed (workaround for smaller bzr diff)
+ objects = {}
objlist = []
- svg = self.document.getroot()
- parentnode = self.current_layer
file = self.args[ -1 ]
+ if self.options.nb_direction == '"custom"':
+ self.options.direction = "aa"
+
+ # process selection to get list of objects to be arranged
+ firstobject = self.selected[self.options.ids[0]]
+ if len(self.selected) == 1 and firstobject.tag == inkex.addNS('g', 'svg'):
+ parentnode = firstobject
+ for child in parentnode.iterchildren():
+ objects[child.get('id')] = child
+ else:
+ parentnode = self.current_layer
+ objects = self.selected
+
#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:
@@ -81,13 +120,13 @@ class Restack(inkex.Effect):
f.close
#find the center of all selected objects **Not the average!
- x,y,w,h = dimen[self.selected.keys()[0]]
+ x,y,w,h = dimen[objects.keys()[0]]
minx = x
miny = y
maxx = x + w
maxy = y + h
- for id, node in self.selected.iteritems():
+ for id, node in objects.iteritems():
# get the bounding box
x,y,w,h = dimen[id]
if x < minx:
@@ -103,7 +142,7 @@ class Restack(inkex.Effect):
midy = (miny + maxy) / 2
#calculate distances for each selected object
- for id, node in self.selected.iteritems():
+ for id, node in objects.iteritems():
# get the bounding box
x,y,w,h = dimen[id]
@@ -144,7 +183,29 @@ class Restack(inkex.Effect):
objlist.sort()
#move them to the top of the object stack in this order.
for item in objlist:
- parentnode.append( self.selected[item[1]])
+ parentnode.append( objects[item[1]])
+
+ def restack_z_order(self):
+ parentnode = None
+ objects = []
+ if len(self.selected) == 1:
+ firstobject = self.selected[self.options.ids[0]]
+ if firstobject.tag == inkex.addNS('g', 'svg'):
+ parentnode = firstobject
+ for child in parentnode.iterchildren(reversed=False):
+ objects.append(child)
+ else:
+ parentnode = self.current_layer
+ for id_ in zSort(self.document.getroot(), self.selected.keys()):
+ objects.append(self.selected[id_])
+ if self.options.zsort == "rev":
+ objects.reverse()
+ elif self.options.zsort == "rand":
+ random.shuffle(objects)
+ if parentnode is not None:
+ for item in objects:
+ parentnode.append(item)
+
if __name__ == '__main__':
e = Restack()