Revision: 18787 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18787 Author: migius Date: 2009-02-02 01:31:46 +0100 (Mon, 02 Feb 2009)
Log Message: ----------- patch for paths_svg2obj.py by author jms: This patch solves some major problems of the svg script : - reading of the inkscape svg format - parsing of the scientific numbers - redundant arc data in the same path for only one command "a" - blending of curves after several files import and at the end a more correct management of the current point. Modified Paths: -------------- trunk/blender/release/scripts/bpymodules/paths_svg2obj.py Modified: trunk/blender/release/scripts/bpymodules/paths_svg2obj.py =================================================================== --- trunk/blender/release/scripts/bpymodules/paths_svg2obj.py 2009-02-01 19:53:24 UTC (rev 18786) +++ trunk/blender/release/scripts/bpymodules/paths_svg2obj.py 2009-02-02 00:31:46 UTC (rev 18787) @@ -1,7 +1,7 @@ # -*- coding: latin-1 -*- """ -SVG 2 OBJ translater, 0.5.9h -Copyright (c) jm soler juillet/novembre 2004-april 2007, +SVG 2 OBJ translater, 0.5.9n +Copyright (c) jm soler juillet/novembre 2004-february 2009, # --------------------------------------------------------------- released under GNU Licence for the Blender 2.42 Python Scripts Bundle. @@ -20,7 +20,6 @@ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, \xC9tats-Unis. - 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 @@ -35,7 +34,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # --------------------------------------------------------------- - +# #--------------------------------------------------------------------------- # Page officielle : # http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_import_svg.htm @@ -253,15 +252,27 @@ 0.5.9h : - 2007/5/2 - script was updated with the modifs by cambo - - removed all debug statements + - removed all debug statements - correction of a zero division error in the calc_arc function. + 0.5.9f: - 2007/15/7 + - Correction de plusieurs bugs sur l'attributions des couleurs et le nommage + des courbes + + 0.5.9i : - ??/??/?? + - Patch externe r\xE9alis\xE9 sur blender.org project. + + 0.5.9j : - 08/11/2008 + 0.5.9k : - 14/01/2009 + 0.5.9l : - 31/01/2009 + 0.5.9n : - 01/02/2009 + ================================================================================== ==================================================================================""" SHARP_IMPORT=0 SCALE=1 scale_=1 -DEBUG = 0#print +DEBUG = 0 DEVELOPPEMENT=0 TESTCOLOR=0 @@ -533,7 +544,7 @@ scene.objects.selected = [] if not SEPARATE_CURVES: - c = Curve.New() + c = Curve.New() c.setResolu(24) MATNAME=[] @@ -709,7 +720,6 @@ else : cx =float(prp['cx']) if 'cy' not in prp: cy=0.0 else : cy =float(prp['cy']) - #print prp.keys() r = float(prp['r']) D=['M',str(cx),str(cy+r), 'C',str(cx-r), str(cy+r*0.552),str(cx-0.552*r),str(cy+r), str(cx),str(cy+r), @@ -852,7 +862,7 @@ #-------------------- # 0.3.9 #-------------------- -def curve_to_a(c,D,n0,CP): #A,a +def curve_to_a(curves, c,D,n0,CP): #A,a global SCALE l=[float(D[c[1]+1]),float(D[c[1]+2]),float(D[c[1]+3]), int(D[c[1]+4]),int(D[c[1]+5]),float(D[c[1]+6]),float(D[c[1]+7])] @@ -866,8 +876,7 @@ POINTS= calc_arc (CP[0],CP[1], l[0], l[1], l[2]*(PI / 180.0), l[3], l[4], - l[5], l[6] ) - #if DEBUG == 1 : print POINTS + l[5], l[6] ) for p in POINTS : B=Bez() B.co=[ p[2][0],p[2][1], p[0][0],p[0][1], p[1][0],p[1][1]] @@ -881,16 +890,23 @@ BP.co[2]=BP.co[0] BP.co[3]=BP.co[1] CP=[l[5], l[6]] + #---------- 059m------------ + if len(D)>c[1]+7 and D[c[1]+8] not in TAGcourbe : + c[1]+=7 + curves,n0,CP=curve_to_a(curves, c, D, n0,CP) + #---------- 059m------------ return curves,n0,CP -def move_to(c, D, n0,CP, proprietes): +def move_to(curves, c, D, n0,CP, proprietes): global DEBUG,TAGcourbe, LAST_ID global USE_COLORS l=[float(D[c[1]+1]),float(D[c[1]+2])] + if c[0]=='m': l=[l[0]+CP[0], l[1] + CP[1]] + if n0 in curves.ITEM: n0+=1 CP=[l[0],l[1]] @@ -917,14 +933,12 @@ B.co=[CP[0],CP[1],CP[0],CP[1],CP[0],CP[1]] B.ha=['L','C'] B.tag=c[0] - curves.ITEM[n0].beziers_knot.append(B) - #if DEBUG==1: print curves.ITEM[n0], CP + curves.ITEM[n0].beziers_knot.append(B) return curves,n0,CP -def close_z(c,D,n0,CP): #Z,z +def close_z(curves, c,D,n0,CP): #Z,z curves.ITEM[n0].flagUV[0]=1 if len(curves.ITEM[n0].beziers_knot)>1: - #print len(curves.ITEM[n0].beziers_knot) BP=curves.ITEM[n0].beziers_knot[-1] BP0=curves.ITEM[n0].beziers_knot[0] if BP.tag in ['c','C','s','S',]: @@ -936,7 +950,7 @@ n0-=1 return curves,n0,CP -def curve_to_q(c,D,n0,CP): #Q,q +def curve_to_q(curves, c,D,n0,CP): #Q,q l=[float(D[c[1]+1]),float(D[c[1]+2]),float(D[c[1]+3]),float(D[c[1]+4])] if c[0]=='q': l=[l[0]+CP[0], l[1]+CP[1], l[2]+CP[0], l[3]+CP[1]] @@ -948,15 +962,14 @@ BP.co[2]=BP.co[0] BP.co[3]=BP.co[1] curves.ITEM[n0].beziers_knot.append(B) - #if DEBUG==1: print B.co,BP.co CP=[l[2],l[3]] #if DEBUG==1: pass if len(D)>c[1]+5 and D[c[1]+5] not in TAGcourbe : c[1]+=4 - curve_to_q(c, D, n0,CP) + curves,n0,CP=curve_to_q(curves, c, D, n0,CP) return curves,n0,CP -def curve_to_t(c,D,n0,CP): #T,t +def curve_to_t(curves, c,D,n0,CP): #T,t l=[float(D[c[1]+1]),float(D[c[1]+2])] if c[0]=='t': l=[l[0]+CP[0], l[1]+CP[1]] @@ -970,11 +983,10 @@ BP.co[2]=l0[2] BP.co[3]=l0[3] curves.ITEM[n0].beziers_knot.append(B) - #if DEBUG==1: print B.co,BP.co CP=[l[0],l[1]] if len(D)>c[1]+3 and D[c[1]+3] not in TAGcourbe : c[1]+=4 - curve_to_t(c, D, n0,CP) + curves,n0,CP=curve_to_t(curves, c, D, n0,CP) return curves,n0,CP #-------------------- @@ -985,7 +997,7 @@ Y=l[3]-(l[1]-l[3]) return X,Y -def curve_to_s(c,D,n0,CP): #S,s +def curve_to_s(curves, c,D,n0,CP): #S,s l=[float(D[c[1]+1]), float(D[c[1]+2]), float(D[c[1]+3]), @@ -1003,17 +1015,16 @@ #-------------------- BP.co[2],BP.co[3]=build_SYMETRIC([BP.co[4],BP.co[5],BP.co[0],BP.co[1]]) curves.ITEM[n0].beziers_knot.append(B) - #if DEBUG==1: print B.co,BP.co #-------------------- # 0.4.3 #-------------------- CP=[l[2],l[3]] if len(D)>c[1]+5 and D[c[1]+5] not in TAGcourbe : c[1]+=4 - curve_to_c(c, D, n0,CP) + curves,n0,CP=curve_to_c(curves, c, D, n0,CP) return curves,n0,CP -def curve_to_c(c, D, n0,CP): #c,C +def curve_to_c(curves, c, D, n0,CP): #c,C l=[float(D[c[1]+1]),float(D[c[1]+2]),float(D[c[1]+3]), float(D[c[1]+4]),float(D[c[1]+5]),float(D[c[1]+6])] if c[0]=='c': @@ -1030,6 +1041,8 @@ l[5], l[2], l[3]] #plus toucher au 2-3 + + B.ha=['C','C'] B.tag=c[0] BP=curves.ITEM[n0].beziers_knot[-1] @@ -1037,32 +1050,38 @@ BP.co[3]=l[1] BP.ha[1]='C' curves.ITEM[n0].beziers_knot.append(B) - #if DEBUG==1: print B.co,BP.co CP=[l[4],l[5]] if len(D)>c[1]+7 and D[c[1]+7] not in TAGcourbe : - c[1]+=6 - curve_to_c(c, D, n0,CP) + c[1]+=6 + curves,n0,CP=curve_to_c(curves, c, D, n0,CP) return curves,n0,CP -def draw_line_l(c, D, n0,CP): #L,l - l=[float(D[c[1]+1]),float(D[c[1]+2])] +def draw_line_l(curves, c, D, n0,CP): #L,l + + l=[float(D[c[1]+1]),float(D[c[1]+2])] if c[0]=='l': l=[l[0]+CP[0], - l[1]+CP[1]] + l[1]+CP[1]] B=Bez() - B.co=[l[0],l[1],l[0],l[1],l[0],l[1]] + B.co=[l[0],l[1], + l[0],l[1], + l[0],l[1]] + B.ha=['L','L'] B.tag=c[0] BP=curves.ITEM[n0].beziers_knot[-1] BP.ha[1]='L' + curves.ITEM[n0].beziers_knot.append(B) - CP=[B.co[0],B.co[1]] + CP=[B.co[4],B.co[5]] + if len(D)>c[1]+3 and D[c[1]+3] not in TAGcourbe : c[1]+=2 - draw_line_l(c, D, n0,CP) #L + curves,n0,CP=draw_line_l(curves, c, D, n0,CP) #L + return curves,n0,CP -def draw_line_h(c,D,n0,CP): #H,h +def draw_line_h(curves, c,D,n0,CP): #H,h if c[0]=='h': l=[float(D[c[1]+1])+float(CP[0]),CP[1]] else: @@ -1077,7 +1096,7 @@ CP=[l[0],l[1]] return curves,n0,CP -def draw_line_v(c,D,n0,CP): #V, v +def draw_line_v(curves, c,D,n0,CP): #V, v if c[0]=='v': l=[CP[0], float(D[c[1]+1])+CP[1]] else: @@ -1121,17 +1140,31 @@ tagTRANSFORM=0 def wash_DATA(ndata): - if ndata: - #if DEBUG==1: print ndata + if ndata: ndata = ndata.strip() + if ndata[0]==',':ndata=ndata[1:] if ndata[-1]==',':ndata=ndata[:-1] + #-------------------- # 0.4.0 : 'e' #-------------------- - i = ndata.find('-') - if i != -1 and ndata[i-1] not in ' ,e': - ndata=ndata.replace('-',',-') + ni=0 + i = ndata.find('-',ni) + if i != -1: + while i>-1 : + i = ndata.find('-',ni) + # 059l ------ + if i>0 : + if ndata[i-1] not in [' ',',','e']: + ndata=ndata[:i]+','+ndata[i:] + ni=i+2 + else: + ni=i+1 + elif i>-1: + ni=1 + # 059l ------ + ndata=ndata.replace(',,',',') ndata=ndata.replace(' ',',') ndata=ndata.split(',') @@ -1153,7 +1186,7 @@ # borner les differents segments qui devront etre # traites # pour cela construire une liste avec chaque - # la position de chaqe emplacement tag de type + # position de chaque emplacement tag de type # commande path... # ---------------------------------------- tagplace=[] @@ -1169,8 +1202,10 @@ # d'apparition des tags #------------------------------------------ tagplace.sort() + + tpn=range(len(tagplace)) - tpn=range(len(tagplace)) + #-------------------- # 0.3.5 :: short data, only one tag #-------------------- @@ -1179,14 +1214,18 @@ for t in tpn[:-1]: DATA2.append(DATA[tagplace[t]:tagplace[t]+1]) ndata=DATA[tagplace[t]+1:tagplace[t+1]] + if DATA2[-1] not in ['z','Z'] : ndata=wash_DATA(ndata) DATA2.extend(ndata) + DATA2.append(DATA[tagplace[t+1]:tagplace[t+1]+1]) + if DATA2[-1] not in ['z','Z'] and len(DATA)-1>=tagplace[t+1]+1: ndata=DATA[tagplace[t+1]+1:] ndata=wash_DATA(ndata) DATA2.extend(ndata) #059a + else: #-------------------- # 0.3.5 : short data,only one tag @@ -1276,15 +1315,13 @@ nt0=txt[t0:t1+1] t2=nt0[nt0.find('(')+1:-1] val=nt0[:nt0.find('(')] + while t2.find(' ')!=-1: t2=t2.replace(' ',' ') + while t2.find(', ')!=-1: #059l + t2=t2.replace(', ',',') #059l + t2=t2.replace(' ',',') - - """ - t2=t2.split(',') - for index, t in enumerate(t2): - t2[index]=float(t) - """ t2=[float(t) for t in t2.split(',')] if val=='rotate' : @@ -1314,12 +1351,24 @@ i= i+6 Courbe[n].color=[int(pr[i:i+2],16),int(pr[i+2:i+4],16),int(pr[i+4:i+6],16)] @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs