-# Copyright (C) 2010-2014 CEA/DEN, EDF R&D
+# Copyright (C) 2010-2016 CEA/DEN, EDF R&D
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
#
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
+# Author: Adrien Bruneton (CEA)
-r"""simple is a module for using paraview server manager in Python. It
-provides a simple convenience layer to functionality provided by the
-C++ classes wrapped to Python as well as the servermanager module.
-
-A simple example:
- from paraview.simple import *
-
- # Create a new sphere proxy on the active connection and register it
- # in the sources group.
- sphere = Sphere(ThetaResolution=16, PhiResolution=32)
-
- # Apply a shrink filter
- shrink = Shrink(sphere)
-
- # Turn the visiblity of the shrink object on.
- Show(shrink)
-
- # Render the scene
- Render()
+r""" This module is a direct forward to the initial 'simple' module of ParaView.
+On top of that it also establishes a connection to a valid PVServer whose address
+is provided by the PVSERVER engine.
"""
-import paravisSM
-
-servermanager = paravisSM
-
-def enableMultiServer():
- servermanager.enableMultiServer()
-
-def switchActiveConnection(newActiveConnection=None, ns=None):
- if not ns:
- ns = globals()
- _remove_functions(ns)
- servermanager.switchActiveConnection(newActiveConnection)
- _add_functions(ns)
-
-def Disconnect(ns=None, force=True):
- if servermanager.ActiveConnection and (force or servermanager.MultiServerConnections == None):
- if ns:
- _remove_functions(ns)
- _remove_functions(globals())
- if not servermanager.fromGUI:
- servermanager.ProxyManager().DisableStateUpdateNotification()
- servermanager.ProxyManager().UnRegisterProxies()
- active_objects.view = None
- active_objects.source = None
- servermanager.Disconnect()
- if not servermanager.fromGUI:
- import gc
- gc.collect()
-
-def Connect(ds_host=None, ds_port=11111, rs_host=None, rs_port=11111):
- """Creates a connection to a server. Example usage:
- > Connect("amber") # Connect to a single server at default port
- > Connect("amber", 12345) # Connect to a single server at port 12345
- > Connect("amber", 11111, "vis_cluster", 11111) # connect to data server, render server pair"""
- Disconnect(globals(), False)
- connection = servermanager.Connect(ds_host, ds_port, rs_host, rs_port)
- _add_functions(globals())
-
- servermanager.ProxyManager().DisableStateUpdateNotification()
- servermanager.ProxyManager().UpdateFromRemote()
- tk = servermanager.ProxyManager().GetProxy("timekeeper", "TimeKeeper")
- if not tk:
- try:
- tk = servermanager.misc.TimeKeeper()
- servermanager.ProxyManager().RegisterProxy("timekeeper", "TimeKeeper", tk)
- except AttributeError:
- print "Error: Could not create TimeKeeper"
-
- scene = servermanager.ProxyManager().GetProxy("animation", "AnimationScene")
- if not scene:
- try:
- scene = AnimationScene()
- scene.TimeKeeper = tk
- except NameError:
- print "Error: Could not create AnimationScene"
-
- servermanager.ProxyManager().EnableStateUpdateNotification()
- servermanager.ProxyManager().TriggerStateUpdate()
-
- return connection
-
-def ReverseConnect(port=11111):
- """Create a reverse connection to a server. Listens on port and waits for
- an incoming connection from the server."""
- Disconnect(globals(), False)
- connection = servermanager.ReverseConnect(port)
- _add_functions(globals())
-
- servermanager.ProxyManager().DisableStateUpdateNotification()
- servermanager.ProxyManager().UpdateFromRemote()
- tk = servermanager.ProxyManager().GetProxy("timekeeper", "TimeKeeper")
- if not tk:
- tk = servermanager.misc.TimeKeeper()
- servermanager.ProxyManager().RegisterProxy("timekeeper", "TimeKeeper", tk)
-
- scene = servermanager.ProxyManager().GetProxy("animation", "AnimationScene")
- if not scene:
- scene = AnimationScene()
- scene.TimeKeeper = tk
-
- servermanager.ProxyManager().EnableStateUpdateNotification()
- servermanager.ProxyManager().TriggerStateUpdate()
-
- return connection
-
-def _create_view(view_xml_name):
- "Creates and returns a 3D render view."
- view = servermanager._create_view(view_xml_name)
- servermanager.ProxyManager().RegisterProxy("views", \
- "my_view%d" % _funcs_internals.view_counter, view)
- active_objects.view = view
- _funcs_internals.view_counter += 1
-
- tk = servermanager.ProxyManager().GetProxiesInGroup("timekeeper").values()[0]
- views = tk.Views
- if not view in views:
- views.append(view)
- try:
- scene = GetAnimationScene()
- if not view in scene.ViewModules:
- scene.ViewModules.append(view)
- except servermanager.MissingProxy:
- pass
- return view
-
-def CreateRenderView():
- return _create_view("RenderView")
-
-def CreateXYPlotView():
- return _create_view("XYChartView")
-
-def CreateBarChartView():
- return _create_view("XYBarChartView")
-
-def CreateComparativeRenderView():
- return _create_view("ComparativeRenderView")
-
-def CreateComparativeXYPlotView():
- return _create_view("ComparativeXYPlotView")
-
-def CreateComparativeBarChartView():
- return _create_view("ComparativeBarChartView")
-
-def CreateParallelCoordinatesChartView():
- return _create_view("ParallelCoordinatesChartView")
-
-def Create2DRenderView():
- return _create_view("2DRenderView")
-
-def OpenDataFile(filename, **extraArgs):
- """Creates a reader to read the give file, if possible.
- This uses extension matching to determine the best reader possible.
- If a reader cannot be identified, then this returns None."""
- session = servermanager.ActiveConnection.Session
- reader_factor = servermanager.vtkSMProxyManager.GetProxyManager().GetReaderFactory()
- if reader_factor.GetNumberOfRegisteredPrototypes() == 0:
- reader_factor.RegisterPrototypes(session, "sources")
- first_file = filename
- if type(filename) == list:
- first_file = filename[0]
- if not reader_factor.TestFileReadability(first_file, session):
- msg = "File not readable: %s " % first_file
- raise RuntimeError, msg
- if not reader_factor.CanReadFile(first_file, session):
- msg = "File not readable. No reader found for '%s' " % first_file
- raise RuntimeError, msg
- prototype = servermanager.ProxyManager().GetPrototypeProxy(
- reader_factor.GetReaderGroup(), reader_factor.GetReaderName())
- # [ABN]: bug fix for Christian VW (temporary - pvsimple should disappear soon)
- from paraview import make_name_valid # make_name_valid is not in paravisSM
- xml_name = make_name_valid(prototype.GetXMLLabel())
- reader_func = _create_func(xml_name, servermanager.sources)
- if prototype.GetProperty("FileNames"):
- reader = reader_func(FileNames=filename, **extraArgs)
- else :
- reader = reader_func(FileName=filename, **extraArgs)
- return reader
-
-def CreateWriter(filename, proxy=None, **extraArgs):
- """Creates a writer that can write the data produced by the source proxy in
- the given file format (identified by the extension). If no source is
- provided, then the active source is used. This doesn't actually write the
- data, it simply creates the writer and returns it."""
- if not filename:
- raise RuntimeError, "filename must be specified"
- session = servermanager.ActiveConnection.Session
- writer_factory = servermanager.vtkSMProxyManager.GetProxyManager().GetWriterFactory()
- if writer_factory.GetNumberOfRegisteredPrototypes() == 0:
- writer_factory.RegisterPrototypes(session, "writers")
- if not proxy:
- proxy = GetActiveSource()
- if not proxy:
- raise RuntimeError, "Could not locate source to write"
- writer_proxy = writer_factory.CreateWriter(filename, proxy.SMProxy, proxy.Port)
- return servermanager._getPyProxy(writer_proxy)
+__DEBUG = 0 # increase if you want more verbosity
-def GetRenderView():
- """Returns the active view if there is one. Else creates and returns a new view."""
- view = active_objects.view
- if not view:
- # it's possible that there's no active view, but a render view exists.
- # If so, locate that and return it (before trying to create a new one).
- view = servermanager.GetRenderView()
- if not view:
- view = CreateRenderView()
- return view
+def __my_log(msg):
+ if __DEBUG:
+ print "[PARAVIS] %s" % msg
-def GetRenderViews():
- """Returns all render views as a list."""
- return servermanager.GetRenderViews()
-
-def GetRepresentation(proxy=None, view=None):
- """Given a pipeline object and view, returns the corresponding representation object.
- If pipeline object and view are not specified, active objects are used."""
- if not view:
- view = active_objects.view
- if not proxy:
- proxy = active_objects.source
- rep = servermanager.GetRepresentation(proxy, view)
- if not rep:
- rep = servermanager.CreateRepresentation(proxy, view)
- servermanager.ProxyManager().RegisterProxy("representations", \
- "my_representation%d" % _funcs_internals.rep_counter, rep)
- _funcs_internals.rep_counter += 1
- return rep
-
-def GetDisplayProperties(proxy=None, view=None):
- """Given a pipeline object and view, returns the corresponding representation object.
- If pipeline object and/or view are not specified, active objects are used."""
- return GetRepresentation(proxy, view)
-
-def Show(proxy=None, view=None, **params):
- """Turns the visibility of a given pipeline object on in the given view.
- If pipeline object and/or view are not specified, active objects are used."""
- if proxy == None:
- proxy = GetActiveSource()
- if proxy == None:
- raise RuntimeError, "Show() needs a proxy argument or that an active source is set."
- if not view and not active_objects.view:
- CreateRenderView()
- rep = GetDisplayProperties(proxy, view)
- if rep == None:
- raise RuntimeError, "Could not create a representation object for proxy %s" % proxy.GetXMLLabel()
- for param in params.keys():
- setattr(rep, param, params[param])
- rep.Visibility = 1
- return rep
-
-def Hide(proxy=None, view=None):
- """Turns the visibility of a given pipeline object off in the given view.
- If pipeline object and/or view are not specified, active objects are used."""
- rep = GetDisplayProperties(proxy, view)
- rep.Visibility = 0
-
-def Render(view=None):
- """Renders the given view (default value is active view)"""
- if not view:
- view = active_objects.view
- view.StillRender()
- if _funcs_internals.first_render:
- # Not all views have a ResetCamera method
- try:
- view.ResetCamera()
- view.StillRender()
- except AttributeError: pass
- _funcs_internals.first_render = False
- return view
-
-def ResetCamera(view=None):
- """Resets the settings of the camera to preserver orientation but include
- the whole scene. If an argument is not provided, the active view is
- used."""
- if not view:
- view = active_objects.view
- if hasattr(view, "ResetCamera"):
- view.ResetCamera()
- if hasattr(view, "ResetDisplay"):
- view.ResetDisplay()
- Render(view)
-
-def _DisableFirstRenderCameraReset():
- """Disable the first render camera reset. Normally a ResetCamera is called
- automatically when Render is called for the first time after importing
- this module."""
- _funcs_internals.first_render = False
-
-def SetProperties(proxy=None, **params):
- """Sets one or more properties of the given pipeline object. If an argument
- is not provided, the active source is used. Pass a list of property_name=value
- pairs to this function to set property values. For example:
- SetProperties(Center=[1, 2, 3], Radius=3.5)
- """
- if not proxy:
- proxy = active_objects.source
- for param in params.keys():
- if not hasattr(proxy, param):
- raise AttributeError("object has no property %s" % param)
- setattr(proxy, param, params[param])
-
-def GetProperty(*arguments, **keywords):
- """Get one property of the given pipeline object. If keywords are used,
- you can set the proxy and the name of the property that you want to get
- like in the following example :
- GetProperty({proxy=sphere, name="Radius"})
- If it's arguments that are used, then you have two case:
- - if only one argument is used that argument will be
- the property name.
- - if two arguments are used then the first one will be
- the proxy and the second one the property name.
- Several example are given below:
- GetProperty({name="Radius"})
- GetProperty({proxy=sphereProxy, name="Radius"})
- GetProperty( sphereProxy, "Radius" )
- GetProperty( "Radius" )
+def __getFromGUI():
+ """ Identify if we are running inside SALOME's embedded interpreter.
+ @return a value strictly greater than 0 if we are in SALOME's embedded interpreter
+ @return 2 if we are in Salome embedded Python console.
"""
- name = None
- proxy = None
- for key in keywords:
- if key == "name":
- name = keywords[key]
- if key == "proxy":
- proxy = keywords[key]
- if len(arguments) == 1 :
- name = arguments[0]
- if len(arguments) == 2 :
- proxy = arguments[0]
- name = arguments[1]
- if not name:
- raise RuntimeError, "Expecting at least a property name as input. Otherwise keyword could be used to set 'proxy' and property 'name'"
- if not proxy:
- proxy = active_objects.source
- return proxy.GetProperty(name)
-
-def SetDisplayProperties(proxy=None, view=None, **params):
- """Sets one or more display properties of the given pipeline object. If an argument
- is not provided, the active source is used. Pass a list of property_name=value
- pairs to this function to set property values. For example:
- SetProperties(Color=[1, 0, 0], LineWidth=2)
- """
- rep = GetDisplayProperties(proxy, view)
- SetProperties(rep, **params)
-
-def SetViewProperties(view=None, **params):
- """Sets one or more properties of the given view. If an argument
- is not provided, the active view is used. Pass a list of property_name=value
- pairs to this function to set property values. For example:
- SetProperties(Background=[1, 0, 0], UseImmediateMode=0)
- """
- if not view:
- view = active_objects.view
- SetProperties(view, **params)
-
-def RenameSource(newName, proxy=None):
- """Renames the given source. If the given proxy is not registered
- in the sources group this method will have no effect. If no source is
- provided, the active source is used."""
- if not proxy:
- proxy = active_objects.source
- pxm = servermanager.ProxyManager()
- oldName = pxm.GetProxyName("sources", proxy)
- if oldName:
- pxm.RegisterProxy("sources", newName, proxy)
- pxm.UnRegisterProxy("sources", oldName, proxy)
-
-def FindSource(name):
- return servermanager.ProxyManager().GetProxy("sources", name)
-
-def GetSources():
- """Given the name of a source, return its Python object."""
- return servermanager.ProxyManager().GetProxiesInGroup("sources")
-
-def GetRepresentations():
- """Returns all representations (display properties)."""
- return servermanager.ProxyManager().GetProxiesInGroup("representations")
-
-def UpdatePipeline(time=None, proxy=None):
- """Updates (executes) the given pipeline object for the given time as
- necessary (i.e. if it did not already execute). If no source is provided,
- the active source is used instead."""
- if not proxy:
- proxy = active_objects.source
- if time:
- proxy.UpdatePipeline(time)
- else:
- proxy.UpdatePipeline()
-
-def Delete(proxy=None):
- """Deletes the given pipeline object or the active source if no argument
- is specified."""
- if not proxy:
- proxy = active_objects.source
- # Unregister any helper proxies stored by a vtkSMProxyListDomain
- for prop in proxy:
- listdomain = prop.GetDomain('proxy_list')
- if listdomain:
- if listdomain.GetClassName() != 'vtkSMProxyListDomain':
- continue
- group = "pq_helper_proxies." + proxy.GetGlobalIDAsString()
- for i in xrange(listdomain.GetNumberOfProxies()):
- pm = servermanager.ProxyManager()
- iproxy = listdomain.GetProxy(i)
- name = pm.GetProxyName(group, iproxy)
- if iproxy and name:
- pm.UnRegisterProxy(group, name, iproxy)
-
- # Remove source/view from time keeper
- tk = servermanager.ProxyManager().GetProxiesInGroup("timekeeper").values()[0]
- if isinstance(proxy, servermanager.SourceProxy):
- try:
- idx = tk.TimeSources.index(proxy)
- del tk.TimeSources[idx]
- except ValueError:
- pass
- else:
- try:
- idx = tk.Views.index(proxy)
- del tk.Views[idx]
- except ValueError:
- pass
- servermanager.UnRegister(proxy)
-
- # If this is a representation, remove it from all views.
- if proxy.SMProxy.IsA("vtkSMRepresentationProxy") or \
- proxy.SMProxy.IsA("vtkSMNewWidgetRepresentationProxy"):
- for view in GetRenderViews():
- view.Representations.remove(proxy)
- # If this is a source, remove the representation iff it has no consumers
- # Also change the active source if necessary
- elif proxy.SMProxy.IsA("vtkSMSourceProxy"):
- sources = servermanager.ProxyManager().GetProxiesInGroup("sources")
- for i in range(proxy.GetNumberOfConsumers()):
- if proxy.GetConsumerProxy(i) in sources:
- raise RuntimeError("Source has consumers. It cannot be deleted " +
- "until all consumers are deleted.")
- #VSV:==
- if proxy.IsSame(GetActiveSource()):
- if hasattr(proxy, "Input") and proxy.Input:
- if isinstance(proxy.Input, servermanager.Proxy):
- SetActiveSource(proxy.Input)
- else:
- SetActiveSource(proxy.Input[0])
- else: SetActiveSource(None)
- for rep in GetRepresentations().values():
- #VSV:==
- if rep.Input.IsSame(proxy):
- Delete(rep)
- # Change the active view if necessary
- elif proxy.SMProxy.IsA("vtkSMRenderViewProxy"):
- ##VSV:==
- if proxy.IsSame(GetActiveView()):
- if len(GetRenderViews()) > 0:
- SetActiveView(GetRenderViews()[0])
- else:
- SetActiveView(None)
-
-def CreateLookupTable(**params):
- """Create and return a lookup table. Optionally, parameters can be given
- to assign to the lookup table.
- """
- lt = servermanager.rendering.PVLookupTable()
- servermanager.Register(lt)
- SetProperties(lt, **params)
- return lt
-
-def CreatePiecewiseFunction(**params):
- """Create and return a piecewise function. Optionally, parameters can be
- given to assign to the piecewise function.
- """
- pfunc = servermanager.piecewise_functions.PiecewiseFunction()
- servermanager.Register(pfunc)
- SetProperties(pfunc, **params)
- return pfunc
-
-def GetLookupTableForArray(arrayname, num_components, **params):
- """Used to get an existing lookuptable for a array or to create one if none
- exists. Keyword arguments can be passed in to initialize the LUT if a new
- one is created."""
- proxyName = "%d.%s.PVLookupTable" % (int(num_components), arrayname)
- lut = servermanager.ProxyManager().GetProxy("lookup_tables", proxyName)
- if lut:
- return lut
- # No LUT exists for this array, create a new one.
- # TODO: Change this to go a LookupTableManager that is shared with the GUI,
- # so that the GUI and python end up create same type of LUTs. For now,
- # python will create a Blue-Red LUT, unless overridden by params.
- lut = servermanager.rendering.PVLookupTable(
- ColorSpace="HSV", RGBPoints=[0, 0, 0, 1, 1, 1, 0, 0])
- SetProperties(lut, **params)
- servermanager.Register(lut, registrationName=proxyName)
- return lut
+ import salome_iapp
+ ret = 0
+ if salome_iapp.IN_SALOME_GUI:
+ ret += 1
+ try:
+ if __IN_SALOME_GUI_CONSOLE: # only defined if we are in SALOME's embedded console (not only GUI)
+ ret += 1
+ except NameError:
+ pass
+ return ret
-def CreateScalarBar(**params):
- """Create and return a scalar bar widget. The returned widget may
- be added to a render view by appending it to the view's representations
- The widget must have a valid lookup table before it is added to a view.
- It is possible to pass the lookup table (and other properties) as arguments
- to this method:
-
- lt = MakeBlueToRedLt(3.5, 7.5)
- bar = CreateScalarBar(LookupTable=lt, Title="Velocity")
- GetRenderView().Representations.append(bar)
-
- By default the returned widget is selectable and resizable.
+def ShowParaviewView():
"""
- sb = servermanager.rendering.ScalarBarWidgetRepresentation()
- servermanager.Register(sb)
- sb.Selectable = 1
- sb.Resizable = 1
- sb.Enabled = 1
- sb.Title = "Scalars"
- SetProperties(sb, **params)
- return sb
-
-# TODO: Change this to take the array name and number of components. Register
-# the lt under the name ncomp.array_name
-def MakeBlueToRedLT(min, max):
- # Define RGB points. These are tuples of 4 values. First one is
- # the scalar values, the other 3 the RGB values.
- rgbPoints = [min, 0, 0, 1, max, 1, 0, 0]
- return CreateLookupTable(RGBPoints=rgbPoints, ColorSpace="HSV")
-
-def _find_writer(filename):
- """Internal function."""
- extension = None
- parts = filename.split('.')
- if len(parts) > 1:
- extension = parts[-1]
- else:
- raise RuntimeError, "Filename has no extension, please specify a write"
-
- if extension == 'png':
- return 'vtkPNGWriter'
- elif extension == 'bmp':
- return 'vtkBMPWriter'
- elif extension == 'ppm':
- return 'vtkPNMWriter'
- elif extension == 'tif' or extension == 'tiff':
- return 'vtkTIFFWriter'
- elif extension == 'jpg' or extension == 'jpeg':
- return 'vtkJPEGWriter'
- else:
- raise RuntimeError, "Cannot infer filetype from extension:", extension
-
-def AddCameraLink(viewProxy, viewProxyOther, linkName):
- """Create a camera link between two view proxies. A name must be given
- so that the link can be referred to by name. If a link with the given
- name already exists it will be removed first."""
- if not viewProxyOther: viewProxyOther = GetActiveView()
- link = servermanager.vtkSMCameraLink()
- link.AddLinkedProxy(viewProxy.SMProxy, 1)
- link.AddLinkedProxy(viewProxyOther.SMProxy, 2)
- link.AddLinkedProxy(viewProxyOther.SMProxy, 1)
- link.AddLinkedProxy(viewProxy.SMProxy, 2)
- RemoveCameraLink(linkName)
- servermanager.ProxyManager().RegisterLink(linkName, link)
-
-def RemoveCameraLink(linkName):
- """Remove a camera link with the given name."""
- servermanager.ProxyManager().UnRegisterLink(linkName)
-
-def WriteImage(filename, view=None, **params):
- """Saves the given view (or the active one if none is given) as an
- image. Optionally, you can specify the writer and the magnification
- using the Writer and Magnification named arguments. For example:
- WriteImage("foo.mypng", aview, Writer=vtkPNGWriter, Magnification=2)
- If no writer is provided, the type is determined from the file extension.
- Currently supported extensions are png, bmp, ppm, tif, tiff, jpg and jpeg.
- The writer is a VTK class that is capable of writing images.
- Magnification is used to determine the size of the written image. The size
- is obtained by multiplying the size of the view with the magnification.
- Rendering may be done using tiling to obtain the correct size without
- resizing the view."""
- if not view:
- view = active_objects.view
- writer = None
- if params.has_key('Writer'):
- writer = params['Writer']
- mag = 1
- if params.has_key('Magnification'):
- mag = int(params['Magnification'])
- if not writer:
- writer = _find_writer(filename)
- view.WriteImage(filename, writer, mag)
-
-def AnimateReader(reader=None, view=None, filename=None):
- """This is a utility function that, given a reader and a view
- animates over all time steps of the reader. If the optional
- filename is provided, a movie is created (type depends on the
- extension of the filename."""
- if not reader:
- reader = active_objects.source
- if not view:
- view = active_objects.view
-
- return servermanager.AnimateReader(reader, view, filename)
-
-
-def _create_func(key, module):
- """Internal function."""
-
- def CreateObject(*input, **params):
- """This function creates a new proxy. For pipeline objects that accept inputs,
- all non-keyword arguments are assumed to be inputs. All keyword arguments are
- assumed to be property,value pairs and are passed to the new proxy."""
-
- # Instantiate the actual object from the given module.
- px = module.__dict__[key]()
-
- # Make sure non-keyword arguments are valid
- for inp in input:
- if inp != None and not isinstance(inp, servermanager.Proxy):
- if px.GetProperty("Input") != None:
- raise RuntimeError, "Expecting a proxy as input."
- else:
- raise RuntimeError, "This function does not accept non-keyword arguments."
-
- # Assign inputs
- if px.GetProperty("Input") != None:
- if len(input) > 0:
- px.Input = input
- else:
- # If no input is specified, try the active pipeline object
- if px.GetProperty("Input").GetRepeatable() and active_objects.get_selected_sources():
- px.Input = active_objects.get_selected_sources()
- elif active_objects.source:
- px.Input = active_objects.source
- else:
- if len(input) > 0:
- raise RuntimeError, "This function does not expect an input."
-
- registrationName = None
- for nameParam in ['registrationName', 'guiName']:
- if nameParam in params:
- registrationName = params[nameParam]
- del params[nameParam]
-
- # Pass all the named arguments as property,value pairs
- for param in params.keys():
- setattr(px, param, params[param])
-
- try:
- # Register the proxy with the proxy manager.
- if registrationName:
- group, name = servermanager.Register(px, registrationName=registrationName)
- else:
- group, name = servermanager.Register(px)
-
-
- # Register pipeline objects with the time keeper. This is used to extract time values
- # from sources. NOTE: This should really be in the servermanager controller layer.
- if group == "sources":
- has_tk = True
- try:
- tk = servermanager.ProxyManager().GetProxiesInGroup("timekeeper").values()[0]
- except IndexError:
- has_tk = False
- if has_tk:
- sources = tk.TimeSources
- if not px in sources:
- sources.append(px)
-
- active_objects.source = px
- except servermanager.MissingRegistrationInformation:
- pass
-
- return px
-
- return CreateObject
-
-def _create_doc(new, old):
- """Internal function."""
- import string
- res = ""
- for doc in (new, old):
- ts = []
- strpd = doc.split('\n')
- for s in strpd:
- ts.append(s.lstrip())
- res += string.join(ts)
- res += '\n'
- return res
-
-def _func_name_valid(name):
- """Internal function."""
- valid = True
- for c in name:
- if c == '(' or c ==')':
- valid = False
- break
- return valid
-
-def _add_functions(g):
- activeModule = servermanager.ActiveConnection.Modules
- for m in [activeModule.filters, activeModule.sources,
- activeModule.writers, activeModule.animation]:
- dt = m.__dict__
- for key in dt.keys():
- cl = dt[key]
- if not isinstance(cl, str):
- if not key in g and _func_name_valid(key):
- g[key] = _create_func(key, m)
- exec "g[key].__doc__ = _create_doc(m.%s.__doc__, g[key].__doc__)" % key
-
-def _remove_functions(g):
- list = []
- if servermanager.ActiveConnection:
- list = [m for m in dir(servermanager.ActiveConnection.Modules) if m[0] != '_']
-
- for m in list:
- dt = servermanager.ActiveConnection.Modules.__dict__[m].__dict__
- for key in dt.keys():
- cl = dt[key]
- if not isinstance(cl, str) and g.has_key(key):
- g.pop(key)
- #print "remove %s function" % key
-
-def GetActiveView():
- """Returns the active view."""
- return active_objects.view
-
-def SetActiveView(view):
- """Sets the active view."""
- active_objects.view = view
-
-def GetActiveSource():
- """Returns the active source."""
- return active_objects.source
-
-def SetActiveSource(source):
- """Sets the active source."""
- active_objects.source = source
-
-def GetActiveCamera():
- """Returns the active camera for the active view. The returned object
- is an instance of vtkCamera."""
- return GetActiveView().GetActiveCamera()
-
-def GetAnimationScene():
- """Returns the application-wide animation scene. ParaView has only one
- global animation scene. This method provides access to that. Users are
- free to create additional animation scenes directly, but those scenes
- won't be shown in the ParaView GUI."""
- animation_proxies = servermanager.ProxyManager().GetProxiesInGroup("animation")
- scene = None
- for aProxy in animation_proxies.values():
- if aProxy.GetXMLName() == "AnimationScene":
- scene = aProxy
- break
- if not scene:
- raise servermanager.MissingProxy, "Could not locate global AnimationScene."
- return scene
-
-def WriteAnimation(filename, **params):
- """Writes the current animation as a file. Optionally one can specify
- arguments that qualify the saved animation files as keyword arguments.
- Accepted options are as follows:
- * Magnification (integer) : set the maginification factor for the saved
- animation.
- * Quality (0 [worst] or 1 or 2 [best]) : set the quality of the generated
- movie (if applicable).
- * Subsampling (integer) : setting whether the movie encoder should use
- subsampling of the chrome planes or not, if applicable. Since the human
- eye is more sensitive to brightness than color variations, subsampling
- can be useful to reduce the bitrate. Default value is 0.
- * BackgroundColor (3-tuple of doubles) : set the RGB background color to
- use to fill empty spaces in the image.
- * FrameRate (double): set the frame rate (if applicable)."""
- scene = GetAnimationScene()
- # ensures that the TimeKeeper track is created.
- GetTimeTrack()
- iw = servermanager.vtkSMAnimationSceneImageWriter()
- iw.SetAnimationScene(scene.SMProxy)
- iw.SetFileName(filename)
- if params.has_key("Magnification"):
- iw.SetMagnification(int(params["Magnification"]))
- if params.has_key("Quality"):
- iw.SetQuality(int(params["Quality"]))
- if params.has_key("Subsampling"):
- iw.SetSubsampling(int(params["Subsampling"]))
- if params.has_key("BackgroundColor"):
- iw.SetBackgroundColor(params["BackgroundColor"])
- if params.has_key("FrameRate"):
- iw.SetFrameRate(float(params["FrameRate"]))
- iw.Save()
-
-def _GetRepresentationAnimationHelper(sourceproxy):
- """Internal method that returns the representation animation helper for a
- source proxy. It creates a new one if none exists."""
- # ascertain that proxy is a source proxy
- if not sourceproxy in GetSources().values():
- return None
- for proxy in servermanager.ProxyManager():
- if proxy.GetXMLName() == "RepresentationAnimationHelper" and\
- proxy.GetProperty("Source").IsProxyAdded(sourceproxy.SMProxy):
- return proxy
- # create a new helper
- proxy = servermanager.misc.RepresentationAnimationHelper(
- Source=sourceproxy)
- servermanager.ProxyManager().RegisterProxy(
- "pq_helper_proxies.%s" % sourceproxy.GetGlobalIDAsString(),
- "RepresentationAnimationHelper", proxy)
- return proxy
-
-def GetAnimationTrack(propertyname_or_property, index=None, proxy=None):
- """Returns an animation cue for the property. If one doesn't exist then a
- new one will be created.
- Typical usage:
- track = GetAnimationTrack("Center", 0, sphere) or
- track = GetAnimationTrack(sphere.GetProperty("Radius")) or
-
- # this returns the track to animate visibility of the active source in
- # all views.
- track = GetAnimationTrack("Visibility")
-
- For animating properties on implicit planes etc., use the following
- signatures:
- track = GetAnimationTrack(slice.SliceType.GetProperty("Origin"), 0) or
- track = GetAnimationTrack("Origin", 0, slice.SliceType)
-
+ If the import is made from SALOME embedded console, the ParaView application needs to
+ be instanciated to avoid a future crash.
"""
- if not proxy:
- proxy = GetActiveSource()
- if not isinstance(proxy, servermanager.Proxy):
- raise TypeError, "proxy must be a servermanager.Proxy instance"
- if isinstance(propertyname_or_property, str):
- propertyname = propertyname_or_property
- elif isinstance(propertyname_or_property, servermanager.Property):
- prop = propertyname_or_property
- propertyname = prop.Name
- proxy = prop.Proxy
- else:
- raise TypeError, "propertyname_or_property must be a string or servermanager.Property"
-
- # To handle the case where the property is actually a "display" property, in
- # which case we are actually animating the "RepresentationAnimationHelper"
- # associated with the source.
- if propertyname in ["Visibility", "Opacity"]:
- proxy = _GetRepresentationAnimationHelper(proxy)
- if not proxy or not proxy.GetProperty(propertyname):
- raise AttributeError, "Failed to locate property %s" % propertyname
-
- scene = GetAnimationScene()
- for cue in scene.Cues:
- try:
- if cue.AnimatedProxy.IsSame(proxy) and\
- cue.AnimatedPropertyName == propertyname:
- if index == None or index.IsSame(cue.AnimatedElement): ##index == cue.AnimatedElement:
- return cue
- except AttributeError:
- pass
-
- # matching animation track wasn't found, create a new one.
- cue = KeyFrameAnimationCue()
- cue.AnimatedProxy = proxy
- cue.AnimatedPropertyName = propertyname
- if index != None:
- cue.AnimatedElement = index
- scene.Cues.append(cue)
- return cue
-
-def GetCameraTrack(view=None):
- """Returns the camera animation track for the given view. If no view is
- specified, active view will be used. If no exisiting camera animation track
- is found, a new one will be created."""
- if not view:
- view = GetActiveView()
- if not view:
- raise ValueError, "No view specified"
- scene = GetAnimationScene()
- for cue in scene.Cues:
- if cue.AnimatedProxy.IsSame(view) and\
- cue.GetXMLName() == "CameraAnimationCue":
- return cue
- # no cue was found, create a new one.
- cue = CameraAnimationCue()
- cue.AnimatedProxy = view
- scene.Cues.append(cue)
- return cue
-
-def GetTimeTrack():
- """Returns the animation track used to control the time requested from all
- readers/filters during playback.
- This is the "TimeKeeper - Time" track shown in ParaView's 'Animation View'.
- If none exists, a new one will be created."""
- scene = GetAnimationScene()
- tk = scene.TimeKeeper
- for cue in scene.Cues:
- if cue.GetXMLName() == "TimeAnimationCue" and cue.AnimatedProxy.IsSame(tk)\
- and cue.AnimatedPropertyName == "Time":
- return cue
- # no cue was found, create a new one.
- cue = TimeAnimationCue()
- cue.AnimatedProxy = tk
- cue.AnimatedPropertyName = "Time"
- scene.Cues.append(cue)
- return cue
-
-def LoadXML(xmlstring, ns=None):
- """Given a server manager XML as a string, parse and process it.
- If you loaded the simple module with from paraview.simple import *,
- make sure to pass globals() as the second arguments:
- LoadXML(xmlstring, globals())
- Otherwise, the new functions will not appear in the global namespace."""
- if not ns:
- ns = globals()
- servermanager.LoadXML(xmlstring)
- _add_functions(ns)
-
-def LoadPlugin(filename, remote=True, ns=None):
- """Loads a ParaView plugin and updates this module with new constructors
- if any. The remote argument (default to True) is to specify whether
- the plugin will be loaded on client (remote=False) or on server (remote=True).
- If you loaded the simple module with from paraview.simple import *,
- make sure to pass globals() as an argument:
- LoadPlugin("myplugin", False, globals()), to load on client;
- LoadPlugin("myplugin", True, globals()), to load on server;
- LoadPlugin("myplugin", ns=globals()), to load on server.
- Otherwise, the new functions will not appear in the global namespace."""
-
- if not ns:
- ns = globals()
- servermanager.LoadPlugin(filename, remote)
- _add_functions(ns)
-
-def LoadDistributedPlugin(pluginname, remote=True, ns=None):
- """Loads a plugin that's distributed with the executable. This uses the
- information known about plugins distributed with ParaView to locate the
- shared library for the plugin to load. Raises a RuntimeError if the plugin
- was not found."""
- if not servermanager.ActiveConnection:
- raise RuntimeError, "Cannot load a plugin without a session."
- plm = servermanager.vtkSMProxyManager.GetProxyManager().GetPluginManager()
- if remote:
- session = servermanager.ActiveConnection.Session
- info = plm.GetRemoteInformation(session)
- else:
- info = plm.GetLocalInformation()
- for cc in range(0, info.GetNumberOfPlugins()):
- if info.GetPluginName(cc) == pluginname:
- return LoadPlugin(info.GetPluginFileName(cc), remote, ns)
- raise RuntimeError, "Plugin '%s' not found" % pluginname
-
-def GetLayouts():
- """Returns the layout proxies on the active session.
- Layout proxies are used to place views in a grid."""
- return servermanager.ProxyManager().GetProxiesInGroup("layouts")
-
-def GetLayout(view=None):
- """Return the layout containing the give view, if any.
- If no view is specified, active view is used.
+ if __getFromGUI():
+ __my_log("Initializing ParaView main elements, please be patient ...")
+ import SalomePyQt
+ sgPyQt = SalomePyQt.SalomePyQt()
+ viewIds = sgPyQt.findViews("ParaView")
+ if len(viewIds):
+ sgPyQt.setViewVisible(viewIds[0], True)
+ sgPyQt.activateView(viewIds[0])
+ else:
+ sgPyQt.createView("ParaView")
+ # Now let the GUI main loop process the initialization event posted above
+ sgPyQt.processEvents()
+ __my_log("ParaView initialized.")
+
+## The below has to called BEFORE importing paraview!!! This is crazy, but it has to be.
+ShowParaviewView()
+
+import paraview
+import pvserver
+from paraview import simple
+
+def SalomeConnectToPVServer():
"""
- if not view:
- view = GetActiveView()
- if not view:
- raise RuntimeError, "No active view was found."
- layouts = GetLayouts()
- for layout in layouts.values():
- if layout.GetViewLocation(view) != -1:
- return layout
- return None
-
-
-def SelectCells(query=None, proxy=None):
- """Select cells satisfying the query. If query is None, then all cells are
- selected. If proxy is None, then the active source is used."""
- if not proxy:
- proxy = GetActiveSource()
- if not proxy:
- raise RuntimeError, "No active source was found."
-
- if not query:
- # This ends up being true for all cells.
- query = "id >= 0"
-
- # Note, selSource is not registered with the proxy manager.
- selSource = servermanager.sources.SelectionQuerySource()
- selSource.FieldType = "CELL"
- selSource.QueryString = str(query)
- proxy.SMProxy.SetSelectionInput(proxy.Port, selSource.SMProxy, 0)
- return selSource
-
-def ClearSelection(proxy=None):
- """Clears the selection on the active source."""
- if not proxy:
- proxy = GetActiveSource()
- if not proxy:
- raise RuntimeError, "No active source was found."
- proxy.SMProxy.SetSelectionInput(proxy.Port, None, 0)
-
-class ActiveObjects(object):
- """This class manages the active objects (source and view). The active
- objects are shared between Python and the user interface. This class
- is for internal use. Use the Set/Get methods for setting and getting
- active objects."""
- def __get_selection_model(self, name, session=None):
- "Internal method."
- if session and not servermanager.ActiveConnection.Session.IsSame(session):
- raise RuntimeError, "Try to set an active object with invalid active connection."
- pxm = servermanager.ProxyManager(session)
- model = pxm.GetSelectionModel(name)
- if not model:
- model = servermanager.vtkSMProxySelectionModel()
- pxm.RegisterSelectionModel(name, model)
- return model
-
- def set_view(self, view):
- "Sets the active view."
- active_view_model = self.__get_selection_model("ActiveView")
- if view:
- active_view_model = self.__get_selection_model("ActiveView", view.GetSession())
- active_view_model.SetCurrentProxy(view.SMProxy, 0)
- else:
- active_view_model = self.__get_selection_model("ActiveView")
- active_view_model.SetCurrentProxy(None, 0)
-
- def get_view(self):
- "Returns the active view."
- return servermanager._getPyProxy(
- self.__get_selection_model("ActiveView").GetCurrentProxy())
-
- def set_source(self, source):
- "Sets the active source."
- active_sources_model = self.__get_selection_model("ActiveSources")
- if source:
- # 3 == CLEAR_AND_SELECT
- active_sources_model = self.__get_selection_model("ActiveSources", source.GetSession())
- active_sources_model.SetCurrentProxy(source.SMProxy, 3)
- else:
- active_sources_model = self.__get_selection_model("ActiveSources")
- active_sources_model.SetCurrentProxy(None, 3)
-
- def __convert_proxy(self, px):
- "Internal method."
- if not px:
- return None
- if px.IsA("vtkSMSourceProxy"):
- return servermanager._getPyProxy(px)
- else:
- return servermanager.OutputPort(
- servermanager._getPyProxy(px.GetSourceProxy()),
- px.GetPortIndex())
-
- def get_source(self):
- "Returns the active source."
- return self.__convert_proxy(
- self.__get_selection_model("ActiveSources").GetCurrentProxy())
-
- def get_selected_sources(self):
- "Returns the set of sources selected in the pipeline browser."
- model = self.__get_selection_model("ActiveSources")
- proxies = []
- for i in xrange(model.GetNumberOfSelectedProxies()):
- proxies.append(self.__convert_proxy(model.GetSelectedProxy(i)))
- return proxies
-
- view = property(get_view, set_view)
- source = property(get_source, set_source)
-
-class _funcs_internals:
- """Internal class."""
- first_render = True
- view_counter = 0
- rep_counter = 0
-
-def demo1():
- """Simple demo that create the following pipeline
- sphere - shrink - \
- - append
- cone - /
+ Automatically connect to the right PVServer when not ("inside SALOME GUI" and "already connected").
"""
- # Create a sphere of radius = 2, theta res. = 32
- # This object becomes the active source.
- ss = Sphere(Radius=2, ThetaResolution=32)
- # Apply the shrink filter. The Input property is optional. If Input
- # is not specified, the filter is applied to the active source.
- shr = Shrink(Input=ss)
- # Create a cone source.
- cs = Cone()
- # Append cone and shrink
- app = AppendDatasets()
- app.Input = [shr, cs]
- # Show the output of the append filter. The argument is optional
- # as the app filter is now the active object.
- Show(app)
- # Render the default view.
- Render()
-
-def demo2(fname="/Users/berk/Work/ParaView/ParaViewData/Data/disk_out_ref.ex2"):
- """This demo shows the use of readers, data information and display
- properties."""
-
- # Create the exodus reader and specify a file name
- reader = ExodusIIReader(FileName=fname)
- # Get the list of point arrays.
- avail = reader.PointVariables.Available
- print avail
- # Select all arrays
- reader.PointVariables = avail
-
- # Turn on the visibility of the reader
- Show(reader)
- # Set representation to wireframe
- SetDisplayProperties(Representation = "Wireframe")
- # Black background is not pretty
- SetViewProperties(Background = [0.4, 0.4, 0.6])
- Render()
- # Change the elevation of the camera. See VTK documentation of vtkCamera
- # for camera parameters.
- # NOTE: THIS WILL BE SIMPLER
- GetActiveCamera().Elevation(45)
- Render()
- # Now that the reader executed, let's get some information about it's
- # output.
- pdi = reader[0].PointData
- # This prints a list of all read point data arrays as well as their
- # value ranges.
- print 'Number of point arrays:', len(pdi)
- for i in range(len(pdi)):
- ai = pdi[i]
- print "----------------"
- print "Array:", i, " ", ai.Name, ":"
- numComps = ai.GetNumberOfComponents()
- print "Number of components:", numComps
- for j in range(numComps):
- print "Range:", ai.GetRange(j)
- # White is boring. Let's color the geometry using a variable.
- # First create a lookup table. This object controls how scalar
- # values are mapped to colors. See VTK documentation for
- # details.
- # Map min (0.00678) to blue, max (0.0288) to red
- SetDisplayProperties(LookupTable = MakeBlueToRedLT(0.00678, 0.0288))
- # Color by point array called Pres
- SetDisplayProperties(ColorAttributeType = "POINT_DATA")
- SetDisplayProperties(ColorArrayName = "Pres")
- Render()
-
-def PrintTrace():
- print paravisSM.myParavis.GetTrace()
-
-def SaveTrace(fileName):
- paravisSM.myParavis.SaveTrace(fileName)
-
-
-if not servermanager.ActiveConnection:
- Connect()
-else:
- _add_functions(globals())
-
-def ImportFile(theFileName):
- paravisSM.ImportFile(theFileName)
-
-active_objects = ActiveObjects()
-active_objects.view = GetRenderView()
+ __my_log("Connecting to PVServer ...")
+ server_url = ""
+ try:
+ isGUIConnected = pvserver.myPVServerService.GetGUIConnected()
+ if isGUIConnected and __getFromGUI():
+ __my_log("Importing pvsimple from GUI and already connected. Won't reconnect.")
+ return
+ server_url = pvserver.myPVServerService.FindOrStartPVServer(0)
+ # Extract host and port from URL:
+ a = server_url.split(':')
+ b = a[1].split('//')
+ host, port = b[-1], int(a[-1])
+ simple.Connect(host, port)
+ __my_log("Connected to %s!" % server_url)
+ if __getFromGUI():
+ pvserver.myPVServerService.SetGUIConnected(True)
+ except Exception as e:
+ __my_log("*******************************************")
+ __my_log("** Could not connect to a running PVServer!")
+ __my_log("*******************************************")
+ raise e
+ pass
+
+if __getFromGUI() < 1:
+ # Only if not in GUI (otherwise the createView will do the connection)
+ SalomeConnectToPVServer()
+del SalomeConnectToPVServer
+
+# Forward namespace of simple into current pvsimple:
+for name in dir(simple):
+ if not name.startswith("__"):
+ globals()[name] = getattr(simple, name)
+del simple