[Paraview] Write Image Python Script Paraview3

Jordi Campos i Miralles jcampos at maia.ub.es
Mon Jul 9 07:33:25 EDT 2007


Hi,

I use the methodology I exposed in 

http://public.kitware.com/pipermail/paraview/2007-July/005394.html

to learn about python scripting on Paraview.


You can try to open PV, perform "graphically by GUI" all the pipeline
you which, and then load the PV-Dump.py I posted and call to
Dump.allToPython( <filename> ) to print the python code necessary to
recreate the PV session. You will see how to "adding filters,
rotate...".


To save a screenshot of the render window in a PNG file you can use:

renderM.WriteImage("example.png", "vtkPNGWriter")

where renderW is the var us used when creating the render window
"renderM  = paraview.CreateRenderWindow()"



I attach you 2 files (inline):

- an example file created with Dump.allToPython( <filename> ) in which
you can see the "filter connection", and screenshot generation. The
script can be used as stand-alone script or loading it from PV.
- the PV-Dump.py utility updated to dump also camera information.


I hope it helps you ;)


jor;)i


PD: I'm preparing this slides:

http://namaste.maia.ub.es/public/vtk-volume-rendering-tutorial.pdf

to a presentation about VTK and PV. I will "finish" them on Friday, so
maybe you can find something interesting on them (on Friday I will fix
all PV section, because I will use an easy way to start with it...)


###################################################### exampleFrog.py

#!/usr/local/bin/pvpython
#                                                    exampleFrog.py
import paraview
if     paraview.ActiveConnection == None : CONSOLE = True
else                                     : CONSOLE = False
if CONSOLE:                                           # init Conn and RenderM
  paraview.ActiveConnection = paraview.Connect()
  renderM = paraview.CreateRenderWindow()
else:
  renders = paraview.pyProxyManager().GetProxiesInGroup("multirendermodule",
                                                  paraview.ActiveConnection)
  renderM = renders.values()[0].GetRenderModules()[0]
                                                       #  source
source = paraview.CreateProxy("sources", "legacyreader", "sources", "frog.vtk")
source.SetFileName( "/home/jcampos/frog.vtk" )
source.UpdateVTKObjects()
                                                       #  scalarOpacityFunction
scalarOpacityFunction = paraview.CreateProxy("piecewise_functions",
           "PiecewiseFunction", "pq_helper_proxies.77", "ScalarOpacityFunction")
scalarOpacityFunction.SetPoints( 0, 0, 1, 1 )
scalarOpacityFunction.UpdateVTKObjects()
                                                       #  contour
contour = paraview.CreateProxy("filters", "Contour", "sources", "Contour1")
contour.SetInput( source )
contour.SetComputeGradients( 0 )
contour.SetComputeNormals( 1 )
contour.SetComputeScalars( 0 )
contour.SetContourValues( 107 )
contour.SetSelectInputScalars( "ImageFile" )
contour.UpdateVTKObjects()
                                                       #  disp
disp = paraview.CreateDisplay(contour, renderM)
disp.SetInput( contour )
disp.SetVisibility( 1 )
disp.SetOpacity( 1 )
disp.SetColorMode( 1 )
disp.SetColor( 1, 1, 1 )
disp.SetDiffuseColor( 1, 1, 1 )
disp.SetAmbientColor( 1, 1, 1 )
disp.SetMapScalars( 1 )
disp.UpdateVTKObjects()
                                                       #  Render
renderM.SetBackground( 0.329412, 0.34902, 0.427451 )
renderM.SetCameraFocalPoint( 130.57, 115.332, 36.0827 )
renderM.SetCameraFocalPointInfo( 130.57, 115.332, 36.0827 )
renderM.SetCameraParallelProjection( 0 )
renderM.SetCameraPosition( 386.84, 502.75, -398.694 )
renderM.SetCameraPositionInfo( 386.84, 502.75, -398.694 )
renderM.SetCameraViewAngle( 30 )
renderM.SetCameraViewUp( -0.285638, -0.625687, -0.725897 )
renderM.SetCameraViewUpInfo( -0.285638, -0.625687, -0.725897 )
renderM.UpdateVTKObjects()

if CONSOLE:
  renderM.ResetCamera()
  renderM.StillRender()
  raw_input("Enter to finish")
  #import time ; time.sleep(2)

renderM.WriteImage("screenshot.png", "vtkPNGWriter")


###################################################### PV-XX-Dump.py
#                                                    PV-Dump.py
# Script to be run inside Paraview:
#  Menu Tools -> Python Shell, Run Script
# Afterwards try using "help(Dump)", "Dump.proxyList()" ...
import re

class Dump:
  """Collection of 'static methods' useful to inspect a running Paraview
  pipeline (dumping information to screen or Python code)."""

  @staticmethod
  def proxyList():
    """Prints current proxies groups and names"""
    proxies = Dump.__getProxies()
    for group in proxies:
      print "* ", group
      for name in proxies[group]:
        print "   - ", name, " ( ", proxies[group][name].SMProxy.GetXMLGroup(), " )"
      print

  @staticmethod
  def allToPython( fileName=None ):
    """Prints the python code necessary to recreate the current PV session.
    If a file name is provided, it is save into the file."""
    import sys
    
    if fileName:
      stdoutOrig = sys.stdout
      file = open( fileName, 'w')
      sys.stdout = file
  
    Dump.__scriptStart()
    Dump.proxiesToPython()
    Dump.__scriptEnd()
  
    if fileName:
      sys.stdout = stdoutOrig
      file.close()
  
  
  @staticmethod
  def proxiesToPython( includeAll=False ):
    """Prints python code to create the current proxies.
    By default some PV infrastructure proxies are not printed,
    but if includeAll is True all of them are printed."""
    proxies = Dump.__getProxies()
  
    order   = Dump.__orderProxies( proxies )  # Get proxies
                                            # ordered by dependencies among them
    for level in order:
      for item in level:
        (group, name) = item.split(':')                        # Iterate on them
  
        wrapName  = proxies[group][name].SMProxy.GetXMLName()
  
        if includeAll or wrapName not in Dump.__HIDDENPROXIES: # Avoid defaults
          Dump.proxyToPython( group, name, Dump.__niceLabel(name)) # Dump code
  
      print
    
  @staticmethod
  def proxyToPython(group, name, varName='proxy'):
    """Prints the python code necessary to create and setup the given proxy,
    using varName as the variable identifier"""
    proxies   = Dump.__getProxies()
    proxy     = proxies[group][name]
    wrapGroup = proxy.SMProxy.GetXMLGroup()
    wrapName  = proxy.SMProxy.GetXMLName()

    print ' '*54, "# ", varName                        # Code: create
    if wrapName == "LODDisplay":                       #  - display proxy
      dispInput = Dump.__niceLabel( Dump.__proxyIdLabel( proxy.GetInput()[0] ) )
      print varName +' = paraview.CreateDisplay(' \
                         + dispInput +', renderM)'
    elif wrapName == "LODRenderModule":                #  - render proxy
      varName = "renderM"
    else:                                              #  - other proxies
      print varName +' = paraview.CreateProxy("' \
                         + wrapGroup +'", "'+ wrapName +'", "' \
                         + group     +'", "'+ name +'")'
    
    patternName   = re.compile(' *XMLName: *(.*)')
    patternValues = re.compile(' *Values: *(.*)')
    patternNum    = re.compile('^[-+]?[0-9.]+$')
    patternHex    = re.compile('^0x[0-9a-f]+$')
    patternBadProp= re.compile('LightK\:|Displays|InteractorStyle')
    for prop in proxy:                                 # For each property
      match     = patternName.search( str(prop) )
      propName = match.groups()[0]

      match     = patternValues.search( str(prop) )    # Get property.Values
      if match:
        values      = match.groups()[0]
        valuesArray = values.strip().split(' ') 
  
        if   patternNum.match( valuesArray[0] ):       # If numeric: no quote
          valuesList = ', '.join( valuesArray )
  
        elif patternHex.match( valuesArray[0] ):       # If hex: fetch object
          valuesArray = proxy.__getattr__("Get"+propName)()
          valuesList = ', '.join( Dump.__niceLabel( Dump.__proxyIdLabel(p) )
                                  for p in valuesArray)
  
        else:                                          # If alpha: quote
          valuesList = ', '.join('"' + p + '"' for p in valuesArray)
  
                                                       # Code: set value
        if not patternBadProp.search( propName ) and \
           valuesList != "none" and \
           valuesList != '""':
          print varName +'.Set'+ propName +'( '+ valuesList +' )'
        else:                                          # Code: comment
          print '# '+ varName +'.Set'+ propName +'( '+ valuesList +' )'
      #else:
      #  print '# '+ varName +'.'+ propName +': no match for Values'

    print varName +'.UpdateVTKObjects()'
    print
  
  
  @staticmethod
  def getProxy( group, name ):
    """Return the proxy group:name"""
    proxies = Dump.__getProxies()
    return  proxies[group][name]



  # Private -----------------------------------------------
  
  __HIDDENPROXIES = [ "Manipulators",     "InteractorStyle", "TrackballZoom",
                      "PVAnimationScene", "TimeKeeper",      "ElementInspectorView",
                      "MultiViewRenderModule" ]
  
  @staticmethod
  def __getProxies():
    """Returns the list of proxies in the current connection"""
    proxies = paraview.pyProxyManager().GetProxiesOnConnection( \
                                     paraview.ActiveConnection )
    return proxies
  
  @staticmethod
  def __orderProxies( proxies ):
    """Returns an array, where each entry contains the names of the proxies that
    depend on the previous array entry."""
    patternName   = re.compile(' *XMLName: *(.*)')
    patternValues = re.compile(' *Values: *(.*)')
    patternHex    = re.compile('^0x[0-9a-f]+$')
    pmanager      = paraview.pyProxyManager()
  
    dependencies  = {}                                        # COLLECT DEPS
    for group in proxies:                                     # For each proxy
      for name in proxies[group]:
        dependencies[group+':'+name] = {}                     # Init its depend.
        proxy = proxies[group][name]
  
        for prop in proxy:
          match     = patternName.search( str(prop) )
          propName  = match.groups()[0]
          match     = patternValues.search( str(prop) )       # Check prop. values
          if match:
            values      = match.groups()[0]
            valuesArray = values.strip().split(' ') 
  
            if patternHex.match( valuesArray[0] ):            # If memory address
              valuesArray = proxy.__getattr__("Get"+propName)()
              for mother in valuesArray:
                motherProxyVTK = mother.SMProxy
  
                for motherGroup in proxies:                   # Find proxy by addr
                  motherName= pmanager.IsProxyInGroup( motherProxyVTK, motherGroup )
                  if motherName:
                     dependencies[group+':'+name][motherGroup+':'+motherName]=1
  
  
  
    order = [] ; currentLevel = [] ; previousLevel = []       # ORDER DEPS
  
    for proxy in pmanager.GetProxiesInGroup('view_modules',   # Start by Views
                                             paraview.ActiveConnection):
      previousLevel.append( 'view_modules:'+ proxy )
  
    renders = pmanager.GetProxiesInGroup("multirendermodule", # add Renderers
                                         paraview.ActiveConnection)
    for renderM in renders.keys():
      previousLevel.append( 'multirendermodule:'+renderM )
  
    order.append( previousLevel )
  
    while len( previousLevel ) > 0:                           # Follow depend.
  
      for item in previousLevel:
        currentLevel.extend( dependencies[ item ].keys() )
  
      if len(currentLevel) > 0 :order.append( currentLevel )
  
      previousLevel = [] ; previousLevel.extend( currentLevel )
      currentLevel  = []
  
    order.reverse()                                           # First pxs w/o deps
  
    uniqueOrder = [] ; alreadyDeclared = {}                   # Remove duplicates
    for level in order:
      newLevel = []
      for item in level:
        if not alreadyDeclared.get( item ):
          alreadyDeclared[ item ] = True
          newLevel.append( item )
  
      uniqueOrder.append( newLevel )
  
    return uniqueOrder
  
  
  @staticmethod
  def __niceLabel( label ):
    """Returns a string that can be used as var name
    (starting by a letter, without .-_, ...)"""
    if not label: return "none"
  
    label = label.replace('.', '')            # drop .-_
    label = label.replace('-', '')
    label = label.replace('_', '')
  
    if re.compile('[A-z]1').match( label[-2:] ):
      label = label[0:-1]                     # drop suffix '1'
  
    if re.compile('^[0-9]').match( label ):
      label = 'v' + label                     # add preffix when starts by number
  
    label = label[0].lower() + label[1:]      # lower 1st char
  
    return label
  
  @staticmethod
  def __proxyIdLabel( proxy ):
    """Returns the given proxy's PV displayed name"""
    proxyVTK = proxy.SMProxy
    pmanager = paraview.pyProxyManager()
    proxies  = Dump.__getProxies()
    for group in proxies:
      idLabel = pmanager.IsProxyInGroup( proxyVTK, group )
      if idLabel:
         return idLabel
    return None
  
  
  @staticmethod
  def __scriptStart(): 
    print '#!/usr/local/bin/pvpython'
    print '#                                                    <script>.py'
    print 'import paraview'
    print 'if     paraview.ActiveConnection == None : CONSOLE = True'
    print 'else                                     : CONSOLE = False'
    print 'if CONSOLE:                                           # init Conn and RenderM'
    print '  paraview.ActiveConnection = paraview.Connect()'
    print '  renderM = paraview.CreateRenderWindow()'
    print 'else:'
    print '  renders = paraview.pyProxyManager().GetProxiesInGroup("multirendermodule",'
    print '                                                  paraview.ActiveConnection)'
    print '  renderM = renders.values()[0].GetRenderModules()[0]'
    print
  
  @staticmethod
  def __scriptEnd(): 
    print
    print 'if CONSOLE:'
    print '  renderM.ResetCamera()'
    print '  renderM.StillRender()'
    print '  raw_input("Enter to finish")'
    print '  #import time ; time.sleep(2)'
    print
    print '#renderM.WriteImage("screenshot.png", "vtkPNGWriter")'









El ds 07 de 07 del 2007 a les 00:51 +0200, en/na Michael Martinec va
escriure:
> Hi
> 
> I have a batch of *.vtu files. I want to create a splice filter on them 
> and then save the images to *.jpg or *.png files. With help of the wiki 
> I managed to open a file and display a file. But I have no clue of 
> adding a filter, rotating to certain position and writing to a file... 
> Could somebody help me with a example script?
> 
> Thanx so much!!
> 
> _______________________________________________
> ParaView mailing list
> ParaView at paraview.org
> http://www.paraview.org/mailman/listinfo/paraview
-- 
Jordi Campos i Miralles
Departament de Matemàtica Aplicada i Anàlisi, MAiA
Facultat de Matemàtiques, Universitat de Barcelona
Gran Via de les Corts Catalanes, 585
08007 Barcelona
Telf : +34 93 403 93 72 



More information about the ParaView mailing list