This is a read-only mirror of pymolwiki.org

Difference between revisions of "Slerpy"

From PyMOL Wiki
Jump to navigation Jump to search
Line 159: Line 159:
  
 
=Script Files=
 
=Script Files=
 +
 +
*;slerpy.py:The command definitions for slerpy
  
 
<source lang="python">
 
<source lang="python">
Line 181: Line 183:
  
 
def readViews( filename ):
 
def readViews( filename ):
 
 
     vfile = open( filename, 'r')
 
     vfile = open( filename, 'r')
 
 
     views = [] #a list of views each of which is a list of 18 numbers
 
     views = [] #a list of views each of which is a list of 18 numbers
 
 
     vstrings = vfile.readlines()
 
     vstrings = vfile.readlines()
 
 
     for vstring in vstrings:
 
     for vstring in vstrings:
 
 
         vals = vstring.split()
 
         vals = vstring.split()
 
 
         view = [float(v) for v in vals]
 
         view = [float(v) for v in vals]
 
 
         views.append( view )
 
         views.append( view )
 
 
     vfile.close()
 
     vfile.close()
 
 
     return views
 
     return views
 
 
  
 
def readFrames( filename ):
 
def readFrames( filename ):
 
 
     ffile = open( filename, 'r' )
 
     ffile = open( filename, 'r' )
 
 
     frames = []
 
     frames = []
 
 
     fstrings = ffile.readlines()
 
     fstrings = ffile.readlines()
 
 
     for fstring in fstrings:
 
     for fstring in fstrings:
 
 
         frames.append( int(fstring) )
 
         frames.append( int(fstring) )
 
 
     ffile.close()
 
     ffile.close()
 
 
     return frames
 
     return frames
 
 
  
 
def readActions( filename ):
 
def readActions( filename ):
 
 
     #actions are stored in file where
 
     #actions are stored in file where
 
 
     #for each line, the first 4 chars are the view index
 
     #for each line, the first 4 chars are the view index
 
 
     #associated with the action and the rest of the
 
     #associated with the action and the rest of the
 
 
     #line is the pymol command to be executed
 
     #line is the pymol command to be executed
 
 
     #upon reading, a dictionary is returned
 
     #upon reading, a dictionary is returned
 
 
     #with view indices as keys and actions as values
 
     #with view indices as keys and actions as values
 
 
     actions = {}
 
     actions = {}
 
 
     try:
 
     try:
 
 
         afile = open( filename, 'r' )
 
         afile = open( filename, 'r' )
 
 
     except:
 
     except:
 
 
         print "No actions for this project"
 
         print "No actions for this project"
 
 
         return actions
 
         return actions
 
 
     astrings = afile.readlines()
 
     astrings = afile.readlines()
 
 
     for astring in astrings:
 
     for astring in astrings:
 
+
        try:
try:
 
 
 
 
             aindex = int(astring[:4])
 
             aindex = int(astring[:4])
 
 
             action = astring[4:]
 
             action = astring[4:]
 
 
             actions[ aindex ] = action[:-1]
 
             actions[ aindex ] = action[:-1]
 
+
        except:
except:
+
            print "empty line"
 
 
    print "empty line"
 
 
 
 
     afile.close()
 
     afile.close()
 
 
     return actions
 
     return actions
 
 
  
 
def readModels( filename ):
 
def readModels( filename ):
 
 
     models = {}
 
     models = {}
 
 
     try:
 
     try:
 
 
         mfile = open( filename, 'r' )
 
         mfile = open( filename, 'r' )
 
 
     except:
 
     except:
 
 
         print "No models for this project"
 
         print "No models for this project"
 
 
         return models
 
         return models
 
 
     mstrings = mfile.readlines()
 
     mstrings = mfile.readlines()
 
 
     for mstring in mstrings:
 
     for mstring in mstrings:
 
 
         try:
 
         try:
 
 
             mindex = int(mstring[:4])
 
             mindex = int(mstring[:4])
 
 
             model = mstring[4:]
 
             model = mstring[4:]
 
 
             models[ mindex ] = model[:-1]
 
             models[ mindex ] = model[:-1]
 
 
         except:
 
         except:
 
 
             print "empty line"
 
             print "empty line"
 
 
     mfile.close()
 
     mfile.close()
 
 
     return models
 
     return models
 
 
  
 
def readSettings( filename ):
 
def readSettings( filename ):
 
 
     settings = {}
 
     settings = {}
 
 
     try:
 
     try:
 
 
         sfile = open( filename, 'r' )
 
         sfile = open( filename, 'r' )
 
 
     except:
 
     except:
 
 
         print "No settings for this project"
 
         print "No settings for this project"
 
 
         return settings
 
         return settings
 
 
     sstrings = sfile.readlines()
 
     sstrings = sfile.readlines()
 
 
     for sstring in sstrings:
 
     for sstring in sstrings:
 
+
        try:
try:
+
            sindex = int(sstring[:4])
 
+
            scommas = sstring[4:]
    sindex = int(sstring[:4])
+
            settingName,selection,startVal,endVal = scommas.split(',')
 
+
            setting = [settingName,selection,float(startVal),float(endVal)]
    scommas = sstring[4:]
 
 
 
    settingName,selection,startVal,endVal = scommas.split(',')
 
 
 
    setting = [settingName,selection,float(startVal),float(endVal)]
 
 
 
 
             settings[sindex] = setting
 
             settings[sindex] = setting
 
 
         except:
 
         except:
 
 
             print "unable to parse setting"
 
             print "unable to parse setting"
 
 
     sfile.close()
 
     sfile.close()
 
 
     return settings
 
     return settings
 
+
           
   
 
 
 
 
def readScenes( filename ):
 
def readScenes( filename ):
 
 
     global scene_counter
 
     global scene_counter
 
 
  
 
     scene_counter = 0
 
     scene_counter = 0
 
 
     scenes = {}
 
     scenes = {}
 
 
     try:
 
     try:
 
 
         sfile = open( filename, 'r' )
 
         sfile = open( filename, 'r' )
 
 
     except:
 
     except:
 
 
         print "No scenes file for this project"
 
         print "No scenes file for this project"
 
 
         return scenes
 
         return scenes
 
 
     sstrings = sfile.readlines()
 
     sstrings = sfile.readlines()
 
 
     for sstring in sstrings:
 
     for sstring in sstrings:
 
 
         try:
 
         try:
 
 
             sindex = int(sstring[:4])
 
             sindex = int(sstring[:4])
 
 
             scene = sstring[4:]
 
             scene = sstring[4:]
 
 
             scenes[ sindex ] = scene[:-1]
 
             scenes[ sindex ] = scene[:-1]
 
 
             scene_counter += 1
 
             scene_counter += 1
 
 
             #print "reading scene", sstring, sindex, scene
 
             #print "reading scene", sstring, sindex, scene
 
 
         except:
 
         except:
 
 
             print "empty line"
 
             print "empty line"
 
 
     sfile.close()
 
     sfile.close()
 
 
     return scenes
 
     return scenes
 
 
  
 
def read_all( fileroot ):
 
def read_all( fileroot ):
 
 
     global views
 
     global views
 
 
     global frames
 
     global frames
 
 
     global actions
 
     global actions
 
 
     global cur_view
 
     global cur_view
 
 
     global cur_index
 
     global cur_index
 
 
     global scenes
 
     global scenes
 
 
     global models
 
     global models
 
 
     global settings
 
     global settings
 
 
      
 
      
 
 
     views = readViews( fileroot+".txt" )
 
     views = readViews( fileroot+".txt" )
 
 
     frames = readFrames( fileroot+".frm")
 
     frames = readFrames( fileroot+".frm")
 
 
     actions = readActions( fileroot+".act")
 
     actions = readActions( fileroot+".act")
 
 
     scenes = readScenes( fileroot+".scn")
 
     scenes = readScenes( fileroot+".scn")
 
 
     models = readModels( fileroot+".mod")
 
     models = readModels( fileroot+".mod")
 
 
     settings = readSettings( fileroot+".set")
 
     settings = readSettings( fileroot+".set")
 
 
     cur_view = views[0]
 
     cur_view = views[0]
 
 
     cur_index = 0
 
     cur_index = 0
 
 
     show_cur()
 
     show_cur()
 
 
      
 
      
 
 
def print_view( view ):
 
def print_view( view ):
 
 
     for i in range(0,6):
 
     for i in range(0,6):
 
 
         for j in range(0,3):
 
         for j in range(0,3):
 
 
             print "%12.6f"% view[ 3*i+j ] ,
 
             print "%12.6f"% view[ 3*i+j ] ,
 
 
         print
 
         print
 
 
  
 
def show_next():
 
def show_next():
 
 
     global cur_index
 
     global cur_index
 
 
     global cur_view
 
     global cur_view
 
 
     global views
 
     global views
 
 
     if( cur_index == len( views )-1 ):
 
     if( cur_index == len( views )-1 ):
 
 
         print "No more views."
 
         print "No more views."
 
 
         return
 
         return
 
 
     cur_index += 1
 
     cur_index += 1
 
 
     cur_view = views[ cur_index ]
 
     cur_view = views[ cur_index ]
 
 
     cmd.set_view(cur_view)
 
     cmd.set_view(cur_view)
 
 
     print "Matrix: "
 
     print "Matrix: "
 
 
     print_view( cur_view )
 
     print_view( cur_view )
 
 
     print "Showing view number ",cur_index
 
     print "Showing view number ",cur_index
 
 
  
 
def show_prev():
 
def show_prev():
 
 
     global cur_index
 
     global cur_index
 
 
     global cur_view
 
     global cur_view
 
 
     global views
 
     global views
 
 
     if( cur_index == 0 ):
 
     if( cur_index == 0 ):
 
 
         print "No more views."
 
         print "No more views."
 
 
         return
 
         return
 
 
     cur_index -= 1
 
     cur_index -= 1
 
 
     cur_view = views[ cur_index ]
 
     cur_view = views[ cur_index ]
 
 
     cmd.set_view(cur_view)
 
     cmd.set_view(cur_view)
 
 
     print "Matrix: "
 
     print "Matrix: "
 
 
     print_view( cur_view )
 
     print_view( cur_view )
 
 
     print "Showing view number ",cur_index
 
     print "Showing view number ",cur_index
 
 
  
 
def show_cur():
 
def show_cur():
 
 
     global cur_index
 
     global cur_index
 
 
     global cur_view
 
     global cur_view
 
 
     global views
 
     global views
 
 
     cur_view = views[ cur_index ]
 
     cur_view = views[ cur_index ]
 
 
     cmd.set_view(cur_view)
 
     cmd.set_view(cur_view)
 
 
     print "Matrix: "
 
     print "Matrix: "
 
 
     print_view( cur_view )
 
     print_view( cur_view )
 
 
     print "Showing view number ",cur_index
 
     print "Showing view number ",cur_index
 
 
  
 
def go_to_view( arg=0 ):
 
def go_to_view( arg=0 ):
 
 
     global cur_index
 
     global cur_index
 
 
     global cur_view
 
     global cur_view
 
 
     global views
 
     global views
 
 
     n = int( arg )
 
     n = int( arg )
 
 
     if n < 0 or n > len(views)-1:
 
     if n < 0 or n > len(views)-1:
 
 
         print "Index out of range."
 
         print "Index out of range."
 
 
         return
 
         return
 
 
     cur_index = n
 
     cur_index = n
 
 
     cur_view = views[n]
 
     cur_view = views[n]
 
 
     cmd.set_view( cur_view )
 
     cmd.set_view( cur_view )
 
 
     print "Matrix: "
 
     print "Matrix: "
 
 
     print_view( cur_view )
 
     print_view( cur_view )
 
 
     print "Showing view number ", cur_index
 
     print "Showing view number ", cur_index
 
 
  
 
def insert_current():
 
def insert_current():
 
 
     #insert the current view into the list after the view
 
     #insert the current view into the list after the view
 
 
     #in views[cur_index]
 
     #in views[cur_index]
 
 
     #set frames to default
 
     #set frames to default
 
 
     global cur_index
 
     global cur_index
 
 
     global cur_view
 
     global cur_view
 
 
     global views
 
     global views
 
 
     global frames
 
     global frames
 
 
     global actions
 
     global actions
 
 
     global scenes
 
     global scenes
 
 
     global settings
 
     global settings
 
 
     global models
 
     global models
 
 
     global fades
 
     global fades
 
 
      
 
      
 
 
     cur_index += 1
 
     cur_index += 1
 
 
     cur_view = cmd.get_view()
 
     cur_view = cmd.get_view()
 
 
     views.insert( cur_index, [cv for cv in cur_view] )
 
     views.insert( cur_index, [cv for cv in cur_view] )
 
 
     frames.insert( cur_index, 50 )
 
     frames.insert( cur_index, 50 )
 
 
      
 
      
 
 
     #deal with actions dictionary
 
     #deal with actions dictionary
 
 
     actions = incKeyAbove( actions, cur_index )
 
     actions = incKeyAbove( actions, cur_index )
 
 
     scenes = incKeyAbove( scenes, cur_index )
 
     scenes = incKeyAbove( scenes, cur_index )
 
 
     settings = incKeyAbove( settings, cur_index )
 
     settings = incKeyAbove( settings, cur_index )
 
 
     models = incKeyAbove( models, cur_index )
 
     models = incKeyAbove( models, cur_index )
 
 
     fades = incKeyAbove( fades, cur_index )
 
     fades = incKeyAbove( fades, cur_index )
 
 
  
 
     print "New view:"
 
     print "New view:"
 
 
     print_view( cur_view )
 
     print_view( cur_view )
 
 
     print "Inserted view at with index", cur_index, "and a 50 frame transition"
 
     print "Inserted view at with index", cur_index, "and a 50 frame transition"
 
 
  
 
def append_view():
 
def append_view():
 
 
     global views
 
     global views
 
 
     global frames
 
     global frames
 
 
     global cur_index
 
     global cur_index
 
 
     global cur_view
 
     global cur_view
 
 
  
 
     cur_index = len(views)
 
     cur_index = len(views)
 
 
     cur_view = cmd.get_view()
 
     cur_view = cmd.get_view()
 
 
     views.append( [cv for cv in cur_view] )
 
     views.append( [cv for cv in cur_view] )
 
 
     frames.append( 50 )
 
     frames.append( 50 )
 
 
  
 
     print "New view: "
 
     print "New view: "
 
 
     print_view( cur_view )
 
     print_view( cur_view )
 
 
     print "Appended view with index", cur_index, "and a 50 frame transition"
 
     print "Appended view with index", cur_index, "and a 50 frame transition"
 
 
     print "The current view is", cur_index
 
     print "The current view is", cur_index
 
 
      
 
      
 
 
def incKeyAbove( dict, index ):
 
def incKeyAbove( dict, index ):
 
 
     tempDict = {}
 
     tempDict = {}
 
 
     for key, val in dict.iteritems():
 
     for key, val in dict.iteritems():
 
 
         if key >= index:
 
         if key >= index:
 
 
             newkey = key + 1
 
             newkey = key + 1
 
 
             tempDict[newkey] = val
 
             tempDict[newkey] = val
 
 
         else:
 
         else:
 
 
             tempDict[key] = val
 
             tempDict[key] = val
 
 
     return tempDict
 
     return tempDict
 
 
  
 
def decKeyAbove( dict, index ):
 
def decKeyAbove( dict, index ):
 
 
     tempDict = {}
 
     tempDict = {}
 
 
     for key, val in dict.iteritems():
 
     for key, val in dict.iteritems():
 
 
         if key > index:
 
         if key > index:
 
 
             newkey = key - 1
 
             newkey = key - 1
 
 
             tempDict[newkey] = val
 
             tempDict[newkey] = val
 
 
         else:
 
         else:
 
 
             tempDict[key] = val
 
             tempDict[key] = val
 
 
     return tempDict
 
     return tempDict
 
 
      
 
      
 
 
def delete_current():
 
def delete_current():
 
 
     #remove the current view from the list
 
     #remove the current view from the list
 
 
     #show the previous view
 
     #show the previous view
 
 
     global cur_index
 
     global cur_index
 
 
     global cur_view
 
     global cur_view
 
 
     global views
 
     global views
 
 
     global actions
 
     global actions
 
 
     global scenes
 
     global scenes
 
 
     global settings
 
     global settings
 
 
     global models
 
     global models
 
 
     global frames
 
     global frames
 
 
     global fades
 
     global fades
 
 
      
 
      
 
 
     del views[cur_index]
 
     del views[cur_index]
 
 
     del frames[cur_index]
 
     del frames[cur_index]
 
 
     if actions.has_key( cur_index ):
 
     if actions.has_key( cur_index ):
 
 
         del actions[cur_index]
 
         del actions[cur_index]
 
 
     if scenes.has_key( cur_index ):
 
     if scenes.has_key( cur_index ):
 
 
         del scenes[cur_index]
 
         del scenes[cur_index]
 
 
     if settings.has_key( cur_index ):
 
     if settings.has_key( cur_index ):
 
 
         del settings[cur_index]
 
         del settings[cur_index]
 
 
          
 
          
 
 
     #deal with dictionaries
 
     #deal with dictionaries
 
 
     actions = decKeyAbove( actions, cur_index )
 
     actions = decKeyAbove( actions, cur_index )
 
 
     scenes = decKeyAbove( scenes, cur_index )
 
     scenes = decKeyAbove( scenes, cur_index )
 
 
     settings = decKeyAbove( settings, cur_index )
 
     settings = decKeyAbove( settings, cur_index )
 
 
     models = decKeyAbove( models, cur_index )                               
 
     models = decKeyAbove( models, cur_index )                               
 
 
     fades = decKeyAbove( fades, cur_index )
 
     fades = decKeyAbove( fades, cur_index )
 
 
  
 
     print "View number",cur_index,"deleted."
 
     print "View number",cur_index,"deleted."
 
 
     if cur_index > 0:
 
     if cur_index > 0:
 
 
         cur_index -= 1
 
         cur_index -= 1
 
 
     cur_view = views[cur_index]
 
     cur_view = views[cur_index]
 
 
     cmd.set_view( cur_view )
 
     cmd.set_view( cur_view )
 
 
     print "Current view is number",cur_index
 
     print "Current view is number",cur_index
 
 
  
 
def delete_settings():
 
def delete_settings():
 
 
     global settings
 
     global settings
 
 
     global cur_index
 
     global cur_index
 
 
     del settings[cur_index]
 
     del settings[cur_index]
 
 
  
 
def replace_current():
 
def replace_current():
 
 
     global cur_index
 
     global cur_index
 
 
     global cur_view
 
     global cur_view
 
 
     global views
 
     global views
 
 
     cur_view = cmd.get_view()
 
     cur_view = cmd.get_view()
 
 
     views[cur_index] = [cv for cv in cur_view]
 
     views[cur_index] = [cv for cv in cur_view]
 
 
  
 
def insert_scene():
 
def insert_scene():
 
 
     global views
 
     global views
 
 
     global actions
 
     global actions
 
 
     global settings
 
     global settings
 
 
     global frames
 
     global frames
 
 
     global cur_index
 
     global cur_index
 
 
     global cur_view
 
     global cur_view
 
 
     global scenes
 
     global scenes
 
 
     global scene_counter
 
     global scene_counter
 
 
     global models
 
     global models
 
 
     global fades
 
     global fades
 
 
   
 
   
 
 
     cur_index += 1
 
     cur_index += 1
 
 
     cur_view = cmd.get_view()
 
     cur_view = cmd.get_view()
 
 
     views.insert( cur_index, [cv for cv in cur_view] )
 
     views.insert( cur_index, [cv for cv in cur_view] )
 
 
     frames.insert( cur_index, 50 )
 
     frames.insert( cur_index, 50 )
 
 
     #TODO record scene with indexed name (global scene index?)
 
     #TODO record scene with indexed name (global scene index?)
 
 
     #Save the pse file on swrite
 
     #Save the pse file on swrite
 
 
     #We'll also need to maintain our own list of scenes as a dict
 
     #We'll also need to maintain our own list of scenes as a dict
 
 
  
 
      
 
      
 
 
     #deal with dictionaries
 
     #deal with dictionaries
 
 
     actions = incKeyAbove( actions, cur_index )
 
     actions = incKeyAbove( actions, cur_index )
 
 
     scenes = incKeyAbove( scenes, cur_index )
 
     scenes = incKeyAbove( scenes, cur_index )
 
 
     settings = incKeyAbove( settings, cur_index )
 
     settings = incKeyAbove( settings, cur_index )
 
 
     models = incKeyAbove( models, cur_index )
 
     models = incKeyAbove( models, cur_index )
 
 
     fades = incKeyAbove( fades, cur_index )
 
     fades = incKeyAbove( fades, cur_index )
 
 
  
 
     #this stuff has to be done after the above
 
     #this stuff has to be done after the above
 
 
     #find a free scene name
 
     #find a free scene name
 
 
     i = 1
 
     i = 1
 
 
     found = 1
 
     found = 1
 
 
     while found == 1:
 
     while found == 1:
 
 
         found = 0
 
         found = 0
 
 
         for sname in scenes.values():
 
         for sname in scenes.values():
 
 
             print "|"+sname+"|"
 
             print "|"+sname+"|"
 
 
             if sname == "slerpy_"+str(i):
 
             if sname == "slerpy_"+str(i):
 
 
                 found = 1
 
                 found = 1
 
 
                 break
 
                 break
 
 
         if found == 1:
 
         if found == 1:
 
 
             i += 1
 
             i += 1
 
 
         else:
 
         else:
 
 
             break
 
             break
 
 
     newname = "slerpy_"+str(i)
 
     newname = "slerpy_"+str(i)
 
 
          
 
          
 
 
     scene_counter += 1
 
     scene_counter += 1
 
 
     cmd.scene( newname, "store" )
 
     cmd.scene( newname, "store" )
 
 
     scenes[ cur_index ] = newname
 
     scenes[ cur_index ] = newname
 
 
     actions[ cur_index ] = "scene "+newname
 
     actions[ cur_index ] = "scene "+newname
 
 
      
 
      
 
 
     print "New view:"
 
     print "New view:"
 
 
     print_view( cur_view )
 
     print_view( cur_view )
 
 
     print "Inserted view at with index", cur_index, "and a 50 frame transition"
 
     print "Inserted view at with index", cur_index, "and a 50 frame transition"
 
 
     print "Added scene",newname
 
     print "Added scene",newname
 
 
      
 
      
 
 
def write_views( filename ):
 
def write_views( filename ):
 
 
     global views
 
     global views
 
 
     global frames
 
     global frames
 
 
     global scenes
 
     global scenes
 
 
     global actions
 
     global actions
 
 
     global settings
 
     global settings
 
 
     global models
 
     global models
 
 
     global fades
 
     global fades
 
 
  
 
     viewfile = open( filename+".txt", 'w')
 
     viewfile = open( filename+".txt", 'w')
 
 
     for view in views:
 
     for view in views:
 
 
         for v in view:
 
         for v in view:
 
 
             viewfile.write( str(v) + " " )
 
             viewfile.write( str(v) + " " )
 
 
         viewfile.write('\n')
 
         viewfile.write('\n')
 
 
     viewfile.close()
 
     viewfile.close()
 
 
      
 
      
 
 
     framefile = open( filename+".frm", 'w' )
 
     framefile = open( filename+".frm", 'w' )
 
 
     for frame in frames:
 
     for frame in frames:
 
 
         framefile.write( str( frame )+'\n' )
 
         framefile.write( str( frame )+'\n' )
 
 
     framefile.close()
 
     framefile.close()
 
 
  
 
     actionfile = open( filename+".act", 'w' )
 
     actionfile = open( filename+".act", 'w' )
 
 
     for key,action in actions.iteritems():
 
     for key,action in actions.iteritems():
 
 
         keystring = str( key )
 
         keystring = str( key )
 
 
         actionfile.write( keystring.rjust(4)+action + '\n' )
 
         actionfile.write( keystring.rjust(4)+action + '\n' )
 
 
     actionfile.close()
 
     actionfile.close()
 
 
  
 
     scenefile = open( filename+".scn", 'w' )
 
     scenefile = open( filename+".scn", 'w' )
 
 
     for key,scene in scenes.iteritems():
 
     for key,scene in scenes.iteritems():
 
 
         keystring = str( key )
 
         keystring = str( key )
 
 
         scenefile.write( keystring.rjust(4)+scene + '\n' )
 
         scenefile.write( keystring.rjust(4)+scene + '\n' )
 
 
     scenefile.close()
 
     scenefile.close()
 
 
  
 
     modelfile = open( filename+".mod", 'w' )
 
     modelfile = open( filename+".mod", 'w' )
 
 
     for key,model in models.iteritems():
 
     for key,model in models.iteritems():
 
 
         keystring = str( key )
 
         keystring = str( key )
 
 
         modelfile.write( keystring.rjust(4)+model + '\n' )
 
         modelfile.write( keystring.rjust(4)+model + '\n' )
 
 
     modelfile.close()
 
     modelfile.close()
 
 
  
 
     settingsfile = open( filename+".set", 'w' )
 
     settingsfile = open( filename+".set", 'w' )
 
 
     for key,setting in settings.iteritems():
 
     for key,setting in settings.iteritems():
 
+
        keystring = str( key )
keystring = str( key )
+
        settingName, selection, startVal, endVal = setting
 
+
        settingsfile.write( "%s%s,%s,%f,%f\n" % (keystring.rjust(4), settingName, selection, startVal, endVal))
settingName, selection, startVal, endVal = setting
 
 
 
settingsfile.write( "%s%s,%s,%f,%f\n" % (keystring.rjust(4), settingName, selection, startVal, endVal))
 
 
 
 
     settingsfile.close()
 
     settingsfile.close()
 
 
     cmd.save( filename+".pse" )
 
     cmd.save( filename+".pse" )
 
 
          
 
          
 
 
     print "Wrote files", filename+".txt,",filename+".frm,",filename+".pse, and",filename+".act"
 
     print "Wrote files", filename+".txt,",filename+".frm,",filename+".pse, and",filename+".act"
 
 
  
 
def writeKeyViewFile( filename ):
 
def writeKeyViewFile( filename ):
 
 
     global views
 
     global views
 
 
     global frames
 
     global frames
 
 
     global scenes
 
     global scenes
 
 
     global actions
 
     global actions
 
 
     global settings
 
     global settings
 
 
     global models
 
     global models
 
 
     global fades
 
     global fades
 
 
   
 
   
 
 
     keyviewfile = open( filename + ".key", 'w' )
 
     keyviewfile = open( filename + ".key", 'w' )
 
 
     i=0
 
     i=0
 
 
     for view in views:
 
     for view in views:
 
+
        keyviewfile.write( "VIEW: %4d " % i )
keyviewfile.write( "VIEW: %4d " % i )
 
 
 
 
         for v in view:
 
         for v in view:
 
 
             keyviewfile.write( str(v) + " " )
 
             keyviewfile.write( str(v) + " " )
 
 
         keyviewfile.write('\n')
 
         keyviewfile.write('\n')
 
+
        keyviewfile.write( "FRAMES: %d\n" % frames[i] )
keyviewfile.write( "FRAMES: %d\n" % frames[i] )
+
        if actions.has_key( i ):
 
+
            keyviewfile.write( "ACTIONS: %s\n" % actions[i] )
if actions.has_key( i ):
+
        if scenes.has_key( i ):
 
+
            keyviewfile.write( "SCENES: %s\n" % scenes[i] )
    keyviewfile.write( "ACTIONS: %s\n" % actions[i] )
+
        if models.has_key( i ):
 
+
            keyviewfile.write( "MODELS: %s\n" % models[i] )
if scenes.has_key( i ):
+
        if settings.has_key( i ):
 
+
            settingName, selection, startVal, endVal = settings[i]
    keyviewfile.write( "SCENES: %s\n" % scenes[i] )
+
            keyviewfile.write( "SETTINGS: %s, %s, %f, %f\n" % (settingName, selection, startVal, endVal))
 
+
        if fades.has_key( i ):
if models.has_key( i ):
+
            startVisSelection, endVisSelection, sticksOnly = fades[i]
 
+
            keyviewfile.write( "FADES: %s, %s, %d\n" % (startVisSelection, endVisSelection, sticksOnly))          
    keyviewfile.write( "MODELS: %s\n" % models[i] )
 
 
 
if settings.has_key( i ):
 
 
 
    settingName, selection, startVal, endVal = settings[i]
 
 
 
    keyviewfile.write( "SETTINGS: %s, %s, %f, %f\n" % (settingName, selection, startVal, endVal))
 
 
 
if fades.has_key( i ):
 
 
 
    startVisSelection, endVisSelection, sticksOnly = fades[i]
 
 
 
    keyviewfile.write( "FADES: %s, %s, %d\n" % (startVisSelection, endVisSelection, sticksOnly))    
 
 
 
 
         i += 1
 
         i += 1
 
+
        keyviewfile.write("\n")
keyviewfile.write("\n")
 
 
 
 
     keyviewfile.close()
 
     keyviewfile.close()
 
 
     cmd.save( filename + ".pse" )
 
     cmd.save( filename + ".pse" )
 
 
     print "Wrote files " , filename + ".key", filename + ".pse"
 
     print "Wrote files " , filename + ".key", filename + ".pse"
 
 
  
 
def readKeyViewFile( filename ):
 
def readKeyViewFile( filename ):
 
 
     global views
 
     global views
 
 
     global frames
 
     global frames
 
 
     global scenes
 
     global scenes
 
 
     global actions
 
     global actions
 
 
     global settings
 
     global settings
 
 
     global models
 
     global models
 
 
     global fades
 
     global fades
 
 
     global scene_counter
 
     global scene_counter
 
 
  
 
     views = []
 
     views = []
 
 
     frames = []
 
     frames = []
 
 
     actions = {}
 
     actions = {}
 
 
     scenes = {}
 
     scenes = {}
 
 
     models = {}
 
     models = {}
 
 
     settings = {}
 
     settings = {}
 
 
     fades = {}
 
     fades = {}
 
 
     scene_counter = 0
 
     scene_counter = 0
 
 
                                                                                                                    
 
                                                                                                                    
 
 
     keyviewfile = open( filename + ".key", 'r' )
 
     keyviewfile = open( filename + ".key", 'r' )
 
 
     viewstrings = keyviewfile.readlines()
 
     viewstrings = keyviewfile.readlines()
 
 
     keyviewfile.close()
 
     keyviewfile.close()
 
 
     viewindex = 0
 
     viewindex = 0
 
 
     for line in viewstrings:
 
     for line in viewstrings:
 
+
        if line.startswith("VIEW: "):
if line.startswith("VIEW: "):
+
            viewindex = int( line[6:10] )
 
+
            vals = line[10:].split()
    viewindex = int( line[6:10] )
+
            view = [float(v) for v in vals]
 
+
            views.append( view )
    vals = line[10:].split()
+
        if line.startswith("FRAMES: "):
 
+
            frames.append( int( line[8:] ) )
    view = [float(v) for v in vals]
+
        if line.startswith("ACTIONS: "):
 
+
            actions[ viewindex ] = line[9:-1]
    views.append( view )
+
        if line.startswith("SCENES: "):
 
+
            scenes[ viewindex ] = line[8:-1]
if line.startswith("FRAMES: "):
+
            scene_counter += 1
 
+
        if line.startswith("MODELS: "):
    frames.append( int( line[8:] ) )
+
            models[ viewindex ] = line[8:-1]
 
+
        if line.startswith("SETTINGS: "):
if line.startswith("ACTIONS: "):
+
            settingName,selection,startVal,endVal = line[10:-1].split(',')
 
 
    actions[ viewindex ] = line[9:-1]
 
 
 
if line.startswith("SCENES: "):
 
 
 
    scenes[ viewindex ] = line[8:-1]
 
 
 
    scene_counter += 1
 
 
 
if line.startswith("MODELS: "):
 
 
 
    models[ viewindex ] = line[8:-1]
 
 
 
if line.startswith("SETTINGS: "):
 
 
 
    settingName,selection,startVal,endVal = line[10:-1].split(',')
 
 
 
 
             settings[ viewindex ] = [settingName,selection,float(startVal),float(endVal)]
 
             settings[ viewindex ] = [settingName,selection,float(startVal),float(endVal)]
 
+
        if line.startswith( "FADES: " ):
if line.startswith( "FADES: " ):
+
            startVisSelection, endVisSelection, sticksOnly = line[7:-1].split(',')
 
+
            fades[ viewindex ] = [startVisSelection, endVisSelection, int(sticksOnly) ]
    startVisSelection, endVisSelection, sticksOnly = line[7:-1].split(',')
 
 
 
    fades[ viewindex ] = [startVisSelection, endVisSelection, int(sticksOnly) ]
 
 
 
 
     cur_view = views[0]
 
     cur_view = views[0]
 
 
     cur_index = 0
 
     cur_index = 0
 
 
     show_cur()
 
     show_cur()
 
 
  
 
def set_frames_current( arg=50 ):
 
def set_frames_current( arg=50 ):
 
 
     global frames
 
     global frames
 
 
     global cur_index
 
     global cur_index
 
 
     frames[cur_index] = int(arg)
 
     frames[cur_index] = int(arg)
 
 
  
 
def list_frames():
 
def list_frames():
 
 
     global frames
 
     global frames
 
 
     global views
 
     global views
 
 
     global actions
 
     global actions
 
 
     global models
 
     global models
 
 
     global settings
 
     global settings
 
 
      
 
      
 
 
     i=0
 
     i=0
 
 
     f=0
 
     f=0
 
 
     for view in views[:-1]:
 
     for view in views[:-1]:
 
 
         if actions.has_key( i ):
 
         if actions.has_key( i ):
 
 
             a = actions[i]
 
             a = actions[i]
 
 
         else:
 
         else:
 
 
             a = ""
 
             a = ""
 
+
        if models.has_key( i ):
if models.has_key( i ):
+
            m = "States: " + models[i]
 
 
    m = "States: " + models[i]
 
 
 
 
         else:
 
         else:
 
 
             m = ""
 
             m = ""
 
+
        if settings.has_key( i ):
if settings.has_key( i ):
 
 
 
 
             settingName, selection, startVal, endVal = settings[i]
 
             settingName, selection, startVal, endVal = settings[i]
 
+
            s = "Settings: %s %s %f %f" % (settingName, selection, startVal, endVal)
    s = "Settings: %s %s %f %f" % (settingName, selection, startVal, endVal)
+
        else:
 
+
            s = ""
else:
 
 
 
    s = ""
 
 
 
 
         print "View",i,"to",i+1,"Frames ",f,"to",f+frames[i],a,m,s
 
         print "View",i,"to",i+1,"Frames ",f,"to",f+frames[i],a,m,s
 
 
         f += frames[i]
 
         f += frames[i]
 
 
         i += 1
 
         i += 1
 
 
  
 
def add_action_current( cmd ):
 
def add_action_current( cmd ):
 
 
     global cur_index
 
     global cur_index
 
 
     global actions
 
     global actions
 
 
     actions[cur_index] = cmd[1:-1] #strip off quotes
 
     actions[cur_index] = cmd[1:-1] #strip off quotes
 
 
  
 
def append_action_current( cmd ):
 
def append_action_current( cmd ):
 
 
     global cur_index
 
     global cur_index
 
 
     global actions
 
     global actions
 
 
     actions[cur_index] += ";" + cmd[1:-1]
 
     actions[cur_index] += ";" + cmd[1:-1]
 
 
  
 
def clear_action_current():
 
def clear_action_current():
 
 
     global actions
 
     global actions
 
 
     global cur_index
 
     global cur_index
 
 
     del actions[cur_index]
 
     del actions[cur_index]
 
 
  
 
def list_actions():
 
def list_actions():
 
 
     global actions
 
     global actions
 
 
     for i,a in actions.iteritems():
 
     for i,a in actions.iteritems():
 
 
         print i,a
 
         print i,a
 
 
  
 
def morph_models( start_model, end_model ):
 
def morph_models( start_model, end_model ):
 
 
     global cur_index
 
     global cur_index
 
 
     global frames
 
     global frames
 
 
     global models
 
     global models
 
 
     models[cur_index] = "%s -%s" % (start_model, end_model)
 
     models[cur_index] = "%s -%s" % (start_model, end_model)
 
 
     frames[cur_index] = abs(int(end_model) - int(start_model)) + 1
 
     frames[cur_index] = abs(int(end_model) - int(start_model)) + 1
 
 
  
 
def interpolate_settings( setting, selection, startval, endval ):
 
def interpolate_settings( setting, selection, startval, endval ):
 
 
     global cur_index
 
     global cur_index
 
 
     global settings
 
     global settings
 
 
     settingEntry = [setting, selection, float(startval), float(endval)]
 
     settingEntry = [setting, selection, float(startval), float(endval)]
 
 
     settings[cur_index] = settingEntry  
 
     settings[cur_index] = settingEntry  
 
 
  
 
def crossfade( startVisSelection, endVisSelection, sticksOnly = 1 ):
 
def crossfade( startVisSelection, endVisSelection, sticksOnly = 1 ):
 
 
#cross fade the specified objects, vary stick transparency only if stickOnly=1
 
#cross fade the specified objects, vary stick transparency only if stickOnly=1
 
 
     global cur_index
 
     global cur_index
 
 
     global fades
 
     global fades
 
 
     fades[cur_index] = [startVisSelection, endVisSelection, int(sticksOnly) ]
 
     fades[cur_index] = [startVisSelection, endVisSelection, int(sticksOnly) ]
 
 
  
 
def setup_view( index ):
 
def setup_view( index ):
 
 
     for i in range( 0, int(index)+1 ):
 
     for i in range( 0, int(index)+1 ):
 
 
         if actions.has_key(i):
 
         if actions.has_key(i):
 
 
             print "Executing %s from actions %d" % (actions[i],i)
 
             print "Executing %s from actions %d" % (actions[i],i)
 
 
             cmd.do( actions[i] )
 
             cmd.do( actions[i] )
 
 
         if settings.has_key(i):
 
         if settings.has_key(i):
 
 
             settingName, selection, startVal, endVal = settings[i]
 
             settingName, selection, startVal, endVal = settings[i]
 
 
             action = "set %s, %f, %s;" % (settingName, endVal, selection)
 
             action = "set %s, %f, %s;" % (settingName, endVal, selection)
 
 
             print "Executing %s from settings %d" % (action,i)
 
             print "Executing %s from settings %d" % (action,i)
 
 
             cmd.do( action )
 
             cmd.do( action )
 
 
         if fades.has_key(i):
 
         if fades.has_key(i):
 
 
             startVisSelection, endVisSelection, sticksOnly = fades[i]
 
             startVisSelection, endVisSelection, sticksOnly = fades[i]
 
 
             action = "set stick_transparency, 0, %s; set stick_transparency, 1, %s;" % (endVisSelection, startVisSelection)
 
             action = "set stick_transparency, 0, %s; set stick_transparency, 1, %s;" % (endVisSelection, startVisSelection)
 
 
             print "Executing %s from fades %d" % (action, i)
 
             print "Executing %s from fades %d" % (action, i)
 
 
             cmd.do( action )
 
             cmd.do( action )
 
 
  
 
def show_transition(start_index=0, end_index=0):
 
def show_transition(start_index=0, end_index=0):
 
 
     #show the transition from the current view to the next view
 
     #show the transition from the current view to the next view
 
 
     global frames
 
     global frames
 
 
     global views
 
     global views
 
 
     global cur_index
 
     global cur_index
 
 
     global actions
 
     global actions
 
 
     global models
 
     global models
 
 
     if( start_index == 0 and end_index == 0 ):
 
     if( start_index == 0 and end_index == 0 ):
 
 
         if cur_index >= len(views)-1:
 
         if cur_index >= len(views)-1:
 
 
             print "Current view is last in sequence."
 
             print "Current view is last in sequence."
 
 
             return
 
             return
 
 
         start_index=cur_index
 
         start_index=cur_index
 
 
         end_index=cur_index+1
 
         end_index=cur_index+1
 
 
     else:
 
     else:
 
 
         start_index = int(start_index)
 
         start_index = int(start_index)
 
 
         end_index = int(end_index)
 
         end_index = int(end_index)
 
 
     ftot = 0
 
     ftot = 0
 
 
     setcommand = ""
 
     setcommand = ""
 
 
     i = start_index
 
     i = start_index
 
 
     for nframes in frames[start_index:end_index]:
 
     for nframes in frames[start_index:end_index]:
 
 
         #ftot += nframes
 
         #ftot += nframes
 
+
        if models.has_key(i):
if models.has_key(i):
+
            setcommand += " " + models[i] + " "
 
 
    setcommand += " " + models[i] + " "
 
 
 
 
         else:
 
         else:
 
 
             setcommand += " 1 x%i" % nframes
 
             setcommand += " 1 x%i" % nframes
 
 
         i += 1
 
         i += 1
 
 
          
 
          
 
 
#    cmd.mset("1 x%i" % ftot)
 
#    cmd.mset("1 x%i" % ftot)
 
 
     cmd.mset( setcommand )
 
     cmd.mset( setcommand )
 
 
     start_frame = 1
 
     start_frame = 1
 
 
     #first do all actions that happen up to this point to make sure
 
     #first do all actions that happen up to this point to make sure
 
 
     #things look the way they should
 
     #things look the way they should
 
 
     first_action = ""
 
     first_action = ""
 
 
     for i in range( 0, start_index ):
 
     for i in range( 0, start_index ):
 
 
         if actions.has_key(i):
 
         if actions.has_key(i):
 
 
             first_action += actions[i] + ';'
 
             first_action += actions[i] + ';'
 
+
            #print "Executing %s from actions %d" % (actions[i],i)
    #print "Executing %s from actions %d" % (actions[i],i)
+
            #cmd.do( actions[i] )
 
 
    #cmd.do( actions[i] )
 
 
 
 
         if settings.has_key(i):
 
         if settings.has_key(i):
 
+
            settingName, selection, startVal, endVal = settings[i]
    settingName, selection, startVal, endVal = settings[i]
+
            action = "set %s, %f, %s;" % (settingName, endVal, selection)
 
+
            first_action += action
    action = "set %s, %f, %s;" % (settingName, endVal, selection)
+
            #print "Executing %s from settings %d" % (action,i)
 
+
            #cmd.do( action )
    first_action += action
 
 
 
    #print "Executing %s from settings %d" % (action,i)
 
 
 
    #cmd.do( action )
 
 
 
 
         if fades.has_key(i):
 
         if fades.has_key(i):
 
 
             startVisSelection, endVisSelection, sticksOnly = fades[i]
 
             startVisSelection, endVisSelection, sticksOnly = fades[i]
 
+
            action = "set stick_transparency, 0, %s; set stick_transparency, 1, %s;" % (endVisSelection, startVisSelection)
    action = "set stick_transparency, 0, %s; set stick_transparency, 1, %s;" % (endVisSelection, startVisSelection)
+
            first_action += action
 
 
    first_action += action
 
 
 
 
             #print "Executing %s from fades %d" % (action, i)
 
             #print "Executing %s from fades %d" % (action, i)
 
+
            #cmd.do( action )
    #cmd.do( action )
 
 
 
 
     for i in range( start_index, end_index ):
 
     for i in range( start_index, end_index ):
 
+
        if settings.has_key(i):
if settings.has_key(i):
+
            movs.animate_transition( views[i], views[i+1], frames[i], start_frame, settings[i] )
 
+
        elif fades.has_key(i):
    movs.animate_transition( views[i], views[i+1], frames[i], start_frame, settings[i] )
 
 
 
elif fades.has_key(i):
 
 
 
 
             movs.animate_transition( views[i], views[i+1], frames[i], start_frame, fades[i] )
 
             movs.animate_transition( views[i], views[i+1], frames[i], start_frame, fades[i] )
 
+
        else:
else:
 
 
 
 
             movs.animate_transition( views[i], views[i+1], frames[i], start_frame )
 
             movs.animate_transition( views[i], views[i+1], frames[i], start_frame )
 
 
         #add an action
 
         #add an action
 
 
         if start_frame == 1:
 
         if start_frame == 1:
 
 
             mdo_cmd = first_action
 
             mdo_cmd = first_action
 
 
             if actions.has_key(i):
 
             if actions.has_key(i):
 
 
                 mdo_cmd += actions[i]+";"
 
                 mdo_cmd += actions[i]+";"
 
 
             mdo_cmd += "set_view("+str(views[i])+")"
 
             mdo_cmd += "set_view("+str(views[i])+")"
 
+
            print mdo_cmd
    print mdo_cmd
 
 
 
 
             cmd.mdo(start_frame, mdo_cmd)
 
             cmd.mdo(start_frame, mdo_cmd)
 
 
         elif actions.has_key(i):
 
         elif actions.has_key(i):
 
 
             mdo_cmd = actions[i]+";set_view("+str(views[i])+")"
 
             mdo_cmd = actions[i]+";set_view("+str(views[i])+")"
 
 
             cmd.mdo(start_frame, mdo_cmd)
 
             cmd.mdo(start_frame, mdo_cmd)
 
 
             #print mdo_cmd
 
             #print mdo_cmd
 
 
         start_frame += frames[i]
 
         start_frame += frames[i]
 
 
     cmd.frame(1)
 
     cmd.frame(1)
 
 
     cmd.mplay()
 
     cmd.mplay()
 
 
  
 
def make_all():
 
def make_all():
 
 
     #make the whole movie
 
     #make the whole movie
 
 
     global views
 
     global views
 
 
     global frames
 
     global frames
 
 
     global models
 
     global models
 
 
      
 
      
 
 
     #first get total number of frames
 
     #first get total number of frames
 
 
     ftot = 0
 
     ftot = 0
 
 
     i = 0
 
     i = 0
 
 
     setcommand = ""
 
     setcommand = ""
 
 
     for nframes in frames[:-1]:
 
     for nframes in frames[:-1]:
 
 
         ftot += nframes
 
         ftot += nframes
 
+
        if models.has_key(i):
if models.has_key(i):
+
                            setcommand += " " + models[i] + " "
 
 
            setcommand += " " + models[i] + " "
 
 
 
 
         else:
 
         else:
 
 
             setcommand += " 1 x%i" % nframes
 
             setcommand += " 1 x%i" % nframes
 
 
         i += 1
 
         i += 1
 
 
  
 
     #initialize movie
 
     #initialize movie
 
 
     #cmd.mset("1 x%i" % ftot)
 
     #cmd.mset("1 x%i" % ftot)
 
 
     #cmd.mset("1 x50 1 -30 30 x20")
 
     #cmd.mset("1 x50 1 -30 30 x20")
 
 
     cmd.mset( setcommand )
 
     cmd.mset( setcommand )
 
 
  
 
     #loop through views
 
     #loop through views
 
 
     start_view = views[0][:]
 
     start_view = views[0][:]
 
 
     i = 0
 
     i = 0
 
 
     first_frame = 1
 
     first_frame = 1
 
 
     for view in views[1:]:
 
     for view in views[1:]:
 
 
         end_view = view[:]
 
         end_view = view[:]
 
+
        if settings.has_key(i):
if settings.has_key(i):
+
            movs.animate_transition( start_view, end_view, frames[i], first_frame, settings[i] )
 
+
        elif fades.has_key(i):
    movs.animate_transition( start_view, end_view, frames[i], first_frame, settings[i] )
+
            movs.animate_transition( start_view, end_view, frames[i], first_frame, fades[i] )
 
+
        else:
elif fades.has_key(i):
 
 
 
    movs.animate_transition( start_view, end_view, frames[i], first_frame, fades[i] )
 
 
 
else:
 
 
 
 
             movs.animate_transition( start_view, end_view, frames[i], first_frame )
 
             movs.animate_transition( start_view, end_view, frames[i], first_frame )
 
 
         #add an action
 
         #add an action
 
 
         if actions.has_key(i):
 
         if actions.has_key(i):
 
 
             mdo_cmd = actions[i]#+";set_view ("+str( views[i] )+")"
 
             mdo_cmd = actions[i]#+";set_view ("+str( views[i] )+")"
 
 
             print mdo_cmd
 
             print mdo_cmd
 
 
             cmd.mdo(first_frame, mdo_cmd)
 
             cmd.mdo(first_frame, mdo_cmd)
 
 
         first_frame += frames[i]
 
         first_frame += frames[i]
 
 
         i += 1
 
         i += 1
 
 
         start_view = end_view[:]
 
         start_view = end_view[:]
 
 
     cmd.frame(1)
 
     cmd.frame(1)
 
 
  
 
## views = readViews( "viewfile.txt" )
 
## views = readViews( "viewfile.txt" )
 
 
## frames = readFrames( "viewfile.frm" )
 
## frames = readFrames( "viewfile.frm" )
 
 
## actions = readActions( "viewfile.act" )
 
## actions = readActions( "viewfile.act" )
 
 
##print "Length ",len(views)
 
##print "Length ",len(views)
 
 
#for v in views:
 
#for v in views:
 
 
  #  print v
 
  #  print v
 
 
#cur_view = views[0]
 
#cur_view = views[0]
 
 
views = []
 
views = []
 
 
frames = []
 
frames = []
 
 
models = {}
 
models = {}
 
 
actions = {}
 
actions = {}
 
 
scenes = {}
 
scenes = {}
 
 
settings = {}
 
settings = {}
 
 
fades = {}
 
fades = {}
 
 
scene_counter = 0
 
scene_counter = 0
 
 
cur_index = -1
 
cur_index = -1
 
 
cmd.set( "scene_animation_duration","0" )
 
cmd.set( "scene_animation_duration","0" )
 
 
#cmd.set_view( cur_view )
 
#cmd.set_view( cur_view )
 
 
  
 
cmd.extend("sn", show_next )
 
cmd.extend("sn", show_next )
 
 
cmd.extend("sp", show_prev )
 
cmd.extend("sp", show_prev )
 
 
cmd.extend("sc", show_cur )
 
cmd.extend("sc", show_cur )
 
 
cmd.extend("sinsert", insert_current )
 
cmd.extend("sinsert", insert_current )
 
 
cmd.extend("sdelete", delete_current )
 
cmd.extend("sdelete", delete_current )
 
 
cmd.extend("sreplace", replace_current )
 
cmd.extend("sreplace", replace_current )
 
 
cmd.extend("sappend", append_view )
 
cmd.extend("sappend", append_view )
 
 
cmd.extend("sscene", insert_scene )
 
cmd.extend("sscene", insert_scene )
 
 
cmd.extend("sgo", go_to_view )
 
cmd.extend("sgo", go_to_view )
 
 
cmd.extend("sreadold", read_all )
 
cmd.extend("sreadold", read_all )
 
 
cmd.extend("swriteold", write_views )
 
cmd.extend("swriteold", write_views )
 
 
cmd.extend("slist", list_frames )
 
cmd.extend("slist", list_frames )
 
 
cmd.extend("ssetf", set_frames_current )
 
cmd.extend("ssetf", set_frames_current )
 
 
cmd.extend("sshow", show_transition )
 
cmd.extend("sshow", show_transition )
 
 
cmd.extend("srecord", make_all )
 
cmd.extend("srecord", make_all )
 
 
cmd.extend("saction", add_action_current )
 
cmd.extend("saction", add_action_current )
 
 
cmd.extend("sdelaction", clear_action_current )
 
cmd.extend("sdelaction", clear_action_current )
 
 
cmd.extend("sdumpactions", list_actions )
 
cmd.extend("sdumpactions", list_actions )
 
 
cmd.extend("sappendaction", append_action_current )
 
cmd.extend("sappendaction", append_action_current )
 
 
cmd.extend("smorph", morph_models )
 
cmd.extend("smorph", morph_models )
 
 
cmd.extend("sinterpsetting", interpolate_settings )
 
cmd.extend("sinterpsetting", interpolate_settings )
 
 
cmd.extend("sdeletesetting", delete_settings )
 
cmd.extend("sdeletesetting", delete_settings )
 
 
cmd.extend("scrossfade", crossfade )
 
cmd.extend("scrossfade", crossfade )
 
 
cmd.extend("swrite", writeKeyViewFile )
 
cmd.extend("swrite", writeKeyViewFile )
 
 
cmd.extend("sread", readKeyViewFile )
 
cmd.extend("sread", readKeyViewFile )
 
 
cmd.extend("ssetupview", setup_view )
 
cmd.extend("ssetupview", setup_view )
 
 
 
</source>
 
</source>

Revision as of 05:07, 31 December 2006

Manual for Slerpy.py

An extension to pymol that creates a moderately easy to use environment for doing keyframe animation.


General Use

At the pymol command line type:

import slerpy

This will load the extended commands. All commands in slerpy begin with the letter s. Pymol's tab autocomplete feature will work on the additional commands.

Important concepts

The main function of slerpy is to record a series of pymol views. A movie can then be created by interpolating between these views. A pymol view consists mostly of the camera orientation (that is, the orientation of the viewers eye with respect to the molecule). It also includes information about the clipping planes.

It is important to realize that most slerpy commands act on the "current" view. You can navigate among views by using the sn, sp, and sgo commands. If you've changed the view around with the mouse or you just want to know the number of the current view you can get back to the current view with the sc command.

Pymol views do not contain information about how pymol objects and selections are displayed. If you just want to create a movie which moves around a single representation of a molecule then all you need to do is record the set of views that define the tour of the molecule.

If, on the other hand, you want to change the representation or change which items are displayed you will need to add actions to some of your views. An action is any set of pymol commands. Actions can be associated with any view in the series recorded by slerpy. The sscene command inserts a new view and simultaneously creates a pymol scene and the action to display it. The scene will include all of the objects and representations visible at the time the command was issued.

In order to control the rate of motion between the defined views in a slerpy movie, you can control the number of frames used in each interpolation. When a view is saved in slerpy it is associated by default with a transition of 50 frames to the next view. The number of frames in the transition can be altered with the ssetf command in slerpy.

The views and actions stored by slerpy can (and should) be saved to a key file with the swrite command. They can then be retrieved with the sread command. Note that swrite saves the current pymol state in a .pse file but sread does not read in the .pse file. If you're starting a new pymol session to continue work on an existing movie you should load the pse file before doing an sread.

Quick Start Tutorial

Step 1
You probably want to start off in a nice clean working directory that just has the coordinate files you want to work with.
Step 2
Read in your molecule(s) and create the various selections and representations that you want to include in the movie.
Step 3
At the pymol prompt, type:
import slerpy
Step 4
Get your molecule in exactly the orientation and representation that you want to use for the beginning of your movie.
Step 5
Type:
sinsert
Step 6
Using the mouse, move your molecule to the next orientation that you want to use. When you record the movie, the camera orientation will be interpolated between each consecutive pair of views. This can include changes in rotation, zooming, clipping etc.
Loop back to Step 5. Continue this until you've got all your orientations stored.
You can check how any set of transitions will look at any time by using the sshow command (see command ref for details).
You can adjust the rate of any transition using the ssetf command
Step 7A
Add any actions to your views using the saction command. Any number of pymol commands can be strung together separated by semicolons. If, for example, you want to change your protein from a cartoon to a surface and add a ligand when you get to view 5 you would do the following (assuming you've defined the pymol selections prot and lig):
sgo 5
saction "hide cartoon, prot; show surface, prot; show sticks, lig"
Step 7B (Alternative using scenes)
sgo 5
Now use the gui to create the representation you want and then:
sscene
Step 8
Save everything. Save your slerpy views and actions as well as a pse file of your current pymol session:
swrite mymovie

This will create mymovie.key, which has all of the views, frame counts, actions etc. and mymovie.pse, the associated pymol session file.

Step 9
Record the movie! Type:
srecord
You can then play the movie by typing the standard pymol command mplay or by clicking the play button in pymol.
Step 10
If you save the pymol session again, the pse file will contain the movie which can then be shown immediately after startup without running slerpy.py. Note that pymol will warn you when you load a pse file that contains a movie.
Step 11
If you want to, the movie can be exported using the mpng command (see the pymol documentation).

Tips and Tricks

Converting scenes to movies:

You can just step through the scenes and type sscene for each one. This will create a duplicate slerpy scene for each of the scenes you'd already saved but that's not such a disaster. Be sure to swrite when your done.

Note that there is some overhead associated with recalling scenes. To avoid pauses at view transitions, I prefer to actually issue the set of show and hide commands that will generate the scene rather than using the above method.

Starting off right:

It's a bit of a pain, but I like to associate with the first frame of the movie an action list that hides everything and then turns on all the objects that I want to have visible at the beginning. This ensures that when your movie loops back to the beginning it will look the same as it did the first time through. For example:

sgo 0
saction "hide everything; show lines, prot; show surface, activesite; show sticks, ligand"

Alternatively, start your slerpy work with an sscene.

Be sure to run your movie once it's been opened and before your presentation if you're presenting in pymol. This will ensure that any objects that don't appear until the middle of the movie are available in memory and won't need to be rebuilt while your audience waits.

Pausing on a view:

Just sgo to the view you want to stay on for a while and do an sinsert. This will insert a new view with the same orientation etc as the one you were just on. You can adjust the length of the pause by changing the number of frames for the transistion between these two identical views using the ssetf command.

Command Reference

Note that it is essential to understand that slerpy uses the concept of a current or active view. This is the element in the list to which most commands are applied. It is not necessarily the view that is currently visible on the screen. It is advisable to use the sc command frequently to make sure you really know which view your command is being applied to.

saction string: Assoiciates the pymol commands in string with the current view. string must be enclosed in quotes and must contain only valid pymol commands separated by semicolons.

sappend: Add the currently displayed view at the end of the list of views in slerpy

sappendaction string: Adds the action(s) in string to the list of actions associated with the current view

sc: Go to the slerpy active view

scrossfade startobject, endobject: During the transition from the current view to the next view startobject will fade out and endobject will fade in. The two objects must be shown as sticks. They must be objects, not merely selections, as of pymol 0.99.

sdelaction: Deletes the action associated with the current view. Be sure you're sure which view you're on before you use this. This will also delete any actions etc. associated with the view so be careful.

sdelete: Remove the slerpy active view from the list of views to be interpolated.

sdeletesetting: Remove the setting interpolation for the current view.

sdumpactions: List all actions by frame.

sgo n: Change the slerpy active view to view n.

sinsert: Add the currently displayed view after the slerpy active view.

sinterpsetting setting, selection, startval, endval : The pymol setting setting will be interpolated linearly from startval to endval during the transition from the current view to the next view. You can only interpolate one setting per transition. This is the hard way to, for example, fade out an object:

sinterpsetting stick_transparency, lig, 0.0, 1.0

slist: List all views stored for interpolation. Also lists the number of frames in each transition.

smorph startmodel,endmodel: The transition from the current frame to the next frame will consist of one frame per pymol state starting with state startmodel and ending with state endmodel. Subsequent frames (i.e. from subsequent views) will revert to state 1. The state numbers apply to currently visible objects so you will most likely want to have an object with your starting conformation, an object with your multi-state morphing model, and an object with your final conformation. You would then sgo to the frame where you want the morph to start and add an action to hide the starting conformation object and show the multi-model morphing object, do an smorph 1,30 or whatever the number of states in your morph is, append another frame and give it an action where the multi-state model is hidden and the final conformation is shown.

sn: Go to the next view

sp: Go to the previous view.

sread filename: Restore all the information written with swrite. Does not read in the pse file (to avoid inadvertantly writing over some new selections, scenes or whatever).

srecord: Records the movie

sreplace: Replace the slerpy current view with the currently displayed view.

sscene: Add a the currently displayed view after the slerpy active view and create a scene to go with it. The current pymol state, including which objects are displayed and how they are shown will therefor be captured.

ssetf: Set the number of frames to use in the transition from the slerpy active view to the next view

ssetupview n: This attempts to make sure that all objects are displayed (or not) as they would be when view n is arrived at in the movie. It goes through and executes all of the sactions from all preceeding views. For some reason this doesn't always work in complex cases.

sshow n,m: This command records and shows a segment of the movie showing the transitions starting with view n and ending with view m. If the arguments m and n are omitted the transition from the current view to the next view will be shown.

sdumpactions: Lists all of the currently assigned actions and their view numbers. Note that this list is a python dictionary and is therefore not in any particular order.

swrite filename: Writes all the information used by slerpy to a file filename.key. It also writes a pymol session file filename.pse containing all of your current objects, selections etc. The format of the .key file is supposed to be human readable and it can be convenient to edit this file rather than using saction over and over. After editing it by hand besure to do an sread.

Script Files

  • slerpy.py
    The command definitions for slerpy
#movs.py - Math and animation routines for slerpy
#Copyright (C) 2006 Joel Bard

#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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
from pymol import cmd
import movs

def readViews( filename ):
    vfile = open( filename, 'r')
    views = [] #a list of views each of which is a list of 18 numbers
    vstrings = vfile.readlines()
    for vstring in vstrings:
        vals = vstring.split()
        view = [float(v) for v in vals]
        views.append( view )
    vfile.close()
    return views

def readFrames( filename ):
    ffile = open( filename, 'r' )
    frames = []
    fstrings = ffile.readlines()
    for fstring in fstrings:
        frames.append( int(fstring) )
    ffile.close()
    return frames

def readActions( filename ):
    #actions are stored in file where
    #for each line, the first 4 chars are the view index
    #associated with the action and the rest of the
    #line is the pymol command to be executed
    #upon reading, a dictionary is returned
    #with view indices as keys and actions as values
    actions = {}
    try:
        afile = open( filename, 'r' )
    except:
        print "No actions for this project"
        return actions
    astrings = afile.readlines()
    for astring in astrings:
        try:
            aindex = int(astring[:4])
            action = astring[4:]
            actions[ aindex ] = action[:-1]
        except:
            print "empty line"
    afile.close()
    return actions

def readModels( filename ):
    models = {}
    try:
        mfile = open( filename, 'r' )
    except:
        print "No models for this project"
        return models
    mstrings = mfile.readlines()
    for mstring in mstrings:
        try:
            mindex = int(mstring[:4])
            model = mstring[4:]
            models[ mindex ] = model[:-1]
        except:
            print "empty line"
    mfile.close()
    return models

def readSettings( filename ):
    settings = {}
    try:
        sfile = open( filename, 'r' )
    except:
        print "No settings for this project"
        return settings
    sstrings = sfile.readlines()
    for sstring in sstrings:
        try:
            sindex = int(sstring[:4])
            scommas = sstring[4:]
            settingName,selection,startVal,endVal = scommas.split(',')
            setting = [settingName,selection,float(startVal),float(endVal)]
            settings[sindex] = setting
        except:
            print "unable to parse setting"
    sfile.close()
    return settings
            
def readScenes( filename ):
    global scene_counter

    scene_counter = 0
    scenes = {}
    try:
        sfile = open( filename, 'r' )
    except:
        print "No scenes file for this project"
        return scenes
    sstrings = sfile.readlines()
    for sstring in sstrings:
        try:
            sindex = int(sstring[:4])
            scene = sstring[4:]
            scenes[ sindex ] = scene[:-1]
            scene_counter += 1
            #print "reading scene", sstring, sindex, scene
        except:
            print "empty line"
    sfile.close()
    return scenes

def read_all( fileroot ):
    global views
    global frames
    global actions
    global cur_view
    global cur_index
    global scenes
    global models
    global settings
    
    views = readViews( fileroot+".txt" )
    frames = readFrames( fileroot+".frm")
    actions = readActions( fileroot+".act")
    scenes = readScenes( fileroot+".scn")
    models = readModels( fileroot+".mod")
    settings = readSettings( fileroot+".set")
    cur_view = views[0]
    cur_index = 0
    show_cur()
    
def print_view( view ):
    for i in range(0,6):
        for j in range(0,3):
            print "%12.6f"% view[ 3*i+j ] ,
        print

def show_next():
    global cur_index
    global cur_view
    global views
    if( cur_index == len( views )-1 ):
        print "No more views."
        return
    cur_index += 1
    cur_view = views[ cur_index ]
    cmd.set_view(cur_view)
    print "Matrix: "
    print_view( cur_view )
    print "Showing view number ",cur_index

def show_prev():
    global cur_index
    global cur_view
    global views
    if( cur_index == 0 ):
        print "No more views."
        return
    cur_index -= 1
    cur_view = views[ cur_index ]
    cmd.set_view(cur_view)
    print "Matrix: "
    print_view( cur_view )
    print "Showing view number ",cur_index

def show_cur():
    global cur_index
    global cur_view
    global views
    cur_view = views[ cur_index ]
    cmd.set_view(cur_view)
    print "Matrix: "
    print_view( cur_view )
    print "Showing view number ",cur_index

def go_to_view( arg=0 ):
    global cur_index
    global cur_view
    global views
    n = int( arg )
    if n < 0 or n > len(views)-1:
        print "Index out of range."
        return
    cur_index = n
    cur_view = views[n]
    cmd.set_view( cur_view )
    print "Matrix: "
    print_view( cur_view )
    print "Showing view number ", cur_index

def insert_current():
    #insert the current view into the list after the view
    #in views[cur_index]
    #set frames to default
    global cur_index
    global cur_view
    global views
    global frames
    global actions
    global scenes
    global settings
    global models
    global fades
    
    cur_index += 1
    cur_view = cmd.get_view()
    views.insert( cur_index, [cv for cv in cur_view] )
    frames.insert( cur_index, 50 )
    
    #deal with actions dictionary
    actions = incKeyAbove( actions, cur_index )
    scenes = incKeyAbove( scenes, cur_index )
    settings = incKeyAbove( settings, cur_index )
    models = incKeyAbove( models, cur_index )
    fades = incKeyAbove( fades, cur_index )

    print "New view:"
    print_view( cur_view )
    print "Inserted view at with index", cur_index, "and a 50 frame transition"

def append_view():
    global views
    global frames
    global cur_index
    global cur_view

    cur_index = len(views)
    cur_view = cmd.get_view()
    views.append( [cv for cv in cur_view] )
    frames.append( 50 )

    print "New view: "
    print_view( cur_view )
    print "Appended view with index", cur_index, "and a 50 frame transition"
    print "The current view is", cur_index
    
def incKeyAbove( dict, index ):
    tempDict = {}
    for key, val in dict.iteritems():
        if key >= index:
            newkey = key + 1
            tempDict[newkey] = val
        else:
            tempDict[key] = val
    return tempDict

def decKeyAbove( dict, index ):
    tempDict = {}
    for key, val in dict.iteritems():
        if key > index:
            newkey = key - 1
            tempDict[newkey] = val
        else:
            tempDict[key] = val
    return tempDict
    
def delete_current():
    #remove the current view from the list
    #show the previous view
    global cur_index
    global cur_view
    global views
    global actions
    global scenes
    global settings
    global models
    global frames
    global fades
    
    del views[cur_index]
    del frames[cur_index]
    if actions.has_key( cur_index ):
        del actions[cur_index]
    if scenes.has_key( cur_index ):
        del scenes[cur_index]
    if settings.has_key( cur_index ):
        del settings[cur_index]
        
    #deal with dictionaries
    actions = decKeyAbove( actions, cur_index )
    scenes = decKeyAbove( scenes, cur_index )
    settings = decKeyAbove( settings, cur_index )
    models = decKeyAbove( models, cur_index )                               
    fades = decKeyAbove( fades, cur_index )

    print "View number",cur_index,"deleted."
    if cur_index > 0:
        cur_index -= 1
    cur_view = views[cur_index]
    cmd.set_view( cur_view )
    print "Current view is number",cur_index

def delete_settings():
    global settings
    global cur_index
    del settings[cur_index]

def replace_current():
    global cur_index
    global cur_view
    global views
    cur_view = cmd.get_view()
    views[cur_index] = [cv for cv in cur_view]

def insert_scene():
    global views
    global actions
    global settings
    global frames
    global cur_index
    global cur_view
    global scenes
    global scene_counter
    global models
    global fades
 
    cur_index += 1
    cur_view = cmd.get_view()
    views.insert( cur_index, [cv for cv in cur_view] )
    frames.insert( cur_index, 50 )
    #TODO record scene with indexed name (global scene index?)
    #Save the pse file on swrite
    #We'll also need to maintain our own list of scenes as a dict

    
    #deal with dictionaries
    actions = incKeyAbove( actions, cur_index )
    scenes = incKeyAbove( scenes, cur_index )
    settings = incKeyAbove( settings, cur_index )
    models = incKeyAbove( models, cur_index )
    fades = incKeyAbove( fades, cur_index )

    #this stuff has to be done after the above
    #find a free scene name
    i = 1
    found = 1
    while found == 1:
        found = 0
        for sname in scenes.values():
            print "|"+sname+"|"
            if sname == "slerpy_"+str(i):
                found = 1
                break
        if found == 1:
            i += 1
        else:
            break
    newname = "slerpy_"+str(i)
        
    scene_counter += 1
    cmd.scene( newname, "store" )
    scenes[ cur_index ] = newname
    actions[ cur_index ] = "scene "+newname
    
    print "New view:"
    print_view( cur_view )
    print "Inserted view at with index", cur_index, "and a 50 frame transition"
    print "Added scene",newname
    
def write_views( filename ):
    global views
    global frames
    global scenes
    global actions
    global settings
    global models
    global fades

    viewfile = open( filename+".txt", 'w')
    for view in views:
        for v in view:
            viewfile.write( str(v) + " " )
        viewfile.write('\n')
    viewfile.close()
    
    framefile = open( filename+".frm", 'w' )
    for frame in frames:
        framefile.write( str( frame )+'\n' )
    framefile.close()

    actionfile = open( filename+".act", 'w' )
    for key,action in actions.iteritems():
        keystring = str( key )
        actionfile.write( keystring.rjust(4)+action + '\n' )
    actionfile.close()

    scenefile = open( filename+".scn", 'w' )
    for key,scene in scenes.iteritems():
        keystring = str( key )
        scenefile.write( keystring.rjust(4)+scene + '\n' )
    scenefile.close()

    modelfile = open( filename+".mod", 'w' )
    for key,model in models.iteritems():
        keystring = str( key )
        modelfile.write( keystring.rjust(4)+model + '\n' )
    modelfile.close()

    settingsfile = open( filename+".set", 'w' )
    for key,setting in settings.iteritems():
        keystring = str( key )
        settingName, selection, startVal, endVal = setting
        settingsfile.write( "%s%s,%s,%f,%f\n" % (keystring.rjust(4), settingName, selection, startVal, endVal))
    settingsfile.close()
    cmd.save( filename+".pse" )
        
    print "Wrote files", filename+".txt,",filename+".frm,",filename+".pse, and",filename+".act"

def writeKeyViewFile( filename ):
    global views
    global frames
    global scenes
    global actions
    global settings
    global models
    global fades
 
    keyviewfile = open( filename + ".key", 'w' )
    i=0
    for view in views:
        keyviewfile.write( "VIEW: %4d " % i )
        for v in view:
            keyviewfile.write( str(v) + " " )
        keyviewfile.write('\n')
        keyviewfile.write( "FRAMES: %d\n" % frames[i] )
        if actions.has_key( i ):
            keyviewfile.write( "ACTIONS: %s\n" % actions[i] )
        if scenes.has_key( i ):
            keyviewfile.write( "SCENES: %s\n" % scenes[i] )
        if models.has_key( i ):
            keyviewfile.write( "MODELS: %s\n" % models[i] )
        if settings.has_key( i ):
            settingName, selection, startVal, endVal = settings[i]
            keyviewfile.write( "SETTINGS: %s, %s, %f, %f\n" % (settingName, selection, startVal, endVal))
        if fades.has_key( i ):
            startVisSelection, endVisSelection, sticksOnly = fades[i]
            keyviewfile.write( "FADES: %s, %s, %d\n" % (startVisSelection, endVisSelection, sticksOnly))            
        i += 1
        keyviewfile.write("\n")
    keyviewfile.close()
    cmd.save( filename + ".pse" )
    print "Wrote files " , filename + ".key", filename + ".pse"

def readKeyViewFile( filename ):
    global views
    global frames
    global scenes
    global actions
    global settings
    global models
    global fades
    global scene_counter

    views = []
    frames = []
    actions = {}
    scenes = {}
    models = {}
    settings = {}
    fades = {}
    scene_counter = 0
                                                                                                                  
    keyviewfile = open( filename + ".key", 'r' )
    viewstrings = keyviewfile.readlines()
    keyviewfile.close()
    viewindex = 0
    for line in viewstrings:
        if line.startswith("VIEW: "):
            viewindex = int( line[6:10] )
            vals = line[10:].split()
            view = [float(v) for v in vals]
            views.append( view )
        if line.startswith("FRAMES: "):
            frames.append( int( line[8:] ) )
        if line.startswith("ACTIONS: "):
            actions[ viewindex ] = line[9:-1]
        if line.startswith("SCENES: "):
            scenes[ viewindex ] = line[8:-1]
            scene_counter += 1
        if line.startswith("MODELS: "):
            models[ viewindex ] = line[8:-1]
        if line.startswith("SETTINGS: "):
            settingName,selection,startVal,endVal = line[10:-1].split(',')
            settings[ viewindex ] = [settingName,selection,float(startVal),float(endVal)]
        if line.startswith( "FADES: " ):
            startVisSelection, endVisSelection, sticksOnly = line[7:-1].split(',')
            fades[ viewindex ] = [startVisSelection, endVisSelection, int(sticksOnly) ]
    cur_view = views[0]
    cur_index = 0
    show_cur()

def set_frames_current( arg=50 ):
    global frames
    global cur_index
    frames[cur_index] = int(arg)

def list_frames():
    global frames
    global views
    global actions
    global models
    global settings
    
    i=0
    f=0
    for view in views[:-1]:
        if actions.has_key( i ):
            a = actions[i]
        else:
            a = ""
        if models.has_key( i ):
            m = "States: " + models[i]
        else:
            m = ""
        if settings.has_key( i ):
            settingName, selection, startVal, endVal = settings[i]
            s = "Settings: %s %s %f %f" % (settingName, selection, startVal, endVal)
        else:
            s = ""
        print "View",i,"to",i+1,"Frames ",f,"to",f+frames[i],a,m,s
        f += frames[i]
        i += 1

def add_action_current( cmd ):
    global cur_index
    global actions
    actions[cur_index] = cmd[1:-1] #strip off quotes

def append_action_current( cmd ):
    global cur_index
    global actions
    actions[cur_index] += ";" + cmd[1:-1]

def clear_action_current():
    global actions
    global cur_index
    del actions[cur_index]

def list_actions():
    global actions
    for i,a in actions.iteritems():
        print i,a

def morph_models( start_model, end_model ):
    global cur_index
    global frames
    global models
    models[cur_index] = "%s -%s" % (start_model, end_model)
    frames[cur_index] = abs(int(end_model) - int(start_model)) + 1

def interpolate_settings( setting, selection, startval, endval ):
    global cur_index
    global settings
    settingEntry = [setting, selection, float(startval), float(endval)]
    settings[cur_index] = settingEntry 

def crossfade( startVisSelection, endVisSelection, sticksOnly = 1 ):
#cross fade the specified objects, vary stick transparency only if stickOnly=1
    global cur_index
    global fades
    fades[cur_index] = [startVisSelection, endVisSelection, int(sticksOnly) ]

def setup_view( index ):
    for i in range( 0, int(index)+1 ):
        if actions.has_key(i):
            print "Executing %s from actions %d" % (actions[i],i)
            cmd.do( actions[i] )
        if settings.has_key(i):
            settingName, selection, startVal, endVal = settings[i]
            action = "set %s, %f, %s;" % (settingName, endVal, selection)
            print "Executing %s from settings %d" % (action,i)
            cmd.do( action )
        if fades.has_key(i):
            startVisSelection, endVisSelection, sticksOnly = fades[i]
            action = "set stick_transparency, 0, %s; set stick_transparency, 1, %s;" % (endVisSelection, startVisSelection)
            print "Executing %s from fades %d" % (action, i)
            cmd.do( action )

def show_transition(start_index=0, end_index=0):
    #show the transition from the current view to the next view
    global frames
    global views
    global cur_index
    global actions
    global models
    if( start_index == 0 and end_index == 0 ):
        if cur_index >= len(views)-1:
            print "Current view is last in sequence."
            return
        start_index=cur_index
        end_index=cur_index+1
    else:
        start_index = int(start_index)
        end_index = int(end_index)
    ftot = 0
    setcommand = ""
    i = start_index
    for nframes in frames[start_index:end_index]:
        #ftot += nframes
        if models.has_key(i):
            setcommand += " " + models[i] + " "
        else:
            setcommand += " 1 x%i" % nframes
        i += 1
        
#    cmd.mset("1 x%i" % ftot)
    cmd.mset( setcommand )
    start_frame = 1
    #first do all actions that happen up to this point to make sure
    #things look the way they should
    first_action = ""
    for i in range( 0, start_index ):
        if actions.has_key(i):
            first_action += actions[i] + ';'
            #print "Executing %s from actions %d" % (actions[i],i)
            #cmd.do( actions[i] )
        if settings.has_key(i):
            settingName, selection, startVal, endVal = settings[i]
            action = "set %s, %f, %s;" % (settingName, endVal, selection)
            first_action += action
            #print "Executing %s from settings %d" % (action,i)
            #cmd.do( action )
        if fades.has_key(i):
            startVisSelection, endVisSelection, sticksOnly = fades[i]
            action = "set stick_transparency, 0, %s; set stick_transparency, 1, %s;" % (endVisSelection, startVisSelection)
            first_action += action
            #print "Executing %s from fades %d" % (action, i)
            #cmd.do( action )
    for i in range( start_index, end_index ):
        if settings.has_key(i):
            movs.animate_transition( views[i], views[i+1], frames[i], start_frame, settings[i] )
        elif fades.has_key(i):
            movs.animate_transition( views[i], views[i+1], frames[i], start_frame, fades[i] )
        else:
            movs.animate_transition( views[i], views[i+1], frames[i], start_frame )
        #add an action
        if start_frame == 1:
            mdo_cmd = first_action
            if actions.has_key(i):
                mdo_cmd += actions[i]+";"
            mdo_cmd += "set_view("+str(views[i])+")"
            print mdo_cmd
            cmd.mdo(start_frame, mdo_cmd)
        elif actions.has_key(i):
            mdo_cmd = actions[i]+";set_view("+str(views[i])+")"
            cmd.mdo(start_frame, mdo_cmd)
            #print mdo_cmd
        start_frame += frames[i]
    cmd.frame(1)
    cmd.mplay()

def make_all():
    #make the whole movie
    global views
    global frames
    global models
    
    #first get total number of frames
    ftot = 0
    i = 0
    setcommand = ""
    for nframes in frames[:-1]:
        ftot += nframes
        if models.has_key(i):
                            setcommand += " " + models[i] + " "
        else:
            setcommand += " 1 x%i" % nframes
        i += 1

    #initialize movie
    #cmd.mset("1 x%i" % ftot)
    #cmd.mset("1 x50 1 -30 30 x20")
    cmd.mset( setcommand )

    #loop through views
    start_view = views[0][:]
    i = 0
    first_frame = 1
    for view in views[1:]:
        end_view = view[:]
        if settings.has_key(i):
            movs.animate_transition( start_view, end_view, frames[i], first_frame, settings[i] )
        elif fades.has_key(i):
            movs.animate_transition( start_view, end_view, frames[i], first_frame, fades[i] )
        else:
            movs.animate_transition( start_view, end_view, frames[i], first_frame )
        #add an action
        if actions.has_key(i):
            mdo_cmd = actions[i]#+";set_view ("+str( views[i] )+")"
            print mdo_cmd
            cmd.mdo(first_frame, mdo_cmd)
        first_frame += frames[i]
        i += 1
        start_view = end_view[:]
    cmd.frame(1)

## views = readViews( "viewfile.txt" )
## frames = readFrames( "viewfile.frm" )
## actions = readActions( "viewfile.act" )
##print "Length ",len(views)
#for v in views:
 #   print v
#cur_view = views[0]
views = []
frames = []
models = {}
actions = {}
scenes = {}
settings = {}
fades = {}
scene_counter = 0
cur_index = -1
cmd.set( "scene_animation_duration","0" )
#cmd.set_view( cur_view )

cmd.extend("sn", show_next )
cmd.extend("sp", show_prev )
cmd.extend("sc", show_cur )
cmd.extend("sinsert", insert_current )
cmd.extend("sdelete", delete_current )
cmd.extend("sreplace", replace_current )
cmd.extend("sappend", append_view )
cmd.extend("sscene", insert_scene )
cmd.extend("sgo", go_to_view )
cmd.extend("sreadold", read_all )
cmd.extend("swriteold", write_views )
cmd.extend("slist", list_frames )
cmd.extend("ssetf", set_frames_current )
cmd.extend("sshow", show_transition )
cmd.extend("srecord", make_all )
cmd.extend("saction", add_action_current )
cmd.extend("sdelaction", clear_action_current )
cmd.extend("sdumpactions", list_actions )
cmd.extend("sappendaction", append_action_current )
cmd.extend("smorph", morph_models )
cmd.extend("sinterpsetting", interpolate_settings )
cmd.extend("sdeletesetting", delete_settings )
cmd.extend("scrossfade", crossfade )
cmd.extend("swrite", writeKeyViewFile )
cmd.extend("sread", readKeyViewFile )
cmd.extend("ssetupview", setup_view )