From 9fa924d089746158ea4721a4a0e2dcab08f92121 Mon Sep 17 00:00:00 2001 From: su_v Date: Tue, 20 Oct 2015 13:49:11 +0200 Subject: Extensions. Restack - add options to reverse, shuffle Z-order of selection (bug #1498583) Fixed bugs: - https://launchpad.net/bugs/1498583 (bzr r14424) --- po/POTFILES.in | 3 +- share/extensions/restack.inx | 62 ++++++++++++++++++++++++----------- share/extensions/restack.py | 77 +++++++++++++++++++++++++++++++++++++++----- 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 @@ org.inkscape.filter.restack restack.py inkex.py - - <_item value="lr">Left to Right (0) - <_item value="bt">Bottom to Top (90) - <_item value="rl">Right to Left (180) - <_item value="tb">Top to Bottom (270) - <_item value="ro">Radial Outward - <_item value="ri">Radial Inward - <_item value="aa">Arbitrary Angle - - 0.00 - - <_item value="l">Left - <_item value="m">Middle - <_item value="r">Right - - - <_item value="t">Top - <_item value="m">Middle - <_item value="b">Bottom + + + <_param name="desc_dir" type="description" appearance="header">Restack Direction + + + + <_item value="lr">Left to Right (0) + <_item value="bt">Bottom to Top (90) + <_item value="rl">Right to Left (180) + <_item value="tb">Top to Bottom (270) + <_item value="ro">Radial Outward + <_item value="ri">Radial Inward + + + + 0.00 + + + <_param name="desc_ref" type="description" appearance="header">Object Reference Point + + <_item value="l">Left + <_item value="m">Middle + <_item value="r">Right + + + <_item value="t">Top + <_item value="m">Middle + <_item value="b">Bottom + + + + <_param name="desc_zsort" type="description" appearance="header">Restack Mode + + <_item value="rev">Reverse Z-Order + <_item value="rand">Shuffle Z-Order + + + + <_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). + path 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() -- cgit v1.2.3