[Paraview] Re: StateLoader, second attempt

Fabian Braennstroem f.braennstroem at gmx.de
Sat Sep 15 12:44:30 EDT 2007


Hi Robert,

do you have a small hint, how I can run it ... my attempts
did not work!?

Regards!
Fabian

Robert Maynard schrieb am 09/04/2007 08:58 PM:
> The previous version of the state loader script I released previously was
> designed around the old python wrappings. With the new and improved
> servermanager wrappings released, I decided to update the script to handle
> the better way of doing things. The biggest improvement was the total
> removal of all eval commands from the script, which makes me allot happier.
> 
> Even if you don't really need the script, it should provide a decent
> overview of the numerous new commands, and style of the servermanager
> wrappings.
> 
> #!/usr/bin/env python
> 
>>from paraview.servermanager import *
> import cPickle as pickle
> 
> class State:
>   '''Allows the user to save states, which is all the display properties for
> each Pipeline object and camera. After saving
>   states you can than load them back up, reverting all the object and camera
> properties to what they where
>   on saving. The set of views can also be saved to a file by using pickle so
> that you can build up multiple viewStates
>   and than display them at a latter time
> 
>   Currently Supports:
>     saving a state by calling
>       addView(statename) statename can be numeric / string
> 
>     Loading a state:
>       loadView(statename) will load the respective state. If nothing changes
>       click on the render window of paraview, that should fix the render
> display.
> 
>     Extra Commands:
>       deleteView(name), will delete the view
>       deleteAllViews, will clear the view list
>       renameView(oldName, newName), renames the view currently called
> oldName, to newName
>       containsView(name), Will tell you if the name is already being used by
> a view
>       listViews(), Will list all the names of the views currently made
>       debugView(name), Will dump the properties of the view, for testing
> 
>     Pickle Saving all States:
>       saveState(filepath+filename) will pickle all the states so that you
> can load them up at a different time
> 
>       loadState(filepath+filename) will unpickle all the states so that you
> can run previously generated states
> 
>     Bug:
>       Currently items added after a view is stored are not turned off/on
> when loading view that do not effect
>       that item. This may or may not be helpfull to you
> 
> 
>   '''
>   def __init__(self):
>     #storage for a list of view objects
>     self.view = list()
>     self.proxies  = {1:'representations',2:'sources', 3:'views'}
> 
>   def loadState(self,file):
>     '''loads a pickle view file, the passed in value needs
>     to be a string that is the path to the pickled view'''
>     #loads a State file
>     try:
>       #open an ascii pickle file
>       self.view = pickle.load(open(file))
>     except IOError:
>       print "file not found"
> 
>   def saveState(self,file):
>     '''save the current view collection as a ascii pickle'''
>     pickle.dump(self.view,open(file,'w'))
> 
>   def deleteView(self,name):
>     '''deletes the first occurance of a name from the view list'''
>     for item in self.view:
>       if (item.name == name):
>         del item
>         return True
>     return False
> 
>   def deleteAllViews(self):
>     '''deletes all views from the list'''
>     del self.view
>     self.view = list()
> 
>   def renameView(self,oldName, newName):
>     '''rename a view with a new name'''
>     for item in self.view:
>       if (item.name == oldName):
>         item.name = newName
>         return True
>     return False
> 
>   def containsView(self,name):
>     '''checks to see if a view with the name already exists'''
>     return (name in self.view)
> 
>   def debugView(self, name):
>     '''debug print the view'''
>     for item in self.view:
>       print item.items
>       print " ------- "
> 
>   def listViews(self):
>     '''lists all the views sorted by name'''
>     viewNames = list()
>     for item in self.view:
>       if ( (item.name in viewNames)==False):
>         viewNames.append(item.name)
>     #collect all the views and than sort them
>     viewNames.sort()
>     #display all the names
>     for name in viewNames:
>       print name
> 
>   def loadView(self,name):
>     '''loads a select view that has already be saved.
>        ex: state.loadView(1)'''
>     for v in self.view:
>       if (v.name == name):
>         self.__load(v.proxy, v.items)
> 
>   def addView(self,name):
>     '''adds the current state of all items in paraview + cameras as a view.
>     loading this view will restore all the saved items to the current state
>     ex: state.addView(1)'''
>     for key in self.proxies.keys():
>       newView = view(name, key, self.__getProperties(key))
>       self.view.append(newView)
> 
>   def __load(self, proxyKey, items):
>     #load the current view object
>     proxy = self.__getProxiesInGroup(self.proxies[proxyKey])
> 
>     #reconstruct all the properties.
>     if (proxyKey == 1):
>       sources = self.__buildSourceNames(proxy)
>       for sourceName,disp in zip(sources,proxy):
>         for i in items:
>           if (i[0] == sourceName):
>             self.__reconstructDisplay(proxy, disp,
> i[1])
>     else:
>       for name in proxy:
>         for i in items:
>           if (i[0] == name):
>             self.__reconstructDisplay(proxy, name, i[1])
>             if (proxyKey == 3):
>               proxy[name].StillRender()
> 
>   def __reconstructDisplay(self,proxy, name, propertyList):
>     #sets all the properties back to their stored values, by
>     #using eval. Hopefully a safer way is found to do this
>     for items in propertyList:
>       property = items[0]
>       value = items[1]
>       proxy[name].SetPropertyWithName(property, value)
>     proxy[name].UpdateVTKObjects()
> 
>   def __getProperties(self, proxyKey):
>     #get all the data needed in a view here
>     proxy = self.__getProxiesInGroup(self.proxies[proxyKey])
>     totalProperties = list()
>     if (proxyKey == 1):
>       #build a list of source names that correspond to the display objects
>       #so that load order wont effect display assocation
>       sourceNames = self.__buildSourceNames(proxy)
>       #get all the properties from each display object
>       for name,item in zip(sourceNames,proxy):
>         totalProperties.append( (name ,self.__getPropertyValues(proxy,item))
> )
>     else:
>       #using the stored name for everything else
>       for name in proxy:
>         totalProperties.append( (name ,self.__getPropertyValues(proxy,name))
> )
>     return totalProperties
> 
>   def __getPropertyValues(self,proxy, name):
>     properties = list()
>     for property in proxy[name]:
>       name = property.Proxy.GetPropertyName(property.SMProperty)
> 
>       try:
>         value = property.GetData()
>         float(value)
>       except (IndexError,TypeError,ValueError,AttributeError,SyntaxError):
>         #we can only pickle floats,ints, and strings. So we need a way
>         #to make sure we dont save any paraview reference. This would change
>         #if the servermanager became
> pickleable
>         try:
>           float(value[0])
>         except
> (IndexError,TypeError,ValueError,AttributeError,SyntaxError):
>           pass
>         else:
>           properties.append( (name,value) )
>       else:
>         properties.append( (name,value) )
> 
>     return properties
> 
>   def __getProxiesInGroup(self,name):
>     pxm = servermanager.ProxyManager()
>     proxy = pxm.GetProxiesInGroup(name)
>     return proxy
> 
>   def __buildSourceNames(self, proxy):
>     #builds all the source names for each display, by using the
>     #dump tool procyLabel method
>     sourceNames = list()
>     for key in proxy.keys():
>       inputValue = proxy[key].Input
>       sourceNames.append(self.__proxyLabel(inputValue[0]))
>     return sourceNames
> 
>   def __proxyLabel( self, outputPort ):
>     """Returns the given proxy's PV displayed name. Much thanks from the
> DumpTool for
>     doing this great function"""
>     pxm = servermanager.ProxyManager()
>     proxy = outputPort.Proxy
>     proxyGroup = pxm.GetProxiesInGroup(self.proxies[2])
>     for name in proxyGroup:
>       if (proxyGroup[name] == proxy):
>         return name
>     return None
> 
> class view:
>   #merely a storage container of view properties
>   def __init__(self, name, proxy, items):
>     self.proxy = proxy
>     self.name = name
>     self.items = items
> 
>   def __getstate__(self):
>     #custom pickle data, so that all the items are stored on
> pickling
>     pickleDict = dict()
>     pickleDict['proxy']=self.proxy
>     pickleDict['items']=self.items
>     pickleDict['name']=self.name
>     return pickleDict
> 
>   def __setstate__(self,dict):
>     #restore the items and view name when unpickling
>     self.proxy = dict['proxy']
>     self.items = dict['items']
>     self.name = dict['name']
>     self.__dict__.update(dict)   # update
> attributes
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> ParaView mailing list
> ParaView at paraview.org
> http://www.paraview.org/mailman/listinfo/paraview


More information about the ParaView mailing list