diff options
Diffstat (limited to 'release/scripts/animation_trajectory.py')
-rw-r--r-- | release/scripts/animation_trajectory.py | 575 |
1 files changed, 0 insertions, 575 deletions
diff --git a/release/scripts/animation_trajectory.py b/release/scripts/animation_trajectory.py deleted file mode 100644 index 55a670b66b1..00000000000 --- a/release/scripts/animation_trajectory.py +++ /dev/null @@ -1,575 +0,0 @@ -#!BPY - -""" Registration info for Blender menus: <- these words are ignored -Name: 'Trajectory' -Blender: 243 -Group: 'Animation' -Tip: 'See Trajectory of selected object' -""" - -__author__ = '3R - R3gis' -__version__ = '2.43' -__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 -- If you want to use Space Handler or a Scriptlink in Redraw mode -- Future and Past : it is the frame in past and future -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) - -Points appears on trajectory : -- Left Clic to modify position -- Right Clic to go to the frame it represents - -Notes:<br> -In scriptlink mode, it create one script link so make sure that 'Enable Script Link' toogle is on -In SpaceHandler mode, you have to go in View>>SpaceHandlerScript menu to activate Trajectory - - -""" - - -# -------------------------------------------------------------------------- -# ***** 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 ***** -# -------------------------------------------------------------------------- -################################# -# by 3R - 26/08/05 -# for any problem : -# r3gis@free.fr -# ou sur le newsgroup: -# http://zoo-logique.org/3D.Blender/ -################################# -#Many thanks to cambo for his fixes -################################# - - - -import Blender - - -scene= Blender.Scene.GetCurrent() - - -#Writing -def write_script(name, script): - global scene - #List texts and their name - #write : type of writing : 1->New, 2->Overwrite - scripting= None - for text in Blender.Text.Get(): - if text.name==name and text.asLines()[1] != "#"+str(__version__): - scripting = text - scripting.clear() - scripting.write(script) - break - - if not scripting: - scripting= Blender.Text.New(name) - scripting.write(script) - -def link_script(name, type): - global scene - scriptlinks = scene.getScriptLinks(type) # none or list - if not scriptlinks or name not in scriptlinks: - scene.addScriptLink(name, type) - - -#Deleting of a text -def text_remove(name): - global scene - #try to delete text if already linked - try: - text= Blender.Text.Get(name) - # Texte.clear() - scene.clearScriptLinks([name]) - Blender.Text.unlink(text) - except: - print('---Initialisation of Trajectory_'+str(__version__)+'.py---') - -#Whether is already running, also check if it's the last version of the script : second line contain the version fo the script -ask_modif= 0 # Default -for text in Blender.Text.Get(): - if text.name == 'Trajectory' and text.asLines()[1] == "#"+str(__version__): - #We ask if script modify his seetings, keep it or stop script - ask_modif= Blender.Draw.PupMenu("Script already launch %t|Modify settings%x0|Keep settings%x1|Stop script%x2|") - if ask_modif==-1: # user canceled. - ask_modif= 1 - break - -selection_mode= 0 -future= 35 -past= 20 -width= 2 - -#In modify case -if ask_modif==0: - handle_mode= Blender.Draw.Create(0) - selection_mode= Blender.Draw.Create(0) - future= Blender.Draw.Create(35) - past= Blender.Draw.Create(20) - width= Blender.Draw.Create(2) - - block= [] - block.append(("Space Handlers", handle_mode, "You have to activate for each area by View>>SpaceHandler")) #You can delete this option... - block.append(("Always Draw", selection_mode, "Selected object will have their trajectory always shown")) - block.append(("Past :", past, 1, 900)) - block.append(("Futur:", future, 1, 900)) - block.append(("Width:", width, 1,5)) - - if not Blender.Draw.PupBlock("Trajectory seetings", block): - ask_modif=1 - - handle_mode= handle_mode.val - selection_mode= selection_mode.val - future= future.val - past= past.val - width= width.val - - -#put names of selected objects in objects_select if option choosen by user -if selection_mode==1: - objects_select= [ob.name for ob in scene.objects.context] -else: - objects_select= [] - - -try: - if handle_mode==1: - DrawPart="#SPACEHANDLER.VIEW3D.DRAW\n" - else: - DrawPart="#!BPY\n" -except:DrawPart="#BadlyMade" - - -#Here is the script to write in Blender and to link, options are also written now -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_"version_number".py -#You can modify the two following value to change the path settings -future="""+str(future)+""" -past="""+str(past)+""" -object_init_names="""+str(objects_select)+""" - - -import Blender, math -from Blender import BGL, Draw, Ipo -from Blender.BGL import * -from Blender.Draw import * -from math import * - -from Blender.Mathutils import Vector - -#take actual frame -frameC=Blender.Get('curframe') -scene = Blender.Scene.GetCurrent() -render_context=scene.getRenderingContext() -#ajust number of frames with NewMap and OldMapvalue values -k=1.00*render_context.oldMapValue()/render_context.newMapValue() -if k<1: - tr=-1*int(log(k*0.1, 10)) -else: - tr=-1*int(log(k, 10)) -#The real and integer frame to compare to ipos keys frames -frameCtr=round(frameC*k, tr) -frameCr=frameC*k -frameC=int(round(frameC*k, 0)) - - -#List objects that we have to show trajectory in $objects -# In this case, using a dict for unique objects is the fastest way. -object_dict= dict([(ob.name, ob) for ob in scene.objects.context]) -for obname in object_init_names: - if not object_dict.has_key(obname): - try: # Object may be removed. - object_dict[obname]= Blender.Object.Get(obname) - except: - pass # object was removed. - -#This fonction give the resulting matrix of all parents at a given frame -#parent_list is the list of all parents [object, matrix, locX_ipo, locY, Z, rotX, Y, Z, sizeX, Y, Z] of current object -def matrixForTraj(frame, parent_list): - DecMatC=Blender.Mathutils.Matrix([1,0,0,0], [0,1,0,0], [0,0,1,0], [0,0,0,1]) - - for parent_data in parent_list: - parent_ob= parent_data[0] - - try: X= parent_data[5][frame]*pi/18 - except: X= parent_ob.RotX - try: Y= parent_data[6][frame]*pi/18 - except: Y= parent_ob.RotY - try: Z= parent_data[7][frame]*pi/18 - except: Z= parent_ob.RotZ - try: LX= parent_data[2][frame] - except: LX= parent_ob.LocX - try: LY= parent_data[3][frame] - except: LY= parent_ob.LocY - try: LZ= parent_data[4][frame] - except: LZ= parent_ob.LocZ - try: SX= parent_data[8][frame] - except: SX= parent_ob.SizeX - try: SY= parent_data[9][frame] - except: SY= parent_ob.SizeY - try: SZ= parent_data[10][frame] - except: SZ= parent_ob.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*parent_data[1]*NMat - return DecMatC - -##### -TestLIST=[] -matview=Blender.Window.GetPerspMatrix() -########### -#Fonction to draw trajectories -########### - -def Trace_Traj(ob): - global TestLIST, matview - #we draw trajectories for all objects in list - - LocX=[] - LocY=[] - LocZ=[] - #List with trajectories' vertexs - vertexX=[] - - contextIpo= ob.ipo - if contextIpo: - ipoLocX=contextIpo[Ipo.OB_LOCX] - ipoLocY=contextIpo[Ipo.OB_LOCY] - ipoLocZ=contextIpo[Ipo.OB_LOCZ] - ipoTime=contextIpo[Ipo.OB_TIME] - else: # only do if there is no IPO (if no ipo curves : return None object and don't go in this except) - ipoLocX= ipoLocY= ipoLocZ= ipoTime= None - - if ipoTime: - return 0 - - #Get all parents of ob - parent=ob.parent - backup_ob= ob - child= ob - parent_list= [] - - #Get parents's infos : - #list of [name, initial matrix at make parent, ipo in X,Y,Z,rotX,rotY,rotZ,sizeX,Y,Z] - while parent: - Init_Mat=Blender.Mathutils.Matrix(child.getMatrix('worldspace')) #must be done like it (it isn't a matrix otherwise) - Init_Mat.invert() - Init_Mat=Init_Mat*child.getMatrix('localspace') - Init_Mat=parent.getMatrix()*Init_Mat - Init_Mat.invert() - - contextIpo= parent.ipo # None or IPO - if contextIpo: - ipo_Parent_LocX=contextIpo[Ipo.OB_LOCX] - ipo_Parent_LocY=contextIpo[Ipo.OB_LOCY] - ipo_Parent_LocZ=contextIpo[Ipo.OB_LOCZ] - ipo_Parent_RotX=contextIpo[Ipo.OB_ROTX] - ipo_Parent_RotY=contextIpo[Ipo.OB_ROTY] - ipo_Parent_RotZ=contextIpo[Ipo.OB_ROTZ] - ipo_Parent_SizeX=contextIpo[Ipo.OB_SIZEX] - ipo_Parent_SizeY=contextIpo[Ipo.OB_SIZEY] - ipo_Parent_SizeZ=contextIpo[Ipo.OB_SIZEZ] - else: - 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= None - - parent_list.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]) - - child=parent - parent=parent.parent - - #security : if one of parents object are a path>>follow : trajectory don't work properly so it have to draw nothing - for parent in parent_list: - if parent[0].type == 'Curve': - if parent[0].data.flag & 1<<4: # Follow path, 4th bit - return 1 - - #ob >> re-assign obj and not parent - ob= backup_ob - ob= backup_ob - - - if ipoLocX: LXC= ipoLocX[frameC] - else: LXC= ob.LocX - if ipoLocY: LYC= ipoLocY[frameC] - else: LYC= ob.LocY - if ipoLocZ: LZC= ipoLocZ[frameC] - else: LZC= ob.LocZ - - vect= Vector([ob.LocX, ob.LocY, ob.LocZ, 1]) - color=[0, 1] - - #If trajectory is being modified and we are at a frame where a ipo key already exist - if round(ob.LocX, 5)!=round(LXC, 5): - for bez in ipoLocX.bezierPoints: - if round(bez.pt[0], tr)==frameCtr: - bez.pt = [frameCr, vect[0]] - ipoLocX.recalc() - if round(ob.LocY, 5)!=round(LYC, 5): - for bez in ipoLocY.bezierPoints: - if round(bez.pt[0], tr)==frameCtr: - bez.pt = [frameCr, vect[1]] - ipoLocY.recalc() - if round(ob.LocZ, 5)!=round(LZC, 5): - for bez in ipoLocZ.bezierPoints: - if round(bez.pt[0], tr)==frameCtr: - bez.pt = [frameCr, vect[2]] - ipoLocZ.recalc() - - #change trajectory color if at an ipoKey - VertexFrame=[] - bezier_Coord=0 - if ipoLocX: # FIXED like others it was just in case ipoLocX==None - for bez in ipoLocX.bezierPoints: - bezier_Coord=round(bez.pt[0], tr) - if bezier_Coord not in VertexFrame: - VertexFrame.append(bezier_Coord) - if bezier_Coord==frameCtr: - color=[1, color[1]-0.3] - if ipoLocY: # FIXED - for bez in ipoLocY.bezierPoints: - bezier_Coord=round(bez.pt[0], tr) - if bezier_Coord not in VertexFrame: - VertexFrame.append(bezier_Coord) - if round(bez.pt[0], tr)==frameCtr: - color=[1, color[1]-0.3] - if ipoLocZ: # FIXED - for bez in ipoLocZ.bezierPoints: - bezier_Coord=round(bez.pt[0], tr) - if bezier_Coord not in VertexFrame: - VertexFrame.append(bezier_Coord) - if round(bez.pt[0], tr)==frameCtr: - color=[1, color[1]-0.3] - - - #put in LocX, LocY and LocZ all points of trajectory - for frame in xrange(frameC-past, frameC+future): - DecMat=matrixForTraj(frame, parent_list) - - if ipoLocX: LX= ipoLocX[frame] - else: LX= ob.LocX - if ipoLocY: LY= ipoLocY[frame] - else: LY= ob.LocY - if ipoLocZ: LZ= ipoLocZ[frame] - else: LZ= ob.LocZ - - vect=Vector(LX, LY, LZ)*DecMat - LocX.append(vect[0]) - LocY.append(vect[1]) - LocZ.append(vect[2]) - - - #draw part : get current view - MatPreBuff= [matview[i][j] for i in xrange(4) for j in xrange(4)] - - MatBuff=BGL.Buffer(GL_FLOAT, 16, MatPreBuff) - - glLoadIdentity() - glMatrixMode(GL_PROJECTION) - glPushMatrix() - glLoadMatrixf(MatBuff) - - #draw trajectory line - glLineWidth("""+str(width)+""") - - glBegin(GL_LINE_STRIP) - for i in xrange(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() - - #draw trajectory's "vertexs" - if not Blender.Window.EditMode(): - glPointSize(5) - glBegin(GL_POINTS) - TestPOINTS=[] - TestFRAME=[] - i=0 - for frame in VertexFrame: - ix=int(frame)-frameC+past - if ix>=0 and ix<len(LocX): - glColor3f(1, 0.7, 0.2) - glVertex3f(LocX[ix], LocY[ix], LocZ[ix]) - TestPOINTS.append(Vector([LocX[ix], LocY[ix], LocZ[ix], 1])) - TestFRAME.append(int(frame)) - i+=1 - glEnd() - #this list contains info about where to check if we click over a "vertex" in 3D view - TestLIST.append((ob, TestPOINTS, TestFRAME)) - - glLineWidth(1) - return 0 - - -for ob in object_dict.itervalues(): - Trace_Traj(ob) - -########### -#Fonction to handle trajectories -########### - -def Manip(): - #use TestLIST and matview defined by Trace_Traj - global TestLIST, matview - for screen in Blender.Window.GetScreenInfo(Blender.Window.Types.VIEW3D): - if screen['id']==Blender.Window.GetAreaID(): - x0, y0, x1, y1= screen['vertices'] - break - - #Projection of GL matrix in 3D view - glPushMatrix() - glMatrixMode(GL_PROJECTION) - glPushMatrix() - glLoadIdentity() - #Global coordinates' matrix - glOrtho(x0, x1, y0, y1, -1, 0) - glMatrixMode(GL_MODELVIEW) - glLoadIdentity() - #Test mouse clics and other events - - - if Blender.Window.QTest(): - evt, val= Blender.Window.QRead() - if (evt==LEFTMOUSE or evt==RIGHTMOUSE) and not Blender.Window.EditMode(): - mouse_co=Blender.Window.GetMouseCoords() - #if click on trajectory "vertexs"... - for ob, TestPOINTS, TestFRAME in TestLIST: # ob is now used, line 552 to know what object it had to select - for k, Vect in enumerate(TestPOINTS): - proj=Vect*matview - - pt=[(proj[0]/proj[3])*(x1-x0)/2+(x1+x0)/2, (proj[1]/proj[3])*(y1-y0)/2+(y1+y0)/2] - - if mouse_co[0]<pt[0]+4 and mouse_co[0]>pt[0]-4 and mouse_co[1]>pt[1]-4 and mouse_co[1]<pt[1]+4: - if evt==LEFTMOUSE: - #remember current selected object - object_names=[obj.name for obj in Blender.Object.GetSelected()] - #this script allow to simulate a GKey, but I have to write a script - #another way would made a infinit redraw or don't allow to move object - #it auto unlink and delete itself - script=\"\"\" -import Blender -from Blender import Draw, Window -from Blender.Window import * -from Blender.Draw import * - -from Blender.Mathutils import Vector - -# The following code is a bit of a hack, it allows clicking on the points and dragging directly -#It simulate user press GKey -#It also set the cursor position at center (because user have previously clic on area and moved the cursor): -#And I can't get previous cursor position : redraw appear after it has been moved -#If there is no better way you can remove this comments -f= GetAreaID() -SetCursorPos(0,0,0) -#SetKeyQualifiers(1) #FIXED : the bug in older versions seems to have been fixed -SetKeyQualifiers(0) -QAdd(f, Blender.Draw.GKEY, 1, 0) -QHandle(f) -Blender.Redraw() -done=0 -while not done: - while Blender.Window.QTest(): - ev=Blender.Window.QRead()[0] - if ev not in (4, 5, 18, 112, 213): #all event needed to move object - #SetKeyQualifiers(1) #FIXED too, same reason that above - #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].sel= False -for obname in \"\"\"+str(object_names)+\"\"\": - ob=Blender.Object.Get(obname) - ob.sel= True -SetCursorPos(0,0,0) -scripting=Blender.Text.Get('Edit_Trajectory') -scripting.clear() -Blender.Text.unlink(scripting) - \"\"\" - - #FIXED Edit_Trajectory was longer : all SetKeyQualifiers removed - scene=Blender.Scene.GetCurrent() - try: - scripting=Blender.Text.Get('Edit_Trajectory') - scripting.clear() - except: - scripting=Blender.Text.New('Edit_Trajectory') - - scripting.write(script) - #script= scripting #FIXED seems not needed anymore - - #Go to frame that correspond to selected "vertex" - Blender.Set('curframe', TestFRAME[k]) - - scene.objects.selected = [] #un select all objects - - #FIXED TestLIST[j][0].sel=0, but no j. So ob.sel and above variable changed in obj - ob.sel= True - Blender.Run('Edit_Trajectory') - - #work well now !!! - if evt==RIGHTMOUSE : - Blender.Set('curframe', TestFRAME[k]) - -Manip() -#retrieve a normal matrix -glPopMatrix() -glMatrixMode(GL_PROJECTION) -glPopMatrix() -glMatrixMode(GL_MODELVIEW) -""" - -if ask_modif==0: - text_remove('Trajectory') - write_script('Trajectory', DrawPart) - if handle_mode==1: - Blender.UpdateMenus() - else: - link_script('Trajectory', 'Redraw') -if ask_modif==2: - text_remove('Trajectory') - print("---End of Trajectory_"+str(__version__)+".py---\n--- Thanks for use ---") |