From 5a23b824aadf7cd5ae3da123388d3d02bd64f550 Mon Sep 17 00:00:00 2001 From: abn Date: Tue, 17 Mar 2015 13:54:54 +0100 Subject: [PATCH] Added developper's documentation in the Sphinx format. --- doc/GeneralArchitecture.html | 935 --------------------- doc/GeneralArchitecture_html_m4ed0a034.gif | Bin 26756 -> 0 bytes doc/UserDocumentation.html | 166 ---- doc/dev/CMakeLists.txt | 1 + doc/dev/images/archi.jpg | Bin 0 -> 92817 bytes doc/dev/index.rst | 246 +++++- 6 files changed, 235 insertions(+), 1113 deletions(-) delete mode 100644 doc/GeneralArchitecture.html delete mode 100644 doc/GeneralArchitecture_html_m4ed0a034.gif delete mode 100644 doc/UserDocumentation.html create mode 100644 doc/dev/images/archi.jpg diff --git a/doc/GeneralArchitecture.html b/doc/GeneralArchitecture.html deleted file mode 100644 index 4f568cef..00000000 --- a/doc/GeneralArchitecture.html +++ /dev/null @@ -1,935 +0,0 @@ - - - - - - - - - - - -

PARAVIS development

-

General architecture of PARAVIEW -extractor

-

-1.Introduction

-

2.General -architecture

-

3.Automatic -generation of container classes

-

-3.1. -Source files related to PARAVIS server definition

-

3.2. -Process of generation

-

3.3. -Definition of IDL interfaces

-

3.4. -Base interface and its implementation

-

3.5. -GUI events queue

-

3.6. -Overloaded methods definition

-

3.7. -Creation of objects in Python

-

3.8. -servermanager.py and simple.py

-

4.Trace -functionality

-



-

-



-

-

Introduction

-

This document describes development of ParaView server manager API -for PARAVIS module. The new API must provide following features:

-
    -
  1. Define interaction between two different processes: Python - console and PARAVIS GUI defined in SALOME desktop.

    -
  2. Make possible to manage PARAVIS GUI and ParaView server data - from Python scripts in synchronized mode.

    -
  3. The new API must be similar as much as possible to the API - provided by servermanager.py module from ParaView in order to make - possible launching the same scripts as in ParaView as in PARAVIS - without modifications.

    -
-

General architecture and development features of this task are -described below.

-

General architecture

-

Main components of PARAVIS architecture and their relations can be -represented as on the following picture:

-




-

-

The usual way to implement SALOME module is to develop a -Data/Algorithms engine unit as a CORBA server and module GUI as a -CORBA client. But in case if we need to use GUI and Algorithms from -Python console (what usually is an external process) in synchronized -mode then we have to implement them together as a CORBA server within -a one process.

-

On the diagram above following component are shown: -

- -

-Automatic generation of container classes

-

Source files related to PARAVIS server definition

-

In PARAVIS_SRC/idl/ directory:

-
    -
  1. PARAVIS_Gen.idl – defines main interfaces to PARAVIS - module.

    -
  2. PARAVIS_Gen_Types.idl – defines data collection - types.

    -
  3. hints_paravis – defines sizes of arrays missed in - standard VTK hints file. If some functions of VTK classes which - return array data are not extracted then it is necessary to edit - this file in order to describe missed functions.

    -
  4. pythonIDL.py – command file which is used for - extraction of IDL interfaces to Python files. This is modification - of similar file from omniidl product what takes into account - overloading of methods in class.

    -
  5. vtkWrapIDL.c – source file for building extraction - executables: vtkWrapIDL, - vtkWrapIDL_CC, vtkWrapIDL_HH.

    -
-

In PARAVIS_SRC/src/PVGUI directory:

-
    -
  1. PARAVIS_Gen_i.cc and - PARAVIS_Gen_i.hh – implementation - of PARAVIS_Gen interface.

    -
  2. PV_Events.h – defines - events for synchronization of CORBA client calls with main GUI - events queue.

    -
  3. Other files are related to GUI - definition and auxiliary tools.

    -
-

In PARAVIS_SRC/src/PV_SWIG -directory:

-
    -
  1. paravis.py – general - Python module for PARAVIS. It installs connection to PARAVIS CORBA - server, defines a variable myParavis in - order to provide acces to PARAVIS_Gen functions, - creates a set of empty constructors for all extracted ParaView - classes.

    -
  2. paravisSM.py – modified - copy of servermanager.py module from ParaView. Modification done - according to conventions defined by paravis.py module and features - of working with CORBA server.

    -
  3. pvsimple.py – modified - copy of simple.py module from ParaView. Modifications done because - of the same reasons.

    -
-

Process of generation

-

CORBA servant classes for wrapping of server manager API classes -is generated automatically. The process of building PARAVIS module -with generation of wrappers is performed in the following way:

-
    -
  1. Execute cmake command from a build directory. - During performing of this command it performs some standard steps - of SALOME module building and calls a Python command file - getwrapclasses.py is called. This procedure creates a list - of ParaView and VTK class names what has to be extracted. - This list includes all vtkSM* classes and vtk* classes - what are referred by previous group of classes. Results - of build_configure step are:

    -
      -
    1. idl/wrap.cmake – defines variables what lists all interfaces - (*.idl and *.cc files) what will be generated.

      -
    2. idl/vtkWrapIDL.c – defines a list of extracted classes in - form of char* array.

      -
    3. src/PVGUI/PARAVIS_CreateClass.cxx is a C++ file what - contains a one function CreateInstance. This function creates a - servant class which corresponds to a given name of original - ParaView/VTK class.

      -
    -
  2. Call make command in build directory. This command - does following steps related to automatic generation:

    -
      -
    1. Builds vtkWrapIDL executable in idl directory - what is responsible for generation of IDL files using names of - classes to wrap. This executable analyzes related header files for - classes from vtkWrapIDL.h and defines corresponded IDL file.

      -
    2. Defines all IDL files with help of this executable and - launches standard SALOME compilation for idl directory.

      -
    3. Compiles vtkWrapIDL_CC and - vtkWrapIDL_HH executables - in src/PVGUI directory what are responsible for generation of - header files (*.hh) and implementation files (*.cc) for servants - classes.

      -
    4. Generation of servant classes - with help of these executables and building the library.

      -
    -
  3. Call make install - command in build directory. This - will finalize building of libraries and generate Python files for - IDL interfaces.

    -
-

Note:

-

make -command can not be used with -j key because extraction of parent -classes should be done before extraction of child classes.

-

Definition of IDL interfaces

-

Process of IDL interfaces generation has to respect following -restrictions of IDL format:

-
    -
  1. IDL does not support several functions with the same name - within a one interface definition. Even they have different - parameters (overloading of methods as in C++). Also this is not - supported between parent and its ancestors.

    -
  2. In context of PARAVIS it is difficult to extract methods what - accept or return “void*” data type. In IDL it can be described - as “ANY” data type, but in context of ParaView it is not clear - to what type it has to be casted.

    -
-

IDL interfaces extracted following to the next principals:

-
    -
  1. All interfaces are inherited from a common parent interface - Base. -

    -
  2. Each interface includes all extracted methods of its - prototype class including all its parents.

    -
  3. If the prototype class contains overloaded methods (methods - with the same name) then each appearance of this method name is - supplied with index.

    -
  4. If prototype class contains methods which return or accept - void* then these methods are ignored.

    -
  5. If prototype class contains methods which return array (int*, - double*, ...) which size is not defined in “hints” or - “hints_paravis” files then these methods are ignored.

    -
  6. If prototype class - contains methods which get a pointer to function then these methods - are ignored.

    -
  7. If a method of prototype class returns/accepts a pointer on - ParaView/VTK class instance then interface will return/accept Base - interface.

    -
-

Base interface and its implementation

-

Base interface is defined in order to satisfy following points:

-
    -
  1. Sometimes we need to have a possibility to use a servant as a - pointer on a common interface.

    -
  2. We need to have possibility to define a common auxiliary - methods for all generated interfaces which out of ParaView/VTK - definitions.

    -
  3. We need to have a base implementation for all servant - classes.

    -
-

Currently Base class implements smart pointer on a vtkObjectBase -instance and several methods to Get/Set this pointer. By default each -ancestor class initializes this pointer with help of New() method. -This useful for classes what contain static methods. But after this -pointer can be reinitialized from outside what is used when we need -to have access to certain instance.

-

Also Base interface introduces a method IsSame(Base theOther). We -need this method when it is necessary to compare two ParaView objects -in Python process. In fact if we will apply standard operation “==” -then we will compare two wrapper instances instead of ParaView -objects instances. So, method IsSame(Base theOther) checks if two -wrappers refer to the same ParaView instance or not.

-

GUI events queue

-

Some calls of server manager API functions cause a modification of -GUI state: creation of new widgets, update of widgets state, -visualization of presentable objects in viewers. In our case we have -two different processes: Python console and PARAVIS GUI. At the same -moment the Python console “manages” PARAVIS GUI with help of -server manager API functions calls. So, for correct performance of -Python scripts the calls of Python commands have to be synchronized -with PARAVIS GUI events queue.

-

For this purposes all calls to server manager API from servant are -additionally wrapped by event classes. Therefore implementation of -servants methods accords to following general template:

-
    -
  1. Get an encapsulated pointer on VTK object instance.

    -
  2. Create a special event instance for target function call.

    -
  3. Launch event and wait while it returns.

    -
  4. Get result from event (if result is supposed).

    -
  5. Return this result as result of servant method.

    -
-

For example:

-

Class vtkSMProxyManager has a method GetProxy. This method -implemented in corresponded servant class as following:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

#

-
-

Code

-
-

Remarks

-
-

1

-
-

//C++: - vtkSMProxy *GetProxy (const char *groupname, const char *name);

-
-


-

-
-

2

-
-

struct - CreateEventName(GetProxy_0): public SALOME_Event

-
-

Generation - of unique event class name with help of a special macros

-
-

3

-
-

{

-
-


-

-
-

4

-
-

typedef - ::vtkSMProxy* TResult;

-
-


-

-
-

5

-
-

TResult - myResult;

-
-

Definition - of the return type

-
-

6

-
-

typedef - ::vtkSMProxyManager* TObj;

-
-


-

-
-

7

-
-

TObj - myObj;

-
-

Definition - of parameters

-
-

8

-
-

typedef - char* TParam0;

-
-


-

-
-

9

-
-

TParam0 - myParam0;

-
-


-

-
-

10

-
-

typedef - char* TParam1;

-
-


-

-
-

11

-
-

TParam1 - myParam1;

-
-


-

-
-

12

-
-


-

-
-


-

-
-

13

-
-

CreateEventName(GetProxy_0)(TObj - theObj, TParam0 theParam0, TParam1 theParam1):

-
-

Constructor - of event. Defines object instance and necessary parameters

-
-

14

-
-

myObj(theObj), - myParam0(theParam0), myParam1(theParam1)

-
-


-

-
-

15

-
-

{ - }

-
-


-

-
-

16

-
-


-

-
-


-

-
-

17

-
-

virtual - void Execute()

-
-

Execution - method.

-
-

18

-
-

{

-
-


-

-
-

19

-
-

myResult - = myObj->GetProxy(myParam0, myParam1);

-
-

Call - of target method

-
-

20

-
-

}

-
-


-

-
-

21

-
-

};

-
-


-

-
-

22

-
-

//

-
-


-

-
-

23

-
-

PARAVIS_Base_ptr - vtkSMProxyManager_i::GetProxy_0 (const char *temp0, const char - *temp1) {

-
-

Implementation - of servant method

-
-

24

-
-

try - {

-
-


-

-
-

25

-
-

char - *c_temp0 = CORBA::string_dup(temp0);

-
-

Getting - parameters

-
-

26

-
-

char - *c_temp1 = CORBA::string_dup(temp1);

-
-


-

-
-

27

-
-

::vtkSMProxy* - avtkSMProxy = (getVTKObject() != NULL) ? ProcessEvent(new - CreateEventName(GetProxy_0)((::vtkSMProxyManager*)getVTKObject(), - c_temp0 , c_temp1)):NULL;

-
-

If - wrapped object is defined then create event and launch it. Finally - it will return result.

-
-

28

-
-


-

-
-


-

-
-

29

-
-

if(avtkSMProxy - == NULL) {

-
-


-

-
-

30

-
-

return - PARAVIS::vtkSMProxy::_nil();

-
-


-

-
-

31

-
-

}

-
-


-

-
-

32

-
-

PARAVIS_Base_i* - aPtr = ::CreateInstance(avtkSMProxy, - avtkSMProxy->GetClassName());

-
-

Create - a wrapper (servant) class according to class name of result object

-
-

33

-
-

aPtr->Init(avtkSMProxy);

-
-

Initialize - the internal pointer of wrapper class by result

-
-

34

-
-

return - aPtr->_this();

-
-

Return - wrapper instance as result

-
-

35

-
-

} - catch(...) {

-
-


-

-
-

36

-
-

MESSAGE("GetProxy - - Unknown exception was occurred!!!");

-
-


-

-
-

37

-
-

return - PARAVIS::vtkSMProxy::_nil();

-
-


-

-
-

38

-
-

}

-
-


-

-
-

39

-
-

}

-
-


-

-
-


-

-

Overloaded methods definition

-

Classes of ParaView server manager API have overloaded methods. As -it is mentioned above description of IDL interface prohibits using of -the same name for various methods even they have different -parameters. To avoid this limitation we have to add index to name in -each appearance of overloaded method. But at Python script level it -is necessary to avoid using of function names with indexes. It is -necessary to provide possibility to use methods as they was defined -in API of corresponded class.

-

For tis purposes we redefined standard IDL to Python wrapping in -order to add a function which has a name of overloaded method and -accepts any parameters. This function analyzes input parameters and -selects what function (with which index) it has to be called.

-

For example:

-

vtkObject class contains definition of overloaded functions:

-

void RemoveObservers -(unsigned long event);

-

void RemoveObservers -(const char *event);

-


-

-

In IDL interface these function will be -defined as:

-

void _RemoveObservers_0 -(in long temp0);

-

void _RemoveObservers_1 -(in string temp0);

-


-

-

These functions -will be wrapped by standard IDL to Python wrapper as it is (with -indexes). But we need to call this function in Python as they were -defined in vtkObject definition – by name “RemoveObservers”. -For this purposes we modify IDL to Python wrapper in order to add the -following function:

-

def -RemoveObservers(self, *args):

-

if len(args) == 1 and -(type(args[0]) in [IntType, LongType]):

-

return -self.RemoveObservers_0(*args)

-

if len(args) == 1 and -(type(args[0]) in [StringType]):

-

return -self.RemoveObservers_1(*args)

-

print 'Warning: The -corresponding method of RemoveObservers group is not found for ' + -str(args)

-


-

-

After this we can use function -RemoveObserves in Python as it was defined without indexes.

-

Creation of objects in Python

-

Creation of CORBA object on client side is not so trivial as -usually. When client requests a creation of object then it has to be -created: -

- -

More simplest way is to request an -object from PARAVIS server interface PARAVIS_Gen. For this -purposes a method CreateClass function in PARAVIS_Gen -interface is defined. Also there is a function GetClassesList -which returns list of names of extracted classes. Both these methods -let to define a set of functions which looks like an object -constructor for all extracted classes. -

-

These definitions done in paravis.py -module with help of createConstructors function. Result of this -function is a set of functions which looks like vtkClassName(). These -functions return an object instance which wraps a pointer on -requested class vtkClassName instance with corresponded API.

-

For example call in Python console

-

> a = -vtkSMProxyManager()

-

returns an instance of -PARAVIS_Gen_vtkSMProxyManager object on client side which implements -all methods of vtkSMProxyManager class readdressing them to -incapsulated vtkSMProxyManager instance on server side.

-

servermanager.py and simple.py

-

In ParaView Python API is defined -with help of two modules servermanager.py and simple.py. PARAVIS has -corresponded modules paravisSM.py and pvsimple.py. Because of actions -described above we got a set of Python interfaces which is very close -to original Python API of ParaView. So, PARAVIS Python modules have -fiew modifications in comparison to original ones. These -modifications mainly related to:

-
    -
  1. Already mentioned problem with - “==” operation to wrapper classes.

    -
  2. Impossibility to use observers.

    -
  3. Reimplementation of hidden code - existing in ParaView which is called in Python console on its - creation.

    -
  4. Providing access to Trace - functionality.

    -
-

Trace functionality

-

Trace functionality in PARAVIS module is defined in GUI of module -using already existing Python functions in ParaView.

-

Because this trace functionality is used for “Dump Study” -functionality defined in SALOME then tracing is started automatically -on loading of PARAVIS module and registers all actions during whole -session. In case if there are no necessity tracing can be switched -off in preferences dialog box. But it is necessary to take into -account that dumping of study can't be done for PARAVIS module in -this case.

-

To check the trace content there are two functions defined in -pvsimple.py module and accessible in SALOME Python console:

- -

Connection with other SALOME modules

-

According to SALOME general architecture each module independs -from other modules by default. In general case adding of module to -module dependency can be caused by necessity to transfer some data -from one module to another. In this case a module consumer has to -“know” about API of module supplier what is going to be used. If -this API is not defined on a general module level then we have to use -direct connection to module object instance what implements a -necessary API.

-

In general algorithm of connected to a module-supplier API on a -module-consumer side looks like following:

-
    -
  1. Find and load a module-supplier component CORBA object from - active study.

    -
  2. Get a module-supplier engine from the component.

    -
  3. Using of the engine to get necessary data.

    -
- - \ No newline at end of file diff --git a/doc/GeneralArchitecture_html_m4ed0a034.gif b/doc/GeneralArchitecture_html_m4ed0a034.gif deleted file mode 100644 index 7bc987da6c33610b2b28af1e65a458f5bf8bd5d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26756 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

LsO2)3r$VQqeOPD+9#$ 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 diff --git a/doc/UserDocumentation.html b/doc/UserDocumentation.html deleted file mode 100644 index 2960bc89..00000000 --- a/doc/UserDocumentation.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - -

PARAVIS development

-

PARAVIS user documentation

-

1.Introduction

-

2.Building -environment

-

3.VTK -library

-

4.Building -of PARAVIS

-

5.Starting -SALOME with PARAVIS

-

6.Commands -accessible in Python console

-

7.Trace -management

-

8.PARAVIS -GUI specific

-

9. -PARAVIEW options

-

Introduction

-

This document describes features of -ParaView Python extractor using in PARAVIS module of SALOME platform. -In general building of PARAVIEW module is not too much differ from -usual process of any other SALOME module building, and result Python -API extracted for using in SALOME Python console is similar to the -server manager API of ParaView. But there are some features what is -desirable to understand for effective using of extractor.

-

Building environment

-

It is -necessary to check that PARAVIS_SRC directory contains following -files and they are up-to-date:

-
    -
  1. src/Paraview/lex.yy.c

    -
  2. src/Paraview/vtkParse.tab.c

    -
  3. src/Paraview/vtkParse.h

    -
-

VTK library

-

SALOME already -uses VTK library for visualization and post-processing purposes. -PARAVIS also uses VTK library supplied with ParaView. In order to -avoid problem with using of different versions of VTK library in -different components of SALOME platform it is necessary to use the -same version supplied with ParaView for all components and modules of -SALOME. -

-

For this -purposes a new option “--with-paraview” has been defined -for configure script. This option configures building procedure to -use VTK from ParaView. It means that GUI package and all modules has -to be configured with this option.

-

Building of PARAVIS

-


-

-
    -
  1. - Call cmake in a build directory: -

    -

    - > - ccmake ../PARAVIS_SRC

    -
  2. Call make command in build directory. -

    -

    > make

    -
  3. - Call - make install command in build directory. -

    -

    - > make - install

    -
-

-Starting -SALOME with PARAVIS

-

> runSalome –modules="PARAVIS"

-

If it is necessary then other SALOME modules can be added to -“modules” list separated by comma.

-

Commands -accessible in Python console

-

Loading ParaView Python API for PARAVIS can be done with help of -command:

-

> from pvsimple import *

-

This command makes accessible the same Python API what provided by -simple.py module in ParaView (see ParaView documentation). -

-

Trace management

-

Last version of ParaView is supplied with trace functionality. -PARAVIS also supports this feature. But in contrary to ParaView, -which can start/stop trace in any moment, in PARAVIS trace is -activating or deactivating for whole session.

-

Trace functionality can be switched on/off in SALOME preferences -dialog box in PARAVIS tab (main menu | Preferences...). It contains -check box “Deactivate Trace”. By default the trace is -activated. Change of check box state makes effect only for next -session.

-

User can get the trace with help of two commands (after pvsimple -import):

-
    -
  1. PrintTrace() - prints the trace content directly into Python - console window.

    -
  2. SaveTrace(fileName) - saves the trace into a given disk file.

    -
-

Also trace is using for “Dump Study” functionality. -But if the tracing is switched off then “Dump Study” -doesn't saves PARAVIS module state.

-

SALOME study save

-

On SALOME study saving PARAVIS module data is also saved in the -study. This data is saved in form of ParaView state file. ParaView -state file could have references on external files imported during -PARAVIS working session. These referenced files can be saved with the -current study depending on preference “Paraview state saving -type” defined in PARAVIS preferences dialog box. This -preference can have three possible state:

-
    -
  1. “Save referenced files only for built-in server”. - In case if this option is active then referenced files will be saved - in study together with ParaView state only if in PARAVIS was used - built-in ParaView server. In case of remote ParaView server the - state will be saved as it is without referenced files.

    -
  2. “Always save referenced files if they are accessible”. - In this case referenced files will be saved with ParaView state for - any type of ParaView server but only in case if they are accessible - across local file system.

    -
  3. “Never save referenced files”. In this case - referenced files will be never saved with ParaView state.

    -
-

It is necessary to be aware that if referenced files are not saved -in study then there is no guarantee that the saved study will be -opened correctly on other station or if the referenced files will be -moved or deleted.

-

PARAVIS GUI specific

-

In fact -PARAVIS is a ParaView GUI integrated into SALOME environment. General -architecture of ParaView is very different from general architecture -of SALOME. If SALOME is an application which is able to open several -documents (studies) within one application session because it has -multi-document architecture, then ParaView has a single document -architecture what means that it can have only one document (data -structure) opened within one session.

-

This leads to -the fact that PARAVIS module can be opened only once within SALOME -application session. It can be opened only in a first desktop -appeared after SALOME launch. Other desktops, even they opened with -study containing PARAVIS data, can not load PARAVIS module.

-



-

-

PARAVIEW options

-

If it is necessary to define a spcific command line -parameters for ParaView application then it can be defined with help -of PARAVIS_OPTIONS environment variable. For example:

-

export PARAVIS_OPTIONS=--server=myServer

-

If it is necessary to define several command line -parameters then these parameters has to be separated by “:” -symbol.

- - \ No newline at end of file diff --git a/doc/dev/CMakeLists.txt b/doc/dev/CMakeLists.txt index 6ab4f644..95121a0a 100644 --- a/doc/dev/CMakeLists.txt +++ b/doc/dev/CMakeLists.txt @@ -26,6 +26,7 @@ ADD_CUSTOM_TARGET(html_docs COMMAND ${_cmd}) INSTALL(CODE "EXECUTE_PROCESS(COMMAND \"${CMAKE_COMMAND}\" --build ${PROJECT_BINARY_DIR} --target html_docs)") INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/ DESTINATION ${SALOME_INSTALL_DOC}/dev/PARAVIS) +INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/images DESTINATION ${SALOME_INSTALL_DOC}/dev/PARAVIS/images) SET(make_clean_files html doctrees) SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${make_clean_files}") diff --git a/doc/dev/images/archi.jpg b/doc/dev/images/archi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..803bc795172dc648957ef3c8c5f3b6f28caf1799 GIT binary patch literal 92817 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�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 literal 0 HcmV?d00001 diff --git a/doc/dev/index.rst b/doc/dev/index.rst index bd5a9200..e34405bb 100644 --- a/doc/dev/index.rst +++ b/doc/dev/index.rst @@ -2,10 +2,9 @@ PARAVIS Module - Architecture and conception ############################################ -This documentation is intended for SALOME's developpers or anyone wishing to modify the module itself. +*This documentation is intended for SALOME's developpers or anyone wishing to modify the module itself. If you are looking for user documentation, please launch SALOME, activate the PARAVIS module, and refer -to the Help menu there. - +to the Help menu there.* PARAVIS is the visualization module of SALOME. The module is a tight integration of the functionalities offered by ParaView in the SALOME architecture. @@ -13,23 +12,246 @@ The architecture of the PARAVIS module has been revised end of 2014 to offer a s If you are looking for the Doxygen of the C++ code, it can be found here: `Doxygen documentation `_ -.. toctree:: - :maxdepth: 1 +Overview - Executive summary +%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The PARAVIS module represents the integration of ParaView inside SALOME. + +SALOME uses by default the *detached* server mode of ParaView: the ``pvserver`` is launched outside the main Salome process +and the ParaVis module, or the PVViewer view (Window -> ParaView view) connects to it. + +Following this logic, the PVSERVER CORBA service has a very restrained role. Its only purpose is to: + +* control the start and stop of the pvserver process +* provide the URL of the pvserver, so that a client can connect to it. + +Hence, we emphazise the fact that the CORBA engine does *not* provide any access to the objects or the visualisation +results themselves. It only serves to establish the link with the ``pvserver``. The latter can then be queried (with +the standard ParaView mechanisms) to retrieve those objects. + +A typical session looks like this: + +* start SALOME's GUI +* request activation of PARAVIS (or request activation of a *Paraview's View*) + * activation of the PVSERVER CORBA service + * invokation of the method ``FindOrStartPVServer()``: launches the pvserver process and returns its URL + (in the standard ParaView's format, e.g. ``cs://localhost:11111``) + * invokation of the standard ParaView's API to connect to the pvserver (e.g. ``Connect()`` method in the + Python module ``paraview.simple``) +* use the standard ParaView's API to interact with the server (either from the C++ side, within SALOME's GUI + or from a Python script, using for example the methods provided in the Python module ``pvsimple``). + +The picture below summarizes the architecture: + +.. image:: images/archi.jpg + :scale: 70 + +In terms of code structure, the main, all the initialization logic of ParaView is attached to the ``PVViewer`` +(ParaView's viewer) located in the GUI module in the **src/PVViewer** folder. +The CORBA engine and the graphical interface of the ParaVis module are located in the ParaVis module of SALOME. + +Functionalities +%%%%%%%%%%%%%%% + +The following functionalities are offered by the PVSERVER and the ParaVis module: + +* full embedding of ParaView's functionalities inside SALOME environment +* manage ParaVis GUI and ParaView server data from Python scripts in synchronized mode. +* compatibility of the Python scripting interface with the ``paraview.simple`` and the ``paraview.servermanager`` + modules. + +Folder structure +%%%%%%%%%%%%%%%% + +ParaVis module +============== + +In the ParaVis module, here is the list of code folders: + +* **idl**: contains the IDL for the PVSERVER CORBA service +* **src/ENGINE**: implementation of the IDL's functionalities in Python. Mainly deal with the start/stop of the pvserver +* **src/Plugins**: SALOME's specific plugins for ParaView: MEDReader, etc ... +* **src/PVGUI**: graphical elements constituing the ParaVis client in the SALOME GUI. Management of the menus, the toolbars, + etc ... seen in PARAVIS interface. +* **src/PV_SWIG**: Python modules to be able to invoke visualization functionalities from a script + +At the time of writing the PVSERVER CORBA service is sitll hosted by the ParaVis module, but it should move to GUI +to be able to compile GUI without any dependency to PARAVIS. At present, this is only a weak dependency in the sense +that nothing is needed at link time, but only at run-time. + +GUI module +========== + +One can request a ParaView view without activating the ParaVis module itself. For example the MED module now integrates +a control visualization which is in fact a ParaView view. + +To make this work, a specific type of viewer (*PVViewer*, short for ParaView viewer) has been created in the GUI module itself. +The code is located in **src/PVViewer**. + +This folder contains the following classes: + +* ``PVViewer_Behaviors``: re-instanciates the desired ParaView behaviors (a behavior defines for example the fact that ParaView + should automatically reconnect to the server if a disconnection occurs) +* ``PVViewer_EngineWrapper``: encapsulates the calls to the PVSERVER CORBA service in a dynamic fashion, so that GUI can be + compiled without having a link dependency to the ParaVis module +* ``PVViewer_GUIElements``: see :ref:`view_part` +* ``PVViewer_LogWindowAdapter``: an adapter to redirect VTK and ParaView's output messages to the SALOME's message + window (not working?) + +The folder also contain the adaptor classes needed to make the ParaView +native 3D view (a ``pqTabbedMultiViewWidget``) fit into the *SUIT* +model (i.e. the model imposed by SALOME's GUI architecture to define a new type of view): + +* ``PVViewer_ViewManager``: this class centralizes all the initialization logic (see method ``ParaviewInitApp``) of the + ParaView application (``pqCoreApplication``). +* ``PVViewer_ViewModel`` +* ``PVViewer_ViewWindow`` + + +Reminder about ParaView's architecture +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +ParaView works in a client/server mode. In two words, a server part (the ``pvserver``) takes care of the 'intensive' +computations (filter, etc ...) and a client part serves to control this server, and obviously visualize the final rendering. + +The ``pvserver`` represents the main visualisation server, and can be either: + +* *built-in*, in which case, launching ParaView suffices to activate it automatically; +* *detached*, in which case, one has to launch the server first (possibly on another host) and then connect + to it from a client. -Overview -%%%%%%%% +The various types of clients are: -Blabal +* either the standard ParaView GUI (where the name and type of the current server can be + seen by looking at the top element in the pipeline widget) +* or a Python script, using for example the module ``paraview.simple`` and the ``Connect()`` method. -Another sub-section for test -============================ +Historically the pvserver was not able to receive the connections from multiple clients, but this has been changed from +ParaView 4.0 (or was it 3.98?). Salome now exploits this feature. +.. _view_part: +Viewer part (in GUI module) +%%%%%%%%%%%%%%%%%%%%%%%%%%% +In the GUI module of SALOME, the folder **src/PVViewer** contains all the code needed to activate a minimal ParaView +3D view, without activating the ParaVis module itself. +This folder hence deals with: +* the initialization of the ParaView application (``pqApplicationCore``) +* the initialization of ParaView's desired behaviors (class ``PVViewer_GUIElements``) +* the initialization of all the GUI elements needed for a later activation of the ParaVis interface: at the time of + writing the pipeline, some menus, and other elements are very hard to connect *after* having set up a 3D view. They are + however not wanted when the user just requested a 3D view, outside the ParaVis interface. We hence create those elements + any way, but hide them, so that we can later show them again, once the ParaVis module is activated. -Specificities in the code -%%%%%%%%%%%%%%%%%%%%%%%%% +The class ``PVViewer_GUIElements`` is in charge of this. + +ParaVis graphical interface +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The initialization of the viewer takes part of instantiating the most important widgets, notably: + +* the pipeline +* the dynamic menus (filters and sources) +* the macros +* the Properties panel +* and finally the toolbars + +In the ParaVis module, the class ``PVGUI_Module`` represents the GUI client compliant with the usual architecture of +a SALOME GUI module. The implementation is split in three ``cxx`` files: + +* ``PVGUI_Module.cxx``: core stuff: module initialization and activation, management of the Python trace, etc ... +* ``PVGUI_Module_actions.cxx``: creation of the Qt actions and menus +* ``PVGUI_Module_widgets.cxx``: hide/show various widgets and save/restore their positions in the main window. + +Embedded Python interpreter - Multi-threading +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +ParaView is a mono-threaded application. It also provides an embedded Python interpreter to make the Python shell work. +SALOME on the other hand is multi-threaded, and also provides an embedded Python's interpreter. + +Making the two work together has often been (and still is) a painful job! +If you run into this sort of problems, take a look at what the GIL is: +`Global Interpreter Lock `_ + +In Salome, the current setup is to: + +* patch ParaView itself so that all calls to the Python C API are GIL safe (using ``PyGILState_Ensure``, ``PyGILState_Release``) +* have Salome's embedded Python console work in mono-threaded mode (although it is fully capable of being asynchronous). + This is achieved in ``src/PyConsole/PyConsole_Editor.cxx`` and the initialization of the ``myIsSync`` boolean member to ``True``. + +**The last point is of crucial importance**: it basically means that all the GUI events are in a single thread. +Even without considering + +All the calls to the Python API in the rest of SALOME are (should be!) GIL safe. + +The ParaView Python's trace mechanism has long been a problem, but has fortunately been rationalized thanks to the API of +ParaView providing clear methods to control the start/stop (and other options of the trace). +This is grouped in the ``ParaViewCore/ServerManager/Core/vtkSMTrace`` class and used in the +method ``PVGUI_Module::startTrace()``. + +Python modules +%%%%%%%%%%%%%% +The modules found in **src/PV_SWIG** are mostly simple namespace forwards from the original ParaView's modules (i.e. they +redirect to the original modules): + +* ``pvsimple`` is a forward of ``paraview.simple`` with little extra functionalities to make sure: + * the connection to the correct PVSERVER is automatically established + * that a ParaView's view is available when importing the module from the embedded Python console. +* ``paravisSM`` is a forward of ``paraview.servermanager``. It is left mostly for backward compatibility (it used to be + full of nasty overrides). + +Those forward/similarities are naturally intended so that a script written for pure ParaView can easily be ported +to ParaVis. The conversion boils down to replacing ``import paraview.simple`` by ``impory pvsimple`` (with a few other +extra details of lesser importance). + +Updating to a newer ParaView version +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +The following items should be revised each time an upgrade to a newer ParaView version is done. +They are often a copy/paste of ParaView's source code with a slight amendment to fit SALOME's requirements. + +* *initialization sequence*: currently located in GUI module, ``PVViewer_ViewManager::ParaViewInitApp()``: the following + classes should be inspected, and compared with their equivalent in ParaView source code to see if an update is necessary: + * ``PVViewer_ViewManager`` (GUI module): method ``ParaviewInitApp()``, ``ParaviewInitBehaviors()``, ``ParaviewLoadConfigurations()`` + and finally ``ConnectToExternalPVServer()`` should be re-read. Their precise ordering is used in ``PVGUI_Module::initialize()`` + and the whole sequence should be compared with what can be found in: + * ``Applications/ParaView/ParaViewMainWindow.cxx`` + * ``CMake/branded_paraview_initializer.cxx.in``, and the method ``Initialize()`` + * ``PVViewer_Behaviors`` (GUI module): compare with ``Qt/ApplicationComponents/pqParaViewBehaviors.cxx`` +* *menus and actions*: ``PVGUI_Module_widgets.cxx`` (ParaVis module) should be compared with ``Applications/ParaView/ParaViewMainWindow.cxx`` +* *settings dialog box*: ``PVGUI_ParaViewSettingsPane`` (ParaVis module) should be compared with ``Qt/Components/pqSettingsDialog.h`` +* *trace mechanism*: method ``PVGUI_Module::startTrace()`` should be compared with ``pqTraceReaction::start()`` in file + ``Qt/ApplicationComponents/pqTraceReaction.h`` + +Miscellaneous +%%%%%%%%%%%%% + +**Trace management** + +Contrary to ParaView, which can start/stop its trace at any moment, in PARAVIS the trace is activated +or deactivated for the whole session. + +The trace functionality can be switched on/off in SALOME preferences dialog box, in the PARAVIS tab (main menu | Preferences...). +It contains a check box “Deactivate Trace”. By default the trace is activated. +Change of check box state makes effect only for next session. + +Also, the trace is used for the "Dump Study" functionality. But if the tracing is switched off then the "Dump Study" +doesn't save PARAVIS module trace. + +**Application options** + +If it is necessary to define a spcific command line parameter for ParaView application, +then it can be defined with the help of the PARAVIS_OPTIONS environment variable. For example: :: + + export PARAVIS_OPTIONS=--server=myServer + +If it is necessary to define several command line parameters, these parameters have to be separated by the “:” character. Various TODO %%%%%%%%%%%% + +* make the PVSERVER a true CORBA service not linked to the PARAVIS module +* the PARAVIS module should be a *light* module (TODO check again why this is blocking). + -- 2.39.2