summaryrefslogtreecommitdiffstats
path: root/share/extensions/perspective.py
diff options
context:
space:
mode:
Diffstat (limited to 'share/extensions/perspective.py')
-rwxr-xr-xshare/extensions/perspective.py164
1 files changed, 0 insertions, 164 deletions
diff --git a/share/extensions/perspective.py b/share/extensions/perspective.py
deleted file mode 100755
index f7d5be606..000000000
--- a/share/extensions/perspective.py
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env python
-"""
-Copyright (C) 2005 Aaron Spike, aaron@ekips.org
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-Perspective approach & math by Dmitry Platonov, shadowjack@mail.ru, 2006
-"""
-# standard library
-import sys
-import os
-import re
-try:
- from subprocess import Popen, PIPE
- bsubprocess = True
-except:
- bsubprocess = False
-# local library
-import inkex
-import simplepath
-import cubicsuperpath
-import simpletransform
-from ffgeom import *
-
-# third party
-try:
- from numpy import *
- from numpy.linalg import *
-except:
- # Initialize gettext for messages outside an inkex derived class
- inkex.localize()
- inkex.errormsg(_("Failed to import the numpy or numpy.linalg modules. These modules are required by this extension. Please install them and try again. On a Debian-like system this can be done with the command, sudo apt-get install python-numpy."))
- exit()
-
-class Project(inkex.Effect):
- def __init__(self):
- inkex.Effect.__init__(self)
- def effect(self):
- if len(self.options.ids) < 2:
- inkex.errormsg(_("This extension requires two selected paths."))
- exit()
-
- #obj is selected second
- scale = self.unittouu('1px') # convert to document units
- doc = self.document.getroot()
- h = self.unittouu(doc.xpath('@height', namespaces=inkex.NSS)[0])
- # process viewBox height attribute to correct page scaling
- viewBox = doc.get('viewBox')
- if viewBox:
- viewBox2 = viewBox.split(',')
- if len(viewBox2) < 4:
- viewBox2 = viewBox.split(' ')
- scale *= self.unittouu(self.addDocumentUnit(viewBox2[3])) / h
- obj = self.selected[self.options.ids[0]]
- envelope = self.selected[self.options.ids[1]]
- if obj.get(inkex.addNS('type','sodipodi')):
- inkex.errormsg(_("The first selected object is of type '%s'.\nTry using the procedure Path->Object to Path." % obj.get(inkex.addNS('type','sodipodi'))))
- exit()
- if obj.tag == inkex.addNS('path','svg') or obj.tag == inkex.addNS('g','svg'):
- if envelope.tag == inkex.addNS('path','svg'):
- mat = simpletransform.composeParents(envelope, [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]])
- path = cubicsuperpath.parsePath(envelope.get('d'))
- if len(path) < 1 or len(path[0]) < 4:
- inkex.errormsg(_("This extension requires that the second selected path be four nodes long."))
- exit()
- simpletransform.applyTransformToPath(mat, path)
- dp = zeros((4,2), dtype=float64)
- for i in range(4):
- dp[i][0] = path[0][i][1][0]
- dp[i][1] = path[0][i][1][1]
-
- #query inkscape about the bounding box of obj
- q = {'x':0,'y':0,'width':0,'height':0}
- file = self.args[-1]
- id = self.options.ids[0]
- for query in q.keys():
- if bsubprocess:
- p = Popen('inkscape --query-%s --query-id=%s "%s"' % (query,id,file), shell=True, stdout=PIPE, stderr=PIPE)
- rc = p.wait()
- q[query] = scale*float(p.stdout.read())
- err = p.stderr.read()
- else:
- f,err = os.popen3('inkscape --query-%s --query-id=%s "%s"' % (query,id,file))[1:]
- q[query] = scale*float(f.read())
- f.close()
- err.close()
- sp = array([[q['x'], q['y']+q['height']],[q['x'], q['y']],[q['x']+q['width'], q['y']],[q['x']+q['width'], q['y']+q['height']]], dtype=float64)
- else:
- if envelope.tag == inkex.addNS('g','svg'):
- inkex.errormsg(_("The second selected object is a group, not a path.\nTry using the procedure Object->Ungroup."))
- else:
- inkex.errormsg(_("The second selected object is not a path.\nTry using the procedure Path->Object to Path."))
- exit()
- else:
- inkex.errormsg(_("The first selected object is not a path.\nTry using the procedure Path->Object to Path."))
- exit()
-
- solmatrix = zeros((8,8), dtype=float64)
- free_term = zeros((8), dtype=float64)
- for i in (0,1,2,3):
- solmatrix[i][0] = sp[i][0]
- solmatrix[i][1] = sp[i][1]
- solmatrix[i][2] = 1
- solmatrix[i][6] = -dp[i][0]*sp[i][0]
- solmatrix[i][7] = -dp[i][0]*sp[i][1]
- solmatrix[i+4][3] = sp[i][0]
- solmatrix[i+4][4] = sp[i][1]
- solmatrix[i+4][5] = 1
- solmatrix[i+4][6] = -dp[i][1]*sp[i][0]
- solmatrix[i+4][7] = -dp[i][1]*sp[i][1]
- free_term[i] = dp[i][0]
- free_term[i+4] = dp[i][1]
-
- res = solve(solmatrix, free_term)
- projmatrix = array([[res[0],res[1],res[2]],[res[3],res[4],res[5]],[res[6],res[7],1.0]],dtype=float64)
- if obj.tag == inkex.addNS("path",'svg'):
- self.process_path(obj,projmatrix)
- if obj.tag == inkex.addNS("g",'svg'):
- self.process_group(obj,projmatrix)
-
- def process_group(self,group,m):
- for node in group:
- if node.tag == inkex.addNS('path','svg'):
- self.process_path(node,m)
- if node.tag == inkex.addNS('g','svg'):
- self.process_group(node,m)
-
- def process_path(self,path,m):
- mat = simpletransform.composeParents(path, [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]])
- d = path.get('d')
- p = cubicsuperpath.parsePath(d)
- simpletransform.applyTransformToPath(mat, p)
- for subs in p:
- for csp in subs:
- csp[0] = self.project_point(csp[0],m)
- csp[1] = self.project_point(csp[1],m)
- csp[2] = self.project_point(csp[2],m)
- mat = simpletransform.invertTransform(mat)
- simpletransform.applyTransformToPath(mat, p)
- path.set('d',cubicsuperpath.formatPath(p))
-
- def project_point(self,p,m):
- x = p[0]
- y = p[1]
- return [(x*m[0][0] + y*m[0][1] + m[0][2])/(x*m[2][0]+y*m[2][1]+m[2][2]),(x*m[1][0] + y*m[1][1] + m[1][2])/(x*m[2][0]+y*m[2][1]+m[2][2])]
-
-if __name__ == '__main__':
- e = Project()
- e.affect()
-
-
-# vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99