#!BPY
""" Registration info for Blender menus: <- these words are ignored
Name: 'Trajectory'
Blender: 240
Group: 'Animation'
Tip: 'See Trajectory of selected object'
"""
__author__ = '3R - R3gis'
__version__ = '2.4'
__url__ = ["Script's site , http://blenderfrance.free.fr/python/Trajectory_en.htm","Author's site , http://cybercreator.free.fr", "French Blender support forum, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender"]
__email__=["3R, r3gis@free.fr"]
__bpydoc__ = """
Usage:
* Launch with alt+P (or put it in .script folder)
Allow to see in real time trajectory of selected object.
On first run, it ask you
- If you want that actually selected object have they trajectory always shown
- Futur and Past : it is the frame in past and futur
of the beggining and the end of the path
- Width of line that represent the trajectory
Then the object's trajectory will be shown in all 3D areas.
When trajectory is red, you can modifiy it by moving object.
When trajectory is blue and you want to be able to modify it, inser a Key (I-Key)
Notes:
It create one script link so make sure that 'Enable Script Link' toogle is on
"""
# --------------------------------------------------------------------------
# ***** BEGIN GPL LICENSE BLOCK *****
#
# Copyright (C) 2004-2006: Regis Montoya
#
# 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 *****
# --------------------------------------------------------------------------
#################################
# Script pour convertir un #
# mouvement en trajectoire #
#################################
# by 3R - 26/08/05
# pour tout probleme :
# r3gis@free.fr
# ou sur le newsgroup:
# http://zoo-logique.org/3D.Blender/
#################################
#-----------Utilisation---------#
# #
#Lancer avec Alt+P #
# #
#Derive du script MovToPath : #
#http://cybercreator2.free.fr/Pythons/#
#################################
import Blender
scene=Blender.Scene.GetCurrent()
#Ecriture
def ecrire(name,script):
global scene
lestext=Blender.Text.Get()
Ntext=[txt.name for txt in lestext]
ecrire=0
if name not in Ntext:
ecrire=1
elif lestext[Ntext.index(name)].asLines()[1] != "#"+str(__version__):
ecrire=2
if ecrire==1:
scripting=Blender.Text.New(name)
scripting.write(script)
if ecrire==2:
scripting=Blender.Text.Get(name)
scripting.write(script)
#Lier
def lier(name,type):
global scene
try:
leslies=[script for script in scene.getScriptLinks(type)]
except:leslies=[]
if name not in leslies:
scene.addScriptLink(name,type)
#Suppression d'un texte
# Delier : scene.clearScriptLinks([name])
def supprtexte(name):
global scene
try:
Texte=Blender.Text.Get(name)
Texte.clear()
scene.clearScriptLinks([name])
Blender.Text.unlink(Texte)
except:print('---Initialisation of Trajectory_'+str(__version__)+'.py---')
#On regarde si le script est deja en route
lestext=Blender.Text.Get()
Ntext=[txt.name for txt in lestext]
if ('Trajectory' not in Ntext) or (lestext[Ntext.index('Trajectory')].asLines()[1] != "#"+str(__version__)):
ask_modif=0
else:
ask_modif=1
#Si oui on demande ce qu'on fait
if ask_modif==1:
ask_modif=Blender.Draw.PupMenu("Script already launch %t|Modify settings%x0|Keep settings%x1|Stop script%x2|")
selection_mode=0
futur=0
past=0
epaisseur=1
#Dans le cas de la modification du script
if ask_modif==0:
handle_mode=Blender.Draw.PupMenu("Mode for linking? %t|Redraw (actived for each 3D View)%x1|Space Handler(you have to activate for each area by View>>SpaceHandler)%x2|")
selection_mode=Blender.Draw.PupMenu("Always show path for currently selected objects? %t|Yes%x1|No%x2|")
futur=Blender.Draw.PupIntInput('Futur',35,1,900)
past=Blender.Draw.PupIntInput('Past',20,1,900)
epaisseur=Blender.Draw.PupIntInput('Trajectory width',2,1,7)
if selection_mode==1:
objets_select=[obj.name for obj in Blender.Object.GetSelected()]
else:
objets_select=[]
if futur==None:
futur=35
if past==None:
past=20
if epaisseur==None:
epaisseur=2
try:
if handle_mode==2:
DrawPart="#SPACEHANDLER.VIEW3D.DRAW\n"
else:
DrawPart="#!BPY\n"
except:DrawPart="#BadlyMade"
DrawPart=DrawPart+"#"+str(__version__)+"""
#This script is a part of Trajectory.py and have to be linked to the scene in Redraw if not in HANDLER mode.
#Author : 3R - Regis Montoya
#It's better to use the Trajectory.py
#To find help :
#You can modify the two following value to change the path settings
futur="""+str(futur)+"""
past="""+str(past)+"""
objets_nom="""+str(objets_select)+"""
import Blender,math
from Blender import BGL,Draw
from Blender.BGL import *
from Blender.Draw import *
from math import *
#Prise de la frame actuelle
frameC=Blender.Get('curframe')
renderingCont=Blender.Scene.getCurrent().getRenderingContext()
k=1.00*renderingCont.oldMapValue()/renderingCont.newMapValue()
if k<1:
tr=-1*int(log(k*0.1,10))
else:
tr=-1*int(log(k,10))
#Creation de la frame de comparaison, reelle et entiere (pour test rouge, place ipo, trace courbe)
frameCtr=round(frameC*k,tr)
frameCr=frameC*k
frameC=int(round(frameC*k,0))
#Listage des objets demandes dans $objets
objets=[o for o in Blender.Object.GetSelected()]
for objn in objets_nom:
try:
if objn not in [o.name for o in objets]:
objets.append(Blender.Object.Get(objn))
except:
print "Warning : "+str(objn)+"not found"
#Fonction de retour de la matrice des parent a une frame donnee
def matrixForTraj(frame,PARENTS):
DecMatC=Blender.Mathutils.Matrix([1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1])
for i in range(len(PARENTS)):
parent=PARENTS[i][0]
try:X=PARENTS[i][5].evaluate(frame)*pi/18
except:X=parent.RotX
try:Y=PARENTS[i][6].evaluate(frame)*pi/18
except:Y=parent.RotY
try:Z=PARENTS[i][7].evaluate(frame)*pi/18
except:Z=parent.RotZ
try:LX=PARENTS[i][2].evaluate(frame)
except:LX=parent.LocX
try:LY=PARENTS[i][3].evaluate(frame)
except:LY=parent.LocY
try:LZ=PARENTS[i][4].evaluate(frame)
except:LZ=parent.LocZ
try:SX=PARENTS[i][8].evaluate(frame)
except:SX=parent.SizeX
try:SY=PARENTS[i][9].evaluate(frame)
except:SY=parent.SizeY
try:SZ=PARENTS[i][10].evaluate(frame)
except:SZ=parent.SizeZ
NMat=Blender.Mathutils.Matrix([cos(Y)*cos(Z)*SX,SX*cos(Y)*sin(Z),-SX*sin(Y),0],
[(-cos(X)*sin(Z)+sin(Y)*sin(X)*cos(Z))*SY,(sin(X)*sin(Y)*sin(Z)+cos(X)*cos(Z))*SY,sin(X)*cos(Y)*SY,0],
[(cos(X)*sin(Y)*cos(Z)+sin(X)*sin(Z))*SZ,(cos(X)*sin(Y)*sin(Z)-sin(X)*cos(Z))*SZ,SZ*cos(X)*cos(Y),0],
[LX,LY,LZ,1])
DecMatC=DecMatC*PARENTS[i][1]*NMat
return DecMatC
TestLIST=[]
#On trace la trajectoire pour tout les objets liste
for obj in objets:
LocX=[]
LocY=[]
LocZ=[]
#Liste contenant les points vertex de trajectoire
vertexX=[]
try:
ipoLocX=obj.getIpo().getCurve('LocX')
ipoLocY=obj.getIpo().getCurve('LocY')
ipoLocZ=obj.getIpo().getCurve('LocZ')
except:
ipoLocX="none"
ipoLocY="none"
ipoLocZ="none"
#Initialisation de la boucle de recuperage parents
parent=obj.getParent()
saveObj=obj
enfant=obj
PARENTS=[]
#Boucle de get des info des parents :
#liste de [nom,matrice initiale au parentage, ipo en X,Y,Z,rotX,rotY,rotZ,sizeX,Y,Z]
while type(parent)==Blender.Types.ObjectType:
Init_Mat=Blender.Mathutils.Matrix(enfant.getMatrix('worldspace'))
Init_Mat.invert()
Init_Mat=Init_Mat*enfant.getMatrix('localspace')
Init_Mat=parent.getMatrix()*Init_Mat
Init_Mat.invert()
try:
ipo_Parent_LocX=parent.getIpo().getCurve('LocX')
ipo_Parent_LocY=parent.getIpo().getCurve('LocY')
ipo_Parent_LocZ=parent.getIpo().getCurve('LocZ')
ipo_Parent_RotX=parent.getIpo().getCurve('RotX')
ipo_Parent_RotY=parent.getIpo().getCurve('RotY')
ipo_Parent_RotZ=parent.getIpo().getCurve('RotZ')
ipo_Parent_SizeX=parent.getIpo().getCurve('SizeX')
ipo_Parent_SizeY=parent.getIpo().getCurve('SizeY')
ipo_Parent_SizeZ=parent.getIpo().getCurve('SizeZ')
except:
ipo_Parent_LocX="none"
ipo_Parent_LocY="none"
ipo_Parent_LocZ="none"
ipo_Parent_RotX="none"
ipo_Parent_RotY="none"
ipo_Parent_RotZ="none"
ipo_Parent_SizeX="none"
ipo_Parent_SizeY="none"
ipo_Parent_SizeZ="none"
PARENTS.append([parent,Init_Mat,ipo_Parent_LocX,ipo_Parent_LocY,ipo_Parent_LocZ,ipo_Parent_RotX,ipo_Parent_RotY,ipo_Parent_RotZ,ipo_Parent_SizeX,ipo_Parent_SizeY,ipo_Parent_SizeZ])
enfant=parent
parent=parent.getParent()
#Retour de la matrice de decalage du au parent a la frame courante
DecMatC=matrixForTraj(frameC,PARENTS)
obj=saveObj
try:LXC=ipoLocX.evaluate(frameC)
except:LXC=obj.LocX
try:LYC=ipoLocY.evaluate(frameC)
except:LYC=obj.LocY
try:LZC=ipoLocZ.evaluate(frameC)
except:LZC=obj.LocZ
vect=Blender.Mathutils.Vector([obj.LocX,obj.LocY,obj.LocZ,1])
color=[0,1]
#En cas de modif de la trajectoire
if round(obj.LocX,5)<>round(LXC,5):
for bez in ipoLocX.bezierPoints:
if round(bez.getPoints()[0],tr)==frameCtr:
bez.setPoints((frameCr,vect[0]))
ipoLocX.recalc()
if round(obj.LocY,5)<>round(LYC,5):
for bez in ipoLocY.bezierPoints:
if round(bez.getPoints()[0],tr)==frameCtr:
bez.setPoints((frameCr,vect[1]))
ipoLocY.recalc()
if round(obj.LocZ,5)<>round(LZC,5):
for bez in ipoLocZ.bezierPoints:
if round(bez.getPoints()[0],tr)==frameCtr:
bez.setPoints((frameCr,vect[2]))
ipoLocZ.recalc()
#Changement de couleur de la trajectoire
try:
for bez in ipoLocX.bezierPoints:
vertexX.append(round(bez.getPoints()[0],tr))#Rajout des points vertex aux frames qu'on peut modif
if round(bez.getPoints()[0],tr)==frameCtr:
color=[1,color[1]-0.3]
except:pass
try:
for bez in ipoLocY.bezierPoints:
if round(bez.getPoints()[0],tr)==frameCtr:
color=[1,color[1]-0.3]
except:pass
try:
for bez in ipoLocZ.bezierPoints:
if round(bez.getPoints()[0],tr)==frameCtr:
color=[1,color[1]-0.3]
except:pass
for frame in range(frameC-past,frameC+futur):
DecMat=matrixForTraj(frame,PARENTS)
try:LX=ipoLocX.evaluate(frame)
except:LX=obj.LocX
try:LY=ipoLocY.evaluate(frame)
except:LY=obj.LocY
try:LZ=ipoLocZ.evaluate(frame)
except:LZ=obj.LocZ
vect=Blender.Mathutils.Vector([LX,LY,LZ,1])
if frame==frameC:
LXC,LYC,LZC=vect[0],vect[1],vect[2]
DecMatC=DecMat
vect=vect*DecMat
LocX.append(vect[0])
LocY.append(vect[1])
LocZ.append(vect[2])
matview=Blender.Window.GetPerspMatrix()
MatPreBuff=[]
for i in range(4):
for j in range(4):
MatPreBuff.append(matview[i][j])
MatBuff=BGL.Buffer(GL_FLOAT,16,MatPreBuff)
glLoadIdentity()
glMatrixMode(GL_PROJECTION)
glLoadMatrixf(MatBuff)
glLineWidth("""+str(epaisseur)+""")
glBegin(GL_LINE_STRIP)
for i in range(len(LocX)):
glColor3f((i+1)*1.00/len(LocX)*color[0],0,(i+1)*1.00/len(LocX)*color[1])
glVertex3f(LocX[i],LocY[i],LocZ[i])
glEnd()
if not Blender.Window.EditMode():
glPointSize(5)
glBegin(GL_POINTS)
glColor3f(1,0.7,0.2)
TestPOINTS=[]
TestFRAME=[]
for i in vertexX:
ix=int(i)-frameC+past
if ix>=0 and ixpt[0]-4 and SourCo[1]>pt[1]-4 and SourCo[1]0:
ev=Blender.Window.QRead()[0]
if ev not in [4,5,18,112,213]:
SetKeyQualifiers(1)
SetKeyQualifiers(0)
SetKeyQualifiers(Blender.Window.GetKeyQualifiers())
QAdd(f,ev,1,0)
QHandle(f)
Blender.Redraw()
if ev in [RIGHTMOUSE,LEFTMOUSE,ESCKEY]:
done=1
Blender.Set('curframe',\"\"\"+str(Blender.Get('curframe'))+\"\"\")
Blender.Object.GetSelected()[0].select(0)
for OName in \"\"\"+str(objetNom)+\"\"\":
obj=Blender.Object.Get(OName)
obj.select(1)
scripting=Blender.Text.Get('Edit_Trajectory')
scripting.clear()
Blender.Text.unlink(scripting)
\"\"\"
scene=Blender.Scene.GetCurrent()
try:
scripting=Blender.Text.Get('Edit_Trajectory')
scripting.clear()
Blender.Text.unlink(scripting)
except:pass
scripting=Blender.Text.New('Edit_Trajectory')
scripting.write(script)
script=Blender.Text.Get('Edit_Trajectory')
Blender.Set('curframe',TestFRAME[k])
oldObjS=Blender.Object.GetSelected()
for oObj in oldObjS:
oObj.select(0)
TestLIST[j][0].select(1)
Blender.Run('Edit_Trajectory')
"""
if ask_modif==0:
supprtexte('Trajectory')
ecrire('Trajectory',DrawPart)
if handle_mode==2:
Blender.UpdateMenus()
else:
lier('Trajectory','Redraw')
if ask_modif==2:
supprtexte('Trajectory')
print("---End of Trajectory_'+str(__version__)+'.py---\n--- Thanks for use ---")