diff options
| author | su_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 |
| commit | 9fa924d089746158ea4721a4a0e2dcab08f92121 (patch) | |
| tree | 27cb4d567af5a3c33ada0832e221008216c3d88f | |
| parent | Extensions. Fix for bug #1506043 (PDF import options always default to Popple... (diff) | |
| download | inkscape-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.in | 3 | ||||
| -rw-r--r-- | share/extensions/restack.inx | 62 | ||||
| -rwxr-xr-x | 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 @@ <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() |
