r"""This is a module to perform live visualization in the context of Catalyst.
"""

from paraview.simple import *
from paraview import servermanager


# -----------------------------------------------------------------------------
def ConnectToCatalyst(ds_host='localhost', ds_port=22222):
    """Creates a connection to a catalyst simulation. Example usage:

    > Connect("amber") # Connect to a single server at default port
    > Connect("amber", 12345) # Connect to a single server at port 12345

    return a LiveInsituLink object.
    """
    displaySession = servermanager.ActiveConnection.Session
    insituLink = servermanager.ConnectToCatalyst(ds_host, ds_port)
    ProcessServerNotifications()
    insituLink.InvokeCommand('Initialize')
    SetActiveConnection(servermanager.GetConnectionFromSession(displaySession))
    return insituLink


# -----------------------------------------------------------------------------
def ExtractCatalystData(link, name):
    ''' Extract data called "name" from simulation managed by the LiveInsituLink link.
        Register it in displaySession
    '''
    displaySession = servermanager.ActiveConnection.Session
    proxy = link.CreateExtract('sources', name, 0)
    displaySession.GetSessionProxyManager().RegisterProxy('sources', name, proxy)
    data = FindSource(name)
    return data


# -----------------------------------------------------------------------------
def PauseCatalyst(link, pause=True):
    ''' Pause / Unpause the Catalyst simulation managed by the LiveInsituLink link.
    '''
    currentState = link.GetProperty('SimulationPaused').GetElement(0) == 1
    if currentState == pause:
        return

    link.GetProperty('SimulationPaused').SetElement(0, 1 if pause else 0)
    link.UpdateVTKObjects()
    if not pause:
        link.InvokeCommand('LiveChanged')


# -----------------------------------------------------------------------------
def ProcessServerNotifications():
    ''' Processes pending events from server.
    '''
    pm = servermanager.vtkProcessModule.GetProcessModule()
    nam = pm.GetNetworkAccessManager()
    while nam.ProcessEvents(1) == 1:
        pass
