# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: cr33dog@gmail.com-20100701203327-fi2oufezjnof06ue # target_branch: http://bazaar.launchpad.net/~inkscape.dev/inkscape\ # /trunk/ # testament_sha1: 006ec1575690391b4076507fb96882dac7aa6cf6 # timestamp: 2010-07-01 15:33:46 -0500 # base_revision_id: nicoduf@yahoo.fr-20100701042521-3ycptqh71o752px1 # # Begin patch === modified file 'share/extensions/addnodes.py' --- share/extensions/addnodes.py 2008-05-23 07:05:15 +0000 +++ share/extensions/addnodes.py 2010-06-30 22:54:47 +0000 @@ -89,7 +89,7 @@ #inkex.debug("average segment length: %s" % avg) new = [] - for sub in p: + for sub in p.csp: new.append([sub[0][:]]) i = 1 while i <= len(sub)-1: @@ -106,7 +106,7 @@ new[-1].append(sub[i]) i+=1 - node.set('d',cubicsuperpath.formatPath(new)) + node.set('d',cubicsuperpath.formatPath(new, p.closed)) if __name__ == '__main__': e = SplitIt() === modified file 'share/extensions/cubicsuperpath.py' --- share/extensions/cubicsuperpath.py 2010-04-11 19:22:02 +0000 +++ share/extensions/cubicsuperpath.py 2010-07-01 20:33:27 +0000 @@ -96,74 +96,88 @@ applymat(mat, pts[1]) applymat(mat, pts[2]) return(p) - -def CubicSuperPath(simplepath): - csp = [] - subpath = -1 - subpathstart = [] - last = [] - lastctrl = [] - for s in simplepath: - cmd, params = s - if cmd == 'M': - if last: - csp[subpath].append([lastctrl[:],last[:],last[:]]) - subpath += 1 - csp.append([]) - subpathstart = params[:] - last = params[:] - lastctrl = params[:] - elif cmd == 'L': - csp[subpath].append([lastctrl[:],last[:],last[:]]) - last = params[:] - lastctrl = params[:] - elif cmd == 'C': - csp[subpath].append([lastctrl[:],last[:],params[:2]]) - last = params[-2:] - lastctrl = params[2:4] - elif cmd == 'Q': - q0=last[:] - q1=params[0:2] - q2=params[2:4] - x0= q0[0] - x1=1./3*q0[0]+2./3*q1[0] - x2= 2./3*q1[0]+1./3*q2[0] - x3= q2[0] - y0= q0[1] - y1=1./3*q0[1]+2./3*q1[1] - y2= 2./3*q1[1]+1./3*q2[1] - y3= q2[1] - csp[subpath].append([lastctrl[:],[x0,y0],[x1,y1]]) - last = [x3,y3] - lastctrl = [x2,y2] - elif cmd == 'A': - arcp=ArcToPath(last[:],params[:]) - arcp[ 0][0]=lastctrl[:] - last=arcp[-1][1] - lastctrl = arcp[-1][0] - csp[subpath]+=arcp[:-1] - elif cmd == 'Z': - csp[subpath].append([lastctrl[:],last[:],last[:]]) - last = subpathstart[:] - lastctrl = subpathstart[:] - #append final superpoint - csp[subpath].append([lastctrl[:],last[:],last[:]]) - return csp - -def unCubicSuperPath(csp): + +class CubicSuperPath: + def __init__(self, simplepath): + csp = [] + self.closed = False + subpath = -1 + subpathstart = [] + last = [] + lastctrl = [] + for s in simplepath: + cmd, params = s + if cmd == 'M': + if last: + csp[subpath].append([lastctrl[:],last[:],last[:]]) + subpath += 1 + csp.append([]) + subpathstart = params[:] + last = params[:] + lastctrl = params[:] + elif cmd == 'L': + csp[subpath].append([lastctrl[:],last[:],last[:]]) + last = params[:] + lastctrl = params[:] + elif cmd == 'C': + csp[subpath].append([lastctrl[:],last[:],params[:2]]) + last = params[-2:] + lastctrl = params[2:4] + elif cmd == 'Q': + q0=last[:] + q1=params[0:2] + q2=params[2:4] + x0= q0[0] + x1=1./3*q0[0]+2./3*q1[0] + x2= 2./3*q1[0]+1./3*q2[0] + x3= q2[0] + y0= q0[1] + y1=1./3*q0[1]+2./3*q1[1] + y2= 2./3*q1[1]+1./3*q2[1] + y3= q2[1] + csp[subpath].append([lastctrl[:],[x0,y0],[x1,y1]]) + last = [x3,y3] + lastctrl = [x2,y2] + elif cmd == 'A': + arcp=ArcToPath(last[:],params[:]) + arcp[ 0][0]=lastctrl[:] + last=arcp[-1][1] + lastctrl = arcp[-1][0] + csp[subpath]+=arcp[:-1] + elif cmd == 'Z': + self.closed = True + csp[subpath].append([lastctrl[:],last[:],last[:]]) + last = subpathstart[:] + lastctrl = subpathstart[:] + #append final superpoint + csp[subpath].append([lastctrl[:],last[:],last[:]]) + self.csp = csp + +def unCubicSuperPath(csp, closed=False): a = [] + sp = [] for subpath in csp: if subpath: a.append(['M',subpath[0][1][:]]) + sp.append(len(a)-1) for i in range(1,len(subpath)): a.append(['C',subpath[i-1][2][:] + subpath[i][0][:] + subpath[i][1][:]]) + if closed: + for i in sp: + while True: + # remove extra node(s) from closed subpath + if a[i][1][0:2] == a[-1][1][2:4]: + a.pop() + else: break + # add closing 'Z' + a.append(['Z','']) return a def parsePath(d): return CubicSuperPath(simplepath.parsePath(d)) -def formatPath(p): - return simplepath.formatPath(unCubicSuperPath(p)) +def formatPath(p, closed=False): + return simplepath.formatPath(unCubicSuperPath(p, closed)) # vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 encoding=utf-8 textwidth=99 === modified file 'share/extensions/simplepath.py' --- share/extensions/simplepath.py 2009-02-08 11:12:51 +0000 +++ share/extensions/simplepath.py 2010-06-30 22:54:47 +0000 @@ -165,7 +165,7 @@ def formatPath(a): """Format SVG path data from an array""" - return "".join([cmd + " ".join([str(p) for p in params]) for cmd, params in a]) + return " ".join([cmd + " " + " ".join([str(p) for p in params]) for cmd, params in a]) def translatePath(p, x, y): for cmd,params in p: # Begin bundle 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