Added "Set View Box" extension
This commit is contained in:
parent
1279cd2ddb
commit
83dce82604
16
extensions/fablabchemnitz_viewbox.inx
Normal file
16
extensions/fablabchemnitz_viewbox.inx
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
|
||||||
|
<_name>Set View Box</_name>
|
||||||
|
<id>fablabchemnitz.de.setviewbox</id>
|
||||||
|
<effect>
|
||||||
|
<object-type>rect</object-type>
|
||||||
|
<effects-menu>
|
||||||
|
<submenu _name="FabLab Chemnitz">
|
||||||
|
<submenu _name="Various" />
|
||||||
|
</submenu>
|
||||||
|
</effects-menu>
|
||||||
|
</effect>
|
||||||
|
<script>
|
||||||
|
<command reldir="extensions" interpreter="python">fablabchemnitz_viewbox.py</command>
|
||||||
|
</script>
|
||||||
|
</inkscape-extension>
|
68
extensions/fablabchemnitz_viewbox.py
Normal file
68
extensions/fablabchemnitz_viewbox.py
Normal file
@ -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()
|
Reference in New Issue
Block a user