Scripts:
authorWillian Padovani Germano <wpgermano@gmail.com>
Thu, 24 Jun 2004 15:03:08 +0000 (15:03 +0000)
committerWillian Padovani Germano <wpgermano@gmail.com>
Thu, 24 Jun 2004 15:03:08 +0000 (15:03 +0000)
- Added KlopUtils by Carlos Lopez and Batch Object Name Edit by Campbell Barton (thanks both!)

BPython:
- Fixed things I recently broke in Blender.sys, added Blender.sys.join(dir, file)
- doc and other minor updates

release/bpydata/KUlang.txt [new file with mode: 0644]
release/bpydata/readme.txt
release/scripts/batch_name_edit.py [new file with mode: 0644]
release/scripts/kloputils.py [new file with mode: 0644]
source/blender/python/api2_2x/Draw.c
source/blender/python/api2_2x/Sys.c
source/blender/python/api2_2x/doc/Sys.py

diff --git a/release/bpydata/KUlang.txt b/release/bpydata/KUlang.txt
new file mode 100644 (file)
index 0000000..ad773ef
--- /dev/null
@@ -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|Allign Objects%x1|Create%x2|Edit Meshes%x3|Edit Objects%x4
+11
+Mov
+Sca
+Fit
+Embrace
+Separate
+Allign
+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
index d518634c2c42aece1275260a35e2796bd4388f1c..3e640e27c4b3ef68ed1179bcd6d9826949fc6dd6 100644 (file)
@@ -1,2 +1,9 @@
-This directory will be the default place for scripts to put their data,
+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/batch_name_edit.py b/release/scripts/batch_name_edit.py
new file mode 100644 (file)
index 0000000..8702634
--- /dev/null
@@ -0,0 +1,99 @@
+#!BPY
+
+"""
+Name: 'Batch Object Name Edit'
+Blender: 232
+Group: 'Object'
+Tooltip: 'Apply the chosen rule to rename all selected objects at once.'
+"""
+
+# $Id$
+#
+# --------------------------------------------------------------------------
+# Batch Name Edit by Campbell Barton (AKA Ideasman)
+# --------------------------------------------------------------------------
+# ***** 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 *****
+# --------------------------------------------------------------------------
+
+from Blender import *
+
+def replace():
+       replace = Draw.PupStrInput('replace: ', '', 32)
+       if replace == None: return
+               
+       with = Draw.PupStrInput('with: ', '', 32)
+       if with == None: return
+       
+       for ob in Object.GetSelected():
+               
+               if replace in ob.name:
+                       chIdx = ob.name.index(replace)
+                       
+                       # Remove the offending word and replace it with - 'with'
+                       ob.name = ob.name[ :chIdx] + with + ob.name[chIdx + len(replace):]
+                       
+
+def prefix():
+       prefix = Draw.PupStrInput('prefix: ', '', 32)
+       if prefix == None: return
+       
+       for ob in Object.GetSelected():
+               ob.name = prefix + ob.name
+
+
+def suffix():
+       suffix = Draw.PupStrInput('suffix: ', '', 32)
+       if suffix == None: return
+       
+       for ob in Object.GetSelected():
+               ob.name = ob.name + suffix
+
+def truncate_start():
+       truncate = Draw.PupIntInput('truncate start: ', 0, 0, 31)
+       if truncate != None:
+               for ob in Object.GetSelected():
+                       ob.name = ob.name[truncate: ]
+
+def truncate_end():
+       truncate = Draw.PupIntInput('truncate end: ', 0, 0, 31)
+       if truncate == None: return
+       
+       for ob in Object.GetSelected():
+               ob.name = ob.name[ :-truncate]
+
+
+
+
+name = "Selected Object Names%t|Replace Text|Add Prefix|Add Suffix|Truncate Start|Truncate End"
+result = Draw.PupMenu(name)
+
+if result == -1:
+       pass
+elif result == 1:
+       replace()
+elif result == 2:
+       prefix()
+elif result == 3:
+       suffix()
+elif result == 4:
+       truncate_start()
+elif result == 5:
+       truncate_end()
+
+
diff --git a/release/scripts/kloputils.py b/release/scripts/kloputils.py
new file mode 100644 (file)
index 0000000..a67498d
--- /dev/null
@@ -0,0 +1,943 @@
+#!BPY
+
+""" Registration info for Blender menus:
+Name: 'Kloputils 3'
+Blender: 233
+Group: 'Wizards'
+Tip: 'Set of object alligning, modifing tools.'
+"""
+
+##################################################
+#                                                #
+#        KLOPUTILES v3.1 para Blender v2.33      #
+#                   multilingue                  #
+#                                                #
+##################################################
+#              Pulsa Alt+P para ejecutar el script
+#      Improved:       use of Mathutils
+#      Feature:        actualize objects on ApplyLRS
+#      Improved:       Project onto planes
+#      Feature:        mover/rotar/escalar objetos al azar
+#      Feature:        acercar objs al activo (fijo, abs, rel)
+#      Improved:       Fit/Embrace
+#      TODO: subdividir solo aristas seleccionadas (NO FUNCIONA)
+#      TODO: Elipses
+#
+##################################################
+#
+# $Id$
+#
+# --------------------------------------------------------------------------
+# Kloputils by Carlos López (klopez)
+# --------------------------------------------------------------------------
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# Copyright (C) 2004: Carlos López, http://klopes.tk
+#
+# 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 *****
+# --------------------------------------------------------------------------
+
+import Blender
+from Blender.Mathutils import *
+from Blender.NMesh import *
+from Blender.BGL import *
+from Blender.Draw import *
+from Blender.sys import *
+from Blender.Noise import random
+
+from math import *
+
+#path=dirname(progname)
+#path=[dirname(progname),'.blender','bpydata']
+path=Blender.Get("datadir")
+sc=Blender.Scene.GetCurrent()
+MId=Matrix([1,0],[0,1])
+MId.resize4x4()
+
+coo=['X','Y','Z']
+l=PupMenu('Choose language%t|Espanol%x1|English%x2|Catala%x3')
+Lang=['Espanol','English','Catala'][l-1]
+
+
+
+#Buffer:
+BfL=[0.,0.,0.]
+BfR=[0.,0.,0.]
+BfS=[1.,1.,1.]
+
+pagina=Create(1)
+creake=Create(1)
+editake=Create(2)
+moveke=Create(1)
+
+numReal=Create(0.)
+movekomo=Create(1)
+menuLRS=Create(1)
+
+ndiv=Create(3)
+akeplano=Create(2)
+akeplanoXYZ=Create(3)
+enkedir=Create(3)
+
+nLocX=Create(1.0)
+nLocY=Create(2.0)
+nLocZ=Create(3.0)
+nRotX=Create(0.0)
+nRotY=Create(0.0)
+nRotZ=Create(0.0)
+nSizX=Create(1.0)
+nSizY=Create(1.0)
+nSizZ=Create(1.0)
+other=Create(1)
+
+ang1=Create(0.0)
+ang2=Create(30.0)
+angulo=Create(30.0)
+radio=Create(1.0)
+pts=Create(10)
+ctro=Create(0)
+meTx=Create('Arco')
+
+arcorden=Create(0)
+
+CreaNew=Create(1)
+Cuantos=Create(2)
+toBuffer=Create(0)
+
+menueqiX=Create(1)
+sepX=Create(0.5)
+aliX=Create(1)
+menueqiY=Create(1)
+sepY=Create(0.0)
+aliY=Create(0)
+menueqiZ=Create(2)
+sepZ=Create(1.0)
+aliZ=Create(0)
+
+girX=Create(0)
+incX=Create(0.0)
+girY=Create(0)
+incY=Create(0.0)
+girZ=Create(1)
+incZ=Create(5.0)
+
+scaX=Create(1)
+iScaX=Create(.5)
+scaY=Create(1)
+iScaY=Create(.5)
+scaZ=Create(1)
+iScaZ=Create(.5)
+
+encX=Create(1)
+encY=Create(0)
+encZ=Create(0)
+en2X=Create(1)
+en2Y=Create(0)
+en2Z=Create(0)
+
+
+def CreaObjDeMalla(mm,o,nombre):
+       oo=Blender.Object.New('Mesh')
+       oo.link(mm)
+       oo.setName(nombre)
+       oo.LocX,oo.LocY,oo.LocZ=o.LocX,o.LocY,o.LocZ
+       oo.RotX,oo.RotY,oo.RotZ=o.RotX,o.RotY,o.RotZ
+       oo.SizeX,oo.SizeY,oo.SizeZ=o.SizeX,o.SizeY,o.SizeZ
+       sc.link(oo)
+       return oo
+
+def rectang(x,y,l,h,r,g,b):
+       glColor3f(r,g,b)
+       glBegin(GL_POLYGON)
+       glVertex2i(x, y)
+       glVertex2i(l, y)
+       glVertex2i(l, h)
+       glVertex2i(x, h)
+       glEnd()
+
+def SituaL(objeto,coord,X):
+       if coord==0:
+               objeto.LocX=X
+       elif coord==1:
+               objeto.LocY=X
+       elif coord==2:
+               objeto.LocZ=X
+def SituaR(objeto,coord,X):
+       if coord==0:
+               objeto.RotX=X
+       elif coord==1:
+               objeto.RotY=X
+       elif coord==2:
+               objeto.RotZ=X
+def SituaS(objeto,coord,X):
+       if coord==0:
+               objeto.SizeX=X
+       elif coord==1:
+               objeto.SizeY=X
+       elif coord==2:
+               objeto.SizeZ=X
+
+def mallaScan(o):
+       return o.getType()=='Mesh'
+
+def Sistema(MM,D):
+       MM.invert()
+       return MatMultVec(MM,D)
+
+def GloVrt((x,y,z),M): # Devuelve (vector) coords globs de v
+       v=Vector([x,y,z,1])
+       v=VecMultMat(v,M)
+       v.resize3D()
+       return v
+
+def Extremo(lista,M=MId):      # Devuelve extremos y pto medio de lista de vectores
+       o1=GloVrt(lista[0],M)
+       o2=GloVrt(lista[0],M)
+       for v in lista:
+               va=Vector(list(v))
+               va.resize4D()
+               va=VecMultMat(va,M)
+               for c in range(3):
+                       o1[c]=min(va[c],o1[c])
+                       o2[c]=max(va[c],o2[c])
+       return [o1,(o1+o2)/2,o2]
+
+def Media(lista):      #Media
+       ctr=Vector([0,0,0])
+       for c in range(3):
+               for l in lista: ctr[c]=ctr[c]+l[c]
+               ctr[c]=ctr[c]/len(lista)
+       return ctr
+
+
+
+
+
+
+def draw():
+       global pagina, toBuffer
+       glClearColor(0.4,0.2,0.2,0.0)
+       glClear(GL_COLOR_BUFFER_BIT)
+
+       pagina=Menu(menu0,98,20,370,170,28,pagina.val,"Selecciona pagina")
+       toBuffer=Menu(menu4,80,200,370,20,15,toBuffer.val,"Copy values to the internal buffer")
+       glColor3f(0.6,0.6,0.2)
+       glRasterPos2i(198,388)
+       Text("Copy",'small')
+
+       if (pagina.val==1): draw1()
+       elif (pagina.val==2): draw2()
+       elif (pagina.val==3): draw3()
+       elif (pagina.val==4): draw4()
+
+       Button(menuExit,99,20,5,200,18)
+
+def draw4():
+       global moveke,o
+       global aliX,aliY,aliZ,numReal,movekomo,menuLRS,menuPaste
+       
+
+       rectang(15,38,225,264,0.2,0.,0.)
+
+       moveke=Menu(menu5,98,10,248,200,20,moveke.val,"Modifica la matriz de objetos seleccionados")
+       if moveke.val==2:
+               aliX=Toggle("X",0, 50,160,45,30,aliX.val,"Activa modif en X")
+               aliY=Toggle("Y",0, 95,160,45,30,aliY.val,"Activa modif en Y")
+               aliZ=Toggle("Z",0,140,160,45,30,aliZ.val,"Activa modif en Z")
+               menuLRS=Menu("Loc%x1|Rot%x2|Size%x3",98,20,110,50,20,menuLRS.val)
+       if moveke.val==1:
+               movekomo=Menu(menu5a,98,20,225,200,20,movekomo.val,"Tipo de transformacion")
+               m,M,tip= -100,100,"Cantidad"
+       else:
+               if menuLRS.val==1:
+                       m,M,tip= -1000, 1000, "Distancia"
+               elif menuLRS.val==2:
+                       m,M,tip= 0, 360, "Angulo"
+               elif menuLRS.val==3:
+                       m,M,tip= 0, 100, "Escala"
+       if moveke.val==1 and movekomo.val==3:   tip="Multiplicador de "+tip
+       if moveke.val==2:       tip=tip+" (maximo)"
+
+       numReal=Number("",0,20,140,178,18,numReal.val,m,M,tip)
+       glColor3f(0.6,0.6,0.2)
+       glRasterPos2i(200,156)
+       Text("Paste",'small')
+       menuPaste=Menu("Paste...%t|LocX%x1|LocY%x2|LocZ%x3|\Loc\%x4|RotX%x5|RotY%x6|RotZ%x7|SizeX%x8|SizeY%x9|SizeZ%x10"
+,88,202,140,20,12,0,"Paste what?")
+       ok=Button("OK",50,80,110,80,20)
+
+
+def draw3():
+       global editake,ndiv,akeplano,akeplanoXYZ,enkedir,ok
+       global other
+       global getlocrotsiz,ok,nLocX,nLocY,nLocZ
+       global nRotX,nRotY,nRotZ,nSizX,nSizY,nSizZ
+       global Cloc,Ploc,Crot,Prot,Csiz,Psiz
+
+       rectang(15,38,225,264,0.3,0.7,0.5)
+
+       editake=Menu(menu3,98,10,248,143,20,editake.val,"Menu de edicion de mayas")
+       if(editake.val==1):
+               ndiv=Number(menu3a,98,20,200,150,18,ndiv.val,2,1000)
+               ok=Button("OK",20,172,200,32,18)
+       elif(editake.val==2):
+               akeplano=Menu(menu3b,98,20,200,140,20,akeplano.val)
+               if akeplano.val in [1,2]:
+                       akeplanoXYZ=Menu(menu3c,98,162,200,55,20,akeplanoXYZ.val) 
+               enkedir=Menu(menu3d,98,20,100,140,20,enkedir.val)
+               ok=Button("OK",40,162,100,55,20)
+       elif(editake.val==3):
+               Button("P",87,192,222,30,18,"Paste buffer matrix")
+               nLocX=Number("LocX:",98,20,200,170,19,nLocX.val,-1000.,1000.)
+               nLocY=Number("LocY:",98,20,180,170,19,nLocY.val,-1000.,1000.)
+               nLocZ=Number("LocZ:",98,20,160,170,19,nLocZ.val,-1000.,1000.)
+               nRotX=Number("RotX:",98,20,140,170,19,nRotX.val,-1000.,1000.)
+               nRotY=Number("RotY:",98,20,120,170,19,nRotY.val,-1000.,1000.)
+               nRotZ=Number("RotZ:",98,20,100,170,19,nRotZ.val,-1000.,1000.)
+               nSizX=Number("SizeX:",98,20, 80,170,19,nSizX.val,-1000.,1000.)
+               nSizY=Number("SizeY:",98,20, 60,170,19,nSizY.val,-1000.,1000.)
+               nSizZ=Number("SizeZ:",98,20, 40,170,19,nSizZ.val,-1000.,1000.)
+               other=Toggle("Actulize others",98,20,222,170,18,other.val)
+               oklocrotsiz=Button("OK",30,192,40,30,179)
+
+def draw2():
+       global creake,ang1,ang2,angulo,radio,pts,ctro,meTx,arcorden
+
+       rectang(15,65,224,257,0.7,0.5,0.65)
+
+       creake=Menu(menu2,98,10,248,143,20,creake.val,"Tipo de objeto")
+       if(creake.val==1):
+               pts=Number(menu2a[0],98,20,115,80,18,pts.val,2,1000)
+               ctro=Toggle(menu2a[1],98,102,115,50,18,ctro.val,"Cierra el arco con el centro")
+               arcorden=Menu(menu2a[2]+"%t|1-2-3%x1|2-3-1%x2|3-1-2%x3",17,155,115,65,18,arcorden.val,"Orden de los vertices")
+               meTx=String("Objeto: ",98,20,70,200,22,meTx.val,30,"Nombre del objeto a crear")
+       if(creake.val==2):
+               ang1=Slider(menu2a[4],10,20,220,200,18,ang1.val,-360,360,0,"Angulo inicial en grados")
+               ang2=Slider(menu2a[5],11,20,200,200,18,ang2.val,ang1.val,ang1.val+360,0,"Angulo final en grados")
+               angulo=Slider(menu2a[6],12,20,170,200,18,angulo.val,-360,360,0,"Angulo del arco en grados")
+               radio=Slider(menu2a[7],13,20,140,200,18,radio.val,0,1,0)
+               pts=Number(menu2a[8],14,20,115,80,18,pts.val,2,1000)
+               ctro=Toggle(menu2a[9],15,102,115,50,18,ctro.val,"Cierra el arco con el centro")
+               meTx=String(menu2a[10],16,20,70,200,22,meTx.val,30,"Nombre de la maya a sustituir")
+       if(creake.val==3):
+               pts=Number("Pts:",98,20,115,80,18,pts.val,2,1000)
+               ok=Button("OK",18,102,115,120,36)
+               meTx=String("Objeto: ",98,20,70,200,22,meTx.val,30,"Nombre del objeto a crear")
+               
+def draw1():
+       global menueqiX,sepX,aliX,menueqiY,sepY,aliY,menueqiZ,sepZ,aliZ
+       global girX,incX,girY,incY,girZ,incZ
+       global encX,encY,encZ,en2X,en2Y,en2Z
+       global scaX,scaY,scaZ,iScaX,iScaY,iScaZ
+       global CreaNew,Cuantos,toBuffer
+
+######################### ALINEACIONES #####################
+       rectang(5,167,254,292,0.7,0.5,0.65)
+       Button("C",81,194,270,25,18,"Copy")
+       Button("P",82,220,270,25,18,"Paste buffer Loc")
+
+       aliX=Toggle("X",0,10,270,30,18,aliX.val,"Activa alineacion X")
+       menueqiX=Menu(menu1b,98,41,270,148,18,menueqiX.val,"Extremos de la separacion")  
+       sepX=Number(menu1a[4],0,10,250,179,18,sepX.val,-1000,1000,"Distancia de separacion X")
+
+       aliY=Toggle("Y",0,10,230,30,18,aliY.val,"Activa alineacion Y")
+       menueqiY=Menu(menu1b,98,41,230,148,18,menueqiY.val,"Extremos de la separacion")  
+       sepY=Number(menu1a[4],0,10,210,179,18,sepY.val,-1000,1000,"Distancia de separacion Y")
+
+       aliZ=Toggle("Z",0,10,190,30,18,aliZ.val,"Activa alineacion Z")
+       menueqiZ=Menu(menu1b,98,41,190,148,18,menueqiZ.val,"Extremos de la separacion")  
+       sepZ=Number(menu1a[4],0,10,170,179,18,sepZ.val,-1000,1000,"Distancia de separacion Z")
+
+########################## GIROS ##############################
+       rectang(5,97,254,162,0.67,0.54,0.1)
+       Button("C",83,194,140,25,18,"Copy")
+       Button("P",84,220,140,25,18,"Paste buffer Rot")
+
+       girX=Toggle("X",0,10,140,30,18,girX.val,"Incrementa valores RotX")
+       incX=Number("X: ",0,42,140,147,18,incX.val,-180,180,"Incremento en grados")
+       girY=Toggle("Y",0,10,120,30,18,girY.val,"Incrementa valores RotY")
+       incY=Number("Y: ",0,42,120,147,18,incY.val,-180,180,"Incremento en grados")
+       girZ=Toggle("Z",0,10,100,30,18,girZ.val,"Incrementa valores RotZ")
+       incZ=Number("Z: ",0,42,100,147,18,incZ.val,-180,180,"Incremento en grados")
+
+######################### ESCALADOS ##########################
+       rectang(5,27,254,92,0.27,0.54,0.4)
+       Button("C",85,194,70,25,18,"Copy")
+       Button("P",86,220,70,25,18,"Paste buffer Sca")
+
+       scaX=Toggle("X",0,10,70,30,18,scaX.val)
+       iScaX=Number(menu1a[7],0,42,70,147,18,iScaX.val,-180,180,"Incremento de escala")
+       scaY=Toggle("Y",0,10,50,30,18,scaY.val)
+       iScaY=Number(menu1a[7],0,42,50,147,18,iScaY.val,-180,180,"Incremento de escala")
+       scaZ=Toggle("Z",0,10,30,30,18,scaZ.val)
+       iScaZ=Number(menu1a[7],0,42,30,147,18,iScaZ.val,-180,180,"Incremento de escala")
+########################## ENCAJES ##########################
+       rectang(5,317,254,363,0.1,0.5,0.6)
+
+       encX=Toggle(menu1a[0]+"X",0,10,340,43,18,encX.val,"Desplaza el objeto")
+       encY=Toggle(menu1a[0]+"Y",0,55,340,43,18,encY.val,"Desplaza el objeto")
+       encZ=Toggle(menu1a[0]+"Z",0,100,340,43,18,encZ.val,"Desplaza el objeto")
+
+       en2X=Toggle(menu1a[1]+"X",0,10,320,43,18,en2X.val,"Ajusta tamano")
+       en2Y=Toggle(menu1a[1]+"Y",0,55,320,43,18,en2Y.val,"Ajusta tamano")
+       en2Z=Toggle(menu1a[1]+"Z",0,100,320,43,18,en2Z.val,"Ajusta tamano")
+######################################################
+       CreaNew=Toggle(menu1a[8],98,10,295,129,18,CreaNew.val)
+       if CreaNew.val:
+               Cuantos=Number('',98,139,295,30,18,Cuantos.val,1,999,"Numero de copias")
+       Button(menu1a[5],1,190,170,60,98)               #Alinea
+       Button(menu1a[6],2,190,100,60,38)               #Gira
+       Button(menu1a[9],3,190,30,29,38)                #Escala+
+       Button(menu1a[10],7,220,30,30,38)               #Escala*
+       Button(menu1a[2],6,147,320,45,38,"Encaja activo en otro u otros 2 (crea nuevo objeto)")         #Encaja
+       Button(menu1a[3],5,195,320,55,38,"Encaja activo en otro u otros 2 (crea nuevo objeto)")         #Abarca
+
+def HaceArco(pts,ang1,angul,ctro,R):
+       me=New()
+       for c in range(pts):
+               alfa=(ang1+angul*c/(pts-1))*pi/180
+               if (c): v1=v
+               v=Vert()
+               v.co[0]=R*cos(alfa)
+               v.co[1]=R*sin(alfa)
+               v.co[2]=0
+               me.verts.append(v)
+               if (c):
+                       f=Face()
+                       f.v=[v1]
+                       f.v.append(v)
+                       me.faces.append(f)
+               if (c==0): v0=v
+       if(ctro):
+               v1=v
+               v=Vert()
+               me.verts.append(v)
+               f=Face()
+               f.v=[v1,v]
+               me.faces.append(f)
+               f=Face()
+               f.v=[v,v0]
+               me.faces.append(f)
+       return me
+
+def Exec_align(os,c,ali,eqi,sep):
+       coor=os[0].loc[c]
+       ademas=0
+       flag=0
+       for o in os:
+               m=o.data     #Maya del objeto
+               ctr=[0,0,0]
+               if(eqi[c]==2):
+                       for d in range(3): ctr[d]=Extremo(m.verts,o.matrix)[1][d]
+               elif(eqi[c]==3 or eqi[c]==6):
+                       ctr=Extremo(m.verts,o.matrix)[0]
+               elif(eqi[c]==4):
+                       ctr=Extremo(m.verts,o.matrix)[2]
+               elif(eqi[c]==5):
+                       ctr=Media(m.verts)
+                       ctr=GloVrt(ctr,o.matrix)
+
+               if (eqi[c]>1): ademas=ctr[c]-o.loc[c]
+               if (flag):      coor=coor-ademas
+               else:   flag=1
+               SituaL(o,c,coor)
+               if(eqi[c]==6): ademas=Extremo(m.verts,o.matrix)[2][c]-o.loc[c]
+               coor=coor+sep[c]+ademas
+
+def event(evt,val):
+       if (evt==ESCKEY and not val):
+               print "Bye..."
+               Exit()
+
+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@22#
+
+def bevent(evt):
+       global me
+       global BfL,BfR,BfS
+       print "Evento:",evt
+       os=Blender.Object.GetSelected()
+       if os:
+               oa=os[0]
+
+       ##########MENU BUFFER
+       if evt==80:
+               copi=toBuffer.val
+               if copi==1:
+                       if len(os)==2:
+                               for c in range(3): BfL[c]=os[1].loc[c]-os[0].loc[c]
+                               print "Copiado al buffer Loc:",BfL
+                       else:
+                               PupMenu('ERROR%t|Selecciona 2 objetos|Just select 2 objects!')
+               if copi==2:
+                       if len(os)==2:
+                               BfL=3*[sqrt((os[1].loc[0]-os[0].loc[0])**2+
+(os[1].loc[1]-oa.loc[1])**2+
+(os[1].loc[2]-oa.loc[2])**2)]
+                               print "Copiado al buffer Loc:",BfL
+                       else:
+                               PupMenu('ERROR%t|Selecciona 2 objetos|Just select 2 objects!')
+               if copi==3:
+                       if len(os)==2:
+                               for c in range(3): BfR[c]=os[1].rot[c]-oa.rot[c]
+                               print "Copiado al buffer Rot:",BfR
+                       else:
+                               PupMenu('ERROR%t|Selecciona 2 objetos|Just select 2 objects!')
+               if copi==4 and len(os):
+                       lista=[]
+                       for o in os: lista.append(o.loc)
+                       BfL=Media(lista)
+                       print "Copiado al buffer Loc:",BfL
+                       lista=[]
+                       for o in os: lista.append(o.rot)
+                       BfR=Media(lista)
+                       for c in range(3): BfR[c]*=180/pi
+                       print "Copiado al buffer Roc:",BfR
+                       lista=[]
+                       for o in os: lista.append(o.size)
+                       BfS=Media(lista)
+                       print "Copiado al buffer Siz:",BfS
+               if copi==5:
+                       print"\n_Contenido del buffer_\n"
+                       for c in range(3): print "Loc",coo[c]," :",BfL[c]
+                       for c in range(3): print "Rot",coo[c]," :",BfR[c]
+                       for c in range(3): print "Size",coo[c],":",BfS[c]
+                       print "______________________"
+
+       ##########COPY
+       if evt==81:
+               X       =[sepX.val,sepY.val,sepZ.val]
+               ali     =[aliX.val,aliY.val,aliZ.val]
+               for c in range(3):
+                       if ali[c]:
+                               BfL[c]=X[c]
+                               print"Copiando al buffer Loc",coo[c],"el valor", BfL[c]
+
+       if evt==83:
+               X       =[incX.val,incY.val,incZ.val]
+               ali     =[girX.val,girY.val,girZ.val]
+               for c in range(3):
+                       if ali[c]:
+                               BfR[c]=X[c]
+                               print"Copiando al buffer Loc",coo[c],"el valor", BfR[c]
+
+       if evt==85:
+               X       =[iScaX.val,iScaY.val,iScaZ.val]
+               ali     =[scaX.val,scaY.val,scaZ.val]
+               for c in range(3):
+                       if ali[c]:
+                               BfS[c]=X[c]
+                               print"Copiando al buffer Loc",coo[c],"el valor", BfS[c]
+
+       ##########PASTE
+       if evt==82:
+               X       =[sepX.val,sepY.val,sepZ.val]
+               ali     =[aliX.val,aliY.val,aliZ.val]
+               for c in range(3):
+                       if ali[c]:
+                               X[c]=BfL[c]
+                               print"Pegando del buffer Loc",coo[c],"el valor", BfL[c]
+               sepX.val,sepY.val,sepZ.val=X
+
+       if evt==84:
+               X       =[incX.val,incY.val,incZ.val]
+               ali     =[girX.val,girY.val,girZ.val]
+               for c in range(3):
+                       if ali[c]:
+                               X[c]=BfR[c]
+                               print"Pegando del buffer Rot",coo[c],"el valor", BfR[c]
+               incX.val,incY.val,incZ.val=X
+
+       if evt==86:
+               X       =[iScaX.val,iScaY.val,iScaZ.val]
+               ali     =[scaX.val,scaY.val,scaZ.val]
+               for c in range(3):
+                       if ali[c]:
+                               X[c]=BfS[c]
+                               print"Pegando del buffer Size",coo[c],"el valor", BfS[c]
+               iScaX.val,iScaY.val,iScaZ.val=X
+
+       if evt==87:
+               print"Pegando matriz a <AplicLocRotSize>"
+               nLocX.val,nLocY.val,nLocZ.val=BfL
+               nRotX.val,nRotY.val,nRotZ.val=BfR
+               nSizX.val,nSizY.val,nSizZ.val=BfS
+
+       if evt==88:
+               print"Pegando num. real a boton"
+               x=[BfL[0],BfL[1],BfL[2],
+sqrt(BfL[0]**2+BfL[1]**2+BfL[2]**2),
+BfR[0],BfR[1],BfR[2],
+BfS[0],BfS[1],BfS[2]]
+               numReal.val = x[menuPaste.val-1]
+
+       if evt==50:
+               if moveke.val==1:                               #               MOVER HACIA EL O.ACTIVO
+                       oaV=Vector(list(oa.loc))
+                       for o in os[1:]:
+                               oV=Vector(list(o.loc))
+                               v=oV-oaV                                                                        #Calculo del vector final
+                               d=sqrt(DotVecs(v,v))
+                               v1=v*numReal.val
+                               if movekomo.val==1:
+                                       v1 = oaV+v1/d
+                               elif movekomo.val==2:
+                                       v1 = oV+v1/d
+                               elif movekomo.val==3:
+                                       v1 = oaV+v1
+                               o.setLocation(v1)
+
+               if moveke.val==2:                                       #       MOVER AL AZAR
+                       n=numReal.val
+                       if menuLRS.val==2:
+                               n=n*pi/180
+                       for o in os:
+                               v1=Vector([
+aliX.val * (2*n*random() - n),
+aliY.val * (2*n*random() - n),
+aliZ.val * (2*n*random() - n)])
+
+                               if menuLRS.val==1:                                                      #Uso del vector final
+                                       oV=Vector(list(o.loc))
+                                       o.setLocation(oV+v1)
+                               elif menuLRS.val==2:
+                                       v=Vector(list(o.getEuler()))+v1
+                                       o.setEuler(v)
+                               else:
+                                       oV=Vector(list(o.size))
+                                       o.setSize(oV+v1)
+
+       if evt==40:                             #                                       PROYECTA EN PLANOS
+               n=Vector([0.,0.,0.])
+
+               numObjs=-len(os)+1
+               if akeplano.val==1:     #plano global
+                       n[akeplanoXYZ.val-1]=1.
+                       numObjs=-len(os)
+               elif akeplano.val==2: n=oa.matrix[akeplanoXYZ.val-1] #plano local
+               n.resize3D()
+
+               d=Vector([0.,0.,0.])
+               if enkedir.val<4: d[enkedir.val-1]=1.   #direccion global
+               elif enkedir.val==4: d=n                                #direc. ortog. al plano
+
+               n1 = Vector([-n[2],n[0],n[1]])
+               N1 = CrossVecs (n,n1)
+               N2 = CrossVecs (n,N1)   
+               n.normalize(), N1.normalize(), N2.normalize()
+               #print"productos escalares (deben ser 0):",DotVecs(N1,n),DotVecs(N2,n),DotVecs(N2,N1)
+               p=oa.loc
+               N=Matrix(
+       [N1[0],N1[1],N1[2],0],
+       [N2[0],N2[1],N2[2],0],
+       [ n[0], n[1], n[2],0],
+       [ p[0], p[1], p[2],1])
+               NI=CopyMat(N)
+               NI.invert()
+
+               dN=VecMultMat(d,NI.rotationPart())
+               if dN[2]==0:
+                       PupMenu('Error%t|Operacion no permitida: la direccion esta en el plano%x1|Illegal operation: plane contains direction%x2')
+                       return
+               print"Direccion absoluta:",d,"\nNormal al plano:",n,"\nDireccion relativa:",dN
+               for o in filter(mallaScan,os[numObjs:]):
+                       me=Blender.NMesh.GetRawFromObject(o.name)
+                       M=o.matrix
+                       for v in me.verts:
+                               v0=Vector([v[0],v[1],v[2]])
+                               v0=GloVrt(v0,M)
+                               v0.resize4D()
+                               v0=VecMultMat(v0,NI)
+                               v[0] = v0[0] - v0[2]/dN[2] * dN[0]
+                               v[1] = v0[1] - v0[2]/dN[2] * dN[1]
+                               v[2] = 0
+                       oo=Blender.Object.New('Mesh')
+                       oo.setName(o.name+'Proy')
+                       oo.link(me)
+                       sc.link(oo)
+                       oo.setMatrix(N)
+
+       if(evt>9 and evt<17):   #       HACE ARCO INTERACTIV.
+               GetRaw(meTx.val)
+               if(evt==11): angulo.val=ang2.val-ang1.val
+               if(evt==12 or evt==10): ang2.val=(ang1.val+angulo.val)
+               m=HaceArco(pts.val,ang1.val,angulo.val,ctro.val,radio.val)
+               PutRaw(m,meTx.val)
+
+       if evt in [17,18]:      # HACE ARCO CON 3 PTS.
+               o=oa
+               m=o.getData()
+               M=o.matrix
+               if arcorden.val==1 or evt==18:
+                       p1,p2,p3=m.verts[0],m.verts[1],m.verts[2]
+               elif arcorden.val==2:
+                       p1,p2,p3=m.verts[1],m.verts[2],m.verts[0]
+               elif arcorden.val==3:
+                       p1,p2,p3=m.verts[2],m.verts[0],m.verts[1]
+
+               p1=GloVrt(p1,M)
+               p2=GloVrt(p2,M)
+               p3=GloVrt(p3,M)
+
+               print "Puntos:\n ",p1,p2,p3
+               
+               p21=p2-p1
+               p31=p3-p1
+
+               M1=CrossVecs(p21,p31)
+
+               D=DotVecs(M1,p1)
+               D2=DotVecs(p21,p1+p2)/2
+               D3=DotVecs(p31,p1+p3)/2
+
+               SS=Matrix(
+               [M1[0],M1[1],M1[2]],
+               [p21[0],p21[1],p21[2]],
+               [p31[0],p31[1],p31[2]],
+               )
+               O=Sistema(SS,Vector([D,D2,D3]))
+               
+               v2=p2-O
+               b3=p3-O
+               vN=CrossVecs(v2,b3)
+               v3=CrossVecs(v2,vN)
+
+                       #Terna ortogonal: v2,vN,v3
+               R=sqrt(DotVecs(v2,v2))
+               RN=sqrt(DotVecs(vN,vN))
+               R3=sqrt(DotVecs(v3,v3))
+
+               if evt==18: angul=2*pi
+               else: angul=AngleBetweenVecs(v2,b3)
+
+               print "Centro:",O
+               print "Radio :",R,"RN:",RN,"R3:",R3
+               print "Angulo:",angul
+               M2=Matrix([v2[0]/R,v2[1]/R,v2[2]/R],[-v3[0]/R3,-v3[1]/R3,-v3[2]/R3],[vN[0]/RN,vN[1]/RN,vN[2]/RN])
+
+               arco=HaceArco(pts.val,0,angul,ctro.val,1)
+               oo=CreaObjDeMalla(arco,o,meTx.val+'.In')
+               EU=M2.toEuler()
+               EU=EU[0]*pi/180,EU[1]*pi/180,EU[2]*pi/180
+               oo.RotX,oo.RotY,oo.RotZ=EU[0],EU[1],EU[2]
+               oo.setLocation(O)
+               oo.setSize(R,R,R)
+
+               if evt==17:
+                       angul=angul-360
+                       arco=HaceArco(pts.val,0,angul,ctro.val,1)
+                       oo=CreaObjDeMalla(arco,o,meTx.val+'.Ex')
+                       oo.RotX,oo.RotY,oo.RotZ=EU[0],EU[1],EU[2]
+                       oo.setLocation(O)
+                       oo.setSize(R,R,R)
+
+       if(evt==20): # SUBDIVIDE
+               for o in filter(mallaScan,os):
+                       m=o.data
+                       mm=New()
+                       mm.name=m.name+'.Subdiv'
+                       for v in m.verts: mm.verts.append(v)
+                       N=ndiv.val
+                       NV=len(m.verts)-1
+                       for k1 in range(NV+1):
+                               v1=m.verts[k1]
+                               for k2 in range(NV-k1):
+                                       v2=m.verts[NV-k2]
+                                       for f in m.faces:
+                                               if (v1 in f.v) and (v2 in f.v): #       SI...
+                                                       dif=abs(f.v.index(v2)-f.v.index(v1))
+                                                       if dif==1 or dif==len(f.v)-1: #...entonces f contiene la arista v1-v2
+                                                               v=v1
+                                                               for K in range(N):
+                                                                       cara=Face()
+                                                                       cara.v.append(v)
+                                                                       if K<N-1:
+                                                                               v=Vert()
+                                                                               for c in range(3): v.co[c]=(v1.co[c]*(N-K-1)+v2.co[c]*(K+1))/N
+                                                                               mm.verts.append(v)
+                                                                       elif K==N-1: v=v2
+                                                                       cara.v.append(v)
+                                                                       mm.faces.append(cara)
+                                                       break #para que no se repitan aristas comunes a varias caras
+                       CreaObjDeMalla(mm,o,o.name+'.Subdiv')
+
+       if evt==30:                                             # APLICA LOC.ROT.SIZE
+               for o in filter(mallaScan,os):
+                       M=o.matrix
+
+                       eu=Euler([nRotX.val,nRotY.val,nRotZ.val])
+                       Mr=eu.toMatrix()
+                       Mr.resize4x4()
+                       Mt=TranslationMatrix(Vector([nLocX.val,nLocY.val,nLocZ.val]))
+
+                       o.setMatrix(Mr*Mt)
+                       o.setSize(nSizX.val,nSizY.val,nSizZ.val)
+                       MI=o.getInverseMatrix()
+                       P=M*MI
+                       maya=o.getData()
+                       for v in maya.verts:
+                               w=list(VecMultMat(Vector([v[0],v[1],v[2],1]),P))
+                               for c in range(3):      v[c]=w[c]/o.size[c]
+
+                       maya.update()
+                       if other.val:
+                               P.invert()
+                               for oo in Blender.Object.Get():
+                                       if oo.data.name==maya.name and o!=oo:
+                                               N=oo.getMatrix()
+                                               oo.setMatrix(P*N)
+                                               oo.setSize(oo.SizeX*nSizX.val,oo.SizeY*nSizY.val,oo.SizeZ*nSizZ.val)
+
+       if((evt==5 or evt==6) and len(os)):   #  ENCAJA-ABARCA
+               enc=[encX.val,encY.val,encZ.val]
+               en2=[en2X.val,en2Y.val,en2Z.val]
+               me=GetRaw(oa.data.name)
+               meVs=me.verts
+               for v in meVs:
+                       w=GloVrt(v,oa.matrix)
+                       for c in range(3):
+                               v[c]=w[c]
+               for c in range(3):
+                       if en2[c] or enc[c]:
+                               if (len(os)>1):
+                                       n1=Extremo(os[1].data.verts,os[1].matrix)[0][c]
+                                       m1=Extremo(os[1].data.verts,os[1].matrix)[2][c]
+                               if (len(os)>2):
+                                       n2=Extremo(os[2].data.verts,os[2].matrix)[0][c]
+                                       m2=Extremo(os[2].data.verts,os[2].matrix)[2][c]
+                               n0=Extremo(meVs)[0] [c]
+                               m0=Extremo(meVs)[2] [c]
+                               ancho=m0-n0
+                               pm=(m0+n0)/2
+                               if (len(os)==1): n1,m1=n0,m0
+                               if (len(os)<3): n2,m2=n1,m1
+                               if (n2<n1):
+                                       t,s=n2,m2
+                                       n2,n1,m2,m1=n1,t,m1,s
+                               print coo[c],n0,m0,n1,m1,n2,m2
+                       for v in meVs:
+                               A , factor = 0. , 1.
+                               if enc[c]:
+                                       if evt==5:      pm2=(n2+m1)/2
+                                       else:           pm2=(m2+n1)/2
+                                       v[c]+= pm2-pm
+                               if en2[c] and ancho:
+                                       if evt==5:      factor=(n2-m1)/ancho
+                                       else:           factor=(m2-n1)/ancho
+                                       v[c]=pm2+(v[c]-pm2)*factor
+               PutRaw(me)
+
+       elif (evt==1 and len(os)):
+               ali=[aliX.val,aliY.val,aliZ.val]
+               eqi=[menueqiX.val,menueqiY.val,menueqiZ.val]
+               sep=[sepX.val,sepY.val,sepZ.val]
+               if CreaNew.val:
+                       for o in filter(mallaScan,os):
+                               newos=[o]
+                               for i in range(Cuantos.val):
+                                       newo=CreaObjDeMalla(o.getData(),o,o.name)
+                                       newos.append(newo)
+                                       for c in range(3):
+                                               if (ali[c]):
+                                                       Exec_align(newos,c,ali,eqi,sep)
+               else:
+                       for c in range(3):
+                               if (ali[c]):
+                                       Exec_align(filter(mallaScan,os),c,ali,eqi,sep)
+       elif (evt==2 and len(os)):
+               gir=[girX.val,girY.val,girZ.val]
+               inc=[incX.val,incY.val,incZ.val]
+               if CreaNew.val:
+                       for o in filter(mallaScan,os):
+                               newos=[o]
+                               for i in range(Cuantos.val):
+                                       newo=CreaObjDeMalla(o.getData(),o,o.name)
+                                       newos.append(newo)
+                                       for c in range(3):
+                                               valor=o.rot[c]
+                                               for oo in newos:
+                                                       if (gir[c]):
+                                                               SituaR(oo,c,valor)
+                                                               valor=valor+inc[c]*pi/180
+               else:
+                       for c in range(3):
+                               if (gir[c]):
+                                       valor=oa.rot[c]
+                                       for o in os:
+                                               SituaR(o,c,valor)
+                                               valor=valor+inc[c]*pi/180
+                               
+       elif evt in [3,7] and len(os):
+               sca=[scaX.val,scaY.val,scaZ.val]
+               inc=[iScaX.val,iScaY.val,iScaZ.val]
+               if CreaNew.val:
+                       for o in filter(mallaScan,os):
+                               newos=[o]
+                               for i in range(Cuantos.val):
+                                       newo=CreaObjDeMalla(o.getData(),o,o.name)
+                                       newos.append(newo)
+                                       for c in range(3):
+                                               valor=o.size[c]
+                                               for oo in newos:
+                                                       if (sca[c]):
+                                                               SituaS(oo,c,valor)
+                                                               if evt==3: valor=valor+inc[c]
+                                                               if evt==7: valor=valor*inc[c]
+               else:
+                       for c in range(3):
+                               if (sca[c]):
+                                       valor=oa.size[c]
+                                       for o in os:
+                                               SituaS(o,c,valor)
+                                               if evt==3: valor=valor+inc[c]
+                                               if evt==7: valor=valor*inc[c]
+
+       elif (evt==99): Exit()
+       Blender.Redraw()
+
+#file=open(path+dirsep+'KUlang.txt','r')
+#file=open(dirsep.join(path)+dirsep+'KUlang.txt','r')
+file=open(join(path,'KUlang.txt'),'r')
+fich=file.readlines()
+print "\n\nKloputils",fich[0]
+for i in range(len(fich)):
+       if fich[i]==Lang+'\012': break
+print "Lenguaje:",fich[i]
+menuExit=fich[i+1]#Sale prog.
+menu0=fich[i+2]#Pral.
+J=int(fich[i+3])#Alinea:botones
+menu1a=[]
+for j in range(J): menu1a.append(fich[i+j+4])
+i=i+J
+menu1b=fich[i+4]#Alinea:menu separa
+menu2=str(fich[i+5])#Crea:menu
+J=int(fich[i+6])#Crea:botones
+menu2a=[]
+for j in range(J): menu2a.append(fich[i+j+7])
+i=i+J
+menu3=fich[i+7]#Modif:menu
+menu3a=fich[i+8]#Modif:"partes
+menu3b=fich[i+9]#Modif:menu plano
+menu3c=fich[i+10]#Modf:"Actua...
+menu3d=fich[i+11]#Modif:menu dire
+menu3e=fich[i+12]#Modf:"Captura
+menu4=fich[i+13]#Buffer
+menu5=fich[i+14]#ModifObjs
+menu5a=fich[i+15]
+
+file.close
+
+Register(draw,event,bevent)
index 0a7d7e6f0da78ef8319b33ebefdfba4b7647d0e0..02e0ed028d0c5da974c0739b3cd3208f0fca843b 100644 (file)
@@ -368,13 +368,13 @@ static int Button_setattr (PyObject *self, char *name, PyObject *v)
                        /* if the length of the new string is the same as */
                        /* the old one, just copy, else delete and realloc. */
                        if (but->slen == strlen (newstr)) {
-                               BLI_strncpy (but->val.asstr, newstr, but->slen);
+                               BLI_strncpy (but->val.asstr, newstr, but->slen + 1);
                        }
                        else {
                                MEM_freeN (but->val.asstr);
                                but->slen = strlen (newstr);
                                but->val.asstr = MEM_mallocN (but->slen + 1, "button setattr");
-                               strcpy (but->val.asstr, newstr);
+                               BLI_strncpy (but->val.asstr, newstr, but->slen + 1);
                        }
                }
        }
@@ -1153,7 +1153,7 @@ static PyObject *Method_PupStrInput (PyObject *self, PyObject *args)
        /* copying the text string handles both cases:
         * max < strlen(text) (by truncating) and
         * max > strlen(text) (by expanding to strlen(tmp)) */
-       BLI_strncpy(tmp, text, max);
+       BLI_strncpy(tmp, text, max + 1);
 
        if (sbutton (tmp, 0, max, textMsg) == 0) {
                Py_INCREF (Py_None);
index 9bf6dec72836868f662122e99f7c740f93d5d532..de6da24496f041d31560913d804b79f9ad9652e6 100644 (file)
@@ -41,6 +41,7 @@
 /*****************************************************************************/
 static PyObject *M_sys_basename (PyObject *self, PyObject *args);
 static PyObject *M_sys_dirname (PyObject *self, PyObject *args);
+static PyObject *M_sys_join (PyObject *self, PyObject *args);
 static PyObject *M_sys_splitext (PyObject *self, PyObject *args);
 static PyObject *M_sys_makename (PyObject *self, PyObject *args, PyObject *kw);
 static PyObject *M_sys_exists (PyObject *self, PyObject *args);
@@ -65,6 +66,10 @@ static char M_sys_dirname_doc[] =
 "(path) - Split 'path' in dir and filename.\n\
 Return the dir.";
 
+static char M_sys_join_doc[] =
+"(dir, file) - Join dir and file to form a full filename.\n\
+Return the filename.";
+
 static char M_sys_splitext_doc[] =
 "(path) - Split 'path' in root and extension:\n\
 /this/that/file.ext -> ('/this/that/file','.ext').\n\
@@ -95,6 +100,7 @@ static char M_sys_exists_doc[] =
 struct PyMethodDef M_sys_methods[] = {
   {"basename",    M_sys_basename,        METH_VARARGS, M_sys_basename_doc},
   {"dirname",     M_sys_dirname,         METH_VARARGS, M_sys_dirname_doc},
+  {"join",        M_sys_join,            METH_VARARGS, M_sys_join_doc},
   {"splitext",    M_sys_splitext,        METH_VARARGS, M_sys_splitext_doc},
   {"makename", (PyCFunction)M_sys_makename, METH_VARARGS|METH_KEYWORDS,
                M_sys_makename_doc},
@@ -158,8 +164,7 @@ static PyObject *M_sys_basename (PyObject *self, PyObject *args)
                if (n > FILE_MAXFILE)
                        return EXPP_ReturnPyObjError(PyExc_RuntimeError, "path too long");
 
-               BLI_strncpy(basename, p+1, n); /* + 1 to skip the sep */
-               basename[n] = '\0';
+               BLI_strncpy(basename, p + 1, n + 1);
                return Py_BuildValue("s", basename);
        }
 
@@ -190,14 +195,47 @@ static PyObject *M_sys_dirname (PyObject *self, PyObject *args)
                if (n > FILE_MAXDIR)
                        return EXPP_ReturnPyObjError (PyExc_RuntimeError, "path too long");
 
-               BLI_strncpy(dirname, name, n);
-               dirname[n] = '\0';
+               BLI_strncpy(dirname, name, n + 1);
                return Py_BuildValue("s", dirname);
        }
 
        return Py_BuildValue("s", ".");
 }
 
+static PyObject *M_sys_join (PyObject *self, PyObject *args)
+{
+       PyObject *c = NULL;
+       char *name = NULL, *path = NULL;
+       char filename[FILE_MAXDIR+FILE_MAXFILE];
+       char sep;
+       int pathlen = 0, namelen = 0;
+
+       if (!PyArg_ParseTuple(args, "ss", &path, &name))
+               return EXPP_ReturnPyObjError (PyExc_TypeError,
+                                                       "expected string argument");
+
+       pathlen = strlen(path) + 1;
+       namelen = strlen(name) + 1; /* + 1 to account for '\0' for BLI_strncpy */
+
+       if (pathlen + namelen > FILE_MAXDIR+FILE_MAXFILE - 1)
+               return EXPP_ReturnPyObjError (PyExc_RuntimeError, "filename is too long.");
+
+       c = PyObject_GetAttrString (g_sysmodule, "dirsep");
+       sep = PyString_AsString(c)[0];
+       Py_DECREF(c);
+       
+       BLI_strncpy(filename, path, pathlen);
+
+       if (filename[pathlen - 2] != sep) {
+               filename[pathlen - 1] = sep;
+               pathlen += 1;
+       }
+
+       BLI_strncpy(filename + pathlen - 1, name, namelen);
+
+       return Py_BuildValue("s", filename);
+}
+
 static PyObject *M_sys_splitext (PyObject *self, PyObject *args)
 {
        PyObject *c;
@@ -233,10 +271,8 @@ static PyObject *M_sys_splitext (PyObject *self, PyObject *args)
        if (n > FILE_MAXFILE || (len - n ) > FILE_MAXFILE)
                EXPP_ReturnPyObjError(PyExc_RuntimeError, "path too long");
 
-       BLI_strncpy(ext, dot, n);
-       ext[n] = '\0';
-       BLI_strncpy(path, name, dot - name);
-       path[dot - name] = '\0';
+       BLI_strncpy(ext, dot, n + 1);
+       BLI_strncpy(path, name, dot - name + 1);
 
        return Py_BuildValue("ss", path, ext);
 }
@@ -256,8 +292,8 @@ static PyObject *M_sys_makename(PyObject *self, PyObject *args, PyObject *kw)
                return EXPP_ReturnPyObjError (PyExc_TypeError,
                        "expected one or two strings and an int (or nothing) as arguments");
 
-       len = strlen(path);
-       if (ext) lenext = strlen(ext);
+       len = strlen(path) + 1; /* + 1 to consider ending '\0' */
+       if (ext) lenext = strlen(ext) + 1;
 
        if ((len + lenext) > FILE_MAXFILE)
                return EXPP_ReturnPyObjError(PyExc_RuntimeError, "path too long");
@@ -269,16 +305,11 @@ static PyObject *M_sys_makename(PyObject *self, PyObject *args, PyObject *kw)
        p = strrchr(path, sep);
 
        if (p && strip) {
-               n = path + len - p - 1; /* - 1 because we don't want the sep */
-
-               BLI_strncpy(basename, p+1, n); /* + 1 to skip the sep */
-               basename[n] = 0;
+               n = path + len - p;
+               BLI_strncpy(basename, p + 1, n); /* + 1 to skip the sep */
        }
-       else {
+       else
                BLI_strncpy(basename, path, len);
-               n = len;
-               basename[n] = '\0';
-       }
 
        dot = strrchr(basename, '.');
 
@@ -291,8 +322,7 @@ static PyObject *M_sys_makename(PyObject *self, PyObject *args, PyObject *kw)
                        if (dot) n = dot - basename;
                        else n = strlen(basename);
 
-                       BLI_strncpy(basename + n, ext, lenext + 1);
-                       basename[n+lenext] = '\0';
+                       BLI_strncpy(basename + n, ext, lenext);
                }
        }
 
index 9792d3fd278feabc788bea0f1466da0af8562ebf..47367d86c187e14a0b493a7b19c8fb1e9a8dee6a 100644 (file)
@@ -6,7 +6,7 @@ The Blender.sys submodule.
 sys
 ===
 
-B{New}: L{exists}, L{makename}.
+B{New}: L{exists}, L{makename}, L{join}.
 
 This module provides a minimal set of helper functions and data.  Its purpose
 is to avoid the need for the standard Python module 'os', in special 'os.path',
@@ -59,6 +59,20 @@ def dirname (path):
   @return: the dir name
   """
 
+def join (dir, file):
+  """
+  Join the given dir and file paths, using the proper separator for each
+  platform.
+  @type dir: string
+  @type file: string
+  @param dir: the dir name, like returned from L{dirname}.
+  @param file: the bare filename, like returned from L{basename}.
+  @rtype: string
+  @return: the resulting filename.
+  @warn: this simple function isn't intended to be a complete replacement for
+     the standard os.path.join() one, which handles more general cases.
+  """
+
 def splitext (path):
   """
   Split 'path' into (root, ext), where 'ext' is a file extension.