From 83dce82604dd22b8b525c5624738167269808dc6 Mon Sep 17 00:00:00 2001 From: Mario Voigt Date: Sat, 1 Aug 2020 02:32:02 +0200 Subject: [PATCH] Added "Set View Box" extension --- extensions/fablabchemnitz_viewbox.inx | 16 +++++++ extensions/fablabchemnitz_viewbox.py | 68 +++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 extensions/fablabchemnitz_viewbox.inx create mode 100644 extensions/fablabchemnitz_viewbox.py diff --git a/extensions/fablabchemnitz_viewbox.inx b/extensions/fablabchemnitz_viewbox.inx new file mode 100644 index 00000000..b37c5d6e --- /dev/null +++ b/extensions/fablabchemnitz_viewbox.inx @@ -0,0 +1,16 @@ + + +<_name>Set View Box +fablabchemnitz.de.setviewbox + + rect + + + + + + + + \ No newline at end of file diff --git a/extensions/fablabchemnitz_viewbox.py b/extensions/fablabchemnitz_viewbox.py new file mode 100644 index 00000000..9e98fdd6 --- /dev/null +++ b/extensions/fablabchemnitz_viewbox.py @@ -0,0 +1,68 @@ +# Copyright (c) 2012 Stuart Pernsteiner +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import sys +import inkex +from inkex import Transform +import gettext +_ = gettext.gettext + +class SetViewBoxEffect(inkex.Effect): + def __init__(self): + inkex.Effect.__init__(self) + + def effect(self): + if len(self.svg.selected) != 1: + sys.exit(_("Error: You must select exactly one rectangle")) + + sel = None + for pathId in self.svg.selected: + sel = self.svg.selected[pathId] + + mat = [[1,0,0],[0,1,0]] + cur = sel + while cur is not None: + curMat = Transform(cur.get('transform')) + mat = Transform(curMat) * Transform(mat) + cur = cur.getparent() + + [x,y,w,h] = map(lambda attr: float(sel.get(attr)), + ['x','y','width','height']) + + (x1,y1) = transformPoint(mat, (x,y)) + (x2,y2) = transformPoint(mat, (x+w,y+h)) + + ww = x2-x1 + hh = y2-y1 + + root = self.svg.getElement('//svg:svg'); + root.set('viewBox', '%f %f %f %f' % (x1,y1,ww,hh)) + root.set('width', str(ww)) + root.set('height', str(hh)) + +def transformPoint(mat, pt): + pt2 = [pt[0], pt[1]] + Transform(mat).apply_to_point(pt2) + return (pt2[0], pt2[1]) + +SetViewBoxEffect().run() \ No newline at end of file