Update to svg import from JMS

0.5.9d : - 2007/4/5
              -  when a svg file containts several curves they can be imported in
                 separate object.
              -  managment of paths' name when paths are imported as separate curves.
              -  a menu was added to select between separate or joined curves
              -  management of colors

     0.5.9e : - 2007/4/7
              - corrected a scale problem that only appears when one uses beveldepth
              - in separate curve option, name is also given to the curve data
              - added the list of svg's color names (147) and modified the color's method
                to work with.

     0.5.9h : - 2007/5/2
              - script was updated with the modifs by cambo
              - removed all debug statements
              - correction of a zero division error in the calc_arc function.
This commit is contained in:
Campbell Barton 2007-05-03 00:06:07 +00:00
parent b0852bee2c
commit 98d797f156

@ -1,7 +1,7 @@
# -*- coding: latin-1 -*- # -*- coding: latin-1 -*-
""" """
SVG 2 OBJ translater, 0.5.9b SVG 2 OBJ translater, 0.5.9h
Copyright (c) jm soler juillet/novembre 2004-mars 2007, Copyright (c) jm soler juillet/novembre 2004-april 2007,
# --------------------------------------------------------------- # ---------------------------------------------------------------
released under GNU Licence released under GNU Licence
for the Blender 2.42 Python Scripts Bundle. for the Blender 2.42 Python Scripts Bundle.
@ -232,10 +232,29 @@ Changelog:
by the Adobe Illustrator's SVG. After a lot of tests it seems that this oldest by the Adobe Illustrator's SVG. After a lot of tests it seems that this oldest
version is also faster too . version is also faster too .
- correction (bad) on handle management with V and H commands. - correction (bad) on handle management with V and H commands.
0.5.9b : - 2007/3/31 0.5.9b : - 2007/3/31
- one or two minor corrections : - one or two minor corrections
now the new object curve is added in the current layer. - now the new object curve is added in the current layer.
short modif in the scale menu... - short modif in the scale menu...
0.5.9d : - 2007/4/5
- when a svg file containts several curves they can be imported in
separate object.
- managment of paths' name when paths are imported as separate curves.
- a menu was added to select between separate or joined curves
- management of colors
0.5.9e : - 2007/4/7
- corrected a scale problem that only appears when one uses beveldepth
- in separate curve option, name is also given to the curve data
- added the list of svg's color names (147) and modified the color's method
to work with.
0.5.9h : - 2007/5/2
- script was updated with the modifs by cambo
- removed all debug statements
- correction of a zero division error in the calc_arc function.
================================================================================== ==================================================================================
==================================================================================""" =================================================================================="""
@ -244,6 +263,88 @@ SCALE=1
scale_=1 scale_=1
DEBUG = 0#print DEBUG = 0#print
DEVELOPPEMENT=0 DEVELOPPEMENT=0
TESTCOLOR=0
LAST_ID=''
LAST_COLOR=[0.0,0.0,0.0,0.0]
SEPARATE_CURVES=0
USE_COLORS=0
SVGCOLORNAMELIST={ 'aliceblue':[240, 248, 255] ,'antiquewhite':[250, 235, 215]
,'aqua':[ 0, 255, 255], 'aquamarine':[127, 255, 212]
,'azure':[240, 255, 255], 'beige':[245, 245, 220]
,'bisque':[255, 228, 196], 'black':[ 0, 0, 0]
,'blanchedalmond':[255, 235, 205] ,'blue':[ 0, 0, 255]
,'blueviolet':[138, 43, 226],'brown':[165, 42, 42]
,'burlywood':[222, 184, 135],'cadetblue':[ 95, 158, 160]
,'chartreuse':[127, 255, 0] ,'chocolate':[210, 105, 30]
,'coral':[255, 127, 80],'cornflowerblue':[100, 149, 237]
,'cornsilk':[255, 248, 220],'crimson':[220, 20, 60]
,'cyan':[ 0, 255, 255],'darkblue':[ 0, 0, 139]
,'darkcyan':[ 0, 139, 139],'darkgoldenrod':[184, 134, 11]
,'darkgray':[169, 169, 169],'darkgreen':[ 0, 100, 0]
,'darkgrey':[169, 169, 169],'darkkhaki':[189, 183, 107]
,'darkmagenta':[139, 0, 139],'darkolivegreen':[ 85, 107, 47]
,'darkorange':[255, 140, 0],'darkorchid':[153, 50, 204]
,'darkred':[139, 0, 0],'darksalmon':[233, 150, 122]
,'darkseagreen':[143, 188, 143],'darkslateblue':[ 72, 61, 139]
,'darkslategray':[ 47, 79, 79],'darkslategrey':[ 47, 79, 79]
,'darkturquoise':[ 0, 206, 209],'darkviolet':[148, 0, 211]
,'deeppink':[255, 20, 147],'deepskyblue':[ 0, 191, 255]
,'dimgray':[105, 105, 105],'dimgrey':[105, 105, 105]
,'dodgerblue':[ 30, 144, 255],'firebrick':[178, 34, 34]
,'floralwhite':[255, 250, 240],'forestgreen':[ 34, 139, 34]
,'fuchsia':[255, 0, 255],'gainsboro':[220, 220, 220]
,'ghostwhite':[248, 248, 255],'gold':[255, 215, 0]
,'goldenrod':[218, 165, 32],'gray':[128, 128, 128]
,'grey':[128, 128, 128],'green':[ 0, 128, 0]
,'greenyellow':[173, 255, 47],'honeydew':[240, 255, 240]
,'hotpink':[255, 105, 180],'indianred':[205, 92, 92]
,'indigo':[ 75, 0, 130],'ivory':[255, 255, 240]
,'khaki':[240, 230, 140],'lavender':[230, 230, 250]
,'lavenderblush':[255, 240, 245],'lawngreen':[124, 252, 0]
,'lemonchiffon':[255, 250, 205],'lightblue':[173, 216, 230]
,'lightcoral':[240, 128, 128],'lightcyan':[224, 255, 255]
,'lightgoldenrodyellow':[250, 250, 210],'lightgray':[211, 211, 211]
,'lightgreen':[144, 238, 144],'lightgrey':[211, 211, 211]
,'lightpink':[255, 182, 193],'lightsalmon':[255, 160, 122]
,'lightseagreen':[ 32, 178, 170],'lightskyblue':[135, 206, 250]
,'lightslategray':[119, 136, 153],'lightslategrey':[119, 136, 153]
,'lightsteelblue':[176, 196, 222],'lightyellow':[255, 255, 224]
,'lime':[ 0, 255, 0],'limegreen':[ 50, 205, 50]
,'linen':[250, 240, 230],'magenta':[255, 0, 255]
,'maroon':[128, 0, 0],'mediumaquamarine':[102, 205, 170]
,'mediumblue':[ 0, 0, 205],'mediumorchid':[186, 85, 211]
,'mediumpurple':[147, 112, 219],'mediumseagreen':[ 60, 179, 113]
,'mediumslateblue':[123, 104, 238],'mediumspringgreen':[ 0, 250, 154]
,'mediumturquoise':[ 72, 209, 204],'mediumvioletred':[199, 21, 133]
,'midnightblue':[ 25, 25, 112],'mintcream':[245, 255, 250]
,'mistyrose':[255, 228, 225],'moccasin':[255, 228, 181]
,'navajowhite':[255, 222, 173],'navy':[ 0, 0, 128]
,'oldlace':[253, 245, 230],'olive':[128, 128, 0]
,'olivedrab':[107, 142, 35],'orange':[255, 165, 0]
,'orangered':[255, 69, 0],'orchid':[218, 112, 214]
,'palegoldenrod':[238, 232, 170],'palegreen':[152, 251, 152]
,'paleturquoise':[175, 238, 238],'palevioletred':[219, 112, 147]
,'papayawhip':[255, 239, 213],'peachpuff':[255, 218, 185]
,'peru':[205, 133, 63],'pink':[255, 192, 203]
,'plum':[221, 160, 221],'powderblue':[176, 224, 230]
,'purple':[128, 0, 128],'red':[255, 0, 0]
,'rosybrown':[188, 143, 143],'royalblue':[ 65, 105, 225]
,'saddlebrown':[139, 69, 19],'salmon':[250, 128, 114]
,'sandybrown':[244, 164, 96],'seagreen':[ 46, 139, 87]
,'seashell':[255, 245, 238],'sienna':[160, 82, 45]
,'silver':[192, 192, 192],'skyblue':[135, 206, 235]
,'slateblue':[106, 90, 205],'slategray':[112, 128, 144]
,'slategrey':[112, 128, 144],'snow':[255, 250, 250]
,'springgreen':[ 0, 255, 127],'steelblue':[ 70, 130, 180]
,'tan':[210, 180, 140],'teal':[ 0, 128, 128]
,'thistle':[216, 191, 216],'tomato':[255, 99, 71]
,'turquoise':[ 64, 224, 208],'violet':[238, 130, 238]
,'wheat':[245, 222, 179],'white':[255, 255, 255]
,'whitesmoke':[245, 245, 245],'yellow':[255, 255, 0]
,'yellowgreen':[154, 205, 50]}
import sys import sys
from math import cos,sin,tan, atan2, pi, ceil from math import cos,sin,tan, atan2, pi, ceil
@ -360,14 +461,17 @@ class Bez(object):
self.tag='' self.tag=''
class ITEM(object): class ITEM(object):
__slots__ = 'type', 'pntsUV', 'flagUV', 'beziers_knot','fill' __slots__ = 'type', 'pntsUV', 'flagUV', 'beziers_knot','fill','color','id','mat','matname'
def __init__(self): def __init__(self):
self.type = typBEZIER3D self.type = typBEZIER3D
self.pntsUV = [0,0] self.pntsUV = [0,0]
self.flagUV = [0,0] self.flagUV = [0,0]
self.beziers_knot = [] self.beziers_knot = []
self.fill=0 self.fill=0
#self.color=[0.0,0.0,0.0] self.color=[0.0,0.0,0.0,0.0]
self.id=''
self.mat=0
self.matname=''
class CURVE(object): class CURVE(object):
__slots__ = 'type','number_of_items','ITEM' __slots__ = 'type','number_of_items','ITEM'
@ -412,7 +516,8 @@ def createCURVES(curves, name):
""" """
internal curves creation internal curves creation
""" """
global SCALE, B, BOUNDINGBOX,scale_ global SCALE, B, BOUNDINGBOX,scale_, SEPARATE_CURVES
global USE_COLORS
from Blender import Curve, Object, Scene, BezTriple from Blender import Curve, Object, Scene, BezTriple
HANDLE={'C':BezTriple.HandleTypes.FREE,'L':BezTriple.HandleTypes.VECT} HANDLE={'C':BezTriple.HandleTypes.FREE,'L':BezTriple.HandleTypes.VECT}
r=BOUNDINGBOX['rec'] r=BOUNDINGBOX['rec']
@ -425,40 +530,72 @@ def createCURVES(curves, name):
SCALE=r[3]-r[1] SCALE=r[3]-r[1]
scene = Scene.GetCurrent() scene = Scene.GetCurrent()
scene.objects.selected = [] #059b scene.objects.selected = []
c = Curve.New() #059b
if not SEPARATE_CURVES:
c = Curve.New()
c.setResolu(24) c.setResolu(24)
MATNAME=[]
nloc=0.0
def new_MATERIAL(val):
# -----------------------
# have to create a material
#------------------------
if val.matname and val.matname in MATNAME:
mat = Blender.Material.Get(val.matname)
elif val.matname:
mat = Blender.Material.New(val.matname)
mat.rgbCol = [val.color[0]/255.0, val.color[1]/255.0, val.color[2]/255.0]
else:
mat = Blender.Material.New(val.id)
mat.rgbCol = [val.color[0]/255.0, val.color[1]/255.0, val.color[2]/255.0]
return [mat]
for I,val in curves.ITEM.iteritems(): for I,val in curves.ITEM.iteritems():
if SEPARATE_CURVES:
c = Curve.New()
c.setResolu(24)
if USE_COLORS and val.mat:
c.materials=new_MATERIAL(val)
bzn=0 bzn=0
if val.beziers_knot[-1].tag in ['L','l','V','v','H','h'] and\ if val.beziers_knot[-1].tag in ['L','l','V','v','H','h'] and\
test_samelocations(val.beziers_knot[-1].co,val.beziers_knot[0].co): test_samelocations(val.beziers_knot[-1].co,val.beziers_knot[0].co):
del val.beziers_knot[-1] del val.beziers_knot[-1]
#print 'remove last point', rmp
#rmp+=1
for k2 in xrange(0,len(val.beziers_knot)): for k2 in xrange(0,len(val.beziers_knot)):
bz= [co for co in val.beziers_knot[k2].co] bz= [co for co in val.beziers_knot[k2].co]
if bzn==0: if bzn==0:
cp1 = bz[4],bz[5],0.0 , bz[0],bz[1],0.0, bz[2],bz[3],0.0, cp1 = bz[4]/SCALE, bz[5]/-SCALE,0.0, bz[0]/SCALE, bz[1]/-SCALE,0.0, bz[2]/SCALE,bz[3]/-SCALE,0.0,
beztriple1 = BezTriple.New(cp1) beztriple1 = BezTriple.New(cp1)
bez = c.appendNurb(beztriple1) bez = c.appendNurb(beztriple1)
bez[0].handleTypes=(HANDLE[val.beziers_knot[k2].ha[0]],HANDLE[val.beziers_knot[k2].ha[1]]) bez[0].handleTypes=(HANDLE[val.beziers_knot[k2].ha[0]],HANDLE[val.beziers_knot[k2].ha[1]])
bzn = 1 bzn = 1
else: else:
cp2 = bz[4],bz[5],0.0 , bz[0],bz[1],0.0, bz[2],bz[3],0.0 cp2 = bz[4]/SCALE,bz[5]/-SCALE,0.0 , bz[0]/SCALE, bz[1]/-SCALE,0.0, bz[2]/SCALE,bz[3]/-SCALE,0.0
beztriple2 = BezTriple.New(cp2) beztriple2 = BezTriple.New(cp2)
beztriple2.handleTypes= (HANDLE[val.beziers_knot[k2].ha[0]],HANDLE[val.beziers_knot[k2].ha[1]]) beztriple2.handleTypes= (HANDLE[val.beziers_knot[k2].ha[0]],HANDLE[val.beziers_knot[k2].ha[1]])
bez.append(beztriple2) bez.append(beztriple2)
if val.flagUV[0]==1 or val.fill==1: if val.flagUV[0]==1 or val.fill==1:
#-------------------- #--------------------
# 0.4.6 : cyclic flag ... # 0.4.6 : cyclic flag ...
#-------------------- #--------------------
bez.flagU += 1 bez.flagU += 1
ob = scene.objects.new(c,name) #059b
scene.objects.active = ob #059b if SEPARATE_CURVES:
ob.setSize(1.0/SCALE,1.0/-SCALE,1.0) ob = scene.objects.new(c,val.id)
scene.objects.active = ob
ob.setLocation(0.0,0.0,nloc)
nloc+=0.0001
c.update() c.update()
if not SEPARATE_CURVES:
ob = scene.objects.new(c,name)
scene.objects.active = ob
c.update()
#===================================================================== #=====================================================================
#===== SVG format : DEBUT ========================= #===== SVG format : DEBUT =========================
@ -625,7 +762,7 @@ def polyline(prp):
D=['M',str(p[0]),str(p[1])] D=['M',str(p[0]),str(p[1])]
np+=1 np+=1
else: else:
D.append('L');D.append(str(p[0]));D.append(str(p[1])) D.append('L'); D.append(str(p[0])); D.append(str(p[1]))
return D return D
else: else:
return [] return []
@ -661,13 +798,21 @@ def calc_arc (cpx,cpy, rx, ry, ang, fa , fs , x, y) :
ry=abs(ry) ry=abs(ry)
px=abs((cos(ang)*(cpx-x)+sin(ang)*(cpy-y))*0.5)**2.0 px=abs((cos(ang)*(cpx-x)+sin(ang)*(cpy-y))*0.5)**2.0
py=abs((cos(ang)*(cpy-y)-sin(ang)*(cpx-x))*0.5)**2.0 py=abs((cos(ang)*(cpy-y)-sin(ang)*(cpx-x))*0.5)**2.0
pl=px/(rx**2.0)+py/(ry**2.0 ) rpx=rpy=0.0
if abs(rx)>0.0: rpx=px/(rx**2.0)
if abs(ry)>0.0: rpy=py/(ry**2.0)
pl=rpx+rpy
if pl>1.0: if pl>1.0:
pl=pl**0.5;rx*=pl;ry*=pl pl=pl**0.5;rx*=pl;ry*=pl
x0=(cos(ang)/rx)*cpx+(sin(ang)/rx)*cpy carx=sarx=cary=sary=0.0
y0=(-sin(ang)/ry)*cpx+(cos(ang)/ry)*cpy if abs(rx)>0.0:
x1=(cos(ang)/rx)*x+(sin(ang)/rx)*y carx=cos(ang)/rx;sarx=sin(ang)/rx
y1=(-sin(ang)/ry)*x+(cos(ang)/ ry)*y if abs(ry)>0.0:
cary=cos(ang)/ry;sary=sin(ang)/ry
x0=(carx)*cpx+(sarx)*cpy
y0=(-sary)*cpx+(cary)*cpy
x1=(carx)*x+(sarx)*y
y1=(-sary)*x+(cary)*y
d=(x1-x0)*(x1-x0)+(y1-y0)*(y1-y0) d=(x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)
if abs(d)>0.0 :sq=1.0/d-0.25 if abs(d)>0.0 :sq=1.0/d-0.25
else: sq=-0.25 else: sq=-0.25
@ -722,7 +867,7 @@ def curve_to_a(c,D,n0,CP): #A,a
l[0], l[1], l[2]*(PI / 180.0), l[0], l[1], l[2]*(PI / 180.0),
l[3], l[4], l[3], l[4],
l[5], l[6] ) l[5], l[6] )
if DEBUG == 1 : print POINTS #if DEBUG == 1 : print POINTS
for p in POINTS : for p in POINTS :
B=Bez() B=Bez()
B.co=[ p[2][0],p[2][1], p[0][0],p[0][1], p[1][0],p[1][1]] B.co=[ p[2][0],p[2][1], p[0][0],p[0][1], p[1][0],p[1][1]]
@ -739,7 +884,9 @@ def curve_to_a(c,D,n0,CP): #A,a
return curves,n0,CP return curves,n0,CP
def move_to(c, D, n0,CP, proprietes): def move_to(c, D, n0,CP, proprietes):
global DEBUG,TAGcourbe global DEBUG,TAGcourbe, LAST_ID
global USE_COLORS
l=[float(D[c[1]+1]),float(D[c[1]+2])] l=[float(D[c[1]+1]),float(D[c[1]+2])]
if c[0]=='m': if c[0]=='m':
l=[l[0]+CP[0], l=[l[0]+CP[0],
@ -748,13 +895,30 @@ def move_to(c, D, n0,CP, proprietes):
n0+=1 n0+=1
CP=[l[0],l[1]] CP=[l[0],l[1]]
curves.ITEM[n0]=ITEM() curves.ITEM[n0]=ITEM()
if 'id' in proprietes:
curves.ITEM[n0].id=proprietes['id']
else:
curves.ITEM[n0].id=LAST_ID
proprietes['n'].append(n0) proprietes['n'].append(n0)
if USE_COLORS:
pr= proprietes.get('fill') # None or the property
if pr != None:
if '#' in pr:
i=1
curves.ITEM[n0].color=[int(pr[i:i+2],16),int(pr[i+2:i+4],16),int(pr[i+4:i+6],16)]
curves.ITEM[n0].mat=1
elif pr in SVGCOLORNAMELIST:
Courbe[n].color=SVGCOLORNAMELIST[pr]
Courbe[n].mat=1
B=Bez() B=Bez()
B.co=[CP[0],CP[1],CP[0],CP[1],CP[0],CP[1]] B.co=[CP[0],CP[1],CP[0],CP[1],CP[0],CP[1]]
B.ha=['L','C'] B.ha=['L','C']
B.tag=c[0] B.tag=c[0]
curves.ITEM[n0].beziers_knot.append(B) curves.ITEM[n0].beziers_knot.append(B)
if DEBUG==1: print curves.ITEM[n0], CP #if DEBUG==1: print curves.ITEM[n0], CP
return curves,n0,CP return curves,n0,CP
def close_z(c,D,n0,CP): #Z,z def close_z(c,D,n0,CP): #Z,z
@ -784,10 +948,9 @@ def curve_to_q(c,D,n0,CP): #Q,q
BP.co[2]=BP.co[0] BP.co[2]=BP.co[0]
BP.co[3]=BP.co[1] BP.co[3]=BP.co[1]
curves.ITEM[n0].beziers_knot.append(B) curves.ITEM[n0].beziers_knot.append(B)
if DEBUG==1: print B.co,BP.co #if DEBUG==1: print B.co,BP.co
CP=[l[2],l[3]] CP=[l[2],l[3]]
if DEBUG==1: #if DEBUG==1: pass
pass
if len(D)>c[1]+5 and D[c[1]+5] not in TAGcourbe : if len(D)>c[1]+5 and D[c[1]+5] not in TAGcourbe :
c[1]+=4 c[1]+=4
curve_to_q(c, D, n0,CP) curve_to_q(c, D, n0,CP)
@ -807,7 +970,7 @@ def curve_to_t(c,D,n0,CP): #T,t
BP.co[2]=l0[2] BP.co[2]=l0[2]
BP.co[3]=l0[3] BP.co[3]=l0[3]
curves.ITEM[n0].beziers_knot.append(B) curves.ITEM[n0].beziers_knot.append(B)
if DEBUG==1: print B.co,BP.co #if DEBUG==1: print B.co,BP.co
CP=[l[0],l[1]] CP=[l[0],l[1]]
if len(D)>c[1]+3 and D[c[1]+3] not in TAGcourbe : if len(D)>c[1]+3 and D[c[1]+3] not in TAGcourbe :
c[1]+=4 c[1]+=4
@ -840,7 +1003,7 @@ def curve_to_s(c,D,n0,CP): #S,s
#-------------------- #--------------------
BP.co[2],BP.co[3]=build_SYMETRIC([BP.co[4],BP.co[5],BP.co[0],BP.co[1]]) 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) curves.ITEM[n0].beziers_knot.append(B)
if DEBUG==1: print B.co,BP.co #if DEBUG==1: print B.co,BP.co
#-------------------- #--------------------
# 0.4.3 # 0.4.3
#-------------------- #--------------------
@ -874,7 +1037,7 @@ def curve_to_c(c, D, n0,CP): #c,C
BP.co[3]=l[1] BP.co[3]=l[1]
BP.ha[1]='C' BP.ha[1]='C'
curves.ITEM[n0].beziers_knot.append(B) curves.ITEM[n0].beziers_knot.append(B)
if DEBUG==1: print B.co,BP.co #if DEBUG==1: print B.co,BP.co
CP=[l[4],l[5]] CP=[l[4],l[5]]
if len(D)>c[1]+7 and D[c[1]+7] not in TAGcourbe : if len(D)>c[1]+7 and D[c[1]+7] not in TAGcourbe :
c[1]+=6 c[1]+=6
@ -959,7 +1122,7 @@ tagTRANSFORM=0
def wash_DATA(ndata): def wash_DATA(ndata):
if ndata: if ndata:
if DEBUG==1: print ndata #if DEBUG==1: print ndata
ndata = ndata.strip() ndata = ndata.strip()
if ndata[0]==',':ndata=ndata[1:] if ndata[0]==',':ndata=ndata[1:]
if ndata[-1]==',':ndata=ndata[:-1] if ndata[-1]==',':ndata=ndata[:-1]
@ -1137,11 +1300,25 @@ def control_CONTAINT(txt):
t0=t1+1 t0=t1+1
return tlist return tlist
def curve_FILL(Courbe,proprietes):
for n in proprietes['n']:
if n in Courbe and 'fill:#' in proprietes['style']:
Courbe[n].fill=1
def curve_FILL(Courbe,proprietes):
global USE_COLORS
for n in proprietes['n']:
pr = proprietes['style']
if n in Courbe and 'fill:' in pr:
if not 'fill:none' in pr:
Courbe[n].fill=1
if USE_COLORS:
if '#' in pr:
i= pr.find('fill:#')+6
Courbe[n].color=[int(pr[i:i+2],16),int(pr[i+2:i+4],16),int(pr[i+4:i+6],16)]
Courbe[n].mat=1
elif ';fill-opacity' in pr:
i= pr.find('fill:')+5
i2= pr.find(';',i)
COLORNAME= pr[i:i2]
Courbe[n].color=SVGCOLORNAMELIST[COLORNAME]
Courbe[n].mat=1
#---------------------------------------------- #----------------------------------------------
# 0.4.1 : apply transform stack # 0.4.1 : apply transform stack
#---------------------------------------------- #----------------------------------------------
@ -1189,9 +1366,9 @@ def filter(d):
def get_BOUNDBOX(BOUNDINGBOX,SVG): def get_BOUNDBOX(BOUNDINGBOX,SVG):
if 'viewbox' not in SVG: if 'viewbox' not in SVG:
h=float(filter(SVG['height'])) h=float(filter(SVG['height']))
if DEBUG==1 : print 'h : ',h #if DEBUG==1 : print 'h : ',h
w=float(filter(SVG['width'])) w=float(filter(SVG['width']))
if DEBUG==1 : print 'w :',w #if DEBUG==1 : print 'w :',w
BOUNDINGBOX['rec']=[0.0,0.0,w,h] BOUNDINGBOX['rec']=[0.0,0.0,w,h]
r=BOUNDINGBOX['rec'] r=BOUNDINGBOX['rec']
BOUNDINGBOX['coef']=w/h BOUNDINGBOX['coef']=w/h
@ -1236,7 +1413,7 @@ def collect_ATTRIBUTS(data):
# -------------------------------------------- # --------------------------------------------
def build_HIERARCHY(t): def build_HIERARCHY(t):
global CP, curves, SCALE, DEBUG, BOUNDINGBOX, scale_, tagTRANSFORM global CP, curves, SCALE, DEBUG, BOUNDINGBOX, scale_, tagTRANSFORM
global LAST_ID
TRANSFORM=0 TRANSFORM=0
t=t.replace('\t',' ') t=t.replace('\t',' ')
while t.find(' ')!=-1: t=t.replace(' ',' ') while t.find(' ')!=-1: t=t.replace(' ',' ')
@ -1283,27 +1460,40 @@ def build_HIERARCHY(t):
balise=BALISES[-1] balise=BALISES[-1]
else: else:
balise=BALISES[-2] balise=BALISES[-2]
if balise=='E' or balise=='O': if balise=='E' or balise=='O':
proprietes=collect_ATTRIBUTS(t[t0:t1+ouvrante]) proprietes=collect_ATTRIBUTS(t[t0:t1+ouvrante])
#print proprietes
if 'id' in proprietes:
LAST_ID=proprietes['id']
#print LAST_ID
if balise=='O' and 'transform' in proprietes: if balise=='O' and 'transform' in proprietes:
STACK.append(proprietes['transform']) STACK.append(proprietes['transform'])
TRANSFORM+=1 TRANSFORM+=1
elif balise=='O' : elif balise=='O' :
STACK.append(None) STACK.append(None)
proprietes['stack']=STACK[:] proprietes['stack']=STACK[:]
D=[] D=[]
if proprietes['TYPE'] in ['path'] and (proprietes['d'][1]-proprietes['d'][0]>1): if proprietes['TYPE'] in ['path'] and (proprietes['d'][1]-proprietes['d'][0]>1):
D=list_DATA(t[proprietes['d'][0]+t0:proprietes['d'][1]+t0]) D=list_DATA(t[proprietes['d'][0]+t0:proprietes['d'][1]+t0])
elif proprietes['TYPE'] in OTHERSSHAPES: elif proprietes['TYPE'] in OTHERSSHAPES:
#-------------------- #--------------------
# 0.5.8, to remove exec # 0.5.8, to remove exec
#-------------------- #--------------------
D=OTHERSSHAPES[proprietes['TYPE']](proprietes) D=OTHERSSHAPES[proprietes['TYPE']](proprietes)
if len(D)>0: if len(D)>0:
cursor=0 cursor=0
proprietes['n']=[] proprietes['n']=[]
for cell in D: for cell in D:
if DEBUG==2 : print 'cell : ',cell ,' --' #if DEBUG==2 : print 'cell : ',cell ,' --'
if len(cell)>=1 and cell[0] in TAGcourbe: if len(cell)>=1 and cell[0] in TAGcourbe:
#-------------------- #--------------------
# 0.5.8, to remove exec # 0.5.8, to remove exec
@ -1312,12 +1502,16 @@ def build_HIERARCHY(t):
curves,n0,CP=Actions[cell]([cell,cursor], D, n0,CP,proprietes) curves,n0,CP=Actions[cell]([cell,cursor], D, n0,CP,proprietes)
else: else:
curves,n0,CP=Actions[cell]([cell,cursor], D, n0,CP) curves,n0,CP=Actions[cell]([cell,cursor], D, n0,CP)
cursor+=1 cursor+=1
if TRANSFORM>0 or 'transform' in proprietes : if TRANSFORM>0 or 'transform' in proprietes :
curve_TRANSFORM(curves.ITEM,proprietes) curve_TRANSFORM(curves.ITEM,proprietes)
if 'style' in proprietes : if 'style' in proprietes :
curve_FILL(curves.ITEM,proprietes) curve_FILL(curves.ITEM,proprietes)
elif proprietes['TYPE'] in ['svg'] :
elif proprietes['TYPE'] == 'svg':
#print 'proprietes.keys()',proprietes.keys() #print 'proprietes.keys()',proprietes.keys()
BOUNDINGBOX = get_BOUNDBOX(BOUNDINGBOX,proprietes) BOUNDINGBOX = get_BOUNDBOX(BOUNDINGBOX,proprietes)
else: else:
@ -1330,6 +1524,8 @@ def build_HIERARCHY(t):
def scan_FILE(nom): def scan_FILE(nom):
global CP, curves, SCALE, DEBUG, BOUNDINGBOX, scale_, tagTRANSFORM global CP, curves, SCALE, DEBUG, BOUNDINGBOX, scale_, tagTRANSFORM
global SEPARATE_CURVES, USE_COLORS
dir,name=split(nom) dir,name=split(nom)
name=name.split('.') name=name.split('.')
result=0 result=0
@ -1339,21 +1535,32 @@ def scan_FILE(nom):
if t!='false': if t!='false':
Blender.Window.EditMode(0) Blender.Window.EditMode(0)
if not SHARP_IMPORT: if not SHARP_IMPORT:
warning = "Select Size : %t| Scale on Width %x1| Scale on Height %x2| As is (caution may be large) %x3" togH = Blender.Draw.Create(1)
scale_ = Blender.Draw.PupMenu(warning) togW = Blender.Draw.Create(0)
togAS = Blender.Draw.Create(0)
togSP = Blender.Draw.Create(0)
togCOL = Blender.Draw.Create(0)
block=[\
("Clamp Width 1", togW, "Rescale the import with a Width of one unit"),\
("Clamp Height 1", togH, "Rescale the import with a Heightof one unit"),\
("No Rescaling", togAS, "No rescaling, the result can be very large"),\
("Separate Curves", togSP, "Create an object for each curve, Slower. May manage colors"),\
("Import Colors", togCOL, "try to import color if the path is set as 'fill'. Only With separate option")]
retval = Blender.Draw.PupBlock("Import Options", block)
if togW.val: scale_=1
elif togH.val: scale_=2
elif togAS.val: scale_=3
if togSP.val: SEPARATE_CURVES=1
if togCOL.val and SEPARATE_CURVES : USE_COLORS=1
t1=Blender.sys.time() t1=Blender.sys.time()
# 0.4.1 : to avoid to use sax and the xml # 0.4.1 : to avoid to use sax and the xml
# tools of the complete python # tools of the complete python
build_HIERARCHY(t) build_HIERARCHY(t)
r=BOUNDINGBOX['rec'] r=BOUNDINGBOX['rec']
"""
if scale_==3:
SCALE=1.0
elif scale==1:
SCALE=r[2]-r[0]
elif scale_==2:
SCALE=r[3]-r[1]
"""
curves.number_of_items=len(curves.ITEM) curves.number_of_items=len(curves.ITEM)
for k, val in curves.ITEM.iteritems(): for k, val in curves.ITEM.iteritems():
val.pntsUV[0] =len(val.beziers_knot) val.pntsUV[0] =len(val.beziers_knot)