Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2007-03-31 15:19:18 +0400
committerCampbell Barton <ideasman42@gmail.com>2007-03-31 15:19:18 +0400
commit71843bf10312ed21e0c8e1e44dd54d9a685528e3 (patch)
treee4073abf10ce707ad99aa970eb4dd204cf63b535 /release/scripts/bpymodules/svg2obj.py
parent685bfd056e0ee2e7a776eaaab21053550fcba1bc (diff)
Updating JMS's SVG Importer script from 0.5.6 to 0.5.9b
Changelog 0.5.7 : - Wash down of some handle problems. 0.5.8 : - 2007/3/9 Wash down of the last exec and correction of a problem with the curve's first beztriple handle which was not recorded at first time . - Added some units managements - Correction of the rotate matrix - Correction of the skew matrix - change in the wash_DATA function suggested by cambo - added __slot__ in class Bez, ITEM and CURVE suggested by cambo - remove unused properties in class ITEM and CURVE 0.5.9 : - 2007/3/28 - many improvements for faster and clearer code suggested by cambo and martin. replacement of "%s" statement by str function. - correction of an error in the scale transform management - correction in the management of the stack transformation that rise an error under python 2.5 but curiously not with python 2.4 .5.9a : - 2007/3/29 - Again a lot of minors corrections - Backward to 0.5.8 of the function that manages float numbers exported by the Adobe Illustrator's SVG. After a lot of tests it seems that this oldest version is also faster too . - correction (bad) on handle management with V and H commands. .5.9b : - 2007/3/31 - one or two minor corrections : now the new object curve is added in the current layer. short modif in the scale menu...
Diffstat (limited to 'release/scripts/bpymodules/svg2obj.py')
-rw-r--r--release/scripts/bpymodules/svg2obj.py2075
1 files changed, 1032 insertions, 1043 deletions
diff --git a/release/scripts/bpymodules/svg2obj.py b/release/scripts/bpymodules/svg2obj.py
index d6d206cd87e..4b2724518f2 100644
--- a/release/scripts/bpymodules/svg2obj.py
+++ b/release/scripts/bpymodules/svg2obj.py
@@ -1,6 +1,6 @@
# -*- coding: latin-1 -*-
"""
-SVG 2 OBJ translater, 0.5.6
+SVG 2 OBJ translater, 0.5.9b
Copyright (c) jm soler juillet/novembre 2004-mars 2007,
# ---------------------------------------------------------------
released under GNU Licence
@@ -44,30 +44,33 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
#---------------------------------------------------------------------------
--- Concept : translate SVG file in GEO .obj file and try to load it.
--- Curiousity : the original matrix must be :
-
- 0.0 0.0 1.0 0.0
- 0.0 1.0 0.0 0.0
- 0.0 0.0 1.0 0.0
- 0.0 0.0 0.0 1.0
-
- and not:
- 1.0 0.0 0.0 0.0
- 0.0 1.0 0.0 0.0
- 0.0 0.0 1.0 0.0
- 0.0 0.0 0.0 1.0
-
--- Options :
+--Old Concept : translate SVG file in GEO .obj file and try to load it.
+ was removed for the Blender 2.4x release.
+ .-- Curiousity : the original matrix must be :
+ |
+ | 0.0 0.0 1.0 0.0
+ | 0.0 1.0 0.0 0.0
+ | 0.0 0.0 1.0 0.0
+ | 0.0 0.0 0.0 1.0
+ |
+ | and not:
+ | 1.0 0.0 0.0 0.0
+ | 0.0 1.0 0.0 0.0
+ | 0.0 0.0 1.0 0.0
+ | 0.0 0.0 0.0 1.0
+ |
+ '-- Possible bug : sometime, the new curves object's RotY value
+ jumps to -90.0 degrees without any reason.
+
+--Options :
SHARP_IMPORT = 0
choise between "As is", "Devide by height" and "Devide by width"
SHARP_IMPORT = 1
no choise
--- Possible bug : sometime, the new curves object's RotY value
- jumps to -90.0 degrees without any reason.
-Yet done:
+
+All commands are managed:
M : absolute move to
Z : close path
L : absolute line to
@@ -97,6 +100,8 @@ Yet done:
transfrom for <g> tag
transform for <path> tag
+The circle, rectangle closed or open polygons lines are managed too.
+
Changelog:
0.1.1 : - control file without extension
0.2.0 : - improved reading of several data of the same type
@@ -144,61 +149,47 @@ Changelog:
- skewY, skewX transforms
- radians in rotate transform
0.4.2 : - Added functon to translate others shapes in path
- rect, line, polyline, polygon
-
+ rect, line, polyline, polygon
0.4.3 : - various corrections
text font (id property exported by Adobe Illustrator are between coma)
function to code s tag has been rewritten
-
0.4.4 : - various corrections
to oblige the script to understand a line feed just after
a tag . Rarely encountered problem, but it exits in a svg file
format exported by a outliner script for mesh .
-
0.4.5 : - update for CVS only, at least blender 2.38 and upper
no BezTriple module in older version
added a createCURVES function to avoid to use
the OBJ format export/import .
-
Perhaps problems with cyclic curves . If a closed curve
does not appear closed in blender, enter edit mode select
all knot with Akey, do a Hkey to set handle type (without
this the knot are recalculated) , and finally use the Ckey
to close the curve .
Should work ... not guaranted .
-
0.4.6 : - cyclic flag ...
-
0.4.7 : - Management of the svgz files . the complete python or the
- gzip.py file is needed .
- Little improvement of the curve drawing using the createCURVES
+ gzip.py file is needed .
+ Little improvement of the curve drawing using the createCURVES
function
-
0.4.8 : - short modif for a fantasy font case in the OOo svg format
- ('viewbox' is written 'viewBox', for instance) .
- Note that (at this time, 2006/05/01, 1OOo exports in svg
- but does not read its own export
-
- 0.4.9 : - skipped version : private test
-
- 0.5.0 : - the script worked perfectly with Blender 2.41 but in Blender
- 2.42, use the original svg name file + 'OOO.obj' to
- write a videoscape file made blender crash under window XP when
- the script loaded it . Curiously, use a more simple
- name with a sole 'O' solved this problem .
-
+ ('viewbox' is written 'viewBox', for instance) .
+ Note that (at this time, 2006/05/01, 1OOo exports in svg
+ but does not read its own export
+ 0.4.9 : - skipped version : private test
+ 0.5.0 : - the script worked perfectly with Blender 2.41 but in Blender
+ 2.42, use the original svg name file + 'OOO.obj' to
+ write a videoscape file made blender crash under window XP when
+ the script loaded it . Curiously, use a more simple
+ name with a sole 'O' solved this problem .
- script returned errors on open path : corrected
-
- in b2.42, several successive imports seem to be added to
the same original curve . So now the script automaticaly
renames the last group of imported curve with the original
name file .
-
0.5.1 : - without join option in the internal curve creation function
-
0.5.2 : - the createCURVES() function has been cleanded . Now it works
fine but all bezier curves are joined in the same curve object .
-
0.5.3 : - removed two things :
1/ the ajustement function to increase speed . 35 % faster :
5690 curves and 30254 points in 11 seconds . User should do
@@ -206,22 +197,48 @@ Changelog:
2/ the import method menu . No reason to choose between the
old extern curve creat and the new intern curve creation
this last one is largely faster .
-
0.5.4 : - translation of the functions' name + improvment in the dict lookup .
Quite 15% faster . 9.75 seconds instead of 11 to load the file test .
A test was also added to find the fill style so now the script closes
these curves even if they are not defined as closed in the strict path
commands .
The old non used functions have been completely removed .
-
0.5.5 : - Modifs for architect users .
-
- 0.5.6 : - Exec was removed from the collect_ATTRIBUTS function .
- Other uses was evaluated.
-
+ 0.5.6 : - Exec was removed from the collect_ATTRIBUTS function .
+ Other uses was evaluated.
+ 0.5.7 : - Wash down of some handle problems.
+
+ 0.5.8 : - 2007/3/9
+ Wash down of the last exec and correction of a
+ problem with the curve's first beztriple handle
+ which was not recorded at first time .
+ - Added some units managements
+ - Correction of the rotate matrix
+ - Correction of the skew matrix
+ - change in the wash_DATA function suggested by cambo
+ - added __slot__ in class Bez, ITEM and CURVE suggested by cambo
+ - remove unused properties in class ITEM and CURVE
+
+ 0.5.9 : - 2007/3/28
+ - many improvements for faster and clearer code suggested by cambo and martin.
+ replacement of "%s" statement by str function.
+ - correction of an error in the scale transform management
+ - correction in the management of the stack transformation that rise an error
+ under python 2.5 but curiously not with python 2.4
+
+ 0.5.9a : - 2007/3/29
+ - Again a lot of minors corrections
+ - Backward to 0.5.8 of the function that manages float numbers exported
+ by the Adobe Illustrator's SVG. After a lot of tests it seems that this oldest
+ version is also faster too .
+ - correction (bad) on handle management with V and H commands.
+ 0.5.9b : - 2007/3/31
+ - one or two minor corrections :
+ now the new object curve is added in the current layer.
+ short modif in the scale menu...
+
==================================================================================
=================================================================================="""
-
SHARP_IMPORT=0
SCALE=1
scale_=1
@@ -233,101 +250,100 @@ from math import cos,sin,tan, atan2, pi, ceil
PI=pi
import Blender
from Blender import Mathutils
-BLversion=Blender.Get('version')
try:
- import nt
- os=nt
- os.sep='\\'
+ import nt
+ os=nt
+ os.sep='\\'
except:
- import posix
- os=posix
- os.sep='/'
-
+ import posix
+ os=posix
+ os.sep='/'
+
def isdir(path):
- try:
- st = os.stat(path)
- return 1
- except:
- return 0
-
+ try:
+ st = os.stat(path)
+ return 1
+ except:
+ return 0
+
def split(pathname):
- if pathname.find(os.sep)!=-1:
- k0=pathname.split(os.sep)
- else:
- if os.sep=='/':
- k0=pathname.split('\\')
- else:
- k0=pathname.split('/')
-
- directory=pathname.replace(k0[len(k0)-1],'')
- Name=k0[len(k0)-1]
- return directory, Name
-
+ if os.sep in pathname:
+ k0=pathname.split(os.sep)
+ else:
+ if os.sep=='/':
+ k0=pathname.split('\\')
+ else:
+ k0=pathname.split('/')
+ directory=pathname.replace(k0[len(k0)-1],'')
+ Name=k0[len(k0)-1]
+ return directory, Name
+
def join(l0,l1):
- return l0+os.sep+l1
-
+ return l0+os.sep+l1
+
os.isdir=isdir
os.split=split
os.join=join
def filterFILE(nom):
- """
- Function filterFILE
+ """
+ Function filterFILE
- in : string nom , filename
- out : string t , if correct filecontaint
-
- read the file's content and try to see if the format
- is correct .
-
- Lit le contenu du fichier et en fait une pre-analyse
- pour savoir s'il merite d'etre traite .
- """
- # ----------
- # 0.4.7
- # ----------
- if nom.upper().find('.SVGZ')!=-1:
- try :
- import gzip
- tz=gzip.GzipFile(nom)
- t=tz.read()
- except:
- name = "ERROR: fail to import gzip module or gzip error ... "
- result = Blender.Draw.PupMenu(name)
- return "false"
- else:
- f=open(nom,'rU')
- t=f.read()
- f.close()
- # ----------
- # 0.4.7 : end
- # ----------
-
- # -----------------
- # pre-format ...
- # -----------------
- # --------------------
- # 0.4.4 '\r','' --> '\r',' '
- # '\n','' --> '\n',' '
- #--------------------
- t=t.replace('\r',' ')
- t=t.replace('\n',' ')
- t=t.replace('svg:','')
-
- if t.upper().find('<SVG')==-1 :
- name = "ERROR: invalid or empty file ... " # if no %xN int is set, indices start from 1
- result = Blender.Draw.PupMenu(name)
- return "false"
- else:
- return t
+ in : string nom , filename
+ out : string t , if correct filecontaint
+
+ read the file's content and try to see if the format
+ is correct .
+
+ Lit le contenu du fichier et en fait une pre-analyse
+ pour savoir s'il merite d'etre traite .
+ """
+ # ----------
+ # 0.4.7
+ # ----------
+ if nom.upper().endswith('.SVGZ'):
+ try :
+ import gzip
+ tz=gzip.GzipFile(nom)
+ t=tz.read()
+ except:
+ name = "ERROR: fail to import gzip module or gzip error ... "
+ result = Blender.Draw.PupMenu(name)
+ return "false"
+ else:
+ f=open(nom,'rU')
+ t=f.read()
+ f.close()
+ # ----------
+ # 0.4.7 : end
+ # ----------
+ # -----------------
+ # pre-format ...
+ # -----------------
+ # --------------------
+ # 0.4.4 '\r','' --> '\r',' '
+ # '\n','' --> '\n',' '
+ #--------------------
+ t=t.replace('\r',' ')
+ t=t.replace('\n',' ')
+ t=t.replace('svg:','')
+ #--------------------
+ # may be needed in some import case when the
+ # file is saved from a mozilla display
+ #--------------------
+ t=t.replace(chr(0),'')
+ if not '<SVG' in t.upper():
+ name = "ERROR: invalid or empty file ... " # if no %xN int is set, indices start from 1
+ result = Blender.Draw.PupMenu(name)
+ return "false"
+ else:
+ return t
#===============================
# Data
#===============================
-
-
#===============================
# Blender Curve Data
#===============================
@@ -336,38 +352,29 @@ objSURFACE=5
typBEZIER3D=1 #3D
typBEZIER2D=9 #2D
-class Bez:
- def __init__(self):
- self.co=[]
- self.ha=['C','C']
- self.tag=''
-
-class ITEM:
- def __init__(self):
- self.type = typBEZIER3D
- self.pntsUV = [0,0]
- self.resolUV = [32,0]
- self.orderUV = [0,0]
- self.flagUV = [0,0]
- self.Origine = [0.0,0.0]
- self.beziers_knot = []
- self.beziers_handler = []
- self.fill=0
- self.closed=0
- self.color=[0.0,0.0,0.0]
-
-class CURVE:
- def __init__(self):
- self.magic_number='3DG3'
- self.type = objBEZIER
- self.number_of_items = 0
- self.ext1_ext2 = [0,0]
- self.matrix = """0.0 0.0 1.0 0.0
-0.0 1.0 0.0 0.0
-0.0 0.0 1.0 0.0
-0.0 0.0 0.0 1.0 """
- self.ITEM = {}
-
+class Bez(object):
+ __slots__ = 'co', 'ha', 'tag' # suggested by cambo, should save memory
+ def __init__(self):
+ self.co=[]
+ self.ha=['C','C']
+ self.tag=''
+
+class ITEM(object):
+ __slots__ = 'type', 'pntsUV', 'flagUV', 'beziers_knot','fill'
+ def __init__(self):
+ self.type = typBEZIER3D
+ self.pntsUV = [0,0]
+ self.flagUV = [0,0]
+ self.beziers_knot = []
+ self.fill=0
+ #self.color=[0.0,0.0,0.0]
+
+class CURVE(object):
+ __slots__ = 'type','number_of_items','ITEM'
+ def __init__(self):
+ self.type = objBEZIER
+ self.number_of_items = 0
+ self.ITEM = {}
curves=CURVE()
PATTERN={}
@@ -387,1003 +394,985 @@ CP=[0.0,0.0] #currentPoint
#=====================================================================
#===== to compare last position to the original move to displacement =
-#===== needed for cyclic definition inAI, EPS forma ================
+#===== needed for cyclic definition in AI, EPS forma ================
#=====================================================================
def test_samelocations(f1,f2):
- EPSILON=0.0001
- if abs(f1[4])- abs(f2[4])< EPSILON and abs(f1[4])- abs(f2[4])>= 0.0\
- and abs(f1[5])-abs(f2[5])< EPSILON and abs(f1[5])-abs(f2[5])>= 0.0 :
- return 1
- else:
- return 0
+ EPSILON=0.0001
+ if abs(f1[4])- abs(f2[4])< EPSILON and abs(f1[4])- abs(f2[4])>= 0.0\
+ and abs(f1[5])-abs(f2[5])< EPSILON and abs(f1[5])-abs(f2[5])>= 0.0 :
+ return 1
+ else:
+ return 0
#--------------------
# 0.4.5 : for blender cvs 2.38 ....
#--------------------
def createCURVES(curves, name):
- """
- internal curves creation
- """
- global SCALE, B, BOUNDINGBOX,scale_
- from Blender import Curve, Object, Scene, BezTriple
- HANDLE={'C':BezTriple.HandleTypes.FREE,'L':BezTriple.HandleTypes.VECT}
- r=BOUNDINGBOX['rec']
- if scale_==1:
- SCALE=1.0
- elif scale_==2:
- SCALE=r[2]-r[0]
- elif scale_==3:
- SCALE=r[3]-r[1]
-
- if Blender.Get('version')<243 :
- scene = Scene.getCurrent()
- else :
- scene = Scene.GetCurrent()
-
- ob = Object.New('Curve',name)
- c = Curve.New()
- c.setResolu(24)
-
- #print "total curves : ", len(curves.ITEM)
- for I,val in curves.ITEM.iteritems():
- bzn=0
- if test_samelocations(val.beziers_knot[-1].co,val.beziers_knot[0].co)\
- and val.beziers_knot[-1].tag in ['L','l','V','v','H','h']:
- del val.beziers_knot[-1]
-
- #for b in curves.ITEM[I].beziers_knot:
- for k2 in range(0,len(val.beziers_knot)):
- bz= [co for co in val.beziers_knot[k2].co] #ajustement(curves.ITEM[I].beziers_knot[k2], SCALE)
- #bz=k1
-
- if bzn==0:
- cp1 = bz[4],bz[5],0.0 , bz[0],bz[1],0.0, bz[2],bz[3],0.0,
- beztriple1 = BezTriple.New(cp1)
- beztriple1.handleTypes= (HANDLE[val.beziers_knot[k2].ha[0]],HANDLE[val.beziers_knot[k2].ha[1]])
- bez = c.appendNurb(beztriple1)
- bzn = 1
- else:
- cp2 = bz[4],bz[5],0.0 , bz[0],bz[1],0.0, bz[2],bz[3],0.0
- beztriple2 = BezTriple.New(cp2)
- #beztriple2.handleTypes= (BezTriple.HandleTypes.FREE, BezTriple.HandleTypes.FREE)
- beztriple2.handleTypes= (HANDLE[val.beziers_knot[k2].ha[0]],HANDLE[val.beziers_knot[k2].ha[1]])
- bez.append(beztriple2)
- #print beztriple1.handleTypes
-
- if val.flagUV[0]==1 or val.fill==1:
- #--------------------
- # 0.4.6 : cyclic flag ...
- #--------------------
- bez.flagU += 1
-
- #print len(c)
- ob.link(c)
- scene.link(ob)
- ob.setSize(1.0/SCALE,1.0/-SCALE,1.0)
- c.update()
+ """
+ internal curves creation
+ """
+ global SCALE, B, BOUNDINGBOX,scale_
+ from Blender import Curve, Object, Scene, BezTriple
+ HANDLE={'C':BezTriple.HandleTypes.FREE,'L':BezTriple.HandleTypes.VECT}
+ 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]
+
+ scene = Scene.GetCurrent()
+ scene.objects.selected = [] #059b
+ c = Curve.New() #059b
+
+ c.setResolu(24)
+ for I,val in curves.ITEM.iteritems():
+ bzn=0
+ 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):
+ del val.beziers_knot[-1]
+ #print 'remove last point', rmp
+ #rmp+=1
+ for k2 in xrange(0,len(val.beziers_knot)):
+ bz= [co for co in val.beziers_knot[k2].co]
+ if bzn==0:
+ cp1 = bz[4],bz[5],0.0 , bz[0],bz[1],0.0, bz[2],bz[3],0.0,
+ beztriple1 = BezTriple.New(cp1)
+ bez = c.appendNurb(beztriple1)
+ bez[0].handleTypes=(HANDLE[val.beziers_knot[k2].ha[0]],HANDLE[val.beziers_knot[k2].ha[1]])
+ bzn = 1
+ else:
+ cp2 = bz[4],bz[5],0.0 , bz[0],bz[1],0.0, bz[2],bz[3],0.0
+ beztriple2 = BezTriple.New(cp2)
+ beztriple2.handleTypes= (HANDLE[val.beziers_knot[k2].ha[0]],HANDLE[val.beziers_knot[k2].ha[1]])
+ bez.append(beztriple2)
+ if val.flagUV[0]==1 or val.fill==1:
+ #--------------------
+ # 0.4.6 : cyclic flag ...
+ #--------------------
+ bez.flagU += 1
+ ob = scene.objects.new(c,name) #059b
+ scene.objects.active = ob #059b
+ ob.setSize(1.0/SCALE,1.0/-SCALE,1.0)
+ c.update()
+
#=====================================================================
#===== SVG format : DEBUT =========================
#=====================================================================
#--------------------
-# 0.4.2
+# 0.5.8, needed with the new
+# tranform evaluation
#--------------------
-OTHERSSHAPES=['rect','line', 'polyline', 'polygon','circle','ellipse']
+pxUNIT={'pt':1.25,
+ 'pc':15.0,
+ 'mm':3.543307,
+ 'cm':35.43307,
+ 'in':90.0,
+ 'em':1.0, # should be taken from font size
+ # but not currently managed
+ 'ex':1.0, # should be taken from font size
+ # but not currently managed
+ '%':1.0,
+ }
#--------------------
# 0.4.2
+# 0.5.8, to remove exec
#--------------------
def rect(prp):
- """
- build rectangle paths
- """
- D=[]
- if 'x' not in prp: x=0.0
- else : x=float(prp['x'])
- if 'y' not in prp: y=0.0
- else : y=float(prp['y'])
-
- height=float(prp['height'])
- width=float(prp['width'])
-
- """
- normal rect
-
- x,y
- h1
- *----------*
- | |
- | |
- | |
- *----------* v1
- h2
- """
- if 'rx' not in prp or 'rx' not in prp:
- # -------------------------------------
- # is this exec safe ?
- # -------------------------------------
- exec """D=['M','%s','%s','h','%s','v','%s','h','%s','z']"""%(x,y,width,height,-width)
- else :
- rx=float(prp['rx'])
- if 'ry' not in prp :
- ry=float(prp['rx'])
- else : ry=float(prp['ry'])
- if 'rx' in prp and prp['rx']<0.0: rx*=-1
- if 'ry' in prp and prp['ry']<0.0: ry*=-1
-
- """
- rounded corner
-
- x,y M h1
- ---*----------*
- / \
- / \
- v2 * * c1
- | |
- | |
- | |
- c3 * * v2
- \ /
- \ /
- *----------*
- h2 c2
- """
- # -------------------------------------
- # is this exec safe
- # -------------------------------------
- exec """D=['M','%s','%s',
- 'h','%s',
- 'c','%s','%s','%s','%s','%s','%s',
- 'v','%s',
- 'c','%s','%s','%s','%s','%s','%s',
- 'h','%s',
- 'c','%s','%s','%s','%s','%s','%s',
- 'v','%s',
- 'c','%s','%s','%s','%s','%s','%s',
- 'z']"""%(x+rx,y,
- width-2*rx,
- rx,0.0,rx,ry,rx,ry,
- height-ry,
- 0.0,ry,-rx,ry,-rx,ry,
- -width+2*rx,
- -rx,0.0,-rx,-ry,-rx,-ry,
- -height+ry,
- 0.0,0.0,0.0,-ry,rx,-ry
- )
-
- return D
+ """
+ build rectangle paths
+ """
+ D=[]
+ if 'x' not in prp: x=0.0
+ else : x=float(prp['x'])
+ if 'y' not in prp: y=0.0
+ else : y=float(prp['y'])
+ #--------------------
+ # 0.5.8
+ #--------------------
+ try:
+ height=float(prp['height'])
+ except:
+ pxUNIT['%']=(BOUNDINGBOX['rec'][3]-BOUNDINGBOX['rec'][1])/100.0
+ for key in pxUNIT:#.keys():
+ if key in prp['height']:
+ height=float(prp['height'].replace(key,''))*pxUNIT[key]
+ try:
+ width=float(prp['width'])
+ except:
+ pxUNIT['%']=(BOUNDINGBOX['rec'][2]-BOUNDINGBOX['rec'][0])/100.0
+ for key in pxUNIT:#.keys():
+ if key in prp['width']:
+ width=float(prp['width'].replace(key,''))*pxUNIT[key]
+ #--------------------
+ # 0.5.8, end
+ #--------------------
+ """
+ normal rect
+ x,y
+ h1
+ *----------*
+ | |
+ | |
+ | |
+ *----------* v1
+ h2
+ """
+ if 'rx' not in prp or 'rx' not in prp:
+ D=['M',str(x),str(y),'h',str(width),'v',str(height),'h',str(-width),'z']
+ else :
+ rx=float(prp['rx'])
+ if 'ry' not in prp :
+ ry=float(prp['rx'])
+ else : ry=float(prp['ry'])
+ if 'rx' in prp and prp['rx']<0.0: rx*=-1
+ if 'ry' in prp and prp['ry']<0.0: ry*=-1
+ """
+ rounded corner
+
+ x,y M h1
+ ---*----------*
+ / \
+ / \
+ v2 * * c1
+ | |
+ | |
+ | |
+ c3 * * v2
+ \ /
+ \ /
+ *----------*
+ h2 c2
+ """
+
+ D=['M',str(x+rx),str(y),
+ 'h',str(width-2*rx),
+ 'c',str(rx),'0.0',str(rx),str(ry),str(rx),str(ry),
+ 'v',str(height-ry),
+ 'c','0.0',str(ry),str(-rx),str(ry),str(-rx),str(ry),
+ 'h',str(-width+2*rx),
+ 'c',str(-rx),'0.0',str(-rx),str(-ry),str(-rx),str(-ry),
+ 'v',str(-height+ry),
+ 'c','0.0','0.0','0.0',str(-ry),str(rx),str(-ry),
+ 'z']
+
+ return D
#--------------------
# 0.4.2
+# 0.5.8, to remove exec
#--------------------
def circle(prp):
- if 'cx' not in prp: cx=0.0
- else : cx =float(prp['cx'])
- if 'cy' not in prp: cy=0.0
- else : cy =float(prp['cy'])
- r = float(prp['r'])
- # -------------------------------------
- # is this exec safe
- # -------------------------------------
- exec """D=['M','%s','%s',
- 'C','%s','%s','%s','%s','%s','%s',
- 'C','%s','%s','%s','%s','%s','%s',
- 'C','%s','%s','%s','%s','%s','%s',
- 'C','%s','%s','%s','%s','%s','%s',
- 'Z']"""%(
- cx,cy+r,
- cx-r,cy+r*0.552, cx-0.552*r,cy+r, cx,cy+r,
- cx+r*0.552,cy+r, cx+r,cy+r*0.552, cx+r,cy,
- cx+r,cy-r*0.552, cx+r*0.552,cy-r, cx,cy-r,
- cx-r*0.552,cy-r, cx-r,cy-r*0.552, cx-r,cy
- )
- return D
-
+ if 'cx' not in prp: cx=0.0
+ 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),
+ 'C',str(cx+r*0.552), str(cy+r), str(cx+r), str(cy+r*0.552), str(cx+r),str(cy),
+ 'C',str(cx+r), str(cy-r*0.552),str(cx+r*0.552),str(cy-r),str(cx), str(cy-r),
+ 'C',str(cx-r*0.552), str(cy-r), str(cx-r), str(cy-r*0.552),str(cx-r),str(cy),
+ 'Z']
+ return D
+
#--------------------
# 0.4.2
+# 0.5.8, to remove exec
#--------------------
def ellipse(prp):
- if 'cx' not in prp: cx=0.0
- else : cx =float(prp['cx'])
- if 'cy' not in prp: cy=0.0
- else : cy =float(prp['cy'])
- ry = float(prp['rx'])
- rx = float(prp['ry'])
- # -------------------------------------
- # is this exec safe
- # -------------------------------------
- exec """D=['M','%s','%s',
- 'C','%s','%s','%s','%s','%s','%s',
- 'C','%s','%s','%s','%s','%s','%s',
- 'C','%s','%s','%s','%s','%s','%s',
- 'C','%s','%s','%s','%s','%s','%s',
- 'Z']"""%(
- cx,cy+rx,
- cx-ry,cy+rx*0.552, cx-0.552*ry,cy+rx, cx,cy+rx,
- cx+ry*0.552,cy+rx, cx+ry,cy+rx*0.552, cx+ry,cy,
- cx+ry,cy-rx*0.552, cx+ry*0.552,cy-rx, cx,cy-rx,
- cx-ry*0.552,cy-rx, cx-ry,cy-rx*0.552, cx-ry,cy
- )
- return D
+ if 'cx' not in prp: cx=0.0
+ else : cx =float(prp['cx'])
+ if 'cy' not in prp: cy=0.0
+ else : cy =float(prp['cy'])
+ ry = float(prp['rx'])
+ rx = float(prp['ry'])
+ D=['M',str(cx),str(cy+rx),
+ 'C',str(cx-ry),str(cy+rx*0.552),str(cx-0.552*ry),str(cy+rx),str(cx),str(cy+rx),
+ 'C',str(cx+ry*0.552),str(cy+rx),str(cx+ry),str(cy+rx*0.552),str(cx+ry),str(cy),
+ 'C',str(cx+ry),str(cy-rx*0.552),str(cx+ry*0.552),str(cy-rx),str(cx),str(cy-rx),
+ 'C',str(cx-ry*0.552),str(cy-rx),str(cx-ry),str(cy-rx*0.552),str(cx-ry),str(cy),
+ 'z']
+ return D
+
#--------------------
# 0.4.2
+# 0.5.8, to remove exec
#--------------------
def line(prp):
- # -------------------------------------
- # is this exec safe
- # -------------------------------------
- exec """D=['M','%s','%s',
- 'L','%s','%s']"""%(prp['x1'],prp['y1'], prp['x2'],prp['y2'])
- return D
+ D=['M',str(prp['x1']),str(prp['y1']),
+ 'L',str(prp['x2']),str(prp['y2'])]
+ return D
+
#--------------------
# 0.4.2
+# 0.5.8, to remove exec
#--------------------
def polyline(prp):
- if 'points' in prp:
- #print prp['points']
- points=prp['points'].split(' ')
- #print points
- np=0
- for p in points:
- if p!='':
- p=p.split(',')
- if np==0:
- # -------------------------------------
- # is this exec safe
- # -------------------------------------
- exec "D=['M','%s','%s']"%(p[0],p[1])
- np+=1
- else:
- # -------------------------------------
- # is this exec safe
- # -------------------------------------
- exec """D.append('L');D.append('%s');D.append('%s')"""%(p[0],p[1])
- #print D
- return D
- else:
- return []
+ if 'points' in prp:
+ points=prp['points'].split(' ')
+ np=0
+ for p in points:
+ if p!='':
+ p=p.split(',')
+ if np==0:
+ D=['M',str(p[0]),str(p[1])]
+ np+=1
+ else:
+ D.append('L');D.append(str(p[0]));D.append(str(p[1]))
+ return D
+ else:
+ return []
#--------------------
# 0.4.2
+# 0.5.8, to remove exec
#--------------------
def polygon(prp):
- D=polyline(prp)
- if D!=[]:
- D.append('Z')
- return D
+ D=polyline(prp)
+ if D!=[]:
+ D.append('Z')
+ return D
+
+#--------------------
+# 0.5.8, to remove exec
+#--------------------
+OTHERSSHAPES={ 'rect' : rect,
+ 'line' : line,
+ 'polyline': polyline,
+ 'polygon' : polygon,
+ 'circle' : circle,
+ 'ellipse' : ellipse}
-
#--------------------
# 0.3.9
#--------------------
def calc_arc (cpx,cpy, rx, ry, ang, fa , fs , x, y) :
- """
- Calc arc paths
- """
- rx=abs(rx)
- ry=abs(ry)
- 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
- pl=px/(rx**2.0)+py/(ry**2.0 )
- if pl>1.0:
- pl=pl**0.5;rx*=pl;ry*=pl
- x0=(cos(ang)/rx)*cpx+(sin(ang)/rx)*cpy
- y0=(-sin(ang)/ry)*cpx+(cos(ang)/ry)*cpy
- x1=(cos(ang)/rx)*x+(sin(ang)/rx)*y
- y1=(-sin(ang)/ry)*x+(cos(ang)/ ry)*y
- d=(x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)
- if abs(d)>0.0 :sq=1.0/d-0.25
- else: sq=-0.25
- if sq<0.0 :sq=0.0
- sf=sq**0.5
- if fs==fa :sf=-sf
- xc=0.5*(x0+x1)-sf*(y1-y0)
- yc=0.5*(y0+y1)+sf*(x1-x0)
- ang_0=atan2(y0-yc,x0-xc)
- ang_1=atan2(y1-yc,x1-xc)
- ang_arc=ang_1-ang_0;
- if (ang_arc < 0.0 and fs==1) :
- ang_arc += 2.0 * PI
- elif (ang_arc>0.0 and fs==0) :
- ang_arc-=2.0*PI
- n_segs=int(ceil(abs(ang_arc*2.0/(PI*0.5+0.001))))
- P=[]
- for i in range(n_segs):
- ang0=ang_0+i*ang_arc/n_segs
- ang1=ang_0+(i+1)*ang_arc/n_segs
- ang_demi=0.25*(ang1-ang0)
- t=2.66666*sin(ang_demi)*sin(ang_demi)/sin(ang_demi*2.0)
- x1=xc+cos(ang0)-t*sin(ang0)
- y1=yc+sin(ang0)+t*cos(ang0)
- x2=xc+cos(ang1)
- y2=yc+sin(ang1)
- x3=x2+t*sin(ang1)
- y3=y2-t*cos(ang1)
- P.append([[(cos(ang)*rx)*x1+(-sin(ang)*ry)*y1,
- (sin(ang)*rx)*x1+(cos(ang)*ry)*y1],
- [(cos(ang)*rx)*x3+(-sin(ang)*ry)*y3,
- (sin(ang)*rx)*x3+(cos(ang)*ry)*y3],
- [(cos(ang)*rx)*x2+(-sin(ang)*ry)*y2,
- (sin(ang)*rx)*x2+(cos(ang)*ry)*y2]])
- return P
-
+ """
+ Calc arc paths
+ """
+ rx=abs(rx)
+ ry=abs(ry)
+ 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
+ pl=px/(rx**2.0)+py/(ry**2.0 )
+ if pl>1.0:
+ pl=pl**0.5;rx*=pl;ry*=pl
+ x0=(cos(ang)/rx)*cpx+(sin(ang)/rx)*cpy
+ y0=(-sin(ang)/ry)*cpx+(cos(ang)/ry)*cpy
+ x1=(cos(ang)/rx)*x+(sin(ang)/rx)*y
+ y1=(-sin(ang)/ry)*x+(cos(ang)/ ry)*y
+ d=(x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)
+ if abs(d)>0.0 :sq=1.0/d-0.25
+ else: sq=-0.25
+ if sq<0.0 :sq=0.0
+ sf=sq**0.5
+ if fs==fa :sf=-sf
+ xc=0.5*(x0+x1)-sf*(y1-y0)
+ yc=0.5*(y0+y1)+sf*(x1-x0)
+ ang_0=atan2(y0-yc,x0-xc)
+ ang_1=atan2(y1-yc,x1-xc)
+ ang_arc=ang_1-ang_0;
+ if (ang_arc < 0.0 and fs==1) :
+ ang_arc += 2.0 * PI
+ elif (ang_arc>0.0 and fs==0) :
+ ang_arc-=2.0*PI
+ n_segs=int(ceil(abs(ang_arc*2.0/(PI*0.5+0.001))))
+ P=[]
+ for i in xrange(n_segs):
+ ang0=ang_0+i*ang_arc/n_segs
+ ang1=ang_0+(i+1)*ang_arc/n_segs
+ ang_demi=0.25*(ang1-ang0)
+ t=2.66666*sin(ang_demi)*sin(ang_demi)/sin(ang_demi*2.0)
+ x1=xc+cos(ang0)-t*sin(ang0)
+ y1=yc+sin(ang0)+t*cos(ang0)
+ x2=xc+cos(ang1)
+ y2=yc+sin(ang1)
+ x3=x2+t*sin(ang1)
+ y3=y2-t*cos(ang1)
+ P.append([[(cos(ang)*rx)*x1+(-sin(ang)*ry)*y1,
+ (sin(ang)*rx)*x1+(cos(ang)*ry)*y1],
+ [(cos(ang)*rx)*x3+(-sin(ang)*ry)*y3,
+ (sin(ang)*rx)*x3+(cos(ang)*ry)*y3],
+ [(cos(ang)*rx)*x2+(-sin(ang)*ry)*y2,
+ (sin(ang)*rx)*x2+(cos(ang)*ry)*y2]])
+ return P
#--------------------
# 0.3.9
#--------------------
def curve_to_a(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])]
- if c[0]=='a':
- l[5]=l[5] + CP[0]
- l[6]=l[6] + CP[1]
-
- B=Bez()
- B.co=[ CP[0], CP[1], CP[0], CP[1], CP[0], CP[1] ]
- B.ha=['C','C']
- B.tag=c[0]
-
- 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
-
- 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]]
- B.ha=['C','C']
- B.tag=c[0]
- BP=curves.ITEM[n0].beziers_knot[-1]
- BP.co[2]=B.co[2]
- BP.co[3]=B.co[3]
- curves.ITEM[n0].beziers_knot.append(B)
-
- BP=curves.ITEM[n0].beziers_knot[-1]
- BP.co[2]=BP.co[0]
- BP.co[3]=BP.co[1]
-
- CP=[l[5], l[6]]
- return curves,n0,CP
+ 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])]
+ if c[0]=='a':
+ l[5]=l[5] + CP[0]
+ l[6]=l[6] + CP[1]
+ B=Bez()
+ B.co=[ CP[0], CP[1], CP[0], CP[1], CP[0], CP[1] ]
+ B.ha=['C','C']
+ B.tag=c[0]
+ 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
+ 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]]
+ B.ha=['C','C']
+ B.tag='C'
+ BP=curves.ITEM[n0].beziers_knot[-1]
+ BP.co[2]=B.co[2]
+ BP.co[3]=B.co[3]
+ curves.ITEM[n0].beziers_knot.append(B)
+ BP=curves.ITEM[n0].beziers_knot[-1]
+ BP.co[2]=BP.co[0]
+ BP.co[3]=BP.co[1]
+ CP=[l[5], l[6]]
+ return curves,n0,CP
def move_to(c, D, n0,CP, proprietes):
- global DEBUG,TAGcourbe
-
- #l=filter_DATA(c,D,2)
- l=[float(D[c[1]+1]),float(D[c[1]+2])]
-
- if c[0]=='m':
- l=[l[0]+CP[0],
- l[1] + CP[1]]
+ global DEBUG,TAGcourbe
+ 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]]
+ curves.ITEM[n0]=ITEM()
+ proprietes['n'].append(n0)
+ B=Bez()
+ 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
+ return curves,n0,CP
- if n0 in curves.ITEM:
- n0+=1
-
- CP=[l[0],l[1]]
- curves.ITEM[n0]=ITEM()
- curves.ITEM[n0].Origine=[l[0],l[1]]
-
- proprietes['n'].append(n0)
- #print 'prop et item',proprietes['n'], curves.ITEM.keys()
-
- B=Bez()
- B.co=[CP[0],CP[1],CP[0],CP[1],CP[0],CP[1]]
- #B.ha=[0,0]
- B.tag=c[0]
- curves.ITEM[n0].beziers_knot.append(B)
-
- if DEBUG==1: print curves.ITEM[n0], CP
-
- return curves,n0,CP
-
def close_z(c,D,n0,CP): #Z,z
- #print c, 'close'
- #print curves.ITEM[n0].beziers_knot
- curves.ITEM[n0].flagUV[0]=1
- #print 'len(curves.ITEM[n0].beziers_knot)',len(curves.ITEM[n0].beziers_knot)
- if len(curves.ITEM[n0].beziers_knot)>1:
- BP=curves.ITEM[n0].beziers_knot[-1]
- BP0=curves.ITEM[n0].beziers_knot[0]
- if BP.tag in ['c','C','s','S']:
- BP.co[2]=BP0.co[2] #4-5 point prec
- BP.co[3]=BP0.co[3]
- del curves.ITEM[n0].beziers_knot[0]
- else:
- del curves.ITEM[n0]
-
- n0-=1
- return curves,n0,CP
+ 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',]:
+ BP.co[2]=BP0.co[2] #4-5 point prec
+ BP.co[3]=BP0.co[3]
+ del curves.ITEM[n0].beziers_knot[0]
+ else:
+ del curves.ITEM[n0]
+ n0-=1
+ return curves,n0,CP
def curve_to_q(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]]
- B=Bez()
- B.co=[l[2], l[3], l[2], l[3], l[0], l[1]] #plus toucher au 2-3
- B.ha=['C','C']
- B.tag=c[0]
- BP=curves.ITEM[n0].beziers_knot[-1]
- 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)
- return curves,n0,CP
+ 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]]
+ B=Bez()
+ B.co=[l[2], l[3], l[2], l[3], l[0], l[1]] #plus toucher au 2-3
+ B.ha=['C','C']
+ B.tag=c[0]
+ BP=curves.ITEM[n0].beziers_knot[-1]
+ 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)
+ return curves,n0,CP
def curve_to_t(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]]
-
- B=Bez()
- B.co=[l[0], l[1], l[0], l[1], l[0], l[1]] #plus toucher au 2-3
- B.ha=['C','C']
- B.tag=c[0]
-
- BP=curves.ITEM[n0].beziers_knot[-1]
-
- l0=build_SYMETRIC([BP.co[0],BP.co[1],BP.co[4],BP.co[5]])
-
- if BP.tag in ['q','Q','t','T','m','M']:
- 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)
- return curves,n0,CP
+ l=[float(D[c[1]+1]),float(D[c[1]+2])]
+ if c[0]=='t':
+ l=[l[0]+CP[0], l[1]+CP[1]]
+ B=Bez()
+ B.co=[l[0], l[1], l[0], l[1], l[0], l[1]] #plus toucher au 2-3
+ B.ha=['C','C']
+ B.tag=c[0]
+ BP=curves.ITEM[n0].beziers_knot[-1]
+ l0=build_SYMETRIC([BP.co[0],BP.co[1],BP.co[4],BP.co[5]])
+ if BP.tag in ['q','Q','t','T','m','M']:
+ 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)
+ return curves,n0,CP
#--------------------
# 0.4.3 : rewritten
#--------------------
def build_SYMETRIC(l):
- X=l[2]-(l[0]-l[2])
- Y=l[3]-(l[1]-l[3])
- return X,Y
+ X=l[2]-(l[0]-l[2])
+ Y=l[3]-(l[1]-l[3])
+ return X,Y
def curve_to_s(c,D,n0,CP): #S,s
- l=[float(D[c[1]+1]),
- float(D[c[1]+2]),
- float(D[c[1]+3]),
- float(D[c[1]+4])]
- if c[0]=='s':
- l=[l[0]+CP[0], l[1]+CP[1],
- l[2]+CP[0], l[3]+CP[1]]
- B=Bez()
- B.co=[l[2],l[3],l[2],l[3],l[0],l[1]] #plus toucher au 2-3
- B.ha=['C','C']
- B.tag=c[0]
- BP=curves.ITEM[n0].beziers_knot[-1]
- #--------------------
- # 0.4.3
- #--------------------
- 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)
- return curves,n0,CP
-
+ l=[float(D[c[1]+1]),
+ float(D[c[1]+2]),
+ float(D[c[1]+3]),
+ float(D[c[1]+4])]
+ if c[0]=='s':
+ l=[l[0]+CP[0], l[1]+CP[1],
+ l[2]+CP[0], l[3]+CP[1]]
+ B=Bez()
+ B.co=[l[2],l[3],l[2],l[3],l[0],l[1]] #plus toucher au 2-3
+ B.ha=['C','C']
+ B.tag=c[0]
+ BP=curves.ITEM[n0].beziers_knot[-1]
+ #--------------------
+ # 0.4.3
+ #--------------------
+ 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)
+ return curves,n0,CP
+
def curve_to_c(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':
- l=[l[0]+CP[0],
- l[1]+CP[1],
- l[2]+CP[0],
- l[3]+CP[1],
- l[4]+CP[0],
- l[5]+CP[1]]
- B=Bez()
- B.co=[l[4],
- l[5],
- l[4],
- 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]
- BP.co[2]=l[0]
- BP.co[3]=l[1]
- 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)
- return curves,n0,CP
-
-
+ 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':
+ l=[l[0]+CP[0],
+ l[1]+CP[1],
+ l[2]+CP[0],
+ l[3]+CP[1],
+ l[4]+CP[0],
+ l[5]+CP[1]]
+ B=Bez()
+ B.co=[l[4],
+ l[5],
+ l[4],
+ 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]
+ BP.co[2]=l[0]
+ 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)
+ 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])]
- if c[0]=='l':
- l=[l[0]+CP[0],
- l[1]+CP[1]]
- B=Bez()
- B.co=[l[0],l[1],l[0],l[1],l[0],l[1]]
- #B.ha=[0,0]
- B.ha[1]='L'
- B.tag=c[0]
- BP=curves.ITEM[n0].beziers_knot[-1]
-
- #if BP.tag in ['c','C','s','S','m','M']:
- if BP.tag in ['c','C','s','S']:
- BP.co[2]=B.co[4]
- BP.co[3]=B.co[5]
- elif BP.tag in ['v','V','l','L','H','h']:
- BP.ha[0]='L'
-
- curves.ITEM[n0].beziers_knot.append(B)
- CP=[B.co[0],B.co[1]]
- 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
- return curves,n0,CP
-
-
+ l=[float(D[c[1]+1]),float(D[c[1]+2])]
+ if c[0]=='l':
+ l=[l[0]+CP[0],
+ l[1]+CP[1]]
+ B=Bez()
+ 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]]
+ 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
+ return curves,n0,CP
+
def draw_line_h(c,D,n0,CP): #H,h
- if c[0]=='h':
- l=[float(D[c[1]+1])+float(CP[0]),CP[1]]
- else:
- l=[float(D[c[1]+1]),CP[1]]
-
- B=Bez()
- B.co=[l[0],l[1],l[0],l[1],l[0],l[1]]
- B.ha[1]='L'
- B.tag=c[0]
- BP=curves.ITEM[n0].beziers_knot[-1]
- if BP.tag in ['c','C','s','S','m','M']:
- BP.co[2]=B.co[4]
- BP.co[3]=B.co[5]
- elif BP.tag in ['v','V','l','L','H','h']:
- BP.ha[0]='L'
-
- curves.ITEM[n0].beziers_knot.append(B)
- CP=[l[0],l[1]]
- return curves,n0,CP
+ if c[0]=='h':
+ l=[float(D[c[1]+1])+float(CP[0]),CP[1]]
+ else:
+ l=[float(D[c[1]+1]),CP[1]]
+ B=Bez()
+ 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[0]='L'
+ curves.ITEM[n0].beziers_knot.append(B)
+ CP=[l[0],l[1]]
+ return curves,n0,CP
def draw_line_v(c,D,n0,CP): #V, v
- if c[0]=='v':
- l=[CP[0], float(D[c[1]+1])+CP[1]]
- else:
- l=[CP[0], float(D[c[1]+1])]
- B=Bez()
- B.co=[l[0],l[1],l[0],l[1],l[0],l[1]]
- B.ha[1]='L'
- B.tag=c[0]
- BP=curves.ITEM[n0].beziers_knot[-1]
- if BP.tag in ['c','C','s','S','m','M']:
- BP.co[2]=B.co[4]
- BP.co[3]=B.co[5]
- elif BP.tag in ['v','V','l','L','H','h']:
- BP.ha[0]='L'
-
- curves.ITEM[n0].beziers_knot.append(B)
- CP=[l[0],l[1]]
- return curves,n0,CP
-
+ if c[0]=='v':
+ l=[CP[0], float(D[c[1]+1])+CP[1]]
+ else:
+ l=[CP[0], float(D[c[1]+1])]
+
+ B=Bez()
+ 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[0]='L'
+ curves.ITEM[n0].beziers_knot.append(B)
+ CP=[l[0],l[1]]
+ return curves,n0,CP
+
Actions= { "C" : curve_to_c,
- "A" : curve_to_a,
- "S" : curve_to_s,
- "M" : move_to,
- "V" : draw_line_v,
- "L" : draw_line_l,
- "H" : draw_line_h,
- "Z" : close_z,
- "Q" : curve_to_q,
- "T" : curve_to_t,
-
- "c" : curve_to_c,
- "a" : curve_to_a,
- "s" : curve_to_s,
- "m" : move_to,
- "v" : draw_line_v,
- "l" : draw_line_l,
- "h" : draw_line_h,
- "z" : close_z,
- "q" : curve_to_q,
- "T" : curve_to_t
+ "A" : curve_to_a,
+ "S" : curve_to_s,
+ "M" : move_to,
+ "V" : draw_line_v,
+ "L" : draw_line_l,
+ "H" : draw_line_h,
+ "Z" : close_z,
+ "Q" : curve_to_q,
+ "T" : curve_to_t,
+
+ "c" : curve_to_c,
+ "a" : curve_to_a,
+ "s" : curve_to_s,
+ "m" : move_to,
+ "v" : draw_line_v,
+ "l" : draw_line_l,
+ "h" : draw_line_h,
+ "z" : close_z,
+ "q" : curve_to_q,
+ "T" : curve_to_t
}
TAGcourbe=Actions.keys()
TAGtransform=['M','L','C','S','H','V','T','Q']
tagTRANSFORM=0
-def wash_DATA(ndata):
-
- if ndata!='':
- if DEBUG==1: print ndata
- while ndata[0]==' ':
- ndata=ndata[1:]
- while ndata[-1]==' ':
- ndata=ndata[:-1]
- if ndata[0]==',':ndata=ndata[1:]
- if ndata[-1]==',':ndata=ndata[:-1]
- #--------------------
- # 0.4.0 : 'e'
- #--------------------
- if ndata.find('-')!=-1 and ndata[ndata.find('-')-1] not in [' ', ',', 'e']:
- ndata=ndata.replace('-',',-')
- ndata=ndata.replace(',,',',')
- ndata=ndata.replace(' ',',')
- ndata=ndata.split(',')
- for n in ndata :
- if n=='' : ndata.remove(n)
- return ndata
+def wash_DATA(ndata):
+ if ndata:
+ if DEBUG==1: print 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('-',',-')
+ ndata=ndata.replace(',,',',')
+ ndata=ndata.replace(' ',',')
+ ndata=ndata.split(',')
+ ndata=[i for i in ndata if i] #059a
+
+ return ndata
#--------------------
# 0.3.4 : - read data rewrittten
#--------------------
def list_DATA(DATA):
- """
- This function return a list of correct commands
- with the right number of waited values
- for each of them . For example :
- d="'M0,14.0 z" becomes ['M','0.0','14.0','z']
- """
- # ----------------------------------------
- # 1 / repre la position des differents tag
- # ----------------------------------------
- tagplace=[]
-
- # ----------------------------------------
- # construire une liste avec chaque emplacement
- # ----------------------------------------
- for d in Actions.keys():
- b1=0
- b2=len(DATA)
- while DATA.find(d,b1,b2)!=-1 :
- tagplace.append(DATA.find(d,b1,b2))
- b1=DATA.find(d,b1,b2)+1
- # ----------------------------------------
- # reset the list in the presentation order
- # of the data
- # ----------------------------------------
- tagplace.sort()
-
- tpn=range(len(tagplace))
- #--------------------
- # 0.3.5 :: short data, only one tag
- #--------------------
- if len(tagplace)-1>0:
- DATA2=[]
- 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)
- for n in ndata : DATA2.append(n)
- DATA2.append(DATA[tagplace[t+1]:tagplace[t+1]+1])
+ """
+ This function translate a text in a list of
+ correct commandswith the right number of waited
+ values for each of them . For example :
+ d="'M0,14.0 z" becomes ['M','0.0','14.0','z']
+ """
+ # ----------------------------------------
+ # borner les differents segments qui devront etre
+ # traites
+ # pour cela construire une liste avec chaque
+ # la position de chaqe emplacement tag de type
+ # commande path...
+ # ----------------------------------------
+ tagplace=[]
+ for d in Actions:
+ b1=0
+ while True:
+ i = DATA.find(d,b1)
+ if i==-1: break
+ tagplace.append(i)
+ b1=i+1
+ #------------------------------------------
+ # cette liste doit etre traites dans l'ordre
+ # d'apparition des tags
+ #------------------------------------------
+ tagplace.sort()
+
+ tpn=range(len(tagplace))
+ #--------------------
+ # 0.3.5 :: short data, only one tag
+ #--------------------
+ if len(tagplace)-1>0:
+ DATA2=[]
+ 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
+ #--------------------
+ DATA2=[]
+ DATA2.append(DATA[tagplace[0]:tagplace[0]+1])
+ ndata=DATA[tagplace[0]+1:]
+ ndata=wash_DATA(ndata)
+ DATA2.extend(ndata)
+ return DATA2
- 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)
- for n in ndata : DATA2.append(n)
- else:
- #--------------------
- # 0.3.5 : short data,only one tag
- #--------------------
- DATA2=[]
- DATA2.append(DATA[tagplace[0]:tagplace[0]+1])
- ndata=DATA[tagplace[0]+1:]
- ndata=wash_DATA(ndata)
- for n in ndata : DATA2.append(n)
- return DATA2
-
+#----------------------------------------------
# 0.3
-def translate(tx=None,ty=None):
- return [1, 0, tx], [0, 1, ty],[0,0,1]
+# 0.5.8, to remove exec
+#----------------------------------------------
+def translate(t):
+ tx=t[0]
+ ty=t[1]
+ return [1, 0, tx], [0, 1, ty],[0,0,1]
+
+#----------------------------------------------
# 0.3.2
-def scale(sx=None,sy=None):
- if sy==None: sy=sx
- return [sx, 0, 0], [0, sy, 0],[0,0,1]
+# 0.5.8, to remove exec
+#----------------------------------------------
+def scale(s):
+ sx=s[0]
+ if len(s)>1: sy=s[1]
+ else: sy=sx
+ return [sx, 0, 0], [0, sy, 0],[0,0,1]
+
+#----------------------------------------------
# 0.4.1 : transslate a in radians
-def rotate(a):
- return [cos(a*3.1416/90.0), -sin(a*3.1416/90.0), 0], [sin(a*3.1416/90.0), cos(a*3.1416/90.0),0],[0,0,1]
+# 0.5.8, to remove exec
+#----------------------------------------------
+def rotate(t):
+ a=t[0]
+ return [cos(a*3.1416/180.0), -sin(a*3.1416/180.0), 0], [sin(a*3.1416/180.0), cos(a*3.1416/180.0),0],[0,0,1]
+
+#----------------------------------------------
# 0.3.2
-def skewX(a):
- return [1, tan(a), 0], [0, 1, 0],[0,0,1]
+# 0.5.8, to remove exec
+#----------------------------------------------
+def skewx(t):
+ a=t[0]
+ return [1, tan(a*3.1416/180.0), 0], [0, 1, 0],[0,0,1]
+
+#----------------------------------------------
# 0.4.1
-def skewY(a):
- return [1, 0, 0], [tan(a), 1 , 0],[0,0,1]
+# 0.5.8, to remove exec
+#----------------------------------------------
+def skewy(t):
+ a=t[0]
+ return [1, 0, 0], [tan(a*3.1416/180.0), 1 , 0],[0,0,1]
+
+#----------------------------------------------
# 0.3.2
-def matrix(a,b,c,d,e,f):
- return [a,c,e],[b,d,f],[0,0,1]
+# 0.5.8, to remove exec
+#----------------------------------------------
+def matrix(t):
+ a,b,c,d,e,f=t
+ return [a,c,e],[b,d,f],[0,0,1]
+#--------------------
+# 0.5.8, to remove exec
+#--------------------
+matrixTRANSFORM={ 'translate':translate,
+ 'scale':scale,
+ 'rotate':rotate,
+ 'skewx':skewx,
+ 'skewy':skewy,
+ 'matrix':matrix
+ }
+
+#----------------------------------------------
# 0.4.2 : rewritten
+# 0.5.8 : to remove exec uses.
+#----------------------------------------------
def control_CONTAINT(txt):
- """
- the transforms' descriptions can be sole or several
- and separators might be forgotten
- """
- t0=0
- tlist=[]
- while txt.count(')',t0)>0:
- t1=txt.find(')',t0)
- nt0=txt[t0:t1+1]
- t2=nt0[nt0.find('(')+1:-1]
- val=nt0[:nt0.find('(')]
- while t2.find(' ')!=-1:
- t2=t2.replace(' ',' ')
- t2=t2.replace(' ',',')
- if t2.find('e'):
- t3=t2.split(',')
- t2=''
- for t in t3 :
- t=str(float(t))
- t2=str(t3).replace(']','').replace('[','').replace('\'','')
- if val=='rotate' :
- t3=t2.split(',')
- if len(t3)==3:
- tlist.append('translate('+t3[1]+','+t3[2]+')')
- tlist.append('rotate('+t3[0]+')')
- tlist.append('translate(-'+t3[1]+',-'+t3[2]+')')
- else:
- tlist.append(val+'('+t2+')')
- t0=t1+1
- return tlist
+ """
+ the transforms' descriptions can be sole or several
+ and separators might be forgotten
+ """
+ t0=0
+ tlist=[]
+ while txt.count(')',t0)>0:
+ t1=txt.find(')',t0)
+ nt0=txt[t0:t1+1]
+ t2=nt0[nt0.find('(')+1:-1]
+ val=nt0[:nt0.find('(')]
+ while t2.find(' ')!=-1:
+ t2=t2.replace(' ',' ')
+ 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' :
+ t3=t2
+ if len(t3)==3:
+ tlist.append(['translate',[t3[1],t3[2]]])
+ tlist.append(['rotate',[t3[0]/180.0*3.1416]])
+ tlist.append(['translate',[-t3[1],-t3[2]]])
+ else:
+ tlist.append(['rotate',[t3[0]]])
+ else:
+ tlist.append([val,t2])
+ t0=t1+1
+ return tlist
def curve_FILL(Courbe,proprietes):
- for n in proprietes['n']:
- if n in Courbe and proprietes['style'].find('fill:#')>-1:
- Courbe[n].fill=1
+ for n in proprietes['n']:
+ if n in Courbe and 'fill:#' in proprietes['style']:
+ Courbe[n].fill=1
+#----------------------------------------------
# 0.4.1 : apply transform stack
+#----------------------------------------------
def curve_TRANSFORM(Courbe,proprietes):
- # 1/ unpack the STACK
- # create a matrix for each transform
- ST=[]
- #print proprietes['stack']
- for st in proprietes['stack'] :
- if st and type(st)==list:
- for t in st:
- # -------------------------------------
- # this exec is safe, control_CONTAINT can't return a python function
- # -------------------------------------
- exec "a,b,c=%s;T=Mathutils.Matrix(a,b,c)"%control_CONTAINT(t)[0]
- ST.append(T)
- elif st :
- # -------------------------------------
- # this exec is safe, control_CONTAINT can't return a python function
- # -------------------------------------
- exec "a,b,c=%s;T=Mathutils.Matrix(a,b,c)"%control_CONTAINT(st)[0]
- ST.append(T)
- if 'transform' in proprietes:
- for trans in control_CONTAINT(proprietes['transform']):
- # -------------------------------------
- # this exec is safe, control_CONTAINT can't return a python function
- # -------------------------------------
- exec """a,b,c=%s;T=Mathutils.Matrix(a,b,c)"""%trans
- ST.append(T)
- #print ST
- ST.reverse()
- for n in proprietes['n']:
- if n in Courbe:
- for bez0 in Courbe[n].beziers_knot:
- bez=bez0.co
- for b in [0,2,4]:
- for t in ST:
- v=Mathutils.Vector([bez[b],bez[b+1],1.0])
- #v=Mathutils.MatMultVec(t, v)
- v=t * v
- bez[b]=v[0]
- bez[b+1]=v[1]
+ # 1/ unpack the STACK
+ # create a matrix for each transform
+ ST=[]
+ for st in proprietes['stack'] :
+ if st and type(st)==list:
+ for t in st:
+ code = control_CONTAINT(t)
+ a,b,c=matrixTRANSFORM[code[0][0]](code[0][1][:])
+ T=Mathutils.Matrix(a,b,c)
+ ST.append(T)
+ elif st :
+ code = control_CONTAINT(st)
+ a,b,c=matrixTRANSFORM[code[0][0]](code[0][1][:])
+ T=Mathutils.Matrix(a,b,c)
+ ST.append(T)
+ if 'transform' in proprietes:
+ for trans in control_CONTAINT(proprietes['transform']):
+ #--------------------
+ # 0.5.8, to remove exec
+ #--------------------
+ a,b,c=matrixTRANSFORM[trans[0].strip()](trans[1][:]) #059
+ T=Mathutils.Matrix(a,b,c)
+ ST.append(T)
+ ST.reverse()
+ for n in proprietes['n']:
+ if n in Courbe:
+ for bez0 in Courbe[n].beziers_knot:
+ bez=bez0.co
+ for b in [0,2,4]:
+ for t in ST:
+ v=t * Mathutils.Vector([bez[b],bez[b+1],1.0]) #059a
+ bez[b]=v[0]
+ bez[b+1]=v[1]
def filter(d):
- for nn in d:
- if '0123456789.'.find(nn)==-1:
- d=d.replace(nn,"")
- return d
+ for nn in d:
+ if nn not in '0123456789.': #059a
+ d=d.replace(nn,"")
+ return d
def get_BOUNDBOX(BOUNDINGBOX,SVG):
- if 'viewbox' not in SVG:
- h=float(filter(SVG['height']))
- if DEBUG==1 : print 'h : ',h
- w=float(filter(SVG['width']))
- if DEBUG==1 : print 'w :',w
- BOUNDINGBOX['rec']=[0.0,0.0,w,h]
- r=BOUNDINGBOX['rec']
- BOUNDINGBOX['coef']=w/h
- else:
- viewbox=SVG['viewbox'].split()
- BOUNDINGBOX['rec']=[float(viewbox[0]),float(viewbox[1]),float(viewbox[2]),float(viewbox[3])]
- r=BOUNDINGBOX['rec']
- BOUNDINGBOX['coef']=(r[2]-r[0])/(r[3]-r[1])
- return BOUNDINGBOX
-
+ if 'viewbox' not in SVG:
+ h=float(filter(SVG['height']))
+ if DEBUG==1 : print 'h : ',h
+ w=float(filter(SVG['width']))
+ if DEBUG==1 : print 'w :',w
+ BOUNDINGBOX['rec']=[0.0,0.0,w,h]
+ r=BOUNDINGBOX['rec']
+ BOUNDINGBOX['coef']=w/h
+ else:
+ viewbox=SVG['viewbox'].split()
+ BOUNDINGBOX['rec']=[float(viewbox[0]),float(viewbox[1]),float(viewbox[2]),float(viewbox[3])]
+ r=BOUNDINGBOX['rec']
+ BOUNDINGBOX['coef']=(r[2]-r[0])/(r[3]-r[1])
+ return BOUNDINGBOX
+
+#----------------------------------------------
# 0.4.1 : attributs ex : 'id=', 'transform=', 'd=' ...
+#----------------------------------------------
def collect_ATTRIBUTS(data):
- #----------------------------------------------
- # 0.4.8 : short modif for a fantasy font case
- # in the OOo svg format ('viewbox' is
- # written 'viewBox', for instance)
- #----------------------------------------------
- data=data.replace(' ',' ').lower()
- ELEM={'TYPE':data[1:data.find(' ')]}
- t1=len(data)
- t2=0
- ct=data.count('="')
- while ct>0:
- t0=data.find('="',t2)
- t2=data.find(' ',t2)+1
- id=data[t2:t0]
- t2=data.find('"',t0+2)
- if id!='d':
- ELEM[id]=data[t0+2:t2].replace('\\','/')
- else:
- #print ELEM, id
- ELEM[id]=[]
- ELEM[id].append(t0+2)
- ELEM[id].append(t2)
- ct=data.count('="',t2)
- return ELEM
+ #----------------------------------------------
+ # 0.4.8 : short modif for a fantasy font case
+ # in the OOo svg format ('viewbox' is
+ # written 'viewBox', for instance)
+ #----------------------------------------------
+ data=data.replace(' ',' ').lower()
+ ELEM={'TYPE':data[1:data.find(' ')]}
+ t1=len(data)
+ t2=0
+ ct=data.count('="')
+ while ct>0:
+ t0=data.find('="',t2)
+ t2=data.find(' ',t2)+1
+ id=data[t2:t0]
+ t2=data.find('"',t0+2)
+ if id!='d':
+ ELEM[id]=data[t0+2:t2].replace('\\','/')
+ else:
+ ELEM[id]=[]
+ ELEM[id].append(t0+2)
+ ELEM[id].append(t2)
+ ct=data.count('="',t2)
+ return ELEM
# --------------------------------------------
# 0.4.1 : to avoid to use sax and ths xml
# tools of the complete python
# --------------------------------------------
def build_HIERARCHY(t):
- global CP, curves, SCALE, DEBUG, BOUNDINGBOX, scale_, tagTRANSFORM
- TRANSFORM=0
- t=t.replace('\t',' ')
- while t.find(' ')!=-1:
- t=t.replace(' ',' ')
- n0=0
- t0=t1=0
- baliste=[]
- balisetype=['?','?','/','/','!','!']
- BALISES=['D', #DECL_TEXTE',
- 'D', #DECL_TEXTE',
- 'F', #FERMANTE',
- 'E', #ELEM_VIDE',
- 'd', #DOC',
- 'R', #REMARQUES',
- 'C', #CONTENU',
- 'O' #OUVRANTE'
- ]
- STACK=[]
- while t1<len(t) and t0>-1:
- t0=t.find('<',t0)
- t1=t.find('>',t0)
- ouvrante=0
- #--------------------
- # 0.4.4 , add 'else:' and 'break' to the 'if' statement
- #--------------------
- if t0>-1 and t1>-1:
- if t[t0+1] in balisetype:
- b=balisetype.index(t[t0+1])
- if t[t0+2]=='-':
- b=balisetype.index(t[t0+1])+1
- balise=BALISES[b]
- if b==2:
- parent=STACK.pop(-1)
- if parent!=None and TRANSFORM>0:
- TRANSFORM-=1
- elif t[t1-1] in balisetype:
- balise=BALISES[balisetype.index(t[t1-1])+1]
- else:
- t2=t.find(' ',t0)
- if t2>t1: t2=t1
- ouvrante=1
- NOM=t[t0+1:t2]
- if t.find('</'+NOM)>-1:
- balise=BALISES[-1]
- else:
- balise=BALISES[-2]
- if balise=='E' or balise=='O':
- proprietes=collect_ATTRIBUTS(t[t0:t1+ouvrante])
- if balise=='O' and 'transform' in proprietes:
- STACK.append(proprietes['transform'])
- TRANSFORM+=1
- elif balise=='O' :
- STACK.append(None)
- proprietes['stack']=STACK[:]
- D=[]
- 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])
- elif proprietes['TYPE'] in OTHERSSHAPES:
- # ----------------------------------------------------------
- # Use of exec is safe prop can only be 'rect','line', 'polyline',
- # 'polygon','circle' or 'ellipse'
- # ----------------------------------------------------------
- exec "D=%s(proprietes)"% proprietes['TYPE']
- if len(D)>0:
- cursor=0
- proprietes['n']=[]
- for cell in D:
- if DEBUG==2 : print 'cell : ',cell ,' --'
- if len(cell)>=1 and cell[0] in TAGcourbe:
- prop=''
- if cell[0] in ['m','M']:
- prop=',proprietes'
- # ----------------------------------------------------------
- # Use of exec is safe prop can only be :'' or ',proprietes'
- # ----------------------------------------------------------
- exec """curves,n0,CP=Actions[cell]([cell,cursor], D, n0,CP%s)"""%prop
- cursor+=1
- if TRANSFORM>0 or 'transform' in proprietes :
- curve_TRANSFORM(curves.ITEM,proprietes)
- if 'style' in proprietes :
- curve_FILL(curves.ITEM,proprietes)
-
- elif proprietes['TYPE'] in ['svg'] :
- #print 'proprietes.keys()',proprietes.keys()
- BOUNDINGBOX = get_BOUNDBOX(BOUNDINGBOX,proprietes)
- else:
- #--------------------
- # 0.4.4
- #--------------------
- break
- t1+=1
- t0=t1
-
-def scan_FILE(nom):
- global CP, curves, SCALE, DEBUG, BOUNDINGBOX, scale_, tagTRANSFORM
- dir,name=split(nom)
- name=name.split('.')
- result=0
- Choise=1
- t1=Blender.sys.time()
- t=filterFILE(nom)
- if t!='false':
- Blender.Window.EditMode(0)
- if not SHARP_IMPORT:
- warning = "Select Size : %t| As is %x1 | Scale on Height %x2| Scale on Width %x3"
- scale_ = Blender.Draw.PupMenu(warning)
- t1=Blender.sys.time()
- # 0.4.1 : to avoid to use sax and the xml
- # tools of the complete python
- build_HIERARCHY(t)
- r=BOUNDINGBOX['rec']
- if scale_==1:
- SCALE=1.0
- elif scale==2:
- SCALE=r[2]-r[0]
- elif scale_==3:
- SCALE=r[3]-r[1]
-
- curves.number_of_items=len(curves.ITEM)
- for k, val in curves.ITEM.iteritems():
- val.pntsUV[0] =len(val.beziers_knot)
-
- if curves.number_of_items>0 and Choise==1 :
- #--------------------
- # 0.4.5 and 0.4.9
- #--------------------
- createCURVES(curves, name[0])
- else:
- pass
-
- print ' elapsed time : ',Blender.sys.time()-t1
- Blender.Redraw()
+ global CP, curves, SCALE, DEBUG, BOUNDINGBOX, scale_, tagTRANSFORM
+
+ TRANSFORM=0
+ t=t.replace('\t',' ')
+ while t.find(' ')!=-1: t=t.replace(' ',' ')
+ n0=0
+ t0=t1=0
+ baliste=[]
+ balisetype=['?','?','/','/','!','!']
+ BALISES=['D', #DECL_TEXTE',
+ 'D', #DECL_TEXTE',
+ 'F', #FERMANTE',
+ 'E', #ELEM_VIDE',
+ 'd', #DOC',
+ 'R', #REMARQUES',
+ 'C', #CONTENU',
+ 'O' #OUVRANTE'
+ ]
+ STACK=[]
+ while t1<len(t) and t0>-1:
+ t0=t.find('<',t0)
+ t1=t.find('>',t0)
+ ouvrante=0
+ #--------------------
+ # 0.4.4 , add 'else:' and 'break' to the 'if' statement
+ #--------------------
+ if t0>-1 and t1>-1:
+ if t[t0+1] in balisetype:
+ b=balisetype.index(t[t0+1])
+ if t[t0+2]=='-':
+ b=balisetype.index(t[t0+1])+1
+ #print t[t0:t1]
+ balise=BALISES[b]
+ if b==2:
+ parent=STACK.pop(-1)
+ if parent!=None and TRANSFORM>0:
+ TRANSFORM-=1
+ elif t[t1-1] in balisetype:
+ balise=BALISES[balisetype.index(t[t1-1])+1]
+ else:
+ t2=t.find(' ',t0)
+ if t2>t1: t2=t1
+ ouvrante=1
+ NOM=t[t0+1:t2]
+ if '</'+NOM in t: #.find('</'+NOM)>-1:
+ balise=BALISES[-1]
+ else:
+ balise=BALISES[-2]
+ if balise=='E' or balise=='O':
+ proprietes=collect_ATTRIBUTS(t[t0:t1+ouvrante])
+ if balise=='O' and 'transform' in proprietes:
+ STACK.append(proprietes['transform'])
+ TRANSFORM+=1
+ elif balise=='O' :
+ STACK.append(None)
+ proprietes['stack']=STACK[:]
+ D=[]
+ 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])
+ elif proprietes['TYPE'] in OTHERSSHAPES:
+ #--------------------
+ # 0.5.8, to remove exec
+ #--------------------
+ D=OTHERSSHAPES[proprietes['TYPE']](proprietes)
+ if len(D)>0:
+ cursor=0
+ proprietes['n']=[]
+ for cell in D:
+ if DEBUG==2 : print 'cell : ',cell ,' --'
+ if len(cell)>=1 and cell[0] in TAGcourbe:
+ #--------------------
+ # 0.5.8, to remove exec
+ #--------------------
+ if cell[0] in ['m','M']:
+ curves,n0,CP=Actions[cell]([cell,cursor], D, n0,CP,proprietes)
+ else:
+ curves,n0,CP=Actions[cell]([cell,cursor], D, n0,CP)
+ cursor+=1
+ if TRANSFORM>0 or 'transform' in proprietes :
+ curve_TRANSFORM(curves.ITEM,proprietes)
+ if 'style' in proprietes :
+ curve_FILL(curves.ITEM,proprietes)
+ elif proprietes['TYPE'] in ['svg'] :
+ #print 'proprietes.keys()',proprietes.keys()
+ BOUNDINGBOX = get_BOUNDBOX(BOUNDINGBOX,proprietes)
+ else:
+ #--------------------
+ # 0.4.4
+ #--------------------
+ break
+ t1+=1
+ t0=t1
+def scan_FILE(nom):
+ global CP, curves, SCALE, DEBUG, BOUNDINGBOX, scale_, tagTRANSFORM
+ dir,name=split(nom)
+ name=name.split('.')
+ result=0
+ #Choise=1
+ t1=Blender.sys.time()
+ t=filterFILE(nom)
+ if t!='false':
+ Blender.Window.EditMode(0)
+ if not SHARP_IMPORT:
+ warning = "Select Size : %t| Scale on Width %x1| Scale on Height %x2| As is (caution may be large) %x3"
+ scale_ = Blender.Draw.PupMenu(warning)
+ t1=Blender.sys.time()
+ # 0.4.1 : to avoid to use sax and the xml
+ # tools of the complete python
+ build_HIERARCHY(t)
+ 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)
+ for k, val in curves.ITEM.iteritems():
+ val.pntsUV[0] =len(val.beziers_knot)
+ if curves.number_of_items>0 : #and Choise==1 :
+ #--------------------
+ # 0.4.5 and 0.4.9
+ #--------------------
+ createCURVES(curves, name[0])
+ else:
+ pass
+ print ' elapsed time : ',Blender.sys.time()-t1
+ Blender.Redraw()
#=====================================================================
#====================== SVG format mouvements ========================
#=====================================================================
def functionSELECT(nom):
- scan_FILE(nom)
+ scan_FILE(nom)
if __name__=='__main__':
- Blender.Window.FileSelector (functionSELECT, 'SELECT a .SVG FILE') \ No newline at end of file
+ Blender.Window.FileSelector (functionSELECT, 'SELECT an .SVG FILE', '*.svg') \ No newline at end of file