From 62147bba3030ed79dd37a7d7f63d031ff263570e Mon Sep 17 00:00:00 2001 From: Willian Padovani Germano Date: Mon, 21 Mar 2005 05:26:52 +0000 Subject: Scripts (making some changes to the scripts dir): - moved bpydata/ to scripts/bpydata/ and added a config/ subdir to it; - created scripts/bpymodules for py modules (also got rid of those "mod_"'s appended to the files); - updated scripts accordingly. This will require you to "reinstall" (just copy the scripts/ dir over your older one) if you have a .blender/scripts/ dir somewhere. Otherwise some scripts won't work. You can use the updated "Help->System->System Information" script here to check all is fine. An installer script yet to be written will help users with these issues, specially to make the user defined dir have the same structure expected from the default scripts dir, so the basic facilities (module search; saved config data; scripts: installer, help browser, config editor) are also available for a user's own collection of written and downloaded scripts. BPython: - slikdigit's crash was because he had no /.blender/: proper check added and also now if all else fails the /release/scripts/ dir is also searched for scripts. All this registration dirs stuff is a little messy (installation!), so please report any troubles (I only tested on linux). - slight change in error report in BPY_interface.c's BPY_menu_do_python; remembering to set globaldict pointer to NULL there, too. - moved bpy_gethome() to EXPP_interface.[ch] - "//" as user defined python dir is ignored while looking for scripts, considering it's only a default some users use, not really meant for a scripts dir. --- release/scripts/bpydata/KUlang.txt | 121 ++++++ release/scripts/bpydata/config/readme.txt | 10 + release/scripts/bpydata/readme.txt | 9 + release/scripts/bpymodules/BPyBlender.py | 37 ++ release/scripts/bpymodules/ai2obj.py | 382 +++++++++++++++++ release/scripts/bpymodules/eps2obj.py | 390 ++++++++++++++++++ release/scripts/bpymodules/gimp2obj.py | 320 +++++++++++++++ release/scripts/bpymodules/meshtools.py | 331 +++++++++++++++ release/scripts/bpymodules/svg2obj.py | 660 ++++++++++++++++++++++++++++++ release/scripts/lightwave_export.py | 60 +-- release/scripts/lightwave_import.py | 14 +- release/scripts/mod_ai2obj.py | 382 ----------------- release/scripts/mod_blender.py | 37 -- release/scripts/mod_eps2obj.py | 390 ------------------ release/scripts/mod_gimp2obj.py | 320 --------------- release/scripts/mod_meshtools.py | 331 --------------- release/scripts/mod_svg2obj.py | 660 ------------------------------ release/scripts/nendo_export.py | 10 +- release/scripts/nendo_import.py | 18 +- release/scripts/off_export.py | 8 +- release/scripts/off_import.py | 10 +- release/scripts/paths_import.py | 10 +- release/scripts/radiosity_export.py | 14 +- release/scripts/radiosity_import.py | 10 +- release/scripts/raw_export.py | 4 +- release/scripts/raw_import.py | 6 +- release/scripts/slp_import.py | 6 +- release/scripts/sysinfo.py | 206 +++++++--- release/scripts/truespace_export.py | 16 +- release/scripts/truespace_import.py | 16 +- release/scripts/videoscape_export.py | 22 +- release/scripts/wings_export.py | 18 +- release/scripts/wings_import.py | 12 +- 33 files changed, 2532 insertions(+), 2308 deletions(-) create mode 100644 release/scripts/bpydata/KUlang.txt create mode 100644 release/scripts/bpydata/config/readme.txt create mode 100644 release/scripts/bpydata/readme.txt create mode 100644 release/scripts/bpymodules/BPyBlender.py create mode 100644 release/scripts/bpymodules/ai2obj.py create mode 100644 release/scripts/bpymodules/eps2obj.py create mode 100644 release/scripts/bpymodules/gimp2obj.py create mode 100644 release/scripts/bpymodules/meshtools.py create mode 100644 release/scripts/bpymodules/svg2obj.py delete mode 100644 release/scripts/mod_ai2obj.py delete mode 100644 release/scripts/mod_blender.py delete mode 100644 release/scripts/mod_eps2obj.py delete mode 100644 release/scripts/mod_gimp2obj.py delete mode 100644 release/scripts/mod_meshtools.py delete mode 100644 release/scripts/mod_svg2obj.py (limited to 'release') diff --git a/release/scripts/bpydata/KUlang.txt b/release/scripts/bpydata/KUlang.txt new file mode 100644 index 00000000000..38605d69c9f --- /dev/null +++ b/release/scripts/bpydata/KUlang.txt @@ -0,0 +1,121 @@ +Version 3.233-2004 +****************** +Espanol +Sale del programa +Utilidades de...%t|Alinea objetos%x1|Creacion%x2|Edita mallas%x3|Edita objetos%x4 +11 +Mov +Esc +Encaja +Abarca +Separa +Alinea +Rota +Incr. +Crea nuevos objetos +Es+ +Es* +Separar entre:%t|Origenes%x1|Centros geometricos%x2|Minimos%x3|Maximos%x4|Baricentro%x5|Objetos%x6 +Crear%t|Arco (3 ptos.)%x1|Arco (interactivo)%x2|Circunferencia (3 ptos.)%x3 +12 +Puntos +Centro +Orden +Objeto +AngIni: +AngFin: +Angulo: +Radio: +Puntos: +Centro +Nombre: +Puntos +Modifica vertices%t|Subdivide%x1|Envia a un plano%x2|Aplica LocRotSize%x3 +Partes +Proyectar en el plano:%t|Coordenado global...%x1|Coordenado local...%x2 +Actuar sobre el plano%t|Yz%x1|Zx%x2|Xy%x3 +En la dirección%t|X%x1|Y%x2|Z%x3|Ortogonal al plano%x4 +Captura +Buffer%t|Copia vector diferencia%x1|Copia distancia%x2|Copia diferencia de rotacion%x3|Copia media LocRotSiz%x4|Ver buffer en consola%x5 +Transformar LocRotSize%t|Hacia el obj. activo%x1|Aleatoriamente%x2 +Poner a distancia fija%x1|Sumar (desp. absoluto)%x2|Multiplicar (desp. relativo)%x3 +******************** +English +Exit program +Utils about:%t|Align Objects%x1|Create%x2|Edit Meshes%x3|Edit Objects%x4 +11 +Mov +Sca +Fit +Embrace +Separate +Align +Rota +Incr. +Create new objects +Sc+ +Sc* +Separate between:%t|Origins%x1|Geometric centers%x2|Minimum%x3|Maximum%x4|Baricenter%x5|Objects%x6 +Create what%t|Arc (3 pts.)%x1|Arc (interactive)%x2|Circunference (3 pts.)%x3 +12 +Points +Centre +Sort +Object +AngIni: +AngEnd: +Angle: +Radius: +Points: +Centre +ObjName: +Points +Modify vertices%t|Subdivide edges%x1|Send to a plane%x2|Set LocRotSize%x3 +Parts +Project onto the plane:%t|Global coordinated...%x1|Local coordinated...%x2 +Act on plane%t|Yz%x1|Zx%x2|Xy%x3 +In direction%t|X%x1|Y%x2|Z%x3|Ortogonal to plane%x4 +Get +Buffer%t|Copy diference vector%x1|Copy distance%x2|Copy rot diference%x3|Copy LocRotSiz average%x4|Show Buffer in Console%x5 +Transform LocRotSize%t|Close to active%x1|Randomly%x2 +Set at fixed distance%x1|Add (absolute displ.)%x2|Multiply (relative displ.)%x3 +******************** +Catala +Surt del programa +Utilitats de...%t|Alinea objectes%x1|Creacio%x2|Edita malles%x3|Edita objetes%x4 +11 +Mov +Esc +Encaixa +Abarca +Separa +Alinea +Rotacio +Incr. +Crea objectes nous +Es+ +Es* +Separa entra:%t|Origens%x1|Centres geometrics%x2|Minims%x3|Maxims%x4|Baricentre%x5|Objectes%x6 +Crear%t|Arc (3 pts.)%x1|Arc (interactiu)%x2|Circumferencia (3 pts.)%x3 +12 +Punts +Centre +Ordre +Objecte +AngIni: +AngFi: +Angle: +Radi: +Punts: +Centre +Nom: +Punts +Modifica vertex%t|Subdivideix%x1|Envia a un pla%x2|Aplica LocRotSize%x3 +Parts +Projectar en el pla:%t|Coordenacio global...%x1|Coordenacio local...%x2 +Actuar sobre el pla%t|Yz%x1|Zx%x2|Xy%x3 +En la direccio%t|X%x1|Y%x2|Z%x3|Ortogonal al pla%x4 +Captura +Buffer%t|Copia vector diferencia%x1|Copia distancia%x2|Copia diferencia de rotacio%x3|Copia mitjana LocRotSiz%x4|Veure buffer en consola%x5 +Transformar LocRotSize%t|Cap al obj. actiu%x1|Aleatoriamente%x2 +Posar a distancia fixa%x1|Sumar (desp. absolut)%x2|Multiplicar (desp. relatiu)%x3 diff --git a/release/scripts/bpydata/config/readme.txt b/release/scripts/bpydata/config/readme.txt new file mode 100644 index 00000000000..099ade0f3e5 --- /dev/null +++ b/release/scripts/bpydata/config/readme.txt @@ -0,0 +1,10 @@ +This folder is for automatically saved scripts configuration data. +This data is loaded when Blender starts and saved whenever a .blend file is +saved. + +To use this feature scripts just need to set a Blender.Registry key with the +extension ".cfg" (for example, "myscript.cfg"). + +Please check the API Reference doc or the documentation for the +"Scripts Config Editor" script with the Help menu-> "Scripts Help Browser" +script in Blender. diff --git a/release/scripts/bpydata/readme.txt b/release/scripts/bpydata/readme.txt new file mode 100644 index 00000000000..3e640e27c4b --- /dev/null +++ b/release/scripts/bpydata/readme.txt @@ -0,0 +1,9 @@ +This directory is the default place for scripts to put their data, +like internal files needed by the script and its saved configuration. + +Scripts can find the path to this dir using Blender.Get("datadir"). +Ex: + +import Blender +print Blender.Get("datadir") + diff --git a/release/scripts/bpymodules/BPyBlender.py b/release/scripts/bpymodules/BPyBlender.py new file mode 100644 index 00000000000..dda491e3af9 --- /dev/null +++ b/release/scripts/bpymodules/BPyBlender.py @@ -0,0 +1,37 @@ +# $Id$ +# +# -------------------------------------------------------------------------- +# BPyBlender.py version 0.3 Mar 20, 2005 +# -------------------------------------------------------------------------- +# helper functions to be used by other scripts +# -------------------------------------------------------------------------- +# ***** BEGIN GPL LICENSE BLOCK ***** +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# ***** END GPL LICENCE BLOCK ***** +# -------------------------------------------------------------------------- + +# Basic set of modules Blender should have in all supported platforms. +# The second and third lines are the contents of the Python23.zip file +# included with Windows Blender binaries along with zlib.pyd. +# Other platforms are assumed to have Python installed. +basic_modules = [ +'Blender', +'chunk','colorsys','copy','copy_reg','gzip','os','random','repr','stat', +'string','StringIO','types','UserDict','webbrowser','whrandom', +'zlib', 'math', +'BPyBlender' +] diff --git a/release/scripts/bpymodules/ai2obj.py b/release/scripts/bpymodules/ai2obj.py new file mode 100644 index 00000000000..8be6c5e18eb --- /dev/null +++ b/release/scripts/bpymodules/ai2obj.py @@ -0,0 +1,382 @@ +""" +#---------------------------------------------- +# (c) jm soler juillet 2004, released under Blender Artistic Licence +# for the Blender 2.34 Python Scripts Bundle. +#---------------------------------------------- +# Page officielle : +# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_import_ai.htm +# Communiquer les problemes et erreurs sur: +# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender +# +# 0.1.1 : 2004/08/03, bug in boudingbox reading when Value are negative +# +""" +SHARP_IMPORT=0 +SCALE=1 +DEVELOPPEMENT=0 + +import sys +#oldpath=sys.path +import Blender +BLversion=Blender.Get('version') + +try: + import nt + os=nt + os.sep='\\' + +except: + import posix + os=posix + os.sep='/' + +def isdir(path): + 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 + +def join(l0,l1): + return l0+os.sep+l1 + +os.isdir=isdir +os.split=split +os.join=join + +def filtreFICHIER(nom): + f=open(nom,'rU') + t=f.readlines() + f.close() + + if len(t)>1: + return t + else: + name = "OK?%t| Not a valid file or an empty file ... " # if no %xN int is set, indices start from 1 + result = Draw.PupMenu(name) + + return 'false' + +#=============================== +# Data +#=============================== +#=============================== +# Blender Curve Data +#=============================== +objBEZIER=0 +objSURFACE=5 +typBEZIER3D=1 #3D +typBEZIER2D=9 #2D + +class Bez: + def __init__(self): + self.co=[] + self.ha=[0,0] + +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 = [] + +class COURBE: + 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 = {} + +courbes=COURBE() + +PATTERN={} + +BOUNDINGBOX={'rec':[],'coef':1.0} +npat=0 +#===================================================================== +#======== name of the curve in teh courbes dictionnary =============== +#===================================================================== +n0=0 + +#===================================================================== +#====================== current Point ================================ +#===================================================================== +CP=[0.0,0.0] #currentPoint + +#===================================================================== +#===== to compare last position to the original move to displacement = +#===== needed for cyclic efinition ================================= +#===================================================================== +def test_egalitedespositions(f1,f2): + if f1[0]==f2[0] and f1[1]==f2[1]: + return Blender.TRUE + else: + return Blender.FALSE + + +def Open_GEOfile(dir,nom): + if BLversion>=233: + in_editmode = Blender.Window.EditMode() + if in_editmode: Blender.Window.EditMode(0) + Blender.Load(dir+nom+'OOO.obj', 1) + BO=Blender.Object.Get() + BO[-1].RotY=0.0 + BO[-1].makeDisplayList() + Blender.Window.RedrawAll() + else: + print "Not yet implemented" + +def create_GEOtext(courbes): + global SCALE, B, BOUNDINGBOX + 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] + + t=[] + t.append(courbes.magic_number+'\n') + t.append(str(courbes.type)+'\n') + t.append(str(courbes.number_of_items)+'\n') + t.append(str(courbes.ext1_ext2[0])+' '+str(courbes.ext1_ext2[1])+'\n') + t.append(courbes.matrix+'\n') + + for k in courbes.ITEM.keys(): + t.append("%s\n"%courbes.ITEM[k].type) + t.append("%s %s \n"%(courbes.ITEM[k].pntsUV[0],courbes.ITEM[k].pntsUV[1])) + t.append("%s %s \n"%(courbes.ITEM[k].resolUV[0],courbes.ITEM[k].resolUV[1])) + t.append("%s %s \n"%(courbes.ITEM[k].orderUV[0],courbes.ITEM[k].orderUV[1])) + t.append("%s %s \n"%(courbes.ITEM[k].flagUV[0],courbes.ITEM[k].flagUV[1])) + + flag =courbes.ITEM[k].flagUV[0] + + for k2 in range(flag,len(courbes.ITEM[k].beziers_knot)): + k1 =courbes.ITEM[k].beziers_knot[k2] + t.append("%4f 0.0 %4f \n"%(float(k1.co[0])/SCALE,float(k1.co[1])/SCALE)) + t.append("%4f 0.0 %4f \n"%(float(k1.co[2])/SCALE,float(k1.co[3])/SCALE)) + t.append("%4f 0.0 %4f \n"%(float(k1.co[4])/SCALE,float(k1.co[5])/SCALE)) + t.append(str(k1.ha[0])+' '+str(k1.ha[1])+'\n') + return t + +def save_GEOfile(dir,nom,t): + f=open(dir+nom+'OOO.obj','w') + f.writelines(t) + f.close() + #warning = "REMINDER : %t | Do not forget to rename your blender file NOW ! %x1" + #result = Blender.Draw.PupMenu(warning) + + +#===================================================================== +#===== AI format : DEBUT ========================= +#===================================================================== +def mouvement_vers(l,n0,CP): + if n0 in courbes.ITEM.keys(): + #if test_egalitedespositions(courbes.ITEM[n0].Origine,CP): + # courbes.ITEM[n0].flagUV[0]=1 + n0+=1 + else: + CP=[l[-3].replace('d',''),l[-2]] + #i= + courbes.ITEM[n0]=ITEM() + courbes.ITEM[n0].Origine=[l[-3].replace('d',''),l[-2]] + + B=Bez() + B.co=[CP[0],CP[1],CP[0],CP[1],CP[0],CP[1]] + B.ha=[0,0] + courbes.ITEM[n0].beziers_knot.append(B) + + return courbes,n0,CP + +def courbe_vers_c(l,l2, n0,CP): #c,C + + B=Bez() + B.co=[l[2],l[3],l[4],l[5],l[0],l[1]] + + if len(courbes.ITEM[n0].beziers_knot)==1: + CP=[l[0],l[1]] + courbes.ITEM[n0].Origine=[l[0],l[1]] + + if l[-1]=='C': + B.ha=[2,2] + else: + B.ha=[0,0] + + courbes.ITEM[n0].beziers_knot.append(B) + if len(l2)>1 and l2[-1] in Actions.keys(): + B.co[-2]=l2[0] + B.co[-1]=l2[1] + else: + #B.co[-2]=courbes.ITEM[n0].beziers_knot[-1].co[0] + #B.co[-1]=courbes.ITEM[n0].beziers_knot[-].co[1] + + B.co[-2]=CP[0] + B.co[-1]=CP[1] + return courbes,n0,CP + + +def courbe_vers_v(l,n0,CP): #v-V + B=Bez() + B.co=[l[2],l[3],l[0],l[1],l[2],l[3]] + if l[-1]=='V': + B.ha=[2,2] + else: + B.ha=[0,0] + courbes.ITEM[n0].beziers_knot.append(B) + CP=[l[0],l[1]] + return courbes,n0,CP + +def courbe_vers_y(l,n0,CP): #y + B=Bez() + B.co=[l[2],l[3],l[0],l[1],l[2],l[3]] + if l[-1]=='Y': + B.ha=[2,2] + else: + B.ha=[0,0] + courbes.ITEM[n0].beziers_knot.append(B) + CP=[l[2],l[3]] + return courbes,n0,CP + + +def ligne_tracee_l(l,n0,CP): + B=Bez() + B.co=[l[0],l[1],l[0],l[1],l[0],l[1]] + if l[-1]=='L': + B.ha=[2,2] + else: + B.ha=[0,0] + courbes.ITEM[n0].beziers_knot.append(B) + CP=[l[0],l[1]] + return courbes,n0,CP + +Actions= { "C" : courbe_vers_c, + "c" : courbe_vers_c, + "V" : courbe_vers_v, + "v" : courbe_vers_v, + "Y" : courbe_vers_y, + "y" : courbe_vers_y, + "m" : mouvement_vers, + "l" : ligne_tracee_l, + "L" : ligne_tracee_l} + +TAGcourbe=Actions.keys() + +def pik_pattern(t,l): + global npat, PATTERN, BOUNDINGBOX + while t[l].find('%%EndSetup')!=0: + if t[l].find('%%BoundingBox:')!=-1: + t[l]=t[l][t[l].find(':')+1:] + l0=t[l].split() + BOUNDINGBOX['rec']=[float(l0[-4]),float(l0[-3]),float(l0[-2]),float(l0[-1])] + r=BOUNDINGBOX['rec'] + BOUNDINGBOX['coef']=(r[3]-r[1])/(r[2]-r[0]) + #print l, + if t[l].find('BeginPattern')!=-1: + nomPattern=t[l][t[l].find('(')+1:t[l].find(')')] + PATTERN[nomPattern]={} + + if t[l].find('BeginPatternLayer')!=-1: + npat+=1 + PATTERN[nomPattern][npat]=[] + while t[l].find('EndPatternLayer')==-1: + #print t[l] + PATTERN[nomPattern][npat].append(l) + l+=1 + if l+10: + if len(PATTERN.keys() )>0: + #print len(PATTERN.keys() ) + warning = "Pattern list (for info not used): %t| " + p0=1 + for P in PATTERN.keys(): + warning+="%s %%x%s|"%(P,p0) + p0+=1 + Padd = Blender.Draw.PupMenu(warning) + + t=create_GEOtext(courbes) + save_GEOfile(dir,name[0],t) + Open_GEOfile(dir,name[0]) + else: + pass +#===================================================================== +#====================== AI format mouvements ========================= +#===================================================================== +#========================================================= +# une sorte de contournement qui permet d'utiliser la fonction +# et de documenter les variables Window.FileSelector +#========================================================= +def fonctionSELECT(nom): + scan_FILE(nom) + +if DEVELOPPEMENT==1: + Blender.Window.FileSelector (fonctionSELECT, 'SELECT AI FILE') +#sys.path=oldpath diff --git a/release/scripts/bpymodules/eps2obj.py b/release/scripts/bpymodules/eps2obj.py new file mode 100644 index 00000000000..8db89892fc6 --- /dev/null +++ b/release/scripts/bpymodules/eps2obj.py @@ -0,0 +1,390 @@ +#---------------------------------------------- +# (c) jm soler juillet 2004, released under Blender Artistic Licence +# for the Blender 2.34 Python Scripts Bundle. +#---------------------------------------------- +# Page officielle : +# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_import_eps.htm +# Communiquer les problemes et erreurs sur: +# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender +#---------------------------------------------- + +SHARP_IMPORT=0 +SCALE=1 +scale=1 + +import sys +#oldpath=sys.path +import Blender +BLversion=Blender.Get('version') + +try: + import nt + os=nt + os.sep='\\' + +except: + import posix + os=posix + os.sep='/' + +def isdir(path): + 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 + +def join(l0,l1): + return l0+os.sep+l1 + +os.isdir=isdir +os.split=split +os.join=join + +def filtreFICHIER(nom): + f=open(nom,'r') + t=f.readlines() + f.close() + if len(t)==1 and t[0].find('\r'): + t=t[0].split('\r') + if len(t)>1: + return t + else: + name = "OK?%t| Not a valid file or an empty file ... " # if no %xN int is set, indices start from 1 + result = Draw.PupMenu(name) + return 'false' + +#=============================== +# Data +#=============================== +#=============================== +# Blender Curve Data +#=============================== +objBEZIER=0 +objSURFACE=5 +typBEZIER3D=1 #3D +typBEZIER2D=9 #2D + +class Bez: + def __init__(self): + self.co=[] + self.ha=[0,0] + +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 = [] + +class COURBE: + 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 """ #- right-handed object matrix. Used to determine position, rotation and size + self.ITEM = {} + +courbes=COURBE() +PATTERN={} +BOUNDINGBOX={'rec':[],'coef':1.0} +npat=0 +#===================================================================== +#======== name of the curve in teh courbes dictionnary =============== +#===================================================================== +n0=0 + +#===================================================================== +#====================== current Point ================================ +#===================================================================== +CP=[0.0,0.0] #currentPoint + +#===================================================================== +#===== to compare last position to the original move to displacement = +#===== needed for cyclic efinition ================================= +#===================================================================== +def test_egalitedespositions(f1,f2): + if f1[0]==f2[0] and f1[1]==f2[1]: + return Blender.TRUE + else: + return Blender.FALSE + + +def Open_GEOfile(dir,nom): + global SCALE,BOUNDINGBOX, scale + if BLversion>=233: + Blender.Load(dir+nom+'OOO.obj', 1) + BO=Blender.Object.Get() + + BO[-1].RotY=3.1416 + BO[-1].RotZ=3.1416 + BO[-1].RotX=3.1416/2.0 + if scale==1: + BO[-1].LocY+=BOUNDINGBOX['rec'][3] + else: + BO[-1].LocY+=BOUNDINGBOX['rec'][3]/SCALE + + BO[-1].makeDisplayList() + Blender.Window.RedrawAll() + else: + print "Not yet implemented" + +def create_GEOtext(courbes): + global SCALE, B, BOUNDINGBOX,scale + 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] + + t=[] + t.append(courbes.magic_number+'\n') + t.append(str(courbes.type)+'\n') + t.append(str(courbes.number_of_items)+'\n') + t.append(str(courbes.ext1_ext2[0])+' '+str(courbes.ext1_ext2[1])+'\n') + t.append(courbes.matrix+'\n') + + for k in courbes.ITEM.keys(): + t.append("%s\n"%courbes.ITEM[k].type) + t.append("%s %s \n"%(courbes.ITEM[k].pntsUV[0],courbes.ITEM[k].pntsUV[1])) + t.append("%s %s \n"%(courbes.ITEM[k].resolUV[0],courbes.ITEM[k].resolUV[1])) + t.append("%s %s \n"%(courbes.ITEM[k].orderUV[0],courbes.ITEM[k].orderUV[1])) + t.append("%s %s \n"%(courbes.ITEM[k].flagUV[0],courbes.ITEM[k].flagUV[1])) + + flag =courbes.ITEM[k].flagUV[0] + + for k2 in range(flag,len(courbes.ITEM[k].beziers_knot)): + k1 =courbes.ITEM[k].beziers_knot[k2] + t.append("%4f 0.0 %4f \n"%(float(k1.co[0])/SCALE,float(k1.co[1])/SCALE)) + t.append("%4f 0.0 %4f \n"%(float(k1.co[2])/SCALE,float(k1.co[3])/SCALE)) + t.append("%4f 0.0 %4f \n"%(float(k1.co[4])/SCALE,float(k1.co[5])/SCALE)) + t.append(str(k1.ha[0])+' '+str(k1.ha[1])+'\n') + return t + +def save_GEOfile(dir,nom,t): + f=open(dir+nom+'OOO.obj','w') + f.writelines(t) + f.close() + + #name = "REMINDER : %t | Do not forget to rename your blender file NOW ! %x1" + #result = Blender.Draw.PupMenu(name) + + +#===================================================================== +#===== EPS format : DEBUT ========================= +#===================================================================== +def mouvement_vers(l,n0,CP): + if n0 in courbes.ITEM.keys(): + #if test_egalitedespositions(courbes.ITEM[n0].Origine,CP): + # courbes.ITEM[n0].flagUV[0]=1 + n0+=1 + CP=[l[-3].replace('d',''),l[-2]] + else: + CP=[l[-3].replace('d',''),l[-2]] + #i= + courbes.ITEM[n0]=ITEM() + courbes.ITEM[n0].Origine=[l[-3].replace('d',''),l[-2]] + + B=Bez() + B.co=[CP[0],CP[1],CP[0],CP[1],CP[0],CP[1]] + B.ha=[0,0] + courbes.ITEM[n0].beziers_knot.append(B) + + return courbes,n0,CP + +def rmouvement_vers(l,n0,CP): + if n0 in courbes.ITEM.keys(): + #if test_egalitedespositions(courbes.ITEM[n0].Origine,CP): + # courbes.ITEM[n0].flagUV[0]=1 + n0+=1 + CP=["%4f"%(float(l[-3])+float(CP[0])),"%4f"%(float(l[-2])+float(CP[1]))] + else: + CP=["%4f"%(float(l[-3])+float(CP[0])),"%4f"%(float(l[-2])+float(CP[1]))] + #i= + courbes.ITEM[n0]=ITEM() + courbes.ITEM[n0].Origine=[l[-3].replace('d',''),l[-2]] + + B=Bez() + B.co=[CP[0],CP[1],CP[0],CP[1],CP[0],CP[1]] + B.ha=[0,0] + courbes.ITEM[n0].beziers_knot.append(B) + return courbes,n0,CP + +def courbe_vers_c(l, l2, n0,CP): #c,C + """ + B=Bez() + B.co=[l[0],l[1],l[2],l[3],l[4],l[5]] + B.ha=[0,0] + + courbes.ITEM[n0].beziers_knot.append(B) + """ + B=Bez() + B.co=[l[2],l[3],l[4],l[5],l[0],l[1]] + if len(courbes.ITEM[n0].beziers_knot)==1: + CP=[l[0],l[1]] + courbes.ITEM[n0].Origine=[l[0],l[1]] + if l[-1]=='C': + B.ha=[2,2] + else: + B.ha=[0,0] + courbes.ITEM[n0].beziers_knot.append(B) + if len(l2)>1 and l2[-1] in Actions.keys(): + B.co[-2]=l2[0] + B.co[-1]=l2[1] + else: + B.co[-2]=CP[0] + B.co[-1]=CP[1] + return courbes,n0,CP + +def ligne_tracee_l(l,n0,CP): + B=Bez() + B.co=[l[0],l[1],l[0],l[1],l[0],l[1]] + B.ha=[0,0] + courbes.ITEM[n0].beziers_knot.append(B) + CP=[l[0],l[1]] + return courbes,n0,CP + +def rligne_tracee_l(l,n0,CP): + B=Bez() + B.co=["%4f"%(float(l[0])+float(CP[0])), + "%4f"%(float(l[1])+float(CP[1])), + "%4f"%(float(l[0])+float(CP[0])), + "%4f"%(float(l[1])+float(CP[1])), + "%4f"%(float(l[0])+float(CP[0])), + "%4f"%(float(l[1])+float(CP[1]))] + B.ha=[0,0] + courbes.ITEM[n0].beziers_knot.append(B) + CP=[l[0],l[1]] + return courbes,n0,CP + +Actions= { "curveto" : courbe_vers_c, + "curveto" : courbe_vers_c, + "moveto" : mouvement_vers, + "rmoveto" : mouvement_vers, + "lineto" : ligne_tracee_l, + "rlineto" : rligne_tracee_l +} + +TAGcourbe=Actions.keys() + +""" +def pik_pattern(t,l): + global npat, PATTERN, BOUNDINGBOX + while t[l].find('%%EndSetup')!=0: + if t[l].find('%%BoundingBox:')!=-1: + l0=t[l].split() + BOUNDINGBOX['rec']=[float(l0[-4]),float(l0[-3]),float(l0[-2]),float(l0[-1])] + r=BOUNDINGBOX['rec'] + BOUNDINGBOX['coef']=(r[3]-r[1])/(r[2]-r[0]) + print l, + if t[l].find('BeginPatternLayer')!=-1: + npat+=1 + PATTERN[npat]=[] + while t[l].find('EndPatternLayer')==-1: + print t[l] + PATTERN[npat].append(l) + l+=1 + if l+10: + if len(PATTERN.keys() )>0: + #print len(PATTERN.keys() ) + pass + t=create_GEOtext(courbes) + save_GEOfile(dir,name[0],t) + Open_GEOfile(dir,name[0]) + else: + pass + + +#===================================================================== +#====================== EPS format mouvements ========================= +#===================================================================== +#========================================================= +# une sorte de contournement qui permet d'utiliser la fonction +# et de documenter les variables Window.FileSelector +#========================================================= +def fonctionSELECT(nom): + scan_FILE(nom) + +#Blender.Window.FileSelector (fonctionSELECT, 'SELECT .EPS/.PS FILE') +#sys.path=oldpath diff --git a/release/scripts/bpymodules/gimp2obj.py b/release/scripts/bpymodules/gimp2obj.py new file mode 100644 index 00000000000..7128107cfcd --- /dev/null +++ b/release/scripts/bpymodules/gimp2obj.py @@ -0,0 +1,320 @@ +""" +#---------------------------------------------- +# (c) jm soler juillet 2004, released under Blender Artistic Licence +# for the Blender 2.34 Python Scripts Bundle. +#---------------------------------------------- +# Page officielle : +# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_import_gimp.htm +# Communiquer les problemes et erreurs sur: +# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender +#--------------------------------------------- +""" +SHARP_IMPORT=0 +SCALE=1 + +import sys +#oldpath=sys.path + +import Blender +BLversion=Blender.Get('version') + +try: + import nt + os=nt + os.sep='\\' + +except: + import posix + os=posix + os.sep='/' + +def isdir(path): + 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 + +def join(l0,l1): + return l0+os.sep+l1 + +os.isdir=isdir +os.split=split +os.join=join + +def filtreFICHIER(nom): + f=open(nom,'r') + t=f.readlines() + f.close() + if len(t)==1 and t[0].find('\r'): + t=t[0].split('\r') + if len(t)>1 and t[1].find('#POINTS:')==0: + return t + else: + warning = "OK?%t| Not a valid file or an empty file ... " # if no %xN int is set, indices start from 1 + result = Blender.Draw.PupMenu(warning) + return "false" + +#=============================== +# Data +#=============================== +#=============================== +# Blender Curve Data +#=============================== +objBEZIER=0 +objSURFACE=5 +typBEZIER3D=1 #3D +typBEZIER2D=9 #2D + +class Bez: + def __init__(self): + self.co=[] + self.ha=[0,0] + + def echo(self): + #print 'co = ', self.co + #print 'ha = ', self.ha + pass + +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 = [] + +class COURBE: + 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 """ #- right-handed object matrix. Used to determine position, rotation and size + self.ITEM = {} + +courbes=COURBE() +PATTERN={} +BOUNDINGBOX={'rec':[],'coef':1.0} +npat=0 +#===================================================================== +#======== name of the curve in the courbes dictionnary =============== +#===================================================================== +n0=0 + +#===================================================================== +#====================== current Point ================================ +#===================================================================== +CP=[0.0,0.0] #currentPoint + +def MINMAX(b): + global BOUNDINGBOX + r=BOUNDINGBOX['rec'] + for m in range(0,len(b)-2,2): + #print m, m+1 , len(b)-1 + #print b[m], r, r[0] + if float(b[m])r[2]: r[2]=float(b[m]) + + if float(b[m+1])r[3]: r[3]=float(b[m+1]) + +#===================================================================== +#===== to compare last position to the original move to displacement = +#===== needed for cyclic efinition ================================= +#===================================================================== +def test_egalitedespositions(f1,f2): + if f1[0]==f2[0] and f1[1]==f2[1]: + return Blender.TRUE + else: + return Blender.FALSE + + +def Open_GEOfile(dir,nom): + if BLversion>=233: + Blender.Load(dir+nom+'OOO.obj', 1) + BO=Blender.Object.Get() + + BO[-1].LocZ=1.0 + + BO[-1].makeDisplayList() + Blender.Window.RedrawAll() + else: + print "Not yet implemented" + +def create_GEOtext(courbes): + global SCALE, B, BOUNDINGBOX + 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] + + t=[] + t.append(courbes.magic_number+'\n') + t.append(str(courbes.type)+'\n') + t.append(str(courbes.number_of_items)+'\n') + t.append(str(courbes.ext1_ext2[0])+' '+str(courbes.ext1_ext2[1])+'\n') + t.append(courbes.matrix+'\n') + + for k in courbes.ITEM.keys(): + + t.append("%s\n"%courbes.ITEM[k].type) + + t.append("%s %s \n"%(courbes.ITEM[k].pntsUV[0],courbes.ITEM[k].pntsUV[1])) + t.append("%s %s \n"%(courbes.ITEM[k].resolUV[0],courbes.ITEM[k].resolUV[1])) + t.append("%s %s \n"%(courbes.ITEM[k].orderUV[0],courbes.ITEM[k].orderUV[1])) + t.append("%s %s \n"%(courbes.ITEM[k].flagUV[0],courbes.ITEM[k].flagUV[1])) + + flag =0#courbes.ITEM[k].flagUV[0] + + for k2 in range(flag,len(courbes.ITEM[k].beziers_knot)): + k1 =courbes.ITEM[k].beziers_knot[k2] + t.append("%4f 0.0 %4f \n"%(float(k1.co[0])/SCALE,float(k1.co[1])/SCALE)) + t.append("%4f 0.0 %4f \n"%(float(k1.co[4])/SCALE,float(k1.co[5])/SCALE)) + t.append("%4f 0.0 %4f \n"%(float(k1.co[2])/SCALE,float(k1.co[3])/SCALE)) + t.append(str(k1.ha[0])+' '+str(k1.ha[1])+'\n') + return t + +def save_GEOfile(dir,nom,t): + f=open(dir+nom+'OOO.obj','w') + f.writelines(t) + f.close() + #warning = "REMINDER : %t | Do not forget to rename your blender file NOW ! %x1" + #result = Blender.Draw.PupMenu(warning) + + +#===================================================================== +#===== GIMP format : DEBUT ========================= +#===================================================================== +CLOSED=0 + +def mouvement_vers(l,l1,l2,n0): + global BOUNDINGBOX, CP + if l[1] == '3' : + n0+=1 + courbes.ITEM[n0]=ITEM() + courbes.ITEM[n0].Origine=[l[-3],l[-1],] + courbes.ITEM[n0-1].beziers_knot[0].co[0]=CP[0] + courbes.ITEM[n0-1].beziers_knot[0].co[1]=CP[1] + CP=[l2[-3], l2[-1]] + + elif l[1]=='1' and (n0 not in courbes.ITEM.keys()): + courbes.ITEM[n0]=ITEM() + courbes.ITEM[n0].Origine=[l[-3],l[-1],] + CP=[l2[-3], l2[-1]] + + B=Bez() + B.co=[ CP[0],CP[1], + l1[-3], l1[-1], + l[-3], l[-1]] + + CP=[l2[-3], l2[-1]] + + if BOUNDINGBOX['rec']==[]: + BOUNDINGBOX['rec']=[float(l2[-3]), float(l2[-1]), float(l[-3]), float(l[-1])] + B.ha=[0,0] + + """ + if len( courbes.ITEM[n0].beziers_knot)>=1: + courbes.ITEM[n0].beziers_knot[-1].co[2]=l1[-3] + courbes.ITEM[n0].beziers_knot[-1].co[3]=l1[-1] + """ + + MINMAX(B.co) + courbes.ITEM[n0].beziers_knot.append(B) + return courbes,n0 + +Actions= { "1" : mouvement_vers, + "3" : mouvement_vers } + +TAGcourbe=Actions.keys() + +def scan_FILE(nom): + global CP, courbes, SCALE, MAX, MIN, CLOSED + dir,name=split(nom) + name=name.split('.') + #print name + n0=0 + result=0 + t=filtreFICHIER(nom) + if t!="false": + if not SHARP_IMPORT: + warning = "Select Size : %t| As is %x1 | Scale on Height %x2| Scale on Width %x3" + SCALE = Blender.Draw.PupMenu(warning) + npat=0 + l=0 + while l 0: + t=create_GEOtext(courbes) + save_GEOfile(dir,name[0],t) + Open_GEOfile(dir,name[0]) + else: + pass + +#===================================================================== +#====================== GIMP Path format mouvements ========================= +#===================================================================== +#========================================================= +# une sorte de contournement qui permet d'utiliser la fonction +# et de documenter les variables Window.FileSelector +#========================================================= +def fonctionSELECT(nom): + scan_FILE(nom) + +#Blender.Window.FileSelector (fonctionSELECT, 'SELECT a GIMP Path FILE') +#sys.path=oldpath diff --git a/release/scripts/bpymodules/meshtools.py b/release/scripts/bpymodules/meshtools.py new file mode 100644 index 00000000000..4ddf6035e59 --- /dev/null +++ b/release/scripts/bpymodules/meshtools.py @@ -0,0 +1,331 @@ +# $Id$ +# +# +---------------------------------------------------------+ +# | Copyright (c) 2001 Anthony D'Agostino | +# | http://www.redrival.com/scorpius | +# | scorpius@netzero.com | +# | September 28, 2002 | +# | Released under the Blender Artistic Licence (BAL) | +# | Import Export Suite v0.5 | +# +---------------------------------------------------------+ +# | Common Functions & Global Variables For All IO Modules | +# +---------------------------------------------------------+ + +import Blender +import sys + +show_progress = 1 # Set to 0 for faster performance +average_vcols = 1 # Off for per-face, On for per-vertex +overwrite_mesh_name = 0 # Set to 0 to increment object-name version + +blender_version = Blender.Get('version') +blender_version_str = `blender_version`[0] + '.' + `blender_version`[1:] + +try: + import operator +except: + msg = "Error: you need a full Python install to run this script." + meshtools.print_boxed(msg) + Blender.Draw.PupMenu("ERROR%t|"+msg) + +# ================================= +# === Append Faces To Face List === +# ================================= +def append_faces(mesh, faces, facesuv, uvcoords): + for i in range(len(faces)): + if not i%100 and show_progress: Blender.Window.DrawProgressBar(float(i)/len(faces), "Generating Faces") + numfaceverts=len(faces[i]) + if numfaceverts <= 4: # This face is a triangle or quad + face = Blender.NMesh.Face() + for j in range(numfaceverts): + index = faces[i][j] + face.v.append(mesh.verts[index]) + if len(uvcoords) > 1: + uvidx = facesuv[i][j] + face.uv.append(uvcoords[uvidx]) + face.mode = 0 + face.col = [Blender.NMesh.Col()]*4 + mesh.faces.append(face) + else: # Triangulate n-sided convex polygon. + a, b, c = 0, 1, 2 # Indices of first triangle. + for j in range(numfaceverts-2): # Number of triangles in polygon. + face = Blender.NMesh.Face() + face.v.append(mesh.verts[faces[i][a]]) + face.v.append(mesh.verts[faces[i][b]]) + face.v.append(mesh.verts[faces[i][c]]) + b = c; c += 1 + mesh.faces.append(face) + #face.smooth = 1 + +# =================================== +# === Append Verts to Vertex List === +# =================================== +def append_verts(mesh, verts, normals): + #print "Number of normals:", len(normals) + #print "Number of verts :", len(verts) + for i in range(len(verts)): + if not i%100 and show_progress: Blender.Window.DrawProgressBar(float(i)/len(verts), "Generating Verts") + x, y, z = verts[i] + mesh.verts.append(Blender.NMesh.Vert(x, y, z)) + if normals: + mesh.verts[i].no[0] = normals[i][0] + mesh.verts[i].no[1] = normals[i][1] + mesh.verts[i].no[2] = normals[i][2] + +# =========================== +# === Create Blender Mesh === +# =========================== +def create_mesh(verts, faces, objname, facesuv=[], uvcoords=[], normals=[]): + if normals: normal_flag = 0 + else: normal_flag = 1 + mesh = Blender.NMesh.GetRaw() + append_verts(mesh, verts, normals) + append_faces(mesh, faces, facesuv, uvcoords) + if not overwrite_mesh_name: + objname = versioned_name(objname) + Blender.NMesh.PutRaw(mesh, objname, normal_flag) # Name the Mesh + Blender.Object.GetSelected()[0].name=objname # Name the Object + Blender.Redraw() + +# ============================== +# === Increment Name Version === +# ============================== +def versioned_name(objname): + existing_names = [] + for object in Blender.Object.Get(): + existing_names.append(object.name) + data = object.data + if data: existing_names.append(data.name) + if objname in existing_names: # don't over-write other names + try: + name, ext = objname.split('.') + except ValueError: + name, ext = objname, '' + try: + num = int(ext) + root = name + except ValueError: + root = objname + for i in xrange(1, 1000): + objname = "%s.%03d" % (root, i) + if objname not in existing_names: + break + return objname + +# =========================== +# === Print Text In A Box === +# =========================== +def print_boxed(text): + lines = text.splitlines() + maxlinelen = max(map(len, lines)) + if sys.platform[:3] == "win": + print chr(218)+chr(196) + chr(196)*maxlinelen + chr(196)+chr(191) + for line in lines: + print chr(179) + ' ' + line.ljust(maxlinelen) + ' ' + chr(179) + print chr(192)+chr(196) + chr(196)*maxlinelen + chr(196)+chr(217) + else: + print '+-' + '-'*maxlinelen + '-+' + for line in lines: print '| ' + line.ljust(maxlinelen) + ' |' + print '+-' + '-'*maxlinelen + '-+' + print '\a\r', # beep when done + +# =============================================== +# === Get euler angles from a rotation matrix === +# =============================================== +def mat2euler(mat): + angle_y = -math.asin(mat[0][2]) + c = math.cos(angle_y) + if math.fabs(c) > 0.005: + angle_x = math.atan2(mat[1][2]/c, mat[2][2]/c) + angle_z = math.atan2(mat[0][1]/c, mat[0][0]/c) + else: + angle_x = 0.0 + angle_z = -math.atan2(mat[1][0], mat[1][1]) + return (angle_x, angle_y, angle_z) + +# ========================== +# === Transpose A Matrix === +# ========================== +def transpose(A): + S = len(A) + T = len(A[0]) + B = [[None]*S for i in range(T)] + for i in range(T): + for j in range(S): + B[i][j] = A[j][i] + return B + +# ======================= +# === Apply Transform === +# ======================= +def apply_transform(vertex, matrix): + x, y, z = vertex + xloc, yloc, zloc = matrix[3][0], matrix[3][1], matrix[3][2] + xcomponent = x*matrix[0][0] + y*matrix[1][0] + z*matrix[2][0] + xloc + ycomponent = x*matrix[0][1] + y*matrix[1][1] + z*matrix[2][1] + yloc + zcomponent = x*matrix[0][2] + y*matrix[1][2] + z*matrix[2][2] + zloc + vertex = [xcomponent, ycomponent, zcomponent] + return vertex + +# ========================= +# === Has Vertex Colors === +# ========================= +def has_vertex_colors(mesh): + # My replacement/workaround for hasVertexColours() + # The docs say: + # "Warning: If a mesh has both vertex colours and textured faces, + # this function will return False. This is due to the way Blender + # deals internally with the vertex colours array (if there are + # textured faces, it is copied to the textured face structure and + # the original array is freed/deleted)." + try: + return mesh.faces[0].col[0] + except: + return 0 + +# =========================== +# === Generate Edge Table === +# =========================== +def generate_edgetable(mesh): + edge_table = {} + numfaces = len(mesh.faces) + + for i in range(numfaces): + if not i%100 and show_progress: + Blender.Window.DrawProgressBar(float(i)/numfaces, "Generating Edge Table") + if len(mesh.faces[i].v) == 4: # Process Quadrilaterals + generate_entry_from_quad(mesh, i, edge_table) + elif len(mesh.faces[i].v) == 3: # Process Triangles + generate_entry_from_tri(mesh, i, edge_table) + else: # Skip This Face + print "Face #", i, "was skipped." + + # === Sort Edge_Table Keys & Add Edge Indices === + i = 0 + keys = edge_table.keys() + keys.sort() + for key in keys: + edge_table[key][6] = i + i += 1 + + # === Replace Tuples With Indices === + for key in keys: + for i in [2,3,4,5]: + if edge_table.has_key(edge_table[key][i]): + edge_table[key][i] = edge_table[edge_table[key][i]][6] + else: + keyrev = (edge_table[key][i][1], edge_table[key][i][0]) + edge_table[key][i] = edge_table[keyrev][6] + + return edge_table + +# ================================ +# === Generate Entry From Quad === +# ================================ +def generate_entry_from_quad(mesh, i, edge_table): + vertex4, vertex3, vertex2, vertex1 = mesh.faces[i].v + + if has_vertex_colors(mesh): + vcolor4, vcolor3, vcolor2, vcolor1 = mesh.faces[i].col + Acol = (vcolor1.r/255.0, vcolor1.g/255.0, vcolor1.b/255.0) + Bcol = (vcolor2.r/255.0, vcolor2.g/255.0, vcolor2.b/255.0) + Ccol = (vcolor3.r/255.0, vcolor3.g/255.0, vcolor3.b/255.0) + Dcol = (vcolor4.r/255.0, vcolor4.g/255.0, vcolor4.b/255.0) + + # === verts are upper case, edges are lower case === + A, B, C, D = vertex1.index, vertex2.index, vertex3.index, vertex4.index + a, b, c, d = (A, B), (B, C), (C, D), (D, A) + + if edge_table.has_key((B, A)): + edge_table[(B, A)][1] = i + edge_table[(B, A)][4] = d + edge_table[(B, A)][5] = b + if has_vertex_colors(mesh): edge_table[(B, A)][8] = Bcol + else: + if has_vertex_colors(mesh): + edge_table[(A, B)] = [i, None, d, b, None, None, None, Bcol, None] + else: + edge_table[(A, B)] = [i, None, d, b, None, None, None] + + if edge_table.has_key((C, B)): + edge_table[(C, B)][1] = i + edge_table[(C, B)][4] = a + edge_table[(C, B)][5] = c + if has_vertex_colors(mesh): edge_table[(C, B)][8] = Ccol + else: + if has_vertex_colors(mesh): + edge_table[(B, C)] = [i, None, a, c, None, None, None, Ccol, None] + else: + edge_table[(B, C)] = [i, None, a, c, None, None, None] + + if edge_table.has_key((D, C)): + edge_table[(D, C)][1] = i + edge_table[(D, C)][4] = b + edge_table[(D, C)][5] = d + if has_vertex_colors(mesh): edge_table[(D, C)][8] = Dcol + else: + if has_vertex_colors(mesh): + edge_table[(C, D)] = [i, None, b, d, None, None, None, Dcol, None] + else: + edge_table[(C, D)] = [i, None, b, d, None, None, None] + + if edge_table.has_key((A, D)): + edge_table[(A, D)][1] = i + edge_table[(A, D)][4] = c + edge_table[(A, D)][5] = a + if has_vertex_colors(mesh): edge_table[(A, D)][8] = Acol + else: + if has_vertex_colors(mesh): + edge_table[(D, A)] = [i, None, c, a, None, None, None, Acol, None] + else: + edge_table[(D, A)] = [i, None, c, a, None, None, None] + +# ==================================== +# === Generate Entry From Triangle === +# ==================================== +def generate_entry_from_tri(mesh, i, edge_table): + vertex3, vertex2, vertex1 = mesh.faces[i].v + + if has_vertex_colors(mesh): + vcolor3, vcolor2, vcolor1, _vcolor4_ = mesh.faces[i].col + Acol = (vcolor1.r/255.0, vcolor1.g/255.0, vcolor1.b/255.0) + Bcol = (vcolor2.r/255.0, vcolor2.g/255.0, vcolor2.b/255.0) + Ccol = (vcolor3.r/255.0, vcolor3.g/255.0, vcolor3.b/255.0) + + # === verts are upper case, edges are lower case === + A, B, C = vertex1.index, vertex2.index, vertex3.index + a, b, c = (A, B), (B, C), (C, A) + + if edge_table.has_key((B, A)): + edge_table[(B, A)][1] = i + edge_table[(B, A)][4] = c + edge_table[(B, A)][5] = b + if has_vertex_colors(mesh): edge_table[(B, A)][8] = Bcol + else: + if has_vertex_colors(mesh): + edge_table[(A, B)] = [i, None, c, b, None, None, None, Bcol, None] + else: + edge_table[(A, B)] = [i, None, c, b, None, None, None] + + if edge_table.has_key((C, B)): + edge_table[(C, B)][1] = i + edge_table[(C, B)][4] = a + edge_table[(C, B)][5] = c + if has_vertex_colors(mesh): edge_table[(C, B)][8] = Ccol + else: + if has_vertex_colors(mesh): + edge_table[(B, C)] = [i, None, a, c, None, None, None, Ccol, None] + else: + edge_table[(B, C)] = [i, None, a, c, None, None, None] + + if edge_table.has_key((A, C)): + edge_table[(A, C)][1] = i + edge_table[(A, C)][4] = b + edge_table[(A, C)][5] = a + if has_vertex_colors(mesh): edge_table[(A, C)][8] = Acol + else: + if has_vertex_colors(mesh): + edge_table[(C, A)] = [i, None, b, a, None, None, None, Acol, None] + else: + edge_table[(C, A)] = [i, None, b, a, None, None, None] + diff --git a/release/scripts/bpymodules/svg2obj.py b/release/scripts/bpymodules/svg2obj.py new file mode 100644 index 00000000000..7445b13a4a7 --- /dev/null +++ b/release/scripts/bpymodules/svg2obj.py @@ -0,0 +1,660 @@ +""" +SVG 2 OBJ translater, 0.2.6 +(c) jm soler juillet/novembre 2004, released under Blender Artistic Licence + for the Blender 2.34/35 Python Scripts Bundle. +#--------------------------------------------------------------------------- +# Page officielle : +# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_import_svg.htm +# Communiquer les problemes et erreurs sur: +# 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 : + 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: + M : absolute move to + Z : close path + L : absolute line to + C : absolute curve to + S : absolute curve to with only one handle + l : relative line to 2004/08/03 + c : relative curve to 2004/08/03 + s : relative curve to with only one handle + +To do: A,S,V,H,Q,T, + a,s, m, v, h, q,t + +Changelog: + 0.1.1 : - control file without extension + 0.2.0 : - improved reading of several data of the same type + following the same command (for gimp import) + 0.2.1 : - better choice for viewboxing ( takes the viewbox if found, + instead of x,y,width and height + 0.2.2 : - read compact path data from Illustrator 10 + 0.2.3 : - read a few new relative displacements + 0.2.4 : - better hash for command with followed by a lone data + (h,v) or uncommun number (a) + 0.2.5 : - correction for gimp import + 0.2.6 : - correction for illustrator 10 SVG + +================================================================================== +==================================================================================""" + +SHARP_IMPORT=0 +SCALE=1 +scale=1 +DEBUG =0 #print +DEVELOPPEMENT=0 + +import sys +#oldpath=sys.path +import Blender +BLversion=Blender.Get('version') + +try: + import nt + os=nt + os.sep='\\' + +except: + import posix + os=posix + os.sep='/' + +def isdir(path): + 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 + +def join(l0,l1): + return l0+os.sep+l1 + +os.isdir=isdir +os.split=split +os.join=join + +def filtreFICHIER(nom): + f=open(nom,'rU') + t=f.read() + f.close() + + t=t.replace('\r','') + t=t.replace('\n','') + + if t.upper().find('=233: + Blender.Load(dir+nom+'OOO.obj', 1) + BO=Blender.Object.Get() + + BO[-1].RotY=3.1416 + BO[-1].RotZ=3.1416 + BO[-1].RotX=3.1416/2.0 + + if scale==1: + BO[-1].LocY+=BOUNDINGBOX['rec'][3] + else: + BO[-1].LocY+=BOUNDINGBOX['rec'][3]/SCALE + + BO[-1].makeDisplayList() + Blender.Window.RedrawAll() + else: + print "Not yet implemented" + +def create_GEOtext(courbes): + global SCALE, B, BOUNDINGBOX,scale + 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] + + t=[] + t.append(courbes.magic_number+'\n') + t.append(str(courbes.type)+'\n') + t.append(str(courbes.number_of_items)+'\n') + t.append(str(courbes.ext1_ext2[0])+' '+str(courbes.ext1_ext2[1])+'\n') + t.append(courbes.matrix+'\n') + + for k in courbes.ITEM.keys(): + t.append("%s\n"%courbes.ITEM[k].type) + t.append("%s %s \n"%(courbes.ITEM[k].pntsUV[0],courbes.ITEM[k].pntsUV[1])) + t.append("%s %s \n"%(courbes.ITEM[k].resolUV[0],courbes.ITEM[k].resolUV[1])) + t.append("%s %s \n"%(courbes.ITEM[k].orderUV[0],courbes.ITEM[k].orderUV[1])) + t.append("%s %s \n"%(courbes.ITEM[k].flagUV[0],courbes.ITEM[k].flagUV[1])) + + flag =0#courbes.ITEM[k].flagUV[0] + + for k2 in range(flag,len(courbes.ITEM[k].beziers_knot)): + #k1 =courbes.ITEM[k].beziers_knot[k2] + k1=ajustement(courbes.ITEM[k].beziers_knot[k2], SCALE) + + t.append("%4f 0.0 %4f \n"%(k1[4],k1[5])) + t.append("%4f 0.0 %4f \n"%(k1[0],k1[1])) + t.append("%4f 0.0 %4f \n"%(k1[2],k1[3])) + t.append(str(courbes.ITEM[k].beziers_knot[k2].ha[0])+' '+str(courbes.ITEM[k].beziers_knot[k2].ha[1])+'\n') + + return t + +def save_GEOfile(dir,nom,t): + f=open(dir+nom+'OOO.obj','w') + f.writelines(t) + f.close() + #warning = "REMINDER : %t | Do not forget to rename your blender file NOW ! %x1" + #result = Blender.Draw.PupMenu(warning) + + +def filtre_DATA(c,D,n): + global DEBUG,TAGcourbe + l=[] + + if len(c[0])==1 and D[c[1]+1].find(',')!=-1: + for n2 in range(1,n+1): + ld=D[c[1]+n2].split(',') + for l_ in ld: + l.append(l_) + + elif len(c[0])==1 and D[c[1]+2][0] not in TAGcourbe: + for n2 in range(1,n*2+1): + l.append(D[c[1]+n2]) + if DEBUG==1 : print l + + return l + +#===================================================================== +#===== SVG format : DEBUT ========================= +#===================================================================== + +def contruit_SYMETRIC(l): + L=[float(l[0]), float(l[1]), + float(l[2]),float(l[3])] + X=L[0]-(L[2]-L[0]) + Y=L[1]-(L[3]-L[1]) + l =[l[0],l[1],"%4s"%X,"%4s"%Y,l[2],l[3]] + return l + +def mouvement_vers(c, D, n0,CP): + global DEBUG,TAGcourbe + #print c,D[c[1]+1] + + l=filtre_DATA(c,D,1) + #print l + if n0 in courbes.ITEM.keys(): + n0+=1 + CP=[l[0],l[1]] + else: + CP=[l[0],l[1]] + + courbes.ITEM[n0]=ITEM() + courbes.ITEM[n0].Origine=[l[0],l[1]] + + B=Bez() + B.co=[CP[0],CP[1],CP[0],CP[1],CP[0],CP[1]] + B.ha=[0,0] + + courbes.ITEM[n0].beziers_knot.append(B) + if DEBUG==1: print courbes.ITEM[n0], CP + + + return courbes,n0,CP + +def boucle_z(c,D,n0,CP): #Z,z + #print c, 'close' + courbes.ITEM[n0].flagUV[0]=1 + return courbes,n0,CP + +def courbe_vers_s(c,D,n0,CP): #S,s + l=filtre_DATA(c,D,2) + if c[0]=='s': + l=["%4s"%(float(l[0])+float(CP[0])), + "%4s"%(float(l[1])+float(CP[1])), + "%4s"%(float(l[2])+float(CP[0])), + "%4s"%(float(l[3])+float(CP[1]))] + l=contruit_SYMETRIC(l) + B=Bez() + B.co=[l[4],l[5],l[2],l[3],l[0],l[1]] #plus toucher au 2-3 + B.ha=[0,0] + + BP=courbes.ITEM[n0].beziers_knot[-1] + BP.co[2]=l[2] #4-5 point prec + BP.co[3]=l[3] + + courbes.ITEM[n0].beziers_knot.append(B) + if DEBUG==1: print B.co,BP.co + CP=[l[4],l[5]] + + if len(D)')+1] + t=t[t.find('>')+1:] + + if DEBUG==3 : print t[:10], val + + return t,val + +def get_val(val,t): + d="" + for l in t: + if l.find(val+'="')!=-1: + d=l[l[:-1].rfind('"')+1:-1] + for nn in d : + if '012345670.'.find(nn)==-1: + d=d.replace(nn,"") + d=float(d) + break + d=0.0 + return d + +def get_BOUNDBOX(BOUNDINGBOX,SVG,viewbox): + if viewbox==0: + h=get_val('height',SVG) + w=get_val('width',SVG) + BOUNDINGBOX['rec']=[0.0,0.0,w,h] + r=BOUNDINGBOX['rec'] + BOUNDINGBOX['coef']=w/h + else: + viewbox=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 + +def unpack_DATA(DATA): + DATA[0]=DATA[0].replace('-',',-') + for d in Actions.keys(): + DATA[0]=DATA[0].replace(d,','+d+',') + DATA[0]=DATA[0].replace(',,',',') + if DATA[0][0]==',':DATA[0]=DATA[0][1:] + if DATA[0][-1]==',':DATA[0]=DATA[0][:-1] + DATA[0]=DATA[0].replace('\n','') + DATA[0]=DATA[0].replace('\t','') + DATA[0]=DATA[0].split(',') + D2=[] + D1=DATA[0] + + for cell in range(len(D1)): + if D1[cell] in Actions.keys(): + D2.append(D1[cell]) + n=1 + if D1[cell] not in ['h','v','H','V','a','A']: + while cell+n+1 D = :", D0 + + if len(D)==1 or len(D[0])>1: + D1=[] + for D0 in D: + D1+=unpack_DATA([D0])[:] + D=D1 + + #print "D2= :",D + return t,D + + +def scan_FILE(nom): + global CP, courbes, SCALE, DEBUG, BOUNDINGBOX, scale + dir,name=split(nom) + name=name.split('.') + n0=0 + result=0 + + t=filtreFICHIER(nom) + + if t!='false': + if not SHARP_IMPORT: + warning = "Select Size : %t| As is %x1 | Scale on Height %x2| Scale on Width %x3" + scale = Blender.Draw.PupMenu(warning) + npat=0 + l=0 + do=0 + t,SVG=get_tag('svg',t) + + SVG,viewbox=get_content('viewBox',SVG) + + SVG=SVG.split(' ') + if viewbox==0: + BOUNDINGBOX = get_BOUNDBOX(BOUNDINGBOX,SVG,0) + else: + BOUNDINGBOX = get_BOUNDBOX(BOUNDINGBOX,SVG,viewbox) + + #print t + + while t.find('path')!=-1: + t,D=format_PATH(t) + cursor=0 + for cell in D: + if DEBUG==2 : print 'cell : ',cell ,' --' + if len(cell)>=1 and cell[0] in TAGcourbe: + courbes,n0,CP=Actions[cell]([cell,cursor], D, n0,CP) + cursor+=1 + + courbes.number_of_items=len(courbes.ITEM.keys()) + + for k in courbes.ITEM.keys(): + courbes.ITEM[k].pntsUV[0] =len(courbes.ITEM[k].beziers_knot) + + if courbes.number_of_items>0: + if len(PATTERN.keys() )>0: + if DEBUG == 3 : print len(PATTERN.keys() ) + t=create_GEOtext(courbes) + save_GEOfile(dir,name[0],t) + Open_GEOfile(dir,name[0]) + else: + pass + +def ajustement(v,s): + + a,b,c,d,e,f=float(v.co[0]),float(v.co[1]),float(v.co[2]),float(v.co[3]),float(v.co[4]),float(v.co[5]) + return [a/s,-b/s,c/s,-d/s,e/s,-f/s] + +#===================================================================== +#====================== SVG format mouvements ======================== +#===================================================================== + +#===================================================================== +# une sorte de contournement qui permet d'utiliser la fonction +# et de documenter les variables Window.FileSelector +#===================================================================== +def fonctionSELECT(nom): + scan_FILE(nom) + +if DEVELOPPEMENT==1: + Blender.Window.FileSelector (fonctionSELECT, 'SELECT a .SVG FILE') + #sys.path=oldpath diff --git a/release/scripts/lightwave_export.py b/release/scripts/lightwave_export.py index 99d7deab440..dc14d036503 100644 --- a/release/scripts/lightwave_export.py +++ b/release/scripts/lightwave_export.py @@ -52,7 +52,7 @@ v5.5 format. # | Read and write LightWave Object File Format (*.lwo) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools import struct, chunk, os, cStringIO, time, operator # ============================== @@ -65,11 +65,11 @@ def write(filename): objects = Blender.Object.GetSelected() objects.sort(lambda a,b: cmp(a.name, b.name)) if not objects: - mod_meshtools.print_boxed("No mesh objects are selected.") + meshtools.print_boxed("No mesh objects are selected.") return - if len(objects) > 20 and mod_meshtools.show_progress: - mod_meshtools.show_progress = 0 + if len(objects) > 20 and meshtools.show_progress: + meshtools.show_progress = 0 text = generate_text() desc = generate_desc() @@ -99,8 +99,8 @@ def write(filename): if mesh.hasFaceUV(): vmad_uv = generate_vmad_uv(mesh) # per face - if mod_meshtools.has_vertex_colors(mesh): - if mod_meshtools.average_vcols: + if meshtools.has_vertex_colors(mesh): + if meshtools.average_vcols: vmap_vc = generate_vmap_vc(mesh) # per vert else: vmad_vc = generate_vmad_vc(mesh) # per face @@ -115,8 +115,8 @@ def write(filename): write_chunk(meshdata, "VMAD", vmad_uv) chunks.append(vmad_uv) - if mod_meshtools.has_vertex_colors(mesh): - if mod_meshtools.average_vcols: + if meshtools.has_vertex_colors(mesh): + if meshtools.average_vcols: write_chunk(meshdata, "VMAP", vmap_vc) chunks.append(vmap_vc) else: @@ -142,7 +142,7 @@ def write(filename): end = time.clock() seconds = " in %.2f %s" % (end-start, "seconds") message = "Successfully exported " + os.path.basename(filename) + seconds - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) # ======================================= # === Generate Null-Terminated String === @@ -164,17 +164,17 @@ def get_used_material_names(objects): meshname = object.data.name mesh = Blender.NMesh.GetRaw(meshname) if not mesh: continue - if (not mesh.materials) and (mod_meshtools.has_vertex_colors(mesh)): + if (not mesh.materials) and (meshtools.has_vertex_colors(mesh)): # vcols only - if mod_meshtools.average_vcols: + if meshtools.average_vcols: matnames["\251 Per-Vert Vertex Colors"] = None else: matnames["\251 Per-Face Vertex Colors"] = None - elif (mesh.materials) and (not mod_meshtools.has_vertex_colors(mesh)): + elif (mesh.materials) and (not meshtools.has_vertex_colors(mesh)): # materials only for material in mesh.materials: matnames[material.name] = None - elif (not mesh.materials) and (not mod_meshtools.has_vertex_colors(mesh)): + elif (not mesh.materials) and (not meshtools.has_vertex_colors(mesh)): # neither matnames["\251 Blender Default"] = None else: @@ -228,9 +228,9 @@ def generate_layr(name, idx): def generate_pnts(mesh, matrix): data = cStringIO.StringIO() for i in range(len(mesh.verts)): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Writing Verts") - x, y, z = mod_meshtools.apply_transform(mesh.verts[i].co, matrix) + x, y, z = meshtools.apply_transform(mesh.verts[i].co, matrix) data.write(struct.pack(">fff", x, z, y)) return data.getvalue() @@ -255,7 +255,7 @@ def average_vertexcolors(mesh): vcolor_add = lambda u, v: [u[0]+v[0], u[1]+v[1], u[2]+v[2], u[3]+v[3]] vcolor_div = lambda u, s: [u[0]/s, u[1]/s, u[2]/s, u[3]/s] for i in range(len(mesh.faces)): # get all vcolors that share this vertex - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Finding Shared VColors") for j in range(len(mesh.faces[i].v)): index = mesh.faces[i].v[j].index @@ -263,7 +263,7 @@ def average_vertexcolors(mesh): r,g,b,a = color.r, color.g, color.b, color.a vertexcolors.setdefault(index, []).append([r,g,b,a]) for i in range(len(vertexcolors)): # average them - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Averaging Vertex Colors") vcolor = [0,0,0,0] # rgba for j in range(len(vertexcolors[i])): @@ -296,7 +296,7 @@ def generate_vmad_vc(mesh): data.write(struct.pack(">H", 3)) # dimension data.write(generate_nstring("Blender's Vertex Colors")) # name for i in range(len(mesh.faces)): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Vertex Colors") numfaceverts = len(mesh.faces[i].v) for j in range(numfaceverts-1, -1, -1): # Reverse order @@ -318,7 +318,7 @@ def generate_vmad_uv(mesh): data.write(struct.pack(">H", 2)) # dimension data.write(generate_nstring("Blender's UV Coordinates")) # name for i in range(len(mesh.faces)): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing UV Coordinates") numfaceverts = len(mesh.faces[i].v) for j in range(numfaceverts-1, -1, -1): # Reverse order @@ -346,7 +346,7 @@ def generate_pols(mesh): data = cStringIO.StringIO() data.write("FACE") # polygon type for i in range(len(mesh.faces)): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Faces") data.write(struct.pack(">H", len(mesh.faces[i].v))) # numfaceverts numfaceverts = len(mesh.faces[i].v) @@ -362,18 +362,18 @@ def generate_ptag(mesh, material_names): data = cStringIO.StringIO() data.write("SURF") # polygon tag type for i in range(len(mesh.faces)): # numfaces - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Surface Indices") data.write(generate_vx(i)) - if (not mesh.materials) and (mod_meshtools.has_vertex_colors(mesh)): # vcols only - if mod_meshtools.average_vcols: + if (not mesh.materials) and (meshtools.has_vertex_colors(mesh)): # vcols only + if meshtools.average_vcols: name = "\251 Per-Vert Vertex Colors" else: name = "\251 Per-Face Vertex Colors" - elif (mesh.materials) and (not mod_meshtools.has_vertex_colors(mesh)): # materials only + elif (mesh.materials) and (not meshtools.has_vertex_colors(mesh)): # materials only idx = mesh.faces[i].mat #erialIndex name = mesh.materials[idx].name - elif (not mesh.materials) and (not mod_meshtools.has_vertex_colors(mesh)): # neither + elif (not mesh.materials) and (not meshtools.has_vertex_colors(mesh)): # neither name = "\251 Blender Default" else: # both idx = mesh.faces[i].mat @@ -388,7 +388,7 @@ def generate_ptag(mesh, material_names): # =================================================== def generate_vcol_surf(mesh): data = cStringIO.StringIO() - if mod_meshtools.average_vcols and mod_meshtools.has_vertex_colors(mesh): + if meshtools.average_vcols and meshtools.has_vertex_colors(mesh): surface_name = generate_nstring("\251 Per-Vert Vertex Colors") else: surface_name = generate_nstring("\251 Per-Face Vertex Colors") @@ -413,7 +413,7 @@ def generate_vcol_surf(mesh): data.write(generate_nstring("Blender's Vertex Colors")) # name data.write("CMNT") # material comment - comment = "Vertex Colors: Exported from Blender\256 " + mod_meshtools.blender_version_str + comment = "Vertex Colors: Exported from Blender\256 " + meshtools.blender_version_str comment = generate_nstring(comment) data.write(struct.pack(">H", len(comment))) data.write(comment) @@ -452,7 +452,7 @@ def generate_surf(material_name): data.write(struct.pack(">fH", gloss, 0)) data.write("CMNT") # material comment - comment = material_name + ": Exported from Blender\256 " + mod_meshtools.blender_version_str + comment = material_name + ": Exported from Blender\256 " + meshtools.blender_version_str comment = generate_nstring(comment) data.write(struct.pack(">H", len(comment))) data.write(comment) @@ -490,7 +490,7 @@ def generate_default_surf(): data.write(struct.pack(">fH", gloss, 0)) data.write("CMNT") # material comment - comment = material_name + ": Exported from Blender\256 " + mod_meshtools.blender_version_str + comment = material_name + ": Exported from Blender\256 " + meshtools.blender_version_str # vals = map(chr, range(164,255,1)) # keys = range(164,255,1) @@ -509,7 +509,7 @@ def generate_default_surf(): # ============================================ def generate_text(): comment = "Lightwave Export Script for Blender " - comment += mod_meshtools.blender_version_str + "\n" + comment += meshtools.blender_version_str + "\n" comment += "by Anthony D'Agostino\n" comment += "scorpius@netzero.com\n" comment += "http://ourworld.compuserve.com/homepages/scorpius\n" diff --git a/release/scripts/lightwave_import.py b/release/scripts/lightwave_import.py index c795358c734..7e479536678 100644 --- a/release/scripts/lightwave_import.py +++ b/release/scripts/lightwave_import.py @@ -52,7 +52,7 @@ Notes:
# | Read and write LightWave Object File Format (*.lwo) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools import struct, chunk, os, cStringIO, time, operator # ============================= @@ -81,10 +81,10 @@ def read(filename): verts = read_verts(lwochunk) elif lwochunk.chunkname == "POLS" and form_type == "LWO2": # Faces v6.0 faces = read_faces_6(lwochunk) - mod_meshtools.create_mesh(verts, faces, objname) + meshtools.create_mesh(verts, faces, objname) elif lwochunk.chunkname == "POLS" and form_type == "LWOB": # Faces v5.5 faces = read_faces_5(lwochunk) - mod_meshtools.create_mesh(verts, faces, objname) + meshtools.create_mesh(verts, faces, objname) else: # Misc Chunks lwochunk.skip() @@ -95,7 +95,7 @@ def read(filename): if form_type == "LWO2": fmt = " (v6.0 Format)" if form_type == "LWOB": fmt = " (v5.5 Format)" message = "Successfully imported " + os.path.basename(filename) + fmt + seconds - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) # ================== # === Read Verts === @@ -106,7 +106,7 @@ def read_verts(lwochunk): #$verts = [] verts = [None] * numverts for i in range(numverts): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Verts") x, y, z = struct.unpack(">fff", data.read(12)) #$verts.append((x, z, y)) @@ -143,7 +143,7 @@ def read_faces_5(lwochunk): faces = [] i = 0 while i < lwochunk.chunksize: - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/lwochunk.chunksize, "Reading Faces") facev = [] numfaceverts, = struct.unpack(">H", data.read(2)) @@ -186,7 +186,7 @@ def read_faces_6(lwochunk): return "" i = 0 while(i < lwochunk.chunksize-4): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/lwochunk.chunksize, "Reading Faces") facev = [] numfaceverts, = struct.unpack(">H", data.read(2)) diff --git a/release/scripts/mod_ai2obj.py b/release/scripts/mod_ai2obj.py deleted file mode 100644 index 8be6c5e18eb..00000000000 --- a/release/scripts/mod_ai2obj.py +++ /dev/null @@ -1,382 +0,0 @@ -""" -#---------------------------------------------- -# (c) jm soler juillet 2004, released under Blender Artistic Licence -# for the Blender 2.34 Python Scripts Bundle. -#---------------------------------------------- -# Page officielle : -# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_import_ai.htm -# Communiquer les problemes et erreurs sur: -# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender -# -# 0.1.1 : 2004/08/03, bug in boudingbox reading when Value are negative -# -""" -SHARP_IMPORT=0 -SCALE=1 -DEVELOPPEMENT=0 - -import sys -#oldpath=sys.path -import Blender -BLversion=Blender.Get('version') - -try: - import nt - os=nt - os.sep='\\' - -except: - import posix - os=posix - os.sep='/' - -def isdir(path): - 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 - -def join(l0,l1): - return l0+os.sep+l1 - -os.isdir=isdir -os.split=split -os.join=join - -def filtreFICHIER(nom): - f=open(nom,'rU') - t=f.readlines() - f.close() - - if len(t)>1: - return t - else: - name = "OK?%t| Not a valid file or an empty file ... " # if no %xN int is set, indices start from 1 - result = Draw.PupMenu(name) - - return 'false' - -#=============================== -# Data -#=============================== -#=============================== -# Blender Curve Data -#=============================== -objBEZIER=0 -objSURFACE=5 -typBEZIER3D=1 #3D -typBEZIER2D=9 #2D - -class Bez: - def __init__(self): - self.co=[] - self.ha=[0,0] - -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 = [] - -class COURBE: - 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 = {} - -courbes=COURBE() - -PATTERN={} - -BOUNDINGBOX={'rec':[],'coef':1.0} -npat=0 -#===================================================================== -#======== name of the curve in teh courbes dictionnary =============== -#===================================================================== -n0=0 - -#===================================================================== -#====================== current Point ================================ -#===================================================================== -CP=[0.0,0.0] #currentPoint - -#===================================================================== -#===== to compare last position to the original move to displacement = -#===== needed for cyclic efinition ================================= -#===================================================================== -def test_egalitedespositions(f1,f2): - if f1[0]==f2[0] and f1[1]==f2[1]: - return Blender.TRUE - else: - return Blender.FALSE - - -def Open_GEOfile(dir,nom): - if BLversion>=233: - in_editmode = Blender.Window.EditMode() - if in_editmode: Blender.Window.EditMode(0) - Blender.Load(dir+nom+'OOO.obj', 1) - BO=Blender.Object.Get() - BO[-1].RotY=0.0 - BO[-1].makeDisplayList() - Blender.Window.RedrawAll() - else: - print "Not yet implemented" - -def create_GEOtext(courbes): - global SCALE, B, BOUNDINGBOX - 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] - - t=[] - t.append(courbes.magic_number+'\n') - t.append(str(courbes.type)+'\n') - t.append(str(courbes.number_of_items)+'\n') - t.append(str(courbes.ext1_ext2[0])+' '+str(courbes.ext1_ext2[1])+'\n') - t.append(courbes.matrix+'\n') - - for k in courbes.ITEM.keys(): - t.append("%s\n"%courbes.ITEM[k].type) - t.append("%s %s \n"%(courbes.ITEM[k].pntsUV[0],courbes.ITEM[k].pntsUV[1])) - t.append("%s %s \n"%(courbes.ITEM[k].resolUV[0],courbes.ITEM[k].resolUV[1])) - t.append("%s %s \n"%(courbes.ITEM[k].orderUV[0],courbes.ITEM[k].orderUV[1])) - t.append("%s %s \n"%(courbes.ITEM[k].flagUV[0],courbes.ITEM[k].flagUV[1])) - - flag =courbes.ITEM[k].flagUV[0] - - for k2 in range(flag,len(courbes.ITEM[k].beziers_knot)): - k1 =courbes.ITEM[k].beziers_knot[k2] - t.append("%4f 0.0 %4f \n"%(float(k1.co[0])/SCALE,float(k1.co[1])/SCALE)) - t.append("%4f 0.0 %4f \n"%(float(k1.co[2])/SCALE,float(k1.co[3])/SCALE)) - t.append("%4f 0.0 %4f \n"%(float(k1.co[4])/SCALE,float(k1.co[5])/SCALE)) - t.append(str(k1.ha[0])+' '+str(k1.ha[1])+'\n') - return t - -def save_GEOfile(dir,nom,t): - f=open(dir+nom+'OOO.obj','w') - f.writelines(t) - f.close() - #warning = "REMINDER : %t | Do not forget to rename your blender file NOW ! %x1" - #result = Blender.Draw.PupMenu(warning) - - -#===================================================================== -#===== AI format : DEBUT ========================= -#===================================================================== -def mouvement_vers(l,n0,CP): - if n0 in courbes.ITEM.keys(): - #if test_egalitedespositions(courbes.ITEM[n0].Origine,CP): - # courbes.ITEM[n0].flagUV[0]=1 - n0+=1 - else: - CP=[l[-3].replace('d',''),l[-2]] - #i= - courbes.ITEM[n0]=ITEM() - courbes.ITEM[n0].Origine=[l[-3].replace('d',''),l[-2]] - - B=Bez() - B.co=[CP[0],CP[1],CP[0],CP[1],CP[0],CP[1]] - B.ha=[0,0] - courbes.ITEM[n0].beziers_knot.append(B) - - return courbes,n0,CP - -def courbe_vers_c(l,l2, n0,CP): #c,C - - B=Bez() - B.co=[l[2],l[3],l[4],l[5],l[0],l[1]] - - if len(courbes.ITEM[n0].beziers_knot)==1: - CP=[l[0],l[1]] - courbes.ITEM[n0].Origine=[l[0],l[1]] - - if l[-1]=='C': - B.ha=[2,2] - else: - B.ha=[0,0] - - courbes.ITEM[n0].beziers_knot.append(B) - if len(l2)>1 and l2[-1] in Actions.keys(): - B.co[-2]=l2[0] - B.co[-1]=l2[1] - else: - #B.co[-2]=courbes.ITEM[n0].beziers_knot[-1].co[0] - #B.co[-1]=courbes.ITEM[n0].beziers_knot[-].co[1] - - B.co[-2]=CP[0] - B.co[-1]=CP[1] - return courbes,n0,CP - - -def courbe_vers_v(l,n0,CP): #v-V - B=Bez() - B.co=[l[2],l[3],l[0],l[1],l[2],l[3]] - if l[-1]=='V': - B.ha=[2,2] - else: - B.ha=[0,0] - courbes.ITEM[n0].beziers_knot.append(B) - CP=[l[0],l[1]] - return courbes,n0,CP - -def courbe_vers_y(l,n0,CP): #y - B=Bez() - B.co=[l[2],l[3],l[0],l[1],l[2],l[3]] - if l[-1]=='Y': - B.ha=[2,2] - else: - B.ha=[0,0] - courbes.ITEM[n0].beziers_knot.append(B) - CP=[l[2],l[3]] - return courbes,n0,CP - - -def ligne_tracee_l(l,n0,CP): - B=Bez() - B.co=[l[0],l[1],l[0],l[1],l[0],l[1]] - if l[-1]=='L': - B.ha=[2,2] - else: - B.ha=[0,0] - courbes.ITEM[n0].beziers_knot.append(B) - CP=[l[0],l[1]] - return courbes,n0,CP - -Actions= { "C" : courbe_vers_c, - "c" : courbe_vers_c, - "V" : courbe_vers_v, - "v" : courbe_vers_v, - "Y" : courbe_vers_y, - "y" : courbe_vers_y, - "m" : mouvement_vers, - "l" : ligne_tracee_l, - "L" : ligne_tracee_l} - -TAGcourbe=Actions.keys() - -def pik_pattern(t,l): - global npat, PATTERN, BOUNDINGBOX - while t[l].find('%%EndSetup')!=0: - if t[l].find('%%BoundingBox:')!=-1: - t[l]=t[l][t[l].find(':')+1:] - l0=t[l].split() - BOUNDINGBOX['rec']=[float(l0[-4]),float(l0[-3]),float(l0[-2]),float(l0[-1])] - r=BOUNDINGBOX['rec'] - BOUNDINGBOX['coef']=(r[3]-r[1])/(r[2]-r[0]) - #print l, - if t[l].find('BeginPattern')!=-1: - nomPattern=t[l][t[l].find('(')+1:t[l].find(')')] - PATTERN[nomPattern]={} - - if t[l].find('BeginPatternLayer')!=-1: - npat+=1 - PATTERN[nomPattern][npat]=[] - while t[l].find('EndPatternLayer')==-1: - #print t[l] - PATTERN[nomPattern][npat].append(l) - l+=1 - if l+10: - if len(PATTERN.keys() )>0: - #print len(PATTERN.keys() ) - warning = "Pattern list (for info not used): %t| " - p0=1 - for P in PATTERN.keys(): - warning+="%s %%x%s|"%(P,p0) - p0+=1 - Padd = Blender.Draw.PupMenu(warning) - - t=create_GEOtext(courbes) - save_GEOfile(dir,name[0],t) - Open_GEOfile(dir,name[0]) - else: - pass -#===================================================================== -#====================== AI format mouvements ========================= -#===================================================================== -#========================================================= -# une sorte de contournement qui permet d'utiliser la fonction -# et de documenter les variables Window.FileSelector -#========================================================= -def fonctionSELECT(nom): - scan_FILE(nom) - -if DEVELOPPEMENT==1: - Blender.Window.FileSelector (fonctionSELECT, 'SELECT AI FILE') -#sys.path=oldpath diff --git a/release/scripts/mod_blender.py b/release/scripts/mod_blender.py deleted file mode 100644 index a4e4419381d..00000000000 --- a/release/scripts/mod_blender.py +++ /dev/null @@ -1,37 +0,0 @@ -# $Id$ -# -# -------------------------------------------------------------------------- -# mod_blender.py version 0.2 Jul 26, 2004 -# -------------------------------------------------------------------------- -# helper functions to be used by other scripts -# -------------------------------------------------------------------------- -# ***** BEGIN GPL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# ***** END GPL LICENCE BLOCK ***** -# -------------------------------------------------------------------------- - -# Basic set of modules Blender should have in all supported platforms. -# The second and third lines are the contents of the Python23.zip file -# included with Windows Blender binaries along with zlib.pyd. -# Other platforms are assumed to have Python installed. -basic_modules = [ -'Blender', -'chunk','colorsys','copy','copy_reg','gzip','os','random','repr','stat', -'string','StringIO','types','UserDict','webbrowser','whrandom', -'zlib', -'math' -] diff --git a/release/scripts/mod_eps2obj.py b/release/scripts/mod_eps2obj.py deleted file mode 100644 index 8db89892fc6..00000000000 --- a/release/scripts/mod_eps2obj.py +++ /dev/null @@ -1,390 +0,0 @@ -#---------------------------------------------- -# (c) jm soler juillet 2004, released under Blender Artistic Licence -# for the Blender 2.34 Python Scripts Bundle. -#---------------------------------------------- -# Page officielle : -# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_import_eps.htm -# Communiquer les problemes et erreurs sur: -# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender -#---------------------------------------------- - -SHARP_IMPORT=0 -SCALE=1 -scale=1 - -import sys -#oldpath=sys.path -import Blender -BLversion=Blender.Get('version') - -try: - import nt - os=nt - os.sep='\\' - -except: - import posix - os=posix - os.sep='/' - -def isdir(path): - 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 - -def join(l0,l1): - return l0+os.sep+l1 - -os.isdir=isdir -os.split=split -os.join=join - -def filtreFICHIER(nom): - f=open(nom,'r') - t=f.readlines() - f.close() - if len(t)==1 and t[0].find('\r'): - t=t[0].split('\r') - if len(t)>1: - return t - else: - name = "OK?%t| Not a valid file or an empty file ... " # if no %xN int is set, indices start from 1 - result = Draw.PupMenu(name) - return 'false' - -#=============================== -# Data -#=============================== -#=============================== -# Blender Curve Data -#=============================== -objBEZIER=0 -objSURFACE=5 -typBEZIER3D=1 #3D -typBEZIER2D=9 #2D - -class Bez: - def __init__(self): - self.co=[] - self.ha=[0,0] - -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 = [] - -class COURBE: - 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 """ #- right-handed object matrix. Used to determine position, rotation and size - self.ITEM = {} - -courbes=COURBE() -PATTERN={} -BOUNDINGBOX={'rec':[],'coef':1.0} -npat=0 -#===================================================================== -#======== name of the curve in teh courbes dictionnary =============== -#===================================================================== -n0=0 - -#===================================================================== -#====================== current Point ================================ -#===================================================================== -CP=[0.0,0.0] #currentPoint - -#===================================================================== -#===== to compare last position to the original move to displacement = -#===== needed for cyclic efinition ================================= -#===================================================================== -def test_egalitedespositions(f1,f2): - if f1[0]==f2[0] and f1[1]==f2[1]: - return Blender.TRUE - else: - return Blender.FALSE - - -def Open_GEOfile(dir,nom): - global SCALE,BOUNDINGBOX, scale - if BLversion>=233: - Blender.Load(dir+nom+'OOO.obj', 1) - BO=Blender.Object.Get() - - BO[-1].RotY=3.1416 - BO[-1].RotZ=3.1416 - BO[-1].RotX=3.1416/2.0 - if scale==1: - BO[-1].LocY+=BOUNDINGBOX['rec'][3] - else: - BO[-1].LocY+=BOUNDINGBOX['rec'][3]/SCALE - - BO[-1].makeDisplayList() - Blender.Window.RedrawAll() - else: - print "Not yet implemented" - -def create_GEOtext(courbes): - global SCALE, B, BOUNDINGBOX,scale - 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] - - t=[] - t.append(courbes.magic_number+'\n') - t.append(str(courbes.type)+'\n') - t.append(str(courbes.number_of_items)+'\n') - t.append(str(courbes.ext1_ext2[0])+' '+str(courbes.ext1_ext2[1])+'\n') - t.append(courbes.matrix+'\n') - - for k in courbes.ITEM.keys(): - t.append("%s\n"%courbes.ITEM[k].type) - t.append("%s %s \n"%(courbes.ITEM[k].pntsUV[0],courbes.ITEM[k].pntsUV[1])) - t.append("%s %s \n"%(courbes.ITEM[k].resolUV[0],courbes.ITEM[k].resolUV[1])) - t.append("%s %s \n"%(courbes.ITEM[k].orderUV[0],courbes.ITEM[k].orderUV[1])) - t.append("%s %s \n"%(courbes.ITEM[k].flagUV[0],courbes.ITEM[k].flagUV[1])) - - flag =courbes.ITEM[k].flagUV[0] - - for k2 in range(flag,len(courbes.ITEM[k].beziers_knot)): - k1 =courbes.ITEM[k].beziers_knot[k2] - t.append("%4f 0.0 %4f \n"%(float(k1.co[0])/SCALE,float(k1.co[1])/SCALE)) - t.append("%4f 0.0 %4f \n"%(float(k1.co[2])/SCALE,float(k1.co[3])/SCALE)) - t.append("%4f 0.0 %4f \n"%(float(k1.co[4])/SCALE,float(k1.co[5])/SCALE)) - t.append(str(k1.ha[0])+' '+str(k1.ha[1])+'\n') - return t - -def save_GEOfile(dir,nom,t): - f=open(dir+nom+'OOO.obj','w') - f.writelines(t) - f.close() - - #name = "REMINDER : %t | Do not forget to rename your blender file NOW ! %x1" - #result = Blender.Draw.PupMenu(name) - - -#===================================================================== -#===== EPS format : DEBUT ========================= -#===================================================================== -def mouvement_vers(l,n0,CP): - if n0 in courbes.ITEM.keys(): - #if test_egalitedespositions(courbes.ITEM[n0].Origine,CP): - # courbes.ITEM[n0].flagUV[0]=1 - n0+=1 - CP=[l[-3].replace('d',''),l[-2]] - else: - CP=[l[-3].replace('d',''),l[-2]] - #i= - courbes.ITEM[n0]=ITEM() - courbes.ITEM[n0].Origine=[l[-3].replace('d',''),l[-2]] - - B=Bez() - B.co=[CP[0],CP[1],CP[0],CP[1],CP[0],CP[1]] - B.ha=[0,0] - courbes.ITEM[n0].beziers_knot.append(B) - - return courbes,n0,CP - -def rmouvement_vers(l,n0,CP): - if n0 in courbes.ITEM.keys(): - #if test_egalitedespositions(courbes.ITEM[n0].Origine,CP): - # courbes.ITEM[n0].flagUV[0]=1 - n0+=1 - CP=["%4f"%(float(l[-3])+float(CP[0])),"%4f"%(float(l[-2])+float(CP[1]))] - else: - CP=["%4f"%(float(l[-3])+float(CP[0])),"%4f"%(float(l[-2])+float(CP[1]))] - #i= - courbes.ITEM[n0]=ITEM() - courbes.ITEM[n0].Origine=[l[-3].replace('d',''),l[-2]] - - B=Bez() - B.co=[CP[0],CP[1],CP[0],CP[1],CP[0],CP[1]] - B.ha=[0,0] - courbes.ITEM[n0].beziers_knot.append(B) - return courbes,n0,CP - -def courbe_vers_c(l, l2, n0,CP): #c,C - """ - B=Bez() - B.co=[l[0],l[1],l[2],l[3],l[4],l[5]] - B.ha=[0,0] - - courbes.ITEM[n0].beziers_knot.append(B) - """ - B=Bez() - B.co=[l[2],l[3],l[4],l[5],l[0],l[1]] - if len(courbes.ITEM[n0].beziers_knot)==1: - CP=[l[0],l[1]] - courbes.ITEM[n0].Origine=[l[0],l[1]] - if l[-1]=='C': - B.ha=[2,2] - else: - B.ha=[0,0] - courbes.ITEM[n0].beziers_knot.append(B) - if len(l2)>1 and l2[-1] in Actions.keys(): - B.co[-2]=l2[0] - B.co[-1]=l2[1] - else: - B.co[-2]=CP[0] - B.co[-1]=CP[1] - return courbes,n0,CP - -def ligne_tracee_l(l,n0,CP): - B=Bez() - B.co=[l[0],l[1],l[0],l[1],l[0],l[1]] - B.ha=[0,0] - courbes.ITEM[n0].beziers_knot.append(B) - CP=[l[0],l[1]] - return courbes,n0,CP - -def rligne_tracee_l(l,n0,CP): - B=Bez() - B.co=["%4f"%(float(l[0])+float(CP[0])), - "%4f"%(float(l[1])+float(CP[1])), - "%4f"%(float(l[0])+float(CP[0])), - "%4f"%(float(l[1])+float(CP[1])), - "%4f"%(float(l[0])+float(CP[0])), - "%4f"%(float(l[1])+float(CP[1]))] - B.ha=[0,0] - courbes.ITEM[n0].beziers_knot.append(B) - CP=[l[0],l[1]] - return courbes,n0,CP - -Actions= { "curveto" : courbe_vers_c, - "curveto" : courbe_vers_c, - "moveto" : mouvement_vers, - "rmoveto" : mouvement_vers, - "lineto" : ligne_tracee_l, - "rlineto" : rligne_tracee_l -} - -TAGcourbe=Actions.keys() - -""" -def pik_pattern(t,l): - global npat, PATTERN, BOUNDINGBOX - while t[l].find('%%EndSetup')!=0: - if t[l].find('%%BoundingBox:')!=-1: - l0=t[l].split() - BOUNDINGBOX['rec']=[float(l0[-4]),float(l0[-3]),float(l0[-2]),float(l0[-1])] - r=BOUNDINGBOX['rec'] - BOUNDINGBOX['coef']=(r[3]-r[1])/(r[2]-r[0]) - print l, - if t[l].find('BeginPatternLayer')!=-1: - npat+=1 - PATTERN[npat]=[] - while t[l].find('EndPatternLayer')==-1: - print t[l] - PATTERN[npat].append(l) - l+=1 - if l+10: - if len(PATTERN.keys() )>0: - #print len(PATTERN.keys() ) - pass - t=create_GEOtext(courbes) - save_GEOfile(dir,name[0],t) - Open_GEOfile(dir,name[0]) - else: - pass - - -#===================================================================== -#====================== EPS format mouvements ========================= -#===================================================================== -#========================================================= -# une sorte de contournement qui permet d'utiliser la fonction -# et de documenter les variables Window.FileSelector -#========================================================= -def fonctionSELECT(nom): - scan_FILE(nom) - -#Blender.Window.FileSelector (fonctionSELECT, 'SELECT .EPS/.PS FILE') -#sys.path=oldpath diff --git a/release/scripts/mod_gimp2obj.py b/release/scripts/mod_gimp2obj.py deleted file mode 100644 index 7128107cfcd..00000000000 --- a/release/scripts/mod_gimp2obj.py +++ /dev/null @@ -1,320 +0,0 @@ -""" -#---------------------------------------------- -# (c) jm soler juillet 2004, released under Blender Artistic Licence -# for the Blender 2.34 Python Scripts Bundle. -#---------------------------------------------- -# Page officielle : -# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_import_gimp.htm -# Communiquer les problemes et erreurs sur: -# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender -#--------------------------------------------- -""" -SHARP_IMPORT=0 -SCALE=1 - -import sys -#oldpath=sys.path - -import Blender -BLversion=Blender.Get('version') - -try: - import nt - os=nt - os.sep='\\' - -except: - import posix - os=posix - os.sep='/' - -def isdir(path): - 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 - -def join(l0,l1): - return l0+os.sep+l1 - -os.isdir=isdir -os.split=split -os.join=join - -def filtreFICHIER(nom): - f=open(nom,'r') - t=f.readlines() - f.close() - if len(t)==1 and t[0].find('\r'): - t=t[0].split('\r') - if len(t)>1 and t[1].find('#POINTS:')==0: - return t - else: - warning = "OK?%t| Not a valid file or an empty file ... " # if no %xN int is set, indices start from 1 - result = Blender.Draw.PupMenu(warning) - return "false" - -#=============================== -# Data -#=============================== -#=============================== -# Blender Curve Data -#=============================== -objBEZIER=0 -objSURFACE=5 -typBEZIER3D=1 #3D -typBEZIER2D=9 #2D - -class Bez: - def __init__(self): - self.co=[] - self.ha=[0,0] - - def echo(self): - #print 'co = ', self.co - #print 'ha = ', self.ha - pass - -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 = [] - -class COURBE: - 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 """ #- right-handed object matrix. Used to determine position, rotation and size - self.ITEM = {} - -courbes=COURBE() -PATTERN={} -BOUNDINGBOX={'rec':[],'coef':1.0} -npat=0 -#===================================================================== -#======== name of the curve in the courbes dictionnary =============== -#===================================================================== -n0=0 - -#===================================================================== -#====================== current Point ================================ -#===================================================================== -CP=[0.0,0.0] #currentPoint - -def MINMAX(b): - global BOUNDINGBOX - r=BOUNDINGBOX['rec'] - for m in range(0,len(b)-2,2): - #print m, m+1 , len(b)-1 - #print b[m], r, r[0] - if float(b[m])r[2]: r[2]=float(b[m]) - - if float(b[m+1])r[3]: r[3]=float(b[m+1]) - -#===================================================================== -#===== to compare last position to the original move to displacement = -#===== needed for cyclic efinition ================================= -#===================================================================== -def test_egalitedespositions(f1,f2): - if f1[0]==f2[0] and f1[1]==f2[1]: - return Blender.TRUE - else: - return Blender.FALSE - - -def Open_GEOfile(dir,nom): - if BLversion>=233: - Blender.Load(dir+nom+'OOO.obj', 1) - BO=Blender.Object.Get() - - BO[-1].LocZ=1.0 - - BO[-1].makeDisplayList() - Blender.Window.RedrawAll() - else: - print "Not yet implemented" - -def create_GEOtext(courbes): - global SCALE, B, BOUNDINGBOX - 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] - - t=[] - t.append(courbes.magic_number+'\n') - t.append(str(courbes.type)+'\n') - t.append(str(courbes.number_of_items)+'\n') - t.append(str(courbes.ext1_ext2[0])+' '+str(courbes.ext1_ext2[1])+'\n') - t.append(courbes.matrix+'\n') - - for k in courbes.ITEM.keys(): - - t.append("%s\n"%courbes.ITEM[k].type) - - t.append("%s %s \n"%(courbes.ITEM[k].pntsUV[0],courbes.ITEM[k].pntsUV[1])) - t.append("%s %s \n"%(courbes.ITEM[k].resolUV[0],courbes.ITEM[k].resolUV[1])) - t.append("%s %s \n"%(courbes.ITEM[k].orderUV[0],courbes.ITEM[k].orderUV[1])) - t.append("%s %s \n"%(courbes.ITEM[k].flagUV[0],courbes.ITEM[k].flagUV[1])) - - flag =0#courbes.ITEM[k].flagUV[0] - - for k2 in range(flag,len(courbes.ITEM[k].beziers_knot)): - k1 =courbes.ITEM[k].beziers_knot[k2] - t.append("%4f 0.0 %4f \n"%(float(k1.co[0])/SCALE,float(k1.co[1])/SCALE)) - t.append("%4f 0.0 %4f \n"%(float(k1.co[4])/SCALE,float(k1.co[5])/SCALE)) - t.append("%4f 0.0 %4f \n"%(float(k1.co[2])/SCALE,float(k1.co[3])/SCALE)) - t.append(str(k1.ha[0])+' '+str(k1.ha[1])+'\n') - return t - -def save_GEOfile(dir,nom,t): - f=open(dir+nom+'OOO.obj','w') - f.writelines(t) - f.close() - #warning = "REMINDER : %t | Do not forget to rename your blender file NOW ! %x1" - #result = Blender.Draw.PupMenu(warning) - - -#===================================================================== -#===== GIMP format : DEBUT ========================= -#===================================================================== -CLOSED=0 - -def mouvement_vers(l,l1,l2,n0): - global BOUNDINGBOX, CP - if l[1] == '3' : - n0+=1 - courbes.ITEM[n0]=ITEM() - courbes.ITEM[n0].Origine=[l[-3],l[-1],] - courbes.ITEM[n0-1].beziers_knot[0].co[0]=CP[0] - courbes.ITEM[n0-1].beziers_knot[0].co[1]=CP[1] - CP=[l2[-3], l2[-1]] - - elif l[1]=='1' and (n0 not in courbes.ITEM.keys()): - courbes.ITEM[n0]=ITEM() - courbes.ITEM[n0].Origine=[l[-3],l[-1],] - CP=[l2[-3], l2[-1]] - - B=Bez() - B.co=[ CP[0],CP[1], - l1[-3], l1[-1], - l[-3], l[-1]] - - CP=[l2[-3], l2[-1]] - - if BOUNDINGBOX['rec']==[]: - BOUNDINGBOX['rec']=[float(l2[-3]), float(l2[-1]), float(l[-3]), float(l[-1])] - B.ha=[0,0] - - """ - if len( courbes.ITEM[n0].beziers_knot)>=1: - courbes.ITEM[n0].beziers_knot[-1].co[2]=l1[-3] - courbes.ITEM[n0].beziers_knot[-1].co[3]=l1[-1] - """ - - MINMAX(B.co) - courbes.ITEM[n0].beziers_knot.append(B) - return courbes,n0 - -Actions= { "1" : mouvement_vers, - "3" : mouvement_vers } - -TAGcourbe=Actions.keys() - -def scan_FILE(nom): - global CP, courbes, SCALE, MAX, MIN, CLOSED - dir,name=split(nom) - name=name.split('.') - #print name - n0=0 - result=0 - t=filtreFICHIER(nom) - if t!="false": - if not SHARP_IMPORT: - warning = "Select Size : %t| As is %x1 | Scale on Height %x2| Scale on Width %x3" - SCALE = Blender.Draw.PupMenu(warning) - npat=0 - l=0 - while l 0: - t=create_GEOtext(courbes) - save_GEOfile(dir,name[0],t) - Open_GEOfile(dir,name[0]) - else: - pass - -#===================================================================== -#====================== GIMP Path format mouvements ========================= -#===================================================================== -#========================================================= -# une sorte de contournement qui permet d'utiliser la fonction -# et de documenter les variables Window.FileSelector -#========================================================= -def fonctionSELECT(nom): - scan_FILE(nom) - -#Blender.Window.FileSelector (fonctionSELECT, 'SELECT a GIMP Path FILE') -#sys.path=oldpath diff --git a/release/scripts/mod_meshtools.py b/release/scripts/mod_meshtools.py deleted file mode 100644 index 772b7549a11..00000000000 --- a/release/scripts/mod_meshtools.py +++ /dev/null @@ -1,331 +0,0 @@ -# $Id$ -# -# +---------------------------------------------------------+ -# | Copyright (c) 2001 Anthony D'Agostino | -# | http://www.redrival.com/scorpius | -# | scorpius@netzero.com | -# | September 28, 2002 | -# | Released under the Blender Artistic Licence (BAL) | -# | Import Export Suite v0.5 | -# +---------------------------------------------------------+ -# | Common Functions & Global Variables For All IO Modules | -# +---------------------------------------------------------+ - -import Blender -import sys - -show_progress = 1 # Set to 0 for faster performance -average_vcols = 1 # Off for per-face, On for per-vertex -overwrite_mesh_name = 0 # Set to 0 to increment object-name version - -blender_version = Blender.Get('version') -blender_version_str = `blender_version`[0] + '.' + `blender_version`[1:] - -try: - import operator -except: - msg = "Error: you need a full Python install to run this script." - mod_meshtools.print_boxed(msg) - Blender.Draw.PupMenu("ERROR%t|"+msg) - -# ================================= -# === Append Faces To Face List === -# ================================= -def append_faces(mesh, faces, facesuv, uvcoords): - for i in range(len(faces)): - if not i%100 and show_progress: Blender.Window.DrawProgressBar(float(i)/len(faces), "Generating Faces") - numfaceverts=len(faces[i]) - if numfaceverts <= 4: # This face is a triangle or quad - face = Blender.NMesh.Face() - for j in range(numfaceverts): - index = faces[i][j] - face.v.append(mesh.verts[index]) - if len(uvcoords) > 1: - uvidx = facesuv[i][j] - face.uv.append(uvcoords[uvidx]) - face.mode = 0 - face.col = [Blender.NMesh.Col()]*4 - mesh.faces.append(face) - else: # Triangulate n-sided convex polygon. - a, b, c = 0, 1, 2 # Indices of first triangle. - for j in range(numfaceverts-2): # Number of triangles in polygon. - face = Blender.NMesh.Face() - face.v.append(mesh.verts[faces[i][a]]) - face.v.append(mesh.verts[faces[i][b]]) - face.v.append(mesh.verts[faces[i][c]]) - b = c; c += 1 - mesh.faces.append(face) - #face.smooth = 1 - -# =================================== -# === Append Verts to Vertex List === -# =================================== -def append_verts(mesh, verts, normals): - #print "Number of normals:", len(normals) - #print "Number of verts :", len(verts) - for i in range(len(verts)): - if not i%100 and show_progress: Blender.Window.DrawProgressBar(float(i)/len(verts), "Generating Verts") - x, y, z = verts[i] - mesh.verts.append(Blender.NMesh.Vert(x, y, z)) - if normals: - mesh.verts[i].no[0] = normals[i][0] - mesh.verts[i].no[1] = normals[i][1] - mesh.verts[i].no[2] = normals[i][2] - -# =========================== -# === Create Blender Mesh === -# =========================== -def create_mesh(verts, faces, objname, facesuv=[], uvcoords=[], normals=[]): - if normals: normal_flag = 0 - else: normal_flag = 1 - mesh = Blender.NMesh.GetRaw() - append_verts(mesh, verts, normals) - append_faces(mesh, faces, facesuv, uvcoords) - if not overwrite_mesh_name: - objname = versioned_name(objname) - Blender.NMesh.PutRaw(mesh, objname, normal_flag) # Name the Mesh - Blender.Object.GetSelected()[0].name=objname # Name the Object - Blender.Redraw() - -# ============================== -# === Increment Name Version === -# ============================== -def versioned_name(objname): - existing_names = [] - for object in Blender.Object.Get(): - existing_names.append(object.name) - data = object.data - if data: existing_names.append(data.name) - if objname in existing_names: # don't over-write other names - try: - name, ext = objname.split('.') - except ValueError: - name, ext = objname, '' - try: - num = int(ext) - root = name - except ValueError: - root = objname - for i in xrange(1, 1000): - objname = "%s.%03d" % (root, i) - if objname not in existing_names: - break - return objname - -# =========================== -# === Print Text In A Box === -# =========================== -def print_boxed(text): - lines = text.splitlines() - maxlinelen = max(map(len, lines)) - if sys.platform[:3] == "win": - print chr(218)+chr(196) + chr(196)*maxlinelen + chr(196)+chr(191) - for line in lines: - print chr(179) + ' ' + line.ljust(maxlinelen) + ' ' + chr(179) - print chr(192)+chr(196) + chr(196)*maxlinelen + chr(196)+chr(217) - else: - print '+-' + '-'*maxlinelen + '-+' - for line in lines: print '| ' + line.ljust(maxlinelen) + ' |' - print '+-' + '-'*maxlinelen + '-+' - print '\a\r', # beep when done - -# =============================================== -# === Get euler angles from a rotation matrix === -# =============================================== -def mat2euler(mat): - angle_y = -math.asin(mat[0][2]) - c = math.cos(angle_y) - if math.fabs(c) > 0.005: - angle_x = math.atan2(mat[1][2]/c, mat[2][2]/c) - angle_z = math.atan2(mat[0][1]/c, mat[0][0]/c) - else: - angle_x = 0.0 - angle_z = -math.atan2(mat[1][0], mat[1][1]) - return (angle_x, angle_y, angle_z) - -# ========================== -# === Transpose A Matrix === -# ========================== -def transpose(A): - S = len(A) - T = len(A[0]) - B = [[None]*S for i in range(T)] - for i in range(T): - for j in range(S): - B[i][j] = A[j][i] - return B - -# ======================= -# === Apply Transform === -# ======================= -def apply_transform(vertex, matrix): - x, y, z = vertex - xloc, yloc, zloc = matrix[3][0], matrix[3][1], matrix[3][2] - xcomponent = x*matrix[0][0] + y*matrix[1][0] + z*matrix[2][0] + xloc - ycomponent = x*matrix[0][1] + y*matrix[1][1] + z*matrix[2][1] + yloc - zcomponent = x*matrix[0][2] + y*matrix[1][2] + z*matrix[2][2] + zloc - vertex = [xcomponent, ycomponent, zcomponent] - return vertex - -# ========================= -# === Has Vertex Colors === -# ========================= -def has_vertex_colors(mesh): - # My replacement/workaround for hasVertexColours() - # The docs say: - # "Warning: If a mesh has both vertex colours and textured faces, - # this function will return False. This is due to the way Blender - # deals internally with the vertex colours array (if there are - # textured faces, it is copied to the textured face structure and - # the original array is freed/deleted)." - try: - return mesh.faces[0].col[0] - except: - return 0 - -# =========================== -# === Generate Edge Table === -# =========================== -def generate_edgetable(mesh): - edge_table = {} - numfaces = len(mesh.faces) - - for i in range(numfaces): - if not i%100 and show_progress: - Blender.Window.DrawProgressBar(float(i)/numfaces, "Generating Edge Table") - if len(mesh.faces[i].v) == 4: # Process Quadrilaterals - generate_entry_from_quad(mesh, i, edge_table) - elif len(mesh.faces[i].v) == 3: # Process Triangles - generate_entry_from_tri(mesh, i, edge_table) - else: # Skip This Face - print "Face #", i, "was skipped." - - # === Sort Edge_Table Keys & Add Edge Indices === - i = 0 - keys = edge_table.keys() - keys.sort() - for key in keys: - edge_table[key][6] = i - i += 1 - - # === Replace Tuples With Indices === - for key in keys: - for i in [2,3,4,5]: - if edge_table.has_key(edge_table[key][i]): - edge_table[key][i] = edge_table[edge_table[key][i]][6] - else: - keyrev = (edge_table[key][i][1], edge_table[key][i][0]) - edge_table[key][i] = edge_table[keyrev][6] - - return edge_table - -# ================================ -# === Generate Entry From Quad === -# ================================ -def generate_entry_from_quad(mesh, i, edge_table): - vertex4, vertex3, vertex2, vertex1 = mesh.faces[i].v - - if has_vertex_colors(mesh): - vcolor4, vcolor3, vcolor2, vcolor1 = mesh.faces[i].col - Acol = (vcolor1.r/255.0, vcolor1.g/255.0, vcolor1.b/255.0) - Bcol = (vcolor2.r/255.0, vcolor2.g/255.0, vcolor2.b/255.0) - Ccol = (vcolor3.r/255.0, vcolor3.g/255.0, vcolor3.b/255.0) - Dcol = (vcolor4.r/255.0, vcolor4.g/255.0, vcolor4.b/255.0) - - # === verts are upper case, edges are lower case === - A, B, C, D = vertex1.index, vertex2.index, vertex3.index, vertex4.index - a, b, c, d = (A, B), (B, C), (C, D), (D, A) - - if edge_table.has_key((B, A)): - edge_table[(B, A)][1] = i - edge_table[(B, A)][4] = d - edge_table[(B, A)][5] = b - if has_vertex_colors(mesh): edge_table[(B, A)][8] = Bcol - else: - if has_vertex_colors(mesh): - edge_table[(A, B)] = [i, None, d, b, None, None, None, Bcol, None] - else: - edge_table[(A, B)] = [i, None, d, b, None, None, None] - - if edge_table.has_key((C, B)): - edge_table[(C, B)][1] = i - edge_table[(C, B)][4] = a - edge_table[(C, B)][5] = c - if has_vertex_colors(mesh): edge_table[(C, B)][8] = Ccol - else: - if has_vertex_colors(mesh): - edge_table[(B, C)] = [i, None, a, c, None, None, None, Ccol, None] - else: - edge_table[(B, C)] = [i, None, a, c, None, None, None] - - if edge_table.has_key((D, C)): - edge_table[(D, C)][1] = i - edge_table[(D, C)][4] = b - edge_table[(D, C)][5] = d - if has_vertex_colors(mesh): edge_table[(D, C)][8] = Dcol - else: - if has_vertex_colors(mesh): - edge_table[(C, D)] = [i, None, b, d, None, None, None, Dcol, None] - else: - edge_table[(C, D)] = [i, None, b, d, None, None, None] - - if edge_table.has_key((A, D)): - edge_table[(A, D)][1] = i - edge_table[(A, D)][4] = c - edge_table[(A, D)][5] = a - if has_vertex_colors(mesh): edge_table[(A, D)][8] = Acol - else: - if has_vertex_colors(mesh): - edge_table[(D, A)] = [i, None, c, a, None, None, None, Acol, None] - else: - edge_table[(D, A)] = [i, None, c, a, None, None, None] - -# ==================================== -# === Generate Entry From Triangle === -# ==================================== -def generate_entry_from_tri(mesh, i, edge_table): - vertex3, vertex2, vertex1 = mesh.faces[i].v - - if has_vertex_colors(mesh): - vcolor3, vcolor2, vcolor1, _vcolor4_ = mesh.faces[i].col - Acol = (vcolor1.r/255.0, vcolor1.g/255.0, vcolor1.b/255.0) - Bcol = (vcolor2.r/255.0, vcolor2.g/255.0, vcolor2.b/255.0) - Ccol = (vcolor3.r/255.0, vcolor3.g/255.0, vcolor3.b/255.0) - - # === verts are upper case, edges are lower case === - A, B, C = vertex1.index, vertex2.index, vertex3.index - a, b, c = (A, B), (B, C), (C, A) - - if edge_table.has_key((B, A)): - edge_table[(B, A)][1] = i - edge_table[(B, A)][4] = c - edge_table[(B, A)][5] = b - if has_vertex_colors(mesh): edge_table[(B, A)][8] = Bcol - else: - if has_vertex_colors(mesh): - edge_table[(A, B)] = [i, None, c, b, None, None, None, Bcol, None] - else: - edge_table[(A, B)] = [i, None, c, b, None, None, None] - - if edge_table.has_key((C, B)): - edge_table[(C, B)][1] = i - edge_table[(C, B)][4] = a - edge_table[(C, B)][5] = c - if has_vertex_colors(mesh): edge_table[(C, B)][8] = Ccol - else: - if has_vertex_colors(mesh): - edge_table[(B, C)] = [i, None, a, c, None, None, None, Ccol, None] - else: - edge_table[(B, C)] = [i, None, a, c, None, None, None] - - if edge_table.has_key((A, C)): - edge_table[(A, C)][1] = i - edge_table[(A, C)][4] = b - edge_table[(A, C)][5] = a - if has_vertex_colors(mesh): edge_table[(A, C)][8] = Acol - else: - if has_vertex_colors(mesh): - edge_table[(C, A)] = [i, None, b, a, None, None, None, Acol, None] - else: - edge_table[(C, A)] = [i, None, b, a, None, None, None] - diff --git a/release/scripts/mod_svg2obj.py b/release/scripts/mod_svg2obj.py deleted file mode 100644 index 7445b13a4a7..00000000000 --- a/release/scripts/mod_svg2obj.py +++ /dev/null @@ -1,660 +0,0 @@ -""" -SVG 2 OBJ translater, 0.2.6 -(c) jm soler juillet/novembre 2004, released under Blender Artistic Licence - for the Blender 2.34/35 Python Scripts Bundle. -#--------------------------------------------------------------------------- -# Page officielle : -# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_import_svg.htm -# Communiquer les problemes et erreurs sur: -# 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 : - 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: - M : absolute move to - Z : close path - L : absolute line to - C : absolute curve to - S : absolute curve to with only one handle - l : relative line to 2004/08/03 - c : relative curve to 2004/08/03 - s : relative curve to with only one handle - -To do: A,S,V,H,Q,T, - a,s, m, v, h, q,t - -Changelog: - 0.1.1 : - control file without extension - 0.2.0 : - improved reading of several data of the same type - following the same command (for gimp import) - 0.2.1 : - better choice for viewboxing ( takes the viewbox if found, - instead of x,y,width and height - 0.2.2 : - read compact path data from Illustrator 10 - 0.2.3 : - read a few new relative displacements - 0.2.4 : - better hash for command with followed by a lone data - (h,v) or uncommun number (a) - 0.2.5 : - correction for gimp import - 0.2.6 : - correction for illustrator 10 SVG - -================================================================================== -==================================================================================""" - -SHARP_IMPORT=0 -SCALE=1 -scale=1 -DEBUG =0 #print -DEVELOPPEMENT=0 - -import sys -#oldpath=sys.path -import Blender -BLversion=Blender.Get('version') - -try: - import nt - os=nt - os.sep='\\' - -except: - import posix - os=posix - os.sep='/' - -def isdir(path): - 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 - -def join(l0,l1): - return l0+os.sep+l1 - -os.isdir=isdir -os.split=split -os.join=join - -def filtreFICHIER(nom): - f=open(nom,'rU') - t=f.read() - f.close() - - t=t.replace('\r','') - t=t.replace('\n','') - - if t.upper().find('=233: - Blender.Load(dir+nom+'OOO.obj', 1) - BO=Blender.Object.Get() - - BO[-1].RotY=3.1416 - BO[-1].RotZ=3.1416 - BO[-1].RotX=3.1416/2.0 - - if scale==1: - BO[-1].LocY+=BOUNDINGBOX['rec'][3] - else: - BO[-1].LocY+=BOUNDINGBOX['rec'][3]/SCALE - - BO[-1].makeDisplayList() - Blender.Window.RedrawAll() - else: - print "Not yet implemented" - -def create_GEOtext(courbes): - global SCALE, B, BOUNDINGBOX,scale - 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] - - t=[] - t.append(courbes.magic_number+'\n') - t.append(str(courbes.type)+'\n') - t.append(str(courbes.number_of_items)+'\n') - t.append(str(courbes.ext1_ext2[0])+' '+str(courbes.ext1_ext2[1])+'\n') - t.append(courbes.matrix+'\n') - - for k in courbes.ITEM.keys(): - t.append("%s\n"%courbes.ITEM[k].type) - t.append("%s %s \n"%(courbes.ITEM[k].pntsUV[0],courbes.ITEM[k].pntsUV[1])) - t.append("%s %s \n"%(courbes.ITEM[k].resolUV[0],courbes.ITEM[k].resolUV[1])) - t.append("%s %s \n"%(courbes.ITEM[k].orderUV[0],courbes.ITEM[k].orderUV[1])) - t.append("%s %s \n"%(courbes.ITEM[k].flagUV[0],courbes.ITEM[k].flagUV[1])) - - flag =0#courbes.ITEM[k].flagUV[0] - - for k2 in range(flag,len(courbes.ITEM[k].beziers_knot)): - #k1 =courbes.ITEM[k].beziers_knot[k2] - k1=ajustement(courbes.ITEM[k].beziers_knot[k2], SCALE) - - t.append("%4f 0.0 %4f \n"%(k1[4],k1[5])) - t.append("%4f 0.0 %4f \n"%(k1[0],k1[1])) - t.append("%4f 0.0 %4f \n"%(k1[2],k1[3])) - t.append(str(courbes.ITEM[k].beziers_knot[k2].ha[0])+' '+str(courbes.ITEM[k].beziers_knot[k2].ha[1])+'\n') - - return t - -def save_GEOfile(dir,nom,t): - f=open(dir+nom+'OOO.obj','w') - f.writelines(t) - f.close() - #warning = "REMINDER : %t | Do not forget to rename your blender file NOW ! %x1" - #result = Blender.Draw.PupMenu(warning) - - -def filtre_DATA(c,D,n): - global DEBUG,TAGcourbe - l=[] - - if len(c[0])==1 and D[c[1]+1].find(',')!=-1: - for n2 in range(1,n+1): - ld=D[c[1]+n2].split(',') - for l_ in ld: - l.append(l_) - - elif len(c[0])==1 and D[c[1]+2][0] not in TAGcourbe: - for n2 in range(1,n*2+1): - l.append(D[c[1]+n2]) - if DEBUG==1 : print l - - return l - -#===================================================================== -#===== SVG format : DEBUT ========================= -#===================================================================== - -def contruit_SYMETRIC(l): - L=[float(l[0]), float(l[1]), - float(l[2]),float(l[3])] - X=L[0]-(L[2]-L[0]) - Y=L[1]-(L[3]-L[1]) - l =[l[0],l[1],"%4s"%X,"%4s"%Y,l[2],l[3]] - return l - -def mouvement_vers(c, D, n0,CP): - global DEBUG,TAGcourbe - #print c,D[c[1]+1] - - l=filtre_DATA(c,D,1) - #print l - if n0 in courbes.ITEM.keys(): - n0+=1 - CP=[l[0],l[1]] - else: - CP=[l[0],l[1]] - - courbes.ITEM[n0]=ITEM() - courbes.ITEM[n0].Origine=[l[0],l[1]] - - B=Bez() - B.co=[CP[0],CP[1],CP[0],CP[1],CP[0],CP[1]] - B.ha=[0,0] - - courbes.ITEM[n0].beziers_knot.append(B) - if DEBUG==1: print courbes.ITEM[n0], CP - - - return courbes,n0,CP - -def boucle_z(c,D,n0,CP): #Z,z - #print c, 'close' - courbes.ITEM[n0].flagUV[0]=1 - return courbes,n0,CP - -def courbe_vers_s(c,D,n0,CP): #S,s - l=filtre_DATA(c,D,2) - if c[0]=='s': - l=["%4s"%(float(l[0])+float(CP[0])), - "%4s"%(float(l[1])+float(CP[1])), - "%4s"%(float(l[2])+float(CP[0])), - "%4s"%(float(l[3])+float(CP[1]))] - l=contruit_SYMETRIC(l) - B=Bez() - B.co=[l[4],l[5],l[2],l[3],l[0],l[1]] #plus toucher au 2-3 - B.ha=[0,0] - - BP=courbes.ITEM[n0].beziers_knot[-1] - BP.co[2]=l[2] #4-5 point prec - BP.co[3]=l[3] - - courbes.ITEM[n0].beziers_knot.append(B) - if DEBUG==1: print B.co,BP.co - CP=[l[4],l[5]] - - if len(D)')+1] - t=t[t.find('>')+1:] - - if DEBUG==3 : print t[:10], val - - return t,val - -def get_val(val,t): - d="" - for l in t: - if l.find(val+'="')!=-1: - d=l[l[:-1].rfind('"')+1:-1] - for nn in d : - if '012345670.'.find(nn)==-1: - d=d.replace(nn,"") - d=float(d) - break - d=0.0 - return d - -def get_BOUNDBOX(BOUNDINGBOX,SVG,viewbox): - if viewbox==0: - h=get_val('height',SVG) - w=get_val('width',SVG) - BOUNDINGBOX['rec']=[0.0,0.0,w,h] - r=BOUNDINGBOX['rec'] - BOUNDINGBOX['coef']=w/h - else: - viewbox=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 - -def unpack_DATA(DATA): - DATA[0]=DATA[0].replace('-',',-') - for d in Actions.keys(): - DATA[0]=DATA[0].replace(d,','+d+',') - DATA[0]=DATA[0].replace(',,',',') - if DATA[0][0]==',':DATA[0]=DATA[0][1:] - if DATA[0][-1]==',':DATA[0]=DATA[0][:-1] - DATA[0]=DATA[0].replace('\n','') - DATA[0]=DATA[0].replace('\t','') - DATA[0]=DATA[0].split(',') - D2=[] - D1=DATA[0] - - for cell in range(len(D1)): - if D1[cell] in Actions.keys(): - D2.append(D1[cell]) - n=1 - if D1[cell] not in ['h','v','H','V','a','A']: - while cell+n+1 D = :", D0 - - if len(D)==1 or len(D[0])>1: - D1=[] - for D0 in D: - D1+=unpack_DATA([D0])[:] - D=D1 - - #print "D2= :",D - return t,D - - -def scan_FILE(nom): - global CP, courbes, SCALE, DEBUG, BOUNDINGBOX, scale - dir,name=split(nom) - name=name.split('.') - n0=0 - result=0 - - t=filtreFICHIER(nom) - - if t!='false': - if not SHARP_IMPORT: - warning = "Select Size : %t| As is %x1 | Scale on Height %x2| Scale on Width %x3" - scale = Blender.Draw.PupMenu(warning) - npat=0 - l=0 - do=0 - t,SVG=get_tag('svg',t) - - SVG,viewbox=get_content('viewBox',SVG) - - SVG=SVG.split(' ') - if viewbox==0: - BOUNDINGBOX = get_BOUNDBOX(BOUNDINGBOX,SVG,0) - else: - BOUNDINGBOX = get_BOUNDBOX(BOUNDINGBOX,SVG,viewbox) - - #print t - - while t.find('path')!=-1: - t,D=format_PATH(t) - cursor=0 - for cell in D: - if DEBUG==2 : print 'cell : ',cell ,' --' - if len(cell)>=1 and cell[0] in TAGcourbe: - courbes,n0,CP=Actions[cell]([cell,cursor], D, n0,CP) - cursor+=1 - - courbes.number_of_items=len(courbes.ITEM.keys()) - - for k in courbes.ITEM.keys(): - courbes.ITEM[k].pntsUV[0] =len(courbes.ITEM[k].beziers_knot) - - if courbes.number_of_items>0: - if len(PATTERN.keys() )>0: - if DEBUG == 3 : print len(PATTERN.keys() ) - t=create_GEOtext(courbes) - save_GEOfile(dir,name[0],t) - Open_GEOfile(dir,name[0]) - else: - pass - -def ajustement(v,s): - - a,b,c,d,e,f=float(v.co[0]),float(v.co[1]),float(v.co[2]),float(v.co[3]),float(v.co[4]),float(v.co[5]) - return [a/s,-b/s,c/s,-d/s,e/s,-f/s] - -#===================================================================== -#====================== SVG format mouvements ======================== -#===================================================================== - -#===================================================================== -# une sorte de contournement qui permet d'utiliser la fonction -# et de documenter les variables Window.FileSelector -#===================================================================== -def fonctionSELECT(nom): - scan_FILE(nom) - -if DEVELOPPEMENT==1: - Blender.Window.FileSelector (fonctionSELECT, 'SELECT a .SVG FILE') - #sys.path=oldpath diff --git a/release/scripts/nendo_export.py b/release/scripts/nendo_export.py index 1dd84bb6d81..830c4303f56 100644 --- a/release/scripts/nendo_export.py +++ b/release/scripts/nendo_export.py @@ -59,7 +59,7 @@ field. # | Read and write Nendo File Format (*.nendo) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools import struct, time, sys, os # ============================== @@ -82,15 +82,15 @@ def write(filename): Blender.Draw.PupMenu("Nendo Export Error%t|"+message) return - edge_table = mod_meshtools.generate_edgetable(mesh) + edge_table = meshtools.generate_edgetable(mesh) try: - edge_table = mod_meshtools.generate_edgetable(mesh) + edge_table = meshtools.generate_edgetable(mesh) assert len(edge_table) <= maxedges except: edge_table = {} message = "Unable to generate Edge Table for the object named " + meshname - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) Blender.Draw.PupMenu("Edge Table Error%t|"+message) Blender.Window.DrawProgressBar(1.0, "") # clear progressbar return @@ -109,7 +109,7 @@ def write(filename): end = time.clock() seconds = " in %.2f %s" % (end-start, "seconds") message = "Successfully exported " + os.path.basename(filename) + seconds - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) # ==================== # === Write Header === diff --git a/release/scripts/nendo_import.py b/release/scripts/nendo_import.py index 2af19ff5a5d..e7f3071bd99 100644 --- a/release/scripts/nendo_import.py +++ b/release/scripts/nendo_import.py @@ -54,7 +54,7 @@ edges during the course of modeling. # | Read and write Nendo File Format (*.nendo) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools import struct, time, sys, os # ============================= @@ -75,7 +75,7 @@ def read(filename): uv = read_uv(file) verts = make_verts(vert_table) faces = make_faces(edge_table) - mod_meshtools.create_mesh(verts, faces, objname) + meshtools.create_mesh(verts, faces, objname) Blender.Window.DrawProgressBar(1.0, "Done") # clear progressbar file.close() @@ -83,7 +83,7 @@ def read(filename): seconds = " in %.2f %s" % (end-start, "seconds") message = "Successfully imported " + os.path.basename(filename) + seconds message += " (%s)" % version.title() - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) # ======================= # === Read The Header === @@ -93,7 +93,7 @@ def read_header(file): misc, = struct.unpack(">H", file.read(2)) numobjs, = struct.unpack(">B", file.read(1)) if (version != "nendo 1.0") and (version != "nendo 1.1"): - mod_meshtools.print_boxed(file.name, "is not a Nendo file") + meshtools.print_boxed(file.name, "is not a Nendo file") return return version, numobjs @@ -116,7 +116,7 @@ def read_edge_table(file, version): numedges, = struct.unpack(">H", file.read(2)) edge_table = {} for i in range(numedges): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numedges, "Reading Edge Table") edge = struct.unpack(">8H", file.read(16)) if version == "nendo 1.1": @@ -132,7 +132,7 @@ def read_face_table(file): numfaces, = struct.unpack(">H", file.read(2)) face_table = {} for i in range(numfaces): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Face Table") face_table[i] = struct.unpack(">H", file.read(2))[0] return face_table @@ -144,7 +144,7 @@ def read_vert_table(file): numverts, = struct.unpack(">H", file.read(2)) vert_table = [] for i in range(numverts): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Vertex Table") w, x, y, z = struct.unpack(">H3f", file.read(14)) vert_table.append((w,(x, y, z))) @@ -164,7 +164,7 @@ def read_uv(file): print "%ix%i" % (xres, yres) pixel = 0 while pixel < (xres*yres): - if not pixel%100 and mod_meshtools.show_progress: + if not pixel%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(pixel)/xres*yres, "Reading Texture") count, = struct.unpack(">B", file.read(1)) rgb = file.read(3) @@ -183,7 +183,7 @@ def make_verts(vert_table): verts = [] for i in range(len(vert_table)): vertex = vert_table[i][1] - vertex = mod_meshtools.apply_transform(vertex, matrix) + vertex = meshtools.apply_transform(vertex, matrix) verts.append(vertex) return verts diff --git a/release/scripts/off_export.py b/release/scripts/off_export.py index 332d553b389..8465720478f 100644 --- a/release/scripts/off_export.py +++ b/release/scripts/off_export.py @@ -39,7 +39,7 @@ Notes:
# | Read and write Object File Format (*.off) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools #import time # ============================== @@ -62,14 +62,14 @@ def write(filename): # === Vertex List === for i in range(len(mesh.verts)): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.verts), "Writing Verts") x, y, z = mesh.verts[i].co file.write("%f %f %f\n" % (x, y, z)) # === Face List === for i in range(len(mesh.faces)): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/len(mesh.faces), "Writing Faces") file.write(`len(mesh.faces[i].v)`+' ') mesh.faces[i].v.reverse() @@ -83,7 +83,7 @@ def write(filename): #end = time.clock() #seconds = " in %.2f %s" % (end-start, "seconds") message = "Successfully exported " + Blender.sys.basename(filename)# + seconds - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) def fs_callback(filename): if filename.find('.off', -4) <= 0: filename += '.off' diff --git a/release/scripts/off_import.py b/release/scripts/off_import.py index 94b6423149a..cbaab483154 100644 --- a/release/scripts/off_import.py +++ b/release/scripts/off_import.py @@ -41,7 +41,7 @@ Notes:
# | Read and write Object File Format (*.off) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools #import time # ============================= @@ -67,7 +67,7 @@ def read(filename): # === Vertex List === for i in range(numverts): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Verts") if has_uv: x, y, z, u, v = map(float, file.readline().split()) @@ -78,7 +78,7 @@ def read(filename): # === Face List === for i in range(numfaces): - if not i%100 and mod_meshtools.show_progress: + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Faces") line = file.readline().split() numfaceverts = len(line)-1 @@ -91,13 +91,13 @@ def read(filename): objname = Blender.sys.splitext(Blender.sys.basename(filename))[0] - mod_meshtools.create_mesh(verts, faces, objname, faces, uv) + meshtools.create_mesh(verts, faces, objname, faces, uv) Blender.Window.DrawProgressBar(1.0, '') # clear progressbar file.close() #end = time.clock() #seconds = " in %.2f %s" % (end-start, "seconds") message = "Successfully imported " + Blender.sys.basename(filename)# + seconds - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) def fs_callback(filename): read(filename) diff --git a/release/scripts/paths_import.py b/release/scripts/paths_import.py index 0ec2b4e2f8a..889bcdad1e6 100644 --- a/release/scripts/paths_import.py +++ b/release/scripts/paths_import.py @@ -46,19 +46,19 @@ import Blender argv=__script__['arg'] if argv=='SVG': - from mod_svg2obj import * + from svg2obj import * elif argv=='AI': - from mod_ai2obj import * + from ai2obj import * elif argv=='EPS': - from mod_eps2obj import * + from eps2obj import * elif argv=='Gimp_1_0': - from mod_gimp2obj import * + from gimp2obj import * elif argv=='Gimp_2_0': - from mod_svg2obj import * + from svg2obj import * text = 'Import %s' % argv Blender.Window.FileSelector (fonctionSELECT, text) diff --git a/release/scripts/radiosity_export.py b/release/scripts/radiosity_export.py index c9d5128b367..4f7766c3dd5 100644 --- a/release/scripts/radiosity_export.py +++ b/release/scripts/radiosity_export.py @@ -52,14 +52,14 @@ specular highlights to the vertex colors. # | Read and write Radiosity File Format (*.radio) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools #import time try: import struct except: msg = "Error: you need a full Python install to run this script." - mod_meshtools.print_boxed(msg) + meshtools.print_boxed(msg) Blender.Draw.PupMenu("ERROR%t|"+msg) # ================================ @@ -75,10 +75,10 @@ def write(filename): mesh = Blender.NMesh.GetRaw(meshname) obj = Blender.Object.Get(objname) - if not mod_meshtools.has_vertex_colors(mesh): + if not meshtools.has_vertex_colors(mesh): message = "Please assign vertex colors before exporting. \n" message += objname + " object was not saved." - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) Blender.Draw.PupMenu("ERROR%t|"+message) return @@ -89,7 +89,7 @@ def write(filename): # === Vertex List === file.write(struct.pack(" # | Read and write RAW Triangle File Format (*.raw) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools import sys #import time @@ -78,7 +78,7 @@ def write(filename): #end = time.clock() #seconds = " in %.2f %s" % (end-start, "seconds") message = "Successfully exported " + Blender.sys.basename(filename)# + seconds - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) def fs_callback(filename): if filename.find('.raw', -4) <= 0: filename += '.raw' diff --git a/release/scripts/raw_import.py b/release/scripts/raw_import.py index 13b2e187826..c793791664f 100644 --- a/release/scripts/raw_import.py +++ b/release/scripts/raw_import.py @@ -44,7 +44,7 @@ tolerance. # | Read and write RAW Triangle File Format (*.raw) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools #import time # ================================ @@ -79,13 +79,13 @@ def read(filename): objname = Blender.sys.splitext(Blender.sys.basename(filename))[0] - mod_meshtools.create_mesh(verts, faces, objname) + meshtools.create_mesh(verts, faces, objname) Blender.Window.DrawProgressBar(1.0, '') # clear progressbar file.close() #end = time.clock() #seconds = " in %.2f %s" % (end-start, "seconds") message = "Successfully imported " + Blender.sys.basename(filename)# + seconds - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) def fs_callback(filename): read(filename) diff --git a/release/scripts/slp_import.py b/release/scripts/slp_import.py index e8c84f62ba2..246f84ec02b 100644 --- a/release/scripts/slp_import.py +++ b/release/scripts/slp_import.py @@ -42,7 +42,7 @@ tolerance. # | Read and write SLP Triangle File Format (*.slp) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools #import time # ================================ @@ -86,13 +86,13 @@ def read(filename): objname = Blender.sys.splitext(Blender.sys.basename(filename))[0] - mod_meshtools.create_mesh(verts, faces, objname) + meshtools.create_mesh(verts, faces, objname) Blender.Window.DrawProgressBar(1.0, '') # clear progressbar file.close() #end = time.clock() #seconds = " in %.2f %s" % (end-start, "seconds") message = "Successfully imported " + Blender.sys.basename(filename)# + seconds - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) def fs_callback(filename): read(filename) diff --git a/release/scripts/sysinfo.py b/release/scripts/sysinfo.py index 04d31ccec16..daa6867e1a8 100644 --- a/release/scripts/sysinfo.py +++ b/release/scripts/sysinfo.py @@ -2,14 +2,14 @@ """ Name: 'System Information...' -Blender: 234 +Blender: 236 Group: 'HelpSystem' Tooltip: 'Information about your Blender environment, useful to diagnose problems.' """ __author__ = "Willian P. Germano" __url__ = ("blender", "elysiun") -__version__ = "1.0" +__version__ = "1.1" __bpydoc__ = """\ This script creates a text in Blender's Text Editor with information about your OS, video card, OpenGL driver, Blender and Python versions and @@ -24,7 +24,7 @@ or the program's developers. # $Id$ # # -------------------------------------------------------------------------- -# sysinfo.py version 1.0 Jun 09, 2004 +# sysinfo.py version 1.1 Mar 20, 2005 # -------------------------------------------------------------------------- # ***** BEGIN GPL LICENSE BLOCK ***** # @@ -37,7 +37,7 @@ or the program's developers. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License @@ -48,6 +48,7 @@ or the program's developers. # -------------------------------------------------------------------------- import Blender +import Blender.sys as bsys from Blender.BGL import * import sys @@ -55,25 +56,26 @@ Blender.Window.WaitCursor(1) # has_textwrap = 1 # see commented code below output_filename = "system-info.txt" warnings = 0 +notices = 0 # non critical warnings def cutPoint(text, length): - "Returns position of the last space found before 'length' chars" - l = length - c = text[l] - while c != ' ': - l -= 1 - if l == 0: return length # no space found - c = text[l] - return l + "Returns position of the last space found before 'length' chars" + l = length + c = text[l] + while c != ' ': + l -= 1 + if l == 0: return length # no space found + c = text[l] + return l def textWrap(text, length = 70): - lines = [] - while len(text) > 70: - cpt = cutPoint(text, length) - line, text = text[:cpt], text[cpt + 1:] - lines.append(line) - lines.append(text) - return lines + lines = [] + while len(text) > 70: + cpt = cutPoint(text, length) + line, text = text[:cpt], text[cpt + 1:] + lines.append(line) + lines.append(text) + return lines ## Better use our own text wrap functions here #try: @@ -83,7 +85,7 @@ def textWrap(text, length = 70): # msg = sys.exc_info()[1].__str__().split()[3] # Blender.Draw.PupMenu("Python error:|This script requires the %s module" %msg) -header = "= Blender %s System Information =" % Blender.Get("version") +header = "= Blender %s System Information =" % Blender.Get("version") lilies = len(header)*"="+"\n" header = lilies + header + "\n" + lilies @@ -97,66 +99,148 @@ output.write("Python:\n======\n\n") output.write("- Version: %s\n\n" % sys.version) output.write("- Path:\n\n") for p in sys.path: - output.write(p + '\n') + output.write(p + '\n') -output.write("\n- Default folder for registered scripts:\n\n") -scriptsdir = Blender.Get("scriptsdir") -if not scriptsdir: - output.write(" -- not found") - warnings += 1 +output.write("\n- Directories:") + +if not Blender.Get('homedir'): + outmsg = """ + + - Blender home dir not found! + This should probably be "/.blender/" + where is usually the user's home dir. + + Blender's home dir is where entries like: + folders scripts/, plugins/ and locale/ and + files .Blanguages and .bfont.ttf + are located. + + It's also where Blender stores the Bpymenus file + with information about registered scripts, so it + only needs to scan scripts dir(s) when they are + modified. +""" + output.write(outmsg) + if Blender.Get('scriptsdir').find('release') > 0: + output.write(""" +It seems this Blender binary is located at its cvs source tree: +that's ok, but the scripts registration data will be recreated +from dir(s) whenever you start the program, instead of only +when those dirs are modified. + +Adding a .blender/ subdir to e. g. your home dir can prevent that. +""") + +dirlist = [ + ['homedir', 'Blender home dir', 1], + ['scriptsdir', 'Default dir for scripts', 1], + ['datadir', 'Default "bpydata/" data dir for scripts', 1], + ['uscriptsdir', 'User defined dir for scripts', 0], + ['udatadir', 'Data dir "bpydata/" inside user defined dir', 0] +] + +for dir in dirlist: + dirname, dirstr, is_critical = dir + dirpath = Blender.Get(dirname) + output.write("\n\n %s:\n" % dirstr) + if not dirpath: + if is_critical: + warnings += 1 + output.write(" -- not found") + else: + notices += 1 + output.write(" -- not found") + else: + output.write(" %s" % dirpath) + +configdir = bsys.join(Blender.Get('datadir'), 'config') +output.write('\n\n Default config data "bpydata/config/" dir:') +if bsys.exists(configdir): + output.write(" %s" % configdir) else: - output.write(scriptsdir) + warnings += 1 + output.write(""" + -- not found. + config/ should be inside the default scripts *data dir*. + It's used by Blender to store scripts configuration data. +""") + +if Blender.Get('udatadir'): + uconfigdir = bsys.join(Blender.Get('udatadir'), 'config') + output.write("\n\n User defined config data dir:") + if bsys.exists(configdir): + output.write(" %s" % configdir) + else: + notices += 1 + output.write(""" + -- not found. + bpydata/config/ should be inside the user defined scripts dir. + It's used by Blender to store scripts configuration data. + (Since it is on the user defined dir, a new Blender installation + won't overwrite the data.) +""") missing_mods = [] # missing basic modules try: - from mod_blender import basic_modules - for m in basic_modules: - try: exec ("import %s" % m) - except: missing_mods.append(m) - - if missing_mods: - output.write("\n\n:\n\nSome expected modules were not found.\n") - output.write("Because of that some scripts bundled with Blender may not work.\n") - output.write("Please read the FAQ in the Readme.html file shipped with Blender\n") - output.write("for information about how to fix the problem.\n\n") - output.write("The missing modules:\n") - warnings += 1 - for m in missing_mods: - output.write('-> ' + m + '\n') - else: - output.write("\n\n- Modules: all basic ones were found.\n") - -except: - output.write("\n\n:\nCouldn't find mod_blender.py in scripts dir.") - output.write("\nBasic modules availability won't be tested.\n") - warnings += 1 - + from BPyBlender import basic_modules + for m in basic_modules: + try: exec ("import %s" % m) + except: missing_mods.append(m) + + if missing_mods: + outmsg = """ + +: + +Some expected modules were not found. +Because of that some scripts bundled with Blender may not work. +Please read the FAQ in the Readme.html file shipped with Blender +for information about how to fix the problem. +Missing modules:""" + output.write(outmsg) + warnings += 1 + for m in missing_mods: + output.write('-> ' + m + '\n') + else: + output.write("\n\n- Modules: all basic ones were found.\n") + +except ImportError: + output.write("\n\n:\n Couldn't find BPyBlender.py in scripts/bpymodules/ dir.") + output.write("\n Basic modules availability won't be tested.\n") + warnings += 1 output.write("\nOpenGL:\n======\n\n") -output.write("- Renderer: %s\n" % glGetString(GL_RENDERER)) -output.write("- Vendor: %s\n" % glGetString(GL_VENDOR)) -output.write("- Version: %s\n\n" % glGetString(GL_VERSION)) +output.write("- Renderer: %s\n" % glGetString(GL_RENDERER)) +output.write("- Vendor: %s\n" % glGetString(GL_VENDOR)) +output.write("- Version: %s\n\n" % glGetString(GL_VERSION)) output.write("- Extensions:\n\n") glext = glGetString(GL_EXTENSIONS) glext = textWrap(glext, 70) for l in glext: - output.write(l + "\n") + output.write(l + "\n") output.write("\n\n- Simplistic almost useless benchmark:\n\n") t = Blender.sys.time() nredraws = 10 for i in range(nredraws): - Blender.Redraw(-1) # redraw all windows -result = str(Blender.sys.time() - t) -output.write("Redrawing all areas %s times took %s seconds.\n" % (nredraws, result)) - -if (warnings): - output.write("\n(*) Found %d warning" % warnings) - if (warnings > 1): output.write("s") # (blush) - output.write(", documented in the text above.") + Blender.Redraw(-1) # redraw all windows +result = Blender.sys.time() - t +output.write("Redrawing all areas %s times took %.4f seconds.\n" % (nredraws, result)) + +if warnings or notices: + output.write("\n%s%s\n" % (warnings*"#", notices*".")) + if warnings: + output.write("\n(*) Found %d warning" % warnings) + if (warnings > 1): output.write("s") # (blush) + output.write(", documented in the text above.\n") + if notices: + output.write("\n(*) Found %d notice" % notices) + if (notices > 1): output.write("s") # (blush) + output.write(", documented in the text above.\n") + else: output.write("\n==\nNo problems were found (scroll up for details).") Blender.Window.WaitCursor(0) diff --git a/release/scripts/truespace_export.py b/release/scripts/truespace_export.py index d9cd0b1ad99..af9aa2a5a23 100644 --- a/release/scripts/truespace_export.py +++ b/release/scripts/truespace_export.py @@ -63,7 +63,7 @@ how to handle it. # | Read and write Caligari trueSpace File Format (*.cob) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools import struct, os, cStringIO, time # ============================== @@ -86,7 +86,7 @@ def write(filename): grou = generate_grou('Group ' + `objects.index(object)+1`) polh = generate_polh(objname, obj, mesh) - if mod_meshtools.has_vertex_colors(mesh): vcol = generate_vcol(mesh) + if meshtools.has_vertex_colors(mesh): vcol = generate_vcol(mesh) unit = generate_unit() mat1 = generate_mat1(mesh) @@ -94,7 +94,7 @@ def write(filename): write_chunk(file, "Grou", 0, 1, G, X, grou) write_chunk(file, "PolH", 0, 4, P, G, polh) - if mod_meshtools.has_vertex_colors(mesh) and vcol: + if meshtools.has_vertex_colors(mesh) and vcol: write_chunk(file, "VCol", 1, 0, V, P, vcol) write_chunk(file, "Unit", 0, 1, U, P, unit) write_chunk(file, "Mat1", 0, 5, M, P, mat1) @@ -109,7 +109,7 @@ def write(filename): end = time.clock() seconds = " in %.2f %s" % (end-start, "seconds") message = "Successfully exported " + os.path.basename(filename) + seconds - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) # ============================= # === Write COB File Header === @@ -163,7 +163,7 @@ def write_CurrentPosition(data, obj): def write_VertexList(data, mesh): data.write(struct.pack(" # | Read and write Wings3D File Format (*.wings) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools import struct, time, sys, os, zlib, cStringIO # =============================================== @@ -74,7 +74,7 @@ def write_faces(data, mesh): numfaces = len(mesh.faces) data.write(struct.pack(">BL", 0x6C, numfaces)) #for i in range(numfaces): - # if not i%100 and mod_meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numfaces, "Writing Faces") + # if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numfaces, "Writing Faces") # data.write("\x6A") data.write("\x6A" * numfaces) # same, but faster than the above loop data.write("\x6A") @@ -86,7 +86,7 @@ def write_verts(data, mesh): numverts = len(mesh.verts) data.write(struct.pack(">BL", 0x6C, numverts)) for i in range(numverts): - if not i%100 and mod_meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numverts, "Writing Verts") + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numverts, "Writing Verts") data.write(struct.pack(">BLBL", 0x6C, 1, 0x6D, 24)) #data.write("\x6c\x00\x00\x00\x01\x6D\x00\x00\x00\x30") x, y, z = mesh.verts[i].co @@ -104,9 +104,9 @@ def write_edges(data, mesh, edge_table): keys.sort() for key in keys: i = edge_table[key][6] - if not i%100 and mod_meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numedges, "Writing Edges") + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numedges, "Writing Edges") - if mod_meshtools.has_vertex_colors(mesh): + if meshtools.has_vertex_colors(mesh): r1, g1, b1 = edge_table[key][7] r2, g2, b2 = edge_table[key][8] data.write("\x6C\x00\x00\x00\x02") @@ -141,7 +141,7 @@ def write_mode(data, mesh): data.write("\x6A") data.write(struct.pack(">BL", 0x6C, 1)) write_chunkheader(data, 0x68, 0x02, "mode") - if mod_meshtools.has_vertex_colors(mesh): + if meshtools.has_vertex_colors(mesh): data.write(struct.pack(">BH6s", 0x64, 6, "vertex")) else: data.write(struct.pack(">BH8s", 0x64, 8, "material")) @@ -313,12 +313,12 @@ def write(filename): obj = Blender.Object.Get(objname) try: - edge_table = mod_meshtools.generate_edgetable(mesh) + edge_table = meshtools.generate_edgetable(mesh) except: edge_table = {} message = "Unable to generate\nEdge Table for mesh.\n" message += "Object name is: " + meshname - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) Blender.Draw.PupMenu("Wings Export error|Unable to generate Edge Table for mesh") return @@ -369,7 +369,7 @@ def write(filename): message += "faces : " + `len(mesh.faces)` + '\n' message += "edges : " + `len(edge_table)` + '\n' message += "verts : " + `len(mesh.verts)` + '\n' - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) def fs_callback(filename): if filename.find('.wings', -6) <= 0: filename += '.wings' diff --git a/release/scripts/wings_import.py b/release/scripts/wings_import.py index dc28e978aae..70f124b3bac 100644 --- a/release/scripts/wings_import.py +++ b/release/scripts/wings_import.py @@ -53,7 +53,7 @@ Notes:
# | Read and write Wings3D File Format (*.wings) | # +---------------------------------------------------------+ -import Blender, mod_meshtools +import Blender, meshtools import struct, time, sys, os, zlib, cStringIO # ============================================== @@ -107,7 +107,7 @@ def read_edges(data): misc, numedges = struct.unpack(">BL", data.read(5)) edge_table = {} # the winged-edge table for i in range(numedges): - if not i%100 and mod_meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numedges, "Reading Edges") + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numedges, "Reading Edges") misc, etype = struct.unpack(">BL", data.read(5)) if etype == 2: # Vertex Colors data.read(10) # or read_chunkheader(data) # "color" @@ -136,7 +136,7 @@ def read_edges(data): def read_faces(data): misc, numfaces = struct.unpack(">BL", data.read(5)) for i in range(numfaces): - if not i%100 and mod_meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Faces") + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Faces") if data.read(1) == '\x6C': # a material follows data.read(4) read_chunkheader(data) @@ -153,7 +153,7 @@ def read_verts(data): misc, numverts = struct.unpack(">BL", data.read(5)) verts = [] # a list of verts for i in range(numverts): - if not i%100 and mod_meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Verts") + if not i%100 and meshtools.show_progress: Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Verts") data.read(10) x, y, z = struct.unpack(">ddd", data.read(24)) # double precision verts.append((x, -z, y)) @@ -305,7 +305,7 @@ def read(filename): read_mode(data) faces = make_faces(edge_table) message += "%s %8s %8s %8s\n" % (objname.ljust(15), len(faces), len(edge_table), len(verts)) - mod_meshtools.create_mesh(verts, faces, objname) + meshtools.create_mesh(verts, faces, objname) material = data.read() #for i in material[0:6]: print "%02X" % ord(i), @@ -315,7 +315,7 @@ def read(filename): end = time.clock() seconds = "\nDone in %.2f %s" % (end-start, "seconds") message += seconds - mod_meshtools.print_boxed(message) + meshtools.print_boxed(message) def fs_callback(filename): read(filename) -- cgit v1.2.3