#!/usr/bin/env python ''' zigzag.py Sunabe kazumichi 2009/9/29 http://dp48069596.lolipop.jp/ 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA this program shifts the nodes zigzags. ''' import random, math, inkex, cubicsuperpath def pointdistance((x1,y1),(x2,y2)): dist=math.sqrt(((x2 - x1) ** 2) + ((y2 - y1) ** 2)) if dist==0: dx=0 dy=0 else: dx=(x2 - x1)/dist dy=(y2 - y1)/dist return dx,dy def randomize((x,y), r): if y==0: a=math.pi elif x==0 and y<>0: a=math.pi/2 else: a = math.atan2(y,x) x = math.cos(a-math.pi/2)*r y = math.sin(a-math.pi/2)*r return [x, y] class RadiusRandomize(inkex.Effect): def __init__(self): inkex.Effect.__init__(self) self.OptionParser.add_option("--title") self.OptionParser.add_option("-r", "--radius", action="store", type="float", dest="radius", default=10.0, help="Randomly move control and end points in this radius") self.OptionParser.add_option("-e", "--end", action="store", type="inkbool", dest="end", default=True, help="Randomize nodes") def effect(self): for id, node in self.selected.iteritems(): if node.tag == inkex.addNS('path','svg'): d = node.get('d') p = cubicsuperpath.parsePath(d) for subpath in p: for i, csp in enumerate(subpath): if self.options.end: if i % 2 <> 0: dx,dy=pointdistance(csp[0],csp[1]) delta=randomize( (dx, dy),self.options.radius) csp[0][0]+=delta[0] csp[0][1]+=delta[1] csp[1][0]+=delta[0] csp[1][1]+=delta[1] csp[2][0]+=delta[0] csp[2][1]+=delta[1] else: dx,dy=pointdistance(csp[0],csp[1]) delta=randomize( (dx, dy),self.options.radius) csp[0][0]-=delta[0] csp[0][1]-=delta[1] csp[1][0]-=delta[0] csp[1][1]-=delta[1] csp[2][0]-=delta[0] csp[2][1]-=delta[1] node.set('d',cubicsuperpath.formatPath(p)) e = RadiusRandomize() e.affect()