#!BPY
""" Registration info for Blender menus: <- these words are ignored
Name: 'Dupli Object'
Blender: 242
Group: 'Object'
Tip: 'Duplicate Object on mesh vertices with various options'
"""
#----------------------------------------------
# jm soler 05/2004 : 'Dupli Object' v0.8
# last update 09/04/2007
#----------------------------------------------
# Page officielle :
# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_b223new.htm#duplicopy232
# Communiquer les problemes et erreurs sur:
# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
#---------------------------------------------
import Blender
import math
from math import *
from Blender import Object, NMesh, Noise
from Blender.Draw import *
from Blender.BGL import *
# -------------------
# Definitions par defaut
# -------------------
# default definitions
# -------------------
# -------------------
# duplique les donnees du second objet selectionne
# sur la position de chaque sommet du premier
# si c'est un mesh . Ne fait rien si c'est un
# autre type d'objet.
# -------------------
# dupli data of the second selected object
# on vert pos of the first one if it is
# a real mesh, otherwize nothing
# -------------------
DUPLI=1
# -------------------
# Cree completement l'objet et les donnees
# -------------------
# create complete object with data
# -------------------
NEW=0
NONE=-1
# -------------------
# gere la valeur de NEW et DUPLI
# -------------------
# NEW et DUPLI value
# -------------------
Type=[DUPLI,NEW,NONE]
TYPE=Type[0]
# -------------------
# modifier aussi les valeurs de taillle
# -------------------
# change size too
# -------------------
SIZE=0
# Choisir MODE in ['random','normal','none', 'color']
mode=['normal','random', 'color','none']
MODE=mode[0]
objettype=['Armature', 'Camera', 'Curve', 'Lamp', 'Mesh','Empty']
OBJET=objettype[3]
Ob=None
def multmat(M,x,y,z):
x1 = (x * M[0][0]) + (y * M[1][0]) + (z * M[2][0]) + M[3][0]
y1 = (x * M[0][1]) + (y * M[1][1]) + (z * M[2][1]) + M[3][1]
z1 = (x * M[0][2]) + (y * M[1][2]) + (z * M[2][2]) + M[3][2]
return x1,y1,z1
def dupli_objet(TYPE,obj,Ob):
global SELMenu
scene = Blender.Scene.getCurrent()
if TYPE==DUPLI and Ob!=None:
O = Blender.Object.New
(obj)
scene = Blender.Scene.getCurrent()
scene.link (O)
O.shareFrom(Ob)
objet=Ob.getData()
elif TYPE==NEW and Ob!=None:
if obj in objettype
and obj!='Empty' and obj!='Mesh':
O = Blender.Object.New (obj)
scene.link (O)
objet=Ob.getData()
O.link (objet)
if SELMenu.val==2 and obj=='Lamp':
O.getData().setType('Spot')
#exec "objet = Blender.%s.New ('%s')"%(obj,obj)
elif obj!='Mesh'
:
O = Blender.Object.New (obj)
scene.link (O)
O.link (objet)
elif obj=='Mesh':
O = Blender.Object.New (obj)
scene.link (O)
objet=Blender.NMesh.GetRaw(Ob.data.name)
O.link (objet)
else:
objet=None
elif TYPE==NEW:
O = Blender.Object.New
('Lamp')
objet = Blender.Lamp.New
('Spot')
O.link (objet)
else:
O=None
objet=None
if O!=None:
O.Layer = 2**(CAMenu.val-1)
#scene.link (O)
return O,objet
def obj2mesh():
global MODE,ob,Ob,TYPE, SELvert,SELMenu
Me=Object.GetSelected()
if len(Me)>=0:
if Me[0].getType()=='Mesh':
me=NMesh.GetRaw(Me[0].getData().name)
if TYPE==DUPLI and len(Me)>1:
Ob=Me[1]
ob=Ob.getType()
elif TYPE==NEW and len(Me)>1:
Ob=Me[1]
ob=Ob.getType()
else:
Ob=None
ob=None
if Ob!=None and ob!=None:
for s in me.verts:
numb=-1
while numb==-1 or numb==0 or numb==len(Me):
numb=int( round(Noise.random()*len(Me)))
print numb
Ob=Me[numb]
ob=Ob.getType()
ok=1
if
SELvert.val :
if s.sel==1:
ok=1
else:
ok=0
if
ok==1:
O,obj=dupli_objet(TYPE,ob,Ob)
if ob=='Lamp':
obj.type=2 # type spot
obj.dist=15.0 # distance sur laquelle le spot projette
sa lumière
obj.energy=0.5 # energie, plutôt basse pour ne pas saturer
obj.spotSize=120.0 # angle d'ouverture du cone lumineux
obj.spotBlend=0.7 # largeur de la frange de penombre
obj.mode=9
#try:
if me.hasVertexColours()==1:
for d in me.faces:
if s in d.v:
print d.col[d.v.index(s)].r/255.0
obj.R=d.col[d.v.index(s)].r/255.0
obj.G=d.col[d.v.index(s)].g/255.0
obj.B=d.col[d.v.index(s)].b/255.0
break
#except:
# pass
if MODE!='none':
x,y,z=multmat(Me[0].mat,s.co[0],s.co[1],s.co[2])
# pour resituer la position
# reelle du point
O.LocX=x
O.LocY=y
O.LocZ=z
xa=s.no[0]+s.co[0]
da=s.no[1]+s.co[1]
wi=s.no[2]+s.co[2]
al,be,ga=multmat(Me[0].mat,xa,da,wi)
s.no[0]=al-x
s.no[1]=be-y
s.no[2]=ga-z
norm=sqrt(s.no[0]**2+s.no[1]**2+s.no[2]**2)
s.no[0]=s.no[0]/norm
s.no[1]=s.no[1]/norm
s.no[2]=s.no[2]/norm
#print s.no[0], s.no[1], s.no[2]
if abs(s.no[1])<0.0001:
s.no[1]=0.0
O.RotX=0
teta=-acos(s.no[2])
O.RotY=-pi+teta
if s.no[1]!=0:
if s.no[0]/sin(teta)>1.0 :
AC=acos(1.0)
elif s.no[0]/sin(teta)<1.0 :
AC=acos(-1.0)
else :
AC=acos(s.no[0]/sin(teta))
O.RotZ=-acos(s.no[0]/sin(teta))*s.no[1]/abs(s.no[1])
else:
O.RotZ=0
if s.no[0]>0:
O.RotY=-O.RotY
if MODE=='random':
#print O.RotY
O.RotX=Noise.random()*2*math.pi
O.RotY=Noise.random()*2*math.pi
O.RotZ=Noise.random()*2*math.pi
if MODE=='color':
if me.hasVertexColours()==1:
for d in me.faces:
if s in d.v:
#print d.col[d.v.index(s)].r/255.0*2*math.pi
O.RotX=d.col[d.v.index(s)].r/255.0*2*math.pi
O.RotY=d.col[d.v.index(s)].g/255.0*2*math.pi
O.RotZ=d.col[d.v.index(s)].b/255.0*2*math.pi
break
MOname = "MODE MENU %t|Normal %x1|Random %x2|color %x3|None %x4"
CAname="LAYER %t"
for n in range(20):
CAname=CAname+"|%s %%x%s"%(n,n+1)
SELname="OBJET %t|Selected %x1|STND LAMP %x2|NOTHING %x3"
MODEMenu = Create(1)
CAMenu = Create(1)
SELMenu = Create(1)
SELvert = Create(0)
TTYPE = Create(1)
TSIZE = Create(0)
def draw():
global MODEMenu, TSIZE, TTYPE,CAMenu ,MOMenu ,SELMenu,
SELvert
size=Buffer(GL_FLOAT, 4)
glGetFloatv(GL_SCISSOR_BOX, size)
size= size.list
for s in [0,1,2,3]: size[s]=int(size[s])
glClear(GL_COLOR_BUFFER_BIT)
glColor3f(0.0,0.0,0.0)
glRectf(4,size[3],534,size[3]-32 )
glColor3f(1.0,1.0,1.0)
glRasterPos2f(20, size[3]-15)
Text("Script Python de duplication d'objet")
glRasterPos2f(20, size[3]-28)
Text("Jean-michel Soler, avril 2004")
n0=78
n1=55
Button("Exit"
,1 ,140 ,size[3]-n0 ,60 ,20)
Button("Action"
,16 ,200 ,size[3]-n0 ,60 ,20)
MODEMenu= Menu(MOname,
2 ,20 ,size[3]-n0-20 ,100,20, MODEMenu.val, "MODE menu.")
CAMenu= Menu(CAname,
2 ,150 ,size[3]-n0-20 ,40,20, CAMenu.val, "LAYER menu.")
SELMenu= Menu(SELname,
2 ,220 ,size[3]-n0-20 ,100,20, SELMenu.val, "SELECTED OBJECT
menu.")
if TTYPE.val==1:
ttname='Dupli'
else:
ttname='New'
TTYPE= Toggle(ttname,
3, 20, size[3]-n0+20 ,120 ,20, TTYPE.val, "Type de Copie")
if SELvert.val==1:
tvname='Sel Verts'
else:
tvname='All Verts'
SELvert= Toggle(tvname,
4, 200, size[3]-n0+20 ,120 ,20, SELvert.val, "Type de Copie")
def event(evt, val):
if (evt== QKEY and not val): Exit()
def bevent(evt):
global MODEMenu, TSIZE, TTYPE, MODE, TYPE
if (evt== 1):
Exit()
elif (evt== 2):
MODE=mode[MODEMenu.val-1]
#print MODE
elif (evt== 3):
if TTYPE.val==1:
TYPE=DUPLI
else:
TYPE=NEW
elif (evt== 16):
MODE=mode[MODEMenu.val-1]
if TTYPE.val==1:
TYPE=DUPLI
else:
TYPE=NEW
obj2mesh()
Blender.Redraw()
Register(draw, event, bevent) |