]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
Merge from V5_1_main 2009-05-15 14:48 (Paris, UTC+2)
authorbarate <barate>
Fri, 15 May 2009 13:00:12 +0000 (13:00 +0000)
committerbarate <barate>
Fri, 15 May 2009 13:00:12 +0000 (13:00 +0000)
148 files changed:
bin/salome_utils.py
bin/setenv.py
configure.ac
doc/INSTALL.txt [new file with mode: 0644]
doc/KERNEL_Services.txt [new file with mode: 0644]
doc/SALOME_Application.txt [new file with mode: 0644]
doc/UnitTests.txt [new file with mode: 0644]
doc/index.txt [new file with mode: 0644]
doc/kernel_resources.txt [new file with mode: 0644]
doc/rst.css [new file with mode: 0644]
doc/salome/Makefile.am
doc/salome/batch.dox [new file with mode: 0644]
doc/salome/kernel_salome.dox [new file with mode: 0644]
doc/salome/kernel_services.dox
doc/salome/main.dox
doc/salome/tui/KERNEL/HTML/Logger.html [new file with mode: 0644]
doc/salome/tui/KERNEL/HTML/SALOMEDS.html [new file with mode: 0644]
doc/salome/tui/KERNEL/HTML/SALOMEDS_Attributes.html [new file with mode: 0644]
doc/salome/tui/KERNEL/HTML/SALOME_Component.html [new file with mode: 0644]
doc/salome/tui/KERNEL/HTML/SALOME_DataTypeCatalog.html [new file with mode: 0644]
doc/salome/tui/KERNEL/HTML/SALOME_Exception.html [new file with mode: 0644]
doc/salome/tui/KERNEL/HTML/SALOME_ModuleCatalog.html [new file with mode: 0644]
doc/salome/tui/KERNEL/HTML/SALOME_Registry.html [new file with mode: 0644]
doc/salome/tui/KERNEL/HTML/SALOME_RessourcesCatalog.html [new file with mode: 0644]
doc/salome/tui/KERNEL/HTML/SALOME_Session.html [new file with mode: 0644]
doc/salome/tui/KERNEL/HTML/SALOME_TestComponent.html [new file with mode: 0644]
doc/salome/tui/KERNEL/HTML/TestNotif.html [new file with mode: 0644]
doc/salome/tui/KERNEL/HTML/TypeData.html [new file with mode: 0644]
doc/salome/tui/KERNEL/doxydev.in [new file with mode: 0644]
doc/salome/tui/KERNEL/doxyfile.in [new file with mode: 0755]
doc/salome/tui/KERNEL/doxyuser.in [new file with mode: 0644]
doc/salome/tui/KERNEL/exemple/Example1.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example10.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example11.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example12.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example13.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example14.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example15.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example16.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example17.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example18.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example19.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example2.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example20.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example21.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example22.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example23.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example3.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example4.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example5.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example6.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example7.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example8.html [new file with mode: 0755]
doc/salome/tui/KERNEL/exemple/Example9.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/Application-About1.jpg [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/application.gif [new file with mode: 0644]
doc/salome/tui/KERNEL/sources/application.jpg [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/doxygen.css [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/footer.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/html_comments.gif [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/kernel_about_4.png [new file with mode: 0644]
doc/salome/tui/KERNEL/sources/logocorp.gif [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/myheader.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/occ.gif [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/Link.gif [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/SObject.gif [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/Study_Struct.gif [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/doxygen.css [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/examples_Kernel.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/examples_Life_cycle.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/examples_Naming.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/examples_Study.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/mapping.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/ns_f3-1.jpg [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/overview_Kernel.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/overview_Life_Cycle.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/overview_Naming.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/overview_Study.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/page2.html [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/tree.js.in [new file with mode: 0755]
doc/salome/tui/KERNEL/sources/static/treeview.js [new file with mode: 0644]
doc/salome/tui/pythfilter.py [new file with mode: 0644]
doc/txt2html.sh [new file with mode: 0755]
idl/DSC_Engines.idl
idl/DSC_Engines.xml
idl/Makefile.am
idl/SALOME_Component.idl
idl/SALOME_Component.xml
idl/SALOME_ContainerManager.idl
idl/SALOME_PACOExtension.idl [new file with mode: 0644]
idl/SALOME_PACOExtension.xml [new file with mode: 0644]
idl/SALOME_ParamPorts.idl [new file with mode: 0644]
idl/SALOME_ParamPorts.xml [new file with mode: 0644]
idl/SALOME_Ports.idl
idl/SALOME_Ports.xml
resources/KERNELCatalog.xml.in
salome_adm/cmake_files/FindBOOST.cmake
salome_adm/cmake_files/FindPLATFORM.cmake
salome_adm/cmake_files/am2cmake.py
salome_adm/unix/config_files/check_openmpi.m4
salome_adm/unix/config_files/check_paco++.m4
salome_adm/unix/config_files/production.m4
src/Container/Makefile.am
src/Container/SALOME_Container.cxx
src/Container/SALOME_ContainerManager.cxx
src/Container/SALOME_ContainerManager.hxx
src/DSC/Makefile.am
src/DSC/ParallelDSC/Makefile.am
src/DSC/ParallelDSC/ParallelDSC_i.cxx
src/DSC/ParallelDSC/ParallelDSC_i.hxx
src/DSC/ParallelDSC/Param_Double_Port_provides_i.cxx [new file with mode: 0644]
src/DSC/ParallelDSC/Param_Double_Port_provides_i.hxx [new file with mode: 0644]
src/DSC/ParallelDSC/Param_Double_Port_uses_i.cxx [new file with mode: 0644]
src/DSC/ParallelDSC/Param_Double_Port_uses_i.hxx [new file with mode: 0644]
src/KERNEL_PY/import_hook.py
src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx
src/MPIContainer/MPIContainer_i.cxx
src/NamingService/SALOME_NamingService.cxx
src/NamingService/SALOME_NamingService.hxx
src/ParallelContainer/Makefile.am
src/ParallelContainer/Parallel_Salome_file_i.cxx
src/ParallelContainer/Parallel_Salome_file_i.hxx
src/ParallelContainer/SALOME_ParallelComponent_i.cxx
src/ParallelContainer/SALOME_ParallelComponent_i.hxx
src/ParallelContainer/SALOME_ParallelContainerNodeDummy.cxx
src/ParallelContainer/SALOME_ParallelContainerNodeMpi.cxx
src/ParallelContainer/SALOME_ParallelContainerProxyDummy.cxx
src/ParallelContainer/SALOME_ParallelContainerProxyMpi.cxx
src/ParallelContainer/SALOME_ParallelContainerProxy_i.cxx
src/ParallelContainer/SALOME_ParallelContainerProxy_i.hxx
src/ParallelContainer/SALOME_ParallelContainer_i.cxx
src/ParallelContainer/SALOME_ParallelContainer_i.hxx
src/ParallelContainer/SALOME_ParallelGlobalProcessVar_i.cxx [new file with mode: 0644]
src/ParallelContainer/SALOME_ParallelGlobalProcessVar_i.hxx [new file with mode: 0644]
src/ResourcesManager/ResourcesManager.cxx
src/ResourcesManager/ResourcesManager.hxx
src/ResourcesManager/SALOME_ResourcesCatalog_Handler.cxx
src/ResourcesManager/SALOME_ResourcesCatalog_Handler.hxx
src/ResourcesManager/SALOME_ResourcesCatalog_Parser.cxx
src/ResourcesManager/SALOME_ResourcesCatalog_Parser.hxx
src/ResourcesManager/SALOME_ResourcesManager.cxx
src/ResourcesManager/SALOME_ResourcesManager.hxx
src/SALOMEDSImpl/SALOMEDSImpl_Study.cxx
src/SALOMEDSImpl/SALOMEDSImpl_StudyBuilder.cxx
src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.cxx
src/TestMPIContainer/TestMPIComponentEngine.hxx
src/Utils/Utils_Identity.cxx
src/Utils/Utils_SALOME_Exception.hxx

index cf22daf1784d549f71a4139c8e76ae13a40b18ed..61d609273b5d957fcf0c0392d368fc0addfbd5cc 100644 (file)
@@ -43,6 +43,8 @@ __all__ = [
     'getPortNumber',
     'getTmpDir',
     'generateFileName',
+    'makeTmpDir',
+    'uniteFiles',
     ]
 
 # ---
@@ -346,3 +348,61 @@ def generateFileName( dir, prefix = None, suffix = None, extension = None,
             pass
         pass
     return os.path.normpath(name)
+
+# ---
+
+def makeTmpDir( path ):
+    """
+    Make temporary directory with the specified path.
+    If the directory exists then clear its contents.
+
+    Parameters:
+    - path : absolute path to the directory to be created.
+    """
+    import os
+
+    if os.path.exists( path ):
+        os.system( "rm -rf " + path + "/*" )
+        pass
+    else:
+        os.makedirs( path, 0777 )
+        pass
+
+# ---
+
+def uniteFiles( src_file, dest_file ):
+    """
+    Unite contents of the source file with contents of the destination file
+    and put result of the uniting to the destination file.
+    If the destination file does not exist then the source file is simply
+    copied to its path.
+
+    Parameters:
+    - src_file  : absolute path to the source file
+    - dest_file : absolute path to the destination file
+    """
+    import os
+
+    if not os.path.exists( src_file ):
+        return
+        pass
+
+    if os.path.exists( dest_file ):
+        # add a symbol of new line to contents of the destination file (just in case)
+        dest = open( dest_file, 'r' )
+        dest_lines = dest.readlines()
+        dest.close()
+
+        dest_lines.append( "\n" )
+
+        dest = open( dest_file, 'w' )
+        dest.writelines( dest_lines )
+        dest.close()
+
+        command = "cat " + src_file + " >> " + dest_file
+        pass
+    else:
+        command = "cp " + src_file + " " + dest_file
+        pass
+
+    os.system( command )
index 4eeff394b9f455c91f6ee2fb53fef45cc8406e38..cde2e11658709f3b1d1f47f418d16ff97721f8e5 100755 (executable)
@@ -153,6 +153,14 @@ def get_config(silent=False):
 def set_env(args, modules_list, modules_root_dir, silent=False):
     """Add to the PATH-variables modules specific paths"""
     
+    import os
+    from salome_utils import getTmpDir, generateFileName, makeTmpDir
+
+    # create temporary directory for environment files needed by modules from the list
+    tmp_dir = getTmpDir()
+    env_dir = generateFileName(tmp_dir, prefix="env", with_port=True)
+    makeTmpDir(env_dir)
+
     python_version="python%d.%d" % sys.version_info[0:2]
     modules_root_dir_list = []
     if os.getenv('SALOME_BATCH') == None:
@@ -190,45 +198,17 @@ def set_env(args, modules_list, modules_root_dir, silent=False):
                                   salome_subdir,
                                   "shared_modules"),
                      "PYTHONPATH")
-            
-            # set environment for SMESH plugins
-            if module == "SMESH" :
-                os.environ["SMESH_MeshersList"]="StdMeshers"
-                if not os.environ.has_key("SALOME_StdMeshersResources"):
-                    os.environ["SALOME_StdMeshersResources"] \
-                    = modules_root_dir["SMESH"]+"/share/"+salome_subdir+"/resources/smesh"
-                    pass
-                if args.has_key("SMESH_plugins"):
-                    for plugin in args["SMESH_plugins"]:
-                        plugin_root = ""
-                        if os.environ.has_key(plugin+"_ROOT_DIR"):
-                            plugin_root = os.environ[plugin+"_ROOT_DIR"]
-                        else:
-                            # workaround to avoid modifications of existing environment
-                            if os.environ.has_key(plugin.upper()+"_ROOT_DIR"):
-                                plugin_root = os.environ[plugin.upper()+"_ROOT_DIR"]
-                                pass
-                            pass
-                        if plugin_root != "":
-                            os.environ["SMESH_MeshersList"] \
-                            = os.environ["SMESH_MeshersList"]+":"+plugin
-                            if not os.environ.has_key("SALOME_"+plugin+"Resources"):
-                                os.environ["SALOME_"+plugin+"Resources"] \
-                                = plugin_root+"/share/"+salome_subdir+"/resources/"+plugin.lower()
-                                add_path(os.path.join(plugin_root,get_lib_dir(),python_version, "site-packages",salome_subdir), "PYTHONPATH")
-                                add_path(os.path.join(plugin_root,get_lib_dir(),salome_subdir), "PYTHONPATH")
-                                
-                                if sys.platform == "win32":
-                                    add_path(os.path.join(plugin_root,get_lib_dir(),salome_subdir), "PATH")
-                                else:
-                                    add_path(os.path.join(plugin_root,get_lib_dir(),salome_subdir), "LD_LIBRARY_PATH")
-                                    add_path(os.path.join(plugin_root,"bin",salome_subdir), "PYTHONPATH")
-                                    add_path(os.path.join(plugin_root,"bin",salome_subdir), "PATH")
-                                    pass
-                                pass
-                            pass
-                        pass
-                    
+
+            # set environment by modules from the list
+            try:
+                mod=__import__(module.lower()+"_setenv")
+                mod.set_env(args)
+                pass
+            except:
+                pass
+            pass
+        pass
+
     if sys.platform == 'win32':
         os.environ["SALOMEPATH"]=";".join(modules_root_dir_list)
     else:
@@ -254,24 +234,6 @@ def set_env(args, modules_list, modules_root_dir, silent=False):
     = os.path.join(modules_root_dir["KERNEL"],"share",
                    salome_subdir,"resources","kernel")
 
-    if "GEOM" in modules_list:
-        if verbose() and not silent: print "GEOM OCAF Resources" 
-        
-       # set CSF_PluginDefaults variable only if it is not customized
-        # by the user
-
-        if not os.getenv("CSF_PluginDefaults"):
-           os.environ["CSF_PluginDefaults"] \
-           = os.path.join(modules_root_dir["GEOM"],"share",
-                          salome_subdir,"resources","geom")
-        os.environ["CSF_GEOMDS_ResourcesDefaults"] \
-        = os.path.join(modules_root_dir["GEOM"],"share",
-                       salome_subdir,"resources","geom")
-        if verbose() and not silent: print "GEOM Shape Healing Resources"
-        os.environ["CSF_ShHealingDefaults"] \
-        = os.path.join(modules_root_dir["GEOM"],"share",
-                       salome_subdir,"resources","geom")
-
 # -----------------------------------------------------------------------------
 
 def main(silent=False):
index fa01feeaa8df453e43c71fe5fc2c1055b7982cb1..64068a439df01a3feb5d48ef461cf5a2d19ef1c1 100644 (file)
@@ -127,6 +127,7 @@ echo
 # production.m4
 AC_ENABLE_DEBUG(no)
 AC_ENABLE_PRODUCTION(no)
+AC_ENABLE_MPI_SEQ_CONTAINER(no)
 
 echo
 echo ---------------------------------------------
@@ -404,6 +405,9 @@ echo
 
 CHECK_HTML_GENERATORS
 
+# Additional conditional to avoid compilation of non-portable code
+AM_CONDITIONAL(WINDOWS, 0)
+
 echo
 echo ============================================================
 echo Summary
diff --git a/doc/INSTALL.txt b/doc/INSTALL.txt
new file mode 100644 (file)
index 0000000..7c01e34
--- /dev/null
@@ -0,0 +1,394 @@
+=================================================================
+Installation instructions, up to date for 3.0 version
+=================================================================
+
+*html version of this document is produced with docutils*::
+
+  rst2html < doc.txt > doc.html
+
+*This document corresponds to SALOME2 2.2.9.*
+*IT IS NOT UP TO DATE with 3.2.0*
+
+.. contents::
+.. sectnum::
+
++-------------------------------------------+
+| **WORK in PROGRESS, INCOMPLETE DOCUMENT** |
++-------------------------------------------+
+
+-------------------------------------------------------------------------------
+
+You'll find here generic instructions for installing the SALOME2 platform.
+
+Summary
+-------
+
+`1. Quick Overview`_
+
+`2. System configuration`_
+
+`3. Third-party dependencies`_
+
+`4. Preparing the shell environment`_
+
+`5. Installing the KERNEL component`_
+
+`6. Installing the SALOME components`_
+
+`7. Runtime`_
+
+`8. Suggestions and advices`_
+
+
+1. Quick Overview
+-----------------
+
+First of all, you have to check (or install if needed) the dependant
+software programs on your system. These programs are:
+
+- common development tools as gcc, automake, autoconf and libtools.
+- third party softwares used in SALOME building or runtime process
+  (python, OCC, VTK, ...)
+
+Further details can be found in sections [2] and [3].
+
+If the dependencies are installed on your system, then you have to set
+your shell environment to get access to the software components
+(cf. [4]. "Preparing the shell environment").
+
+The next step is to install the KERNEL (cf. [5] "Installing KERNEL"):
+
+::
+
+$ mkdir <kernel_build>
+$ mkdir <kernel_install>
+$ cd <kernel_src>
+$ ./build_configure
+$ cd <kernel_build>
+$ <kernel_src>/configure --prefix=<kernel_install>
+$ make
+$ make install
+
+Then, the SALOME components GEOM, MED, VISU, ... can be installed
+with a similar procedure (cf. [6]).
+
+Eventually, the platform can be run by executing the shell script
+runSalome (cf. [7]). Here, somme additionnal variables have to be set
+to describe the SALOME runtime configuration (<COMPONENT>_ROOT_DIR,
+OMNIORB_CONFIG)
+
+The following provides you with specific instructions for each step.
+
+
+2. System configuration
+-----------------------
+
+SALOME is compiled and tested on differents platforms with native packages:
+- Debian sarge
+- Mandrake 10.1
+- ...
+
+If you have another platform, we suggest the following configuration
+for building process:
+
+- gcc-3.3.x or 3.4.x
+- automake-1.7 or more (only aclocal is used)
+- autoconf-2.59
+- libtool-1.5.6
+
+remarks:
+
+- This is the minimum level of automake, autoconf and libtool, if you need
+  to compile all the third party softwares (included OpenCascade 5.2.x).
+
+3. Third-party dependencies
+---------------------------
+
+The SALOME platform relies on a set of third-party softwares. The
+current version depends on the following list
+(versions given here are from Debian Sarge, except OpenCascade, VTK and MED,
+which are not Debian packages):
+
+CAS-5.2.4              OpenCascade (try binaries,a source patch is needed)
+VTK-4.2.6              VTK 3D-viewer
+PyQt-3.13              Python-Qt Wrapper
+Python-2.3.5           Python interpreter
+SWIG-1.3.24            SWIG library
+boost-1_32_0           C++ library (only include templates are used)
+hdf5-1.6.2             Files Database library
+med-2.2.2              MED Data Format support for file records 
+omniORB-4.0.5          ORB used in SALOME
+qt-x11-free-3.3.3      Qt library
+qwt-4.2                        Graph components for Qt
+sip4-4.1.1             langage binding software 
+
+And, in order to build the documentation:
+
+doxygen-1.4.2
+graphviz-2.2.1
+
+
+Additionnal software may be installed for optional features: 
+
+netgen4.3 + patch
+tix8.1.4
+openpbs-2.3.16
+lsf-???
+
+
+
+3.1 To Do
+~~~~~~~~~
+- Instructions for installing these software programs can be found in a
+  special note doc/configuration_examples/install-prerequis.
+- Installation shell scripts are also provided.
+  These scripts have to be adapted to your own configuration.
+
+- See doc/configuration_examples/*
+
+In the following, we assume that all the third-party softwares are
+installed in the same root directory, named <salomeroot>/prerequis.
+Then, your file system should probably look like::
+
+  <salomeroot>/prerequis/Python-2.2.2
+  <salomeroot>/prerequis/omniORB-3.0.5
+  <salomeroot>/prerequis/qt-x11-free-3.0.5
+  ...
+
+
+4. Preparing the shell environment
+----------------------------------
+
+Some variables have to be set to get acces to third-party software
+components (include files, executable, library, ...) during building
+process and runtime.
+
+The shell file prerequis.sh, embedded in the KERNEL source package,
+provides a template for setting those variables. In this example, all the
+softwares are supposed to be installed in the same root directory,
+named here INSTALLROOT.
+
+Copy the prerequis.sh in a working directory and adjust the settings
+to your own configuration. To get the shell prepared, just
+execute the following command in the building shell:
+
+$ source prerequis.sh
+
+(we assume here a ksh or bash mode)
+
+
+5. Installing the KERNEL component
+----------------------------------
+
+We use here the notation <kernel_src> to specify the source directory
+of the KERNEL component. The shell environment is supposed to have
+been set (cf. 4).
+
+Installing the KERNEL from a source package needs three directories:
+
+- the source directory, denoted here by <kernel_src>.
+
+- the build directory, denoted by <kernel_build> in the following. This
+  directory can't be the same directory as <kernel_src>.
+
+- the install directory, denoted by <kernel_install> in the following. This
+  directory can't be the same directory as <kernel_src> or
+  <kernel_build>.
+
+The installing process is:
+
+STEP 1:
+  preparing directories
+
+  create the <kernel_build> and the <kernel_install> directories::
+
+    $ mkdir <kernel_build>
+    $ mkdir <kernel_install>
+
+STEP 2:
+  build configure script
+
+  go to <kernel_src> directory and generate the "configure" script::
+
+    $ cd <kernel_src>
+    $ ./build_configure
+
+  If it doesn't work, check your system automake tools as specified in
+  section [2].
+
+STEP 3:
+  configure the building process
+  go to the build directory and execute the configuration process::
+
+    $ cd <kernel_build>
+    $ <kernel_src>/configure --prefix=<kernel_install>
+
+  Note that <kernel_install> must be an absolute path.
+
+  When the configure process is complete, check the status of
+  third-party softwares detection. You should have a status like::
+
+    ---------------------------------------------
+    Summary
+    ---------------------------------------------
+    Configure
+           cc : yes
+        boost : yes
+     lex_yacc : yes
+       python : yes
+         swig : yes
+      threads : yes
+       OpenGL : yes
+           qt : yes
+          vtk : yes
+         hdf5 : yes
+         med2 : yes
+      omniORB : yes
+          occ : yes
+          sip : yes
+         pyqt : yes
+          qwt : yes
+      doxygen : yes
+     graphviz : no
+      openpbs : no
+          lsf : no
+    Default ORB   : omniORB
+    ----------------------------------------------
+
+If a software get a status "no", then it's not "seen" in the system:
+
+- the software is not installed, or
+- the shell environment is not set correctly. 
+
+In this example, the software programs graphviz, openpbs and lsf are not
+installed (optional for most usages).
+
+
+STEP 4 :
+  Building the binary files
+
+  Execute make in the <kernel_build> directory::
+
+    $ make
+
+
+STEP 5:
+  Installing binary files, scripts and documentation
+
+  Execute install target in the <kernel_build> directory::
+
+    $ make install
+
+
+6. Installing the SALOME components
+-----------------------------------
+
+TInstalling a component <COMPONENT> is done by following the same
+instructions as given for the KERNEL, replacing KERNEL by
+<COMPONENT> (build_configure, configure, make, make install).
+
+You just have to be aware of the dependencies between components:
+
+- MED    depends on KERNEL
+- GEOM   depends on KERNEL
+- SMESH  depends on KERNEL, MED, GEOM
+- VISU   depends on KERNEL, MED
+- SUPERV depends on KERNEL
+
+For example, installing the component SMESH needs the previous
+installation of the KERNEL component, and then the GEOM and MED components.
+
+The building process uses the variables <COMPONENT>_ROOT_DIR to
+localize the dependant components. The variables must be set to the
+install path directory of the components <COMPONENT> (ex:
+KERNEL_ROOT_DIR=<kernel_install>). 
+In the above example, the three variables KERNEL_ROOT_DIR,
+GEOM_ROOT_DIR and MED_ROOT_DIR have to be set before configuring the
+building process of the SMESH component (STEP 3).
+
+
+7. Runtime
+----------
+
+See SALOME_Application_ to define your own configuration of SALOME and run it
+on one or several computers. This is the recommended way of configuration.
+
+.. _SALOME_Application: ./SALOME_Application.html
+
+The following explains the general principles.
+
+To run the SALOME platform, the procedure is:
+
+- set the shell environment to get acces to third-party softwares::
+
+   $ source prerequis.sh
+
+- define the SALOME configuration by setting the whole set of
+  variables <COMPONENT>_ROOT_DIR. Here, you just have to set the
+  kernel and the components you need::
+
+    $ export KERNEL_ROOT_DIR=<kernel_install>
+    $ export MED_ROOT_DIR=<med_install>
+    $ ...
+
+- define the CORBA configuration file by setting the variable
+  OMNIORB_CONFIG. This variable must be set to a writable file
+  path. The file may be arbitrary chosen and doesn't need to exist
+  before running. We suggest::
+
+    $ export OMNIORB_CONFIG=$HOME/.omniORB.cfg
+
+- run the SALOME platform by executing the script runSalome::
+
+    $KERNEL_ROOT_DIR/bin/salome/runSalome
+
+
+8. Suggestions and advices
+--------------------------
+
+For convenience or customization, we suggest the following organisation:
+
+- chose and create a root directory for the SALOME platform, say
+  <salomeroot>.
+
+- install the third-party softwares in a sub-directory "prerequis"
+
+- install the SALOME components in a sub-directory "SALOME2"
+
+- make personnal copies of the files prerequis.sh and runSalome in
+  <salomeroot>::
+
+    $ cp <kernel_src>/prerequis.sh <rundir>/.
+    $ cp <kernel_install>/bin/salome/runSalome <rundir>/.
+
+  Edit the file prerequis.sh and adjust it to your own configuration.
+
+- define the SALOME2 configuration
+
+  This step consists in setting the KERNEL_ROOT_DIR, the whole set of
+  variables <COMPONENT>_ROOT_DIR you need, and the OMNIORB_CONFIG
+  variable.
+
+  We suggest to create a shell file envSalome.sh containing those
+  settings. Then the configuration consists in loading envSalome.sh in
+  the runtime shell::
+
+    $ source envSalome.sh
+
+- When installed with this file organisation, running SALOME is done
+  with the following shell commands::
+
+    $ source <salomeroot>/prerequis.sh
+    $ source <salomeroot>/envSalome.sh
+    $ ./runSalome
+
+
+-------------------------------------------------------------------------------
+
++----------------------------------+------------------------------------------+
+| `General KERNEL documentation`_  | `End User KERNEL Doxygen documentation`_ |
++----------------------------------+------------------------------------------+
+
+.. _`General KERNEL documentation`:           ./index.html
+.. _`End User KERNEL Doxygen documentation`:  ./tui/KERNEL/index.html
diff --git a/doc/KERNEL_Services.txt b/doc/KERNEL_Services.txt
new file mode 100644 (file)
index 0000000..c848838
--- /dev/null
@@ -0,0 +1,305 @@
+=================================================================
+KERNEL Services for end user (Python interface)
+=================================================================
+
+*html version of this document is produced with docutils*::
+
+  rst2html < doc.txt > doc.html
+
+This document corresponds to SALOME2 3.2.0
+
+.. contents::
+.. sectnum::
+
++-------------------------------------------+
+| **WORK in PROGRESS, INCOMPLETE DOCUMENT** |
++-------------------------------------------+
+
+-------------------------------------------------------------------------------
+
+In a SALOME application, distributed components, servers and clients use
+the CORBA middleware for comunication. CORBA interfaces are defined via idl
+files. All the different CORBA interfaces are available for users in Python,
+see CORBA interfaces below.
+
+For some general purpose services, CORBA interfaces have been encapsulated
+in order to provide a simple interface (encapsulation is generally done in
+C++ classes, and a Python SWIG interface is also generated from C++, to 
+ensure a consistent behavior between C++ modules and Python modules or user
+script).
+
+General purpose services
+========================
+
+SALOME services access from a Python shell
+------------------------------------------
+See SALOME_Application_ for detailed instructions to launch a Python
+interpreter with full acces to the SALOME environment and services.
+
+.. _SALOME_Application: ./SALOME_Application.txt
+
+You can use the embedded Python interpreter in Grahic User Interface, or an
+external interpreter, with::
+
+   ./runSession
+   python
+
+In either cases, SALOME services access is done with::
+
+   import salome
+   salome.salome_init()
+
+In the embedded interpreter, it is already done, but there is no problem to
+do it several times, so it is preferable to add these instructions
+systematically in your scripts, to allow them to work in all configurations.
+
+Container and component instanciation
+-------------------------------------
+
+See LifeCycleCORBA_ for the C++ interface (Python interface obtained with SWIG
+is very similar).
+
+.. _LifeCycleCORBA: ./tui/KERNEL/classSALOME__LifeCycleCORBA.html
+
+
+In the following example, a test component provided in KERNEL is launched
+in the local container, "FactoryServer", created when SALOME starts::
+
+   import salome
+   salome.salome_init()
+   
+   import LifeCycleCORBA
+   lcc = LifeCycleCORBA.LifeCycleCORBA()
+   obj=lcc.FindOrLoad_Component("FactoryServer","SalomeTestComponent")
+   
+   import Engines
+   comp=obj._narrow(Engines.TestComponent)
+   
+   comp.Coucou(1)
+
+The answer is something like::
+
+   'TestComponent_i : L = 1'
+The _narrow() instruction is not always mandatory in Python, but sometimes 
+useful to be sure you have got the right type of object. Here, Testcomponent_
+interface is defined in CORBA module Engines. With this example, it works also
+without the _narrow() instruction::
+
+   obj.Coucou(1)
+
+.. _Testcomponent: ./tui/KERNEL/interfaceEngines_1_1TestComponent.html
+
+
+In the next example, a component instance is created in a specific Container
+defined by it's computer hostname and it's name. Here we use the local
+computer. Note that in Utils_Identity_, getShortHostName() gives the short
+hostname of the computer, without domain suffixes, which is used in SALOME.
+The container process is created here if it does not exists, and a new
+component instance is created::
+
+   import salome
+   salome.salome_init()
+   import LifeCycleCORBA
+   lcc = LifeCycleCORBA.LifeCycleCORBA()
+
+   import Utils_Identity
+   host  = Utils_Identity.getShortHostName()
+
+   import Engines
+   params={}
+   params['hostname']=host
+   params['container_name']='myContainer'
+   comp=lcc.LoadComponent(params,'SalomeTestComponent')
+   comp.Coucou(1)
+
+.. _Utils_Identity: ./tui/KERNEL/namespaceUtils__Identity.html
+
+If you want to get a list of containers and component instances, client object
+from orbmodule_ provides a list::
+
+   import orbmodule
+   clt=orbmodule.client()
+   clt.showNS()
+
+.. _orbmodule: ./tui/KERNEL/classorbmodule_1_1client.html
+
+The list looks like::
+
+   Logger.
+   ContainerManager.object
+   Containers.dir
+     cli70ac.dir
+       FactoryServerPy.object
+       SuperVisionContainer.object
+       FactoryServer.object
+       FactoryServer.dir
+         SalomeTestComponent_inst_1.object
+       myContainer.object
+       myContainer.dir
+         SalomeTestComponent_inst_1.object
+         SalomeTestComponent_inst_2.object
+   Registry.object
+   Kernel.dir
+     ModulCatalog.object
+     Session.object
+   Study.dir
+     Study2.object
+     extStudy_1.object
+     extStudy_2.object
+     extStudy_3.object
+   myStudyManager.object
+   SalomeAppEngine.object
+
+
+File transfer service
+---------------------
+
+See FileTransferCORBA_ for the C++ interface (Python interface obtained with
+SWIG is very similar).
+
+.. _FileTransferCORBA: ./tui/KERNEL/classSALOME__FileTransferCORBA.html
+
+The following example shows how to tranfer a file from a remote host to the
+client computer. Remote hostname is 'cli76cc', we would like to copy
+'tkcvs_8_0_3.tar.gz' from remote to local computer. A full pathname is
+required. A container is created on remote computer if it does not exist,
+to handle the file transfer::
+
+   import salome
+   salome.salome_init()
+
+   import LifeCycleCORBA
+   remotefile="/home/prascle/tkcvs_8_0_3.tar.gz"
+   aFileTransfer=LifeCycleCORBA.SALOME_FileTransferCORBA('cli76cc',remotefile)
+   localFile=aFileTransfer.getLocalFile()
+
+
+CORBA Naming service access
+---------------------------
+
+See SALOME_NamingService_ for the C++ interface. The Python interface
+SALOME_NamingServicePy_ is not yet derived from the C++ interface and offers
+only the most useful functions.
+
+.. _SALOME_NamingService: ./tui/KERNEL/classSALOME__NamingService.html
+.. _SALOME_NamingServicePy: ./tui/KERNEL/classSALOME__NamingServicePy_1_1SALOME__NamingServicePy__i.html
+
+Batch services
+--------------
+
+See Batch_ documentation (in french only).
+
+.. _Batch: ./Batch.html/index.html
+
+All IDL Interfaces
+==================
+
+Containers and component life cycle, File transfer service
+----------------------------------------------------------
+
++-----------------------------+-----------------------------------------------+
+| Engines_                    | Engines CORBA module.                         |
++=============================+===============================================+
+| Component_                  | Generic component interface.                  |
+|                             | All SALOME components inherit this interface  |
++-----------------------------+-----------------------------------------------+
+| Container_                  | Container: host for C++ and Python components |
+|                             | components instances                          |
++-----------------------------+-----------------------------------------------+
+| FileTransfer_               | Agent for file transfer created by a container|
+|                             | copy a local file to a distent client         |
++-----------------------------+-----------------------------------------------+
+| FileRef_                    | Reference to a file, used by a container for  |
+|                             | file transfers                                |
++-----------------------------+-----------------------------------------------+
+| ContainerManager_           | Unique instance, in charge of container       |
+|                             | creation on remote computers                  |
++-----------------------------+-----------------------------------------------+
+| MPIContainer_               | An exemple of parallel implementation for     |
+|                             | containers and components                     |
++-----------------------------+-----------------------------------------------+
+| MPIObject_                  |                                               |
++-----------------------------+-----------------------------------------------+
+
+Study management
+----------------
+
++-----------------------------+-----------------------------------------------+
+| SALOMEDS_                   | SALOMEDS CORBA module                         |
++=============================+===============================================+
+| SALOMEDSidl_                |                                               |
++-----------------------------+-----------------------------------------------+
+| SALOMEDS_Attributes_        |                                               |
++-----------------------------+-----------------------------------------------+
+
+High speed transfer, object life cycle, exceptions, GUI interface...
+--------------------------------------------------------------------
+
++-----------------------------+-----------------------------------------------+
+| SALOME_                     | SALOME CORBA module                           |
++=============================+===============================================+
+| SALOME_Comm_                |                                               |
++-----------------------------+-----------------------------------------------+
+| SALOME_GenericObj_          |                                               |
++-----------------------------+-----------------------------------------------+
+| SALOME_Exception_           |                                               |
++-----------------------------+-----------------------------------------------+
+| SALOME_Session_             |                                               |
++-----------------------------+-----------------------------------------------+
+
+Miscelleanous
+-------------
++-----------------------------+-----------------------------------------------+
+|                             | other CORBA modules                           |
++=============================+===============================================+
+| SALOME_ModuleCatalog_       |                                               |
++-----------------------------+-----------------------------------------------+
+| SALOME_RessourcesCatalog_   |                                               |
++-----------------------------+-----------------------------------------------+
+| SALOME_Registry_            |                                               |
++-----------------------------+-----------------------------------------------+
+| Logger_                     |                                               |
++-----------------------------+-----------------------------------------------+
+
+**Other idl for test purposes**
+nstest.idl
+SALOME_TestComponent.idl
+SALOME_TestModuleCatalog.idl
+SALOME_TestMPIComponent.idl
+TestNotif.idl
+
+.. _Engines:           ./tui/KERNEL/namespaceEngines.html
+.. _Component:         ./tui/KERNEL/interfaceEngines_1_1Component.html
+.. _Container:         ./tui/KERNEL/interfaceEngines_1_1Container.html
+.. _fileTransfer:      ./tui/KERNEL/interfaceEngines_1_1fileTransfer.html
+.. _fileRef:           ./tui/KERNEL/interfaceEngines_1_1fileRef.html
+.. _ContainerManager:  ./tui/KERNEL/interfaceEngines_1_1ContainerManager.html
+.. _MPIContainer:      ./tui/KERNEL/interfaceEngines_1_1MPIContainer.html
+.. _MPIObject:         ./tui/KERNEL/interfaceEngines_1_1MPIObject.html
+.. _SALOME:                   ./tui/KERNEL/namespaceSALOME.html
+.. _SALOMEDS:                 ./tui/KERNEL/namespaceSALOMEDS.html
+.. _SALOME_Component:         ./tui/KERNEL/SALOME__Component_8idl.html
+.. _SALOME_ContainerManager:  ./tui/KERNEL/SALOME__ContainerManager_8idl.html
+.. _SALOMEDSidl:              ./tui/KERNEL/SALOMEDS_8idl.html
+.. _SALOMEDS_Attributes:      ./tui/KERNEL/SALOMEDS__Attributes_8idl.html
+.. _SALOME_ModuleCatalog:     ./tui/KERNEL/SALOME__ModuleCatalog_8idl.html
+.. _SALOME_RessourcesCatalog: ./tui/KERNEL/SALOME__RessourcesCatalog_8idl.html
+.. _SALOME_Registry:          ./tui/KERNEL/SALOME__Registry_8idl.html
+.. _Logger:                   ./tui/KERNEL/Logger_8idl.html
+.. _SALOME_Comm:              ./tui/KERNEL/SALOME__Comm_8idl.html
+.. _SALOME_GenericObj:        ./tui/KERNEL/SALOME__GenericObj_8idl.html
+.. _SALOME_Exception:         ./tui/KERNEL/SALOME__Exception_8idl.html
+.. _SALOME_Session:           ./tui/KERNEL/SALOME__Session_8idl.html
+.. _SALOME_MPIContainer:      ./tui/KERNEL/SALOME__MPIContainer_8idl.html
+.. _SALOME_MPIObject:         ./tui/KERNEL/SALOME__MPIObject_8idl.html
+
+
+-------------------------------------------------------------------------------
+
++----------------------------------+------------------------------------------+
+| `General KERNEL documentation`_  | `End User KERNEL Doxygen documentation`_ |
++----------------------------------+------------------------------------------+
+
+.. _`General KERNEL documentation`:           ./index.html
+.. _`End User KERNEL Doxygen documentation`:  ./tui/KERNEL/index.html
diff --git a/doc/SALOME_Application.txt b/doc/SALOME_Application.txt
new file mode 100644 (file)
index 0000000..0abcaed
--- /dev/null
@@ -0,0 +1,353 @@
+======================================================================
+SALOME Application Concept. Configuration for one or more computers
+======================================================================
+
+*html version of this document is produced with docutils*::
+
+  rst2html doc.txt > doc.html
+
+This document corresponds to SALOME2 3.2.0
+
+.. contents::
+.. sectnum::
+
++-------------------------------------------+
+| **WORK in PROGRESS, INCOMPLETE DOCUMENT** |
++-------------------------------------------+
+
+-------------------------------------------------------------------------------
+
+The following explains how to configure your own application with your list of
+modules, how to define and run this application on one or more computers.
+
+General principles
+------------------
+
+A SALOME application is defined by a set of modules (GEOM, SMESH, ASTER...).
+
+A SALOME User can define several SALOME Applications. These applications are
+runnable from the same user account. These applications may share the same 
+KERNEL and modules. Thus, the application configuration is independant of
+KERNEL and must not be put in KERNEL_ROOT_DIR.
+
+Furthermore, prerequisites may not be the same on all the applications.
+
+A SALOME Session can run on a several computers.
+
+Binary modules and prerequisites are installed on the different computers.
+There is no need to have all the modules on each computer (the minimum is
+KERNEL).
+
+There is no need of standardization or centralised information on the details
+of configuration on each computer (PATH, LD_LIBRARY_PATH, environment
+variables) provided the application modules are version - compatible. Details
+of configuration stay private to the computer, and are held by scripts on each
+computer.
+
+There is no hierarchy between the computers (for example only one master
+computer used to launch application).
+
+The SALOME user has an account on all the computers. Access between
+account@computer is via rsh or ssh and must be configured for use without
+password (key exchange for ssh). Account may be different on each
+computer.
+
+Application Directory
+---------------------
+
+Two ways for creation of an application directory
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+First way - references to different module directories
+''''''''''''''''''''''''''''''''''''''''''''''''''''''
+
+The script createAppli.sh in ${KERNEL_ROOT_DIR}/bin/salome creates an
+application directory with the given path in parameter. ${APPLI} is a path 
+relative to ${HOME}.
+
+The directory is only a skeleton, the user has to edit several files to
+configure his own application. These files are described after, the list is:
+
+- env.d/atFirst.sh
+- env.d/envProducts.sh
+- env.d/envSalome.sh
+- CatalogResources.xml
+- SalomeApp.xml
+
+Second and easiest way - one single virtual install directory
+'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
+
+The user must create a SALOME application configuration file by modifying a
+copy of ${KERNEL_ROOT_DIR}/bin/salome/config_appli.xml.
+The file describes the list of SALOME modules used in the application, with
+their respective installation path. The configuration file also defines the
+path of an existing script which sets the SALOME prerequisites,
+and optionnaly, the path of samples directory (SAMPLES_SRC).
+The following command::
+
+    python <KERNEL_ROOT_DIR>/bin/salome/appli_gen.py --prefix=<install directory> --config=<configuration file>
+
+creates a virtual installation of SALOME in the application directory ${APPLI}
+(bin, lib, doc, share...), with, for each file (executable, script, data,
+library, resources...), symbolic links to the actual file.
+
+Providing an existing an existing script for SALOME prerequisites (the same one
+used for modules compilation, or given with the modules installation), the
+installation works without further modification for a single computer (unless
+some modules needs a special environment not defined in the above script).
+For a distributed application (several computers), one must copy and adapt
+CatalogResources.xml from ${KERNEL_ROOT_DIR}/bin/salome/appliskel (see below).
+
+General rules
+-------------
+
+Directory ${APPLI} must be created on each computer of the application.
+The easiest way is to use the same relative path (to ${HOME}) on each computer.
+(Sometimes it is not possible to use the same path everywhere, for instance
+when ${HOME} is shared with NFS, so it is possible to define different path
+following the computers).
+
+The ${APPLI} directory contains scripts for environment and runs. Environment
+scripts must be configured (by the user) on each computer. All the environment
+scripts are in the ${APPLI}/env.d directory. 
+
+The script  ${APPLI}/envd sources **all** the files (\*.sh) in ${APPLI}/env.d
+in alphanumeric order (after edition, think to remove backup files). the envd
+script is used by run scripts.
+
+
+env.d scripts
+~~~~~~~~~~~~~
+With the first way of installation, each user **must define** his own
+configuration for these scripts, following the above rules.
+With the virtual installation (second way, above), env.d
+scripts are built automatically.
+
+ **The following is only an example proposed by createAppli.sh, (first way of installation) not working as it is**.
+
+atFirst.sh
+    Sets the computer configuration not directly related to SALOME,
+    like useful tools, default PATH.
+
+envProducts.sh
+    Sets the SALOME prerequisites.
+
+envSALOME.sh
+    Sets all the MODULE_ROOT_DIR that can be used in the SALOME application.
+
+    SalomeAppConfig is also defined by::
+
+      export SalomeAppConfig=${HOME}/${APPLI}
+
+    where SalomeAppConfig designates the directory containing SalomeApp.xml. 
+    Note that ${APPLI} is already defined by the calling scripts when 
+    env.d/envSalome.sh is sourced.
+
+User run scripts
+~~~~~~~~~~~~~~~~
+
+The SALOME user can use 4 scripts:
+
+runAppli
+   Launches a SALOME Session
+   (similar to ${KERNEL_ROOT_DIR}/bin/salome/runSalome but with a different
+   name to avoid confusions).
+
+runSession
+   Launches a shell script in the SALOME application environment, with access
+   to the current (last launched) SALOME session (naming service), if any.
+   Without arguments, the script is interactive. With arguments, the script
+   executes the command in the SALOME application environment.
+
+runConsole
+   Gives a python console connected to the current SALOME Session.
+   It is also possible to use runSession, then python.
+
+runTests
+   Similar to runSession, used for unit testing. runSession tries to use an
+   already existing naming service definition from a running session (hostname
+   and port number), runTests defines a new configuration for naming service
+   (new port number).
+
+SALOME internal run scripts
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+envd
+   Sets SALOME application environment, envd is sourced by other scripts.
+
+For remote calls, SALOME uses one script.
+
+runRemote.sh
+   This script is mainly used to launch containers. The first 2 arguments
+   define the hostname and port userd for naming service, the remaining
+   arguments define the command to execute.
+
+Other configuration files
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+SalomeApp.xml
+   This file is similar to the default given
+   in ${GUI_ROOT_DIR}/share/salome/resources/gui
+
+
+CatalogRessources.xml
+   This files describes all the computers the application can use. The given
+   example is minimal and suppose ${APPLI} is the same relative path
+   to ${HOME}, on all the computers. A different directory can be set on a
+   particular computer with a line::
+
+       appliPath="my/specific/path/on/this/computer"
+
+
+Examples of use
+---------------
+
+Launch a SALOME session with a GUI interface
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Launch is done with a command like::
+
+   ./runAppli --logger
+
+The --logger option means here : collect all the traces from the all the
+distributed process, via CORBA, in a single file : logger.log.
+
+There are a lot of options, a complete list is given by::
+
+   ./runAppli --help
+
+Note that, without argument, runAppli is a non interactive Python application,
+and, with arguments, runAppli is an interactive Python interpreter.
+
+Several options are already defined by default in SalomeApp.xml files. Optional
+arguments given in the command override the SalomeApp.xml configuration.
+
+Several sessions can run simultaneously, each session use a different port for
+CORBA naming service, so the sessions are totally separated from each other.
+
+When the GUI is closed, the different SALOME servers are still running.
+
+Close a SALOME session, kill all the servers
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Inside the interactive python interpreter you get when you use runAppli
+with arguments, you can kill all the servers of your session with::
+
+   >>> killLocalPort()
+
+or the servers of all the sessions with::
+
+   >>> killAllPorts()
+
+If you have no active Python interpreter connected to your session, you can
+kill all the SALOME servers of **all the sessions** on a given computer::
+
+   ./runSession killSalome.py
+
+Remember! it's the same idea in *Windows (R) operating system* [#]_ :
+use the start menu to stop...
+
+When you use only one session at a time, you don't need more.
+
+To kill a given session (when several session are running), one needs
+the naming service port number::
+
+   ./runSession killSalomeWithPort 2810
+
+Note that the port number of the last launched session can be found on Linux,
+in the prompt, within a runSession shell (see below).
+
+It is also possible to get the Naming Service host and port number of
+the last launched session with::
+
+   ./runSession NSparam.py
+
+.. [#] Microsoft and Windows are either registered trademarks or trademarks of
+       Microsoft Corporation in the United States and/or other countries.
+
+Launch a SALOME session without GUI interface
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This is used to launch a SALOME Python script without GUI
+(no GUI server = SALOME_session_server)
+
+Example of script (test_session_geom.py)::
+
+   import salome_session
+   salome_session.startSession(modules=["GEOM"])
+   import GEOM_usinggeom
+   raw_input("Press a key and the servers will be killed ...")
+
+This script is run in a non interactive way with::
+
+   ./runSession python test_session_geom.py
+
+All the process are automatically killed when Python is closed
+(with salome_session delete).
+
+Add an external Python interpretor to a running session
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+It's often easier to develop and try Python scripts outside the GUI embedded
+Python interpreter. Imagine, for instance, you are writing a script involving
+geometry and mesh modules.
+first, launch a SALOME session with gui, then, on another terminal::
+
+   ./runSession
+   python
+
+Import salome module. salome_init() without arguments creates a new study
+in the running session (note: salome_init(n) attachs to a running session whose
+studyId is n)::
+
+   import salome
+   salome.salome_init()
+
+An example of script given with SMESH::
+
+   import ex01_cube2build
+
+It is possible to connect the GUI interface to the study created in the above
+script with the file/connect menu, then browse study and display objects.
+Further modifications on study can be done either with GUI or external script
+(use refresh popup in GUI object browser to see study modifications generated
+by the external script). **AVOID modifications with GUI when a Python script
+is running**. Not all the modules are protected against concurrent actions...
+
+
+Different uses of the runSession shell interpreter
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+runSession invoked without arguments gives an interactive shell with the full
+environment of SALOME (PATH, LD_LIBRARY_PATH, PYTHONPATH, other variables).
+If there are running sessions of the same SALOME application, runSession
+connects to the last launched session (i.e. gets the naming service references
+of the session: hostname and port)
+
+On Linux, the shell prompt (bash) gives information on naming service
+references, hostname and port::
+
+   [NS=cli76cc:2811]prascle@cli76cc:~/SALOME2/Run/Virtual$
+
+If there is no running session, prompt looks like::
+
+   [NS=:]prascle@cli76cc:~/SALOME2/Run/Virtual$
+
+runSession is useful to launch any script or program which needs the complete
+SALOME environment, with or without a session already running.
+For instance, to launch the ddd debugger interface on the gui server, first
+launch a SALOME session with gui, then, on another terminal::
+
+   ./runSession ddd
+
+Then attach to the running SALOME_Session_Server process.
+
+
+-------------------------------------------------------------------------------
+
++----------------------------------+------------------------------------------+
+| `General KERNEL documentation`_  | `End User KERNEL Doxygen documentation`_ |
++----------------------------------+------------------------------------------+
+
+.. _`General KERNEL documentation`:           ./index.html
+.. _`End User KERNEL Doxygen documentation`:  ./tui/KERNEL/index.html
diff --git a/doc/UnitTests.txt b/doc/UnitTests.txt
new file mode 100644 (file)
index 0000000..987db0e
--- /dev/null
@@ -0,0 +1,217 @@
+=================================================================
+Source code structuration and Unit Tests
+=================================================================
+
+*html version of this document is produced with docutils*::
+
+  rst2html < doc.txt > doc.html
+
+*This document corresponds to SALOME2 3.2.0*
+
+.. contents::
+.. sectnum::
+
++-------------------------------------------+
+| **WORK in PROGRESS, INCOMPLETE DOCUMENT** |
++-------------------------------------------+
+
+-------------------------------------------------------------------------------
+
+You will find here general information on code directories structure,
+unit tests associated to the different kind of classes, and how to run
+the unit tests.
+
+SALOME KERNEL source code structuration
+=======================================
+
+General structure of KERNEL_SRC
+-------------------------------
+
+KERNEL_SRC
+   Some README files and configuration tools for build
+
+KERNEL_SRC/adm_local
+   Part of the configuration files, other modules have a directory with the
+   same name. Not used in KERNEL.
+
+KERNEL_SRC/bin
+   Python and shell scripts used at run time.
+   Kit to install a SALOME Application.
+
+KERNEL_SRC/doc
+   Kit for KERNEL end user documentation production:
+   public interfaces, Python, CORBA.
+   Integrator and Developper documentation.
+
+KERNEL_SRC/idl
+   All CORBA interfaces from KERNEL are regrouped here.
+
+KERNEL_SRC/resources
+   Configuration files for servers (examples).
+   Interfaces definitions for KERNEL test components.
+
+KERNEL_SRC/salome_adm
+   Configuration files used by autotools (M4 macros & co.)
+
+KERNEL_SRC/src
+   The source code (C++ and Python)
+   
+
+Directory src: C++ and Python source code
+-----------------------------------------
+
+Basic services non related to CORBA
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Basics
+  A set of general purpose C++ services, not related to CORBA.
+  Some general purpose services that are in Utils directory (CORBA related),
+  are progressivley moved here, as they are not related to CORBA.
+  
+
+SALOMELocalTrace
+  A multithread trace system that allows message tracing on standard error
+  or a file. 
+
+CASCatch
+  Exceptions and signal handler.
+
+HDFPersist
+  A C++ interface to HDF.
+
+Basic CORBA services
+~~~~~~~~~~~~~~~~~~~~
+
+Logger
+  A CORBA server that collects the trace messages from differents CORBA 
+  process. 
+
+SALOMETraceCollector
+  A multithread trace system derived from SALOMELocalTrace, that sends messages
+  to Logger server via CORBA.
+
+Utils
+  A set of general purpose services related to CORBA, such as basic CORBA
+  exception system. See also Basics directory above.
+
+NamingService
+  C++ and Python interfaces to name, store and retrieve CORBA objects
+
+GenericObj
+  A generic CORBA interface for CORBA objects, to count distributed references,
+  and to allow destruction by client. 
+
+Miscellaneous CORBA servers
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Registry
+  Implements SALOME_registry.idl.
+  Provides a CORBA server library and a separate server program.
+
+ModuleCatalog
+  Implements SALOME_moduleCatalog.idl.
+  Provide a CORBA server library and separate server and client programs.
+
+ModuleGenerator
+  Tool to generate a module catalog from CORBA idl
+
+ResourcesManager
+  library included in container server
+
+Notification
+  library included in differents servers (container)
+
+NOTIFICATION_SWIG
+
+
+CORBA Containers for SALOME Modules
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Container
+
+TestContainer
+
+LifeCycleCORBA
+
+LifeCycleCORBA_SWIG
+
+STUDY server and related interfaces and tools
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+SALOMEDSClient
+
+TOOLSDS
+
+SALOMEDSImpl
+
+SALOMEDS
+
+Python interface to SALOME
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+KERNEL_PY
+
+Efficient CORBA transfer services
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Communication
+
+Communication_SWIG
+
+A Parallel container with MPI
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+MPIContainer
+
+TestMPIContainer
+
+Batch interface library
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Batch
+
+Batch_SWIG
+
+Unit tests
+~~~~~~~~~~
+
+UnitTests
+
+
+Tools and principles used for Unit testing
+==========================================
+
+**TO BE COMPLETED**
+
+Unit Testing rely on cppunit package for C++ testing, and on unittest module
+for Python. See these products for general principles of unit testing.
+
+The cppunit package is optional. When the prerequisite is detected, the unit
+tests are compiled.
+
+Unit Tests sources are in directories Test under the src/directories
+containing the classes to test.
+
+Test are ordered following the order of directories given above.
+
+Tests can be run as a whole, or for a particular directory. In this case, only
+a partial test is run (the classes to test, and the classes used, i.e. the 
+preceding test directories).
+
+
+Today, only some tests are written as an example. There are not yet python
+scripts in KERNEL_SRC, but it's a matter of days, there are working scripts
+to test LifeCycleCORBA_SWIG interface.
+
+
+
+
+
+-------------------------------------------------------------------------------
+
++----------------------------------+------------------------------------------+
+| `General KERNEL documentation`_  | `End User KERNEL Doxygen documentation`_ |
++----------------------------------+------------------------------------------+
+
+.. _`General KERNEL documentation`:           ./index.html
+.. _`End User KERNEL Doxygen documentation`:  ./tui/KERNEL/index.html
diff --git a/doc/index.txt b/doc/index.txt
new file mode 100644 (file)
index 0000000..0120b1d
--- /dev/null
@@ -0,0 +1,113 @@
+=================================================================
+KERNEL common Services
+=================================================================
+
+*html version of this document is produced with docutils*::
+
+  rst2html < doc.txt > doc.html
+
+*This document corresponds to SALOME2 3.2.0*
+
+.. contents::
+.. sectnum::
+
++-------------------------------------------+
+| **WORK in PROGRESS, INCOMPLETE DOCUMENT** |
++-------------------------------------------+
+
+-------------------------------------------------------------------------------
+
+**General information, for users, integrators and developers**
+
+**Users, integrators and developers, which documentation ?**
+
+Following your kind of usage of SALOME, you will find some specific 
+introductory documentation, listed below.
+
+End user
+========
+
+How to configure a SALOME application
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The end user may have to configure his own SALOME application by selection of a
+subset of availables SALOME modules. He also may want to install his
+application on several computers. 
+
+See SALOME_Application_ to define your own configuration of SALOME and run it  
+on one or several computers. This is the recommended way of configuration.
+
+.. _SALOME_Application: ./SALOME_Application.html
+
+
+How to launch SALOME in a SALOME application
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+See SALOME_Application_.
+
+How to use KERNEL services in Python scripts
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The SALOME KERNEL offers offers a list of services available in Python.
+
+See KERNEL_Services_.
+
+.. _KERNEL_Services: ./KERNEL_Services.html
+
+Application Integrator
+======================
+
+Applications integrators are in charge of configuration and installation of
+specific SALOME applications over a local network. Application Integrators 
+built SALOME modules binaries from sources tarballs.
+
+How to install SALOME
+~~~~~~~~~~~~~~~~~~~~~
+
+See INSTALL_ for general information on required configuration and 
+prerequisites, compilation procedure, setting environment principles.
+
+.. _INSTALL: ./INSTALL.html
+
+How to configure a SALOME application
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+See SALOME_Application_ to define your own configuration of SALOME and run it  
+on one or several computers. This is the recommended way of configuration.
+
+.. _SALOME_Application: ./SALOME_Application.html
+
+
+Module maintainer
+=================
+
+Module maintainers are in charge of the development and debug of the SALOME
+modules. Each SALOME module is stored in a CVS base. CVS bases are organised
+in separate branches for developments and debug. All official or development
+releases are identified by a CVS tag.
+
+Source code structuration and Unit Tests
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+See UnitTests_ for general information on code directories structure,
+unit tests associated to the different kind of classes, and how to run
+the unit tests.
+
+.. _UnitTests: ./UnitTests.html
+
+Some development utilities
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+See kernel_resources_ for information on basic utilities for C++ and Python
+development, like trace and debug, exceptions, singleton.
+
+.. _kernel_resources: ./kernel_resources.html
+
+-------------------------------------------------------------------------------
+
++----------------------------------+------------------------------------------+
+| `General KERNEL documentation`_  | `End User KERNEL Doxygen documentation`_ |
++----------------------------------+------------------------------------------+
+
+.. _`General KERNEL documentation`:           ./index.html
+.. _`End User KERNEL Doxygen documentation`:  ./tui/KERNEL/index.html
diff --git a/doc/kernel_resources.txt b/doc/kernel_resources.txt
new file mode 100644 (file)
index 0000000..0bc9700
--- /dev/null
@@ -0,0 +1,507 @@
+======================================================================
+SALOME Kernel resources for developer
+======================================================================
+
+*html version of this document is produced with docutils*::
+
+  rst2html doc.txt > doc.html
+
+*This document corresponds to SALOME2 3.2.0*
+
+:Authors:
+   Antoine Yessayan,
+   Paul Rascle
+
+:Version:  0.3 - february 17, 2006
+
++-------------------------------------------+
+| **WORK in PROGRESS, INCOMPLETE DOCUMENT** |
++-------------------------------------------+
+
+-------------------------------------------------------------------------------
+
+**Abstract**
+
+This document describes the development environment for 
+C++ and Python. Makefiles generation and usage are 
+introduced in another document: "using the SALOME 
+configuration and building system environment". 
+Development environment is intended here as: trace and 
+debug macros usage; SALOME exceptions usage, in C++ and 
+Python; user CORBA exceptions usage, in C++ and Python, 
+with and without Graphical User Interface; some general 
+purpose services such as singleton, used for CORBA 
+connection and disconnection.
+
+.. contents::
+.. sectnum::
+
+-------------------------------------------------------------------------------
+
+Trace and debug Utilities
+=========================
+
+During the development process, an execution log is 
+useful to identify problems. This log contains 
+messages, variables values, source files names and line 
+numbers. It is recommended to verify assertions on 
+variables values and if necessary, to stop the 
+execution at debug time, in order to validate all parts 
+of code.
+
+Two modes: debug and release
+----------------------------
+
+The goal of debug mode is to check as many features as 
+possible during the early stages of the development 
+process. The purpose of the utilities provided in 
+SALOME is to help the developer to add detailed traces 
+and check variables values, without writing a lot of code.
+
+When the code is assumed to be valid, the release mode 
+optimizes execution, in terms of speed, memory, and 
+display only user level messages.
+
+But, some informations must always be displayed in both 
+modes: especially messages concerning environment or 
+internal errors, with version identification. When an 
+end user is confronted to such a message, he may refer 
+to a configuration documentation or send the message to 
+the people in charge of SALOME installation, or to the 
+development team, following the kind of error.
+
+C++ Macros for trace and debug
+------------------------------
+
+SALOME provides C++ macros for trace and debug. These 
+macros are in::
+
+  KERNEL_SRC/src/SALOMELocalTrace/utilities.h
+
+This file must be included in C++ source. Some 
+macros are activated only in debug mode, others are 
+always activated. To activate the debug mode, ``_DEBUG_``
+must be defined, which is the case when SALOME 
+Makefiles are generated from configure, without 
+options. When ``_DEBUG_`` is undefined (release mode: 
+``configure --disable-debug --enable-production``), the 
+debug mode macros are defined empty (they do nothing). 
+So, when switching from debug to release, it is 
+possible (and recommended) to let the macro calls 
+unchanged in the source.
+
+All the macros generate trace messages, stored in a 
+circular buffer pool. A separate thread reads the 
+messages in the buffer pool, and, depending on options 
+given at SALOME start, writes the messages on the 
+standard output, a file, or send them via CORBA, in 
+case of a multi machine configuration.
+
+Three informations are systematically added in front of 
+the information displayed:
+
+* the thread number from which the message come from;
+
+* the name of the source file in which the macros is set;
+
+* the line number of the source file at which the macro 
+  is set.
+
+Macros defined in debug and release modes
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**INFOS_COMPILATION**
+   The C++ macro INFOS_COMPILATION writes on the trace 
+   buffer pool informations about the compiling process: 
+
+   * the name of the compiler : g++, KCC, CC, pgCC;
+
+   * the date and the time of the compiling processing process.
+
+   This macro INFOS_COMPILATION does not have any 
+   argument. Moreover, it is defined in both compiling 
+   mode : _DEBUG_ and _RELEASE_.
+
+   Example::
+
+     #include "utilities.h"
+     int main(int argc , char **argv) 
+     { 
+       INFOS_COMPILATION;
+       ...
+     }
+     INFOS(str)
+
+**INFOS**
+   In both compiling mode _DEBUG_ and _RELEASE_, The C++ 
+   macro INFOS writes on the trace buffer pool the string 
+   which has been passed in argument by the user.
+
+   Example:: 
+
+     #include "utilities.h"
+     int main(int argc , char **argv)
+     { 
+       ... 
+       INFOS("NORMAL END OF THE PROCESS"); 
+       return 0; 
+     }
+
+   displays::
+
+      main.cxx [5] : NORMAL END OF THE PROCESS
+
+
+**INTERRUPTION(str)**
+   In both compiling mode _DEBUG_ and _RELEASE_, The C++ 
+   macro INTERRUPTION writes on the trace buffer pool the 
+   string, with a special ABORT type. When the thread in 
+   charge of collecting messages finds this message, it 
+   terminates the application, after message treatment.
+
+**IMMEDIATE_ABORT(str)**
+   In both compiling mode _DEBUG_ and _RELEASE_, The C++ 
+   macro IMMEDIATE_ABORT writes the message str immediately on 
+   standard error and exits the application. Remaining 
+   messages not treated by the message collector thread 
+   are lost.
+
+Macros defined only in debug mode
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+**MESSAGE(str)**
+   In _DEBUG_ compiling mode only, the C++ macro MESSAGE 
+   writes on the trace buffer pool the string which has 
+   been passed in argument by the user. In _RELEASE_ 
+   compiling mode, this macro is blank.
+
+   Example:: 
+
+     #include "utilities.h" 
+     #include <string> 
+
+     using namespace std; 
+
+     int main(int argc , char **argv) 
+     { 
+       ... 
+       const char *str = "Salome";
+       MESSAGE(str);
+       ... const string st; 
+       st = "Aster"; 
+       MESSAGE(c_str(st+" and CASTEM")); 
+       return 0;
+     }
+
+   displays::
+
+     - Trace main.cxx [8] : Salome
+     - Trace main.cxx [12] : Aster and CASTEM
+
+**BEGIN_OF(func_name)**
+   In _DEBUG_ compiling mode, The C++ macro BEGIN_OF 
+   appends the string "Begin of " to the one passed in 
+   argument by the user and displays the result on the 
+   trace buffer pool. In _RELEASE_ compiling mode, this 
+   macro is blank.
+
+   Example:: 
+
+      #include "utilities.h" 
+      int main(int argc , char **argv) 
+      { 
+        BEGIN_OF(argv[0]);
+        return 0;
+      }
+
+   displays:: 
+
+     - Trace main.cxx [3] : Begin of a.out
+
+
+**END_OF(func_name)**
+   In _DEBUG_ compiling mode, The C++ macro END_OF appends 
+   the string "Normal end of " to the one passed in 
+   argument by the user and displays the result on the 
+   trace buffer pool. In _RELEASE_ compiling mode, this 
+   macro is blank.
+
+   Example:: 
+
+      #include "utilities.h" 
+      int main(int argc , char **argv) 
+      { 
+        END_OF(argv[0]);
+        return 0; 
+      }
+
+   displays::
+
+      - Trace main.cxx [4] : Normal end of a.out
+
+**SCRUTE(var)**
+   In _DEBUG_ compiling mode, The C++ macro SCRUTE 
+   displays its argument which is an application variable 
+   followed by the value of the variable. In _RELEASE_ 
+   compiling mode, this macro is blank.
+
+   Example::
+
+      #include "utilities.h"
+      int main(int argc , char **argv) 
+      { 
+        const int i=999;
+        if( i > 0 ) SCRUTE(i) ; i=i+1;
+        return 0;
+      }
+
+   displays::
+
+      - Trace main.cxx [5] : i=999
+
+**ASSERT(condition)**
+   In _DEBUG_ compiling mode only, The C++ macro ASSERT 
+   checks the expression passed in argument to be not 
+   NULL. If it is NULL the condition is written with the 
+   macro INTERRUPTION (see above). The process exits after 
+   trace of this last message. In _RELEASE_ compiling 
+   mode, this macro is blank. N.B. : if ASSERT is already 
+   defined, this macro is ignored.
+
+   Example::
+
+      #include "utilities.h" 
+      ... 
+      const char *ptrS = fonc();
+      ASSERT(ptrS!=NULL); 
+      cout << strlen(ptrS); 
+      float table[10];
+      int k;
+      ... 
+      ASSERT(k<10);
+      cout << table[k];
+
+Exceptions
+==========
+
+C++ exceptions: class SALOME_Exception
+--------------------------------------
+
+definition
+~~~~~~~~~~
+
+The class SALOME_Exception provides a generic method to 
+send a message, with optional source file name and line 
+number. This class is intended to serve as a base class 
+for all kinds of exceptions SALOME code. All the 
+exceptions derived from SALOME_Exception could be 
+handled in a single catch, in which the message 
+associated to the exception is displayed, or sent to a 
+log file.
+
+The class SALOME_Exception inherits its behavior from 
+the STL class exception.
+
+usage
+~~~~~
+
+The header SALOME/src/utils/utils_SALOME_Exception.hxx 
+must be included in the C++ source, when raised or trapped::
+
+   #include "utils_SALOME_Exception.hxx"
+
+The SALOME_Exception constructor is::
+
+   SALOME_Exception( const char *text,
+                     const char *fileName=0, 
+                     const unsigned int lineNumber=0 );
+
+The exception is raised like this::
+
+   throw SALOME_Exception("my pertinent message");
+
+or like this::
+
+   throw SALOME_Exception(LOCALIZED("my pertinent message"));
+
+where LOCALIZED is a macro provided with 
+``utils_SALOME_Exception.hxx`` which gives file name and 
+line number.
+
+The exception is handled like this::
+
+   try
+     {
+       ...
+     }
+   catch (const SALOME_Exception &ex)
+     {
+       cerr << ex.what() <<endl;
+     }
+
+The what() method overrides the one defined in the STL 
+exception class.
+
+CORBA exceptions
+----------------
+
+definition
+~~~~~~~~~~
+
+The idl SALOME_Exception provides a generic CORBA 
+exception for SALOME, with an attribute that gives an 
+exception type,a message, plus optional source file 
+name and line number. 
+
+This idl is intended to serve for all user CORBA 
+exceptions raised in SALOME code, as IDL specification 
+does not support exception inheritance. So, all the 
+user CORBA exceptions from SALOME could be handled in a 
+single catch.
+
+The exception types defined in idl are:
+
+  - COMM CORBA communication problem,
+
+  - BAD_PARAM Bad User parameters,
+
+  - INTERNAL_ERROR application level problem (often irrecoverable).
+
+CORBA system and user exceptions already defined in the 
+packages used within SALOME, such as OmniORB 
+exceptions, must be handled separately.
+
+usage
+~~~~~
+
+CORBA servant, C++
+^^^^^^^^^^^^^^^^^^
+
+   The CORBA Server header for SALOME_Exception and a 
+   macro to throw the exception are provided with the 
+   header ``KERNEL_SRC/src/Utils/Utils_CorbaException.hxx``::
+
+      #include "Utils_CorbaException.hxx"
+
+   The exception is raised with a macro which appends file 
+   name and line number::
+
+      if (myStudyName.size() == 0)
+        THROW_SALOME_CORBA_EXCEPTION("No Study Name given", 
+                                     SALOME::BAD_PARAM);
+
+CORBA Client, GUI Qt C++
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+   **NO MORE AVAILABLE in SALOME 3.x**
+
+   The CORBA Client header for SALOME_Exception and a Qt 
+   function header that displays a message box are 
+   provided in:
+
+     ``KERNEL_SRC/src/SALOMEGUI/SALOMEGUI_QtCatchCorbaException.hxx``
+
+   ::
+
+     #include "SALOMEGUI_QtCatchCorbaException.hxx"
+
+   A typical exchange with a CORBA Servant will be::
+
+      try
+      {
+        ... // one ore more CORBA calls
+      }
+
+      catch (const SALOME::SALOME_Exception & S_ex)
+      {
+        QtCatchCorbaException(S_ex);
+      }
+
+
+
+CORBA Client, C++, without GUI
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+  Nothing specific has been provided to the developer 
+  yet. See the idl or the Qt function 
+  SALOMEGUI_QtCatchCorbaException.hxx to see how to get 
+  the information given by the exception object.
+
+Miscellaneous tools
+===================
+
+Singleton
+---------
+
+Definition
+~~~~~~~~~~
+
+A singleton is an application data which is created and 
+deleted only once at the end of the application 
+process. The C++ compiler allows the user to create a 
+static singleton data before the first executable 
+statement. They are deleted after the last statement execution.
+
+The ``SINGLETON_`` template class deals with dynamic 
+singleton. It is useful for functor objects. For 
+example, an object that connects the application to a 
+system at creation and disconnects the application at deletion.
+
+Usage
+~~~~~
+
+To create a single instance of a POINT object::
+
+  # include "Utils_SINGLETON.hxx"
+  ... 
+  POINT *ptrPoint=SINGLETON_<POINT>::Instance() ; 
+  assert(ptrPoint!=NULL) ;
+
+No need to delete ptrPoint. Deletion is achieved 
+automatically at exit. If the user tries to create more 
+than one singleton by using the class method 
+SINGLETON_<TYPE>::Instance(), the pointer is returned 
+with the same value even if this is done in different 
+functions (threads ?)::
+
+  POINT *p1=SINGLETON_<POINT>::Instance() ;
+  ... 
+  POINT *p2=SINGLETON_<POINT>::Instance() ; 
+
+  assert(p1==p2)
+
+Design description
+~~~~~~~~~~~~~~~~~~
+
+Here are the principles features of the singleton 
+design:
+
+* the user creates an object of class TYPE by using the 
+  class method ``SINGLETON_<TYPE>::Instance()`` which 
+  returns a pointer to the single object ;
+
+* to create an object, ``SINGLETON_<TYPE>::Instance()`` 
+  uses the default constructor of class TYPE ;
+
+* at the same time, this class method creates a 
+  destructor object which is added to the generic list 
+  of destructor objects to be executed at the end of 
+  the application (atexit) ;
+
+* at the end of the application process all the 
+  deletions are performed by the ``Nettoyage()`` C function 
+  which executes the destruction objects end then 
+  deletes the destructions objects themselves ;
+
+* the ``Nettoyage()`` C  function using ``atexit()`` C  function 
+  is embedded in a static single object ``ATEXIT_()``.
+
+
+-------------------------------------------------------------------------------
+
++----------------------------------+------------------------------------------+
+| `General KERNEL documentation`_  | `End User KERNEL Doxygen documentation`_ |
++----------------------------------+------------------------------------------+
+
+.. _`General KERNEL documentation`:           ./index.html
+.. _`End User KERNEL Doxygen documentation`:  ./tui/KERNEL/index.html
diff --git a/doc/rst.css b/doc/rst.css
new file mode 100644 (file)
index 0000000..38bd7dc
--- /dev/null
@@ -0,0 +1,288 @@
+/*
+:Authors: David Goodger, David Abrahams
+:Contact: goodger@users.sourceforge.net, dave@boost-consulting.com
+:date: $Date$
+:version: $Revision$
+:copyright: This stylesheet has been placed in the public domain.
+
+This stylesheet is for the use of ReStructuredText in a Boost context.
+It is basically an agglomeration of boost.css and the default.css that
+comes from docutils.
+
+ */
+
+.first {
+  margin-top: 0 }
+
+.last {
+  margin-bottom: 0 }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: #00008B }
+
+dd {
+  margin-bottom: 0.5em }
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.attention, div.caution, div.danger, div.error, div.hint,
+div.important, div.note, div.tip, div.warning, div.admonition {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.hint p.admonition-title, div.important p.admonition-title,
+div.note p.admonition-title, div.tip p.admonition-title,
+div.admonition p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em }
+
+div.footer, div.header {
+  font-size: smaller }
+
+div.sidebar {
+  margin-left: 1em ;
+  border: medium outset ;
+  padding: 0em 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+H1.title
+{
+    FONT-SIZE: 150%;
+    COLOR: #00008B;
+    text-align: center
+}
+H1
+{
+    FONT-SIZE: 125%;
+}
+H2
+{
+    FONT-SIZE: 108%;
+}
+h2.subtitle {
+  text-align: center }
+H3
+{
+    FONT-SIZE: 100%;
+}
+BODY
+{
+    FONT-SIZE: 100%;
+    BACKGROUND-COLOR: #ffffff;
+}
+PRE
+{
+    MARGIN-LEFT: 2em;
+    FONT-FAMILY: Courier;
+}
+CODE
+{
+    FONT-FAMILY: Courier;
+    white-space: pre;
+}
+.pre
+{
+    FONT-FAMILY: Courier;
+    white-space: pre;
+}
+.index
+{
+    TEXT-ALIGN: left;
+}
+.page-index
+{
+    TEXT-ALIGN: left;
+}
+.definition
+{
+    TEXT-ALIGN: left;
+}
+.footnote
+{
+    FONT-SIZE: 66%;
+    VERTICAL-ALIGN: super;
+    TEXT-DECORATION: none;
+}
+.function-semantics
+{
+    CLEAR: left;
+}
+
+hr {
+  width: 75% }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.line-block {
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em ;
+  font-size: 80%;
+  border: solid thin gray ;
+  background-color: #eeeeee }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.option-argument {
+  font-style: italic }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+table {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.citation {
+  border-left: solid thin gray ;
+  padding-left: 0.5ex }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.footnote {
+  border-left: solid thin black ;
+  padding-left: 0.5ex }
+
+td, th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+th.docinfo-name, th.field-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap }
+
+/* 
+  dwa 2003/7/29 -- commented out so that it wouldn't override earlier
+  styles from boost.css
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+  font-size: 100% }
+*/
+
+ul.auto-toc {
+  list-style-type: none }
index 3c59afb8b93991a5773d29326515036f303db137..424a716a5174e739ffaddde142f24a7fde14bf73 100644 (file)
@@ -41,4 +41,4 @@ dev_docs:
 EXTRA_DIST= main.dox install.dox \
            kernel_resources.dox kernel_services.dox \
            salome_application.dox unittests.dox \
-           salome_file.dox
+           salome_file.dox kernel_salome.dox
diff --git a/doc/salome/batch.dox b/doc/salome/batch.dox
new file mode 100644 (file)
index 0000000..7e0e4e2
--- /dev/null
@@ -0,0 +1,10 @@
+/*!
+
+\page batch_page Batch
+
+<a href="Batch.html/index.html"> Batch documentation </a>
+
+*/
+
+
+
diff --git a/doc/salome/kernel_salome.dox b/doc/salome/kernel_salome.dox
new file mode 100644 (file)
index 0000000..20acf88
--- /dev/null
@@ -0,0 +1,296 @@
+/*!
+
+\page kernel_salome Using salome.py module
+
+
+The salome.py Python module provides a set of variables and functions
+allowing access to different elements of the current SALOME
+session.
+This page gives a short description of most useful variables and
+functions.
+
+\li \b orb Reference to the CORBA::ORB instance
+
+This variable can be used to initialize different CORBA-related
+elements of the SALOME session (for example, naming service, etc).
+For example, to get an access to the SALOME naming service, you can
+use the following commands:
+\code
+import SALOME_NamingServicePy
+NS = SALOME_NamingServicePy.SALOME_NamingServicePy_i(salome.orb)
+\endcode
+
+The \b orb variable is also useful when it is necessary to convert
+CORBA reference object to its string representation (IOR) and vice
+versa:
+\code
+studyIOR = salome.orb.object_to_string(salome.myStudy)
+study    = salome.orb.string_to_object(studyIOR)
+is_same  = salome.myStudy._is_equivalent(study) # is_same = True
+\endcode
+
+\li \b naming_service SALOME naming service instance
+
+This variable can be used to register/find objects created in a
+distributed environment. For example, to get access to the SALOME
+Module Catalog server, use \c Resolve() method:
+\code
+import SALOME_ModuleCatalog
+mc = salome.naming_service.Resolve('/Kernel/ModulCatalog')
+\endcode
+
+Similarly, method \c Register() can be used to register objects
+in the naming service:
+\code
+salome.naming_service.Register(myObject,'/My/Object/Path')
+o = salome.naming_service.Resolve('/My/Object/Path')
+is_same = myObject._is_equivalent(o) # is_same = True
+\endcode
+
+\li \b lcc Life Cycle CORBA class instance
+
+This object can be used to get access to CORBA engine part of some
+SALOME module, available in the current SALOME session. The following
+code returns a reference to the Geometry module engine, loading it if
+necessary:
+\code
+import GEOM
+geom = salome.lcc.FindOrLoadComponent('FactoryServer', 'GEOM')
+\endcode
+\b Note, that in the above example, \e "FactoryServer" is a name of the
+SALOME container, where Geometry module engine should be loaded.
+
+\li \b myStudyManager Reference to the study manager
+
+SALOMEDS Study manager is used to manipulate with the studies: create,
+open, save, close. It also can be used to find the study by its
+numerical ID or name. The code below demonstrates main
+functionalities of a study manager:
+\code
+# create new study with the name "MyStudy"
+new_study = salome.myStudyManager.NewStudy("MyStudy")
+
+# open study from file /home/user/MyStudy.hdf
+study = salome.myStudyManager.OpenStudy("/home/user/MyStudy.hdf")
+
+# save study
+salome.myStudyManager.Save(study, False) # not using multifile save mode
+
+# save study in ASCII format
+salome.myStudyManager.SaveASCII(study, True) # using multifile save mode
+
+# save study with the new file path
+salome.myStudyManager.SaveAs("/home/user/MyStudy.hdf", study, False)
+
+# save study with the new file path in ASCII format
+salome.myStudyManager.SaveAsASCII("/home/user/MyStudy.hdf", study, False)
+
+# close study
+salome.myStudyManager.Close(study)
+
+# get list of all opened studies
+studies = salome.myStudyManager.GetOpenStudies()
+
+# find study by its numerical ID (integer value starting from 1)
+study = salome.myStudyManager.GetStudyByID(studyID)
+
+# find study by its name
+study = salome.myStudyManager.GetStudyByName("/home/user/MyStudy.hdf")
+
+# ...
+\endcode
+
+\li \b myStudy Reference to the current (active) study
+
+This variable can be used to manipulate with the date of the study:
+create data tree, assign attributes of different types to the objects
+in a data tree, create references between objects, etc.
+
+\b Note, that the term "active" or "current" study does not make much
+sense outise the GUI Python console. When working in GUI, user always
+deals with one only top-level study, which desktop is currently on the
+top if the windows stack. This is what is called \e "active study".
+In TUI mode (without GUI or outside GUI), user has to manipulate with
+studies manually; no any special control for the life cycle of the
+study is done. In TUI mode, \c salome.muStudy variable is an instance
+of the first study created when you call salome_init() function.
+
+The following code demonstrates some examples of \c salome.myStudy
+variable usage. For more details please refer to the SALOMEDS.idl file
+documentation.
+
+\code
+# get study name
+studyName = salome.myStudy._get_Name()
+
+# get study numerical ID
+studyID = salome.myStudy._get_StudyId()
+
+# find SALOMEDS component by its type
+scomponent = FindComponent("MyComponent")
+
+# find SALOMEDS component by its entry ID
+scomponent = FindComponentID("0:1:1") # "0:1:1" is a component ID
+
+# find SALOMEDS object by its name (first found object is returned)
+sobject = salome.myStudy.FindObject("MyObject")
+
+# find SALOMEDS object by its entry ID
+sobject = salome.myStudy.FindObjectID() # "0:1:1:1" is an object ID
+
+# find SALOMEDS object by its IOR attribute
+sobject = salome.myStudy.FindObjectIOR(IOR)
+
+# find SALOMEDS object by its path in the data tree
+sobject = salome.myStudy.FindObjectByPath("/MyComponent/MyObject/MySubObject")
+
+# get SALOMEDS object's path in a study data tree
+sobject_path = salome.myStudy.GetObjectPath(sobject)
+
+# get study properties
+prop = salome.myStudy.GetProperties()
+prop.GetCreationDate() # get creation date
+prop.IsModified() # check if study has been modified (and not yet saved)
+prop.SetLocked(True) # lock the study (prohibit modifications)
+prop.IsLocked() # check if study is locked
+
+# create objects with study builder
+builder = salome.myStudy.NewBuilder() # create builder
+comp = builder.NewComponent("MyComponent") # create a component of the "MyComponent" type
+attrName = builder.FindOrCreateAttribute(comp, "AttributeName")
+attrName.SetValue("MyComponent") # set name to the component
+object = builder.NewObject(comp) # create new object, a child of the component
+attrName = builder.FindOrCreateAttribute(object, "AttributeName")
+attrName.SetValue("MyObject") # set name to the object
+attrInt = builder.FindOrCreateAttribute(object, "AttributeInteger")
+attrInt.SetValue(123) # assign integer attribute to the object
+attrIOR = builder.FindOrCreateAttribute(object, "AttributeIOR")
+attrIOR.SetValue(IOR) # assign IOR attribute to the object (to point to some CORBA object)
+
+# iterate through objects of the data tree with child iterator
+iter = salome.myStudy.NewChildIterator(comp) # initialize from the component
+iter.InitEx(True) # init recursive mode
+while iter.More():
+      c = iter.Value()
+      print c.GetID()
+      iter.Next()
+      pass
+
+# ...
+\endcode
+
+\li \b myStudyId Identifier of the current (active) study
+
+This variable contains the numerical identifier of the current
+(active) study. It is an equivalent of \c
+salome.myStudy._get_StudyId() code.
+
+\li \b myStudyName Name of the current (active) study
+
+This variable contains the name of the current (active) study. It is
+an equivalent of \c salome.myStudy._get_Name() code.
+
+\li \b DumpStudy() Print study contents
+
+This function prints the study data object tree to the terminal
+window. The output for each object includes its entry ID, name, IOR
+(if there is one) and referenced object ID (for references). I.e.
+this is the same data the user can see in the Object Browser columns.
+\code
+salome.DumpStudy(salome.myStudy)
+\endcode
+
+\li \b IDToSObject() Get SALOMEDS object by its entry ID.
+
+This function checks if the SObject with the specified entry ID exists
+in the current study and returns it. Otherwise \c None is returned.
+\code
+sobject = salome.IDToSObject("0:1:1:1") # "0:1:1:1" is an object ID
+\endcode
+Actually this function is just a shortcut to the following code:
+\code
+sobject = salome.myStudy.FindObjectID("0:1:1:1")
+\endcode
+
+\li \b IDToObject() Get CORBA object by its entry ID.
+
+This function checks if the SObject with the specified entry ID exists
+in the current study, then retrieves IOR attribute from it and,
+finally, if IOR is not empty, returns CORBA object corresponding to
+the found SObject:
+\code
+object = salome.IDToObject("0:1:1:1") # "0:1:1:1" is an object ID
+\endcode
+Actually this function is just a shortcut to the following code:
+\code
+sobject = salome.myStudy.FindObjectID("0:1:1:1")
+if sobject:
+   object = sobject.GetObject()
+else:
+   object = None
+\endcode
+
+\li \b ObjectToSObject() Get SALOMEDS object corresponding to the
+CORBA object.
+
+This function finds an object in the current study which corresponds
+to the specified CORBA object (i.e. it has IOR attribute, pointing to
+the CORBA object). If there is no corresponding SALOMEDS object in the
+study, \c None is returned:
+\code
+sobject = salome.ObjectToSObject(object)
+\endcode
+Actually this function is just a shortcut to the following code:
+\code
+ior = salome.orb.object_to_string(object)
+sobject = salome.myStudy.FindObjectIOR(ior)
+\endcode
+
+\li \b ObjectToID() Get SALOMEDS object entry ID corresponding to the
+CORBA object.
+
+This function finds an object in the current study which corresponds
+to the specified CORBA object (i.e. it has IOR attribute, pointing to
+the CORBA object). If the object is found, its entry ID is returned,
+otherwise empty string is returned:
+\code
+entry = salome.ObjectToID(object)
+\endcode
+Actually this function is just a shortcut to the following code:
+\code
+ior = salome.orb.object_to_string(object)
+sobject = salome.myStudy.FindObjectIOR(ior)
+if sobject:
+   entry = sobject.GetID()
+else:
+   entry = ""
+\endcode
+
+\li \b createNewStudy() Create new study
+
+This function can be used to create new SALOME study. Returns an ID of
+the created study.
+\code
+studyId = salome.createNewStudy()
+study   = salome.myStudyManager.GetStudyByID(s)
+\endcode
+
+\li \b generateName() Generate unique name
+
+This function adds random numerical suffix to the passed string
+parameter ("Study" by default) and returns the resulting string:
+\code
+name_1 = salome.generateName() # name_1 is something like "Study682"
+name_1 = salome.generateName("Obj") # name_1 is something like "Obj32"
+\endcode
+
+\li \b sg SWIG interface to the SALOME GUI
+
+This variable provides an access to some GUI functions.
+
+\b Note, that this variable is only available if you use salome.py
+Python module within the GUI desktop (since SWIG library is linked directly to the GUI library).
+See GUI documentation for more information.
+
+
+*/
index 241a82ff0bcd382c79e51d712f26340ed1b4cbef..5e659cf587a27fb1cef54bcd85a3fe5536688785 100644 (file)
@@ -37,6 +37,8 @@ salome.salome_init()
 In the embedded interpreter, it is already done, but there is no problem to
 do it several times, so it is preferable to add these instructions
 systematically in your scripts, to allow them to work in all configurations.
+See \ref kernel_salome for a short description of most useful variables and
+functions.
 
 \subsection subsection12 Container and component instanciation
 
index 03c610c0ee9f51cdeb12108ad84a7f51c7407879..7861f0e7730b1363915cc06dec4e2896d9f30807 100644 (file)
@@ -52,6 +52,7 @@
     You will find in the next pages informations about
     specific points of %SALOME Kernel :
 
+    - \subpage kernel_salome 
     - \subpage dsc_page : DSC documentation page.
     - \subpage salome_file_page : Salome_file documentation page.
     - <a href="Batch.html/index.html"> Batch documentation </a>
diff --git a/doc/salome/tui/KERNEL/HTML/Logger.html b/doc/salome/tui/KERNEL/HTML/Logger.html
new file mode 100644 (file)
index 0000000..1a73901
--- /dev/null
@@ -0,0 +1,18 @@
+<HTML><b>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface Logger</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void putMessage ( in string message )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>putMessage ( message )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ping (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ping (  )</b></div></td>
+</tr>
+</table><br>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/HTML/SALOMEDS.html b/doc/salome/tui/KERNEL/HTML/SALOMEDS.html
new file mode 100644 (file)
index 0000000..f9d2b55
--- /dev/null
@@ -0,0 +1,674 @@
+<HTML><b>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface Study</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>PersistentReference  GetPersistentReference (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetPersistentReference (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SalomeReference  GetTransientReference (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetTransientReference (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsEmpty (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsEmpty (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SComponent  FindComponent ( in string aComponentName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = FindComponent ( aComponentName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SComponent  FindComponentID ( in ID aComponentID )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = FindComponentID ( aComponentID )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  FindObject ( in string anObjectName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = FindObject ( anObjectName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  FindObjectID ( in ID aObjectID )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = FindObjectID ( aObjectID )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  CreateObjectID ( in ID aObjectID )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = CreateObjectID ( aObjectID )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  FindObjectIOR ( in ID aObjectIOR )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = FindObjectIOR ( aObjectIOR )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfSObject  FindObjectByName ( in string anObjectName, in string aComponentName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = FindObjectByName ( anObjectName, aComponentName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  FindObjectByPath ( in string thePath )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = FindObjectByPath ( thePath )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetObjectPath ( in Object theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetObjectPath ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetContext ( in string thePath )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetContext ( thePath )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetContext (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetContext (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfStrings  GetObjectNames ( in string theContext )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetObjectNames ( theContext )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfStrings  GetDirectoryNames ( in string theContext )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetDirectoryNames ( theContext )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfStrings  GetFileNames ( in string theContext )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetFileNames ( theContext )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfStrings  GetComponentNames ( in string theContext )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetComponentNames ( theContext )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ChildIterator  NewChildIterator ( in SObject aSO )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = NewChildIterator ( aSO )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SComponentIterator  NewComponentIterator (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = NewComponentIterator (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StudyBuilder  NewBuilder (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = NewBuilder (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void UpdateIORLabelMap ( in string anIOR, in string anEntry )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>UpdateIORLabelMap ( anIOR, anEntry )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>AttributeStudyProperties  GetProperties (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetProperties (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsModified (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsModified (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfSObject  FindDependances ( in SObject anObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = FindDependances ( anObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetLastModificationDate (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetLastModificationDate (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfDates  GetModificationsDate (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetModificationsDate (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  ConvertObjectToIOR ( in Object theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = ConvertObjectToIOR ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Object  ConvertIORToObject ( in string theIOR )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = ConvertIORToObject ( theIOR )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>UseCaseBuilder  GetUseCaseBuilder (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetUseCaseBuilder (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Close (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Close (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void EnableUseCaseAutoFilling ( in boolean isEnabled )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>EnableUseCaseAutoFilling ( isEnabled )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void AddPostponed ( in string theIOR )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>AddPostponed ( theIOR )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void AddCreatedPostponed ( in string theIOR )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>AddCreatedPostponed ( theIOR )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void RemovePostponed ( in long theUndoLimit )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>RemovePostponed ( theUndoLimit )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void UndoPostponed ( in long theWay )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>UndoPostponed ( theWay )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface StudyBuilder</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SComponent  NewComponent ( in string ComponentDataType )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = NewComponent ( ComponentDataType )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void DefineComponentInstance ( in SComponent aComponent, in Object ComponentIOR )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>DefineComponentInstance ( aComponent, ComponentIOR )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void RemoveComponent ( in SComponent aComponent )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>RemoveComponent ( aComponent )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  NewObject ( in SObject theFatherObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = NewObject ( theFatherObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  NewObjectToTag ( in SObject theFatherObject, in long atag )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = NewObjectToTag ( theFatherObject, atag )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void RemoveObject ( in SObject anObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>RemoveObject ( anObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void RemoveObjectWithChildren ( in SObject anObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>RemoveObjectWithChildren ( anObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void LoadWith ( in SComponent sco, in Driver Engine )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>LoadWith ( sco, Engine )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Load ( in SObject sco )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Load ( sco )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>GenericAttribute  FindOrCreateAttribute ( in SObject anObject, in string aTypeOfAttribute )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = FindOrCreateAttribute ( anObject, aTypeOfAttribute )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  FindAttribute ( in SObject anObject, out GenericAttribute anAttribute, in string aTypeOfAttribute )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>[ return_value,  anAttribute ] = FindAttribute ( anObject, aTypeOfAttribute )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void RemoveAttribute ( in SObject anObject, in string aTypeOfAttribute )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>RemoveAttribute ( anObject, aTypeOfAttribute )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Addreference ( in SObject anObject, in SObject theReferencedObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Addreference ( anObject, theReferencedObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void RemoveReference ( in SObject anObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>RemoveReference ( anObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void AddDirectory ( in string theName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>AddDirectory ( theName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetGUID ( in SObject anObject, in string theGUID )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetGUID ( anObject, theGUID )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsGUID ( in SObject anObject, in string theGUID )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsGUID ( anObject, theGUID )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void NewCommand (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>NewCommand (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void CommitCommand (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>CommitCommand (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  HasOpenCommand (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = HasOpenCommand (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void AbortCommand (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>AbortCommand (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Undo (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Undo (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Redo (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Redo (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  GetAvailableUndos (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetAvailableUndos (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  GetAvailableRedos (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetAvailableRedos (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Callback  SetOnAddSObject ( in Callback theCallback )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = SetOnAddSObject ( theCallback )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Callback  SetOnRemoveSObject ( in Callback theCallback )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = SetOnRemoveSObject ( theCallback )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetName ( in SObject theSO, in string theValue )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetName ( theSO, theValue )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetComment ( in SObject theSO, in string theValue )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetComment ( theSO, theValue )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetIOR ( in SObject theSO, in string theValue )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetIOR ( theSO, theValue )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface StudyManager</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ping (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ping (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Study  NewStudy ( in string study_name )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = NewStudy ( study_name )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Study  Open ( in URL aStudyUrl )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Open ( aStudyUrl )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Close ( in Study aStudy )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Close ( aStudy )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Save ( in Study aStudy, in boolean theMultiFile )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Save ( aStudy, theMultiFile )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SaveASCII ( in Study aStudy, in boolean theMultiFile )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SaveASCII ( aStudy, theMultiFile )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SaveAs ( in URL aUrl, in Study aStudy, in boolean theMultiFile )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SaveAs ( aUrl, aStudy, theMultiFile )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SaveAsASCII ( in URL aUrl, in Study aStudy, in boolean theMultiFile )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SaveAsASCII ( aUrl, aStudy, theMultiFile )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfOpenStudies  GetOpenStudies (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetOpenStudies (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Study  GetStudyByName ( in string aStudyName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetStudyByName ( aStudyName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Study  GetStudyByID ( in short aStudyID )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetStudyByID ( aStudyID )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  CanCopy ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = CanCopy ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  Copy ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Copy ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  CanPaste ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = CanPaste ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  Paste ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Paste ( theObject )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface SObject</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ID  GetID (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetID (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SComponent  GetFatherComponent (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetFatherComponent (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  GetFather (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetFather (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>short  Tag (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Tag (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>short  Depth (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Depth (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  FindSubObject ( in long atag, out SObject obj )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>[ return_value,  obj ] = FindSubObject ( atag )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  FindAttribute ( out GenericAttribute anAttribute, in string aTypeOfAttribute )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>[ return_value,  anAttribute ] = FindAttribute ( aTypeOfAttribute )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  ReferencedObject ( out SObject obj )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>[ return_value,  obj ] = ReferencedObject (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfAttributes  GetAllAttributes (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetAllAttributes (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Study  GetStudy (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetStudy (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Object  GetObject (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetObject (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetName (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetName (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetComment (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetComment (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetIOR (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetIOR (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface GenericAttribute</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void CheckLocked (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>CheckLocked (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Store (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Store (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Restore ( in string theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Restore ( theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Type (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Type (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  GetSObject (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetSObject (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface SComponent</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  ComponentDataType (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = ComponentDataType (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  ComponentIOR ( out ID theID )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>[ return_value,  theID ] = ComponentIOR (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface SComponentIterator</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Init (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Init (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  More (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = More (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Next (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Next (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SComponent  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface ChildIterator</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Init (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Init (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void InitEx ( in boolean allLevels )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>InitEx ( allLevels )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  More (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = More (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Next (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Next (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface UseCaseIterator</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Init ( in boolean allLevels )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Init ( allLevels )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  More (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = More (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Next (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Next (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface UseCaseBuilder</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  Append ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Append ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  Remove ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Remove ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  AppendTo ( in SObject theFather, in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = AppendTo ( theFather, theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  InsertBefore ( in SObject theFirst, in SObject theNext )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = InsertBefore ( theFirst, theNext )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  SetCurrentObject ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = SetCurrentObject ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  SetRootCurrent (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = SetRootCurrent (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  HasChildren ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = HasChildren ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  SetName ( in string theName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = SetName ( theName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetName (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetName (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsUseCase ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsUseCase ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  GetCurrentObject (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetCurrentObject (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  AddUseCase ( in string theName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = AddUseCase ( theName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>UseCaseIterator  GetUseCaseIterator ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetUseCaseIterator ( theObject )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface Callback</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void OnAddSObject ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>OnAddSObject ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void OnRemoveSObject ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>OnRemoveSObject ( theObject )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface Driver</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>TMPFile  Save ( in SComponent theComponent, in string theURL, in boolean isMultiFile )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Save ( theComponent, theURL, isMultiFile )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>TMPFile  SaveASCII ( in SComponent theComponent, in string theURL, in boolean isMultiFile )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = SaveASCII ( theComponent, theURL, isMultiFile )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  Load ( in SComponent theComponent, in TMPFile theStream, in string theURL, in boolean isMultiFile )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Load ( theComponent, theStream, theURL, isMultiFile )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  LoadASCII ( in SComponent theComponent, in TMPFile theStream, in string theURL, in boolean isMultiFile )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = LoadASCII ( theComponent, theStream, theURL, isMultiFile )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Close ( in SComponent aSComponent )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Close ( aSComponent )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  ComponentDataType (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = ComponentDataType (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  IORToLocalPersistentID ( in SObject theSObject, in string IORString, in boolean isMultiFile, in boolean isASCII )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IORToLocalPersistentID ( theSObject, IORString, isMultiFile, isASCII )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  LocalPersistentIDToIOR ( in SObject theSObject, in string aLocalPersistentID, in boolean isMultiFile, in boolean isASCII )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = LocalPersistentIDToIOR ( theSObject, aLocalPersistentID, isMultiFile, isASCII )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  CanPublishInStudy ( in Object theIOR )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = CanPublishInStudy ( theIOR )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  PublishInStudy ( in Study theStudy, in SObject theSObject, in Object theObject, in string theName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = PublishInStudy ( theStudy, theSObject, theObject, theName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  CanCopy ( in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = CanCopy ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>TMPFile  CopyFrom ( in SObject theObject, out long theObjectID )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>[ return_value,  theObjectID ] = CopyFrom ( theObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  CanPaste ( in string theComponentName, in long theObjectID )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = CanPaste ( theComponentName, theObjectID )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>SObject  PasteInto ( in TMPFile theStream, in long theObjectID, in SObject theObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = PasteInto ( theStream, theObjectID, theObject )</b></div></td>
+</tr>
+</table><br>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/HTML/SALOMEDS_Attributes.html b/doc/salome/tui/KERNEL/HTML/SALOMEDS_Attributes.html
new file mode 100644 (file)
index 0000000..49f848f
--- /dev/null
@@ -0,0 +1,894 @@
+<HTML><b>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeReal</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetValue ( in double value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetValue ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeInteger</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetValue ( in long value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetValue ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeSequenceOfReal</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Assign ( in DoubleSeq other )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Assign ( other )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>DoubleSeq  CorbaSequence (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = CorbaSequence (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Add ( in double value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Add ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Remove ( in long index )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Remove ( index )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ChangeValue ( in long index, in double value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ChangeValue ( index, value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  Value ( in short index )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value ( index )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  Length (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Length (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeSequenceOfInteger</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Assign ( in LongSeq other )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Assign ( other )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>LongSeq  CorbaSequence (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = CorbaSequence (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Add ( in long value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Add ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Remove ( in long index )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Remove ( index )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ChangeValue ( in long index, in long value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ChangeValue ( index, value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  Value ( in short index )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value ( index )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  Length (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Length (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeName</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetValue ( in string value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetValue ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeComment</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetValue ( in string value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetValue ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeIOR</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetValue ( in string value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetValue ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributePersistentRef</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetValue ( in string value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetValue ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeExternalFileDef</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetValue ( in string value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetValue ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeFileType</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetValue ( in string value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetValue ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeDrawable</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsDrawable (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsDrawable (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetDrawable ( in boolean value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetDrawable ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeSelectable</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsSelectable (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsSelectable (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetSelectable ( in boolean value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetSelectable ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeExpandable</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsExpandable (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsExpandable (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetExpandable ( in boolean value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetExpandable ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeOpened</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsOpened (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsOpened (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetOpened ( in boolean value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetOpened ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeTextColor</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Color  TextColor (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = TextColor (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetTextColor ( in Color value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetTextColor ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeTextHighlightColor</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Color  TextHighlightColor (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = TextHighlightColor (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetTextHighlightColor ( in Color value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetTextHighlightColor ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributePixMap</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  HasPixMap (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = HasPixMap (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetPixMap (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetPixMap (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetPixMap ( in string value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetPixMap ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeTreeNode</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetFather ( in AttributeTreeNode value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetFather ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  HasFather (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = HasFather (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>AttributeTreeNode  GetFather (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetFather (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetPrevious ( in AttributeTreeNode value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetPrevious ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  HasPrevious (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = HasPrevious (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>AttributeTreeNode  GetPrevious (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetPrevious (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetNext ( in AttributeTreeNode value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetNext ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  HasNext (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = HasNext (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>AttributeTreeNode  GetNext (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetNext (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetFirst ( in AttributeTreeNode value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetFirst ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  HasFirst (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = HasFirst (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>AttributeTreeNode  GetFirst (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetFirst (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetTreeID ( in string value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetTreeID ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetTreeID (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetTreeID (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Append ( in AttributeTreeNode value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Append ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Prepend ( in AttributeTreeNode value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Prepend ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void InsertBefore ( in AttributeTreeNode value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>InsertBefore ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void InsertAfter ( in AttributeTreeNode value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>InsertAfter ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Remove (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Remove (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  Depth (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Depth (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsRoot (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsRoot (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsDescendant ( in AttributeTreeNode value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsDescendant ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsFather ( in AttributeTreeNode value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsFather ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsChild ( in AttributeTreeNode value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsChild ( value )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Label (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Label (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeLocalID</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetValue ( in long value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetValue ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeUserID</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Value (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Value (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetValue ( in string value )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetValue ( value )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeTarget</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Add ( in SObject anObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Add ( anObject )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfSObject  Get (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Get (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Remove ( in SObject anObject )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Remove ( anObject )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeTableOfInteger</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetTitle ( in string theTitle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetTitle ( theTitle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetTitle (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetTitle (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRowTitle ( in long theIndex, in string theTitle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRowTitle ( theIndex, theTitle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRowTitles ( in StringSeq theTitles )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRowTitles ( theTitles )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StringSeq  GetRowTitles (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRowTitles (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetColumnTitle ( in long theIndex, in string theTitle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetColumnTitle ( theIndex, theTitle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetColumnTitles ( in StringSeq theTitles )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetColumnTitles ( theTitles )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StringSeq  GetColumnTitles (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetColumnTitles (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRowUnit ( in long theIndex, in string theUnit )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRowUnit ( theIndex, theUnit )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRowUnits ( in StringSeq theUnits )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRowUnits ( theUnits )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StringSeq  GetRowUnits (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRowUnits (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  GetNbRows (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetNbRows (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  GetNbColumns (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetNbColumns (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void AddRow ( in LongSeq theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>AddRow ( theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRow ( in long theRow, in LongSeq theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRow ( theRow, theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>LongSeq  GetRow ( in long theRow )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRow ( theRow )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void AddColumn ( in LongSeq theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>AddColumn ( theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetColumn ( in long theColumn, in LongSeq theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetColumn ( theColumn, theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>LongSeq  GetColumn ( in long theColumn )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetColumn ( theColumn )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void PutValue ( in long theValue, in long theRow, in long theColumn )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>PutValue ( theValue, theRow, theColumn )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  HasValue ( in long theRow, in long theColumn )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = HasValue ( theRow, theColumn )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  GetValue ( in long theRow, in long theColumn )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetValue ( theRow, theColumn )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetNbColumns ( in long theNbColumns )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetNbColumns ( theNbColumns )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>LongSeq  GetRowSetIndices ( in long theRow )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRowSetIndices ( theRow )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  ReadFromFile ( in TMPFile theStream )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = ReadFromFile ( theStream )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>TMPFile  SaveToFile (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = SaveToFile (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeTableOfReal</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetTitle ( in string theTitle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetTitle ( theTitle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetTitle (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetTitle (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRowTitle ( in long theIndex, in string theTitle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRowTitle ( theIndex, theTitle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRowTitles ( in StringSeq theTitles )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRowTitles ( theTitles )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StringSeq  GetRowTitles (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRowTitles (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetColumnTitle ( in long theIndex, in string theTitle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetColumnTitle ( theIndex, theTitle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetColumnTitles ( in StringSeq theTitles )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetColumnTitles ( theTitles )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StringSeq  GetColumnTitles (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetColumnTitles (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRowUnit ( in long theIndex, in string theUnit )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRowUnit ( theIndex, theUnit )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRowUnits ( in StringSeq theUnits )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRowUnits ( theUnits )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StringSeq  GetRowUnits (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRowUnits (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  GetNbRows (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetNbRows (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  GetNbColumns (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetNbColumns (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void AddRow ( in DoubleSeq theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>AddRow ( theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRow ( in long theRow, in DoubleSeq theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRow ( theRow, theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>DoubleSeq  GetRow ( in long theRow )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRow ( theRow )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void AddColumn ( in DoubleSeq theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>AddColumn ( theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetColumn ( in long theColumn, in DoubleSeq theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetColumn ( theColumn, theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>DoubleSeq  GetColumn ( in long theColumn )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetColumn ( theColumn )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void PutValue ( in double theValue, in long theRow, in long theColumn )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>PutValue ( theValue, theRow, theColumn )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  HasValue ( in long theRow, in long theColumn )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = HasValue ( theRow, theColumn )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>double  GetValue ( in long theRow, in long theColumn )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetValue ( theRow, theColumn )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetNbColumns ( in long theNbColumns )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetNbColumns ( theNbColumns )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>LongSeq  GetRowSetIndices ( in long theRow )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRowSetIndices ( theRow )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  ReadFromFile ( in TMPFile theStream )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = ReadFromFile ( theStream )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>TMPFile  SaveToFile (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = SaveToFile (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeTableOfString</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetTitle ( in string theTitle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetTitle ( theTitle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetTitle (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetTitle (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRowTitle ( in long theIndex, in string theTitle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRowTitle ( theIndex, theTitle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRowTitles ( in StringSeq theTitles )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRowTitles ( theTitles )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StringSeq  GetRowTitles (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRowTitles (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetColumnTitle ( in long theIndex, in string theTitle )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetColumnTitle ( theIndex, theTitle )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetColumnTitles ( in StringSeq theTitles )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetColumnTitles ( theTitles )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StringSeq  GetColumnTitles (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetColumnTitles (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRowUnit ( in long theIndex, in string theUnit )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRowUnit ( theIndex, theUnit )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRowUnits ( in StringSeq theUnits )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRowUnits ( theUnits )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StringSeq  GetRowUnits (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRowUnits (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  GetNbRows (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetNbRows (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  GetNbColumns (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetNbColumns (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void AddRow ( in StringSeq theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>AddRow ( theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetRow ( in long theRow, in StringSeq theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetRow ( theRow, theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StringSeq  GetRow ( in long theRow )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRow ( theRow )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void AddColumn ( in StringSeq theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>AddColumn ( theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetColumn ( in long theColumn, in StringSeq theData )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetColumn ( theColumn, theData )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StringSeq  GetColumn ( in long theColumn )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetColumn ( theColumn )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void PutValue ( in string theValue, in long theRow, in long theColumn )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>PutValue ( theValue, theRow, theColumn )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  HasValue ( in long theRow, in long theColumn )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = HasValue ( theRow, theColumn )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetValue ( in long theRow, in long theColumn )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetValue ( theRow, theColumn )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetNbColumns ( in long theNbColumns )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetNbColumns ( theNbColumns )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>LongSeq  GetRowSetIndices ( in long theRow )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetRowSetIndices ( theRow )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  ReadFromFile ( in TMPFile theStream )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = ReadFromFile ( theStream )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>TMPFile  SaveToFile (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = SaveToFile (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributeStudyProperties</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetUserName ( in string theName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetUserName ( theName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetUserName (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetUserName (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetCreationDate ( in long theMinute, in long theHour, in long theDay, in long theMonth, in long theYear )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetCreationDate ( theMinute, theHour, theDay, theMonth, theYear )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  GetCreationDate ( out long theMinute, out long theHour, out long theDay, out long theMonth, out long theYear )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>[ return_value,  theMinute, theHour, theDay, theMonth, theYear ] = GetCreationDate (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetCreationMode ( in string theMode )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetCreationMode ( theMode )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetCreationMode (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetCreationMode (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetModified ( in long theModified )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetModified ( theModified )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsModified (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsModified (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  GetModified (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetModified (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetLocked ( in boolean theLocked )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetLocked ( theLocked )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsLocked (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsLocked (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetModification ( in string theName, in long theMinute, in long theHour, in long theDay, in long theMonth, in long theYear )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetModification ( theName, theMinute, theHour, theDay, theMonth, theYear )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void GetModificationsList ( out StringSeq theNames, out LongSeq theMinutes, out LongSeq theHours, out LongSeq theDays, out LongSeq theMonths, out LongSeq theYears, in boolean theWithCreator )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>[ theNames, theMinutes, theHours, theDays, theMonths, theYears ] = GetModificationsList ( theWithCreator )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface AttributePythonObject</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void SetObject ( in string theSequence, in boolean IsScript )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>SetObject ( theSequence, IsScript )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetObject (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetObject (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  IsScript (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsScript (  )</b></div></td>
+</tr>
+</table><br>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_Component.html b/doc/salome/tui/KERNEL/HTML/SALOME_Component.html
new file mode 100644 (file)
index 0000000..2d80286
--- /dev/null
@@ -0,0 +1,94 @@
+<HTML><b>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface Container</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Container  start_impl ( in string ContainerName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = start_impl ( ContainerName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Component  load_impl ( in string nameToRegister, in string componentName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = load_impl ( nameToRegister, componentName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void remove_impl ( in Component component_i )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>remove_impl ( component_i )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void finalize_removal (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>finalize_removal (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ping (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ping (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  Kill_impl (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Kill_impl (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  getHostName (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getHostName (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  getPID (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getPID (  )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface Component</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ping (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ping (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void destroy (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>destroy (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Container  GetContainerRef (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetContainerRef (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void setProperties ( in FieldsDict dico )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>setProperties ( dico )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>FieldsDict  getProperties (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getProperties (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Names ( in string aGraphName, in string aNodeName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Names ( aGraphName, aNodeName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  Kill_impl (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Kill_impl (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  Stop_impl (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Stop_impl (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  Suspend_impl (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Suspend_impl (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  Resume_impl (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Resume_impl (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  CpuUsed_impl (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = CpuUsed_impl (  )</b></div></td>
+</tr>
+</table><br>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_DataTypeCatalog.html b/doc/salome/tui/KERNEL/HTML/SALOME_DataTypeCatalog.html
new file mode 100644 (file)
index 0000000..c73173f
--- /dev/null
@@ -0,0 +1,30 @@
+<HTML><b>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface DataCatalog</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfDataTypeName  GetDataTypeList (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetDataTypeList (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  isDerivedFrom ( in string type_in, in string type_out )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = isDerivedFrom ( type_in, type_out )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetDataInterfaceRead ( in string type )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetDataInterfaceRead ( type )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetDataInterfaceWrite ( in string type )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetDataInterfaceWrite ( type )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfDataTypeName  GetDataTypeParents ( in string type )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetDataTypeParents ( type )</b></div></td>
+</tr>
+</table><br>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_Exception.html b/doc/salome/tui/KERNEL/HTML/SALOME_Exception.html
new file mode 100644 (file)
index 0000000..37c3107
--- /dev/null
@@ -0,0 +1,2 @@
+<HTML><b>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_ModuleCatalog.html b/doc/salome/tui/KERNEL/HTML/SALOME_ModuleCatalog.html
new file mode 100644 (file)
index 0000000..5f618eb
--- /dev/null
@@ -0,0 +1,82 @@
+<HTML><b>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface Acomponent</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfInterfaces  GetInterfaceList (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetInterfaceList (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>DefinitionInterface  GetInterface ( in string interfacename )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetInterface ( interfacename )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfServices  GetServiceList ( in string interfacename )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetServiceList ( interfacename )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Service  GetService ( in string interfacename, in string servicename )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetService ( interfacename, servicename )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Service  GetDefaultService ( in string interfacename )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetDefaultService ( interfacename )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetPathPrefix ( in string machinename )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetPathPrefix ( machinename )</b></div></td>
+</tr>
+</table><br>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface ModuleCatalog</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ping (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ping (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfComputers  GetComputerList (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetComputerList (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  GetPathPrefix ( in string machinename )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetPathPrefix ( machinename )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfComponents  GetComponentList (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetComponentList (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfIAPP_Affich  GetComponentIconeList (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetComponentIconeList (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfComponents  GetTypedComponentList ( in ComponentType component_type )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetTypedComponentList ( component_type )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Acomponent  GetComponent ( in string componentname )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetComponent ( componentname )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Component  GetComponentInfo ( in string componentName )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetComponentInfo ( componentName )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ImportXmlCatalogFile ( in string filename )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ImportXmlCatalogFile ( filename )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void shutdown (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>shutdown (  )</b></div></td>
+</tr>
+</table><br>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_Registry.html b/doc/salome/tui/KERNEL/HTML/SALOME_Registry.html
new file mode 100644 (file)
index 0000000..fd319e1
--- /dev/null
@@ -0,0 +1,42 @@
+<HTML><b>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface Components</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ping (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ping (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>unsigned long  add ( in Infos lesInfos )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = add ( lesInfos )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void remove ( in unsigned long id )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>remove ( id )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>unsigned long  size (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = size (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>AllInfos  getall (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = getall (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>AllInfos  history (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = history (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void end (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>end (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void hello ( in unsigned long id )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>hello ( id )</b></div></td>
+</tr>
+</table><br>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_RessourcesCatalog.html b/doc/salome/tui/KERNEL/HTML/SALOME_RessourcesCatalog.html
new file mode 100644 (file)
index 0000000..787a628
--- /dev/null
@@ -0,0 +1,22 @@
+<HTML><b>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface RessourcesCatalog</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfComputer  GetComputerList (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetComputerList (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>ListOfContainerType  GetContainerTypeList ( in string computer )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetContainerTypeList ( computer )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>computer_info  GetComputerInfo ( in string computer )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetComputerInfo ( computer )</b></div></td>
+</tr>
+</table><br>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_Session.html b/doc/salome/tui/KERNEL/HTML/SALOME_Session.html
new file mode 100644 (file)
index 0000000..37b4674
--- /dev/null
@@ -0,0 +1,34 @@
+<HTML><b>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface Session</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void GetInterface (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>GetInterface (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>Component  GetVisuComponent (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetVisuComponent (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void StopSession (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>StopSession (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>StatSession  GetStatSession (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetStatSession (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ping (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ping (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>long  GetActiveStudyId (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetActiveStudyId (  )</b></div></td>
+</tr>
+</table><br>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_TestComponent.html b/doc/salome/tui/KERNEL/HTML/SALOME_TestComponent.html
new file mode 100644 (file)
index 0000000..56348f8
--- /dev/null
@@ -0,0 +1,18 @@
+<HTML><b>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface TestComponent</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>string  Coucou ( in long L )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Coucou ( L )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Setenv (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Setenv (  )</b></div></td>
+</tr>
+</table><br>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/HTML/TestNotif.html b/doc/salome/tui/KERNEL/HTML/TestNotif.html
new file mode 100644 (file)
index 0000000..a181974
--- /dev/null
@@ -0,0 +1,22 @@
+<HTML><b>
+<table width="100%" BORDER>
+<tr bgcolor="#FFFFCC">
+<td colspan="11"><font size="+3"><b><div align="center"><i>interface Solver</i></div></b></font></td>
+</tr>
+<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
+<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>boolean  Connect (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>return_value = Connect (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void Start (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>Start (  )</b></div></td>
+</tr>
+<tr>
+<td bgcolor= "lightgreen"><div align="center"><b>void ReStart (  )</b></div></td>
+<td bgcolor= "lightgreen"><div align="center"><b>ReStart (  )</b></div></td>
+</tr>
+</table><br>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/HTML/TypeData.html b/doc/salome/tui/KERNEL/HTML/TypeData.html
new file mode 100644 (file)
index 0000000..37c3107
--- /dev/null
@@ -0,0 +1,2 @@
+<HTML><b>
+</b></HTML>
diff --git a/doc/salome/tui/KERNEL/doxydev.in b/doc/salome/tui/KERNEL/doxydev.in
new file mode 100644 (file)
index 0000000..168d1c5
--- /dev/null
@@ -0,0 +1,241 @@
+# Doxyfile 1.4.6
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = "SALOME v.@VERSION@"
+PROJECT_NUMBER         = 
+OUTPUT_DIRECTORY       = ../
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+USE_WINDOWS_ENCODING   = NO
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = NO
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = YES
+INLINE_INHERITED_MEMB  = YES
+FULL_PATH_NAMES        = YES
+STRIP_FROM_PATH        = @top_builddir@ \
+                        @top_srcdir@
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = YES
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 5
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = YES
+OPTIMIZE_OUTPUT_JAVA   = NO
+BUILTIN_STL_SUPPORT    = NO
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = YES
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_BY_SCOPE_NAME     = YES
+GENERATE_TODOLIST      = NO
+GENERATE_TESTLIST      = NO
+GENERATE_BUGLIST       = NO
+GENERATE_DEPRECATEDLIST= NO
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 25
+SHOW_USED_FILES        = NO
+SHOW_DIRECTORIES       = NO
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = log.txt
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = \
+                      @top_srcdir@ 
+FILE_PATTERNS          = *.idl *.?xx *.h *.hh *.i *c *.cc python_extension_must_be_here
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = sources/
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = YES
+COLS_IN_ALPHA_INDEX    = 3
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = KERNEL
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = sources/myheader.html
+HTML_FOOTER            = sources/footer.html
+HTML_STYLESHEET        = sources/doxygen.css
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = NO
+BINARY_TOC             = YES
+TOC_EXPAND             = YES
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = NO
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = NO
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+HIDE_UNDOC_RELATIONS   = NO
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = NO
+UML_LOOK               = YES
+TEMPLATE_RELATIONS     = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = NO
+CALL_GRAPH             = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = jpg
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1200
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = NO
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/salome/tui/KERNEL/doxyfile.in b/doc/salome/tui/KERNEL/doxyfile.in
new file mode 100755 (executable)
index 0000000..a4f54eb
--- /dev/null
@@ -0,0 +1,214 @@
+# Doxyfile 1.3-rc1
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = "SALOME v.@VERSION@"
+PROJECT_NUMBER         = id#1.1
+OUTPUT_DIRECTORY       = ../
+OUTPUT_LANGUAGE        = English
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = NO
+ALWAYS_DETAILED_SEC    = YES
+INLINE_INHERITED_MEMB  = YES
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+SHORT_NAMES            = NO
+HIDE_SCOPE_NAMES       = NO
+VERBATIM_HEADERS       = YES
+SHOW_INCLUDE_FILES     = YES
+JAVADOC_AUTOBRIEF      = YES
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = NO
+INHERIT_DOCS           = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+DISTRIBUTE_GROUP_DOC   = NO
+TAB_SIZE               = 5
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ALIASES                = 
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 25
+OPTIMIZE_OUTPUT_FOR_C  = YES
+OPTIMIZE_OUTPUT_JAVA   = YES
+SHOW_USED_FILES        = NO
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = log.txt
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ../../../../share/salome/idl/SALOME_ModuleCatalog.idl \
+                       ../../../../share/salome/idl/SALOMEDS.idl \
+                       ../../../../share/salome/idl/SALOME_Exception.idl \
+                       ../../../../share/salome/idl/SALOMEDS_Attributes.idl \
+                       ../../../../share/salome/idl/SALOME_Component.idl \
+                       ../../../../share/salome/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.hxx \
+                       ../../../../share/salome/src/NamingService/SALOME_NamingService.hxx \
+                       ../../../../share/salome/src/NamingService/SALOME_NamingService.cxx \
+                       ../../../../share/salome/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx \
+                       ../../../../build/salome/bin/salome \
+                       ../../../../build/salome/src/Batch_SWIG \
+                       ../../../../build/salome/src/Communication_SWIG \
+                       ../../../../build/salome/src/LifeCycleCORBA_SWIG \
+                       ../../../../build/salome/src/LifeCycleCORBA_SWIG \
+                       ../../../../build/salome/src/NOTIFICATION_SWIG
+FILE_PATTERNS          = *.idl *.hxx *.cxx python_extension_must_be_here
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = sources/
+INPUT_FILTER           = 
+FILTER_SOURCE_FILES    = YES
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = NO
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = KERNEL
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = sources/myheader.html
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = NO
+BINARY_TOC             = YES
+TOC_EXPAND             = YES
+DISABLE_INDEX          = YES
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_SCHEMA             = 
+XML_DTD                = 
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = NO
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+HIDE_UNDOC_RELATIONS   = NO
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = NO
+TEMPLATE_RELATIONS     = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = NO
+GRAPHICAL_HIERARCHY    = YES
+DOT_IMAGE_FORMAT       = jpg
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1200
+GENERATE_LEGEND        = NO
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
+CGI_NAME               = search.cgi
+CGI_URL                = 
+DOC_URL                = 
+DOC_ABSPATH            = 
+BIN_ABSPATH            = /usr/local/bin/
+EXT_DOC_PATHS          = 
diff --git a/doc/salome/tui/KERNEL/doxyuser.in b/doc/salome/tui/KERNEL/doxyuser.in
new file mode 100644 (file)
index 0000000..d338750
--- /dev/null
@@ -0,0 +1,249 @@
+# Doxyfile 1.4.6
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = "SALOME v.@VERSION@"
+PROJECT_NUMBER         = 
+OUTPUT_DIRECTORY       = ../
+CREATE_SUBDIRS         = NO
+OUTPUT_LANGUAGE        = English
+USE_WINDOWS_ENCODING   = NO
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = NO
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = YES
+INLINE_INHERITED_MEMB  = YES
+FULL_PATH_NAMES        = YES
+STRIP_FROM_PATH        = @top_builddir@ \
+                        @top_srcdir@
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = YES
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 5
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = YES
+OPTIMIZE_OUTPUT_JAVA   = NO
+BUILTIN_STL_SUPPORT    = NO
+DISTRIBUTE_GROUP_DOC   = NO
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = NO
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = NO
+SORT_BRIEF_DOCS        = NO
+SORT_BY_SCOPE_NAME     = YES
+GENERATE_TODOLIST      = NO
+GENERATE_TESTLIST      = NO
+GENERATE_BUGLIST       = NO
+GENERATE_DEPRECATEDLIST= NO
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 25
+SHOW_USED_FILES        = YES
+SHOW_DIRECTORIES       = YES
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = log.txt
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = \
+                      @top_srcdir@/doc/salome \
+                      @top_srcdir@/bin \
+                      @top_srcdir@/idl \
+                      @top_srcdir@/src/Container \
+                      @top_srcdir@/src/LifeCycleCORBA \
+                      @top_srcdir@/src/NamingService \
+                      @top_srcdir@/src/Notification \
+                      @top_srcdir@/src/Utils \
+                      @top_srcdir@/src/DSC
+FILE_PATTERNS          = *.dox *.idl *.hxx *.cxx python_extension_must_be_here
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             = sources/
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = NO
+COLS_IN_ALPHA_INDEX    = 3
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = KERNEL
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = sources/myheader.html
+HTML_FOOTER            = sources/footer.html
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = NO
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = NO
+BINARY_TOC             = YES
+TOC_EXPAND             = YES
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = YES
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = NO
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = NO
+HIDE_UNDOC_RELATIONS   = NO
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = NO
+GROUP_GRAPHS           = NO
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = NO
+CALL_GRAPH             = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = jpg
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1200
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = NO
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = NO
diff --git a/doc/salome/tui/KERNEL/exemple/Example1.html b/doc/salome/tui/KERNEL/exemple/Example1.html
new file mode 100755 (executable)
index 0000000..1ec12ba
--- /dev/null
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Exemple</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributeReal interface (creations/saving/restoring)%\r
+#%Methods : FindOrCreateAttribute, Value, SaveAs, SetValue, FindComponent, FindAttribute, Open%\r
+\r
+\r
+# &nbsp; &nbsp; &nbsp; create AttributeReal &nbsp; &nbsp; &nbsp;\r
+#=================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeReal&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeReal attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeReal)\r
+A.SetValue(0.0001)\r
+if A.Value() != 0.0001:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error : wrong value of &nbsp;AttributeReal&quot;\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#=================================\r
+\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+#file = &quot;/tmp/ggg.hdf&quot;\r
+\r
+print &quot; ------- &nbsp;We will save to&quot;, file, &quot;-----------&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy=batchmode_geompy.myStudyManager.Open(file)\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find AttributeReal\r
+#=================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeReal&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeReal&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeReal)\r
+if A.Value() != 0.0001:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error : wrong value of &nbsp;AttributeReal&quot;\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example10.html b/doc/salome/tui/KERNEL/exemple/Example10.html
new file mode 100755 (executable)
index 0000000..fde0125
--- /dev/null
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributeExpandable interface(creations/saving/restoring)%\r
+#%SALOMEDS methods : SaveAs FindComponent &nbsp;FindAttribute Open%\r
+#%Attribute methods : SetExpandable IsExpandable%\r
+\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create &nbsp; &nbsp;AttributeExpandable\r
+#===========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute( batchmode_geompy.father, &quot;AttributeExpandable&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeExpandable attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeExpandable)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeExpandable attribute&quot;\r
+\r
+A.SetExpandable(1)\r
+\r
+if A.IsExpandable() == 0:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;&quot;Error: wrong value of AttributeExpandable&quot;\r
+\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#============================================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, &nbsp;batchmode_geompy.myStudy)\r
+openedStudy = batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find &nbsp; AttributeExpandable\r
+#============================================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeExpandable&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeExpandable&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeExpandable)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeExpandable attribute&quot;\r
+\r
+if A.IsExpandable() == 0:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;&quot;Error: wrong value of AttributeExpandable&quot;\r
+\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example11.html b/doc/salome/tui/KERNEL/exemple/Example11.html
new file mode 100755 (executable)
index 0000000..38218bd
--- /dev/null
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%Test AttributeOpened (creations/saving/restoring)%\r
+#%SALOMEDS methods : FindOrCreateAttribute SaveAs, FindComponent, FindAttribute, Open%\r
+#%Attribute methods : SetOpened, IsOpened%\r
+\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create &nbsp; &nbsp;AttributeOpened\r
+#===========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeOpened&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeOpened attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeOpened)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeOpened attribute&quot;\r
+\r
+A.SetOpened(1)\r
+\r
+if A.IsOpened() == 0:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;&quot;Error: wrong value of AttributeOpened&quot;\r
+\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#============================================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy=batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find &nbsp; AttributeOpened\r
+#============================================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeOpened&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeOpened&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeOpened)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeOpened attribute&quot;\r
+\r
+if A.IsOpened() == 0:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;&quot;Error: wrong value of AttributeOpened&quot;\r
+\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example12.html b/doc/salome/tui/KERNEL/exemple/Example12.html
new file mode 100755 (executable)
index 0000000..57c5d45
--- /dev/null
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributeTextColor interface (creations/saving/restoring)%\r
+#%SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%\r
+#%Attribute methods : SetTextColor &nbsp;TextColor%\r
+\r
+\r
+#--------------------------------------------------------------------------\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create &nbsp; &nbsp;AttributeTextColor\r
+#===========================================================\r
+import SALOMEDS_Attributes_idl\r
+color = SALOMEDS_Attributes_idl._0_SALOMEDS.Color(234,345,231)\r
+\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeTextColor&quot;)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTextColor attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeTextColor)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTextColor attribute&quot;\r
+\r
+A.SetTextColor(color)\r
+\r
+c = A.TextColor();\r
+\r
+if c.R != 234 or c.G != 345 or c.B != 231:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Error: wrong value of AttributeTextColor&quot;\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#============================================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy = batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; &nbsp; find &nbsp; AttributeTextColor\r
+#============================================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeTextColor&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeTextColor&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeTextColor)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTextColor attribute&quot;\r
+\r
+c = A.TextColor();\r
+if c.R != 234 or c.G != 345 or c.B != 231:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Error: wrong value of AttributeTextColor&quot;\r
+\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example13.html b/doc/salome/tui/KERNEL/exemple/Example13.html
new file mode 100755 (executable)
index 0000000..9ecf996
--- /dev/null
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%Test AttributeTextHighlightColor interface(creations/saving/restoring)%\r
+#%SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%\r
+#%Attribute methods : &nbsp;SetTextHighlightColor TextHighlightColor%\r
+\r
+#--------------------------------------------------------------------------\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create &nbsp; &nbsp;AttributeTextHighlightColor\r
+#===========================================================\r
+\r
+import SALOMEDS_Attributes_idl\r
+highlightcolor=SALOMEDS_Attributes_idl._0_SALOMEDS.Color(256,256,256)\r
+\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeTextHighlightColor&quot;)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTextHighlightColor attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeTextHighlightColor)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTextHighlightColor attribute&quot;\r
+\r
+A.SetTextHighlightColor(highlightcolor)\r
+\r
+c = A.TextHighlightColor();\r
+if c.R != 256 or c.G != 256 or c.B != 256:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Error: wrong value of AttributeTextHighlightColor&quot;\r
+\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#============================================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy=batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; &nbsp; find &nbsp; AttributeTextHighlightColor\r
+#============================================================\r
+\r
+res, A = father.FindAttribute(&quot;AttributeTextHighlightColor&quot;)\r
+print res, A\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeTextHighlightColor&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeTextHighlightColor)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTextHighlightColor attribute&quot;\r
+\r
+c = A.TextHighlightColor();\r
+\r
+if c.R != 256 or c.G != 256 or c.B != 256:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Error: wrong value of AttributeTextTextHighlightColor&quot;\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example14.html b/doc/salome/tui/KERNEL/exemple/Example14.html
new file mode 100755 (executable)
index 0000000..a4e0ada
--- /dev/null
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributePixMap interface (creations/saving/restoring)%\r
+#%SALOMEDS methods &nbsp;: FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%\r
+#%Attribute methods : SetPixMap, GetPixMap%\r
+\r
+#--------------------------------------------------------------------------\r
+\r
+#--------------------------------------------------------------------------\r
+# &nbsp; create &nbsp;AttributePixMap\r
+#===============================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributePixMap&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributePixMap attribute&quot;\r
+aPixmap = A._narrow(SALOMEDS.AttributePixMap);\r
+aPixmap.SetPixMap( &quot;ICON_OBJBROWSER_Geometry&quot; );\r
+\r
+if aPixmap.GetPixMap() != &quot;ICON_OBJBROWSER_Geometry&quot;:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Error: wrong value of AttributePixMap&quot;\r
+\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#============================================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy = batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; &nbsp; find &nbsp; AttributePixMap\r
+#============================================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributePixMap&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: AttributePixMap not found &quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributePixMap)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributePixMap attribute&quot;\r
+\r
+if A.GetPixMap() != &quot;ICON_OBJBROWSER_Geometry&quot;:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Error: wrong value of AttributePixMap&quot;\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example15.html b/doc/salome/tui/KERNEL/exemple/Example15.html
new file mode 100755 (executable)
index 0000000..f6cddac
--- /dev/null
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributeLocalID interface(creations/saving/restoring)%\r
+#%SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open% &nbsp; &nbsp;\r
+#%Attribute methods : Value, &nbsp;SetValue%\r
+\r
+# &nbsp; &nbsp; &nbsp; create AttributeLocalID\r
+#=================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeLocalID&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeLocalID attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeLocalID)\r
+\r
+A.SetValue(763242882)\r
+\r
+if A.Value() != 763242882:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Error: wrong value of AttributeLocalID&quot;\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#=================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy = batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find &nbsp;AttributeLocalID\r
+#=================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeLocalID&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeLocalID&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeLocalID)\r
+\r
+if A.Value() != 763242882:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Error: wrong value of AttributeLocalID&quot;\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example16.html b/doc/salome/tui/KERNEL/exemple/Example16.html
new file mode 100755 (executable)
index 0000000..ec8bfd5
--- /dev/null
@@ -0,0 +1,158 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>Methods : GetAvailableUndos, ChangeValue, FindOrCreateAttribute, SaveAs, GetAvailableRedos, Undo, FindComponent, Redo, FindAttribute, Open, CommitCommand, NewCommand\r
+\r
+\r
+dir= os.getenv(&quot;TmpDir&quot;)\r
+if dir == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;dir = &quot;/tmp&quot;\r
+\r
+batchmode_geompy.myBuilder._set_UndoLimit(20)\r
+\r
+# 1st transaction -----------------------------------------\r
+batchmode_geompy.myBuilder.NewCommand()\r
+# &nbsp; &nbsp; &nbsp; create AttributeSequenceOfInteger &nbsp; &nbsp; &nbsp;\r
+#=========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeSequenceOfInteger&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeSequenceOfInteger attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeSequenceOfInteger)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeSequenceOfInteger attribute&quot;\r
+\r
+A.Add(100)\r
+A.Add(300)\r
+A.Add(500)\r
+A.Add(400)\r
+A.Add(700)\r
+print &quot;First transaction goes on : &nbsp;HasOpenCommand() = &quot;, batchmode_geompy.myBuilder.HasOpenCommand()\r
+batchmode_geompy.myBuilder.CommitCommand() #--------------\r
+\r
+# 2nd transaction ------------------------------------------\r
+batchmode_geompy.myBuilder.NewCommand() \r
+A.Remove(3)\r
+A.ChangeValue(4,500)\r
+batchmode_geompy.myBuilder.CommitCommand() #--------------\r
+\r
+if batchmode_geompy.myBuilder.GetAvailableUndos() == 0:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeError, &quot;GetAvailableUndos() = 0 but must not !&quot;\r
+\r
+if A.Length() != 4:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong length of SequenceOfInteger&quot;\r
+if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 500:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Wrong &nbsp;value of &nbsp;AttributeSequenceOfInteger&quot;\r
+\r
+file1 = dir + &quot;/test1.hdf&quot;\r
+batchmode_geompy.myStudyManager.SaveAs(file1, batchmode_geompy.myStudy)\r
+\r
+# 1st Undo ---------------------------------------\r
+batchmode_geompy.myBuilder.Undo()\r
+res, A = batchmode_geompy.myBuilder.FindAttribute(batchmode_geompy.father, &quot;AttributeSequenceOfInteger&quot;)\r
+if A is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;After first 'undo' can't find AttributeSequenceOfInteger&quot;\r
+if A.Length() != 5:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong length of SequenceOfInteger&quot;\r
+if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 500 or A.Value(4) != 400 or &nbsp;A.Value(5) != 700:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &nbsp;A.Value(1), A.Value(2), A.Value(3), A.Value(4), A.Value(5)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Wrong &nbsp;value of &nbsp;AttributeSequenceOfInteger after the first 'undo'!&quot;\r
+# save \r
+file2 = dir + &quot;/test2.hdf&quot;\r
+batchmode_geompy.myStudyManager.SaveAs(file2, batchmode_geompy.myStudy)\r
+#-------------------------------------------------\r
+# 2nd Undo ---------------------------------------\r
+batchmode_geompy.myBuilder.Undo()\r
+res, attr = batchmode_geompy.myBuilder.FindAttribute(batchmode_geompy.father, &quot;AttributeSequenceOfInteger&quot;)\r
+if res !=0 or attr != None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;After the second 'undo' AttributeSequenceOfInteger exists but must not!&quot;\r
+file3 = dir + &quot;/test3.hdf&quot;\r
+batchmode_geompy.myStudyManager.SaveAs(file3, batchmode_geompy.myStudy)\r
+#-------------------------------------------------\r
+\r
+#make redo twice ---------------------------------\r
+if batchmode_geompy.myBuilder.GetAvailableRedos() == 0:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeError, &quot;GetAvailableRedos() = 0 but must not !&quot;\r
+batchmode_geompy.myBuilder.Redo()\r
+batchmode_geompy.myBuilder.Redo()\r
+res, A = batchmode_geompy.myBuilder.FindAttribute(batchmode_geompy.father, &quot;AttributeSequenceOfInteger&quot;)\r
+if res ==0 or A== None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;AttributeSequenceOfInteger is not found but must be!&quot;\r
+if A.Length() != 4:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong length of SequenceOfInteger&quot;\r
+if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 500:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Wrong &nbsp;value of &nbsp;AttributeSequenceOfInteger&quot;\r
+\r
+\r
+#----------------------------------------------------------------------\r
+openedStudy=batchmode_geompy.myStudyManager.Open(file1);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find AttributeSequenceOfInteger\r
+#======================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeSequenceOfInteger&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeSequenceOfInteger&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeSequenceOfInteger)\r
+\r
+if A.Length() != 4:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong length of SequenceOfInteger&quot;\r
+if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 500:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong &nbsp;value of &nbsp;AttributeSequenceOfInteger&quot;\r
+#----------------------------------------------------------------------\r
+openedStudy=batchmode_geompy.myStudyManager.Open(file2);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find AttributeSequenceOfInteger\r
+#======================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeSequenceOfInteger&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeSequenceOfInteger&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeSequenceOfInteger)\r
+\r
+if A.Length() != 5:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong length of SequenceOfInteger&quot;\r
+if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 500 or A.Value(4) != 400 or &nbsp;A.Value(5) != 700:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Wrong &nbsp;value of &nbsp;AttributeSequenceOfInteger after the first 'undo'!&quot;\r
+\r
+#----------------------------------------------------------------------\r
+openedStudy=batchmode_geompy.myStudyManager.Open(file3);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find AttributeSequenceOfInteger\r
+#======================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeSequenceOfInteger&quot;)\r
+\r
+if res!=0 or A != None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeError, &quot; AttributeSequenceOfInteger is found but must not!&quot;\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example17.html b/doc/salome/tui/KERNEL/exemple/Example17.html
new file mode 100755 (executable)
index 0000000..458ba1e
--- /dev/null
@@ -0,0 +1,162 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#% Check &nbsp;methods : %\r
+SALOMEDS methods : RemoveAttribute, FindOrCreateAttribute, NewStudy, GetAllAttributes, NewCommand, CommitCommand, AbortCommand, NewComponent%\r
+\r
+batchmode_geompy.myBuilder._set_UndoLimit(20)\r
+\r
+batchmode_geompy.myBuilder.NewCommand() \r
+child = batchmode_geompy.myBuilder.NewObject(batchmode_geompy.father)\r
+batchmode_geompy.myBuilder.CommitCommand()\r
+\r
+batchmode_geompy.myBuilder.NewCommand() \r
+#==========================================================\r
+# &nbsp; &nbsp; &nbsp; create AttributeSequenceOfReal &nbsp; &nbsp; &nbsp;\r
+#==========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, &quot;AttributeSequenceOfReal&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeSequenceOfReal attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeSequenceOfReal)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;_narrow returns None instead of AttributeSequenceOfReal pointer&quot;\r
+\r
+A.Add(0.0293)\r
+A.Add(522)\r
+A.Add(98234)\r
+A.Add(83.287)\r
+batchmode_geompy.myBuilder.CommitCommand()\r
+\r
+\r
+batchmode_geompy.myBuilder.NewCommand() \r
+#==========================================================\r
+# &nbsp; &nbsp; &nbsp;create &nbsp;AttributeInteger &nbsp; &nbsp; &nbsp;\r
+#==========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, &quot;AttributeInteger&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeInteger attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeInteger)\r
+A.SetValue(1000000)\r
+\r
+if A.Value() != 1000000:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error : wrong value of &nbsp;AttributeInteger&quot;\r
+\r
+batchmode_geompy.myBuilder.CommitCommand()\r
+\r
+batchmode_geompy.myBuilder.NewCommand() #===================\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create AttributeName &nbsp; &nbsp; \r
+#===========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, &quot;AttributeName&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A.SetValue(&quot;AttributesTesting&quot;)\r
+\r
+if A.Value() != &quot;AttributesTesting&quot;:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong &nbsp;value of AttributeName&quot; &nbsp; &nbsp; &nbsp; &nbsp;\r
+\r
+batchmode_geompy.myBuilder.CommitCommand()\r
+\r
+batchmode_geompy.myBuilder.NewCommand() #===================\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create &nbsp; &nbsp; AttributeComment \r
+#===========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, &quot;AttributeComment&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeComment attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeComment)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeComment attribute&quot;\r
+\r
+A.SetValue(&quot;GEOM&quot;)\r
+\r
+batchmode_geompy.myBuilder.AbortCommand()\r
+\r
+batchmode_geompy.myBuilder.NewCommand() #===================\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; create &nbsp; AttributePersistentRef &nbsp; \r
+#===========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, &quot;AttributePersistentRef&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributePersistentRef attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributePersistentRef)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributePersistentRef attribute&quot;\r
+\r
+A.SetValue(&quot;/tmp/test;1&quot;)\r
+batchmode_geompy.myBuilder.CommitCommand()\r
+\r
+batchmode_geompy.myBuilder.NewCommand() &nbsp;#===================================\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create &nbsp; &nbsp;AttributeDrawable &nbsp;\r
+#===========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, &quot;AttributeDrawable&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeDrawable attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeDrawable)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeDrawable attribute&quot;\r
+\r
+A.SetDrawable(1)\r
+\r
+if A.IsDrawable() == 0:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;&quot;Error: wrong value of AttributeDrawable&quot;\r
+batchmode_geompy.myBuilder.CommitCommand()\r
+\r
+\r
+\r
+batchmode_geompy.myBuilder.NewCommand() #===================\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create &nbsp; &nbsp;AttributeSelectable &nbsp;\r
+#===========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, &quot;AttributeSelectable&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeSelectable attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeSelectable)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeSelectable attribute&quot;\r
+\r
+A.SetSelectable(1)\r
+\r
+if A.IsSelectable() == 0:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;&quot;Error: wrong value of AttributeSelectable&quot;\r
+batchmode_geompy.myBuilder.CommitCommand()\r
+\r
+\r
+batchmode_geompy.myBuilder.NewCommand() #===================\r
+#===========================================================\r
+batchmode_geompy.myBuilder.RemoveAttribute(child,&quot;AttributeSelectable&quot;)\r
+batchmode_geompy.myBuilder.CommitCommand()\r
+\r
+# Control the attributes \r
+#===========================================================\r
+\r
+res, A = batchmode_geompy.myBuilder.FindAttribute(child, &quot;AttributeComment&quot;)\r
+print &quot;res = &quot;, res\r
+if A != None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot; AttributeComment was found&quot;\r
+else:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot; AttributeComment is not found. It's correct&quot;\r
+\r
+attributes=[]\r
\r
+attributes = child.GetAllAttributes()\r
+\r
+length = len(attributes)\r
+\r
+print &quot;Attributes number = &quot;, length\r
+print attributes\r
+for i in range(0, length) :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;attr = attributes[i]\r
+ &nbsp; &nbsp; &nbsp; &nbsp;if attr is None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;print i,&quot;None item of object attributes list&quot;\r
+\r
+if length != 5 :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeError, &quot;Wrong number of attributes&quot;\r
+\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example18.html b/doc/salome/tui/KERNEL/exemple/Example18.html
new file mode 100755 (executable)
index 0000000..a6c00d6
--- /dev/null
@@ -0,0 +1,171 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributeTreeNode interface(creations/saving/restoring)%\r
+#%SALOMEDS methods : FindOrCreateAttribute, NewObject%\r
+#%Attribute methods : HasFirst, HasFather, SetPrevious, Next, InsertAfter, GetFather, HasNext, SetValue, Append, NewStudy, Label, IsRoot, Prepend, SetFather, Depth, HasPrevious%\r
+\r
+child1 = batchmode_geompy.myBuilder.NewObject(batchmode_geompy.father)\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child1,&quot;AttributeName&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+A.SetValue(&quot;N1&quot;)\r
+N1 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child1, &quot;AttributeTreeNode&quot;)\r
+if N1 == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTreeNode attribute&quot;\r
+\r
+child2 = batchmode_geompy.myBuilder.NewObject(batchmode_geompy.father)\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child2,&quot;AttributeName&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+A.SetValue(&quot;N2&quot;)\r
+N2 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child2, &quot;AttributeTreeNode&quot;)\r
+if N2 == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTreeNode attribute&quot;\r
+\r
+child3 = batchmode_geompy.myBuilder.NewObject(batchmode_geompy.father)\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child3,&quot;AttributeName&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+A.SetValue(&quot;N3&quot;)\r
+N3 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child3, &quot;AttributeTreeNode&quot;)\r
+if N3 == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTreeNode attribute&quot;\r
+\r
+\r
+child11 = batchmode_geompy.myBuilder.NewObject(child1)\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child11,&quot;AttributeName&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+A.SetValue(&quot;N11&quot;)\r
+\r
+N11 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child11, &quot;AttributeTreeNode&quot;)\r
+\r
+if N11 == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTreeNode attribute&quot;\r
+\r
+child111 = batchmode_geompy.myBuilder.NewObject(child11)\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child111, &quot;AttributeName&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+A.SetValue(&quot;N111&quot;)\r
+\r
+N111 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child111, &quot;AttributeTreeNode&quot;)\r
+\r
+if N111 == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTreeNode attribute&quot;\r
\r
+\r
+child31 = batchmode_geompy.myBuilder.NewObject(child3)\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child31,&quot;AttributeName&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+A.SetValue(&quot;N31&quot;)\r
+\r
+N31 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child31, &quot;AttributeTreeNode&quot;)\r
+if N31 == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTreeNode attribute&quot;\r
+\r
+child32 = batchmode_geompy.myBuilder.NewObject(child3)\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child32,&quot;AttributeName&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+A.SetValue(&quot;N32&quot;)\r
+\r
+N32 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child32, &quot;AttributeTreeNode&quot;)\r
+if N32 == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTreeNode attribute&quot;\r
+\r
+child321 = batchmode_geompy.myBuilder.NewObject(child32)\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child321,&quot;AttributeName&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+A.SetValue(&quot;N321&quot;)\r
+\r
+N321 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child321, &quot;AttributeTreeNode&quot;)\r
+if N321 == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTreeNode attribute&quot;\r
+\r
+child33 = batchmode_geompy.myBuilder.NewObject(child3)\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child33,&quot;AttributeName&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+A.SetValue(&quot;N33&quot;)\r
+\r
+N33 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child33, &quot;AttributeTreeNode&quot;)\r
+if N33 == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTreeNode attribute&quot;\r
+\r
+child34 = batchmode_geompy.myBuilder.NewObject(child3)\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child34,&quot;AttributeName&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+A.SetValue(&quot;N34&quot;)\r
+\r
+N34 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child34, &quot;AttributeTreeNode&quot;)\r
+if N34 == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTreeNode attribute&quot;\r
+\r
+\r
+\r
+#Create links between tree nodes.\r
+# &nbsp;-| root\r
+# &nbsp; --N1 __\r
+# &nbsp; | &nbsp; &nbsp; N11__\r
+# &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; N111\r
+# &nbsp; --N2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \r
+# &nbsp; | &nbsp; \r
+# &nbsp; --N3__\r
+# &nbsp; &nbsp; &nbsp; &nbsp; N31\r
+# &nbsp; &nbsp; &nbsp; &nbsp; N32__\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;N321\r
+# &nbsp; &nbsp; &nbsp; &nbsp; N33\r
+# &nbsp; &nbsp; &nbsp; &nbsp; N34\r
+ &nbsp; &nbsp; &nbsp; &nbsp;\r
+N11.SetFather(N1)\r
+N11.Append(N111)\r
+N3.SetPrevious(N1)\r
+N3.Prepend(N2)\r
+\r
+N32.SetFather(N3)\r
+N32.Prepend(N31)\r
+N33.InsertAfter(N32)\r
+N33.Append(N34)\r
+print &quot;------------- &nbsp;&quot;, N1, &quot; &nbsp;------------- &nbsp;&quot;\r
+print &quot;N1.Label() = &quot;, N1.Label() , &quot;IsRoot() = &quot;, N1.IsRoot(), &quot;Depth() = &quot;, N1.Depth()\r
+print &quot;N11.Label() = &quot;, N11.Label() , &quot;IsRoot() = &quot;, N11.IsRoot(), &quot;Depth() = &quot;, N11.Depth()\r
+print &quot;N111.Label() = &quot;, N111.Label() , &quot;IsRoot() = &quot;, N111.IsRoot(), &quot;Depth() = &quot;, N111.Depth()\r
+print &quot;N2.Label() = &quot;, N2.Label() , &quot;IsRoot() = &quot;, &nbsp;N2.IsRoot(), &quot;Depth() = &quot;, N2.Depth()\r
+print &quot;N3.Label() = &quot;, N3.Label() , &quot;IsRoot() = &quot;, N3.IsRoot(), &quot;Depth() = &quot;, N3.Depth()\r
+print &quot;N31.Label() = &quot;, N31.Label() , &quot;IsRoot() = &quot;, N31.IsRoot(), &quot;Depth() = &quot;, N31.Depth()\r
+print &quot;N32.Label() = &quot;, N32.Label() , &quot;IsRoot() = &quot;, N32.IsRoot(), &quot;Depth() = &quot;, N32.Depth()\r
+print &quot;N321.Label() = &quot;, N321.Label() , &quot;IsRoot() = &quot;, N321.IsRoot(), &quot;Depth() = &quot;, N321.Depth()\r
+print &quot;N33.Label() = &quot;, N33.Label() , &quot;IsRoot() = &quot;, N33.IsRoot(), &quot;Depth() = &quot;, N33.Depth()\r
+print &quot;N34.Label() = &quot;, N34.Label() , &quot;IsRoot() = &quot;, N34.IsRoot(), &quot;Depth() = &quot;, N34.Depth()\r
+print &quot;N1.IsRoot()=&quot;, N1.IsRoot()\r
+\r
+print &quot;N1.HasNext() = &quot;,N1.HasNext()\r
+if &nbsp;N1.HasNext():\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print N1.Next().Label()\r
+\r
+print &quot;N32.HasPrevious() = &quot;,N32.HasPrevious()\r
+if &nbsp;N32.HasPrevious():\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print N32.GetPrevious().Label()\r
+\r
+print &quot;N111.HasFirst()=&quot;,N111.HasFirst()\r
+print &quot;N111.HasFather()=&quot;,N111.HasFather()\r
+if N111.HasFather() :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;N111.GetFather().Label()=&quot;,N111.GetFather().Label()\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example19.html b/doc/salome/tui/KERNEL/exemple/Example19.html
new file mode 100755 (executable)
index 0000000..4c5c290
--- /dev/null
@@ -0,0 +1,547 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Exemple</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>\r
+#^ SALOMEDS methods : &nbsp;FindOrCreateAttribute, Save, SaveAs, Close, Open, FindComponent, FindAttribute, FindObject, LoadWith^\r
+#^ Attribute methods : Value, SetValue^\r
+#======================================================================\r
+#1. Create Study and add some components to it\r
+#======================================================================\r
+\r
+#=================================\r
+# &nbsp; &nbsp; &nbsp; create AttributeReal &nbsp; &nbsp; &nbsp;\r
+#=================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeReal&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeReal attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeReal)\r
+A.SetValue(0.0001)\r
+if A.Value() != 0.0001:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error : wrong value of &nbsp;AttributeReal&quot;\r
+\r
+# === &nbsp;Geometry &nbsp;==================================================\r
+\r
+import batchmode_geompy\r
\r
+#===================================\r
+# &nbsp; &nbsp; define a box\r
+#===================================\r
+\r
+box = batchmode_geompy.MakeBox(0., 0., 0., 100., 200., 300.)\r
+idbox = batchmode_geompy.addToStudy(box,&quot;box&quot;)\r
+\r
+\r
+geom = batchmode_geompy.geom\r
+import SMESH\r
+import batchmode_smesh\r
+ShapeType = batchmode_smesh.ShapeType\r
+\r
+# ---- add first face of box in study\r
+\r
+subShapeList = batchmode_geompy.SubShapeAll(box,ShapeType[&quot;Face&quot;])\r
+face=subShapeList[0]\r
+name = &quot;box_face&quot;\r
+print name\r
+idface= batchmode_geompy.addToStudyInFather(box,face,name)\r
+\r
+# ---- add shell from box &nbsp;in study\r
+\r
+subShellList= batchmode_geompy.SubShapeAll(box,ShapeType[&quot;Shell&quot;])\r
+shell = subShellList[0]\r
+name = &quot;box_shell&quot;\r
+print name\r
+idshell= batchmode_geompy.addToStudyInFather(box,shell,name)\r
+\r
+# ---- add first edge of face in study\r
+\r
+edgeList = &nbsp;batchmode_geompy.SubShapeAll(face,ShapeType[&quot;Edge&quot;])\r
+edge=edgeList[0];\r
+name = &quot;face_edge&quot;\r
+print name\r
+idedge= batchmode_geompy.addToStudyInFather(face,edge,name)\r
+\r
+# ---- launch SMESH, init a Mesh with the box\r
+\r
+smesh = &nbsp;batchmode_smesh.smesh\r
+# &nbsp;-- &nbsp;Init &nbsp;--\r
+shape = batchmode_geompy.IDToObject(idbox)\r
+mesh=smesh.Init(geom, batchmode_geompy.myStudyId, shape)\r
+\r
+orb = batchmode_geompy.orb\r
+\r
+idmesh = batchmode_smesh.AddNewMesh( orb.object_to_string(mesh) )\r
+batchmode_smesh.SetName(idmesh, &quot;Meshbox&quot;);\r
+batchmode_smesh.SetShape(idbox, idmesh);\r
+\r
+# ---- create Hypothesis\r
+\r
+print &quot;-------------------------- create Hypothesis ----------------------&quot;\r
+print &quot;-------------------------- LocalLength&quot;\r
+hyp1 = smesh.CreateHypothesis(&quot;LocalLength&quot;, batchmode_geompy.myStudyId )\r
+hypLen1 = hyp1._narrow(SMESH.SMESH_LocalLength)\r
+hypLen1.SetLength(100)\r
+print hypLen1.GetName()\r
+print hypLen1.GetId()\r
+print hypLen1.GetLength()\r
+\r
+idlength = batchmode_smesh.AddNewHypothesis( orb.object_to_string(hypLen1) );\r
+batchmode_smesh.SetName(idlength, &quot;Local_Length_100&quot;);\r
+\r
+print &quot;-------------------------- NumberOfSegments&quot;\r
+hyp2 = &nbsp;smesh.CreateHypothesis(&quot;NumberOfSegments&quot;, batchmode_geompy.myStudyId )\r
+hypNbSeg1=hyp2._narrow(SMESH.SMESH_NumberOfSegments)\r
+hypNbSeg1.SetNumberOfSegments(7)\r
+print hypNbSeg1.GetName()\r
+print hypNbSeg1.GetId()\r
+print hypNbSeg1.GetNumberOfSegments()\r
+\r
+idseg = &nbsp;batchmode_smesh.AddNewHypothesis( orb.object_to_string(hypNbSeg1) );\r
+batchmode_smesh.SetName(idseg, &quot;NumberOfSegments_7&quot;);\r
+\r
+print &quot;-------------------------- MaxElementArea&quot;\r
+hyp3 = smesh.CreateHypothesis(&quot;MaxElementArea&quot;, &nbsp;batchmode_geompy.myStudyId)\r
+hypArea1=hyp3._narrow(SMESH.SMESH_MaxElementArea)\r
+hypArea1.SetMaxElementArea(2500)\r
+print hypArea1.GetName()\r
+print hypArea1.GetId()\r
+print hypArea1.GetMaxElementArea()\r
+\r
+idarea1 = batchmode_smesh.AddNewHypothesis( orb.object_to_string(hypArea1) );\r
+batchmode_smesh.SetName(idarea1, &quot;MaxElementArea_2500&quot;);\r
+\r
+print &quot;-------------------------- MaxElementArea&quot;\r
+hyp3 = smesh.CreateHypothesis(&quot;MaxElementArea&quot;, &nbsp;batchmode_geompy.myStudyId)\r
+hypArea2 = hyp3._narrow(SMESH.SMESH_MaxElementArea)\r
+hypArea2.SetMaxElementArea(500)\r
+print hypArea2.GetName()\r
+print hypArea2.GetId()\r
+print hypArea2.GetMaxElementArea()\r
+\r
+idarea2 = batchmode_smesh.AddNewHypothesis( orb.object_to_string(hypArea2) );\r
+batchmode_smesh.SetName(idarea2, &quot;MaxElementArea_500&quot;);\r
+\r
+print &quot;-------------------------- Regular_1D&quot;\r
+alg1 = smesh.CreateHypothesis(&quot;Regular_1D&quot;, &nbsp;batchmode_geompy.myStudyId)\r
+algo1 = alg1._narrow(SMESH.SMESH_Algo)\r
+listHyp = algo1.GetCompatibleHypothesis()\r
+for hyp in listHyp:\r
+ &nbsp; &nbsp;print hyp\r
+algoReg=alg1._narrow(SMESH.SMESH_Regular_1D)\r
+print algoReg.GetName()\r
+print algoReg.GetId()\r
+\r
+idreg = batchmode_smesh.AddNewAlgorithms( orb.object_to_string(algoReg) );\r
+batchmode_smesh.SetName(idreg, &quot;Regular_1D&quot;);\r
+\r
+print &quot;-------------------------- MEFISTO_2D&quot;\r
+alg2 = smesh.CreateHypothesis(&quot;MEFISTO_2D&quot;, &nbsp;batchmode_geompy.myStudyId)\r
+algo2 = alg2._narrow(SMESH.SMESH_Algo)\r
+listHyp=algo2.GetCompatibleHypothesis()\r
+for hyp in listHyp:\r
+ &nbsp; &nbsp;print hyp\r
+algoMef=alg2._narrow(SMESH.SMESH_MEFISTO_2D)\r
+print algoMef.GetName()\r
+print algoMef.GetId()\r
+\r
+idmef = batchmode_smesh.AddNewAlgorithms( orb.object_to_string(algoMef) );\r
+batchmode_smesh.SetName(idmef, &quot;MEFISTO_2D&quot;);\r
+\r
+\r
+# ---- add hypothesis to edge\r
+\r
+print &quot;-------------------------- add hypothesis to edge&quot;\r
+edge = batchmode_geompy.IDToObject(idedge)\r
+submesh = mesh.GetElementsOnShape(edge)\r
+ret = mesh.AddHypothesis(edge,algoReg)\r
+print ret\r
+ret=mesh.AddHypothesis(edge,hypLen1)\r
+print ret\r
+\r
+idsm1 = batchmode_smesh.AddSubMeshOnShape( idmesh,\r
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; idedge,\r
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; orb.object_to_string(submesh),\r
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShapeType[&quot;Edge&quot;] )\r
+batchmode_smesh.SetName(idsm1, &quot;SubMeshEdge&quot;)\r
+batchmode_smesh.SetAlgorithms( idsm1, idreg );\r
+batchmode_smesh.SetHypothesis( idsm1, idlength );\r
+\r
+print &quot;-------------------------- add hypothesis to face&quot;\r
+face=batchmode_geompy.IDToObject(idface)\r
+submesh=mesh.GetElementsOnShape(face)\r
+ret=mesh.AddHypothesis(face,hypArea2)\r
+print ret\r
+\r
+idsm2 = batchmode_smesh.AddSubMeshOnShape( idmesh,\r
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;idface,\r
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;orb.object_to_string(submesh),\r
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ShapeType[&quot;Face&quot;] )\r
+batchmode_smesh.SetName(idsm2, &quot;SubMeshFace&quot;)\r
+batchmode_smesh.SetHypothesis( idsm2, idarea2 );\r
+\r
+# ---- add hypothesis to box\r
+\r
+print &quot;-------------------------- add hypothesis to box&quot;\r
+box=batchmode_geompy.IDToObject(idbox)\r
+submesh=mesh.GetElementsOnShape(box)\r
+ret=mesh.AddHypothesis(box,algoReg)\r
+print ret\r
+ret=mesh.AddHypothesis(box,hypNbSeg1)\r
+print ret\r
+ret=mesh.AddHypothesis(box,algoMef)\r
+print ret\r
+ret=mesh.AddHypothesis(box,hypArea1)\r
+print ret\r
+\r
+batchmode_smesh.SetAlgorithms( idmesh, idreg );\r
+batchmode_smesh.SetHypothesis( idmesh, idseg );\r
+batchmode_smesh.SetAlgorithms( idmesh, idmef );\r
+batchmode_smesh.SetHypothesis( idmesh, idarea1 );\r
+\r
+# ---- compute box\r
+\r
+print &quot;-------------------------- compute box&quot;\r
+ret=smesh.Compute(mesh,box)\r
+print ret\r
+log=mesh.GetLog(0); # no erase trace\r
+for linelog in log:\r
+ &nbsp; &nbsp;print linelog\r
+\r
+\r
+#=======================================================\r
+# &nbsp; &nbsp;add &nbsp;SuperVision component\r
+#=======================================================\r
+\r
+from batchmode_SuperV import *\r
+import os\r
+dir= os.getenv(&quot;SUPERV_ROOT_DIR&quot;)\r
+if dir == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeError, &quot;SUPERV_ROOT_DIR is not defined&quot;\r
+xmlfile = dir +&quot;/examples/GraphEssai.xml&quot;\r
+print &quot;--------------\n&quot;+xmlfile+&quot;\n--------------\n&quot;\r
+\r
+myGraph = Graph ( xmlfile )\r
+\r
+# This DataFlow is &quot;valid&quot; : no loop, correct links between Nodes etc...\r
+print myGraph.IsValid()\r
+\r
+# Get Nodes\r
+myGraph.PrintNodes()\r
+Add,Sub,Mul,Div = myGraph.Nodes()\r
+\r
+# Load Datas\r
+Addx = Add.Input(&quot;x&quot;,3.)\r
+Addy = Add.Input(&quot;y&quot;,4.5)\r
+Subx = Sub.Input(&quot;x&quot;,1.5)\r
+\r
+# Get Output Port\r
+Addz = Add.Port('z')\r
+Subz = Sub.Port('z')\r
+Mulz = Mul.Port('z')\r
+Divz = Div.Port('z')\r
+\r
+# This DataFlow is &quot;executable&quot; : all pending Ports are defined with Datas\r
+print myGraph.IsExecutable()\r
+\r
+# Starts only execution of that DataFlow and gets control immediatly\r
+print myGraph.Run()\r
+\r
+# That DataFlow is running ==&gt; 0 (false)\r
+print myGraph.IsDone()\r
+\r
+# Events of execution :\r
+aStatus,aNode,anEvent,aState = myGraph.Event()\r
+while aStatus :\r
+ &nbsp; &nbsp;print aNode.Thread(),aNode.SubGraph(),aNode.Name(),anEvent,aState\r
+ &nbsp; &nbsp;aStatus,aNode,anEvent,aState = myGraph.Event()\r
+print myGraph.IsDone()\r
+\r
+# Wait for Completion (but it is already done after event loop ...)\r
+print &quot;Done : &quot;,myGraph.DoneW()\r
+\r
+# Get result\r
+print &quot;Result : &quot;,Divz.ToString()\r
+\r
+# Intermediate results :\r
+print &quot;Intermediate Result Add\z : &quot;,Addz.ToString()\r
+print &quot;Intermediate Result Sub\z : &quot;,Subz.ToString()\r
+print &quot;Intermediate Result Mul\z : &quot;,Mulz.ToString()\r
+\r
+print &quot; &quot;\r
+#print &quot;Type : print myGraph.IsDone()&quot;\r
+#print &quot; &nbsp; &nbsp; &nbsp; If execution is finished ==&gt; 1 (true)&quot;\r
+res=myGraph.IsDone()\r
+if res != 1:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeError, &quot;myGraph.Run() is not done&quot;\r
+\r
+print &quot; &quot;\r
+print &quot;Type : print Divz.ToString()&quot;\r
+print &quot; &nbsp; &nbsp; &nbsp; You will get the result&quot;\r
+Divz.ToString()\r
+\r
+print &quot; &quot;\r
+print &quot;Type : myGraph.PrintPorts()&quot;\r
+print &quot; &nbsp; &nbsp; &nbsp; to see input and output values of the graph&quot;\r
+myGraph.PrintPorts()\r
+\r
+print &quot; &quot;\r
+print &quot;Type : Add.PrintPorts()&quot;\r
+Add.PrintPorts()\r
+\r
+print &quot;Type : Sub.PrintPorts()&quot;\r
+Sub.PrintPorts()\r
+\r
+print &quot;Type : Mul.PrintPorts()&quot;\r
+Mul.PrintPorts()\r
+\r
+print &quot;Type : Div.PrintPorts()&quot;\r
+print &quot; &nbsp; &nbsp; &nbsp; to see input and output values of nodes&quot;\r
+Div.PrintPorts()\r
+\r
+# Export will create newsupervisionexample.xml and the corresponding .py file\r
+tmpdir=os.getenv(&quot;TmpDir&quot;)\r
+if tmpdir is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;tmpdir=&quot;/tmp&quot;\r
+file = tmpdir + &quot;/newsupervisionexample&quot;\r
+print &quot;--------------\n&quot;+file+&quot;\n--------------\n&quot;\r
+myGraph.Export(file)\r
+\r
+ior = batchmode_geompy.orb.object_to_string(myGraph.G)\r
+addStudy(ior)\r
+\r
+GraphName = myGraph.Name()\r
+print &quot;Befor save &quot;,\r
+nodes = myGraph.Nodes()\r
+length_bs = len(nodes)\r
+print &quot;ListOfNodes length = &quot;, length_bs\r
+names=[]\r
+for node in nodes:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;names.append(node.Name())\r
+print names\r
+\r
+\r
+#=================================\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#=================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None: &nbsp;\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+\r
+#==================================================\r
+#1. SaveAs\r
+#==================================================\r
+print &quot; ------- &nbsp;We will save to&quot;, file, &quot;-----------&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+batchmode_geompy.myStudyManager.Close(batchmode_geompy.myStudy)\r
+\r
+#rename the file and try to reread it again\r
+\r
+os.mkdir(str + &quot;/test_dir&quot;)\r
+\r
+#2.==================================================\r
+print &quot; ------- We rename the file as &quot; + str + &quot;/test_dir/test_new.hdf&quot;\r
+os.rename(file, str+&quot;/test_dir/test_new.hdf&quot;)\r
+\r
+#==================================================\r
+#3. Open\r
+#==================================================\r
+print &quot; ------- We try to open &quot; + str + &quot;/test_dir/test_new.hdf&quot;\r
+\r
+try:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;openedStudy=batchmode_geompy.myStudyManager.Open(str+&quot;/test_dir/test_new.hdf&quot;)\r
+except Exception:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;GEOM component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+#=================================\r
+# &nbsp; &nbsp; find AttributeReal\r
+#=================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeReal&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeReal&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeReal)\r
+if A.Value() != 0.0001:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error : wrong value of &nbsp;AttributeReal&quot;\r
+\r
+#==================================================\r
+# &nbsp; &nbsp; find &nbsp;box\r
+#==================================================\r
+box = openedStudy.FindObject(&quot;box&quot;)\r
+if box is None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;box was not found! Wrong study is opened.&quot;\r
+\r
+edge=openedStudy.FindObject(&quot;face_edge&quot;)\r
+if edge is None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;face_edge was not found! Wrong study is opened.&quot;\r
+\r
+\r
+father = openedStudy.FindComponent(&quot;MESH&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;MESH component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+hp=openedStudy.FindObject(&quot;Meshbox&quot;)\r
+if hp is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Meshbox object was not found! Wrong study is opened.&quot;\r
+\r
+hp = openedStudy.FindObject(&quot;Algorithms Definition&quot;)\r
+if hp is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Algorithms Definition object was not found! Wrong study is opened.&quot;\r
+\r
+hp = openedStudy.FindObject(&quot;MEFISTO_2D&quot;)\r
+if hp is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;MEFISTO_2D object was not found! Wrong study is opened.&quot;\r
+\r
+hp = openedStudy.FindObject(&quot;Hypothesis Definition&quot;)\r
+if hp is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Algoriths Definition was not found! Wrong study is opened.&quot;\r
+\r
+#==================================================\r
+# Find Supervisor\r
+#==================================================\r
+father = openedStudy.FindComponent(&quot;SUPERV&quot;)\r
+if father is None: \r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;SUPERV component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+SuperV = lcc.FindOrLoadComponent(&quot;SuperVisionContainer&quot;,&quot;Supervision&quot;)\r
+Builder = openedStudy.NewBuilder()\r
+Builder.LoadWith(father, SuperV)\r
+import SALOMEDS\r
+\r
+aChildIterator = openedStudy.NewChildIterator(father)\r
+\r
+#while aChildIterator.More():\r
+anSObject = aChildIterator.Value()\r
+#print &quot;iterate: &quot;, anSObject.GetID()\r
+res, anAttr=anSObject.FindAttribute(&quot;AttributeIOR&quot;)\r
+if res :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;anAttr=anAttr._narrow(SALOMEDS.AttributeIOR)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;ior = anAttr.Value()\r
+ &nbsp; &nbsp; &nbsp; &nbsp;Graph=SuperV.getGraph(ior)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;ListOfNodes=Graph.Nodes()\r
+ &nbsp; &nbsp; &nbsp; &nbsp;length_as= len(ListOfNodes)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;ListOfNodes length = &quot;, length_as\r
+ &nbsp; &nbsp; &nbsp; &nbsp;if length_as != length_bs:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeErrror, &quot;defferent length of nodes after study open&quot;\r
+#aChildIterator.Next()\r
+\r
+Names = []\r
+for node in ListOfNodes:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;Names.append(node.Name())\r
+names.sort()\r
+Names.sort()\r
+if names != Names :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeError, &quot;List of dataflow nodes after save differs from one befor save operation&quot;\r
+\r
+#==================================================\r
+#4. Save\r
+#==================================================\r
+batchmode_geompy.myStudyManager.Save(openedStudy)\r
+batchmode_geompy.myStudyManager.Close(openedStudy)\r
+#==================================================\r
+#5. Open\r
+#==================================================\r
+try:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;openedStudy = batchmode_geompy.myStudyManager.Open(str+&quot;/test_dir/test_new.hdf&quot;)\r
+except Exception:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+#find AttributeReal\r
+res,A=father.FindAttribute(&quot;AttributeReal&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeReal&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeReal)\r
+if A.Value() != 0.0001:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error : wrong value of &nbsp;AttributeReal&quot;\r
+#==================================================\r
+# &nbsp; &nbsp; find &nbsp;box\r
+#==================================================\r
+box = openedStudy.FindObject(&quot;box&quot;)\r
+if box is None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;box was not found! Wrong study is opened.&quot;\r
+\r
+edge=openedStudy.FindObject(&quot;face_edge&quot;)\r
+if edge is None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;face_edge was not found! Wrong study is opened.&quot;\r
+\r
+\r
+father = openedStudy.FindComponent(&quot;MESH&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;MESH component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+hp=openedStudy.FindObject(&quot;Meshbox&quot;)\r
+if hp is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Meshbox object was not found! Wrong study is opened.&quot;\r
+\r
+hp = openedStudy.FindObject(&quot;Algorithms Definition&quot;)\r
+if hp is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Algorithms Definition object was not found! Wrong study is opened.&quot;\r
+\r
+hp = openedStudy.FindObject(&quot;MEFISTO_2D&quot;)\r
+if hp is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;MEFISTO_2D object was not found! Wrong study is opened.&quot;\r
+\r
+hp = openedStudy.FindObject(&quot;Hypothesis Definition&quot;)\r
+if hp is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Algoriths Definition was not found! Wrong study is opened.&quot;\r
+\r
+#==================================================\r
+# Find Supervisor\r
+#==================================================\r
+father = openedStudy.FindComponent(&quot;SUPERV&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;SUPERV component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+SuperV = lcc.FindOrLoadComponent(&quot;SuperVisionContainer&quot;,&quot;Supervision&quot;)\r
+Builder = openedStudy.NewBuilder()\r
+Builder.LoadWith(father, SuperV)\r
+import SALOMEDS\r
+\r
+aChildIterator = openedStudy.NewChildIterator(father)\r
+\r
+#while aChildIterator.More():\r
+anSObject = aChildIterator.Value()\r
+\r
+res, anAttr=anSObject.FindAttribute(&quot;AttributeIOR&quot;)\r
+if res :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;anAttr=anAttr._narrow(SALOMEDS.AttributeIOR)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;ior = anAttr.Value()\r
+ &nbsp; &nbsp; &nbsp; &nbsp;Graph=SuperV.getGraph(ior)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;ListOfNodes=Graph.Nodes()\r
+ &nbsp; &nbsp; &nbsp; &nbsp;length_as= len(ListOfNodes)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;ListOfNodes length = &quot;, length_as\r
+ &nbsp; &nbsp; &nbsp; &nbsp;if length_as != length_bs:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeErrror, &quot;defferent length of nodes after study open&quot;\r
+#aChildIterator.Next()\r
+\r
+Names = []\r
+for node in ListOfNodes:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;Names.append(node.Name())\r
+names.sort()\r
+Names.sort()\r
+if names != Names :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeError, &quot;List of dataflow nodes after save differs from one befor save operation&quot;\r
+</PRE>\r
diff --git a/doc/salome/tui/KERNEL/exemple/Example2.html b/doc/salome/tui/KERNEL/exemple/Example2.html
new file mode 100755 (executable)
index 0000000..1636136
--- /dev/null
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributeInteger interface(creation/saving/restoring)%\r
+#%Methods : FindOrCreateAttribute , Value, SaveAs, SetValue, FindComponent, FindAttribute, Open%\r
+\r
+# &nbsp; &nbsp; &nbsp;create &nbsp;AttributeInteger &nbsp; &nbsp; &nbsp;\r
+#=================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeInteger&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeInteger attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeInteger)\r
+A.SetValue(1000000)\r
+\r
+if A.Value() != 1000000:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error : wrong value of &nbsp;AttributeInteger&quot;\r
+\r
+# &nbsp; save and restore the study\r
+#=================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+# ... save ...\r
+batchmode_geompy.myStudyManager.SaveAs(str+&quot;/test.hdf&quot;, batchmode_geompy.myStudy)\r
+# ... open ...\r
+openedStudy= batchmode_geompy.myStudyManager.Open(str+&quot;/test.hdf&quot;);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+# &nbsp; &nbsp; find AttributeInteger\r
+#================================\r
+res,A=father.FindAttribute(&quot;AttributeInteger&quot;)\r
+if res == 0 &nbsp;or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeInteger&quot;\r
+A = A._narrow(SALOMEDS.AttributeInteger)\r
+if A.Value() != 1000000:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error : wrong value of &nbsp;AttributeInteger after study restoring&quot;\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example20.html b/doc/salome/tui/KERNEL/exemple/Example20.html
new file mode 100755 (executable)
index 0000000..3019ad8
--- /dev/null
@@ -0,0 +1,160 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Exemple</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>\r
+#^SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, NewCommand, GetProperties, Open, CommitCommand, NewBuilder^\r
+#^Attribute methods : SetLocked, IsLocked, GetCreationMode, SetCreationDate, IsModified, GetUserName, Value, SetUserName, SetValue, GetCreationDate^\r
+\r
+batchmode_geompy.myBuilder._set_UndoLimit(20)\r
+\r
+#--------------------------------------------------------------------------\r
+# &nbsp; &nbsp; &nbsp; create AttributeReal &nbsp; &nbsp; &nbsp;\r
+#===============================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeReal&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeReal attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeReal)\r
+A.SetValue(0.0001)\r
+if A.Value() != 0.0001:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error : wrong value of &nbsp;AttributeReal&quot;\r
+\r
+# &nbsp; &nbsp; &nbsp;create AttributeStudyProperties\r
+#================================================\r
+A = batchmode_geompy.myStudy.GetProperties()\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeStudyProperties attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeStudyProperties)\r
+\r
+batchmode_geompy.myBuilder.NewCommand();\r
+print &quot;A.GetUserName()= &quot;, A.GetUserName()\r
+res,mm,hh,dd,mnth,yy=A.GetCreationDate()\r
+print &quot;A.GetCreationDate() = &quot;, mm,hh,dd,mnth,yy\r
+print &quot;A.GetCreationMode() = &quot;, A.GetCreationMode()\r
+print &quot;A.IsModified() = &quot;, A.IsModified()\r
+print &quot;A.IsLocked() = &quot;, A.IsLocked()\r
+if A.IsLocked() == 0 :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;A.SetUserName(&quot;tester&quot;); print 'A.SetUserName(&quot;tester&quot;), A.GetUserName() = ', A.GetUserName()\r
+ &nbsp; &nbsp; &nbsp; &nbsp;A.SetCreationDate(11,11,11,11,2002); print 'A.SetCreationDate(11,11,11,11,2002), A.GetCreationDate() =', A.GetCreationDate()\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;A.IsModified() = &quot;, A.IsModified()\r
+A.SetLocked(1)\r
+\r
+#check the transaction result \r
+batchmode_geompy.myBuilder.CommitCommand()\r
+if A.GetUserName() != &quot;tester&quot;:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print 'Control after transaction close : A.GetUserName() = ', A.GetUserName()\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeError, &quot;Field 'UserName' was not modified but had to!&quot;\r
+\r
+# try to make some changes wrapped by transaction \r
+#================================================\r
+batchmode_geompy.myBuilder.NewCommand()\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeInteger&quot;)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeInteger attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeInteger)\r
+A.SetValue(1000000)\r
+\r
+exception_was = None\r
+try : batchmode_geompy.myBuilder.CommitCommand()\r
+except Exception: exception_was = 1\r
+\r
+if exception_was is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeError, &quot;Study was locked for changes but CommitCommand did not generate an exception !&quot;\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+\r
+#================================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+print &quot; ------- &nbsp;We will save to&quot;, file, &quot;-----------&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+\r
+\r
+#--------------------------------------------------------------------------#\r
+#--------------------------- Open file ------------------------------------# \r
+#--------------------------------------------------------------------------#\r
+\r
+print&quot; -------------- Open &nbsp;&quot; + file + &quot;-------------- &quot; \r
+\r
+openedStudy = batchmode_geompy.myStudyManager.Open(file)\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+#1. &nbsp; &nbsp; find AttributeReal\r
+#================================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeReal&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeReal&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeReal)\r
+if A.Value() != 0.0001:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error : wrong value of &nbsp;AttributeReal&quot;\r
\r
+\r
+#2. &nbsp; &nbsp; find AttributeStudyProperties\r
+#=================================================\r
+A=openedStudy.GetProperties()\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeStudyProperties&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeStudyProperties)\r
+if A.IsLocked() == 0 :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error : AttributeStudyProperties must have Locked flag but have no!&quot;\r
+\r
+#get the builder\r
+myBuilder = openedStudy.NewBuilder()\r
+\r
+#3. try to make some changes wrapped by transaction \r
+#==================================================\r
+exception_was = None\r
+try : \r
+ &nbsp; &nbsp; &nbsp; &nbsp;myBuilder.NewCommand()\r
+ &nbsp; &nbsp; &nbsp; &nbsp;A = myBuilder.FindOrCreateAttribute(father, &quot;AttributeInteger&quot;)\r
+\r
+ &nbsp; &nbsp; &nbsp; &nbsp;if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeInteger attribute&quot;\r
+ &nbsp; &nbsp; &nbsp; &nbsp;A = A._narrow(SALOMEDS.AttributeInteger)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;A.SetValue(1000000)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;myBuilder.CommitCommand()\r
+except Exception: exception_was = 1\r
+\r
+if exception_was is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise RuntimeError, &quot;Study was locked for changes but CommitCommand did not generate an exception !&quot;\r
+\r
+\r
+myBuilder.NewCommand()\r
+A=openedStudy.GetProperties()\r
+A = A._narrow(SALOMEDS.AttributeStudyProperties)\r
+A.SetLocked(0)\r
+myBuilder.CommitCommand()\r
+\r
+#4.\r
+myBuilder.NewCommand()\r
+A.SetLocked(0);\r
+print &quot;A.GetUserName()= &quot;, A.GetUserName()\r
+print &quot;A.GetCreationDate() = &quot;, A.GetCreationDate()\r
+print &quot;A.GetCreationMode() = &quot;, A.GetCreationMode()\r
+print &quot;A.IsModified() = &quot;, A.IsModified()\r
+myBuilder.CommitCommand()\r
+\r
+#5.\r
+myBuilder.NewCommand()\r
+A.SetUserName(&quot;tester1&quot;)\r
+myBuilder.CommitCommand()\r
+print &quot;A.GetUserName()= &quot;, A.GetUserName()\r
+\r
+#remove the document file\r
+os.remove(file)\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example21.html b/doc/salome/tui/KERNEL/exemple/Example21.html
new file mode 100755 (executable)
index 0000000..981e9d7
--- /dev/null
@@ -0,0 +1,136 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Exemple</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>\r
+#^SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open^\r
+#^Attribute methods: GetValue, GetNbColumns, AddColumn, SetRowTitles, PutValue, GetColumn, GetColumnTitles, GetTitle, SetRow, GetRowTitles, SetColumnTitles, SetColumn, GetRow, GetNbRows, SetColumnTitle, AddRow, SetTitle, SetRowTitle^\r
+\r
+# &nbsp; &nbsp; &nbsp; create AttributeReal &nbsp; &nbsp; &nbsp;\r
+#=======================================================================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeTableOfInteger&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTableOfInteger attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeTableOfInteger)\r
+a=[1,2]\r
+\r
+b=[3,4]\r
+\r
+# &nbsp; &nbsp;2x2\r
+# --- rows ---\r
+A.AddRow(a)\r
+A.AddRow(b)\r
+a=[34,14]\r
+A.SetRow(1,a)\r
+\r
+# &nbsp; &nbsp;3x3\r
+#\r
+b=[54,56]\r
+A.AddRow(b)\r
+\r
+# --- columns ---\r
+a=[76,25,12]\r
+\r
+A.AddColumn(a)\r
+a=[836,3425,342]\r
+A.SetColumn(3,a)\r
+\r
+# change attribute values\r
+print &quot;A.GetValue(2,2) = &quot;, A.GetValue(2,2)\r
+print &quot;A.PutValue(2,2,625323)&quot;\r
+A.PutValue(625323,2,2)\r
+print &quot;A.GetValue(2,2) = &quot;, A.GetValue(2,2)\r
+\r
+#set Titles\r
+\r
+A.SetTitle(&quot;TEST&quot;)\r
+\r
+A.SetRowTitle(1,&quot;FR&quot;)\r
+A.SetRowTitle(2,&quot;SR&quot;)\r
+A.SetRowTitle(3,&quot;TR&quot;)\r
+\r
+A.SetColumnTitle(1,&quot;FC&quot;)\r
+A.SetColumnTitle(2,&quot;SC&quot;)\r
+A.SetColumnTitle(3,&quot;TC&quot;)\r
+\r
+\r
+#check the table\r
+print &quot;Common title : &quot;,A.GetTitle()\r
+print &quot;Rows titles : &quot;, &nbsp;A.GetRowTitles()\r
+rnb = A.GetNbRows()\r
+for i in range(1, rnb):\r
+ &nbsp; &nbsp; &nbsp; &nbsp;b=A.GetRow(i)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print b\r
+\r
+cnb = A.GetNbColumns()\r
+print &quot;Columns title : &quot;, A.GetColumnTitles()\r
+for i in range(1, cnb):\r
+ &nbsp; &nbsp; &nbsp; &nbsp;b=A.GetColumn(i)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print b\r
+\r
+# set titles\r
+#titles=[&quot;11&quot;,&quot;12&quot;,&quot;13&quot;]\r
+#A.SetRowTitles(titles)\r
+#titles=[&quot;21&quot;,&quot;22&quot;,&quot;23&quot;]\r
+#A.SetRowTitles(2,titles)\r
+#titles=[&quot;31&quot;,&quot;32&quot;,&quot;33&quot;]\r
+#A.SetRowTitles(3,titles)\r
+\r
+#--------------------------------------------------------------------------#\r
+# ----------------------- save the study ----------------------------------#\r
+#--------------------------------------------------------------------------#\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+print &quot; ------- &nbsp;We will save to&quot;, file, &quot;-----------&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+\r
+#--------------------------------------------------------------------------#\r
+#---------------------------- Open file -----------------------------------# \r
+#--------------------------------------------------------------------------#\r
+\r
+print&quot; -------------- Open &nbsp;&quot; + file + &quot;-------------- &quot; \r
+\r
+openedStudy=batchmode_geompy.myStudyManager.Open(file)\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+# --- check attribute ---\r
+\r
+res,A=father.FindAttribute(&quot;AttributeTableOfInteger&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeTableOfInteger&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeTableOfInteger)\r
+\r
+#check the table\r
+print &quot;Common title : &quot;,A.GetTitle()\r
+print &quot;Rows titles : &quot;, &nbsp;A.GetRowTitles()\r
+rnb = A.GetNbRows()\r
+for i in range(1, rnb):\r
+ &nbsp; &nbsp; &nbsp; &nbsp;b=A.GetRow(i)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print b\r
+\r
+cnb = A.GetNbColumns()\r
+print &quot;Columns title : &quot;, A.GetColumnTitles()\r
+for i in range(1, cnb):\r
+ &nbsp; &nbsp; &nbsp; &nbsp;b=A.GetColumn(i)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print b\r
+\r
+titles=[&quot;ff&quot;,&quot;ss&quot;,&quot;tt&quot;]\r
+A.SetRowTitles(titles)\r
+print &quot;Rows titles : &quot;, &nbsp;A.GetRowTitles()\r
+\r
+titles=[&quot;ww&quot;,&quot;zz&quot;,&quot;cc&quot;]\r
+A.SetColumnTitles(titles)\r
+print &quot;Column titles : &quot;, &nbsp;A.GetColumnTitles()\r
+\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example22.html b/doc/salome/tui/KERNEL/exemple/Example22.html
new file mode 100755 (executable)
index 0000000..f6a3f6e
--- /dev/null
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Exemple</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>\r
+#^ SALOMEDS methods &nbsp;: FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open^\r
+#^ Attribute methods : GetValue, GetNbColumns, AddColumn, SetRowTitles, PutValue, &nbsp;GetColumn, &nbsp;GetColumnTitles, GetTitle, SetRow, GetRowTitles, SetColumnTitles, &nbsp;SetColumn, &nbsp;GetRow, &nbsp;GetNbRows, SetColumnTitle, AddRow, SetTitle, SetRowTitle^\r
+\r
+# &nbsp; &nbsp; &nbsp; create AttributeReal &nbsp; &nbsp; &nbsp;\r
+#===============================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeTableOfReal&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeTableOfReal attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeTableOfReal)\r
+a=[1,2]\r
+\r
+b=[3,4]\r
+\r
+# &nbsp; &nbsp;2x2\r
+# --- rows ---\r
+A.AddRow(a)\r
+A.AddRow(b)\r
+a=[34,14]\r
+A.SetRow(1,a)\r
+\r
+# &nbsp; &nbsp;3x3\r
+#\r
+b=[54,56]\r
+A.AddRow(b)\r
+\r
+# --- columns ---\r
+a=[76,25,12]\r
+\r
+A.AddColumn(a)\r
+a=[836,3425,342]\r
+A.SetColumn(3,a)\r
+\r
+# change attribute values\r
+print &quot;A.GetValue(2,2) = &quot;, A.GetValue(2,2)\r
+print &quot;A.PutValue(2,2,625323)&quot;\r
+A.PutValue(625323,2,2)\r
+print &quot;A.GetValue(2,2) = &quot;, A.GetValue(2,2)\r
+\r
+#set Titles\r
+\r
+A.SetTitle(&quot;TEST&quot;)\r
+\r
+A.SetRowTitle(1,&quot;FR&quot;)\r
+A.SetRowTitle(2,&quot;SR&quot;)\r
+A.SetRowTitle(3,&quot;TR&quot;)\r
+\r
+A.SetColumnTitle(1,&quot;FC&quot;)\r
+A.SetColumnTitle(2,&quot;SC&quot;)\r
+A.SetColumnTitle(3,&quot;TC&quot;)\r
+\r
+\r
+#check the table\r
+print &quot;Common title : &quot;,A.GetTitle()\r
+print &quot;Rows titles : &quot;, &nbsp;A.GetRowTitles()\r
+rnb = A.GetNbRows() + 1\r
+for i in range(1, rnb):\r
+ &nbsp; &nbsp; &nbsp; &nbsp;b=A.GetRow(i)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print b\r
+\r
+cnb = A.GetNbColumns() + 1\r
+print &quot;Columns title : &quot;, A.GetColumnTitles()\r
+for i in range(1, cnb):\r
+ &nbsp; &nbsp; &nbsp; &nbsp;b=A.GetColumn(i)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print b\r
+\r
+# set titles\r
+#titles=[&quot;11&quot;,&quot;12&quot;,&quot;13&quot;]\r
+#A.SetRowTitles(titles)\r
+#titles=[&quot;21&quot;,&quot;22&quot;,&quot;23&quot;]\r
+#A.SetRowTitles(2,titles)\r
+#titles=[&quot;31&quot;,&quot;32&quot;,&quot;33&quot;]\r
+#A.SetRowTitles(3,titles)\r
+\r
+#--------------------------------------------------------------------------#\r
+#------------------------ save the study ----------------------------------#\r
+#--------------------------------------------------------------------------#\r
+import os\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+print &quot; ------- &nbsp;We will save to&quot;, file, &quot;-----------&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+\r
+#--------------------------------------------------------------------------#\r
+#---------------------------- Open file -----------------------------------# \r
+#--------------------------------------------------------------------------#\r
+\r
+print&quot; -------------- Open &nbsp;&quot; + file + &quot;-------------- &quot; \r
+\r
+openedStudy = batchmode_geompy.myStudyManager.Open(file)\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+# --- check attribute ---\r
+\r
+res,A=father.FindAttribute(&quot;AttributeTableOfReal&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeTableOfReal&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeTableOfReal)\r
+\r
+#check the table\r
+print &quot;Common title : &quot;,A.GetTitle()\r
+print &quot;Rows titles : &quot;, &nbsp;A.GetRowTitles()\r
+rnb = A.GetNbRows() + 1\r
+for i in range(1, rnb):\r
+ &nbsp; &nbsp; &nbsp; &nbsp;b=A.GetRow(i)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print b\r
+\r
+cnb = A.GetNbColumns() + 1\r
+print &quot;Columns title : &quot;, A.GetColumnTitles()\r
+for i in range(1, cnb):\r
+ &nbsp; &nbsp; &nbsp; &nbsp;b=A.GetColumn(i)\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print b\r
+\r
+titles=[&quot;ff&quot;,&quot;ss&quot;,&quot;tt&quot;]\r
+A.SetRowTitles(titles)\r
+print &quot;Rows titles : &quot;, &nbsp;A.GetRowTitles()\r
+\r
+titles=[&quot;ww&quot;,&quot;zz&quot;,&quot;cc&quot;]\r
+A.SetColumnTitles(titles)\r
+print &quot;Column titles : &quot;, &nbsp;A.GetColumnTitles()\r
+\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example23.html b/doc/salome/tui/KERNEL/exemple/Example23.html
new file mode 100755 (executable)
index 0000000..6231704
--- /dev/null
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Exemple</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>\r
+import batchmode_salome\r
+#import SALOMEDS\r
+\r
+aStudy = batchmode_salome.myStudy &nbsp; &nbsp;\r
+\r
+#Add new component 'User data'\r
+aBuilder = aStudy.NewBuilder()\r
+aComponent = aBuilder.NewComponent(&quot;User data&quot;)\r
+anAttr = aBuilder.FindOrCreateAttribute(aComponent, &quot;AttributeName&quot;)\r
+anAttrName = anAttr._narrow(SALOMEDS.AttributeName) \r
+anAttrName.SetValue(&quot;User data&quot;)\r
+\r
+\r
+#Add a new case 'Case1' to the component 'User data'\r
+aBuilder.AddDirectory(&quot;/User data/Case1&quot;)\r
+\r
+#Set a study context to '/User data/Case1'\r
+aStudy.SetContext(&quot;/User data/Case1&quot;)\r
+\r
+#Print the current study context\r
+print aStudy.GetContext()\r
+\r
+#Add a sub directory 'aSubCase' to 'Case1' (under the current context)\r
+aBuilder.AddDirectory(&quot;aSubCase&quot;)\r
+\r
+\r
+#Add a new case 'Case2' to component 'User data'\r
+aBuilder.AddDirectory(&quot;/User data/Case2&quot;)\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example3.html b/doc/salome/tui/KERNEL/exemple/Example3.html
new file mode 100755 (executable)
index 0000000..477d80c
--- /dev/null
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributeSequenceOfReal interface(creations/saving/restoring)%\r
+#% AttributeSequenceOfReal &nbsp;: ChangeValue, Add, &nbsp;Value, &nbsp;Remove, &nbsp;Length%\r
+#% SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%\r
+\r
+# &nbsp; &nbsp; &nbsp; create AttributeSequenceOfReal &nbsp; &nbsp; &nbsp;\r
+#=================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeSequenceOfReal&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeSequenceOfReal attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeSequenceOfReal)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;_narrow returns None instead of AttributeSequenceOfReal pointer&quot;\r
+\r
+A.Add(0.0293)\r
+A.Add(625.1e+2)\r
+A.Add(0.928e+100)\r
+A.Add(83.287)\r
+\r
+print &quot;initial values &quot;,A.Value(1), A.Value(2), A.Value(3), A.Value(4)\r
+A.Remove(3)\r
+print &quot;after remove &quot;, A.Value(1), A.Value(2), A.Value(3)\r
+A.ChangeValue(2,76.265)\r
+print &quot;after second item change&quot;, A.Value(1), A.Value(2), A.Value(3)\r
+\r
+if A.Length() != 3:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Error : wrong length of SequenceOfReal&quot;\r
+if A.Value(1) != 0.0293 or A.Value(2) != 76.265 or A.Value(3) != 83.287:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Error : wrong value of &nbsp;AttributeSequenceOfReal&quot;\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#=================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy=batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find AttributeSequenceOfReal\r
+#=================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeSequenceOfReal&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeSequenceOfReal&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeSequenceOfReal)\r
+\r
+if A.Length() != 3:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Error : wrong length of SequenceOfReal&quot;\r
+if A.Value(1) != 0.0293 or A.Value(2) != 76.265 or A.Value(3) != 83.287:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Error : wrong value of &nbsp;AttributeSequenceOfReal&quot;\r
+print &quot;after restoring &quot;, A.Value(1), A.Value(2), A.Value(3)\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example4.html b/doc/salome/tui/KERNEL/exemple/Example4.html
new file mode 100755 (executable)
index 0000000..4539170
--- /dev/null
@@ -0,0 +1,66 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributeSequenceOfInteger interface(creations/saving/restoring)%\r
+#%SALOMEDS methods : FindOrCreateAttribute FindComponent FindAttribute Open Add SaveAs%\r
+#%AttributeSequenceOfInteger methods : &nbsp;Value, Remove, Length%\r
+\r
+# &nbsp; &nbsp; &nbsp; create AttributeSequenceOfInteger &nbsp; &nbsp; &nbsp;\r
+#==========================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeSequenceOfInteger&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeSequenceOfInteger attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeSequenceOfInteger)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeSequenceOfInteger attribute&quot;\r
+\r
+A.Add(100)\r
+A.Add(300)\r
+A.Add(500)\r
+A.Add(400)\r
+A.Add(700)\r
+\r
+A.Remove(3)\r
+A.ChangeValue(4,500)\r
+\r
+\r
+if A.Length() != 4:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong length of SequenceOfInteger&quot;\r
+if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 700:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong &nbsp;value of &nbsp;AttributeSequenceOfInteger&quot;\r
+\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#=================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy=batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find AttributeSequenceOfInteger\r
+#======================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeSequenceOfInteger&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeSequenceOfInteger&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeSequenceOfInteger)\r
+\r
+if A.Length() != 4:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong length of SequenceOfInteger&quot;\r
+if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 700:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong &nbsp;value of &nbsp;AttributeSequenceOfInteger&quot;\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example5.html b/doc/salome/tui/KERNEL/exemple/Example5.html
new file mode 100755 (executable)
index 0000000..79be2e4
--- /dev/null
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributeName interface(creations/saving/restoring)%\r
+#%SALOMEDS methods : FindOrCreateAttribute, &nbsp;SaveAs, FindComponent FindAttribute Open%\r
+#%Attribute methods : SetValue, Value%\r
+\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create AttributeName &nbsp; &nbsp; \r
+#===========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeName&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+A.SetValue(&quot;AttributesTesting&quot;)\r
+\r
+if A.Value() != &quot;AttributesTesting&quot;:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong &nbsp;value of AttributeName&quot;\r
+\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#=================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy = batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find AttributeName\r
+#======================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeName&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeName&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeName)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeName attribute&quot;\r
+\r
+if A.Value() != &quot;AttributesTesting&quot;:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Wrong &nbsp;value of AttributeName&quot;\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example6.html b/doc/salome/tui/KERNEL/exemple/Example6.html
new file mode 100755 (executable)
index 0000000..197c6b3
--- /dev/null
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributeComment interface(creations/saving/restoring)%\r
+#%SALOMEDS methods : FindOrCreateAttribute, SaveAs FindComponent FindAttribute &nbsp;Open%\r
+#%Attribute methods : Value, SetValue%\r
+\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create &nbsp; &nbsp; AttributeComment \r
+#===========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeComment&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeComment attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeComment)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeComment attribute&quot;\r
+\r
+A.SetValue(&quot;GEOM&quot;)\r
+\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#============================================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy = batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; &nbsp;find &nbsp; &nbsp;AttributeComment\r
+#============================================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeComment&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeComment&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeComment)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeComment attribute&quot;\r
+\r
+if A.Value() != &quot;GEOM&quot;:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;&quot;Error: wrong value of AttributeComment&quot;\r
+\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example7.html b/doc/salome/tui/KERNEL/exemple/Example7.html
new file mode 100755 (executable)
index 0000000..9bf8515
--- /dev/null
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributePersistentRef interface(creations/saving/restoring)%\r
+#%SALOMEDS methods : FindOrCreateAttribute, &nbsp;SaveAs, FindComponent FindAttribute Open%\r
+#%Attribute methods : SetValue, Value%\r
+\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create &nbsp; AttributePersistentRef &nbsp; \r
+#===========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributePersistentRef&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributePersistentRef attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributePersistentRef)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributePersistentRef attribute&quot;\r
+\r
+A.SetValue(&quot;/tmp/test;1&quot;)\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#============================================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy = batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find AttributePersistentRef\r
+#============================================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributePersistentRef&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributePersistentRef&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributePersistentRef)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributePersistentRef attribute&quot;\r
+\r
+if A.Value() != &quot;/tmp/test;1&quot;:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;&quot;Error: wrong value of AttributePersistentRef&quot;\r
+\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example8.html b/doc/salome/tui/KERNEL/exemple/Example8.html
new file mode 100755 (executable)
index 0000000..db96229
--- /dev/null
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributeDrawable interface(creations/saving/restoring)%\r
+#%SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%\r
+#%Attribute methods : SetDrawable, IsDrawable% \r
+#--------------------------------------------------------------------------\r
+\r
+from batchmode_geompy import *\r
+import os\r
+\r
+#--------------------------------------------------------------------------\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create &nbsp; &nbsp;AttributeDrawable &nbsp;\r
+#===========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeDrawable&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeDrawable attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeDrawable)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeDrawable attribute&quot;\r
+\r
+A.SetDrawable(1)\r
+\r
+if A.IsDrawable() == 0:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;&quot;Error: wrong value of AttributeDrawable&quot;\r
+\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#============================================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy=batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find &nbsp; AttributeDrawable\r
+#============================================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeDrawable&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeDrawable&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeDrawable)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeDrawable attribute&quot;\r
+\r
+if A.IsDrawable() == 0:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;&quot;Error: wrong value of AttributeDrawable&quot;\r
+\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/exemple/Example9.html b/doc/salome/tui/KERNEL/exemple/Example9.html
new file mode 100755 (executable)
index 0000000..6809dab
--- /dev/null
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>\r
+<HEAD>\r
+<!-- hennerik CVSweb $Revision$ -->\r
+<TITLE>Example</TITLE></HEAD>\r
+<BODY BGCOLOR="#eeeeee">\r
+<HR noshade><PRE>#%AttributeSelectable interface(creations/saving/restoring)%\r
+#%SALOMEDS methods: FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%\r
+#%Attribute methods: SetSelectable, IsSelectable%\r
+\r
+# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create &nbsp; &nbsp;AttributeSelectable &nbsp;\r
+#===========================================================\r
+A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, &quot;AttributeSelectable&quot;)\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeSelectable attribute&quot;\r
+A = A._narrow(SALOMEDS.AttributeSelectable)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeSelectable attribute&quot;\r
+\r
+A.SetSelectable(1)\r
+\r
+if A.IsSelectable() == 0:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;&quot;Error: wrong value of AttributeSelectable&quot;\r
+\r
+\r
+# &nbsp; &nbsp; &nbsp;save / restore study &nbsp; &nbsp; &nbsp;\r
+#============================================================\r
+str= os.getenv(&quot;TmpDir&quot;)\r
+if str == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;str = &quot;/tmp&quot;\r
+file = str+&quot;/test.hdf&quot;\r
+\r
+batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)\r
+openedStudy = batchmode_geompy.myStudyManager.Open(file);\r
+\r
+if openedStudy == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't open saved study!&quot;\r
+\r
+father = openedStudy.FindComponent(&quot;GEOM&quot;)\r
+if father is None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp; raise &nbsp;RuntimeError, &quot;Geom component is not found! &nbsp;Wrong study is opened.&quot; \r
+\r
+\r
+# &nbsp; &nbsp; find &nbsp; AttributeSelectable\r
+#============================================================\r
+\r
+res,A=father.FindAttribute(&quot;AttributeSelectable&quot;)\r
+if res == 0 or A == None:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Error: &nbsp;not found AttributeSelectable&quot;\r
+\r
+A = A._narrow(SALOMEDS.AttributeSelectable)\r
+\r
+if A == None :\r
+ &nbsp; &nbsp; &nbsp; &nbsp;raise &nbsp;RuntimeError, &quot;Can't create AttributeSelectable attribute&quot;\r
+\r
+if A.IsSelectable() == 0:\r
+ &nbsp; &nbsp; &nbsp; &nbsp;&quot;Error: wrong value of AttributeSelectable&quot;\r
+\r
+</PRE>
\ No newline at end of file
diff --git a/doc/salome/tui/KERNEL/sources/Application-About1.jpg b/doc/salome/tui/KERNEL/sources/Application-About1.jpg
new file mode 100755 (executable)
index 0000000..cf7ab8b
Binary files /dev/null and b/doc/salome/tui/KERNEL/sources/Application-About1.jpg differ
diff --git a/doc/salome/tui/KERNEL/sources/application.gif b/doc/salome/tui/KERNEL/sources/application.gif
new file mode 100644 (file)
index 0000000..0b05d5c
Binary files /dev/null and b/doc/salome/tui/KERNEL/sources/application.gif differ
diff --git a/doc/salome/tui/KERNEL/sources/application.jpg b/doc/salome/tui/KERNEL/sources/application.jpg
new file mode 100755 (executable)
index 0000000..a6979ab
Binary files /dev/null and b/doc/salome/tui/KERNEL/sources/application.jpg differ
diff --git a/doc/salome/tui/KERNEL/sources/doxygen.css b/doc/salome/tui/KERNEL/sources/doxygen.css
new file mode 100755 (executable)
index 0000000..88e613d
--- /dev/null
@@ -0,0 +1,170 @@
+H1 { 
+   text-align: center; 
+}
+
+CAPTION { 
+   font-weight: bold 
+}
+
+/* Link in the top navbar */
+A.qindex {}
+
+A.qindexRef {}
+
+/* Link to any cross-referenced Doxygen element */
+A.el { 
+   text-decoration: none; 
+   font-weight: bold 
+}
+
+A.elRef { 
+   font-weight: bold 
+}
+
+/* Link to any cross-referenced Doxygen element inside a code section 
+   (ex: header)
+*/
+A.code { 
+   text-decoration: none; 
+   font-weight: normal; 
+   color: #4444ee 
+}
+
+A.codeRef { 
+   font-weight: normal; 
+   color: #4444ee 
+}
+
+A:hover { 
+   text-decoration: none; 
+   background-color: lightblue 
+}
+
+DL.el { 
+   margin-left: -1cm 
+}
+
+/* A code fragment (ex: header) */
+DIV.fragment { 
+   width: 100%; 
+   border: none; 
+   background-color: #CCCCCC 
+}
+
+/* In the alpha list (coumpound index), style of an alphabetical index letter */
+DIV.ah { 
+   background-color: #CCCCCC; 
+   font-weight: bold; 
+   color: #ffffff; 
+   margin-bottom: 3px; 
+   margin-top: 3px 
+}
+
+/* Method name (+ type) */
+TD.md { 
+   background-color: lightblue; 
+   font-weight: bold; 
+}
+
+/* Method parameter (some of them) */
+TD.mdname1 { 
+   background-color: lightblue; 
+   font-weight: bold; color: #602020; 
+}
+
+/* Method parameter (some of them) */
+TD.mdname { 
+   background-color: lightblue; 
+   font-weight: bold; 
+   color: #602020; 
+   width: 600px; 
+}
+
+/* Separator between methods group (usually empty, seems not supported by IE) */
+DIV.groupHeader { 
+   margin-left: 16px; 
+   margin-top: 12px; 
+   margin-bottom: 6px; 
+   font-weight: bold 
+}
+
+DIV.groupText { 
+   margin-left: 16px; 
+   font-style: italic; 
+   font-size: smaller 
+}
+
+BODY { 
+   background: #FFFFFF;
+}
+
+/*div.div-page { 
+  background-color: #FFFFFF; 
+  margin-left: 1em;
+  margin-right: 1em;
+  margin-top: 1em;
+  margin-bottom: 0.1em;
+
+  padding-left: 1em;
+  padding-right: 1em;
+  padding-top: 0.5em;
+  padding-bottom: 0.5em;
+
+  border: 2px solid #0D299A; 
+  border-width: 2px;
+  border-color: #0D299A; 
+}*/
+
+div.tabs { 
+  text-align: justify; 
+  margin-left    : 2px;         
+  margin-right   : 2px;  
+  margin-top     : 2px; 
+  margin-bottom  : 2px
+  font-weight: bold;
+  color: #FFFFFF;
+}
+
+DIV.div-footer { 
+  margin-left: 1em;
+  margin-right: 1em;
+  margin-bottom: 0.2em;
+  text-align: right;
+  font-size: 9pt; 
+}
+
+/* In File List, Coumpound List, etc, 1st column of the index */
+TD.indexkey { 
+   background-color: #CCCCCC; 
+   font-weight: bold; 
+   padding-right  : 10px; 
+   padding-top    : 2px; 
+   padding-left   : 10px; 
+   padding-bottom : 2px; 
+   margin-left    : 0px; 
+   margin-right   : 0px; 
+   margin-top     : 2px; 
+   margin-bottom  : 2px  
+}
+
+/* In File List, Coumpound List, etc, 2nd column of the index */
+TD.indexvalue { 
+   background-color: #CCCCCC; 
+   font-style: italic; 
+   padding-right  : 10px; 
+   padding-top    : 2px; 
+   padding-left   : 10px; 
+   padding-bottom : 2px; 
+   margin-left    : 0px; 
+   margin-right   : 0px; 
+   margin-top     : 2px; 
+   margin-bottom  : 2px  
+}
+
+span.keyword       { color: #008000 }
+span.keywordtype   { color: #604020 }
+span.keywordflow   { color: #e08000 }
+span.comment       { color: #800000 }
+span.preprocessor  { color: #806020 }
+span.stringliteral { color: #002080 }
+span.charliteral   { color: #008080 }
diff --git a/doc/salome/tui/KERNEL/sources/footer.html b/doc/salome/tui/KERNEL/sources/footer.html
new file mode 100755 (executable)
index 0000000..56d52a6
--- /dev/null
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+</head>
+<body>
+<hr style="width: 100%; height: 2px;">
+<div style="text-align: center;">Copyright &copy; 2003-2007 CEA, EDF<br>
+</div>
+</body>
+</html>
diff --git a/doc/salome/tui/KERNEL/sources/html_comments.gif b/doc/salome/tui/KERNEL/sources/html_comments.gif
new file mode 100755 (executable)
index 0000000..f0c0f0b
Binary files /dev/null and b/doc/salome/tui/KERNEL/sources/html_comments.gif differ
diff --git a/doc/salome/tui/KERNEL/sources/kernel_about_4.png b/doc/salome/tui/KERNEL/sources/kernel_about_4.png
new file mode 100644 (file)
index 0000000..5c9c09a
Binary files /dev/null and b/doc/salome/tui/KERNEL/sources/kernel_about_4.png differ
diff --git a/doc/salome/tui/KERNEL/sources/logocorp.gif b/doc/salome/tui/KERNEL/sources/logocorp.gif
new file mode 100755 (executable)
index 0000000..7697e08
Binary files /dev/null and b/doc/salome/tui/KERNEL/sources/logocorp.gif differ
diff --git a/doc/salome/tui/KERNEL/sources/myheader.html b/doc/salome/tui/KERNEL/sources/myheader.html
new file mode 100755 (executable)
index 0000000..bddc997
--- /dev/null
@@ -0,0 +1,13 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <title>$title</title>
+   <link href="tabs.css" rel="stylesheet" type="text/css">
+   <link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+<hr>
+<center>
+SALOME documentation central
+</center>
+<hr>
diff --git a/doc/salome/tui/KERNEL/sources/occ.gif b/doc/salome/tui/KERNEL/sources/occ.gif
new file mode 100755 (executable)
index 0000000..ce017c8
Binary files /dev/null and b/doc/salome/tui/KERNEL/sources/occ.gif differ
diff --git a/doc/salome/tui/KERNEL/sources/static/Link.gif b/doc/salome/tui/KERNEL/sources/static/Link.gif
new file mode 100755 (executable)
index 0000000..75330d0
Binary files /dev/null and b/doc/salome/tui/KERNEL/sources/static/Link.gif differ
diff --git a/doc/salome/tui/KERNEL/sources/static/SObject.gif b/doc/salome/tui/KERNEL/sources/static/SObject.gif
new file mode 100755 (executable)
index 0000000..1d4e9cb
Binary files /dev/null and b/doc/salome/tui/KERNEL/sources/static/SObject.gif differ
diff --git a/doc/salome/tui/KERNEL/sources/static/Study_Struct.gif b/doc/salome/tui/KERNEL/sources/static/Study_Struct.gif
new file mode 100755 (executable)
index 0000000..bc0ce35
Binary files /dev/null and b/doc/salome/tui/KERNEL/sources/static/Study_Struct.gif differ
diff --git a/doc/salome/tui/KERNEL/sources/static/doxygen.css b/doc/salome/tui/KERNEL/sources/static/doxygen.css
new file mode 100755 (executable)
index 0000000..88e613d
--- /dev/null
@@ -0,0 +1,170 @@
+H1 { 
+   text-align: center; 
+}
+
+CAPTION { 
+   font-weight: bold 
+}
+
+/* Link in the top navbar */
+A.qindex {}
+
+A.qindexRef {}
+
+/* Link to any cross-referenced Doxygen element */
+A.el { 
+   text-decoration: none; 
+   font-weight: bold 
+}
+
+A.elRef { 
+   font-weight: bold 
+}
+
+/* Link to any cross-referenced Doxygen element inside a code section 
+   (ex: header)
+*/
+A.code { 
+   text-decoration: none; 
+   font-weight: normal; 
+   color: #4444ee 
+}
+
+A.codeRef { 
+   font-weight: normal; 
+   color: #4444ee 
+}
+
+A:hover { 
+   text-decoration: none; 
+   background-color: lightblue 
+}
+
+DL.el { 
+   margin-left: -1cm 
+}
+
+/* A code fragment (ex: header) */
+DIV.fragment { 
+   width: 100%; 
+   border: none; 
+   background-color: #CCCCCC 
+}
+
+/* In the alpha list (coumpound index), style of an alphabetical index letter */
+DIV.ah { 
+   background-color: #CCCCCC; 
+   font-weight: bold; 
+   color: #ffffff; 
+   margin-bottom: 3px; 
+   margin-top: 3px 
+}
+
+/* Method name (+ type) */
+TD.md { 
+   background-color: lightblue; 
+   font-weight: bold; 
+}
+
+/* Method parameter (some of them) */
+TD.mdname1 { 
+   background-color: lightblue; 
+   font-weight: bold; color: #602020; 
+}
+
+/* Method parameter (some of them) */
+TD.mdname { 
+   background-color: lightblue; 
+   font-weight: bold; 
+   color: #602020; 
+   width: 600px; 
+}
+
+/* Separator between methods group (usually empty, seems not supported by IE) */
+DIV.groupHeader { 
+   margin-left: 16px; 
+   margin-top: 12px; 
+   margin-bottom: 6px; 
+   font-weight: bold 
+}
+
+DIV.groupText { 
+   margin-left: 16px; 
+   font-style: italic; 
+   font-size: smaller 
+}
+
+BODY { 
+   background: #FFFFFF;
+}
+
+/*div.div-page { 
+  background-color: #FFFFFF; 
+  margin-left: 1em;
+  margin-right: 1em;
+  margin-top: 1em;
+  margin-bottom: 0.1em;
+
+  padding-left: 1em;
+  padding-right: 1em;
+  padding-top: 0.5em;
+  padding-bottom: 0.5em;
+
+  border: 2px solid #0D299A; 
+  border-width: 2px;
+  border-color: #0D299A; 
+}*/
+
+div.tabs { 
+  text-align: justify; 
+  margin-left    : 2px;         
+  margin-right   : 2px;  
+  margin-top     : 2px; 
+  margin-bottom  : 2px
+  font-weight: bold;
+  color: #FFFFFF;
+}
+
+DIV.div-footer { 
+  margin-left: 1em;
+  margin-right: 1em;
+  margin-bottom: 0.2em;
+  text-align: right;
+  font-size: 9pt; 
+}
+
+/* In File List, Coumpound List, etc, 1st column of the index */
+TD.indexkey { 
+   background-color: #CCCCCC; 
+   font-weight: bold; 
+   padding-right  : 10px; 
+   padding-top    : 2px; 
+   padding-left   : 10px; 
+   padding-bottom : 2px; 
+   margin-left    : 0px; 
+   margin-right   : 0px; 
+   margin-top     : 2px; 
+   margin-bottom  : 2px  
+}
+
+/* In File List, Coumpound List, etc, 2nd column of the index */
+TD.indexvalue { 
+   background-color: #CCCCCC; 
+   font-style: italic; 
+   padding-right  : 10px; 
+   padding-top    : 2px; 
+   padding-left   : 10px; 
+   padding-bottom : 2px; 
+   margin-left    : 0px; 
+   margin-right   : 0px; 
+   margin-top     : 2px; 
+   margin-bottom  : 2px  
+}
+
+span.keyword       { color: #008000 }
+span.keywordtype   { color: #604020 }
+span.keywordflow   { color: #e08000 }
+span.comment       { color: #800000 }
+span.preprocessor  { color: #806020 }
+span.stringliteral { color: #002080 }
+span.charliteral   { color: #008080 }
diff --git a/doc/salome/tui/KERNEL/sources/static/examples_Kernel.html b/doc/salome/tui/KERNEL/sources/static/examples_Kernel.html
new file mode 100755 (executable)
index 0000000..beb74ae
--- /dev/null
@@ -0,0 +1,134 @@
+<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+    
+  <meta http-equiv="Content-Type"
+ content="text/html; charset=iso-8859-1">
+    
+  <meta name="GENERATOR"
+ content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+  <title>Main Page</title>
+     
+  <link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+  <body>
+ &nbsp; 
+<center>
+<table width="96%">
+ <tbody>
+    <tr>
+ <td><a href="http://www.opencascade.com"><img
+ src="sources/logocorp.gif" border="0" height="46" width="122">
+      </a></td>
+   <td> 
+      <div align="right"><a href="http://www.opencascade.org/SALOME/"><img
+ src="sources/application.gif" border="0" height="46" width="108">
+      </a></div>
+ </td>
+ </tr>
+  </tbody>
+</table>
+</center>
+   
+<h1><a name="page2">Examples</a> </h1>
+   <small><i><big><b>Package SALOME</b></big></i></small><b><i>_ModuleCatalog</i></b><br>
+<small><br>
+&nbsp;&nbsp;&nbsp; &nbsp; <big>interface <a href="#module_catalog">SALOME_ModuleCatalog::ModuleCatalog</a></big><br>
+<br>
+<i><big><b>Package SALOME<br>
+<br>
+&nbsp;&nbsp;&nbsp; </b></big></i></small>interface<a href="#Session"> SALOME::Session</a><br>
+<br>
+<small><i><big><b>Package Engines<br>
+&nbsp;&nbsp;&nbsp; </b></big></i><i><big><b> </b></big></i></small><br>
+&nbsp;&nbsp;&nbsp; interface <a href="#container">Engines::Container</a><small><br>
+</small><small><br>
+<i><big><b>&nbsp;&nbsp;&nbsp; <br>
+&nbsp;&nbsp;&nbsp; </b></big></i></small><br>
+<br>
+<div align="center">&nbsp;&nbsp;&nbsp; <u><font
+ face="Helvetica, Arial, sans-serif"><big><big><b><small><big><a
+ name="module_catalog"></a>SALOME_ModuleCatalog::ModuleCatalog interface</big></small></b></big></big></font></u>
+<br>
+</div>
+<br>
+<div align="center"><big><big><u><b><font
+ face="Helvetica, Arial, sans-serif"><br>
+</font></b></u></big></big>
+<div align="left"><br>
+<big><b><a class="el"
+ href="interfaceSALOME__ModuleCatalog_1_1Acomponent.html">Acomponent</a>
+GetComponent  (in string <i>componentname</i>)</b></big><br>
+<br>
+See the <a href="#load_com_ex">example</a> below<br>
+<br>
+</div>
+<big><big><u><b><font face="Helvetica, Arial, sans-serif"><br>
+</font></b><small><font face="Helvetica, Arial, sans-serif"><big><b><a
+ name="Session"></a>SALOME::Session interface</b></big></font></small></u></big></big><br>
+<div align="left"><br>
+<br>
+<big><b>GetInterface ()</b><b>, StopSession () raises (GUIActive, RunningStudies)</b></big><br>
+<br>
+<u><i>Stop session and restart GUI application: </i></u><br>
+<br>
+mySession.StopSession()<br>
+<br>
+mySession.GetInterface()<br>
+<br>
+<br>
+<div align="center"><u><big><big><font
+ face="Helvetica, Arial, sans-serif"><b><a name="container"></a>Engines::Container
+interface</b></font></big></big></u><br>
+<br>
+<br>
+<div align="left"><big><b><a class="el"
+ href="interfaceEngines_1_1Component.html">Component</a>
+load_impl  (in string <i>nameToRegister</i>, in string <i>componentName</i>)</b></big><br>
+<br>
+<i><u><a name="load_com_ex"></a>Load component with defined component name:</u></i><br>
+<br>
+compinfo = module_catalog.GetComponent(componentName)<br>
+<br>
+&nbsp;try:<br>
+&nbsp;&nbsp;&nbsp; machineName = theComputer # name of machine<br>
+&nbsp;&nbsp;&nbsp; path = compoinfo.GetPathPrefix(machineName) + "/"<br>
+&nbsp;except SALOME_ModuleCatalog.NotFound, ex:<br>
+&nbsp;&nbsp;&nbsp; MESSAGE( "machine " + machineName + " not found in Module
+Catalog" )<br>
+&nbsp;&nbsp;&nbsp; MESSAGE( "trying localhost" )<br>
+&nbsp;&nbsp;&nbsp; try:<br>
+&nbsp;&nbsp;&nbsp; path = compoinfo.GetPathPrefix("localhost") + "/"<br>
+&nbsp;&nbsp;&nbsp; except SALOME_ModuleCatalog.NotFound, ex:<br>
+&nbsp;&nbsp;&nbsp; path = ""<br>
+<br>
+implementation = path + "lib" + componentName + "Engine.so"<br>
+MESSAGE( "Trying to load " + implementation )<br>
+<br>
+&nbsp;try:<br>
+<div align="left">&nbsp;&nbsp;&nbsp; component = container.load_impl(componentName,
+implementation)<i> # Loads into the container a new component, registers
+it and starts it's CORBA servant. </i><br>
+</div>
+&nbsp;&nbsp;&nbsp; MESSAGE( "component " + component._get_instanceName()
++ " launched !" )<br>
+&nbsp;&nbsp;&nbsp; return component<br>
+except:<br>
+&nbsp;&nbsp;&nbsp; MESSAGE( "component " + componentName + " NOT launched
+!" )<br>
+<br>
+<br>
+</div>
+<br>
+</div>
+<br>
+</div>
+<br>
+</div>
+
+<br>
+<br>
+<br>
+</body>
+</html>
diff --git a/doc/salome/tui/KERNEL/sources/static/examples_Life_cycle.html b/doc/salome/tui/KERNEL/sources/static/examples_Life_cycle.html
new file mode 100755 (executable)
index 0000000..080112e
--- /dev/null
@@ -0,0 +1,116 @@
+<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+    
+  <meta http-equiv="Content-Type"
+ content="text/html; charset=iso-8859-1">
+    
+  <meta name="GENERATOR"
+ content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+  <title>Main Page</title>
+     
+  <link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+  <body>
+ &nbsp; 
+<center>
+<table width="96%">
+ <tbody>
+    <tr>
+ <td><a href="http://www.opencascade.com"><img
+ src="sources/logocorp.gif" border="0" height="46" width="122">
+      </a></td>
+   <td> 
+      <div align="right"><a href="http://www.opencascade.org/SALOME/"><img
+ src="sources/application.gif" border="0" height="46" width="108">
+      </a></div>
+ </td>
+ </tr>
+  </tbody>
+</table>
+</center>
+   
+<h1><a name="page2">Examples</a> </h1>
+   <font color="#3333ff">//There is a CXX example of LifeCycleCORBA using<br>
+</font><br>
+#include CORBA_CLIENT_HEADER(TestComponent)<br>
+#include "SALOME_NamingService.hxx"<br>
+#include "SALOME_LifeCycleCORBA.hxx"<br>
+<br>
+int main (int argc, char * argv[]){<br>
+&nbsp; try {<br>
+<font color="#3333ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Initializing omniORB<br>
+</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CORBA::ORB_var orb = CORBA::ORB_init(argc,
+argv);<br>
+&nbsp;&nbsp;&nbsp; <br>
+<font color="#3333ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Obtain a reference
+to the root POA<br>
+</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CORBA::Object_var obj = orb-&gt;resolve_initial_references("RootPOA")
+;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PortableServer::POA_var poa = PortableServer::POA::_narrow(obj)
+;<br>
+&nbsp;&nbsp;&nbsp; <br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SALOME_NamingService _NS(orb) ;<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SALOME_LifeCycleCORBA _LCC(&amp;_NS) ;<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Engines::Component_var myComponent = _LCC.FindOrLoad_Component("FactoryServerPy","TestComponentPy");<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; if(!CORBA::is_nil(myComponent)){<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Engines::TestComponent_var
+myConcreateComponent = TestComponent::_narrow(myComponent);<br>
+<font color="#3333ff">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; //do something
+what you like with the interface<br>
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ...<br>
+</font>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; return 0;<br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }<br>
+&nbsp;&nbsp;&nbsp; }<br>
+&nbsp; catch(CORBA::COMM_FAILURE&amp; ex){<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"Caught system exception COMM_FAILURE
+-- unable to contact the object.\n";<br>
+&nbsp; }catch(CORBA::SystemException&amp;){<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"Caught a CORBA::SystemException.\n";<br>
+&nbsp; }catch(CORBA::Exception&amp;){<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"Caught CORBA::Exception.\n";<br>
+&nbsp; }catch(...){<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;"Caught unknown exception.\n";<br>
+&nbsp; }<br>
+&nbsp; return 1;<br>
+}<br>
+<br>
+<font color="#3333ff">#The example may be rewritten on Python like this:<br>
+</font><br>
+from omniORB import CORBA<br>
+from SALOME_TestComponent import *<br>
+from SALOME_NamingServicePy import *<br>
+from LifeCycleCORBA import *<br>
+<br>
+try:<br>
+&nbsp;&nbsp;&nbsp; orb = CORBA.ORB_init(sys.argv,CORBA.ORB_ID)<br>
+&nbsp;&nbsp;&nbsp; _NS = SALOME_NamingService(orb)<br>
+&nbsp;&nbsp;&nbsp; _LCC = SALOME_LifeCycleCORBA(orb)<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp; myComponent = _LCC.FindOrLoadComponent("FactoryServerPy","TestComponentPy");<br>
+&nbsp;&nbsp;&nbsp; &nbsp;myConcreatComponent = myComponent._narrow(TestComponent)<br>
+&nbsp;&nbsp;&nbsp; if myConcreatComponent is not None :<font
+ color="#3333ff"><br>
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //do something what you like with the
+interface<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; ...<br>
+ </font>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return 0<br>
+&nbsp;&nbsp;&nbsp; }<br>
+except CosNaming.NamingContext.NotFound, e :<br>
+&nbsp;&nbsp;&nbsp; print "Caught exception: Naming Service can't found Logger"<br>
+except CORBA.COMM_FAILURE, e:<br>
+&nbsp;&nbsp;&nbsp; print "Caught CORBA::SystemException CommFailure"<br>
+except CORBA.SystemException, e:<br>
+&nbsp;&nbsp;&nbsp; print "Caught CORBA::SystemException."<br>
+except CORBA.Exception, e:<br>
+&nbsp;&nbsp;&nbsp; print "Caught CORBA::Exception."<br>
+except Exception, e:<br>
+&nbsp;&nbsp;&nbsp; print "Caught unknown exception."<br>
+&nbsp;&nbsp; <br>
+<br>
+<br>
+</body>
+</html>
diff --git a/doc/salome/tui/KERNEL/sources/static/examples_Naming.html b/doc/salome/tui/KERNEL/sources/static/examples_Naming.html
new file mode 100755 (executable)
index 0000000..ac08a67
--- /dev/null
@@ -0,0 +1,66 @@
+<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+    
+  <meta http-equiv="Content-Type"
+ content="text/html; charset=iso-8859-1">
+    
+  <meta name="GENERATOR"
+ content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+  <title>Main Page</title>
+     
+  <link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+  <body>
+ &nbsp; 
+<center>
+<table width="96%">
+ <tbody>
+    <tr>
+ <td><a href="http://www.opencascade.com"><img
+ src="sources/logocorp.gif" border="0" height="46" width="122">
+      </a></td>
+   <td> 
+      <div align="right"><a href="http://www.opencascade.org/SALOME/"><img
+ src="sources/application.gif" border="0" height="46" width="108">
+      </a></div>
+ </td>
+ </tr>
+  </tbody>
+</table>
+</center>
+   
+<h1><a name="page2">Examples</a> </h1>
+   <font color="#3333ff">#There is a python example of using  SALOME_NamingService<br>
+</font><br>
+from omniORB import CORBA<br>
+from time import sleep<br>
+from LifeCycleCORBA import *<br>
+from SALOME_NamingServicePy import *<br>
+<br>
+<font color="#3333ff"># initialise the ORB<br>
+</font>orb = CORBA.ORB_init([''], CORBA.ORB_ID)<br>
+<br>
+<font color="#3333ff"># create an LifeCycleCORBA instance<br>
+</font>myLifeCycleCORBA = LifeCycleCORBA(orb)<br>
+<br>
+<font color="#3333ff">#create a naming service instance<br>
+</font>naming_service = SALOME_NamingServicePy_i(orb)<br>
+<br>
+mySession = myNamingService.Resolve("/Kernel/Session")<br>
+mySession.GetInterface()<br>
+sleep(10)<br>
+myLocalVisu = myLifeCycleCORBA.FindOrLoadComponent("FactoryServer", "Visu")<br>
+<br>
+<br>
+<font color="#3333ff">//There is some part of a code written by C++<br>
+</font><br>
+SALOME_NamingService aNamingService(orb);<br>
+CORBA::Object_ptr anObject = aNamingService.Resolve("/Kernel/Session");<br>
+SALOME::Session_var aSession = SALOME::Session::_narrow(anObject);<br>
+Engines::Component_var aComponent = aSession-&gt;GetVisuGen();<br>
+myVisuGen = VISU::VISU_Gen::_narrow(aComponent);<br>
+<br>
+</body>
+</html>
diff --git a/doc/salome/tui/KERNEL/sources/static/examples_Study.html b/doc/salome/tui/KERNEL/sources/static/examples_Study.html
new file mode 100755 (executable)
index 0000000..859f629
--- /dev/null
@@ -0,0 +1,790 @@
+<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+            
+  <meta http-equiv="Content-Type"
+ content="text/html; charset=iso-8859-1">
+            
+  <meta name="GENERATOR"
+ content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+  <title>Main Page</title>
+                   
+  <link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+  <body>
+   &nbsp;   
+<center>  
+<table width="96%">
+   <tbody>
+      <tr>
+   <td><a href="http://www.opencascade.com"><img src="sources/ogocorp.gif"
+ border="0" height="46" width="122">
+        </a></td>
+     <td>               
+      <div align="right"><a href="http://www.opencascade.org/SALOME/"><img
+ src="sources/application.gif" border="0" height="46" width="108">
+        </a></div>
+   </td>
+   </tr>
+         
+  </tbody>  
+</table>
+  </center>
+       
+<h1><a name="page2">Examples</a> </h1>
+     <br>
+  <br>
+   
+<div align="justify">&nbsp;&nbsp;&nbsp; &nbsp;<big><b><i> <small>Interfaces:</small></i></b></big><br>
+  <br>
+  &nbsp; &nbsp; &nbsp; <a href="#SALOMEDS::Study_impl">SALOMEDS::Study</a><br>
+  &nbsp;&nbsp;&nbsp; &nbsp; <a href="#SALOMEDS::StudyBuilder_impl">SALOMEDS::StudyBuilder</a><br>
+  &nbsp;&nbsp; &nbsp;&nbsp; <a href="#SALOMEDS::StudyManager_impl">SALOMEDS::StudyManager</a><br>
+  &nbsp;&nbsp;&nbsp; &nbsp; <a href="#SALOMEDS::SObject_impl">SALOMEDS::SObject</a><br>
+&nbsp;&nbsp;&nbsp; &nbsp; <a href="#SALOMEDS::SComponent_impl">SALOMEDS::SComponent</a><br>
+  &nbsp; &nbsp; &nbsp; <a href="#SALOMEDS::SComponentIterator_impl">SALOMEDS::SComponentIterator</a><br>
+  &nbsp; &nbsp; &nbsp; <a href="#SALOMEDS::ChildIterator_impl">SALOMEDS::ChildIterator<br>
+ </a> &nbsp; &nbsp; &nbsp;<a href="#SALOMEDS::AttributeComment_impl"> SALOMEDS::AttributeComment</a><br>
+   &nbsp;&nbsp;&nbsp; &nbsp;<br>
+  </div>
+  <br>
+  <br>
+  <br>
+   
+<div align="center">&nbsp;&nbsp;&nbsp; &nbsp; <small><small><u><big><big><a
+ name="SALOMEDS::Study_impl"></a><font color="#000000"
+ face="Helvetica, Arial, sans-serif"><big><big><b>SALOMEDS::Study interface</b></big></big></font></big></big></u></small></small><br>
+  <br>
+   
+<div align="left">                  <big><br>
+  </big></div>
+  <big><br>
+  </big>  
+<div align="left"><b><big><a class="el"
+ href="interfaceSALOMEDS_1_1SComponent.html">SComponent</a>  FindComponent(
+in string <i>aComponentName </i>)</big></b><br>
+  <i><br>
+  <u>Find GEOMETRY component in the opened study by its name:</u></i><br>
+  <br>
+  &nbsp;&nbsp;&nbsp; str= os.getenv("TmpDir")<br>
+  &nbsp;&nbsp;&nbsp; if str == None:<br>
+  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; str = "/tmp"<br>
+  &nbsp;&nbsp;&nbsp; file = str+"/test.hdf"<br>
+  <br>
+  &nbsp;&nbsp;&nbsp; openedStudy=batchmode_geompy.myStudyManager.Open(file)<br>
+  <br>
+  &nbsp;&nbsp;&nbsp; father = openedStudy.FindComponent("GEOM")<br>
+  &nbsp;&nbsp;&nbsp; if father is None:<br>
+  &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;raise&nbsp; RuntimeError, "Geom
+ component is not found!&nbsp; Wrong study is opened." <br>
+  <br>
+  <br>
+  </div>
+   
+<div align="left"><b><big><a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SObject</a>  FindObject ( in string
+<em>anObjectName </em>)</big></b><br>
+  <br>
+  <u><i>Find the SObject of the box by its NameAttribute "box":</i></u><br>
+  </div>
+   
+<div align="left"><br>
+  </div>
+   
+<div align="left">box = openedStudy.FindObject("box")<br>
+  if box is None :<br>
+  &nbsp;&nbsp;&nbsp; raise&nbsp; RuntimeError, "box was not found! Wrong
+study  is opened."<br>
+  <br>
+  <br>
+  <small><big><big><a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SObject</a></big></big><b><big><big>&nbsp;FindObjectID
+ ( in</big> <big><a class="el" href="namespaceSALOMEDS.html#a1">ID</a>  </big><em><big>aObjectID
+)</big><br>
+  #result: "/User data/Case1". <br>
+  </em><big><em></em></big><big><em></em></big></big></b></small><u><i>Find
+ the SObject of the box by its ID </i>"</u><u>0:1:1:2"<i>:</i></u><br>
+   <br>
+  </div>
+   
+<div align="left">box =openedStudy.FindObjectID("0:1:1:2")<br>
+  </div>
+   
+<div align="left">if box is None :<br>
+   &nbsp;&nbsp;&nbsp; raise&nbsp; RuntimeError, "box was not found! Wrong 
+ID is used."<br>
+  <br>
+  <br>
+  <small><big><big><a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SObject</a></big></big></small><big><b>&nbsp;FindObjectIOR
+ ( in&nbsp;<a class="el" href="namespaceSALOMEDS.html#a1">ID</a>&nbsp;  <em>aObjectIOR</em>
+)</b></big><br>
+  <br>
+  <u><i>Find the SObject </i></u><u><i>of the result on imported MED file 
+by it's IOR:</i></u><br>
+  <br>
+  theResult = myVisu.ImportFile(medFile)<br>
+  aSObj = myStudy.FindObjectIOR(theResult.GetID())<br>
+  <br>
+  <br>
+  <big><b><a class="el" href="interfaceSALOMEDS_1_1SObject.html">SObject</a>
+ FindObjectByPath ( in string <i>thePath</i> )</b></big><br>
+  <br>
+  <u><i>Find SObject by path to it:</i></u><br>
+  <i><br>
+  # create new auxiliary componen</i>t<br>
+  aComponent = myStudyBuilder.NewComponent("Virtual Component")<br>
+  <br>
+  # create auxiliary subtree<br>
+  aPath = "/Virtual Component/Case1"<br>
+  myStudyBuilder.AddDirectory(aPath)<br>
+  <br>
+  aSObj = myStudy.FindObjectByPath(aPath)<br>
+  <br>
+  <br>
+  <big><b>void SetContext ( in string <i>thePath</i>)</b> </big><b><big><big>/</big>
+ string GetContext ()</big></b><br>
+  <br>
+  <u><i>Set context of the study to the created case and get it for printing:</i></u><br>
+  <br>
+  aComponent = myStudyBuilder.NewComponent("User data")<br>
+  anAttr = aBuilder.FindOrCreateAttribute(aComponent, "AttributeName")<br>
+  anAttrName = anAttr._narrow(SALOMEDS.AttributeName) <br>
+  anAttrName.SetValue("User data")<br>
+  <br>
+  #Add a new case 'Case1' to the component 'User data'<br>
+  aBuilder.AddDirectory("/User data/Case1")<br>
+  <br>
+  #Set a study context to '/User data/Case1'<br>
+  aStudy.SetContext("/User data/Case1")<br>
+  <br>
+  #Print the current study context<br>
+  print aStudy.GetContext()<br>
+  <u><small><br>
+  </small><i>#result: "/User data/Case1".</i></u><br>
+  <br>
+  <br>
+  <big><b><a class="el" href="interfaceSALOMEDS_1_1ChildIterator.html">ChildIterator</a>
+ NewChildIterator ( in&nbsp;<a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SObject</a>  aSO            ) </b></big><br>
+  <br>
+  <u><i>Import med file and print all mesh names that this file includes
+(mesh  is a child of the result of imported file):</i></u><br>
+  <br>
+  <i># define file name</i><br>
+  aFileName = datadir + "fra.med"<br>
+  <br>
+  <i># import file in visu module and get result</i><br>
+  theVisu = batchmode_visu.myVisu<br>
+  aResult = theVisu.ImportFile(aFileName)<br>
+  if aResult is None : raise RuntimeError, "Error"<br>
+  else : print "OK"<br>
+  &nbsp;<br>
+  <i># get current study and its' SObject&nbsp; </i>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ <br>
+  myLocalStudy = theVisu.GetCurrentStudy()<br>
+  aSObj = myLocalStudy.FindObjectIOR(aResult.GetID())<br>
+  if aSObj is None : raise RuntimeError, "Error"<br>
+  else : print "OK"<br>
+  <br>
+  <i># create iterator by SObject of the current study</i><br>
+  aMeshIter = myLocalStudy.NewChildIterator(aSObj);<br>
+  <br>
+  <i># iterating in the current study (with the help of created iterator) 
+to find all mesh names</i> &nbsp;<br>
+  while aMeshIter.More() :<br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aMeshSObj = aMeshIter.Value()<br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aMeshIter.Next()<br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anAttr = aMeshSObj.FindAttribute("AttributeName")[1]<br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if anAttr is None :<br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aMeshSObj
+ = aMeshIter.Value()<br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aMeshIter.Next()<br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anAttr
+ = aMeshSObj.FindAttribute("AttributeName")[1]<br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anAttr = anAttr._narrow(SALOMEDS.AttributeName);<br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aMeshName = anAttr.Value()<br>
+  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "&nbsp; ", aMeshName<br>
+  <br>
+  <br>
+  <big><b><a class="el"
+ href="interfaceSALOMEDS_1_1SComponentIterator.html">SComponentIterator</a> 
+NewComponentIterator ()</b></big><br>
+ <br>
+ <u><i>Find the number an names of all components in the study:</i></u><br>
+ <br>
+ aCompItr = myStudy.NewComponentIterator()<br>
+ <br>
+ compNb = 0<br>
+ while aCompItr.More():<br>
+ &nbsp;&nbsp;&nbsp; aComp = aCompItr.Value()<br>
+ &nbsp;&nbsp;&nbsp; aName = aComp.ComponentDataType()<br>
+ &nbsp;&nbsp;&nbsp; print "Component name = ", aName<br>
+ &nbsp;&nbsp;&nbsp; compNb += 1<br>
+ &nbsp;&nbsp;&nbsp; aCompItr.Next()<br>
+ <br>
+ <br>
+ <big><b><a class="el" href="interfaceSALOMEDS_1_1StudyBuilder.html">StudyBuilder</a> 
+NewBuilder ()</b></big><br>
+  </div>
+  </div>
+ <br>
+ <i><u>Create a new StudyBuilder (uses to add or modify an object in the
+study ):</u></i><br>
+ <br>
+ myBuilder = myStudy.NewBuilder() <br>
+ <br>
+ <br>
+ <big><b><a class="el"
+ href="interfaceSALOMEDS_1_1AttributeStudyProperties.html">AttributeStudyProperties</a> 
+GetProperties ()</b></big><br>
+ <br>
+ <i><u>Get the attribute, which contains the properties of the study, and 
+change properties of the study </u></i><u>by changing it</u>: <br>
+ <br>
+ aProperties = myStudy.GetProperties()<br>
+ if aProperties == None :<br>
+ &nbsp;&nbsp;&nbsp; raise&nbsp; RuntimeError, "Can't create AttributeStudyProperties 
+attribute"<br>
+ aProperties&nbsp;= aProperties._narrow(SALOMEDS.AttributeStudyProperties)<br>
+ <br>
+ A = aProperties<br>
+ <br>
+ <i># print stydy properties</i><br>
+ print "A.GetUserName()= ", A.GetUserName()<br>
+ res,mm,hh,dd,mnth,yy=A.GetCreationDate()<br>
+ print "A.GetCreationDate() = ", mm,hh,dd,mnth,yy<br>
+ print "A.GetCreationMode() = ", A.GetCreationMode()<br>
+ print "A.IsModified() = ", A.IsModified()<br>
+ print "A.IsLocked() = ", A.IsLocked()<br>
+ <br>
+ <i># change the properties of the study</i><br>
+ if A.IsLocked() == 0 :<br>
+ &nbsp;&nbsp;&nbsp; A.SetUserName("tester"); print 'A.SetUserName("tester"), 
+A.GetUserName() = ', A.GetUserName()<br>
+ &nbsp;&nbsp;&nbsp; A.SetCreationDate(11,11,11,11,2002); print 'A.SetCreationDate(11,11,11,11,2002), 
+A.GetCreationDate() =', A.GetCreationDate()<br>
+ &nbsp;&nbsp;&nbsp; print "A.IsModified() = ", A.IsModified()<br>
+ A.SetLocked(1)<br>
+ <br>
+ <br>
+ <big><b>boolean IsModified ()</b></big><br>
+ <br>
+ <u><i>Find if study is modified:</i></u><br>
+ <br>
+ IsModified = myStudy.IsModified()<br>
+ <br>
+ if IsModified == 1:<br>
+ &nbsp;&nbsp;&nbsp; print "The study is modified and not saved"<br>
+ <br>
+ <br>
+ <big><b>boolean IsEmpty ()</b></big><br>
+ <br>
+ <u><i>Find if study is empty:</i></u><br>
+  <br>
+  IsEmpty = myStudy.IsEmpty()<br>
+  <br>
+  if IsEmpty == 1:<br>
+  &nbsp;&nbsp;&nbsp; print "The study is empty"<br>
+ <br>
+ <br>
+ <br>
+ <br>
+<div align="center"><small><small><u><big><big><a
+ name="SALOMEDS::StudyBuilder_impl"></a><font color="#000000"
+ face="Helvetica, Arial, sans-serif"><big><big><b>SALOMEDS::StudyBuilder
+interface</b></big></big></font></big></big></u></small></small><br>
+ </div>
+ <br>
+ <br>
+ <br>
+ <big><b><a class="el" href="interfaceSALOMEDS_1_1SComponent.html">SComponent</a> 
+NewComponent ( in string <i>ComponentDataType</i> )</b></big><br>
+ <br>
+ <u><i>Create Geometry SComponent:</i></u><br>
+ <br>
+ myBuilder = myStudy.NewBuilder()<br>
+ father = myBuilder.NewComponent("GEOM")<br>
+ <br>
+ <big><b><br>
+ void DefineComponentInstance ( in <a class="el"
+ href="interfaceSALOMEDS_1_1SComponent.html">SComponent</a> <i>aComponent</i>,
+in Object <i>ComponentIOR</i> )</b></big><br>
+ <br>
+ <u><i>Define the instance to the created geometry component:</i></u><br>
+ <br>
+ <i># find geom component</i><br>
+ myLCC = batchmode_salome.lcc<br>
+ geom = myLCC.FindOrLoadComponent("FactoryServer", "Geometry")<br>
+ geom = geom._narrow(GEOM.GEOM_Gen)<br>
+ geom.GetCurrentStudy(myStudyId)<br>
+ <br>
+ myBuilder = myStudy.NewBuilder()<br>
+ <br>
+ father = myBuilder.NewComponent("GEOM")<br>
+ myBuilder.DefineComponentInstance(father,geom)<br>
+ <br>
+ <br>
+ <big><b><a class="el" href="interfaceSALOMEDS_1_1SObject.html">SObject</a> 
+NewObject ( in&nbsp;<a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SObject</a> <i>theFatherObject</i>
+)</b></big><br>
+ <br>
+ <u><i>Create box and add it to study:</i></u><br>
+ <br>
+ from batchmode_geompy import *<br>
+ <br>
+ <i># create a box</i><br>
+ box = geom.MakeBox(0,0,0,100,100,150)<br>
+ <br>
+ ior = orb.object_to_string(box)<br>
+ box._set_Name(ior)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
+ <br>
+ <i># create Geometry SComponent</i><br>
+ father = myBuilder.NewComponent("GEOM")<br>
+ A1 = myBuilder.FindOrCreateAttribute(father, "AttributeName");<br>
+ FName = A1._narrow(SALOMEDS.AttributeName)<br>
+ FName.SetValue("Geometry")<br>
+ myBuilder.DefineComponentInstance(father,geom)<br>
+ <br>
+ <i># add box to Study</i><br>
+ myBuilder.NewCommand()<br>
+ newObj = myBuilder.NewObject(father)<br>
+ A1 = myBuilder.FindOrCreateAttribute(newObj, "AttributeIOR");<br>
+ ObjIOR = A1._narrow(SALOMEDS.AttributeIOR)<br>
+ ObjIOR.SetValue(ior)<br>
+ A2 = myBuilder.FindOrCreateAttribute(newObj, "AttributeName");<br>
+ ObjName = A2._narrow(SALOMEDS.AttributeName)<br>
+ ObjName.SetValue("Common_operation")<br>
+ id = newObj.GetID()<br>
+ box._set_StudyShapeId(id)<br>
+ myBuilder.CommitCommand()<br>
+ <br>
+ <br>
+ <b><big>void RemoveObject ( in&nbsp;<a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SObject</a> <i>anObject</i> )</big></b><br>
+ <br>
+ <u><i># Remove CutPlanes SObject from the StudyBuilder (delete cutplanes):</i></u><br>
+ <br>
+ SObj=myStudy.FindObjectIOR(cutplanes.GetID())<br>
+ myBuilder = newStudy.NewBuilder()<br>
+ myBuilder.RemoveObject(SObj)<br>
+ <br>
+ <b><big><br>
+ void LoadWith ( in&nbsp;<a class="el"
+ href="interfaceSALOMEDS_1_1SComponent.html">SComponent</a><i> sco</i>, in
+<a class="el" href="interfaceSALOMEDS_1_1Driver.html">Driver</a> <i>Engine</i>
+) raises (<a class="el" href="exceptionSALOME_1_1SALOME__Exception.html">SALOME::SALOME_Exception</a>)</big></b><br>
+ <br>
+ <i><u># Load Visu component:</u></i><br>
+ <br>
+ myBuilder = openedStudy.NewBuilder()<br>
+ SCom=openedStudy.FindComponent("VISU")<br>
+ myBuilder.LoadWith(SCom ,myVisu)<br>
+ <br>
+ <br>
+ <big><b><a class="el" href="interfaceSALOMEDS_1_1GenericAttribute.html">GenericAttribute</a> 
+FindOrCreateAttribute ( in&nbsp;<a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SObject</a> <i>anObject</i>,&nbsp;
+in string <i>aTypeOfAttribute</i>)</b></big><br>
+ <br>
+ <u><i>Create AttributeName attribute for created component an set value
+to it:</i></u><br>
+ <br>
+ myBuilder = myStudy.NewBuilder()<br>
+ aComponent = myBuilder.NewComponent("User data")<br>
+ <br>
+ anAttr = myBuilder.FindOrCreateAttribute(aComponent, "AttributeName")<br>
+ <br>
+ anAttrName = anAttr._narrow(SALOMEDS.AttributeName) <br>
+ anAttrName.SetValue("User data")<br>
+ <br>
+ <br>
+ <big><b>boolean FindAttribute ( in  <a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SObject</a> <i>anObject,</i> out<i>&nbsp;</i><a
+ class="el" href="interfaceSALOMEDS_1_1GenericAttribute.html">GenericAttribute</a><i> 
+anAttribute</i>, in string <i>aTypeOfAttribute</i> )</b></big><br>
+ <big><b><br>
+ </b></big><i><u>Find AttributeName attribute of the field and print the
+field name:</u></i><br>
+ <br>
+ aFieldSObj&nbsp; = myStudy.FindObject("Head, -")<br>
+ <br>
+ myStudyBuilder.FindAttribute( aFieldSObj, anAttr, "AttributeName")<br>
+ if res == 0:<br>
+  &nbsp;&nbsp;&nbsp; raise&nbsp; RuntimeError, "Error:&nbsp; Attribute not 
+found"<br>
+ <br>
+ anAttr = anAttr._narrow(SALOMEDS.AttributeName);<br>
+ aFieldName = anAttr.Value()<br>
+ print "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ", aFieldName<br>
+ <br>
+ <br>
+ <b><big>void RemoveAttribute ( in  <a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SObject</a> <i>anObject</i>, in
+string <i>aTypeOfAttribute</i> )</big></b><br>
+ <big><b><br>
+ </b><u><i><small>Remove AttributeSelectable attribute of the field SObject:</small></i></u><br>
+ <b><br>
+ </b></big>aFieldSObj&nbsp; = myStudy.FindObject("Head, -")<br>
+  <br>
+  myStudyBuilder.RemoveAttribute( aFieldSObj, "AttributeSelectable")<br>
+ <big><b><br>
+ <br>
+ </b><b>void Addreference ( in&nbsp;<big>  <small><a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SObject</a></small></big><small> 
+</small><i>anObject</i>, in&nbsp;</b><b>  <a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SObject</a> <i>theReferencedObject</i>
+)</b></big><br>
+ <br>
+ <u><i>Create a reference between created SObject and the existing field:</i></u><br>
+ <br>
+ aFieldSObj&nbsp; = myStudy.FindObject("Head, -")<br>
+ aNewSObj = myBuilder.NewObject(myVisu)<br>
+ <br>
+ myBuilder.Addreference(aFieldSObj, aNewSObj)<br>
+ <big><b><br>
+ <br>
+ </b></big><big><small><i><u><a name="NewCommand_ex"></a></u></i></small></big><big><small><b><big>void 
+NewCommand ()<br>
+ <br>
+ </big></b><i><u>Create new command wich containes actions for changing the 
+properties of the study:</u></i><b><big><br>
+ <br>
+ </big></b></small></big>A&nbsp;= myStudy.GetProperties()<br>
+ A&nbsp;= aProperties._narrow(SALOMEDS.AttributeStudyProperties)<br>
+  <br>
+ myBuilder = myStudy.NewBuilder()<br>
+  <br>
+ myBuilder.NewCommand() <i> # creates a new command</i><br>
+  <br>
+  <i># change the properties of the study</i><br>
+  if A.IsLocked() == 0 :<br>
+  &nbsp;&nbsp;&nbsp; A.SetUserName("tester"); print 'A.SetUserName("tester"), 
+A.GetUserName() = ', A.GetUserName()<br>
+  &nbsp;&nbsp;&nbsp; A.SetCreationDate(11,11,11,11,2002); print 'A.SetCreationDate(11,11,11,11,2002), 
+A.GetCreationDate() =', A.GetCreationDate()<br>
+  &nbsp;&nbsp;&nbsp; print "A.IsModified() = ", A.IsModified()<br>
+  A.SetLocked(1)<br>
+ <big><small><br>
+ </small></big>myBuilder.CommitCommand() <i># commits all actions declared 
+within the created command</i><big><br>
+ <b><br>
+ <br>
+ void CommitCommand()<br>
+ </b><small><br>
+ </small><i><small>See the end of the <a href="#NewCommand_ex">previous example</a></small></i><b><br>
+ <br>
+ <br>
+ void AbortCommand ()</b></big><br>
+ <br>
+ <big><small><i><u>Create new command wich containes actions for changing 
+the properties of the study, cancel all declared actions:</u></i></small></big><br>
+ <br>
+ A&nbsp;= myStudy.GetProperties()<br>
+  A&nbsp;= aProperties._narrow(SALOMEDS.AttributeStudyProperties)<br>
+   <br>
+  myBuilder = myStudy.NewBuilder()<br>
+   <br>
+  myBuilder.NewCommand() <i> # creates a new command</i><br>
+   <br>
+   <i># change the properties of the study</i><br>
+   if A.IsLocked() == 0 :<br>
+   &nbsp;&nbsp;&nbsp; A.SetUserName("tester"); print 'A.SetUserName("tester"), 
+A.GetUserName() = ', A.GetUserName()<br>
+   &nbsp;&nbsp;&nbsp; A.SetCreationDate(11,11,11,11,2002); print 'A.SetCreationDate(11,11,11,11,2002), 
+A.GetCreationDate() =', A.GetCreationDate()<br>
+   &nbsp;&nbsp;&nbsp; print "A.IsModified() = ", A.IsModified()<br>
+   A.SetLocked(1)<br>
+  <big><small><br>
+  </small></big>myBuilder.AbortCommand() <i># abort all actions declared
+within the created command</i><br>
+ <br>
+ <br>
+ <big><b>void Undo () raises (<a class="el"
+ href="exceptionSALOMEDS_1_1StudyBuilder_1_1LockProtection.html">LockProtection</a>)</b><b> 
+<small>, </small></b></big><br>
+ <big><b>void Redo ()</b></big> <big><b>raises (<a class="el"
+ href="exceptionSALOMEDS_1_1StudyBuilder_1_1LockProtection.html">LockProtection</a>)</b></big><br>
+ <br>
+ <big><small><i><u>Create new command wich containes actions for changing 
+the properties of the study, <br>
+ cancel all declared actions and then redo it with the help of undo/redo
+mechanism:</u></i></small></big><br>
+ <br>
+ A&nbsp;= myStudy.GetProperties()<br>
+   A&nbsp;= aProperties._narrow(SALOMEDS.AttributeStudyProperties)<br>
+    <br>
+   myBuilder = myStudy.NewBuilder()<br>
+    <br>
+   myBuilder.NewCommand() <i> # creates a new command</i><br>
+    <br>
+    <i># change the properties of the study</i><br>
+    if A.IsLocked() == 0 :<br>
+    &nbsp;&nbsp;&nbsp; A.SetUserName("tester"); print 'A.SetUserName("tester"), 
+A.GetUserName() = ', A.GetUserName()<br>
+    &nbsp;&nbsp;&nbsp; A.SetCreationDate(11,11,11,11,2002); print 'A.SetCreationDate(11,11,11,11,2002), 
+A.GetCreationDate() =', A.GetCreationDate()<br>
+    &nbsp;&nbsp;&nbsp; print "A.IsModified() = ", A.IsModified()<br>
+    A.SetLocked(1)<br>
+   <big><small><br>
+ </small></big>myBuilder.CommitCommand() <i># commits all actions declared 
+within the created command</i><br>
+ <big><small><br>
+  </small></big>myBuilder.Undo() <i># cancels all actions of the command<br>
+ <br>
+ </i>myBuilder.Redo() <i># redoes all actions of the command</i><br>
+ <i><br>
+ <br>
+ <br>
+ </i> 
+<div align="center"><small><small><u><big><big><a
+ name="SALOMEDS::StudyManager_impl"></a><font color="#000000"
+ face="Helvetica, Arial, sans-serif"><big><big><b>SALOMEDS::StudyManager
+interface</b></big></big></font></big></big></u></small></small><br>
+ </div>
+ <i><br>
+ <br>
+ <br>
+ </i><big><b><a class="el" href="interfaceSALOMEDS_1_1Study.html">Study</a> 
+NewStudy ( in string <i>study_name</i> )</b></big><br>
+ <i><br>
+ <u>Create the study with the name "Test_Study":</u></i><br>
+ <br>
+ myNewStudy = myStudyManager.NewStudy("Test_Study")<br>
+ <br>
+ <br>
+ <big><b><a class="el" href="interfaceSALOMEDS_1_1Study.html">Study</a> Open
+( in </b></big><a class="el" href="namespaceSALOMEDS.html#a0">URL</a><big><b> 
+<i>aStudyUrl</i> ) raises </b></big>(<a class="el"
+ href="exceptionSALOME_1_1SALOME__Exception.html">SALOME::SALOME_Exception</a>)<br>
+ <br>
+ <i><u>Open the study saved in the HDF file:</u></i><br>
+ <br>
+ file = 'saved_study.hdf'<br>
+ <br>
+ openedStudy=myStudyManager.Open(file)<br>
+ <br>
+ if openedStudy == None:<br>
+ &nbsp;&nbsp;&nbsp; raise&nbsp; RuntimeError, "Can't open saved study!"<br>
+ <br>
+ <br>
+ <big><b>void Save (in&nbsp;<a class="el"
+ href="interfaceSALOMEDS_1_1Study.html">Study</a> <i>aStudy</i>, in boolean
+<i>theMultifile</i> )</b></big><big><b><br>
+ <br>
+ </b><small><u><i>Open study, import med file into it and save with the old 
+path and filename:</i></u></small><b><br>
+ <br>
+ </b></big>file = "saved_study.hdf"<br>
+ myMedFile ="medfile.med"<br>
+  <br>
+  openedStudy=myStudyManager.Open(file)<br>
+  <br>
+ myVisu.SetCurrentStudy(openedStudy)<br>
+ myResult = myVisu.ImportFile(myMedFile)<br>
+ <br>
+ myStudyManager.Save(openedStudy, 0)<br>
+ <br>
+ <big><b><br>
+ void SaveAs ( in <small><a class="el" href="namespaceSALOMEDS.html#a0">URL</a></small> 
+<i>aUrl</i>, in&nbsp;<small> <a class="el"
+ href="interfaceSALOMEDS_1_1Study.html">Study</a> </small><i>aStudy</i>,
+&nbsp;<small><em></em></small></b></big><big><b>in boolean <i>theMultifile
+</i>)</b><br>
+ <br>
+ <small><u><i>Open study from the file and resave it in several files (using 
+Multifile option while saving)</i></u></small><br>
+ <br>
+ </big>file = "saved_study.hdf"<br>
+ newfile = "resaved_study.hdf"<br>
+ <br>
+ openedStudy=myStudyManager.Open(file)<br>
+   myStudyManager.SaveAs(newfile, openedStudy, 1)<br>
+ <big><br>
+ <br>
+ void Close ( in&nbsp; <a class="el"
+ href="interfaceSALOMEDS_1_1Study.html">Study</a> aStudy )</big><br>
+ <br>
+ <u><i>Close just opened study:</i></u><br>
+ <br>
+ file = "saved_study.hdf"<br>
+ <br>
+  openedStudy=myStudyManager.Open(file)<br>
+    myStudyManager.Close(openedStudy)<br>
+ <br>
+ <br>
+ <br>
+<div align="center"><small><small><u><big><big><a
+ name="SALOMEDS::SObject_impl"></a><font color="#000000"
+ face="Helvetica, Arial, sans-serif"><big><big><b>SALOMEDS::SObject interface</b></big></big></font></big></big></u></small></small><br>
+ </div>
+ <br>
+ <br>
+ <br>
+ <big><b><a class="el" href="namespaceSALOMEDS.html#a1">ID</a> GetID ()</b></big><br>
+ <br>
+ <u><i>Create new SObject and get its ID:</i></u><br>
+ <br>
+ mySObj = myBuilder.NewObject(myFather)<br>
+ <br>
+ myID = &nbsp;mySObj.GetID()<br>
+ <br>
+ <br>
+ <big><b><a class="el" href="interfaceSALOMEDS_1_1SComponent.html">SComponent</a> 
+GetFatherComponent ()</b></big><br>
+ <br>
+ <u><i>Get father component of the SObject:</i></u><br>
+ <br>
+ myFather = mySObj.GetFatherComponent();<br>
+ <br>
+ <br>
+ <big><b>boolean FindAttribute ( out&nbsp;<a class="el"
+ href="interfaceSALOMEDS_1_1GenericAttribute.html">GenericAttribute</a> <i>anAttribute</i>,
+in string <i>aTypeOfAttribute </i>)</b></big><br>
+ <br>
+ <u><i>Find the AttributeName attribute of the field:</i></u><br>
+ <br>
+ aFieldSObj&nbsp; = myStudy.FindObject("Head, -")<br>
+  <br>
+  res = aFieldSObj.FindAttribute( anAttr, "AttributeName")<br>
+  if res == 0:<br>
+   &nbsp;&nbsp;&nbsp; raise&nbsp; RuntimeError, "Error:&nbsp; Attribute not 
+found"<br>
+ <br>
+ <br>
+ <big><b><a class="el" href="namespaceSALOMEDS.html#a9">ListOfAttributes</a> 
+GetAllAttributes ()</b></big><br>
+ <br>
+ <i><u>Get list of all attributes of the SObject, find the number of attributes:</u></i><br>
+ <br>
+ attrs = mySObj.GetAllAttributes()<br>
+ aLen = len(attrs) <i># number of attributes</i><br>
+ <br>
+ <br>
+ <br>
+ <br>
+<div align="center"><small><small><u><big><big><a
+ name="SALOMEDS::SComponent_impl"></a><font color="#000000"
+ face="Helvetica, Arial, sans-serif"><big><big><b>SALOMEDS::SComponent interface</b></big></big></font></big></big></u></small></small><br>
+ </div>
+ <br>
+ <br>
+ <br>
+ <big><b>string ComponentDataType ()</b></big><br>
+ <br>
+ <i><u><a name="ComponentIterator_ex"></a>Print names of all components wich 
+the study contains:</u></i><br>
+ <br>
+ aCompItr = myStudy.NewComponentIterator() <br>
+ <br>
+ while aCompItr.More():<br>
+ &nbsp;&nbsp;&nbsp; aComp = aCompItr.Value()<br>
+ &nbsp;&nbsp;&nbsp; aName = aComp.ComponentDataType()<br>
+ &nbsp;&nbsp;&nbsp; print "Component name = ", aName<br>
+ &nbsp;&nbsp;&nbsp; aCompItr.Next()<br>
+ <br>
+ <br>
+ <i><b>Other methods are inherited.</b></i><br>
+ <br>
+ <br>
+ <br>
+ <br>
+<div align="center"><small><small><u><big><big><a
+ name="SALOMEDS::SComponentIterator_impl"></a><font color="#000000"
+ face="Helvetica, Arial, sans-serif"><big><big><b>SALOMEDS::SComponentIterator
+ interface</b></big></big></font></big></big></u></small></small><br>
+ </div>
+ <br>
+ <br>
+ <br>
+ <big><b>boolean More (), </b><b>void Next (), </b></big><big><b><a
+ class="el" href="interfaceSALOMEDS_1_1SComponent.html">SComponent</a> Value
+()</b></big><br>
+ <br>
+ <big><i><small>See <a href="examples_Study.html#ComponentIterator_ex">another 
+example</a></small></i></big><br>
+ <br>
+ &nbsp;&nbsp; <br>
+ <br>
+<div align="center"><small><small><u><big><big><a
+ name="SALOMEDS::ChildIterator_impl"></a><font color="#000000"
+ face="Helvetica, Arial, sans-serif"><big><big><b>SALOMEDS::ChildIterator
+ interface</b></big></big></font></big></big></u></small></small><br>
+ </div>
+ <br>
+ <br>
+ <br>
+ <big><b>boolean More () , void Next (), <a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SObject</a> Value ()</b></big><br>
+ <br>
+ <u><i>Print all mesh names of imported MED file with the help of ChildIterator:</i></u><br>
+ <br>
+ aResult = myVisu.ImportFile("MedFile.med")<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
+ myStudy = theVisu.GetCurrentStudy()<br>
+ aSObj = myLocalStudy.FindObjectIOR(aResult.GetID())<br>
+ <br>
+ aMeshIter = myLocalStudy.NewChildIterator(aSObj);&nbsp;<i> # creating new 
+child iterator</i><br>
+ <br>
+ while aMeshIter.More() : &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <i># check if one more
+child level exists.     </i><br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aMeshSObj = aMeshIter.Value() 
+&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 
+&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;# <i>returns the SObject corresponding 
+to the current object found by the iterator.      </i>&nbsp;<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aMeshIter.Next() <i>&nbsp; &nbsp; 
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
+&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
+&nbsp; &nbsp;# passes the iterator to the next level.     </i><br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anAttr = aMeshSObj.FindAttribute("AttributeName")[1]<br>
+ &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if anAttr is None :<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 
+aMeshSObj = aMeshIter.Value()<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 
+&nbsp; aMeshIter.Next()<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 
+anAttr = aMeshSObj.FindAttribute("AttributeName")[1]<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anAttr = anAttr._narrow(SALOMEDS.AttributeName);<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aMeshName = anAttr.Value()<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "&nbsp; ", aMeshName<br>
+ <br>
+ <br>
+ <br>
+<div align="center"><small><small><u><big><big><a
+ name="SALOMEDS::AttributeComment_impl"
+ href="#SALOMEDS::AttributeComment_impl"></a><font color="#000000"
+ face="Helvetica, Arial, sans-serif"><big><big><b>SALOMEDS::AttributeComment
+ interface</b></big></big></font></big></big></u></small></small><br>
+ </div>
+ <br>
+ <br>
+ <big><b>string Value (), &nbsp;void SetValue ( in string <i>value </i>)</b></big><br>
+ <br>
+ <u><i>Find the AttributeComment attribute of the "Head" field in the study, 
+print it, then change it to "My Comment" string:</i></u><br>
+ <br>
+ aFieldSObj&nbsp; = myStudy.FindObject("Head, -")<br>
+ anAttr = aFieldSObj.FindAttribute("AttributeComment")[1]<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+anAttr = anAttr._narrow(SALOMEDS.AttributeComment);<br>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+aFieldComment = anAttr.Value()<br>
+ <br>
+ print "AttributeComment", anAttr<br>
+ <br>
+ anAttr.SetValue ("My Comment")<br>
+<pre></pre>
+ <br>
+</body>
+</html>
diff --git a/doc/salome/tui/KERNEL/sources/static/mapping.html b/doc/salome/tui/KERNEL/sources/static/mapping.html
new file mode 100755 (executable)
index 0000000..f3f0a3f
--- /dev/null
@@ -0,0 +1,329 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+   <title>Main Page</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+&nbsp;
+<center><table WIDTH="96%" >
+<tr>
+<td><a href="http://www.opencascade.com"><img SRC="sources/logocorp.gif" BORDER=0 height=46 width=122></a></td>
+
+<td>
+<div align=right><a href="http://www.opencascade.org/SALOME/"><img SRC="sources/application.gif" BORDER=0 height=46 width=108></a></div>
+</td>
+</tr>
+</table></center>
+<a NAME="page1"></a>
+<h2>
+Mapping of IDL definitions to Python language.</h2>
+<a NAME="Intro"></a>
+<h2>
+Introduction</h2>
+SALOME is a distributed client/server application using the Common
+Object Request Broker Architecture (CORBA). CORBA architecture uses the
+Interface Definition Language (IDL), which specifies interfaces between
+CORBA objects. So with help of IDL CORBA's language independence is ensured
+. Because interfaces described in IDL can be mapped to the most of currently
+used programming languages, CORBA applications and components are thus
+independent of the language(s) used to implement them. In other words,
+a client written in C++ can communicate with a server written in Java,
+which in turn can communicate with another server written in COBOL, and
+so forth.
+<p>One important thing to remember about IDL is that it is not an implementation
+language. That is, applications can't be written in IDL. The sole purpose
+of IDL is to define interfaces; providing implementations for these interfaces
+is performed using some other language.
+<p>This page contains an abridged reference manual for mapping of IDL definitions
+to Python language. It will be useful for Python programmers who are not
+familiar with IDL language. All examples are taken from SALOME source
+files. The complete version of Python Language Mapping Specification can
+be found <a href="http://www.omg.org" target="top">here.</a>
+<br>&nbsp;
+<p><a NAME="contents"></a><b>CONTENTS:</b>
+<ul>&nbsp;
+<li>
+<a href="#subsection1">Using Scoped Names</a></li>
+
+<li>
+<a href="#subsection2">Mapping for Template and Array Types</a></li>
+
+<li>
+<a href="#subsection3">Mapping for Objects and Operations</a></li>
+
+<li>
+<a href="#subsection4">Narrowing Object References</a></li>
+
+<li>
+<a href="#subsection5">Mapping for Exceptions</a></li>
+
+<li>
+<a href="#subsection6">Mapping for Enumeration Types</a></li>
+
+<li>
+<a href="#subsection7">Mapping for Structured Types</a></li>
+</ul>
+<br>
+<a NAME="subsection1"></a>
+<h3>
+Using Scoped Names</h3>
+Python implements a module concept that is similar to the IDL scoping mechanisms,
+except that it does not allow for nested modules. In addition, Python requires
+each object to be implemented in a module; globally visible objects are
+not supported.
+<p>Because of these constraints, scoped names are translated into Python
+using the following rules:
+<p>\95 An IDL module mapped into a Python module. Modules containing modules
+are mapped to packages (i.e., directories with an <b>__init__</b> module
+containing all definitions excluding the nested modules). An implementation
+can chose to map toplevel definitions (including the module CORBA) to modules
+in an implementationdefined package, to allow concurrent installations
+of different CORBA runtime libraries. In that case, the implementation
+must provide additional modules so that toplevel modules can be used without
+importing them from a package.
+<p>\95 For all other scopes, a Python class is introduced that contains all
+the definitions inside this scope.
+<p>\95 Other global definitions (except modules) appear in a module whose
+name is implementation dependent. Implementations are encouraged to use
+the name of the IDL file when defining the name of that module.
+<p>For instance,
+<div class="fragment">
+<pre>module SALOMEDS {
+&nbsp;interface StudyManager {
+&nbsp; void&nbsp; Close(in Study aStudy);
+&nbsp;};
+};</pre>
+</div>
+would introduce a module SALOMEDS.py, which contains the following definitions:
+<div class="fragment">
+<pre># module SALOMEDS.py
+class StudyManager:
+&nbsp; def _Close(self,aStudy):
+&nbsp;&nbsp; pass #interfaces are discussed later</pre>
+</div>
+To avoid conflicts, IDL names that are also Python identifiers are prefixed
+with an underscore (\91_\92).
+<p><b><i><a href="#contents">Back to the contents</a></i></b><b><i></i></b>
+<p><a NAME="subsection2"></a>
+<h3>
+Mapping for Template and Array Types</h3>
+Both the bounded and the unbounded string type of IDL are mapped to the
+Python string type. Wide strings are represented by an implementation-defined
+type with the following properties:
+<p>\95 For the wide string X and the integer n, X[n] returns the nth character,
+which is a wide string of length 1.
+<p>\95 len(X) returns the number of characters of wide string X.
+<p>\95 CORBA.wstr(c) returns a wide character with the code point c in an
+implementation-defined encoding.
+<p>\95 X+Y returns the concatenation of wide strings X and Y.
+<p>\95 CORBA.word(CORBA.wstr(c)) == c
+<p>The sequence template is mapped to sequence objects (e.g., tuples or
+lists). Applications should not assume that values of a sequence type are
+mutable. Sequences and arrays of octets and characters are mapped to the
+string type for efficiency reasons.
+<p>For example, given the IDL definitions
+<div class="fragment">
+<pre>module SALOMEDS {
+&nbsp; typedef sequence &lt;string> StringSeq;
+&nbsp;&nbsp;&nbsp;
+&nbsp;&nbsp; interface AttributeTableOfInteger : GenericAttribute {
+
+&nbsp;&nbsp;&nbsp; void SetRowTitles(in StringSeq theTitles) raises(IncorrectArgumentLength);
+&nbsp;};
+};</pre>
+</div>
+a client could invoke the operation
+<div class="fragment">
+<pre>print My_AttributeTableOfInteger.SetRowTitles(["X","F"])</pre>
+</div>
+Array types are mapped like sequence templates. The application in this
+example also expects an IncorrectArgumentLength exception if it passes
+sequences that violate the bounds constraint or arrays of wrong size.
+<p>Another example with arrays. The following IDL definition
+<div class="fragment">
+<pre>module SALOMEDS {
+&nbsp;typedef sequence&lt;GenericAttribute> ListOfAttributes;
+&nbsp;interface SObject {
+&nbsp; ListOfAttributes&nbsp;&nbsp;&nbsp;&nbsp; GetAllAttributes();
+&nbsp;};
+};</pre>
+</div>
+is equal to
+<div class="fragment">
+<pre>import SALOMEDS
+
+attributes=[]
+&nbsp;
+attributes = My_SObject.GetAllAttributes()
+
+length = len(attributes)
+
+print "Attributes number = ", length
+print attributes</pre>
+</div>
+<b><i><a href="#contents">Back to the contents</a></i></b>
+<p><a NAME="subsection3"></a>
+<h3>
+Mapping for Objects and Operations</h3>
+A CORBA object reference is represented as a Python object at run-time.
+This object provides all the operations that are available on the interface
+of the object. Although this specification does not mandate the use of
+classes for stub objects, the following discussion uses classes to indicate
+the interface.
+<p>The nil object is represented by <b>None</b>.
+<p>If an operation expects parameters of the IDL Object type, any Python
+object representing an object reference might be passed as actual argument.
+<p>If an operation expects a parameter of an abstract interface, either
+an object implementing that interface, or a value supporting this interface
+may be passed as actual argument. The semantics of abstract values then
+define whether the argument is passed by value or by reference.
+<p>Operations of an interface map to methods available on the object references.
+Parameters with a parameter attribute of <b>in</b> or <b>inout</b> are
+passed from left to right tothe method, skipping <b>out</b> parameters.
+The return value of a method depends on the number of <b>out</b> parameters
+and the return type. If the operation returns a value, this value forms
+the first <i>result value</i>. All <b>inout</b> or <b>out</b> parameters
+form consecutive <i>result values</i>. The method result depends then on
+the number of <i>result values</i>:
+<p>\95 If there is no <i>result value</i>, the method returns None.
+<p>\95 If there is exactly one <i>result value</i>, it is returned as a single
+value.
+<p>\95 If there is more than one <i>result value</i>, all of them are packed
+into a tuple, and this tuple is returned.
+<p>Assuming the IDL definition
+<div class="fragment">
+<pre>module SALOMEDS{
+&nbsp;interface StudyBuilder{
+&nbsp; boolean FindAttribute&nbsp; ( in SObject anObject,&nbsp;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out GenericAttribute anAttribute,&nbsp;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in string aTypeOfAttribute );
+&nbsp;};
+};</pre>
+</div>
+a client could write
+<div class="fragment">
+<pre>from SALOMEDS import StudyBuilder;
+my_StudyBuilder=...
+&nbsp;&nbsp;
+&nbsp; res,A=my_StudyBuilder.FindAttribute(Sobj, "AttributeSequenceOfReal")</pre>
+</div>
+In this example <b>A</b> corresponds to the return value <b>anAttribute</b>
+and <b>res</b> to the <b>boolean</b> return value.
+<p>If an interface defines an <b>attribute name</b>, for example, the attribute
+is mapped into an operation <b>_get_name</b>. If the attribute is not <b>readonly</b>,
+there is an additional operation <b>_set_name</b>.
+<p>The IDL definition
+<div class="fragment">
+<pre>module SALOMEDS{
+&nbsp;interface Study{
+&nbsp; attribute string Name;
+&nbsp;};
+};</pre>
+</div>
+is equal to the following
+<div class="fragment">
+<pre>from SALOMEDS import Study
+My_Study=...
+&nbsp; Name=My_Study._get_name();
+&nbsp; Name=My_Study._set_name();</pre>
+</div>
+<b><i><a href="#contents">Back to the contents</a></i></b><b><i><a href="#contents"></a></i></b>
+<p><a NAME="subsection4"></a>
+<h3>
+Narrowing Object References</h3>
+Python objects returned from CORBA operations or pseudo-operations (such
+as string_to_object) might have a dynamic type, which is more specific
+than the static type as defined in the operation signature.
+<p>Since there is no efficient and reliable way of automatically creating
+the most specific type, explicit narrowing is necessary. To narrow an object
+reference <b>A</b> to an interface class <b>AttributeSequenceOfReal</b>,
+the client can use the following operation
+<div class="fragment">
+<pre>A = A._narrow(SALOMEDS.AttributeSequenceOfReal)</pre>
+</div>
+<b><i><a href="#contents">Back to the contents</a></i></b><b><i><a href="#contents"></a></i></b>
+<p><a NAME="subsection5"></a>
+<h3>
+Mapping for Exceptions</h3>
+An IDL exception is translated into a Python class derived from CORBA.UserException.
+System exceptions are derived from CORBA.SystemException. Both base classes
+are derived from CORBA.Exception. The parameters of the exception are mapped
+in the same way as the fields of a struct definition. When raising an exception,
+a new instance of the class is created; the constructor expects the exception
+parameters. For example, the definition
+<div class="fragment">
+<pre>module SALOMEDS{
+&nbsp;interface StudyBuilder{
+&nbsp; exception LockProtection {};
+&nbsp; void CommitCommand() raises(LockProtection);
+&nbsp;};
+};</pre>
+</div>
+could be used caught as
+<div class="fragment">
+<pre>from SALOMEDS import StudyBuilder;
+my_StudyBuilder=...
+try:
+&nbsp; my_StudyBuilder.CommitCommand();
+except StudyBuilder.LockProtection,value:
+&nbsp; print "Error! Study is locked for modifications"</pre>
+</div>
+
+<p><br><b><i><a href="#contents">Back to the contents</a></i></b><b><i><a href="#contents"></a></i></b>
+<p><a NAME="subsection6"></a>
+<h3>
+Mapping for Enumeration Types</h3>
+An enumeration is mapped into a number of constant objects in the name
+space where the enumeration is defined. An application may only test for
+equivalence of two enumeration values, and not assume that they behave
+like numbers. For example, the definition
+<div class="fragment">
+<pre>module VISU {
+&nbsp;interface PrsObject{
+&nbsp;
+&nbsp; enum PrsObjType{ TCURVE, TTABLE, TMESH, TCONTAINER,
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TSCALARMAP, TISOSURFACE, TDEFORMEDSHAPE,
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TCUTPLANES, TVECTORS };
+&nbsp;};
+};</pre>
+</div>
+introduces the objects
+<div class="fragment">
+<pre>from VISU import PrsObject
+VISU.PrsObjType.TCURVE,VISU.PrsObjType.TTABLE,VISU.PrsObjType.TMESH,VISU.PrsObjType.TCONTAINER,
+VISU.PrsObjType.TSCALARMAP,VISU.PrsObjType.TISOSURFACE,VISU.PrsObjType.TDEFORMEDSHAPE,VISU.PrsObjType.TCUTPLANES,
+VISU.PrsObjType.TVECTORS</pre>
+</div>
+<b><i><a href="#contents">Back to the contents</a></i></b>
+<p><a NAME="subsection7"></a>
+<h3>
+Mapping for Structured Types</h3>
+An IDL struct definition is mapped into a Python class or type. For each
+field in the struct, there is a corresponding attribute in the class with
+the same name as the field. The constructor of the class expects the field
+values, from left to right. For example, the IDL definition
+<div class="fragment">
+<pre>struct SDate {
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; short Second;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; short Minute;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; short Hour;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; short Day;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; short Month;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; short Year;
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</pre>
+</div>
+could be used in the Python statements
+<div class="fragment">
+<pre>Date=SDate(30, 12, 15, 26, 1, 79)
+print Date.Second,Date.Minute,Date.Hour,Date.Day,Date.Month,Date.Year</pre>
+</div>
+
+<address>
+<b><i><a href="#contents">Back to the contents</a></i></b></address>
+
+</body>
+<!-- Generated by Doxygen 1.2.14 -->
+</html>
diff --git a/doc/salome/tui/KERNEL/sources/static/ns_f3-1.jpg b/doc/salome/tui/KERNEL/sources/static/ns_f3-1.jpg
new file mode 100755 (executable)
index 0000000..fd4f456
Binary files /dev/null and b/doc/salome/tui/KERNEL/sources/static/ns_f3-1.jpg differ
diff --git a/doc/salome/tui/KERNEL/sources/static/overview_Kernel.html b/doc/salome/tui/KERNEL/sources/static/overview_Kernel.html
new file mode 100755 (executable)
index 0000000..7f64f43
--- /dev/null
@@ -0,0 +1,191 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+   <title>Main Page</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+&nbsp;
+<center><table WIDTH="96%" >
+<tr>
+<td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif" BORDER=0 height=46 width=122></a></td>
+
+
+<td>
+<div align=right><a href="http://www.opencascade.org/SALOME/"><img src="sources/application.gif" BORDER=0 height=46 width=108></a></div>
+</td>
+</tr>
+</table></center>
+
+
+<h1><a name="page2">General overview</a>
+</h1>
+<a name="cont"></a><h2>Table of contents </h2>
+<b><i>
+<ul>
+  <li><a href="#1">1. Introduction</a></li>
+  <li><a href="#2">2. Basic principles </a></li>
+               
+  <li><a href="#3">3. Services and features of the SALOME kernel module</a></li>
+  <ul>
+               <li><a href="#3_1">3.1 Session service</a></li>
+               <li><a href="#3_2">3.2 Registry service  </a></li>
+               <li><a href="#3_3">3.3 Notification service  </a></li>
+               <li><a href="#3_4">3.4 Module catalog service  </a></li>
+               <li><a href="#3_5">3.5 Data type catalog  </a></li>
+               <li><a href="#3_6">3.6 Resource catalog  </a></li>
+               <li><a href="#3_7">3.7 Engine  </a></li>
+                       <ul>
+                       <li><a href="#3_7_1">3.7.1 Component class  </a></li>
+                       <li><a href="#3_7_2">3.7.2 Container class  </a></li>
+                       </ul>
+               </ul>
+</ul>
+</i> </b> <br>
+<a name="1"></a><h2>1. Introduction</h2>
+<p>The kernel corresponds to the minimal set of services required for the use of SALOME components (Supervisor, IAPP). 
+The kernel is also used by application software components (solver) and their container. 
+The kernel is associated to a unique user who can launch only one kernel at once. 
+The kernel is launched and destroyed by voluntary actions of the user. These functions are realized via the
+use of scripts.</p>
+<p>The list of the kernel services related to communication issues is:</p>
+<ul>
+  <li>The Naming service</li>
+  <li> The Session service </li>
+  <li>The Life Cycle service </li>
+  <li>The Registry service </li>
+  <li>The Notification service </li>
+</ul>
+<p>This list is enlarged with CORBA independent services :</p>
+
+<ul>
+  <li>The module catalog service </li>
+  <li>The Data Type Catalog service </li>
+  <li>The resource catalog service </li>
+</ul>
+<p> SALOME kernel module also encapsulates the Engine
+<i><a href="#cont">Back to the contents</a></i>
+<a name="2"></a><h2>2. Basic principles </h2>
+<p>The SALOME user's desktop is a process on a machine. This process includes:</p>
+<ul>
+  <li>A graphic interface (based on Qt), </li>
+  <li>A text interface (Python interpreter), </li>
+  <li>A 3D visualization window shared by components.</li>
+</ul>
+<p>SALOME Modules decompose into an interface (widgets GUI, text mode TUI, 3D visualization V3D) and
+an engine.</p>
+<p>The description of a module and its components is obtained by consulting the module catalog.</p>
+<p>The interface is dynamically loaded in the process of the SALOME user's desktop. The engine is a CORBA
+server launched either on the local machine or on the distant machine.</p>
+<p>The engine (CORBA server) is created by a factory (or container). 
+This factory is also a CORBA server. Several containers can be present on a machine. 
+Some containers are specialized for types of components requiring a specific management. 
+For example, a specific container is required for components performing parallel calculations.
+The engine includes at least a dynamically linked library in the container process. 
+This library is the implementation of the CORBA server associated to the engine. 
+If the engine is built from a pre-existent executable code, the library is simply a wrapper of the encapsulated code. 
+It launches the code in a separate process. Wherever possible, the code is included into the dynamic library.
+<p>The container is one of the kernel services. If one needs to create a container on a distant machine, one creates a process resuming a part of the kernel services. The kernel can create other containers on distant machines via the trader (rsh). All the containers and the kernel share the same CORBA naming service with which they register.</p>
+<p>The user reaches the functions of various SALOME'S components, either in graphic interactive mode (GUI) or in command mode ( TUI), via a Python interpreter.</p>
+<i><a href="#cont">Back to the contents</a></i>
+<a name="3"></a>
+<h2>3. Services and features of the SALOME kernel module </h2>
+<p>This section gives a brief overview of the services composing the kernel module. 
+  The <a href="overview_Life_Cycle.html">Life Cycle</a> and <a href="overview_Naming.html">Naming</a> 
+  services are described in separate chapters of this reference manual.</p>
+  
+<a name="3_1"></a><h3>3.1 Session service </h3>
+<p>SALOME session describes the period starting from the kernel creation and 
+  ending with its destruction. During this period the user can connect the session 
+  and disconnect from it without ending this session. One connection log could 
+  be written. A priori, no information resulting from another (past) session can 
+  be used by the current session. </p>
+ <p>Implementation of this service in SALOME application is provided by the class 
+<a href="interfaceSALOME_1_1Session.html">Session</a> encapsulated in the package 
+<a href="namespaceSALOME.html">SALOME</a>.</p> 
+
+<a name="3_2"></a><h3>3.2 Registry service </h3>
+<p> The active component registry should contain:</p>
+
+<ul>
+  <li>The list of the active components</li>
+  <li>The list of the active containers during a SALOME session.</li>
+</ul>
+<p>It should allow the state of a session. It also should allow to know if session can be stopped.</p>
+<p>The API reference for this service is not included in the current version of the reference manual.</p>
+
+<a name="3_3"></a><h3>3.3 Notification service </h3>
+<p>The notification service is a kernel function which allows exchanging of events between CORBA objects.</p>
+<p>In comparison with traditional CORBA event service, SALOME notification service allows to:</p>
+<ul>
+  <li>Filter the events, </li>
+  <li>Structure the events,</li>
+  <li>Establish quality policies of services,</li>
+  <li>Subscribe to various event channels.</li>
+</ul>
+<p>The API reference for this service is not included in the current version of the reference 
+  manual. </p>
+  
+<a name="3_4"></a><h3>3.4 Module catalog service </h3>
+<p>There are two module catalogs in SALOME application:</p>
+<ul>
+<li>General module catalog : This first catalog is common to all SALOME users once the the platform is installed (for example for a particular company or a service). This catalog will be managed by the integrator or the administrator of the platform,
+<li>Personal module catalog : A specific catalog for every user (possibly empty). This catalog should notably allow the developers to test a new component before integrating it into the general catalog.
+</ul>
+<p>The objective of these two module catalogs is to:</p>
+<ul>
+<li>List the available modules;
+<li>Allow the addition, the modification and the deletion of a module in catalogs;
+<li>Look for a module and\or a service fulfilling some given criteria (in catalogs);
+</ul>
+<p><p>Implementation of this service in SALOME application is provided by two classes 
+<a href="interfaceSALOME__ModuleCatalog_1_1ModuleCatalog.html">ModuleCatalog</a>and <a href="interfaceSALOME__ModuleCatalog_1_1AComponent.html">AComponent</a> encapsulated in the package 
+<a href="namespaceSALOME__ModuleCatalog.html">SALOME_ModuleCatalog</a>.</p> 
+
+<a name="3_5"></a><h3>3.5 Data type catalog </h3>
+
+<p>The data exchanged between components services have definite types. During description of input, output, and 
+configuration parameters of components in the module catalog, the
+definition of the parameters types is taken from data type catalog. During the editing of execution of 
+graphs, it is necessary to check that the connections output-input parameters are of compatible
+types.</p>
+<p>The data types correspond to CORBA object classes, including attributes and access methods (defined by their IDL). 
+These types can be created by specialization of generic data types.</p>
+<p>The purpose of the data type catalog is to:</p>
+<ul>
+<li>List the available data types in the catalog;
+<li>Browse the type hierarchy to check the compatibility of types (specialized output toward generic input);
+<li>Allow the addition, the modification and the deletion of a data type in the catalog;
+</ul>
+<p>The API reference for this service is not included in the current version of the reference 
+  manual. </p>
+ <a name="3_6"></a><h3>3.6 Resource catalog</h3>       
+<p>This catalog describes machines, possible types of container on a machine, resources of machines... This catalog is used by the SALOME LifeCycle service.</p>
+<p>The API reference for this service is not included in the current version of the reference 
+  manual. </p>
+  
+<a name="3_7"></a><h3>3.7 Engine</h3> 
+<p>The engine represents  a shared library which can be dynamically loaded by a container. The container can load this library, 
+given an interface name and an implementation
+name. The container dynamically resolves  an extern_C function in the library,
+which constructs the CORBA Engine servant object.</p>
+<p>The SALOME engine in
+ the current version of the application is implemented 
+  as <b>Engines</b> package of interfaces. It encapsulates two classes: Component, Container.</p> 
+<p>The API refernce for <b>Engines</b> package can be found <a href="namespaceEngines.html">here</a>. 
+</p>
+<a name="3_7_1"></a><h4>3.7.1 Component class</h4> 
+<p>This class is used for interaction between the container and the component and between the components inside the container. 
+</p> 
+<p>The API reference for this class can be found <a href="interfaceEngines_1_1Component.html">here</a>.</p>
+
+<a name="3_7_2"></a><h4>3.7.2 Container class</h4> 
+<p>This class provides a set of methods which are necessary for definition of the process of loading and registration of new components in SALOME application.</p> 
+<p>The API reference for this class can be found <a href="interfaceEngines_1_1Container.html">here</a>.</p>
+
+<i><a href="#cont">Back to the contents</a></i> 
+</body>
+</html>
diff --git a/doc/salome/tui/KERNEL/sources/static/overview_Life_Cycle.html b/doc/salome/tui/KERNEL/sources/static/overview_Life_Cycle.html
new file mode 100755 (executable)
index 0000000..f1a1fb8
--- /dev/null
@@ -0,0 +1,90 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+   <title>Life Cycle service Description</title>
+
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+
+</head>
+
+<body>
+&nbsp;
+<center><table WIDTH="96%" >
+<tr>
+<td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif" BORDER=0 height=46 width=122></a></td>
+
+
+<td>
+<div align=right><a href="http://www.opencascade.org/SALOME/"><img src="sources/application.gif" BORDER=0 height=46 width=108></a></div>
+</td>
+</tr>
+</table></center>
+
+
+<h1><a name="page2">Life Cycle service Description</a> </h1>
+<h2>Introduction</h2>
+<p> The objective of this document is to give the users of SALOME 
+  application a brief overview of the Life Cycle service implemented in SALOME. 
+  A complete version of the LifeCycle service specification edited by the Object Management Group, Inc.(OMG) can be found <a href="http://www.omg.org" target="top">here.</a> <a name="#cont"></a>
+  </p>
+<a name="cont"></a><h2>Table of contents </h2>
+<b><i><ul>
+  <li><a href="#1">1. Overview</a></li>
+
+
+  <li><a href="#2">2. SALOME Life Cycle service description</a></li>
+</ul>
+</i></b><br>
+
+<a name="1"></a><h2>1. Overview</h2>
+  
+<p>Life Cycle service defines services and conventions for creating, deleting, copying and moving objects. 
+Because CORBA-based environments support distributed objects, the Life Cycle service defines conventions that allow clients to perform 
+life cycle operations on objects in different locations. This overview describes the life cycle problem for distributed object systems. </p>
+<br>
+  
+
+<a name="2"></a><h2>2. SALOME Life Cycle service description</h2>
+<p>The SALOME  Life Cycle service represents a partial implementation of the CORBA LifeCycle service. <p>
+<p>From general point of view, the SALOME  Life Cycle service allows to <i>find</i> or <i>load</i> with the help of a given container a definte SALOME component with its further
+initialization and registration in the Naming service.</p>
+<p><b>Container</b>  - it's a certain engine realizing the mechanism of loading a SALOME module.</p>
+  <p><b>Component</b> - it's a certain abstract shell wrapping SALOME modules, performing all operations concerned with their initialization and registration. </p>
+<p>From the point of view of the service user, the Life Cycle provides a set of functions allowing to :</p>
+<ul>
+<li>Locate a machine (more generally a container) by a logical set of required features (of both container and
+       machine);</li>
+<li>Load  components on the obtained containers;</li>
+<li>Create a container;</li>
+<li>Obtain the container containing a given component;</li>
+<li>Treat the list of the active components;</li>
+<li>Treat the list of the available containers.</li>
+</ul>
+
+
+<p>The SALOME  Life Cycle is a CORBA server. This server at its initialization is  registered with the naming service.</p>
+<p>The Life Cycle service is invoked  to find a container and use it to load a
+component. It supplies, as parameters, the type of container and the machine features required for loading
+a given component.
+</p>
+<p>The Life Cycle service then returns a CORBA reference of a launched container.</p>
+<p>Containers are launched on demand depending on components to be loaded. The Life Cycle service manages  loading of containers.</p>
+<p>When there is no launched container matching the request the  Life Cycle service invokes loading of the correct type of container on a correct machine via a rsh type command.</p>
+<p>The Life Cycle service interrogates containers to have information about the dynamic state of the machine (load). It contains (and update) the state of the active containers.</p>
+<p>The Life Cycle service can implement a loading strategy for new containers on new machines, depending on the state of the already launched containers.</p>
+<p>The Life Cycle service can stop containers at the end of session on
+demand.</p>
+
+<p>In SALOME platform the Life Cycle service is implemented in <b>SALOME_Life CycleCORBA</b> class. The API refernce for the methods of this class
+can be found <a href="classSALOME__LifeCycleCORBA.html"> here</a>.</p>
+<i><a href="#cont">Back to the contents</a></i>
+<br>
+
+  
+<br>
+
+</body>
+</html>
diff --git a/doc/salome/tui/KERNEL/sources/static/overview_Naming.html b/doc/salome/tui/KERNEL/sources/static/overview_Naming.html
new file mode 100755 (executable)
index 0000000..8af6b10
--- /dev/null
@@ -0,0 +1,197 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+   <title>Naming Service Description</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+&nbsp;
+<center><table WIDTH="96%" >
+<tr>
+<td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif" BORDER=0 height=46 width=122></a></td>
+
+
+<td>
+<div align=right><a href="http://www.opencascade.org/SALOME/"><img src="sources/application.gif" BORDER=0 height=46 width=108></a></div>
+</td>
+</tr>
+</table></center>
+
+
+<h1><a name="page2">Naming Service Description </a></h1>
+<br>
+<h2>Introduction</h2>
+<p>This page contains an abridged version of the Naming Service specification 
+  edited by the Object Management Group, Inc.(OMG). The objective of this document is to give the users of SALOME 
+  application a brief overview of the Naming Service implemented in SALOME. 
+  A complete version of this document can be found <a href="http://www.omg.org" target="top">here.</a> <a name="#cont"></a>
+  </p>
+       <br>
+<a name="cont"></a><h2>Table of contents </h2>
+<b><i>
+<ul>
+  <li><a href="#1">1. Overview</a></li>
+  <li><a href="#2">2. SALOME Naming Service </a></li>
+               <ul>
+               <li><a href="#2_1">2.1 Introduction </a></li>
+               <li><a href="#2_2">2.2 Definitions </a></li>
+               <li><a href="#2_3">2.3 Partition of SALOME name directory hierarchy </a></li>
+               <li><a href="#2_4">2.4 SALOME name directory persistence </a></li>
+               <li><a href="#2_5">2.5 SALOME naming service features </a></li>
+               </ul>
+  
+</ul>
+</i> </b> <br>
+
+<a name="1"></a><h2>1. Overview</h2>
+<p>This chapter presents the OMG Naming Service and explains how the Naming Service can be used to decouple clients and servers by
+providing an external reference exchange mechanism. The chapter also covers how to solve the bootstrapping problem for clients and
+servers by controlling their configuration. 
+ </p>
+  
+<p>In practice, copying stringified references from a server to all its clients is clumsy and does not scale. The Naming Service provides a way
+for servers to advertise references under a name, and for clients to retrieve them. The advantages are: 
+</p>
+<ul>
+  <li>Clients and servers can use meaningful names instead of having to deal with stringified references. </li>
+    <li> By changing a reference in the service without changing its name, you can transparently direct clients to a different object.</li> 
+    <li> The Naming Service solves the bootstrapping problem because it provides a fixed point for clients and servers to rendezvous. </li>
+</ul>
+<p>The Naming Service is much like a white pages phone book. Given a name, it 
+  returns an object reference. </p>
+  
+<p>The terminology used in description of NamigService is the following: </p>
+
+<ul>
+  <li>A name-to-IOR association is called by a name binding. </li>
+  <li>Each binding identifies exactly one object reference, but an object reference 
+    may be bound more than once (have more than one name). </li>
+  <li><a name="graph"></a>A naming context is an object that contains name bindings. 
+    The names within a context must be unique. Naming contexts can contain bindings 
+    to other naming contexts, so naming contexts can form graphs. Binding contexts 
+    in other contexts creates a <i>naming graph</i> \97 a directed graph with nodes 
+    and labeled edges where the nodes are contexts. A naming graph allows more 
+    complex names to reference an object. Given a context in a naming graph, a 
+    sequence of names can reference an object. This sequence of names (called 
+    a <i>compound name</i>) defines a path in the naming graph to navigate the 
+    resolution process. Figure 1-1 shows an example of a naming graph. </li>
+  <li>Binding a name to a context means to add a name\96IOR pair to a context. </li>
+  <li>Resolving a name means to look for a name in a context and to obtain the 
+    IOR bound under that name.</li>
+</ul>
+
+  
+<div align="center"><img src="ns_f3-1.jpg"> </div>
+<p align="center"><font size="-1"><i>Figure 1-1</i> A Naming Graph </font></p>
+ <i><a href="#cont">Back to the contents</a></i>
+ <br>
+ <a name="2"></a>
+<h2>2. SALOME Naming Service </h2>
+<a name="2_1"></a>
+<h3>2.1 Introduction</h3
+>
+<p>The SALOME Naming Service is a kernel function which supplies a name directory 
+  hierarchy for pointing out CORBA objects. This name directory hierarchy allows, 
+  from symbolic names, to dynamically find the references of distributed SALOME 
+  objects, without information about their location. SALOME objects which can 
+  be reached via the naming service are:</p>
+  
+<ul>
+  <li>The kernel services</li>
+  <li>Containers
+  <li>SALOME components instances
+</ul>
+<p>The name directory hierarchy in SALOME represents a graph of directories containing 
+  symbolic associations name-reference on objects. (It has been described in the 
+  <a href="#graph">previous section</a>)</p>
+<a name="2_2"></a>
+<h3>2.2 Definitions</h3>
+<dl>
+<dt><i><b>Directory</b></i></dt> 
+<dd>Context of names containing symbolic associations name-reference on objects.</dd><br><br>
+ <dt><i><b>"/"</b></i></dt>
+ <dd>Character used in SALOME to separate two names of a directory</dd><br><br>
+ <dt><i><b>Access path</b></i></dt> 
+ <dd>List of names (separated by "/" character representing the path to be followed 
+ in the graph to reach an association name-reference (the last name in the sequence).</dd>
+</dl> 
+<blockquote><b>Note:</b>An object can be referenced by several symbolic names 
+  in one or several directories.</blockquote>
+  <a name="2_3"></a>
+<h3>2.3 Partition of SALOME name directory hierarchy</h3>
+<p>The hierarchical organization of the SALOME name directory is not completely frozen .
+Because the framework allows the simultaneous opening of several studies, the following levels are determined:</p>
+<pre> 
+ /Kernel
+ /Container/
+              /Component       
+</pre>
+<a name="2_4"></a>
+<h3>2.4 SALOME name directory persistence</h3>
+<p>During a SALOME session, stopping a server in charge of the Naming Service 
+  doesn't imply the loss of the contents of the SALOME name directory hierarchy. 
+  A backup file is produced and can be used to restart the Naming Service. So, 
+  one can recover the state of the SALOME name directory hierarchy at restart 
+  time. During such breakdown, every call to any function of the Naming Service 
+  invokes an exception of type <i>Unreachable service</i>.</p>
+<a name="2_5"></a>
+<h3>2.5 SALOME Naming Service features</h3>
+<p>Usage and administration of the name directory hierarchy is realized by means of the following functions:</p> 
+<ul>
+  <li>Recording and recovering of the reference of an object </li>
+  <li>Searching for a symbolic name</li>
+  <li>Creating of a directory, reading and modifying of the current directory</li>
+  <li>Destructing of a symbolic name and a diredtory</li>
+</ul>
+<p>The access path used in these functions can be defined, either from the root, or from any
+directory of SALOME name directory hierarchy.</p> 
+
+<p>In SALOME there is s standard interface of Naming Service, and any user can 
+  use it for binding and finding objects. How to use it, it's possible to find 
+  in any CORBA documentation. However in SALOME there is an additional layer which 
+  hides calls to standard interface. </p>
+ <p>The precise API reference for these functions you can find <a href="classSALOME__Naming Service.html">here.</a> </p>
+<p>Here is a short list of public methods which are used for working with the SALOME Naming Service:</p>
+<dl>
+<dt><h4>Register</h4> </dt>
+<dd>Method which register object reference in the naming service with given name. It makes assignment between IOR and stringified name.
+Then it's possible to get object reference from name using "Resolve" method. </dd>
+<br><br>
+<dt><h4>Resolve</h4> </dt>
+  <dd>Try to obtain object reference from name. It's necessary before publishing 
+    IOR in the Naming Service by Register method. </dd>
+<br><br>
+<dt><h4>Find</h4> </dt>
+  <dd>The purpose of this method is to research a name from the current directory 
+    of the naming service. Then if there is occurrence the naming service changes 
+    directory to go to the directory where last occurrence is found. </dd>
+<br><br>
+<dt><h4>CreateDirectory</h4> </dt>
+<dd>This method allows to create one or several directories in the current directory</dd>
+<br><br>
+<dt><h4>ChangeDirectory</h4> </dt>
+<dd>Moves the current directory. The current directory is moved to the root directory if the input parameter <i>Name</i> is "/".</dd>
+<br><br>
+<dt><h4>CurrentDirectory</h4> </dt>
+<dd>Method allowing to get the current directory.</dd>
+<br><br>
+<dt><h4>list</h4> </dt>
+<dd>Method allowing to list and print the whole context beginning from the current context.</dd> 
+<br><br>
+<dt><h4>list_directory</h4> </dt>
+<dd>Method to get all contexts contained in the current directory.</dd> 
+<br><br>
+<dt><h4>DestroyName</h4> </dt>
+<dd>Destroys a symbolic name-object reference association.</dd>
+<br><br>
+<dt><h4>DestroyDirectory</h4> </dt>
+<dd>Destroys an empty directory.</dd>
+</dl>
+
+<i><a href="#cont">Back to the contents</a></i>
+<br>
+</body>
+</html>
diff --git a/doc/salome/tui/KERNEL/sources/static/overview_Study.html b/doc/salome/tui/KERNEL/sources/static/overview_Study.html
new file mode 100755 (executable)
index 0000000..0526536
--- /dev/null
@@ -0,0 +1,261 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+   <title>Main Page</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+&nbsp;
+<center><table WIDTH="96%" >
+<tr>
+<td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif" BORDER=0 height=46 width=122></a></td>
+
+
+<td>
+<div align=right><a href="http://www.opencascade.org/SALOME/"><img src="sources/application.gif" BORDER=0 height=46 width=108></a></div>
+</td>
+</tr>
+</table></center>
+
+
+<h1><a name="page2">General overview</a>
+</h1>
+<br>
+<h2><a name="cont"></a>Table of contents</h2>
+<ul>
+  <li><i><b><a href="#1">1. Introduction</a></b></i></li>
+  <li><i><b><a href="#2">2. Representation of the study</a></b></i></li>
+  <ul>
+    <li><i><b><a href="#2_1">2.1 Study in transient format</a></b></i></li>
+    <li><i><b><a href="#2_2">2.2 Study in persistent format</a></b></i></li>
+    <li><i><b><a href="#2_3">2.3 Link between transient and persistent formats</a></b></i></li>
+  </ul>
+  <li><i><b><a href="#3">3. Services and features of the study</a></b></i></li>
+  <ul>
+  <li><i><b><a href="#3_1">3.1 Study class </a></b></i></li>
+  <li><i><b><a href="#3_2">3.2 StudyBuilder class </a></b></i></li>
+  <li><i><b><a href="#3_3">3.3 StudyManager class </a></b></i></li>
+  <li><i><b><a href="#3_4">3.4 SObject class </a></b></i></li>
+  <li><i><b><a href="#3_5">3.5 SComponent class </a></b></i></li>
+  <li><i><b><a href="#3_6">3.6 ChildIterator class </a></b></i></li>
+  <li><i><b><a href="#3_7">3.7 SComponentIterator </a></b></i></li>
+  <li><i><b><a href="#3_8">3.8 GenericAttribute class  </a></b></i></li>
+  <li><i><b><a href="#3_9">3.9 UseCaseBuilder class </a></b></i></li>
+  <li><i><b><a href="#3_10">3.10 UseCaseIterator </a></b></i></li>
+  <li><i><b><a href="#3_12">3.11 Callback class </a></b></i></li>
+  <li><i><b><a href="#3_12">3.12 Driver class </a></b></i></li>
+  </ul>
+</ul> 
+<h2><a name="1"></a>1. Introduction</h2>
+<p>In SALOME application the Study module is used for management (creation, saving 
+  etc.) of studies. In the framework of the platform, a study represents a working 
+  document allowing to manage the data produced by various components which are 
+  integarted into SALOME.<br>
+</p>
+<h2><a name="2"></a>2. Representation of the study</h2>
+<p>The study represents a set of objects that we will call Study Objects or SObjects. 
+  The study can be represented as a tree, every node of that tree containing a 
+  SObject. SObjects in the study can be values or references towards data of calculation, 
+  graphs of calculation, trees of construction of detail(room), results. Every 
+  SOject of the study is characterised by a unique identifier in the study.</p>
+<p>The study allows to describe the following relations:</p>
+<ul>
+  <li>The link between the transient and persistent values of an SObject.</li>
+  <li>The relations between the SObjects produced by different components.</li>
+  <li>The relations between the SObjects produced by the same component.</li>
+  <li>The link between an object and its user name.</li>
+  <li>The access to the definition of the component which produce an object of 
+    the study.</li>
+  <li>The access to instance of the component (if this one exists) which has produced 
+    this SObject of the study.</li>
+</ul>
+
+<p>Every SObject in the study contains a set of attributes. These attributes represent 
+  a set of definitions associated to that object, they can contain values or corba 
+  references towards the data contained in the internal data structure of a component.</p>
+<p>As the structure of the study is tree-like it is possible to associate sub-objects 
+  to objects.</p>
+<p>As particular object, the study contains Component Data which are labels associated to the component
+which produce data in the study. It is to this object that we can associate attributes containing ID which
+we shall allow to identify the type of the component and also its instance. Objects produced by a
+component will be sub-objects of the coresponding Data Component.</p>
+<p>For example Component Data GEOM will contain the data produced by the component 
+  Geom.</p>
+<table width="100%" border="0">
+  <tr>
+    <td><img src="Study_Struct.gif"></td>
+    <td>GEOM contains the data produced by the component GEOM. The component MESH 
+      contains a SObject Mesh_1 wich refers to the SObject identified 
+      by ID4 corresponding to Geometrie_1.</td>
+  </tr>
+</table>
+<p>We distinguish two forms of the study, the study opened in a session SALOME and the study in the
+persistent format. These two formats are described in the following sections</p>
+<h3><a name="2_1"></a>2.1 Study in transient format</h3>
+<p>The representation of the study in memory will be based on the document OCAF (supplied by OCC).
+The document OCAF can be seen as a tree, every node of that tree is identified by <i>a tag</i> representing an integer value.</p>
+<p>The exploration of the tree from the root to a node supplies a sequence of tags which establishes a
+unique identifier <i>ID</i>. ID represents a character string containing the sequence of tags separated by
+one ':'.</p> 
+<p>For example  0:1:12:4 </p>
+<p>To every node we can associate a set of attributes.</p>
+<p>The attributes which the study can contain can be of the following types:</p>
+<ul>
+<li>All standard attributes supplied by OCC (package TdataStd) which allow to define (integers,
+real, strings, identifiers, references etc.)</li>
+<li>Attributes which contain CORBA references.</li>
+<li>Attributes which contain the path HDF to reach the persistent datum. (Cf. the following chapter)</li>
+</ul>
+<p><b>Remark</b>: it is the study which takes care to build the attributes from the values which are passed to it, so
+an attribute is always in a study, and it knows the study object to which it is attached.</p>
+<p>Example of a Study Object as a set of various attributes.</p>
+<img src="SObject.gif"> 
+<h3><a name="2_2"></a>2.2 Study in persistent format</h3>
+<p>To store a study HDF format is used, this tool allows to represent persistent data in the form of a tree.</p>
+<p>Under the root of the persistent document, you can find a set of nodes:</p>
+<ul>
+<li>The first node contains the skeleton of the study. The skeleton consists of the identifiers of the
+objects, as well as the references among them.</li>
+<li>There is also one node for every component which has produced data during this SALOME session. Under each of these
+node there are values of the data produced by this component.</li>
+</ul>
+<h3><a name="2_3"></a>2.3 Link between transient and persistent formats</h3>
+<p>It will be possible to complete the definition of one object in the study by associating to it an attribute
+<i>HDFPath</i> which will contain the path to the persistent data.</p>
+<img src="Link.gif"> 
+<p><a href="#cont"><b><i>Back to the contents</i></b></a></p>
+<h2><a name="3"></a>3. Services and features of the study</h2>
+<p>The Study in SALOME application possess a wide functionality. This functionality is provided by a set of classes which are described
+below.
+<h3><a name="3_1"></a>3.1 Study class</h3>
+<p>The purpose of the Study class is to manage the data produced by various components 
+  of SALOME platform. Most of the Study operations are handled by the <a href="#3_3">StudyManager</a> 
+  and the <a href="#3_2">StudyBuilder</a>. What 
+  is left in the Study class are elementary inquiries. A Study is explored by 
+  a set of tools, mainly iterators , which are described further.</p> 
+  <p>Nevertheless, the Study class contains a set of methods providing: </p>
+  
+<ul>
+  <li>management of study properties 
+  <li> search for SObjects. 
+  <li>search for SComponents
+  <li>creation of a new StudyBuilder, ComponentIterator, ChildIterator etc.
+</ul>
+<p>The API reference for this class can be found <a href="interfaceSALOMEDS_1_1Study.html">here</a>.</p>
+<h3><a name="3_2"></a>3.2 StudyBuilder class</h3>
+<p>StudyBuilder supplies basic services to edit the study. The edition of the study is made by the
+component. Every component will use the basic services of the StudyBuilder allowing to write and publish objects.</p>
+<p>StudyBulder provides the following functionality:</p>
+<ul>
+  <li>creation, modification or deletetion of SObjects in the study</li>
+  <li>creation or removal of SComponents </li>
+  <li>undo/redo functionality. For that purpose it supplies the methods NewCommand, 
+    CommitCommand, AbortCommand. </li>
+</ul>
+<p>The API reference for this class can be found <a href="interfaceSALOMEDS_1_1StudyBuilder.html">here</a>.</p>
+<h3><a name="3_3"></a>3.3 StudyManager class</h3>
+<p>The purpose of the Manager is to manipulate Studies. Since SALOME is a multi-document 
+  application during a working session you can operate as many stadies as you 
+  wishes to create. </p>
+<p>For that purpose StudyManager provides the following functionality:</p>
+<ul>
+  <li>creation, opening, closing and saving studies</li>
+  <li>navigation through a set of studies present in the current working session</li>
+  <li> copy/paste of the objects in the study functionality.</li>
+</ul>
+<p>The API reference for this class can be found <a href="interfaceSALOMEDS_1_1StudyManager.html">here</a>.</p>
+<h3><a name="3_4"></a>3.4 SObject class</h3>
+<p>The objects in the study are built by the StudyBuilder. 
+The SObject class provides methods for elementary inquiries, like getting an object ID or its attribuites. </p>
+<p>The API reference for this class can be found <a href="interfaceSALOMEDS_1_1SObject.html">here</a>.</p>
+<h3><a name="3_5"></a>3.5 SComponent class</h3>
+<p>The SComponent class establishes in the study a permanent assocition to the components 
+integrated into SALOME platform. The SComponent interface is a specialization of the SObject
+ class. It inherits the most of its methods from the SObject class which are used for management of the SComponents.</p>
+<p>The API reference for this class can be found <a href="interfaceSALOMEDS_1_1SComponent.html">here</a>.</p>
+<h3><a name="3_6"></a>3.6 ChildIterator class</h3>
+<p>It is one of the tools destined for exploration of the study. This class contains a set of methods allowing to get 
+the access to all identified objects which are sons of another identifiedobject.</p>
+<p>The API reference for this class can be found <a href="interfaceSALOMEDS_1_1ChildIterator.html">here</a>.</p>
+<h3><a name="3_7"></a>3.7 SComponentIterator</h3>
+<p>This is the second tool destined for exploration of the study. This interface contains the methods allowing to iterate over all SComponents in the list.
+ The search is started from the first SComponent in the list. </p>
+<p>The API reference for this class can be found <a href="interfaceSALOMEDS_1_1SComponentIterator.html">here</a>.</p> 
+<h3><a name="3_8"></a>3.8 GenericAttribute class </h3>
+ <p>GenericAttribute represents a base class for all attributes which can be assigned to the SObjects created in the study. All attribute classes 
+ derive from this classe and inherit its methods. </p>
+ <p>The API reference for this class can be found <a href="interfaceSALOMEDS_1_1GenericAttribute.html">here</a>.</p> 
+<p>In SALOME application a SObject can possess the following attributes:</p>
+<table width="48%" border="0">
+  <tr>
+    <td width="44%" height="241"> 
+      <ul>
+       <li><a href="interfaceSALOMEDS_1_1AttributeName.html">AttributeName</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeComment.html">AttributeComment</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeIOR.html">AttributeIOR</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeReal.html">AttributeReal</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeInteger.html">AttributeInteger</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeSequenceOfReal.html">AttributeSequenceOfReal</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeSequenceOfInteger.html">AttributeSequenceOfInteger</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributePersistentRef.html">AttributePersistentRef</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeDrawable.html">AttributeDrawable</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeSelectable.html">AttributeSelectable</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeExpandable.html">AttributeExpandable</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeOpened.html">AttributeOpened</a></li>
+ </ul></td>
+    <td width="56%" height="241"> 
+      <ul>
+ <li><a href="interfaceSALOMEDS_1_1AttributeTextColor.html">AttributeTextColor </a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeTextHighlightColor.html">AttributeTextHighlightColor</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributePixMap.html">AttributePixMap</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeTreeNode.html">AttributeTreeNode</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeLocalID.html">AttributeLocalID</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeUserID.html">AttributeUserID</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeTarget.html">AttributeTarget</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeTableOfInteger.html">AttributeTableOfInteger</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeTableOfReal.html">AttributeTableOfReal</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeTableOfString.html">AttributeTableOfString</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributeStudyProperties.html">AttributeStudyProperties</a></li>
+ <li><a href="interfaceSALOMEDS_1_1AttributePythonObject.html">AttributePythonObject</a></li>  
+ </ul></td>
+  </tr>
+</table>
+<h3><a name="3_9"></a>3.9 UseCaseBuilder class</h3>
+<p>UseCase in the study represents a user-defined subtree, containing all or some of the objects which currently exist 
+in the study. The UseCaseBuilder class contains a set of methods used for management (creation, deletion etc) of this sub-tree in the study. </p>
+<p>The API reference for this class can be found <a href="interfaceSALOMEDS_1_1UseCaseBuilder.html">here</a>.</p>
+<h3><a name="3_10"></a>3.10 UseCaseIterator</h3>
+ <p>This class represents an exploration tool for the UseCase. It contains a set of methods used for iteration over the objects in the UseCase.</p> 
+ <p>The API reference for this class can be found <a href="interfaceSALOMEDS_1_1UseCaseIterator.html">here</a>.</p>
+<h3><a name="3_11"></a>3.11 Callback class</h3>
+ <p>The StudyBuilder can be created with the method NewBuilder. While invocation of this method a new object of the class 
+ Callback is created and this object is assigned to the newly created Builder as callback which should be called 
+ when <i>adding</i> and <i>removing</i> the objects. </p>
+ <p>The API reference for this class can be found <a href="interfaceSALOMEDS_1_1Callback.html">here</a>.</p>
+<h3><a name="3_12"></a>3.12 Driver class</h3>
+<p>This class represents a common tool for all components integrated into SALOME 
+  application, that allows them to communicate with the study. It contains a set 
+  of methods which can be called by any component and which provide the following 
+  functionality:
+<ul>
+  <li>publishing in the study of the objects created by a definite component </li>
+  <li>saving/loading of the data created by a definite component. These methods 
+    are called by the StudyManager when loading/saving a study containing the 
+    data created by a definite component.</li>
+  <li>transforming of the transient references into persistant references (or 
+    vice versa) of the SObjects when saving (or loading) a study</li>
+  <li>copy/paste common functionality. These methods can be called by any component 
+    in order to copy/paste its object created in the study</li>
+</ul>
+<p>The API reference for this class can be found <a href="interfaceSALOMEDS_1_1Driver.html">here</a>.</p>
+<p><a href="#cont"><b><i>Back to the contents</i></b></a></p>
+</body>
+</html>
diff --git a/doc/salome/tui/KERNEL/sources/static/page2.html b/doc/salome/tui/KERNEL/sources/static/page2.html
new file mode 100755 (executable)
index 0000000..40eed1f
--- /dev/null
@@ -0,0 +1,34 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+   <title>Main Page</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+&nbsp;
+<center><table WIDTH="96%" >
+<tr>
+<td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif" BORDER=0 height=46 width=122></a></td>
+
+
+<td>
+<div align=right><a href="http://www.opencascade.org/SALOME/"><img src="sources/application.gif" BORDER=0 height=46 width=108></a></div>
+</td>
+</tr>
+</table></center>
+
+
+</body>
+</html>
+<!-- Generated by Doxygen 1.3-rc2 -->
+<h1><a name="page2">Mapping of SALOME IDL definitions to Python language.</a>
+</h1><ul>
+<li><b>SALOME STUDY module</b><ul>
+<li><a href="HTML/SALOMEDS.html">Mapping of SALOMEDS functions</a></li><li><a href="HTML/SALOMEDS_Attributes.html">Mapping of SALOMEDS_Attributes functions</a></li></ul>
+</li><li><b>SAlOME KERNEL module</b><ul>
+<li><a href="HTML/SALOME_Session.html">Mapping of SALOME_Session functions</a></li><li><a href="HTML/SALOME_ModuleCatalog.html">Mapping of SALOME_ModuleCatalog functions</a></li><li><a href="HTML/SALOME_Exception.html">Mapping of SALOME_Exception functions</a></li><li><a href="HTML/SALOME_Component.html">Mapping of SALOME_Component functions</a></li></ul>
+</li></ul>
+</body>
+</html>
diff --git a/doc/salome/tui/KERNEL/sources/static/tree.js.in b/doc/salome/tui/KERNEL/sources/static/tree.js.in
new file mode 100755 (executable)
index 0000000..b7422d7
--- /dev/null
@@ -0,0 +1,200 @@
+foldersTree = gFld("<b>SALOME v.@VERSION@ </b>", "", "")
+     insDoc(foldersTree, gLnk("Main Page", "", "main.html"))
+
+aux1 = insFld(foldersTree, gFld("TUI Reference Guide", ""))
+  aux2 = insFld(aux1, gFld("Modules", ""))
+    aux3 = insFld(aux2, gFld("SALOME STUDY module", ""))
+            insDoc(aux3, gLnk("Overview", "", "overview_Study.html"))
+      aux4 = insFld(aux3, gFld("Packages", ""))        
+               insDoc(aux4, gLnk("SALOMEDS", "", "namespaceSALOMEDS.html"))
+            insDoc(aux3, gLnk("Examples", "", "examples_Study.html"))
+    aux3 = insFld(aux2, gFld("SALOME KERNEL module", ""))
+             insDoc(aux3, gLnk("Overview", "", "overview_Kernel.html"))
+      aux4 = insFld(aux3, gFld("Packages", "")) 
+               insDoc(aux4, gLnk("SALOME_ModuleCatalog", "", "namespaceSALOME__ModuleCatalog.html"))
+               insDoc(aux4, gLnk("SALOME", "", "namespaceSALOME.html"))
+               insDoc(aux4, gLnk("Engines", "", "namespaceEngines.html"))
+             insDoc(aux3, gLnk("Examples", "", "examples_Kernel.html"))
+
+
+/*! Data structures
+*/
+         insDoc(aux1, gLnk("Data Structures", "", "annotated.html"))
+
+/*!    insDoc(aux1, gLnk("SALOME_ModuleCatalog::Acomponent", "", "interfaceSALOME__ModuleCatalog_1_1Acomponent.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeComment", "", "interfaceSALOMEDS_1_1AttributeComment.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeDrawable", "", "interfaceSALOMEDS_1_1AttributeDrawable.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeExpandable", "", "interfaceSALOMEDS_1_1AttributeExpandable.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeInteger", "", "interfaceSALOMEDS_1_1AttributeInteger.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeIOR", "", "interfaceSALOMEDS_1_1AttributeIOR.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeLocalID", "", "interfaceSALOMEDS_1_1AttributeLocalID.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeName", "", "interfaceSALOMEDS_1_1AttributeName.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeOpened", "", "interfaceSALOMEDS_1_1AttributeOpened.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributePersistentRef", "", "interfaceSALOMEDS_1_1AttributePersistentRef.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributePixMap", "", "interfaceSALOMEDS_1_1AttributePixMap.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributePythonObject", "", "interfaceSALOMEDS_1_1AttributePythonObject.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeReal", "", "interfaceSALOMEDS_1_1AttributeReal.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeSelectable", "", "interfaceSALOMEDS_1_1AttributeSelectable.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeSequenceOfInteger", "", "interfaceSALOMEDS_1_1AttributeSequenceOfInteger.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeSequenceOfReal", "", "interfaceSALOMEDS_1_1AttributeSequenceOfReal.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeStudyProperties", "", "interfaceSALOMEDS_1_1AttributeStudyProperties.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfInteger", "", "interfaceSALOMEDS_1_1AttributeTableOfInteger.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength", "", "exceptionSALOMEDS_1_1AttributeTableOfInteger_1_1IncorrectArgumentLength.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfInteger::IncorrectIndex", "", "exceptionSALOMEDS_1_1AttributeTableOfInteger_1_1IncorrectIndex.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfReal", "", "interfaceSALOMEDS_1_1AttributeTableOfReal.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength", "", "exceptionSALOMEDS_1_1AttributeTableOfReal_1_1IncorrectArgumentLength.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfReal::IncorrectIndex", "", "exceptionSALOMEDS_1_1AttributeTableOfReal_1_1IncorrectIndex.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfString", "", "interfaceSALOMEDS_1_1AttributeTableOfString.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfString::IncorrectArgumentLength", "", "exceptionSALOMEDS_1_1AttributeTableOfString_1_1IncorrectArgumentLength.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfString::IncorrectIndex", "", "exceptionSALOMEDS_1_1AttributeTableOfString_1_1IncorrectIndex.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTarget", "", "interfaceSALOMEDS_1_1AttributeTarget.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTextColor", "", "interfaceSALOMEDS_1_1AttributeTextColor.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTextHighlightColor", "", "interfaceSALOMEDS_1_1AttributeTextHighlightColor.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTreeNode", "", "interfaceSALOMEDS_1_1AttributeTreeNode.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeUserID", "", "interfaceSALOMEDS_1_1AttributeUserID.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Callback", "", "interfaceSALOMEDS_1_1Callback.html"))
+       insDoc(aux1, gLnk("SALOMEDS::ChildIterator", "", "interfaceSALOMEDS_1_1ChildIterator.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Color", "", "structSALOMEDS_1_1Color.html"))
+       insDoc(aux1, gLnk("Engines::Component", "", "interfaceEngines_1_1Component.html"))
+       insDoc(aux1, gLnk("Engines::Container", "", "interfaceEngines_1_1Container.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog::DefinitionInterface", "", "structSALOME__ModuleCatalog_1_1DefinitionInterface.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Driver", "", "interfaceSALOMEDS_1_1Driver.html"))
+       insDoc(aux1, gLnk("SALOME::ExceptionStruct", "", "structSALOME_1_1ExceptionStruct.html"))
+       insDoc(aux1, gLnk("SALOMEDS::GenericAttribute", "", "interfaceSALOMEDS_1_1GenericAttribute.html"))
+       insDoc(aux1, gLnk("SALOMEDS::GenericAttribute::LockProtection", "", "exceptionSALOMEDS_1_1GenericAttribute_1_1LockProtection.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog::IAPP_Affich", "", "structSALOME__ModuleCatalog_1_1IAPP__Affich.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog::ModuleCatalog", "", "interfaceSALOME__ModuleCatalog_1_1ModuleCatalog.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog::NotFound", "", "exceptionSALOME__ModuleCatalog_1_1NotFound.html"))
+       insDoc(aux1, gLnk("SALOMEDS::NotImplemented", "", "exceptionSALOMEDS_1_1NotImplemented.html"))
+       insDoc(aux1, gLnk("SALOME::SALOME_Exception", "", "exceptionSALOME_1_1SALOME__Exception.html"))
+       insDoc(aux1, gLnk("SALOMEDS::SComponent", "", "interfaceSALOMEDS_1_1SComponent.html"))
+       insDoc(aux1, gLnk("SALOMEDS::SComponentIterator", "", "interfaceSALOMEDS_1_1SComponentIterator.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog::Service", "", "structSALOME__ModuleCatalog_1_1Service.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog::ServicesParameter", "", "structSALOME__ModuleCatalog_1_1ServicesParameter.html"))
+       insDoc(aux1, gLnk("SALOME::Session", "", "interfaceSALOME_1_1Session.html"))
+       insDoc(aux1, gLnk("SALOME::Session::GUIActive", "", "exceptionSALOME_1_1Session_1_1GUIActive.html"))
+       insDoc(aux1, gLnk("SALOME::Session::RunningStudies", "", "exceptionSALOME_1_1Session_1_1RunningStudies.html"))
+       insDoc(aux1, gLnk("SALOMEDS::SObject", "", "interfaceSALOMEDS_1_1SObject.html"))
+       insDoc(aux1, gLnk("SALOME::StatSession", "", "structSALOME_1_1StatSession.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study", "", "interfaceSALOMEDS_1_1Study.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyCommentError", "", "exceptionSALOMEDS_1_1Study_1_1StudyCommentError.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyInvalidComponent", "", "exceptionSALOMEDS_1_1Study_1_1StudyInvalidComponent.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyInvalidContext", "", "exceptionSALOMEDS_1_1Study_1_1StudyInvalidContext.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyInvalidDirectory", "", "exceptionSALOMEDS_1_1Study_1_1StudyInvalidDirectory.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyNameAlreadyUsed", "", "exceptionSALOMEDS_1_1Study_1_1StudyNameAlreadyUsed.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyNameError", "", "exceptionSALOMEDS_1_1Study_1_1StudyNameError.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyObjectAlreadyExists", "", "exceptionSALOMEDS_1_1Study_1_1StudyObjectAlreadyExists.html"))
+       insDoc(aux1, gLnk("SALOMEDS::StudyBuilder", "", "interfaceSALOMEDS_1_1StudyBuilder.html"))
+       insDoc(aux1, gLnk("SALOMEDS::StudyBuilder::LockProtection", "", "exceptionSALOMEDS_1_1StudyBuilder_1_1LockProtection.html"))
+       insDoc(aux1, gLnk("SALOMEDS::StudyManager", "", "interfaceSALOMEDS_1_1StudyManager.html"))
+       insDoc(aux1, gLnk("SALOMEDS::UseCaseBuilder", "", "interfaceSALOMEDS_1_1UseCaseBuilder.html"))
+       insDoc(aux1, gLnk("SALOMEDS::UseCaseIterator", "", "interfaceSALOMEDS_1_1UseCaseIterator.html"))
+*/
+         insDoc(aux1, gLnk("Class Hierarchy", "", "hierarchy.html"))
+
+/*!    insDoc(aux1, gLnk("SALOME_ModuleCatalog::Acomponent", "", "interfaceSALOME__ModuleCatalog_1_1Acomponent.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfInteger::IncorrectArgumentLength", "", "exceptionSALOMEDS_1_1AttributeTableOfInteger_1_1IncorrectArgumentLength.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfInteger::IncorrectIndex", "", "exceptionSALOMEDS_1_1AttributeTableOfInteger_1_1IncorrectIndex.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfReal::IncorrectArgumentLength", "", "exceptionSALOMEDS_1_1AttributeTableOfReal_1_1IncorrectArgumentLength.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfReal::IncorrectIndex", "", "exceptionSALOMEDS_1_1AttributeTableOfReal_1_1IncorrectIndex.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfString::IncorrectArgumentLength", "", "exceptionSALOMEDS_1_1AttributeTableOfString_1_1IncorrectArgumentLength.html"))
+       insDoc(aux1, gLnk("SALOMEDS::AttributeTableOfString::IncorrectIndex", "", "exceptionSALOMEDS_1_1AttributeTableOfString_1_1IncorrectIndex.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Callback", "", "interfaceSALOMEDS_1_1Callback.html"))
+       insDoc(aux1, gLnk("SALOMEDS::ChildIterator", "", "interfaceSALOMEDS_1_1ChildIterator.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Color", "", "structSALOMEDS_1_1Color.html"))
+  aux2 = insFld(aux1, gFld("Engines::Component", "", "interfaceEngines_1_1Component.html"))
+       insDoc(aux1, gLnk("Engines::Container", "", "interfaceEngines_1_1Container.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog::DefinitionInterface", "", "structSALOME__ModuleCatalog_1_1DefinitionInterface.html"))
+  aux2 = insFld(aux1, gFld("SALOMEDS::Driver", "", "interfaceSALOMEDS_1_1Driver.html"))
+       insDoc(aux1, gLnk("SALOME::ExceptionStruct", "", "structSALOME_1_1ExceptionStruct.html"))
+  aux2 = insFld(aux1, gFld("SALOMEDS::GenericAttribute", "", "interfaceSALOMEDS_1_1GenericAttribute.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeComment", "", "interfaceSALOMEDS_1_1AttributeComment.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeDrawable", "", "interfaceSALOMEDS_1_1AttributeDrawable.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeExpandable", "", "interfaceSALOMEDS_1_1AttributeExpandable.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeInteger", "", "interfaceSALOMEDS_1_1AttributeInteger.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeIOR", "", "interfaceSALOMEDS_1_1AttributeIOR.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeLocalID", "", "interfaceSALOMEDS_1_1AttributeLocalID.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeName", "", "interfaceSALOMEDS_1_1AttributeName.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeOpened", "", "interfaceSALOMEDS_1_1AttributeOpened.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributePersistentRef", "", "interfaceSALOMEDS_1_1AttributePersistentRef.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributePixMap", "", "interfaceSALOMEDS_1_1AttributePixMap.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributePythonObject", "", "interfaceSALOMEDS_1_1AttributePythonObject.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeReal", "", "interfaceSALOMEDS_1_1AttributeReal.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeSelectable", "", "interfaceSALOMEDS_1_1AttributeSelectable.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeSequenceOfInteger", "", "interfaceSALOMEDS_1_1AttributeSequenceOfInteger.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeSequenceOfReal", "", "interfaceSALOMEDS_1_1AttributeSequenceOfReal.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeStudyProperties", "", "interfaceSALOMEDS_1_1AttributeStudyProperties.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeTableOfInteger", "", "interfaceSALOMEDS_1_1AttributeTableOfInteger.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeTableOfReal", "", "interfaceSALOMEDS_1_1AttributeTableOfReal.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeTableOfString", "", "interfaceSALOMEDS_1_1AttributeTableOfString.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeTarget", "", "interfaceSALOMEDS_1_1AttributeTarget.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeTextColor", "", "interfaceSALOMEDS_1_1AttributeTextColor.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeTextHighlightColor", "", "interfaceSALOMEDS_1_1AttributeTextHighlightColor.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeTreeNode", "", "interfaceSALOMEDS_1_1AttributeTreeNode.html"))
+         insDoc(aux2, gLnk("SALOMEDS::AttributeUserID", "", "interfaceSALOMEDS_1_1AttributeUserID.html"))
+       insDoc(aux1, gLnk("SALOMEDS::GenericAttribute::LockProtection", "", "exceptionSALOMEDS_1_1GenericAttribute_1_1LockProtection.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog::IAPP_Affich", "", "structSALOME__ModuleCatalog_1_1IAPP__Affich.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog::ModuleCatalog", "", "interfaceSALOME__ModuleCatalog_1_1ModuleCatalog.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog::NotFound", "", "exceptionSALOME__ModuleCatalog_1_1NotFound.html"))
+       insDoc(aux1, gLnk("SALOMEDS::NotImplemented", "", "exceptionSALOMEDS_1_1NotImplemented.html"))
+       insDoc(aux1, gLnk("SALOME::SALOME_Exception", "", "exceptionSALOME_1_1SALOME__Exception.html"))
+       insDoc(aux1, gLnk("SALOMEDS::SComponentIterator", "", "interfaceSALOMEDS_1_1SComponentIterator.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog::Service", "", "structSALOME__ModuleCatalog_1_1Service.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog::ServicesParameter", "", "structSALOME__ModuleCatalog_1_1ServicesParameter.html"))
+       insDoc(aux1, gLnk("SALOME::Session", "", "interfaceSALOME_1_1Session.html"))
+       insDoc(aux1, gLnk("SALOME::Session::GUIActive", "", "exceptionSALOME_1_1Session_1_1GUIActive.html"))
+       insDoc(aux1, gLnk("SALOME::Session::RunningStudies", "", "exceptionSALOME_1_1Session_1_1RunningStudies.html"))
+  aux2 = insFld(aux1, gFld("SALOMEDS::SObject", "", "interfaceSALOMEDS_1_1SObject.html"))
+         insDoc(aux2, gLnk("SALOMEDS::SComponent", "", "interfaceSALOMEDS_1_1SComponent.html"))
+       insDoc(aux1, gLnk("SALOME::StatSession", "", "structSALOME_1_1StatSession.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study", "", "interfaceSALOMEDS_1_1Study.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyCommentError", "", "exceptionSALOMEDS_1_1Study_1_1StudyCommentError.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyInvalidComponent", "", "exceptionSALOMEDS_1_1Study_1_1StudyInvalidComponent.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyInvalidContext", "", "exceptionSALOMEDS_1_1Study_1_1StudyInvalidContext.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyInvalidDirectory", "", "exceptionSALOMEDS_1_1Study_1_1StudyInvalidDirectory.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyNameAlreadyUsed", "", "exceptionSALOMEDS_1_1Study_1_1StudyNameAlreadyUsed.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyNameError", "", "exceptionSALOMEDS_1_1Study_1_1StudyNameError.html"))
+       insDoc(aux1, gLnk("SALOMEDS::Study::StudyObjectAlreadyExists", "", "exceptionSALOMEDS_1_1Study_1_1StudyObjectAlreadyExists.html"))
+       insDoc(aux1, gLnk("SALOMEDS::StudyBuilder", "", "interfaceSALOMEDS_1_1StudyBuilder.html"))
+       insDoc(aux1, gLnk("SALOMEDS::StudyBuilder::LockProtection", "", "exceptionSALOMEDS_1_1StudyBuilder_1_1LockProtection.html"))
+       insDoc(aux1, gLnk("SALOMEDS::StudyManager", "", "interfaceSALOMEDS_1_1StudyManager.html"))
+       insDoc(aux1, gLnk("SALOMEDS::UseCaseBuilder", "", "interfaceSALOMEDS_1_1UseCaseBuilder.html"))
+       insDoc(aux1, gLnk("SALOMEDS::UseCaseIterator", "", "interfaceSALOMEDS_1_1UseCaseIterator.html"))
+*/
+         insDoc(aux1, gLnk("Class methods list", "", "functions.html"))
+/*!
+aux1 = insFld(foldersTree, gFld("Namespace List", "", "namespaces.html"))
+       insDoc(aux1, gLnk("Engines", "", "namespaceEngines.html"))
+       insDoc(aux1, gLnk("SALOME", "", "namespaceSALOME.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog", "", "namespaceSALOME__ModuleCatalog.html"))
+       insDoc(aux1, gLnk("SALOMEDS", "", "namespaceSALOMEDS.html"))
+*/
+         insDoc(aux1, gLnk("Namespace Members", "", "namespacemembers.html"))
+
+         insDoc(aux1, gLnk("File List", "", "files.html"))
+      
+/*!
+       insDoc(aux1, gLnk("SALOME_Component.idl", "", "SALOME__Component_8idl.html"))
+       insDoc(aux1, gLnk("SALOME_Exception.idl", "", "SALOME__Exception_8idl.html"))
+       insDoc(aux1, gLnk("SALOME_ModuleCatalog.idl", "", "SALOME__ModuleCatalog_8idl.html"))
+       insDoc(aux1, gLnk("SALOME_Session.idl", "", "SALOME__Session_8idl.html"))
+       insDoc(aux1, gLnk("SALOMEDS.idl", "", "SALOMEDS_8idl.html"))
+       insDoc(aux1, gLnk("SALOMEDS_Attributes.idl", "", "SALOMEDS__Attributes_8idl.html"))
+*/
+
+aux1 = insFld(foldersTree, gFld("IDL/Python mapping", ""))
+         insDoc(aux1, gLnk("Mapping of IDL definitions to Python language", "", "mapping.html"))
+         insDoc(aux1, gLnk("Mapping of SALOME IDL definitions to Python language", "", "page2.html"))
+/*!  insDoc(foldersTree, gLnk("Graphical Class Hierarchy", "", "inherits.html"))
+*/
+aux1 = insFld(foldersTree, gFld("Naming service", ""))
+         insDoc(aux1, gLnk("Naming Service Description ", "", "overview_Naming.html"))
+         insDoc(aux1, gLnk("Salome_NamingService Class Reference", "", "classSALOME__NamingService.html"))
+         insDoc(aux1, gLnk("Examples", "", "examples_Naming.html"))
+aux1 = insFld(foldersTree, gFld("Life Cycle", ""))
+         insDoc(aux1, gLnk("Life Cycle Service Description ", "", "overview_Life_Cycle.html"))
+         insDoc(aux1, gLnk("Salome_LifeCycleCorba Class Reference", "", "classSALOME__LifeCycleCORBA.html"))
+         insDoc(aux1, gLnk("Examples", "", "examples_Life_cycle.html"))
+
+
diff --git a/doc/salome/tui/KERNEL/sources/static/treeview.js b/doc/salome/tui/KERNEL/sources/static/treeview.js
new file mode 100644 (file)
index 0000000..55eb43d
--- /dev/null
@@ -0,0 +1,505 @@
+//**************************************************************** 
+// You are free to copy the "Folder-Tree" script as long as you  
+// keep this copyright notice: 
+// Script found in: http://www.geocities.com/Paris/LeftBank/2178/ 
+// Author: Marcelino Alves Martins (martins@hks.com) December '97. 
+//**************************************************************** 
+//Log of changes: 
+//       17 Feb 98 - Fix initialization flashing problem with Netscape
+//       
+//       27 Jan 98 - Root folder starts open; support for USETEXTLINKS; 
+//                   make the ftien4 a js file 
+//       
+// DvH:  Dec 2000 -  Made some minor changes to support external 
+//                   references
+// Definition of class Folder 
+// ***************************************************************** 
+function Folder(folderDescription, tagName, hreference) //constructor 
+{ 
+  //constant data 
+  this.desc = folderDescription 
+  this.tagName = tagName
+  this.hreference = hreference 
+  this.id = -1   
+  this.navObj = 0  
+  this.iconImg = 0  
+  this.nodeImg = 0  
+  this.isLastNode = 0 
+  //dynamic data 
+  this.isOpen = true 
+  this.iconSrc = "ftv2folderopen.png"   
+  this.children = new Array 
+  this.nChildren = 0 
+  //methods 
+  this.initialize = initializeFolder 
+  this.setState = setStateFolder 
+  this.addChild = addChild 
+  this.createIndex = createEntryIndex 
+  this.hide = hideFolder 
+  this.display = display 
+  this.renderOb = drawFolder 
+  this.totalHeight = totalHeight 
+  this.subEntries = folderSubEntries 
+  this.outputLink = outputFolderLink 
+} 
+function setStateFolder(isOpen) 
+{ 
+  var subEntries 
+  var totalHeight 
+  var fIt = 0 
+  var i=0 
+  if (isOpen == this.isOpen) 
+    return 
+  if (browserVersion == 2)  
+  { 
+    totalHeight = 0 
+    for (i=0; i < this.nChildren; i++) 
+      totalHeight = totalHeight + this.children[i].navObj.clip.height 
+      subEntries = this.subEntries() 
+    if (this.isOpen) 
+      totalHeight = 0 - totalHeight 
+    for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++) 
+      indexOfEntries[fIt].navObj.moveBy(0, totalHeight) 
+  }  
+  this.isOpen = isOpen 
+  propagateChangesInState(this) 
+} 
+function propagateChangesInState(folder) 
+{   
+  var i=0 
+  if (folder.isOpen) 
+  { 
+    if (folder.nodeImg) 
+      if (folder.isLastNode) 
+        folder.nodeImg.src = "ftv2mlastnode.png" 
+      else 
+         folder.nodeImg.src = "ftv2mnode.png" 
+    folder.iconImg.src = "ftv2folderopen.png" 
+    for (i=0; i<folder.nChildren; i++) 
+      folder.children[i].display() 
+  } 
+  else 
+  { 
+    if (folder.nodeImg) 
+      if (folder.isLastNode) 
+        folder.nodeImg.src = "ftv2plastnode.png" 
+      else 
+         folder.nodeImg.src = "ftv2pnode.png" 
+    folder.iconImg.src = "ftv2folderclosed.png" 
+    for (i=0; i<folder.nChildren; i++) 
+      folder.children[i].hide() 
+  }  
+} 
+function hideFolder() 
+{ 
+  if (browserVersion == 1 || browserVersion == 3) { 
+    if (this.navObj.style.display == "none") 
+      return 
+    this.navObj.style.display = "none" 
+  } else { 
+    if (this.navObj.visibility == "hidden") 
+      return 
+    this.navObj.visibility = "hidden" 
+  } 
+   
+  this.setState(0) 
+} 
+function initializeFolder(level, lastNode, leftSide) 
+{ 
+var j=0 
+var i=0 
+var numberOfFolders 
+var numberOfDocs 
+var nc 
+      
+  nc = this.nChildren 
+   
+  this.createIndex() 
+  var auxEv = "" 
+  if (browserVersion > 0) 
+    auxEv = "<a href='javascript:clickOnNode("+this.id+")'>" 
+  else 
+    auxEv = "<a>" 
+  if (level>0) 
+    if (lastNode) //the last 'brother' in the children array 
+    { 
+      this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='ftv2mlastnode.png' width=16 height=22 border=0></a>") 
+//    leftSide = leftSide + "<img src='ftv2blank.png' width=16 height=22>"  
+      this.isLastNode = 1 
+    } 
+    else 
+    { 
+      this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='ftv2mnode.png' width=16 height=22 border=0></a>") 
+      leftSide = leftSide + "<img src='ftv2vertline.png' width=16 height=22>" 
+      this.isLastNode = 0 
+    } 
+  else 
+    this.renderOb("") 
+   
+  if (nc > 0) 
+  { 
+    level = level + 1 
+    for (i=0 ; i < this.nChildren; i++)  
+    { 
+      if (i == this.nChildren-1) 
+        this.children[i].initialize(level, 1, leftSide) 
+      else 
+        this.children[i].initialize(level, 0, leftSide) 
+      } 
+  } 
+} 
+function drawFolder(leftSide) 
+{ 
+  if (browserVersion == 2) { 
+    if (!doc.yPos) 
+      doc.yPos=8 
+    doc.write("<layer id='folder" + this.id + "' top=" + doc.yPos + " visibility=hidden>") 
+  } 
+  if (browserVersion == 3) 
+  {
+    doc.write("<div id='folder" + this.id + "' style='visibility:hide;'>") 
+  }
+   
+  doc.write("\n<table ") 
+  if (browserVersion == 1) 
+    doc.write(" id='folder" + this.id + "' style='position:block;' ") 
+  doc.write(" border=0 cellspacing=0 cellpadding=0>") 
+  doc.write("\n<tr><td>") 
+  doc.write(leftSide) 
+  this.outputLink() 
+  doc.write("<img name='folderIcon" + this.id + "' ") 
+  doc.write("src='" + this.iconSrc+"' border=0></a>") 
+  doc.write("</td>\n<td valign=middle nowrap>") 
+  if (USETEXTLINKS) 
+  { 
+    this.outputLink() 
+    doc.write(this.desc + "</a>") 
+  } 
+  else 
+    doc.write(this.desc)
+
+/*! 
+  if (this.tagName!="")
+  {
+    doc.write(" [external]")
+  }
+*/
+  doc.write("</td>")  
+  doc.write("\n</table>\n") 
+   
+  if (browserVersion == 2) { 
+    doc.write("</layer>") 
+  } 
+  if (browserVersion == 3) { 
+    doc.write("</div>") 
+  } 
+  if (browserVersion == 1) { 
+    this.navObj = doc.all["folder"+this.id] 
+    this.iconImg = doc.all["folderIcon"+this.id] 
+    this.nodeImg = doc.all["nodeIcon"+this.id] 
+  } else if (browserVersion == 2) { 
+    this.navObj = doc.layers["folder"+this.id] 
+    this.iconImg = this.navObj.document.images["folderIcon"+this.id] 
+    this.nodeImg = this.navObj.document.images["nodeIcon"+this.id] 
+    doc.yPos=doc.yPos+this.navObj.clip.height 
+  } else if (browserVersion == 3) {
+    this.navObj = doc.getElementById("folder"+this.id)
+    this.iconImg = doc.images.namedItem("folderIcon"+this.id)
+    this.nodeImg = doc.images.namedItem("nodeIcon"+this.id)
+  }
+} 
+function outputFolderLink() 
+{ 
+  if (this.hreference) 
+  { 
+    doc.write("<a ")
+    if (this.tagName)
+    {
+      doc.write("doxygen='" + this.tagName + "' ");
+    }
+    doc.write("href='" + this.hreference + "' TARGET=\"basefrm\" ") 
+    if (browserVersion > 0) 
+      doc.write("onClick='javascript:clickOnFolder("+this.id+")'") 
+    doc.write(">") 
+  } 
+  else 
+    doc.write("<a>") 
+} 
+function addChild(childNode) 
+{ 
+  this.children[this.nChildren] = childNode 
+  this.nChildren++ 
+  return childNode 
+} 
+function folderSubEntries() 
+{ 
+  var i = 0 
+  var se = this.nChildren 
+  for (i=0; i < this.nChildren; i++){ 
+    if (this.children[i].children) //is a folder 
+      se = se + this.children[i].subEntries() 
+  } 
+  return se 
+} 
+// Definition of class Item (a document or link inside a Folder) 
+// ************************************************************* 
+function Item(itemDescription, tagName, itemLink) // Constructor 
+{ 
+  // constant data 
+  this.desc = itemDescription 
+  this.tagName = tagName
+  this.link = itemLink 
+  this.id = -1 //initialized in initalize() 
+  this.navObj = 0 //initialized in render() 
+  this.iconImg = 0 //initialized in render() 
+  this.iconSrc = "ftv2doc.png" 
+  // methods 
+  this.initialize = initializeItem 
+  this.createIndex = createEntryIndex 
+  this.hide = hideItem 
+  this.display = display 
+  this.renderOb = drawItem 
+  this.totalHeight = totalHeight 
+} 
+function hideItem() 
+{ 
+  if (browserVersion == 1 || browserVersion == 3) { 
+    if (this.navObj.style.display == "none") 
+      return 
+    this.navObj.style.display = "none" 
+  } else { 
+    if (this.navObj.visibility == "hidden") 
+      return 
+    this.navObj.visibility = "hidden" 
+  }     
+} 
+function initializeItem(level, lastNode, leftSide) 
+{  
+  this.createIndex() 
+  if (level>0) 
+    if (lastNode) //the last 'brother' in the children array 
+    { 
+      this.renderOb(leftSide + "<img src='ftv2lastnode.png' width=16 height=22>") 
+      leftSide = leftSide + "<img src='ftv2blank.png' width=16 height=22>"  
+    } 
+    else 
+    { 
+      this.renderOb(leftSide + "<img src='ftv2node.png' width=16 height=22>") 
+      leftSide = leftSide + "<img src='ftv2vertline.png' width=16 height=22>" 
+    } 
+  else 
+    this.renderOb("")   
+} 
+function drawItem(leftSide) 
+{ 
+  if (browserVersion == 2) 
+    doc.write("<layer id='item" + this.id + "' top=" + doc.yPos + " visibility=hidden>") 
+  if (browserVersion == 3) 
+    doc.write("<div id='item" + this.id + "' style='display:block;'>") 
+     
+  doc.write("\n<table ") 
+  if (browserVersion == 1) 
+    doc.write(" id='item" + this.id + "' style='position:block;' ") 
+  doc.write(" border=0 cellspacing=0 cellpadding=0>\n") 
+  doc.write("<tr><td>") 
+  doc.write(leftSide) 
+  if (this.link!="")
+  {
+    doc.write("<a href=" + this.link + ">") 
+  }
+  doc.write("<img id='itemIcon"+this.id+"' ") 
+  doc.write("src='"+this.iconSrc+"' border=0>") 
+  if (this.link!="")
+  {
+    doc.write("</a>")
+  } 
+  doc.write("</td>\n<td valign=middle nowrap>") 
+  if (USETEXTLINKS && this.link!="") 
+    doc.write("<a href=" + this.link + ">" + this.desc + "</a>") 
+  else 
+    doc.write(this.desc) 
+/*!
+  if (this.tagName!="")
+  {
+    doc.write(" [external]");
+  }
+*/
+  doc.write("\n</table>\n") 
+   
+  if (browserVersion == 2) 
+    doc.write("</layer>") 
+  if (browserVersion == 3) 
+    doc.write("</div>")
+  if (browserVersion == 1) { 
+    this.navObj = doc.all["item"+this.id] 
+    this.iconImg = doc.all["itemIcon"+this.id] 
+  } else if (browserVersion == 2) { 
+    this.navObj = doc.layers["item"+this.id] 
+    this.iconImg = this.navObj.document.images["itemIcon"+this.id] 
+    doc.yPos=doc.yPos+this.navObj.clip.height 
+  } else if (browserVersion == 3) {
+    this.navObj = doc.getElementById("item"+this.id)
+    this.iconImg = doc.images.namedItem("itemIcon"+this.id)
+  }
+} 
+// Methods common to both objects (pseudo-inheritance) 
+// ******************************************************** 
+function display() 
+{ 
+  if (browserVersion == 1 || browserVersion == 3) 
+    this.navObj.style.display = "block" 
+  else 
+    this.navObj.visibility = "show" 
+} 
+function createEntryIndex() 
+{ 
+  this.id = nEntries 
+  indexOfEntries[nEntries] = this 
+  nEntries++ 
+} 
+// total height of subEntries open 
+function totalHeight() //used with browserVersion == 2 
+{ 
+  var h = this.navObj.clip.height 
+  var i = 0 
+   
+  if (this.isOpen) //is a folder and _is_ open 
+    for (i=0 ; i < this.nChildren; i++)  
+      h = h + this.children[i].totalHeight() 
+  return h 
+} 
+// Events 
+// ********************************************************* 
+function clickOnFolder(folderId) 
+{ 
+  var clicked = indexOfEntries[folderId] 
+  if (!clicked.isOpen) 
+    clickOnNode(folderId) 
+  return  
+  if (clicked.isSelected) 
+    return 
+} 
+function clickOnNode(folderId) 
+{ 
+  var clickedFolder = 0 
+  var state = 0 
+  clickedFolder = indexOfEntries[folderId] 
+  state = clickedFolder.isOpen 
+  clickedFolder.setState(!state) //open<->close  
+} 
+function initializeDocument() 
+{ 
+  doc = document;
+  if (doc.all) 
+    browserVersion = 1 //IE4   
+  else 
+    if (doc.layers) 
+      browserVersion = 2 //NS4 
+    else if(navigator.userAgent.toLowerCase().indexOf('gecko') != -1)
+        browserVersion = 3 //mozilla
+      else 
+        browserVersion = 0 //other 
+
+  foldersTree.initialize(0, 1, "") 
+  foldersTree.display()
+  
+  if (browserVersion > 0) 
+  { 
+    if(browserVersion != 3)
+      doc.write("<layer top="+indexOfEntries[nEntries-1].navObj.top+">&nbsp;</layer>") 
+    // close the whole tree 
+    clickOnNode(0) 
+    // open the root folder 
+    clickOnNode(0) 
+  } 
+} 
+// Auxiliary Functions for Folder-Treee backward compatibility 
+// ********************************************************* 
+function gFld(description, tagName, hreference) 
+{ 
+  folder = new Folder(description, tagName, hreference) 
+  return folder 
+} 
+function gLnk(description, tagName, linkData) 
+{ 
+  fullLink = "" 
+  if (linkData!="")
+  {
+    fullLink = "'"+linkData+"' target=\"basefrm\"" 
+  } 
+  linkItem = new Item(description, tagName, fullLink)   
+  return linkItem 
+} 
+function insFld(parentFolder, childFolder) 
+{ 
+  return parentFolder.addChild(childFolder) 
+} 
+function insDoc(parentFolder, document) 
+{ 
+  parentFolder.addChild(document) 
+} 
+// Global variables 
+// **************** 
+USETEXTLINKS = 1
+indexOfEntries = new Array 
+nEntries = 0 
+doc = document 
+browserVersion = 0 
+selectedFolder=0
diff --git a/doc/salome/tui/pythfilter.py b/doc/salome/tui/pythfilter.py
new file mode 100644 (file)
index 0000000..4a7f180
--- /dev/null
@@ -0,0 +1,568 @@
+#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+#
+#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+#!/usr/bin/env python
+#
+import getopt
+import glob
+import os.path
+import shutil
+import string
+import sys
+import token
+import tokenize
+
+from stat import *
+
+OUTSIDE          = 0
+BUILD_COMMENT    = 1
+BUILD_CLASS_DECL = 2
+BUILD_CLASS_BODY = 3
+BUILD_DEF_DECL   = 4
+BUILD_DEF_BODY   = 5
+IMPORT           = 6
+IMPORT_OP        = 7
+IMPORT_APPEND    = 8
+
+# Output file stream
+outfile = sys.stdout
+
+# Output buffer
+outbuffer = []
+
+out_row = 0
+out_col = 0
+
+# Variables used by rec_name_n_param()
+name         = ""
+param        = ""
+doc_string   = ""
+record_state = 0
+bracket_counter = 0
+
+# Tuple: (row,column)
+class_spos  = (0,0)
+def_spos    = (0,0)
+import_spos = (0,0)
+
+# Which import was used? ("import" or "from")
+import_token = ""
+
+# Comment block buffer
+comment_block = []
+comment_finished = 0
+
+# Imported modules
+modules = []
+
+# Program state
+stateStack = [OUTSIDE]
+
+# Keep track of whether module has a docstring
+module_has_docstring = False
+
+# Keep track of member protection
+protection_level = "public"
+private_member = False
+
+# Keep track of the module namespace
+namespace = ""
+
+######################################################################
+# Output string s. '\n' may only be at the end of the string (not
+# somewhere in the middle).
+#
+# In: s    - String
+#     spos - Startpos
+######################################################################
+def output(s,spos, immediate=0):
+    global outbuffer, out_row, out_col, outfile
+
+    os = string.rjust(s,spos[1]-out_col+len(s))
+    if immediate:
+        outfile.write(os)
+    else:
+        outbuffer.append(os)
+    if (s[-1:]=="\n"):
+        out_row = out_row+1
+        out_col = 0
+    else:
+        out_col = spos[1]+len(s)
+
+
+######################################################################
+# Records a name and parameters. The name is either a class name or
+# a function name. Then the parameter is either the base class or
+# the function parameters.
+# The name is stored in the global variable "name", the parameters
+# in "param".
+# The variable "record_state" holds the current state of this internal
+# state machine.
+# The recording is started by calling start_recording().
+#
+# In: type, tok
+######################################################################
+def rec_name_n_param(type, tok):
+    global record_state,name,param,doc_string,bracket_counter
+    s = record_state
+    # State 0: Do nothing.
+    if   (s==0):
+         return
+    # State 1: Remember name.
+    elif (s==1):
+        name = tok
+        record_state = 2
+    # State 2: Wait for opening bracket or colon
+    elif (s==2):
+        if (tok=='('):
+            bracket_counter = 1
+            record_state=3
+        if (tok==':'): record_state=4
+    # State 3: Store parameter (or base class) and wait for an ending bracket
+    elif (s==3):
+        if (tok=='*' or tok=='**'):
+            tok=''
+        if (tok=='('):
+            bracket_counter = bracket_counter+1
+        if (tok==')'):
+            bracket_counter = bracket_counter-1
+        if bracket_counter==0:
+            record_state=4
+        else:
+            param=param+tok
+    # State 4: Look for doc string
+    elif (s==4):
+        if (type==token.NEWLINE or type==token.INDENT or type==token.SLASHEQUAL):
+            return
+        elif (tok==":"):
+            return
+        elif (type==token.STRING):
+            while tok[:1]=='r' or tok[:1]=='u':
+                tok=tok[1:]
+            while tok[:1]=='"':
+                tok=tok[1:]
+            while tok[-1:]=='"':
+                tok=tok[:-1]
+            doc_string=tok
+        record_state=0
+
+######################################################################
+# Starts the recording of a name & param part.
+# The function rec_name_n_param() has to be fed with tokens. After
+# the necessary tokens are fed the name and parameters can be found
+# in the global variables "name" und "param".
+######################################################################
+def start_recording():
+    global record_state,param,name, doc_string
+    record_state=1
+    name=""
+    param=""
+    doc_string=""
+
+######################################################################
+# Test if recording is finished
+######################################################################
+def is_recording_finished():
+    global record_state
+    return record_state==0
+
+######################################################################
+## Gather comment block
+######################################################################
+def gather_comment(type,tok,spos):
+    global comment_block,comment_finished
+    if (type!=tokenize.COMMENT):
+        comment_finished = 1
+    else:
+        # Output old comment block if a new one is started.
+        if (comment_finished):
+            print_comment(spos)
+            comment_finished=0
+        if (tok[0:2]=="##" and tok[0:3]!="###"):
+            comment_block.append(tok[2:])
+
+######################################################################
+## Output comment block and empty buffer.
+######################################################################
+def print_comment(spos):
+    global comment_block,comment_finished
+    if (comment_block!=[]):
+        output("/**\n",spos)
+        for c in comment_block:
+            output(c,spos)
+        output("*/\n",spos)
+    comment_block    = []
+    comment_finished = 0
+
+######################################################################
+def set_state(s):
+    global stateStack
+    stateStack[len(stateStack)-1]=s
+
+######################################################################
+def get_state():
+    global stateStack
+    return stateStack[len(stateStack)-1]
+
+######################################################################
+def push_state(s):
+    global stateStack
+    stateStack.append(s)
+
+######################################################################
+def pop_state():
+    global stateStack
+    stateStack.pop()
+
+
+######################################################################
+def tok_eater(type, tok, spos, epos, line):
+    global stateStack,name,param,class_spos,def_spos,import_spos
+    global doc_string, modules, import_token, module_has_docstring
+    global protection_level, private_member
+
+    rec_name_n_param(type,tok)
+    if (string.replace(string.strip(tok)," ","")=="##private:"):
+         protection_level = "private"
+         output("private:\n",spos)
+    elif (string.replace(string.strip(tok)," ","")=="##protected:"):
+         protection_level = "protected"
+         output("protected:\n",spos)
+    elif (string.replace(string.strip(tok)," ","")=="##public:"):
+         protection_level = "public"
+         output("public:\n",spos)
+    else:
+         gather_comment(type,tok,spos)
+
+    state = get_state()
+
+#    sys.stderr.write("%d: %s\n"%(state, tok))
+
+    # OUTSIDE
+    if   (state==OUTSIDE):
+        if  (tok=="class"):
+            start_recording()
+            class_spos = spos
+            push_state(BUILD_CLASS_DECL)
+        elif (tok=="def"):
+            start_recording()
+            def_spos = spos
+            push_state(BUILD_DEF_DECL)
+        elif (tok=="import") or (tok=="from"):
+            import_token = tok
+            import_spos = spos
+            modules     = []
+            push_state(IMPORT)
+        elif (spos[1] == 0 and tok[:3] == '"""'):
+            # Capture module docstring as namespace documentation
+            module_has_docstring = True
+            #comment_block.append("\\namespace %s\n" % namespace)
+            comment_block.append(tok[3:-3])
+            print_comment(spos)
+
+    # IMPORT
+    elif (state==IMPORT):
+        if (type==token.NAME):
+            modules.append(tok)
+            set_state(IMPORT_OP)
+    # IMPORT_OP
+    elif (state==IMPORT_OP):
+        if (tok=="."):
+            set_state(IMPORT_APPEND)
+        elif (tok==","):
+            set_state(IMPORT)
+        else:
+            for m in modules:
+                output('#include "'+m.replace('.',os.sep)+'.py"\n', import_spos, immediate=1)
+                if import_token=="from":
+                    output('using namespace '+m.replace('.', '::')+';\n', import_spos)
+            pop_state()
+    # IMPORT_APPEND
+    elif (state==IMPORT_APPEND):
+        if (type==token.NAME):
+            modules[len(modules)-1]+="."+tok
+            set_state(IMPORT_OP)
+    # BUILD_CLASS_DECL
+    elif (state==BUILD_CLASS_DECL):
+        if (is_recording_finished()):
+            s = "class "+name
+            if (param!=""): s = s+" : public "+param.replace('.','::')
+            if (doc_string!=""): comment_block.append(doc_string)
+            print_comment(class_spos)
+            output(s+"\n",class_spos)
+            output("{\n",(class_spos[0]+1,class_spos[1]))
+            protection_level = "public"
+            output("  public:\n",(class_spos[0]+2,class_spos[1]))
+            set_state(BUILD_CLASS_BODY)
+    # BUILD_CLASS_BODY
+    elif (state==BUILD_CLASS_BODY):
+        if (type!=token.INDENT and type!=token.NEWLINE and type!=40 and
+            type!=tokenize.NL and type!=tokenize.COMMENT and
+            (spos[1]<=class_spos[1])):
+            output("}; // end of class\n",(out_row+1,class_spos[1]))
+            pop_state()
+        elif (tok=="def"):
+            start_recording()
+            def_spos = spos
+            push_state(BUILD_DEF_DECL)
+    # BUILD_DEF_DECL
+    elif (state==BUILD_DEF_DECL):
+        if (is_recording_finished()):
+            s = ''
+            # Do we document a class method? then remove the 'self' parameter
+            if BUILD_CLASS_BODY in stateStack:
+                params = param.split(",")
+                if params[0] == 'self':
+                    param = string.join(params[1:], ",")
+                else:
+                    s = 'static '
+                    if params[0] == 'cls':
+                        param = string.join(params[1:], ",")
+               s = s+name+"("+param+");\n"
+                if len(name) > 1 \
+                   and name[0:2] == '__' \
+                   and name[len(name)-2:len(name)] != '__' \
+                   and protection_level != 'private':
+                       private_member = True
+                       output("  private:\n",(def_spos[0]+2,def_spos[1]))
+            else:
+               s = name+"("+param+");\n"
+            if (doc_string!=""): comment_block.append(doc_string)
+            print_comment(def_spos)
+            output(s,def_spos)
+#       output("{\n",(def_spos[0]+1,def_spos[1]))
+            set_state(BUILD_DEF_BODY)
+    # BUILD_DEF_BODY
+    elif (state==BUILD_DEF_BODY):
+        if (type!=token.INDENT and type!=token.NEWLINE \
+            and type!=40 and type!=tokenize.NL \
+            and (spos[1]<=def_spos[1])):
+#            output("} // end of method/function\n",(out_row+1,def_spos[1]))
+            if private_member and protection_level != 'private':
+                private_member = False
+                output("  " + protection_level + ":\n",(def_spos[0]+2,def_spos[1]))
+            pop_state()
+#       else:
+#            output(tok,spos)
+
+
+def dump(filename):
+    f = open(filename)
+    r = f.readlines()
+    for s in r:
+        sys.stdout.write(s)
+
+def filter(filename):
+    global name, module_has_docstring
+    global namespace,outbuffer
+    outbuffer=[]
+
+    path,name = os.path.split(filename)
+    root,ext  = os.path.splitext(name)
+
+
+    if namespace:
+       if root == "__init__":
+          root=namespace
+       else:
+          root=namespace+"::"+root 
+    else:
+       root=root 
+
+    output("namespace "+root+" {\n",(0,0))
+
+    # set module name for tok_eater to use if there's a module doc string
+    package=namespace
+    name = root
+    namespace = root
+
+    sys.stderr.write("namespace: "+namespace+'\n')
+    sys.stderr.write("root: "+root+'\n')
+    sys.stderr.write('Filtering "'+filename+'"...')
+
+    f = open(filename)
+    tokenize.tokenize(f.readline, tok_eater)
+    f.close()
+    print_comment((0,0))
+
+    output("\n",(0,0))
+    output("}  // end of namespace\n",(0,0))
+
+    if not module_has_docstring:
+        # Put in default namespace documentation
+        output('/** \\namespace '+root+' \n',(0,0))
+        output('    \\brief Module "%s" */\n'%(root),(0,0))
+
+    for s in outbuffer:
+        outfile.write(s)
+    namespace=package
+    module_has_docstring = False
+
+
+def filterFile(filename, out=sys.stdout):
+    global outfile
+
+    outfile = out
+
+    try:
+        root,ext  = os.path.splitext(filename)
+
+        if ext==".py":
+            filter(filename)
+        else:
+            dump(filename)
+
+        sys.stderr.write("OK\n")
+    except IOError,e:
+        sys.stderr.write(e[1]+"\n")
+
+
+######################################################################
+
+# preparePath
+def preparePath(path):
+    """Prepare a path.
+
+    Checks if the path exists and creates it if it does not exist.
+    """
+    if not os.path.exists(path):
+        parent = os.path.dirname(path)
+        if parent!="":
+            preparePath(parent)
+        os.mkdir(path)
+
+# isNewer
+def isNewer(file1,file2):
+    """Check if file1 is newer than file2.
+
+    file1 must be an existing file.
+    """
+    if not os.path.exists(file2):
+        return True
+    return os.stat(file1)[ST_MTIME]>os.stat(file2)[ST_MTIME]
+
+# convert
+def convert(srcpath, destpath):
+    """Convert a Python source tree into a C+ stub tree.
+
+    All *.py files in srcpath (including sub-directories) are filtered
+    and written to destpath. If destpath exists, only the files
+    that have been modified are filtered again. Files that were deleted
+    from srcpath are also deleted in destpath if they are still present.
+    The function returns the number of processed *.py files.
+    """
+    global namespace
+    count=0
+    l=os.listdir(srcpath)
+    if "__init__.py" in l:
+       if namespace:
+         namespace=namespace+"::"+os.path.split(srcpath)[1]
+       else:
+         namespace=os.path.split(srcpath)[1]
+       print "It's a package:",namespace
+    sp = os.path.join(srcpath,"*")
+    sfiles = glob.glob(sp)
+    dp = os.path.join(destpath,"*")
+    dfiles = glob.glob(dp)
+    leftovers={}
+    for df in dfiles:
+        leftovers[os.path.basename(df)]=1
+
+    for srcfile in sfiles:
+        basename = os.path.basename(srcfile)
+        if basename in leftovers:
+            del leftovers[basename]
+
+        # Is it a subdirectory?
+        if os.path.isdir(srcfile):
+            package=namespace
+            sdir = os.path.join(srcpath,basename)
+            ddir = os.path.join(destpath,basename)
+            count+=convert(sdir, ddir)
+            namespace=package
+            continue
+        # Check the extension (only *.py will be converted)
+        root, ext = os.path.splitext(srcfile)
+        if ext.lower()!=".py":
+            continue
+
+        destfile = os.path.join(destpath,basename)
+        if destfile==srcfile:
+            print "WARNING: Input and output names are identical!"
+            sys.exit(1)
+
+        count+=1
+#        sys.stdout.write("%s\015"%(srcfile))
+
+        if isNewer(srcfile, destfile):
+            preparePath(os.path.dirname(destfile))
+            out=open(destfile,"w")
+            filterFile(srcfile, out)
+            out.close()
+#            os.system("python %s -f %s>%s"%(sys.argv[0],srcfile,destfile))
+
+    # Delete obsolete files in destpath
+    for df in leftovers:
+        dname=os.path.join(destpath,df)
+        if os.path.isdir(dname):
+            try:
+                shutil.rmtree(dname)
+            except:
+                print "Can't remove obsolete directory '%s'"%dname
+        else:
+            try:
+                os.remove(dname)
+            except:
+                print "Can't remove obsolete file '%s'"%dname
+
+    return count
+
+
+######################################################################
+######################################################################
+######################################################################
+
+filter_file = False
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:], "hf", ["help"])
+except getopt.GetoptError,e:
+    print e
+    sys.exit(1)
+
+for o,a in opts:
+    if o=="-f":
+        filter_file = True
+
+if filter_file:
+    # Filter the specified file and print the result to stdout
+    filename = string.join(args)
+    filterFile(filename)
+else:
+
+    if len(args)!=2:
+        sys.stderr.write("%s options input output\n"%(os.path.basename(sys.argv[0])))
+        sys.exit(1)
+
+    # Filter an entire Python source tree
+    print '"%s" -> "%s"\n'%(args[0],args[1])
+    c=convert(args[0],args[1])
+    print "%d files"%(c)
diff --git a/doc/txt2html.sh b/doc/txt2html.sh
new file mode 100755 (executable)
index 0000000..cfaff46
--- /dev/null
@@ -0,0 +1,54 @@
+#  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
+#
+#  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+#  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+#  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+#/bin/sh
+# ===================================================================
+# This shell script is provided for generating the html files
+# from the txt files (restructured text) in the source directory.
+# Usage: just execute the script where it stands in the source
+# directory. The file list has to be updated manually when adding
+# a new restructured text file.
+# Note that the building process executes a target rstdoc that
+# generates the html documentation without need of this script.
+# The autoconficuration (check_htmlgen.m4) set the correct generator
+# rst2html by replacing the @RST2HTML@ tag.
+# ===================================================================
+# (CSSI - gboulant - 25/10/05)
+# This must be updated manually in this script (for source usage only)
+#
+RST2HTML=rst2html
+
+FILELIST="index
+         UnitTests
+         SALOME_Application
+         INSTALL
+         kernel_resources
+         userguide"
+
+STYLESHEET=rst.css
+RSTOPTS="--output-encoding=latin1 --stylesheet=$STYLESHEET"
+
+for file in $FILELIST; do
+    bfn=`basename $file .txt`
+    echo "Generating ${bfn}.html from ${bfn}.txt ..."
+    $RST2HTML $RSTOPTS ${bfn}.txt ${bfn}.html
+done
+
index cbe349e271c9a7115260947ff2596f76088caea9..ca20b44a28cd40bf86db14f68ab0611efb3ac219 100644 (file)
@@ -325,9 +325,9 @@ module Engines {
     */  
     void disconnect(in connectionId id,
                    in Engines::DSC::Message message) raises(Engines::ConnectionManager::BadId,
-                                                 Engines::DSC::PortNotDefined,
-                                                 Engines::DSC::PortNotConnected,
-                                                                                          Engines::DSC::BadPortReference);
+                                                            Engines::DSC::PortNotDefined,
+                                                            Engines::DSC::PortNotConnected,
+                                                            Engines::DSC::BadPortReference);
 
     //!  Shutdown the ConnectionManager process.
     oneway void ShutdownWithExit();
@@ -356,30 +356,6 @@ module Engines {
      */
     boolean init_service(in string service_name);
   };
-
-/*--------------------------------------------------------------------------------------------*/
-
-  /*! \brief Interface of a Parallel_DSC component.
-    This interface defines the operations needed to add a paco++ port 
-    into a parallel DSC component.
-  */
-  interface Parallel_DSC : Engines::Superv_Component, Engines::Parallel_Component {
-
-    /*!
-      This operation gives the proxy node of a paco++ port to all the nodes.
-      Only a node of the parallel component is going to add a proxy object 
-      with an internal method.
-
-      \param ref provides proxy port's reference.
-      \param provides_port_name provides port's name.
-
-      \see Engines_ParallelDSC_i::add_parallel_provides_proxy_port
-     */
-    void set_paco_proxy(in Object ref, 
-                       in string provides_port_name,
-                       in Ports::PortProperties port_prop);
-                       
-  };  
 };
 
 #endif
index bf519ac38b80609277f5260dc5f8904c3446b39e..0f3ec937fbe2b8f20323413d8813dbdf31918881 100644 (file)
 //  File   : DSC_Engines.xml
 //  Author : Andre RIBES, EDF
 -->
-<GridCCM_Interface_description
-      xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
-      xsi:noNamespaceSchemaLocation='$PACOPATH/IDL2Tool/interface.xsd'
->
-
+<PaCO_Interface_description>
 <Module>
  <Name>Engines</Name>
  <Interface>
    <Type>distributed</Type>
  </Method>
  </Interface>
- <Interface>
-   <Name>Parallel_DSC</Name>
-   <Method>
-     <Name>set_paco_proxy</Name>
-     <Type>distributed</Type>
-   </Method>
- </Interface>
  <Interface>
    <Name>Superv_Component</Name>
    <Method>
@@ -57,4 +46,4 @@
    </Method>
  </Interface>
 </Module>
-</GridCCM_Interface_description>
+</PaCO_Interface_description>
index 4efc97a8db0d6c1b28c5175cf6d9bdff0833469d..6da3cef76d70b9d4598964dce69c880d93e18752 100644 (file)
 #
 include $(top_srcdir)/salome_adm/unix/make_common_starter.am
 
-if WITH_PACO_PARALLEL
-MAKEFLAGS = -j1
-endif
-
 AM_CXXFLAGS = -fPIC
 
 BASEIDL_FILES = \
@@ -51,7 +47,9 @@ BASEIDL_FILES = \
   DSC_Engines.idl \
   SALOME_Ports.idl \
   Calcium_Ports.idl \
-  Palm_Ports.idl
+  Palm_Ports.idl \
+  SALOME_PACOExtension.idl \
+  SALOME_ParamPorts.idl
 
 MPIIDL_FILES = \
   SALOME_MPIObject.idl \
@@ -69,7 +67,8 @@ OTHER_IDL_FILES = \
 
 # all the idl files are needed for make dist
 EXTRA_DIST= $(BASEIDL_FILES) $(MPIIDL_FILES) $(OTHER_IDL_FILES) \
-           SALOME_Exception.xml SALOME_Component.xml DSC_Engines.xml SALOME_Ports.xml
+           SALOME_Component.xml DSC_Engines.xml SALOME_Ports.xml \
+           SALOME_PACOExtension.xml SALOME_ParamPorts.xml
 
 # This variable defines the files to be installed
 salomeidl_DATA = $(IDL_FILES)
@@ -97,7 +96,9 @@ BASEIDL_SOURCES =\
   DSC_EnginesSK.cc \
   SALOME_PortsSK.cc \
   Calcium_PortsSK.cc \
-  Palm_PortsSK.cc
+  Palm_PortsSK.cc \
+  SALOME_PACOExtensionSK.cc \
+  SALOME_ParamPortsSK.cc
 
 DYNIDL_SRCS = \
   SALOME_PortsDynSK.cc  Calcium_PortsDynSK.cc     SALOME_ContainerManagerDynSK.cc \
@@ -105,7 +106,7 @@ DYNIDL_SRCS = \
   SALOMEDSDynSK.cc      SALOME_SessionDynSK.cc    SALOME_RessourcesCatalogDynSK.cc \
   DSC_EnginesDynSK.cc   SALOME_ComponentDynSK.cc  SALOME_GenericObjDynSK.cc \
   Palm_PortsDynSK.cc    SALOME_ExceptionDynSK.cc  SALOMEDS_AttributesDynSK.cc \
-  LoggerDynSK.cc
+  LoggerDynSK.cc        SALOME_PACOExtensionDynSK.cc SALOME_ParamPortsDynSK.cc
 
 MPIIDL_SOURCES = \
   SALOME_MPIObjectSK.cc \
@@ -129,78 +130,98 @@ $(DYNIDL_SRCS) : $(IDL_SOURCES)
 salomeinclude_DATA= $(STATIDL_SOURCES:%SK.cc=%.hh)
 
 if WITH_PACO_PARALLEL
-PAR = SALOME_ExceptionPaCO.h SALOME_ExceptionPaCO.cc \
-      SALOME_ComponentPaCO.h SALOME_ComponentPaCO.cc \
-      SALOME_PortsPaCO.h SALOME_PortsPaCO.cc \
-      DSC_EnginesPaCO.h DSC_EnginesPaCO.cc 
+PAR = SALOME_ComponentPaCO.hxx SALOME_ComponentPaCO.cxx \
+      SALOME_PortsPaCO.hxx SALOME_PortsPaCO.cxx \
+      DSC_EnginesPaCO.hxx DSC_EnginesPaCO.cxx \
+      SALOME_PACOExtensionPaCO.hxx SALOME_PACOExtensionPaCO.cxx \
+      SALOME_ParamPortsPaCO.hxx SALOME_ParamPortsPaCO.cxx
+
+PAR_INCLUDES = SALOME_Exception.hxx SALOME_GenericObj.hxx SALOMEDS.hxx
 
 PAR_LIB = libSalomeParallelIDLKernel.la
 
-IDL_PACO      = SALOME_ExceptionPaCO.idl SALOME_ComponentPaCO.idl SALOME_PortsPaCO.idl DSC_EnginesPaCO.idl
-
-GEN_PACO = SALOME_ComponentPaCO_Engines_Container_server.cc \
-          SALOME_ComponentPaCO_Engines_Container_client.cc \
-          SALOME_ComponentPaCO_Engines_Component_server.cc \
-          SALOME_ComponentPaCO_Engines_Component_client.cc \
-          SALOME_ComponentPaCO_Engines_Parallel_Component_server.cc \
-          SALOME_ComponentPaCO_Engines_Parallel_Component_client.cc \
-          SALOME_ComponentPaCO_Engines_fileTransfer_server.cc \
-          SALOME_ComponentPaCO_Engines_fileTransfer_client.cc \
-          SALOME_ComponentPaCO_Engines_Salome_file_server.cc \
-          SALOME_ComponentPaCO_Engines_Salome_file_client.cc \
-          SALOME_ComponentPaCO_Engines_Parallel_Salome_file_server.cc \
-          SALOME_ComponentPaCO_Engines_Parallel_Salome_file_client.cc \
-          SALOME_PortsPaCO_Ports_Port_server.cc \
-          SALOME_PortsPaCO_Ports_Port_client.cc \
-          DSC_EnginesPaCO_Engines_DSC_server.cc \
-          DSC_EnginesPaCO_Engines_DSC_client.cc \
-          DSC_EnginesPaCO_Engines_Superv_Component_server.cc \
-          DSC_EnginesPaCO_Engines_Superv_Component_client.cc \
-          DSC_EnginesPaCO_Engines_Parallel_DSC_server.cc \
-          DSC_EnginesPaCO_Engines_Parallel_DSC_client.cc
-
-INCLUDES_PACO = SALOME_ComponentPaCO_Engines_Container_server.h \
-               SALOME_ComponentPaCO_Engines_Container_client.h \
-                SALOME_ComponentPaCO_Engines_Component_server.h \
-               SALOME_ComponentPaCO_Engines_Component_client.h \
-                SALOME_ComponentPaCO_Engines_Parallel_Component_server.h \
-               SALOME_ComponentPaCO_Engines_Parallel_Component_client.h \
-               SALOME_ComponentPaCO_Engines_fileTransfer_server.h \
-               SALOME_ComponentPaCO_Engines_fileTransfer_client.h \
-               SALOME_ComponentPaCO_Engines_Salome_file_server.h \
-               SALOME_ComponentPaCO_Engines_Salome_file_client.h \
-               SALOME_ComponentPaCO_Engines_Parallel_Salome_file_server.h \
-               SALOME_ComponentPaCO_Engines_Parallel_Salome_file_client.h \
-               SALOME_ExceptionPaCO.h \
-               SALOME_ComponentPaCO.h \
-               SALOME_Exception.h \
-               SALOME_Component.h \
-               SALOME_PortsPaCO_Ports_Port_server.h \
-               SALOME_PortsPaCO_Ports_Port_client.h \
-               SALOME_PortsPaCO.h \
-               SALOME_Ports.h \
-               DSC_EnginesPaCO_Engines_DSC_server.h \
-               DSC_EnginesPaCO_Engines_DSC_client.h \
-                DSC_EnginesPaCO_Engines_Superv_Component_server.h \
-               DSC_EnginesPaCO_Engines_Superv_Component_client.h \
-               DSC_EnginesPaCO_Engines_Parallel_DSC_server.h \
-               DSC_EnginesPaCO_Engines_Parallel_DSC_client.h \
-               DSC_EnginesPaCO.h \
-               DSC_Engines.h
-
-XML           = SALOME_Exception.xml SALOME_Component.xml DSC_Engines.xml SALOME_Ports.xml
+IDL_PACO = SALOME_ComponentPaCO.idl SALOME_PortsPaCO.idl DSC_EnginesPaCO.idl \
+          SALOME_ParamPortsPaCO.idl SALOME_PACOExtensionPaCO.idl
+
+GEN_PACO = SALOME_ComponentPaCO_Engines_Container_server.cxx \
+          SALOME_ComponentPaCO_Engines_Container_client.cxx \
+          SALOME_ComponentPaCO_Engines_Component_server.cxx \
+          SALOME_ComponentPaCO_Engines_Component_client.cxx \
+          SALOME_ComponentPaCO_Engines_fileTransfer_server.cxx \
+          SALOME_ComponentPaCO_Engines_fileTransfer_client.cxx \
+          SALOME_ComponentPaCO_Engines_Salome_file_server.cxx \
+          SALOME_ComponentPaCO_Engines_Salome_file_client.cxx \
+          SALOME_PortsPaCO_Ports_Port_server.cxx \
+          SALOME_PortsPaCO_Ports_Port_client.cxx \
+          SALOME_PortsPaCO_Ports_Data_Port_server.cxx \
+          SALOME_PortsPaCO_Ports_Data_Port_client.cxx \
+          DSC_EnginesPaCO_Engines_DSC_server.cxx \
+          DSC_EnginesPaCO_Engines_DSC_client.cxx \
+          DSC_EnginesPaCO_Engines_Superv_Component_server.cxx \
+          DSC_EnginesPaCO_Engines_Superv_Component_client.cxx \
+          SALOME_PACOExtensionPaCO_Engines_Parallel_Component_server.cxx \
+          SALOME_PACOExtensionPaCO_Engines_Parallel_Component_client.cxx \
+          SALOME_PACOExtensionPaCO_Engines_PACO_Container_server.cxx \
+          SALOME_PACOExtensionPaCO_Engines_PACO_Container_client.cxx \
+          SALOME_PACOExtensionPaCO_Engines_Parallel_Salome_file_server.cxx \
+          SALOME_PACOExtensionPaCO_Engines_Parallel_Salome_file_client.cxx \
+          SALOME_PACOExtensionPaCO_Engines_Parallel_DSC_server.cxx \
+          SALOME_PACOExtensionPaCO_Engines_Parallel_DSC_client.cxx \
+          SALOME_ParamPortsPaCO_Ports_Param_Double_Port_server.cxx \
+          SALOME_ParamPortsPaCO_Ports_Param_Double_Port_client.cxx
+
+INCLUDES_PACO = SALOME_ComponentPaCO_Engines_Container_server.hxx \
+               SALOME_ComponentPaCO_Engines_Container_client.hxx \
+               SALOME_ComponentPaCO_Engines_Component_server.hxx \
+               SALOME_ComponentPaCO_Engines_Component_client.hxx \
+               SALOME_ComponentPaCO_Engines_fileTransfer_server.hxx \
+               SALOME_ComponentPaCO_Engines_fileTransfer_client.hxx \
+               SALOME_ComponentPaCO_Engines_Salome_file_server.hxx \
+               SALOME_ComponentPaCO_Engines_Salome_file_client.hxx \
+               SALOME_ComponentPaCO.hxx \
+               SALOME_Component.hxx \
+               SALOME_PortsPaCO_Ports_Port_server.hxx \
+               SALOME_PortsPaCO_Ports_Port_client.hxx \
+               SALOME_PortsPaCO_Ports_Data_Port_server.hxx \
+               SALOME_PortsPaCO_Ports_Data_Port_client.hxx \
+               SALOME_PortsPaCO.hxx \
+               SALOME_Ports.hxx \
+               DSC_EnginesPaCO_Engines_DSC_server.hxx \
+               DSC_EnginesPaCO_Engines_DSC_client.hxx \
+               DSC_EnginesPaCO_Engines_Superv_Component_server.hxx \
+               DSC_EnginesPaCO_Engines_Superv_Component_client.hxx \
+               DSC_EnginesPaCO.hxx \
+               DSC_Engines.hxx \
+               SALOME_PACOExtensionPaCO_Engines_Parallel_Component_server.hxx \
+               SALOME_PACOExtensionPaCO_Engines_Parallel_Component_client.hxx \
+               SALOME_PACOExtensionPaCO_Engines_PACO_Container_server.hxx \
+               SALOME_PACOExtensionPaCO_Engines_PACO_Container_client.hxx \
+               SALOME_PACOExtensionPaCO_Engines_Parallel_Salome_file_server.hxx \
+               SALOME_PACOExtensionPaCO_Engines_Parallel_Salome_file_client.hxx \
+               SALOME_PACOExtensionPaCO_Engines_Parallel_DSC_server.hxx \
+               SALOME_PACOExtensionPaCO_Engines_Parallel_DSC_client.hxx \
+               SALOME_PACOExtensionPaCO.hxx \
+               SALOME_PACOExtension.hxx \
+               SALOME_ParamPortsPaCO_Ports_Param_Double_Port_server.hxx \
+               SALOME_ParamPortsPaCO_Ports_Param_Double_Port_client.hxx \
+               SALOME_ParamPortsPaCO.hxx \
+               SALOME_ParamPorts.hxx
+
+XML           = SALOME_Component.xml DSC_Engines.xml SALOME_Ports.xml \
+               SALOME_PACOExtension.xml SALOME_ParamPorts.xml
 endif
 
 idldir = $(prefix)/idl/salome
 nodist_idl_DATA = ${XML} ${IDL_PACO} 
-nodist_salomeinclude_HEADERS = ${INCLUDES_PACO} 
+nodist_salomeinclude_HEADERS = ${INCLUDES_PACO}
 
-BUILT_SOURCES = $(IDL_SOURCES) $(PAR)
+BUILT_SOURCES = $(IDL_SOURCES) $(PAR) $(PAR_INCLUDES)
 
-SALOME_ExceptionPaCO.h SALOME_ExceptionPaCO.cc : SALOME_Exception.idl SALOME_Exception.xml
-SALOME_ComponentPaCO.h SALOME_ComponentPaCO.cc : SALOME_Component.idl SALOME_Component.xml
-SALOME_PortsPaCO.h SALOME_PortsPaCO.cc : SALOME_Ports.idl SALOME_Ports.xml
-DSC_EnginesPaCO.h DSC_EnginesPaCO.cc : DSC_Engines.idl DSC_Engines.xml
+SALOME_ComponentPaCO.idl SALOME_ComponentPaCO.hxx SALOME_ComponentPaCO.cxx : SALOME_Component.idl SALOME_Component.xml
+SALOME_PortsPaCO.idl SALOME_PortsPaCO.hxx SALOME_PortsPaCO.cxx : SALOME_Ports.idl SALOME_Ports.xml
+DSC_EnginesPaCO.idl DSC_EnginesPaCO.hxx DSC_EnginesPaCO.cxx : DSC_Engines.idl DSC_Engines.xml
+SALOME_PACOExtensionPaCO.idl SALOME_PACOExtensionPaCO.hxx SALOME_PACOExtensionPaCO.cxx : SALOME_PACOExtension.idl SALOME_PACOExtension.xml
+SALOME_ParamPortsPaCO.idl SALOME_ParamPortsPaCO.hxx SALOME_ParamPortsPaCO.cxx : SALOME_ParamPorts.idl SALOME_ParamPorts.xml
 
 lib_LTLIBRARIES = libSalomeIDLKernel.la $(PAR_LIB)
 
@@ -236,14 +257,25 @@ SK.cc.hh:
 #.idl.hh:
 #      $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $<
 
-%PaCO.h %PaCO.cc : %.idl %.xml
-       @PACO_IDL@ -I $(srcdir):@PACOPATH@/idl $^ omniORB4 0
+if WITH_PACO_PARALLEL
+
+%PaCO.idl %PaCO.hxx %PaCO.cxx : %.idl %.xml
+       $(OMNIORB_IDL) -p@PACOPATH@/lib/python -bpaco -Wb$(top_srcdir)/idl/$*.xml,$(srcdir):@PACOPATH@/idl $(top_srcdir)/idl/$*.idl
+
+%.hxx: %.idl
+       $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) -Wbh=.hxx -Wbs=.cxx $<
+endif
 
 install-exec-local: $(IDL_FILES:%=$(top_srcdir)/idl/%)
        $(INSTALL) -d  $(DESTDIR)$(salomepythondir)
        ls $^ | while read file; do \
          $(OMNIORB_IDL) $(IDLPYFLAGS) -C$(DESTDIR)$(salomepythondir) $$file ; \
        done
+if WITH_PACO_PARALLEL
+       ls $(top_builddir)/idl/*.idl | while read file; do \
+         $(OMNIORB_IDL) $(IDLPYFLAGS) -I$(top_srcdir)/idl -I@PACOPATH@/idl -C$(DESTDIR)$(salomepythondir) $$file ; \
+       done
+endif
 
 # uninstall-local removes too much, but it works in distcheck
 uninstall-local:
@@ -268,5 +300,5 @@ mostlyclean-local:
 
 -include .depidl
 
-CLEANFILES = *PaCO* *.h
+CLEANFILES = *PaCO* *.hxx *.cxx
 
index 616cda33cce5af6d952ad50312d65a29333073c7..db817c063dcec465700820fe481314e6d5a1ee47 100644 (file)
@@ -414,10 +414,6 @@ module Engines
     string getObjectInfo(in long studyId, in string entry);
   } ;
 
-  interface Parallel_Component : Engines::Component {
-    void send_parallel_proxy_object(in Object proxy_ref);
-  };
-
   //!  A block of binary data used for file transfer. The maximum size of the block is defined on server side.
   typedef sequence<octet> fileBlock;
 
@@ -672,50 +668,6 @@ module Engines
 
     string getRef(in string machine);
   };
-
-  /*! \brief Interface of a Parallel_Salome_file
-    This interface is used by parallel components and containers.
-    It adds methods to enable to choose on which node of the parallel component the file has to 
-    be received.
-  */
-  interface Parallel_Salome_file : Engines::Salome_file {
-
-    /*!
-      Set a number of node for the file. Default is the node 0.
-
-      \param file_name name of the file.
-      \param node_nbr node number where the file is.
-
-      \exception raised if the file doesn't exist.
-    */
-    void setFileNode(in string file_name, in long node_nbr) raises (SALOME::SALOME_Exception);
-
-    /*!
-      Get the number of the node that actually managed the file.
-
-      \param file_name name of managed file.
-
-      \return node number of the file
-
-      \exception raised if the file doesn't exist.
-     */
-    long getFileNode(in string file_name) raises (SALOME::SALOME_Exception);
-
-    /*!
-      This method update the state of file for the Parallel_Salome_file. 
-
-      \param new_file the new state of file.
-     */
-    Engines::Container updateFile(in Engines::file new_file);
-
-    /*!
-      This method is used by the parallel implementation of recvFiles.
-
-      \exception raised if the file cannot be ok.
-     */
-    void recvFiles_node() raises (SALOME::SALOME_Exception);
-
-  };
 };
 
 #endif
index 7d27962ca9669ecf50d14303573db830d61b483c..2c3ee263bf44837b04dda63d107a6b6dd89b309d 100644 (file)
 //  File   : SALOME_Component.xml
 //  Author : Andre RIBES, EDF
 -->
-<GridCCM_Interface_description
-      xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
-      xsi:noNamespaceSchemaLocation='$PACOPATH/IDL2Tool/interface.xsd'
->
-
+<PaCO_Interface_description>
 <Module>
  <Name>Engines</Name>
  <Interface>
    <Name>ping</Name>
    <Type>distributed</Type>
   </Method>
+ </Interface>
+ <Interface>
+  <Name>Component</Name>
   <Method>
-   <Name>create_component_instance</Name>
+   <Name>ping</Name>
    <Type>distributed</Type>
   </Method>
   <Method>
-   <Name>load_component_Library</Name>
+   <Name>destroy</Name>
    <Type>distributed</Type>
   </Method>
- </Interface>
- <Interface>
-  <Name>Component</Name>
   <Method>
    <Name>setInputFileToService</Name>
    <Type>distributed</Type>
   </Method>
  </Interface>
  <Interface>
-  <Name>Parallel_Component</Name>
-  <Method>
-   <Name>send_parallel_proxy_object</Name>
-   <Type>distributed</Type>
-  </Method>
+  <Name>fileTransfer</Name>
  </Interface>
  <Interface>
   <Name>Salome_file</Name>
  </Interface>
- <Interface>
-  <Name>Parallel_Salome_file</Name>
- </Interface>
 </Module>
-</GridCCM_Interface_description>
+</PaCO_Interface_description>
index 184f341dae2f724819aac1ed1ba64b634908f999..16ffacd19b2c856c86d547c5f37d40486bda76d2 100644 (file)
@@ -167,7 +167,7 @@ struct BatchParameters
 
       \return Container's CORBA reference.
     */
-    Container FindOrStartParallelContainer( in MachineParameters params);
+    Container StartParallelContainer( in MachineParameters params);
 
     //!  Start a new container satisfying the constraints given by input parameters.
     Container StartContainer( in MachineParameters params);
diff --git a/idl/SALOME_PACOExtension.idl b/idl/SALOME_PACOExtension.idl
new file mode 100644 (file)
index 0000000..f75da0c
--- /dev/null
@@ -0,0 +1,120 @@
+//  Copyright (C) 2007-2009  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : SALOME_PACOExtension.idl
+//  Author : André RIBES, EDF
+//  $Header: 
+//
+#ifndef _SALOME_PACOExtension_IDL_
+#define _SALOME_PACOExtension_IDL_
+
+/*! \file SALOME_PACOExtension.idl 
+    \brief Interfaces for Parallel Component and Container using PaCO++
+*/
+
+#include "SALOME_Component.idl"
+#include "DSC_Engines.idl"
+
+module Engines
+{
+  interface Parallel_Component : Engines::Component {
+    void send_parallel_proxy_object(in Object proxy_ref);
+  };
+
+  interface PACO_Container : Engines::Container {
+    // Replicated Method used by the proxy to create
+    // a PACO Component
+    void create_paco_component_node_instance(in string registeredName,
+                                            in string proxy_containerName,
+                                            in long studyId) raises(SALOME::SALOME_Exception);
+
+    void updateInstanceNumber();
+  };
+
+/*--------------------------------------------------------------------------------------------*/
+
+  /*! \brief Interface of a Parallel_DSC component.
+    This interface defines the operations needed to add a paco++ port 
+    into a parallel DSC component.
+  */
+  interface Parallel_DSC : Engines::Superv_Component, Engines::Parallel_Component {
+
+    /*!
+      This operation gives the proxy node of a paco++ port to all the nodes.
+      Only a node of the parallel component is going to add a proxy object 
+      with an internal method.
+
+      \param ref provides proxy port's reference.
+      \param provides_port_name provides port's name.
+
+      \see Engines_ParallelDSC_i::add_parallel_provides_proxy_port
+     */
+    void set_paco_proxy(in Object ref, 
+                       in string provides_port_name,
+                       in Ports::PortProperties port_prop);
+                       
+  };  
+
+  /*! \brief Interface of a Parallel_Salome_file
+    This interface is used by parallel components and containers.
+    It adds methods to enable to choose on which node of the parallel component the file has to 
+    be received.
+  */
+  interface Parallel_Salome_file : Engines::Salome_file {
+
+    /*!
+      Set a number of node for the file. Default is the node 0.
+
+      \param file_name name of the file.
+      \param node_nbr node number where the file is.
+
+      \exception raised if the file doesn't exist.
+    */
+    void setFileNode(in string file_name, in long node_nbr) raises (SALOME::SALOME_Exception);
+
+    /*!
+      Get the number of the node that actually managed the file.
+
+      \param file_name name of managed file.
+
+      \return node number of the file
+
+      \exception raised if the file doesn't exist.
+     */
+    long getFileNode(in string file_name) raises (SALOME::SALOME_Exception);
+
+    /*!
+      This method update the state of file for the Parallel_Salome_file. 
+
+      \param new_file the new state of file.
+     */
+    Engines::Container updateFile(in Engines::file new_file);
+
+    /*!
+      This method is used by the parallel implementation of recvFiles.
+
+      \exception raised if the file cannot be ok.
+     */
+    void recvFiles_node() raises (SALOME::SALOME_Exception);
+  };
+};
+
+#endif
diff --git a/idl/SALOME_PACOExtension.xml b/idl/SALOME_PACOExtension.xml
new file mode 100644 (file)
index 0000000..c642410
--- /dev/null
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<!--
+//  Copyright (C) 2007-2009  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : SALOME_PACOExtension.xml
+//  Author : Andre RIBES, EDF
+-->
+<PaCO_Interface_description>
+<Module>
+ <Name>Engines</Name>
+ <Interface>
+  <Name>Parallel_Component</Name>
+  <Method>
+   <Name>send_parallel_proxy_object</Name>
+   <Type>distributed</Type>
+  </Method>
+ </Interface>
+ <Interface>
+  <Name>PACO_Container</Name>
+   <Method>
+     <Name>updateInstanceNumber</Name>
+     <Type>distributed</Type>
+   </Method>
+ </Interface>
+ <Interface>
+   <Name>Parallel_DSC</Name>
+   <Method>
+     <Name>set_paco_proxy</Name>
+     <Type>distributed</Type>
+   </Method>
+ </Interface>
+ <Interface>
+  <Name>Parallel_Salome_file</Name>
+ </Interface>
+</Module>
+</PaCO_Interface_description>
+
diff --git a/idl/SALOME_ParamPorts.idl b/idl/SALOME_ParamPorts.idl
new file mode 100644 (file)
index 0000000..9ef4e65
--- /dev/null
@@ -0,0 +1,43 @@
+//  Copyright (C) 2007-2009  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : SALOME_ParamPorts.idl
+//  Author : Andre RIBES, EDF
+
+#ifndef _SALOME_ParamPorts_IDL_
+#define _SALOME_ParamPorts_IDL_
+
+#include "SALOME_Ports.idl"
+
+module Ports 
+{
+  /*!  \brief Interface of a port for parametric application
+       This interface defines a Data_Port that sends a vector of
+       double that are distributed along the different processor
+       and returns a vector of double for the results
+  */
+  interface Param_Double_Port : Ports::Data_Port {
+    typedef sequence<double>  seq_double;
+    void put(in Ports::Param_Double_Port::seq_double param_data);
+    void get_results(out Ports::Param_Double_Port::seq_double param_results);
+  };
+};
+#endif
diff --git a/idl/SALOME_ParamPorts.xml b/idl/SALOME_ParamPorts.xml
new file mode 100644 (file)
index 0000000..e6d8a3f
--- /dev/null
@@ -0,0 +1,55 @@
+<?xml version="1.0"?>
+<!--
+//  Copyright (C) 2007-2009  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : SALOME_ParamPorts.xml
+//  Author : Andre RIBES, EDF
+-->
+<PaCO_Interface_description>
+<Module>
+ <Name>Ports</Name>
+ <Interface>
+  <Name>Param_Double_Port</Name>
+  <Method>
+   <Name>put</Name>
+   <Type>distributed</Type>
+   <Argument>
+    <Name>param_data</Name>
+    <TypeDis>
+     <Distributed>BasicBC</Distributed>
+    </TypeDis>
+   </Argument>
+  </Method>
+  <Method>
+   <Name>get_results</Name>
+   <Type>distributed</Type>
+   <Argument>
+    <Name>param_results</Name>
+    <TypeDis>
+     <Distributed>GaBro</Distributed>
+    </TypeDis>
+   </Argument>
+  </Method>
+ </Interface>
+</Module>
+</PaCO_Interface_description>
+
index 844052a38fd81ab7a24279bab645018bee4fcbd6..2f6b5b3abf772cc11797222ee9db306d3f070f71 100644 (file)
@@ -21,8 +21,7 @@
 //
 //  File   : SALOME_Ports.idl
 //  Author : Andre RIBES, EDF
-//  $Header:
-//
+
 #ifndef _SALOME_PORTS_IDL_
 #define _SALOME_PORTS_IDL_
 
index 1e5d82f3023bfff92a07309cc0a97444c07f6f22..158637132b317cd3077463d71ce7d1723f3eaf02 100644 (file)
 //  File   : SALOME_Ports.xml
 //  Author : Andre RIBES, EDF
 -->
-<GridCCM_Interface_description
-      xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
-      xsi:noNamespaceSchemaLocation='$PACOPATH/IDL2Tool/interface.xsd'
->
-
+<PaCO_Interface_description>
 <Module>
  <Name>Ports</Name>
  <Interface>
@@ -37,5 +33,8 @@
  <Interface>
   <Name>Control_Port</Name>
  </Interface>
+ <Interface>
+  <Name>Data_Port</Name>
+ </Interface>
 </Module>
-</GridCCM_Interface_description>
+</PaCO_Interface_description>
index 2a475bfc0f34ffbd02d48e848dcccb9af57e9657..917418b5259f3c5e0000730c7123011f22d3ebba 100644 (file)
@@ -30,6 +30,7 @@
   <objref name="CALCIUM_logical" id="IDL:Ports/Calcium_Ports/Calcium_Logical_Port:1.0"/>
   <objref name="CALCIUM_boolean" id="IDL:Ports/Calcium_Ports/Calcium_Logical_Port:1.0"/>
   <objref name="CALCIUM_complex" id="IDL:Ports/Calcium_Ports/Calcium_Complex_Port:1.0"/>
+  <objref name="Param_Double_Port" id="IDL:Ports/Param_Double_Port:1.0"/>
   <objref name="BASIC_short" id="IDL:Ports/Data_Short_Port:1.0"/>
   <objref name="Study" id="IDL:SALOMEDS/Study:1.0"/>
   <objref name="SObject" id="IDL:SALOMEDS/SObject:1.0"/>
index 581560ef74850ffbbb9e4aa989bd9247cba153ff..d46eb032aae0adb688e54e4a74823ea24c340f24 100644 (file)
@@ -102,26 +102,28 @@ IF(BOOST_STATUS)
 ENDIF(BOOST_STATUS)
 
 IF(BOOST_STATUS)
+  SET(BOOST_LIBS)
   IF(WINDOWS)
     IF(CMAKE_BUILD_TYPE STREQUAL Debug)
       SET(EXTENSION -gd)
     ELSE(CMAKE_BUILD_TYPE STREQUAL Debug)
       SET(EXTENSION)
     ENDIF(CMAKE_BUILD_TYPE STREQUAL Debug)
-    FIND_LIBRARY(BOOST_LIB_THREAD libboost_thread-vc90-mt${EXTENSION}-1_35 ${BOOST_LIB_PATHS})
-    FIND_LIBRARY(BOOST_LIB_DATE_TIME libboost_date_time-vc90-mt${EXTENSION}-1_35 ${BOOST_LIB_PATHS})
-    FIND_LIBRARY(BOOST_LIB_SIGNALS libboost_signals-vc90-mt${EXTENSION}-1_35 ${BOOST_LIB_PATHS})
-    FIND_LIBRARY(BOOST_LIB_FILESYSTEM libboost_filesystem-vc90-mt${EXTENSION}-1_35 ${BOOST_LIB_PATHS})
-    FIND_LIBRARY(BOOST_LIB_SYSTEM libboost_system-vc90-mt${EXTENSION}-1_35 ${BOOST_LIB_PATHS})
+    FOREACH(name thread date_time signals filesystem system)
+      SET(LIB_NAMES)
+      FOREACH(version 1_35 1_38)
+       SET(LIB_NAMES ${LIB_NAMES} libboost_${name}-vc90-mt${EXTENSION}-${version})
+      ENDFOREACH(version 1_35 1_38)
+      FIND_LIBRARY(BOOST_LIB_${name} NAMES ${LIB_NAMES} PATHS ${BOOST_LIB_PATHS})
+      IF(NOT BOOST_LIB_${name})
+       SET(BOOST_STATUS 0)
+      ENDIF(NOT BOOST_LIB_${name})
+      SET(BOOST_LIBS ${BOOST_LIBS} ${BOOST_LIB_${name}})
+    ENDFOREACH(name thread date_time signals filesystem system)
   ELSE(WINDOWS)
     FIND_LIBRARY(BOOST_LIB_THREAD boost_thread ${BOOST_LIB_PATHS})
+    SET(BOOST_LIBS ${BOOST_LIBS} ${BOOST_LIB_THREAD})
   ENDIF(WINDOWS)
-  SET(BOOST_LIBS)
-  SET(BOOST_LIBS ${BOOST_LIBS} ${BOOST_LIB_THREAD})
-  SET(BOOST_LIBS ${BOOST_LIBS} ${BOOST_LIB_DATE_TIME})
-  SET(BOOST_LIBS ${BOOST_LIBS} ${BOOST_LIB_SIGNALS})
-  SET(BOOST_LIBS ${BOOST_LIBS} ${BOOST_LIB_FILESYSTEM})
-  SET(BOOST_LIBS ${BOOST_LIBS} ${BOOST_LIB_SYSTEM})
 ENDIF(BOOST_STATUS)
 
 # ------
index a753fb63ad0c21d30811171e21cc9e9812cda730..dfc8242c3f441cd63ed1f2b4887eb93b0067515b 100644 (file)
@@ -63,6 +63,7 @@ IF(WINDOWS)
   SET(PLATFORM_CPPFLAGS ${PLATFORM_CPPFLAGS} -DWNT)
   SET(PLATFORM_CPPFLAGS ${PLATFORM_CPPFLAGS} -DPPRO_NT) # For medfile
   SET(PLATFORM_CPPFLAGS ${PLATFORM_CPPFLAGS} -D_USE_MATH_DEFINES) # At least for MEDMEM
+  SET(PLATFORM_CPPFLAGS ${PLATFORM_CPPFLAGS} -D_WIN32_WINNT=0x0500) # Windows 2000 or later API is required
   SET(PLATFORM_LIBADD ${PLATFORM_LIBADD} Ws2_32.lib)
   SET(PLATFORM_LIBADD ${PLATFORM_LIBADD} Userenv.lib) # At least for GEOM suit
 ELSE(WINDOWS)
@@ -71,7 +72,6 @@ ENDIF(WINDOWS)
 
 #  SET(PLATFORM_CPPFLAGS)
 #  #  #  SET(PLATFORM_CPPFLAGS ${PLATFORM_CPPFLAGS} -DWNT -D_CRT_SECURE_NO_WARNINGS)
-#  #  #  SET(PLATFORM_CPPFLAGS ${PLATFORM_CPPFLAGS} -D_WIN32_WINNT=0x0500)
 #  #  SET(RM del)
 #ELSE(WINDOWS)
 #  #  SET(RM /bin/rm)
index b0624ab0918a340083f03fb36f7be57fd0c1cf27..fde4aff607844a97e3f7df83f14fa649149d1828 100644 (file)
@@ -200,6 +200,11 @@ class CMakeFile(object):
             "XmlTObjPlugin",
             "XmlXCAFPlugin",
             ]
+        vtk_list = [
+            "vtkCommonPythonD",
+            "vtkGraphicsPythonD",
+            "vtkImagingPythonD",
+            ]
         kernel_list  = [
             "DF",
             "Launcher",
@@ -339,7 +344,8 @@ class CMakeFile(object):
             "StdMeshersGUI",
             "StdMeshers",
             ]
-        full_list = cas_list + kernel_list + gui_list
+        full_list  = cas_list + vtk_list
+        full_list += kernel_list + gui_list
         full_list += geom_list + med_list + smesh_list
         # --
         # E.A. : sort by len before substitution ...
@@ -1321,6 +1327,34 @@ class CMakeFile(object):
             IF(BEGIN_WITH_lib)
             INSTALL(TARGETS ${name} DESTINATION ${DEST})
             ''')
+            if self.module == "gui":
+                newlines.append(r'''
+                FOREACH(lib SalomePyQt)
+                IF(name STREQUAL lib)
+                IF(WINDOWS)
+                IF(CMAKE_BUILD_TYPE STREQUAL Release)
+                INSTALL(FILES ${CMAKE_INSTALL_PREFIX}/${DEST}/${name}.dll DESTINATION ${DEST} RENAME ${name}.pyd)
+                ELSE(CMAKE_BUILD_TYPE STREQUAL Release)
+                INSTALL(FILES ${CMAKE_INSTALL_PREFIX}/${DEST}/${name}.dll DESTINATION ${DEST} RENAME ${name}_d.pyd)
+                ENDIF(CMAKE_BUILD_TYPE STREQUAL Release)
+                ELSE(WINDOWS)
+                INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/lib${name}.so DESTINATION ${DEST} RENAME ${name}.so)
+                ENDIF(WINDOWS)
+                ENDIF(name STREQUAL lib)
+                ENDFOREACH(lib SalomePyQt)
+                FOREACH(lib SalomePy)
+                IF(name STREQUAL lib)
+                IF(WINDOWS)
+                IF(CMAKE_BUILD_TYPE STREQUAL Release)
+                INSTALL(FILES ${CMAKE_INSTALL_PREFIX}/${DEST}/${name}.dll DESTINATION ${DEST} RENAME lib${name}.pyd)
+                ELSE(CMAKE_BUILD_TYPE STREQUAL Release)
+                INSTALL(FILES ${CMAKE_INSTALL_PREFIX}/${DEST}/${name}.dll DESTINATION ${DEST} RENAME lib${name}_d.pyd)
+                ENDIF(CMAKE_BUILD_TYPE STREQUAL Release)
+                ENDIF(WINDOWS)
+                ENDIF(name STREQUAL lib)
+                ENDFOREACH(lib SalomePy)
+                ''')
+                pass
             if self.module == "geom":
                 newlines.append(r'''
                 IF(WINDOWS)
@@ -1336,11 +1370,6 @@ class CMakeFile(object):
                 ''')
                 pass
             newlines.append(r'''
-            # IF(name STREQUAL SalomePyQt)
-            # INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/lib${name}.so DESTINATION ${DEST} RENAME ${name}.so)
-            # ENDIF(name STREQUAL SalomePyQt)
-            ''')
-            newlines.append(r'''
             ELSE(BEGIN_WITH_lib)
             ''')
             newlines.append(r'''
@@ -1448,7 +1477,20 @@ class CMakeFile(object):
             ''')
         else:
             newlines.append(r'''
+            GET_FILENAME_COMPONENT(ext ${f} EXT)
+            IF(ext STREQUAL .py)
+            IF(DEST STREQUAL bin/salome)
+            SET(PERMS)
+            SET(PERMS ${PERMS} OWNER_READ OWNER_WRITE OWNER_EXECUTE)
+            SET(PERMS ${PERMS} GROUP_READ GROUP_EXECUTE)
+            SET(PERMS ${PERMS} WORLD_READ WORLD_EXECUTE)
+            INSTALL(FILES ${f} DESTINATION ${DEST} PERMISSIONS ${PERMS})
+            ELSE(DEST STREQUAL bin/salome)
+            INSTALL(FILES ${f} DESTINATION ${DEST})
+            ENDIF(DEST STREQUAL bin/salome)
+            ELSE(ext STREQUAL .py)
             INSTALL(FILES ${f} DESTINATION ${DEST})
+            ENDIF(ext STREQUAL .py)
             ''')
             pass
         newlines.append(r'''
index 691a6b765129d31914b0b8ceffa44f065db2dade..a954190d79ccb9fb536115f94010dbfc1df2029f 100644 (file)
@@ -33,7 +33,11 @@ if test "$WITHOPENMPI" = yes; then
   OPENMPI_HOME=$withval
 
   if test "$OPENMPI_HOME"; then
-    MPI_INCLUDES="-I${OPENMPI_HOME}/include"
+    if test -f "${OPENMPI_HOME}/include/mpi.h"; then
+      MPI_INCLUDES="-I${OPENMPI_HOME}/include"
+    else  
+      MPI_INCLUDES=`$OPENMPI_HOME/bin/mpicxx --showme:compile`
+    fi
     MPI_LIBS=`$OPENMPI_HOME/bin/mpicxx --showme:link`
   fi
 
@@ -50,7 +54,7 @@ if test "$WITHOPENMPI" = yes; then
   AC_MSG_CHECKING(for openmpi)
   if test "$WITHOPENMPI" = "yes";then
      mpi_ok=yes
-     CPPFLAGS="-DWITHOPENMPI $CPPFLAGS"
+     CPPFLAGS="-DOMPI_IGNORE_CXX_SEEK -DWITHOPENMPI $CPPFLAGS"
      AC_MSG_RESULT(yes)
   else
      mpi_ok=no
index 844bbf68c5beef4d1768436e75576e09ceb8bc11..6d4fab27ce4e45bab170c5717accb90bf8dba6f1 100644 (file)
@@ -34,14 +34,14 @@ if test "x$WITHPACO" = "xyes";
 then
   PACOPATH=$withval
   PACO_INCLUDES="-I${PACOPATH}/include"
-  PACO_LIBS="-L${PACOPATH}/lib -lPaCO"
+  PACO_LIBS="-L${PACOPATH}/lib -lPaCO -lGaBro -lBasicBC"
   dnl a basic test to be sure that PaCO++
   dnl is correctly installed.
-  AC_CHECK_PROG(PACO_IDL, PaCOIdlTool, yes, no, ${PACOPATH}/bin)
+  AC_CHECK_PROG(PACO_IDL, PaCOIdlTool.sh, yes, no, ${PACOPATH}/bin)
   if test "x$PACO_IDL" = "xno";
   then
     PaCO_ok=no
-    AC_MSG_RESULT(PaCO++ binary not in ${PACOPATH})
+    AC_MSG_RESULT(PaCO++ binary not in ${PACOPATH}/bin)
   fi
 else
   PaCO_ok=no
@@ -51,7 +51,7 @@ AC_MSG_CHECKING(for PaCO++)
 if  test "x$PaCO_ok" = "xyes"
 then
   AC_MSG_RESULT([yes])
-  PACO_IDL=${PACOPATH}/bin/PaCOIdlTool
+  PACO_IDL=${PACOPATH}/bin/PaCOIdlTool.sh
   AC_SUBST(PACO_IDL)
   AC_SUBST(PACOPATH)
   AC_SUBST(PACO_INCLUDES)
index 6664f951b7365dc12ebc1ba226ff70fd75e9527a..4113f28feae112419ee9785551897d7976ae550c 100644 (file)
@@ -81,3 +81,25 @@ fi
 
 # AC_DISABLE_DEBUG - set the default flag to --disable-debug
 AC_DEFUN([AC_DISABLE_DEBUG], [AC_ENABLE_DEBUG(no)])
+
+dnl AC_ENABLE_MPI_SEQ_CONTAINER
+dnl
+dnl This macro enables mpi into the sequential container
+dnl default = not enabled
+dnl
+AC_DEFUN([AC_ENABLE_MPI_SEQ_CONTAINER],
+    [define([AC_ENABLE_MPI_SEQ_CONTAINER_DEFAULT], ifelse($1, no, no, yes))dnl
+    AC_ARG_ENABLE([mpi-seq-container],
+       [AC_HELP_STRING([--enable-mpi-seq-container],
+             [enable mpi into seq container @<:@default=]AC_ENABLE_MPI_SEQ_CONTAINER_DEFAULT[@:>@])],
+    [
+    enable_mpi_seq_container=$enableval
+    ],
+    [enable_mpi_seq_container=]AC_ENABLE_MPI_SEQ_CONTAINER_DEFAULT)
+
+if test "X$enable_mpi_seq_container" = "Xyes"; then
+  CFLAGS="$CFLAGS -D_MPI_SEQ_CONTAINER_ "
+  CXXFLAGS="$CXXFLAGS -D_MPI_SEQ_CONTAINER_ "
+fi
+AM_CONDITIONAL([WITH_MPI_SEQ_CONTAINER], [test "x$enable_mpi_seq_container" = "xyes"])
+])
index 4ba5af6cb44e3ee4b8741eb011e3c6d923cbdda2..9c6bffe17beb3542e9ecb2e70f8c07455927c4bc 100644 (file)
@@ -61,7 +61,6 @@ dist_salomescript_SCRIPTS=\
 # This local variable defines the list of CPPFLAGS common to all target in this package.
 COMMON_CPPFLAGS=\
        @PYTHON_INCLUDES@ \
-       @MPI_INCLUDES@ \
        @HDF5_INCLUDES@ \
        -I$(srcdir)/../Batch \
        -I$(srcdir)/../Basics \
@@ -89,10 +88,14 @@ COMMON_LIBS =\
        ../HDFPersist/libSalomeHDFPersist.la \
        ../Batch/libSalomeBatch.la \
        $(top_builddir)/idl/libSalomeIDLKernel.la \
-       @MPI_LIBS@ \
        @CORBA_LIBS@ \
        $(PYTHON_LIBS)
 
+if WITH_MPI_SEQ_CONTAINER      
+COMMON_CPPFLAGS += @MPI_INCLUDES@
+COMMON_LIBS += @MPI_LIBS@
+endif
+
 #
 # ===============================================================
 # Libraries targets
@@ -142,10 +145,13 @@ SALOME_Container_LDADD = \
        libSalomeContainer.la \
        ../Basics/libSALOMEBasics.la \
        $(HDF5_LIBS) \
-       $(MPI_LIBS) \
        $(CORBA_LIBS) \
        $(PYTHON_LIBS)
 
+if WITH_MPI_SEQ_CONTAINER      
+SALOME_Container_LDADD += $(MPI_LIBS)
+endif
+
 SALOME_Container_LDFLAGS  =\
 -Xlinker -export-dynamic
 
@@ -159,7 +165,6 @@ TestSalome_file_LDADD =\
        libSalomeContainer.la \
        ../Basics/libSALOMEBasics.la \
        $(HDF5_LIBS) \
-       $(MPI_LIBS) \
        $(CORBA_LIBS) \
        $(PYTHON_LIBS)
 
index 1cb421223482056724df32afe935c5006615fbb1..cdcfc64a9a8a6a23991c25892453144f51623e02 100644 (file)
 //  Module : SALOME
 //  $Header$
 //
-#ifdef HAVE_MPI2
+#ifdef _MPI_SEQ_CONTAINER_
+  #ifdef HAVE_MPI2
 #include <mpi.h>
+  #endif
 #endif
 
 #include <iostream>
@@ -118,9 +120,11 @@ void unexpectedHandler(void)
 
 int main(int argc, char* argv[])
 {
-#ifdef HAVE_MPI2
+#ifdef _MPI_SEQ_CONTAINER_
+  #ifdef HAVE_MPI2
   MPI_Init(&argc,&argv);
-#endif
+  #endif
+#endif  
 
 #ifndef WIN32
   if(getenv ("DEBUGGER"))
@@ -225,9 +229,11 @@ int main(int argc, char* argv[])
       INFOS("Caught unknown exception.");
     }
 
-#ifdef HAVE_MPI2
+#ifdef _MPI_SEQ_CONTAINER_
+  #ifdef HAVE_MPI2
   MPI_Finalize();
-#endif
+  #endif
+#endif  
 
   //END_OF(argv[0]);
   //LocalTraceBufferPool* bp1 = LocalTraceBufferPool::instance();
index 939f53bdb5aaab1ea31de98f40c046224c524924..0ac18204f78932783d6bde25da5e71c6d204d9f8 100644 (file)
 #include <vector>
 #include "Utils_CorbaException.hxx"
 #include "Batch_Date.hxx"
+#include <sstream>
 
 #ifdef WITH_PACO_PARALLEL
-#include "PaCO++.h"
+#include "PaCOPP.hxx"
 #endif
 
 #define TIME_OUT_TO_LAUNCH_CONT 61
@@ -79,7 +80,6 @@ SALOME_ContainerManager::SALOME_ContainerManager(CORBA::ORB_ptr orb, PortableSer
     Engines::ContainerManager::_narrow(obj);
 
   _NS->Register(refContMan,_ContainerManagerNameInNS);
-  _MpiStarted = false;
   _isAppliSalomeDefined = (getenv("APPLI") != 0);
   MESSAGE("constructor end");
 }
@@ -143,32 +143,33 @@ void SALOME_ContainerManager::ShutdownContainers()
     for(list<string>::iterator iter=lstCont.begin();iter!=lstCont.end();iter++){
       SCRUTE((*iter));
     }
-    for(list<string>::iterator iter=lstCont.begin();iter!=lstCont.end();iter++){
-      SCRUTE((*iter));
-      CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
-      Engines::Container_var cont=Engines::Container::_narrow(obj);
-      if(!CORBA::is_nil(cont))
-        {
-          MESSAGE("ShutdownContainers: " << (*iter));
-          try
-            {
-              cont->Shutdown();
-            }
-          catch(CORBA::SystemException& e)
-            {
-              INFOS("CORBA::SystemException ignored : " << e);
-            }
-          catch(CORBA::Exception&)
-            {
-              INFOS("CORBA::Exception ignored.");
-            }
-          catch(...)
-            {
-              INFOS("Unknown exception ignored.");
-            }
-        }
-      else 
-        MESSAGE("ShutdownContainers: no container ref for " << (*iter));
+    for(list<string>::iterator iter=lstCont.begin();iter!=lstCont.end();iter++)
+    {
+      try
+      {
+       SCRUTE((*iter));
+       CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
+       Engines::Container_var cont=Engines::Container::_narrow(obj);
+       if(!CORBA::is_nil(cont))
+       {
+         MESSAGE("ShutdownContainers: " << (*iter));
+         cont->Shutdown();
+       }
+       else 
+         MESSAGE("ShutdownContainers: no container ref for " << (*iter));
+      }
+      catch(CORBA::SystemException& e)
+      {
+       INFOS("CORBA::SystemException ignored : " << e);
+      }
+      catch(CORBA::Exception&)
+      {
+       INFOS("CORBA::Exception ignored.");
+      }
+      catch(...)
+      {
+       INFOS("Unknown exception ignored.");
+      }
     }
   }
 }
@@ -219,11 +220,11 @@ SALOME_ContainerManager::StartContainer(const Engines::MachineParameters& params
 #ifdef WITH_PACO_PARALLEL
   std::string parallelLib(params.parallelLib);
   if (parallelLib != "")
-    {
-      Engines::MachineParameters myparams(params);
-      myparams.computerList=possibleComputers;
-      return FindOrStartParallelContainer(myparams);
-    }
+  {
+    Engines::MachineParameters myparams(params);
+    myparams.computerList=possibleComputers;
+    return StartParallelContainer(myparams);
+  }
 #endif
   string containerNameInNS;
   Engines::Container_ptr ret = Engines::Container::_nil();
@@ -496,10 +497,10 @@ SALOME_ContainerManager::FindContainer(const Engines::MachineParameters& params,
  */
 //=============================================================================
 Engines::Container_ptr
-SALOME_ContainerManager::FindOrStartParallelContainer(const Engines::MachineParameters& params_const)
+SALOME_ContainerManager::StartParallelContainer(const Engines::MachineParameters& params_const)
 {
   CORBA::Object_var obj;
-  PaCO::InterfaceManager_var proxy;
+  PaCO::InterfaceManager_var container_proxy;
   Engines::Container_ptr ret = Engines::Container::_nil();
   Engines::MachineParameters params(params_const);
 
@@ -508,101 +509,178 @@ SALOME_ContainerManager::FindOrStartParallelContainer(const Engines::MachinePara
   // we have to verified the number of nodes of the container
   // if a user tell that.
   ret = FindContainer(params, params.computerList);
-
   if(CORBA::is_nil(ret)) {
-    // Step 2 : Starting a new parallel container
-    INFOS("[FindOrStartParallelContainer] Starting a parallel container");
+    // Step 2 : Starting a new parallel container !
+    INFOS("[StartParallelContainer] Starting a PaCO++ parallel container");
+
+    // Step 3 : Choose a computer
+    std::string theMachine = _ResManager->FindFirst(params.computerList);
+    //If the machine name is localhost use the real name
+    if(theMachine == "localhost")
+      theMachine=Kernel_Utils::GetHostname();
 
-    // Step 2.1 : Choose a computer
-    string theMachine = _ResManager->FindFirst(params.computerList);
     if(theMachine == "") {
-      INFOS("[FindOrStartParallelContainer] !!!!!!!!!!!!!!!!!!!!!!!!!!");
-      INFOS("[FindOrStartParallelContainer] No possible computer found");
-      INFOS("[FindOrStartParallelContainer] !!!!!!!!!!!!!!!!!!!!!!!!!!");
+      INFOS("[StartParallelContainer] !!!!!!!!!!!!!!!!!!!!!!!!!!");
+      INFOS("[StartParallelContainer] No possible computer found");
+      INFOS("[StartParallelContainer] !!!!!!!!!!!!!!!!!!!!!!!!!!");
+      return ret;
+    }
+    INFOS("[StartParallelContainer] on machine : " << theMachine);
+    params.hostname = CORBA::string_dup(theMachine.c_str());
+
+    // Step 4 : starting parallel container proxy
+    Engines::MachineParameters params_proxy(params);
+    std::string command_proxy;
+    SALOME_ContainerManager::actual_launch_machine_t proxy_machine;
+    try 
+    {
+      command_proxy = BuildCommandToLaunchParallelContainer("SALOME_ParallelContainerProxy", params_proxy, proxy_machine);
+    }
+    catch(const SALOME_Exception & ex)
+    {
+      INFOS("[StartParallelContainer] Exception in BuildCommandToLaunchParallelContainer");
+      INFOS(ex.what());
+      return ret;
+    }
+    params_proxy.nb_component_nodes = 0; // LaunchParallelContainer uses this value to know if it launches the proxy or the nodes
+    obj = LaunchParallelContainer(command_proxy, params_proxy, _NS->ContainerName(params_proxy), proxy_machine);
+    if (CORBA::is_nil(obj))
+    {
+      INFOS("[StartParallelContainer] LaunchParallelContainer for proxy returns NIL !");
+      return ret;
+    }
+    try 
+    {
+      container_proxy = PaCO::InterfaceManager::_narrow(obj);
+    }
+    catch(CORBA::SystemException& e)
+    {
+      INFOS("[StartParallelContainer] Exception in _narrow after LaunchParallelContainer for proxy !");
+      INFOS("CORBA::SystemException : " << e);
+      return ret;
+    }
+    catch(CORBA::Exception& e)
+    {
+      INFOS("[StartParallelContainer] Exception in _narrow after LaunchParallelContainer for proxy !");
+      INFOS("CORBA::Exception" << e);
+      return ret;
+    }
+    catch(...)
+    {
+      INFOS("[StartParallelContainer] Exception in _narrow after LaunchParallelContainer for proxy !");
+      INFOS("Unknown exception !");
+      return ret;
+    }
+    if (CORBA::is_nil(container_proxy))
+    {
+      INFOS("[StartParallelContainer] PaCO::InterfaceManager::_narrow returns NIL !");
+      return ret;
     }
-    else {
-      INFOS("[FindOrStartParallelContainer] on machine : " << theMachine);
-      string command;
-      if(theMachine == Kernel_Utils::GetHostname()) {
-        // Step 3 : starting parallel container proxy
-        params.hostname = CORBA::string_dup(theMachine.c_str());
-        Engines::MachineParameters params_proxy(params);
-        try {
-          command = BuildCommandToLaunchLocalParallelContainer("SALOME_ParallelContainerProxy", params_proxy, "xterm");
-        }
-        catch(const SALOME_Exception & ex){
-          MESSAGE(ex.what());
-          return Engines::Container::_nil();
-        }
-       // LaunchParallelContainer uses this value to know if it launches the proxy or the nodes
-       params_proxy.nb_component_nodes = 0;
-       obj = LaunchParallelContainer(command, params_proxy, _NS->ContainerName(params));
-       ret = Engines::Container::_narrow(obj);
-       proxy = PaCO::InterfaceManager::_narrow(obj);
-
-       // Step 4 : starting parallel container nodes
-       command = BuildCommandToLaunchLocalParallelContainer("SALOME_ParallelContainerNode", params, "xterm");
-       string name = _NS->ContainerName(params) + "Node";
-       LaunchParallelContainer(command, params, name);
-       // Step 5 : connecting nodes and the proxy to actually create a parallel container
-       try {
-         for (int i = 0; i < params.nb_component_nodes; i++) {
-
-           char buffer [5];
-#ifndef WIN32
-           snprintf(buffer,5,"%d",i);
-#else
-           _snprintf(buffer,5,"%d",i);
-#endif
-           string name_cont = name + string(buffer);
-
-           string theNodeMachine(CORBA::string_dup(params.hostname));
-           string containerNameInNS = _NS->BuildContainerNameForNS(name_cont.c_str(),theNodeMachine.c_str());
-           int count = TIME_OUT_TO_LAUNCH_CONT;
-           obj = _NS->Resolve(containerNameInNS.c_str());
-           while (CORBA::is_nil(obj) && count) {
-             INFOS("[FindOrStartParallelContainer] CONNECTION FAILED !!!!!!!!!!!!!!!!!!!!!!!!");
-#ifndef WIN32
-             sleep(1) ;
-#else
-             Sleep(1000);
-#endif
-             count-- ;
-             obj = _NS->Resolve(containerNameInNS.c_str());
-           }
 
-           PaCO::InterfaceParallel_var node = PaCO::InterfaceParallel::_narrow(obj);
-           MESSAGE("[FindOrStartParallelContainer] Deploying node : " << name);
-           node->deploy();
-         }
-         proxy->start();
-       }
-       catch(CORBA::SystemException& e)
-          {
-            INFOS("Caught CORBA::SystemException. : " << e);
-          }
-       catch(PortableServer::POA::ServantAlreadyActive&)
-          {
-            INFOS("Caught CORBA::ServantAlreadyActiveException");
-          }
-       catch(CORBA::Exception&)
-          {
-            INFOS("Caught CORBA::Exception.");
-          }
-       catch(std::exception& exc)
-          {
-            INFOS("Caught std::exception - "<<exc.what()); 
-          }
-       catch(...)
-          {
-            INFOS("Caught unknown exception.");
-          }
-       INFOS("[FindOrStartParallelContainer] node " << name << " deployed");
+    // Step 5 : starting parallel container nodes
+    std::string command_nodes;
+    Engines::MachineParameters params_nodes(params);
+    SALOME_ContainerManager::actual_launch_machine_t nodes_machines;
+    try 
+    {
+      command_nodes = BuildCommandToLaunchParallelContainer("SALOME_ParallelContainerNode", params_nodes, nodes_machines, proxy_machine[0]);
+    }
+    catch(const SALOME_Exception & ex)
+    {
+      INFOS("[StartParallelContainer] Exception in BuildCommandToLaunchParallelContainer");
+      INFOS(ex.what());
+      return ret;
+    }
+    std::string container_generic_node_name = _NS->ContainerName(params) + "Node";
+    obj = LaunchParallelContainer(command_nodes, params_nodes, container_generic_node_name, nodes_machines);
+    if (CORBA::is_nil(obj))
+    {
+      INFOS("[StartParallelContainer] LaunchParallelContainer for nodes returns NIL !");
+      // Il faut tuer le proxy
+      try 
+      {
+       Engines::Container_var proxy = Engines::Container::_narrow(container_proxy);
+       proxy->Shutdown();
+      }
+      catch (...)
+      {
+       INFOS("[StartParallelContainer] Exception catched from proxy Shutdown...");
+      }
+      return ret;
+    }
+
+    // Step 6 : connecting nodes and the proxy to actually create a parallel container
+    for (int i = 0; i < params.nb_component_nodes; i++) 
+    {
+      std::ostringstream tmp;
+      tmp << i;
+      std::string proc_number = tmp.str();
+      std::string container_node_name = container_generic_node_name + proc_number;
+
+      std::string theNodeMachine(nodes_machines[i]);
+      std::string containerNameInNS = _NS->BuildContainerNameForNS(container_node_name.c_str(), theNodeMachine.c_str());
+      obj = _NS->Resolve(containerNameInNS.c_str());
+      if (CORBA::is_nil(obj)) 
+      {
+       INFOS("[StartParallelContainer] CONNECTION FAILED From Naming Service !");
+       INFOS("[StartParallelContainer] Container name is " << containerNameInNS);
+       return ret;
+      }
+      try
+      {
+       MESSAGE("[StartParallelContainer] Deploying node : " << container_node_name);
+       PaCO::InterfaceParallel_var node = PaCO::InterfaceParallel::_narrow(obj);
+       node->deploy();
+       MESSAGE("[StartParallelContainer] node " << container_node_name << " is deployed");
+      }
+      catch(CORBA::SystemException& e)
+      {
+       INFOS("[StartParallelContainer] Exception in deploying node : " << containerNameInNS);
+       INFOS("CORBA::SystemException : " << e);
+       return ret;
+      }
+      catch(CORBA::Exception& e)
+      {
+       INFOS("[StartParallelContainer] Exception in deploying node : " << containerNameInNS);
+       INFOS("CORBA::Exception" << e);
+       return ret;
       }
-      else {
-       INFOS("[FindOrStartParallelContainer] Currently parallel containers are launched only on the local host");
+      catch(...)
+      {
+       INFOS("[StartParallelContainer] Exception in deploying node : " << containerNameInNS);
+       INFOS("Unknown exception !");
+       return ret;
       }
     }
+
+    // Step 7 : starting parallel container
+    try 
+    {
+      MESSAGE ("[StartParallelContainer] Starting parallel object");
+      container_proxy->start();
+      MESSAGE ("[StartParallelContainer] Parallel object is started");
+      ret = Engines::Container::_narrow(container_proxy);
+    }
+    catch(CORBA::SystemException& e)
+    {
+      INFOS("Caught CORBA::SystemException. : " << e);
+    }
+    catch(PortableServer::POA::ServantAlreadyActive&)
+    {
+      INFOS("Caught CORBA::ServantAlreadyActiveException");
+    }
+    catch(CORBA::Exception&)
+    {
+      INFOS("Caught CORBA::Exception.");
+    }
+    catch(std::exception& exc)
+    {
+      INFOS("Caught std::exception - "<<exc.what()); 
+    }
+    catch(...)
+    {
+      INFOS("Caught unknown exception.");
+    }
   }
   return ret;
 }
@@ -615,11 +693,11 @@ SALOME_ContainerManager::FindOrStartParallelContainer(const Engines::MachinePara
  */
 //=============================================================================
 Engines::Container_ptr
-SALOME_ContainerManager::FindOrStartParallelContainer(const Engines::MachineParameters& params)
+SALOME_ContainerManager::StartParallelContainer(const Engines::MachineParameters& params)
 {
   Engines::Container_ptr ret = Engines::Container::_nil();
-  INFOS("[FindOrStartParallelContainer] is disabled !");
-  INFOS("[FindOrStartParallelContainer] recompile SALOME Kernel to enable parallel extension");
+  INFOS("[StartParallelContainer] is disabled !");
+  INFOS("[StartParallelContainer] recompile SALOME Kernel to enable parallel extension");
   return ret;
 }
 #endif
@@ -638,28 +716,32 @@ SALOME_ContainerManager::FindOrStartParallelContainer(const Engines::MachinePara
 CORBA::Object_ptr 
 SALOME_ContainerManager::LaunchParallelContainer(const std::string& command, 
                                                 const Engines::MachineParameters& params,
-                                                const std::string& name)
+                                                const std::string& name,
+                                                SALOME_ContainerManager::actual_launch_machine_t & vect_machine)
 {
   CORBA::Object_ptr obj = CORBA::Object::_nil();
-  string containerNameInNS;
-  MESSAGE("[LaunchParallelContainer] : command to launch...");
-  MESSAGE(command);
-  if (params.nb_component_nodes == 0) {
-    INFOS("[LaunchParallelContainer] launching the proxy of the parallel container");
-    int status = system(command.c_str());
-    if (status == -1) {
-      INFOS("[LaunchParallelContainer] failed : system command status -1");
-    }
-    else if (status == 217) {
-      INFOS("[LaunchParallelContainer] failed : system command status 217");
-    }
-
-    int count = TIME_OUT_TO_LAUNCH_CONT;
-    string theMachine(CORBA::string_dup(params.hostname));
-    containerNameInNS = _NS->BuildContainerNameForNS((char*) name.c_str(),theMachine.c_str());
+  std::string containerNameInNS;
+  int count = TIME_OUT_TO_LAUNCH_CONT;
+
+  INFOS("[LaunchParallelContainer] Begin");
+  int status = system(command.c_str());
+  if (status == -1) {
+    INFOS("[LaunchParallelContainer] failed : system command status -1");
+    return obj;
+  }
+  else if (status == 217) {
+    INFOS("[LaunchParallelContainer] failed : system command status 217");
+    return obj;
+  }
 
-    INFOS("[LaunchParallelContainer]  Waiting for Parallel Container proxy on " << theMachine);
-    while (CORBA::is_nil(obj) && count) {
+  if (params.nb_component_nodes == 0) 
+  {
+    std::string theMachine(vect_machine[0]);
+    // Proxy We have launch a proxy
+    containerNameInNS = _NS->BuildContainerNameForNS((char*) name.c_str(), theMachine.c_str());
+    INFOS("[LaunchParallelContainer]  Waiting for Parallel Container proxy " << containerNameInNS << " on " << theMachine);
+    while (CORBA::is_nil(obj) && count) 
+    {
 #ifndef WIN32
       sleep(1) ;
 #else
@@ -669,34 +751,21 @@ SALOME_ContainerManager::LaunchParallelContainer(const std::string& command,
       obj = _NS->Resolve(containerNameInNS.c_str());
     }
   }
-  else {
+  else 
+  {
     INFOS("[LaunchParallelContainer] launching the nodes of the parallel container");
-    int status = system(command.c_str());
-    if (status == -1) {
-      INFOS("[LaunchParallelContainer] failed : system command status -1");
-    }
-    else if (status == 217) {
-      INFOS("[LaunchParallelContainer] failed : system command status 217");
-    }
     // We are waiting all the nodes
-    for (int i = 0; i < params.nb_component_nodes; i++) {
+    for (int i = 0; i < params.nb_component_nodes; i++) 
+    {
       obj = CORBA::Object::_nil();
-      int count = TIME_OUT_TO_LAUNCH_CONT;
-
+      std::string theMachine(vect_machine[i]);
       // Name of the node
-      char buffer [5];
-#ifndef WIN32
-      snprintf(buffer,5,"%d",i);
-#else
-      _snprintf(buffer,5,"%d",i);
-#endif
-
-      string name_cont = name + string(buffer);
-
-      // I don't like this...
-      string theMachine(CORBA::string_dup(params.hostname));
-      containerNameInNS = _NS->BuildContainerNameForNS((char*) name_cont.c_str(),theMachine.c_str());
-      cerr << "[LaunchContainer]  Waiting for Parllel Container node " << containerNameInNS << " on " << theMachine << endl;
+      std::ostringstream tmp;
+      tmp << i;
+      std::string proc_number = tmp.str();
+      std::string container_node_name = name + proc_number;
+      containerNameInNS = _NS->BuildContainerNameForNS((char*) container_node_name.c_str(), theMachine.c_str());
+      INFOS("[LaunchParallelContainer]  Waiting for Parallel Container node " << containerNameInNS << " on " << theMachine);
       while (CORBA::is_nil(obj) && count) {
 #ifndef WIN32
        sleep(1) ;
@@ -706,12 +775,16 @@ SALOME_ContainerManager::LaunchParallelContainer(const std::string& command,
        count-- ;
        obj = _NS->Resolve(containerNameInNS.c_str());
       }
+      if (CORBA::is_nil(obj))
+      {
+       INFOS("[LaunchParallelContainer] Launch of node failed (or not found) !");
+       return obj;
+      }
     }
   }
-
-  if ( CORBA::is_nil(obj) ) {
+  if (CORBA::is_nil(obj)) 
     INFOS("[LaunchParallelContainer] failed");
-  }
+  
   return obj;
 }
 
@@ -1209,21 +1282,31 @@ SALOME_ContainerManager::BuildTempFileToLaunchRemoteContainer
  */ 
 //=============================================================================
 string 
-SALOME_ContainerManager::BuildCommandToLaunchLocalParallelContainer(const std::string& exe_name,
-                                                                   const Engines::MachineParameters& params,
-                                                                   const std::string& log)
+SALOME_ContainerManager::BuildCommandToLaunchParallelContainer(const std::string& exe_name,
+                                                              const Engines::MachineParameters& params,
+                                                              SALOME_ContainerManager::actual_launch_machine_t & vect_machine,
+                                                              const std::string proxy_hostname)
 {
   // This method knows the differences between the proxy and the nodes.
   // nb_component_nodes is not used in the same way if it is a proxy or 
   // a node.
-
-  string command;
-  string parallelLib(CORBA::string_dup(params.parallelLib));
-  string hostname(CORBA::string_dup(params.hostname));
-  int par = exe_name.find("Proxy");
-  int nbproc = params.nb_component_nodes;
-  char buffer [33];
-  sprintf(buffer,"%d",nbproc);
+  
+  //command = "gdb --args ";
+  //command = "valgrind --tool=memcheck --log-file=val_log ";
+  //command += real_exe_name;
+
+  // Step 0 : init some variables...
+  std::string parallelLib(CORBA::string_dup(params.parallelLib));
+  std::string real_exe_name  = exe_name + parallelLib;
+  std::string machine_file_name("");
+  bool remote = false;
+  bool is_a_proxy = false; 
+  std::string hostname(CORBA::string_dup(params.hostname));
+
+  std::ostringstream tmp_string;
+  CORBA::Long nb_nodes = params.nb_component_nodes;
+  tmp_string << nb_nodes;
+  std::string nbproc = tmp_string.str();
 
   Engines::MachineParameters_var rtn = new Engines::MachineParameters();
   rtn->container_name = params.container_name;
@@ -1235,118 +1318,335 @@ SALOME_ContainerManager::BuildCommandToLaunchLocalParallelContainer(const std::s
   rtn->nb_node = params.nb_node;
   rtn->isMPI = params.isMPI;
 
-  string real_exe_name  = exe_name + parallelLib;
+  // Step 1 : local or remote launch ?
+  if (hostname != std::string(Kernel_Utils::GetHostname()) )
+  {
+    MESSAGE("[BuildCommandToLaunchParallelContainer] remote machine case detected !");
+    remote = true;
+  }
 
-  if (parallelLib == "Dummy")
+  // Step 2 : proxy or nodes launch ?
+  std::string::size_type loc_proxy = exe_name.find("Proxy");
+  if( loc_proxy != string::npos ) {
+    is_a_proxy = true;
+  } 
+
+  // Step 3 : Depending of the parallelLib, getting the machine file
+  // ParallelLib Dummy has is own machine for this method
+  if (remote)
+  {
+    if (is_a_proxy)
+    {
+      machine_file_name = _ResManager->getMachineFile(hostname,
+                                                     1,
+                                                     parallelLib);
+    }
+    else
+    {
+      machine_file_name = _ResManager->getMachineFile(hostname, 
+                                                     params.nb_component_nodes,
+                                                     parallelLib);
+    }
+    if (machine_file_name == "")
     {
-      //command = "gdb --args ";
-      //command = "valgrind --tool=memcheck --log-file=val_log ";
-      //command += real_exe_name;
+      INFOS("[BuildCommandToLaunchParallelContainer] Error machine_file was not generated for machine " << hostname);
+      throw SALOME_Exception("Error machine_file was not generated");
+    }
+    MESSAGE("[BuildCommandToLaunchParallelContainer] machine_file_name is : " << machine_file_name);
+  }
 
-      command = real_exe_name;
+  // Step 4 : Log type choosen by the user
+  std::string log_env("");
+  char * get_val = getenv("PARALLEL_LOG");
+  if (get_val)
+    log_env = get_val;
+  std::string command_begin("");
+  std::string command_end("");
+  if(log_env == "xterm")
+  {
+    command_begin = "/usr/X11R6/bin/xterm -e \"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH; export PATH=$PATH;";
+    command_end   = "\"&";
+  }
+  else if(log_env == "xterm_debug")
+  {
+    command_begin = "/usr/X11R6/bin/xterm -e \"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH; export PATH=$PATH;";
+    command_end   = "; cat \" &";
+  }
+  else
+  {
+    // default into a file...
+    std::string logFilename = "/tmp/" + _NS->ContainerName(params) + "_" + hostname;
+    if (is_a_proxy)
+      logFilename += "_Proxy_";
+    else
+      logFilename += "_Node_";
+    logFilename += std::string(getenv("USER")) + ".log";
+    command_end = " > " + logFilename + " 2>&1 & ";
+  }
 
+  // Step 5 : Building the command
+  std::string command("");
+  if (parallelLib == "Dummy")
+  {
+    if (is_a_proxy)
+    {
+      std::string command_remote("");
+      if (remote)
+      {
+       std::string machine_name;
+       std::ifstream machine_file(machine_file_name.c_str());
+       std::getline(machine_file, machine_name);
+       MESSAGE("[BuildCommandToLaunchParallelContainer] machine file name extracted is " << machine_name)
+
+       // We want to launch a command like : 
+       // ssh user@machine distantPath/runRemote.sh hostNS portNS
+       const ParserResourcesType& resInfo = _ResManager->GetImpl()->GetResourcesList(machine_name);
+       if (resInfo.Protocol == rsh)
+         command_remote = "rsh ";
+       else 
+         command_remote = "ssh ";
+       command_remote += resInfo.UserName;
+       command_remote += "@";
+       command_remote += machine_name;
+       command_remote += " ";
+       command_remote += resInfo.AppliPath; // path relative to user@machine $HOME
+       command_remote += "/runRemote.sh ";
+       ASSERT(getenv("NSHOST")); 
+       command_remote += getenv("NSHOST"); // hostname of CORBA name server
+       command_remote += " ";
+       ASSERT(getenv("NSPORT"));
+       command_remote += getenv("NSPORT"); // port of CORBA name server
+       command_remote += " ";
+
+       hostname = machine_name;
+      }
+
+      command =  real_exe_name;
       command += " " + _NS->ContainerName(rtn);
       command += " " + parallelLib;
       command += " " + hostname;
+      command += " " + nbproc;
       command += " -";
       AddOmninamesParams(command);
-    }
 
-  else if (parallelLib == "Mpi")
+      command = command_begin + command_remote + command + command_end;
+      vect_machine.push_back(hostname);
+    }
+    else
     {
-      // Step 1 : check if MPI is started
-      if (_MpiStarted == false)
-        {
-          startMPI();
-        }
+      std::ifstream * machine_file = NULL;
+      if (remote)
+       machine_file = new std::ifstream(machine_file_name.c_str());
+      for (int i= 0; i < nb_nodes; i++)
+      {
+       std::string command_remote("");
+       if (remote)
+       {
+         std::string machine_name;
+         std::getline(*machine_file, machine_name);
+         MESSAGE("[BuildCommandToLaunchParallelContainer] machine file name extracted is " << machine_name)
+
+           // We want to launch a command like : 
+           // ssh user@machine distantPath/runRemote.sh hostNS portNS
+           const ParserResourcesType& resInfo = _ResManager->GetImpl()->GetResourcesList(machine_name);
+         if (resInfo.Protocol == rsh)
+           command_remote = "rsh ";
+         else 
+           command_remote = "ssh ";
+         command_remote += resInfo.UserName;
+         command_remote += "@";
+         command_remote += machine_name;
+         command_remote += " ";
+         command_remote += resInfo.AppliPath; // path relative to user@machine $HOME
+         command_remote += "/runRemote.sh ";
+         ASSERT(getenv("NSHOST")); 
+         command_remote += getenv("NSHOST"); // hostname of CORBA name server
+         command_remote += " ";
+         ASSERT(getenv("NSPORT"));
+         command_remote += getenv("NSPORT"); // port of CORBA name server
+         command_remote += " ";
+
+         hostname = machine_name;
+       }
 
-      if (par < 0)
-        {
-          // Nodes case
-
-          command = "mpiexec -np " + string(buffer) + " ";
-          //      command += "gdb --args ";
-          command += real_exe_name;
-          command += " " + _NS->ContainerName(rtn);
-          command += " " + parallelLib;
-          command += " " + hostname;
-          command += " -";
-          AddOmninamesParams(command);
-        }
-      else                                          
-        {
-          // Proxy case
-          command = "mpiexec -np 1 ";
-          command += real_exe_name;
-          command += " " + _NS->ContainerName(rtn);
-          command += " " + string(buffer);
-          command += " " + parallelLib;
-          command += " " + hostname;
-          command += " -";
-          AddOmninamesParams(command);
-        }
+       std::ostringstream tmp;
+       tmp << i;
+       std::string proc_number = tmp.str();
+
+       std::string command_tmp("");
+       command_tmp += real_exe_name;
+       command_tmp += " " + _NS->ContainerName(rtn);
+       command_tmp += " " + parallelLib;
+       command_tmp += " " + proxy_hostname;
+       command_tmp += " " + proc_number;
+       command_tmp += " -";
+       AddOmninamesParams(command_tmp);
+
+       // On change _Node_ par _Nodex_ pour avoir chaque noeud
+       // sur un fichier
+       std::string command_end_tmp = command_end;
+       std::string::size_type loc_node = command_end_tmp.find("_Node_");
+       if (loc_node != std::string::npos)
+         command_end_tmp.insert(loc_node+5, proc_number);
+       command += command_begin + command_remote + command_tmp + command_end_tmp;
+       vect_machine.push_back(hostname);
+      }
+      if (machine_file)
+       delete machine_file;
     }
-  else
+  }
+  else if (parallelLib == "Mpi")
+  {
+    // Step 0: if remote we have to copy the file
+    // to the first machine of the file
+    std::string remote_machine("");
+    if (remote)
     {
-      std::string message("Unknown parallelLib" + parallelLib);
-      throw SALOME_Exception(message.c_str());
+      std::ifstream * machine_file = NULL;
+      machine_file = new std::ifstream(machine_file_name.c_str());
+      // Get first word of the line
+      // For MPI implementation the first word is the 
+      // machine name
+      std::getline(*machine_file, remote_machine, ' ');
+      machine_file->close();
+      MESSAGE("[BuildCommandToLaunchParallelContainer] machine file name extracted is " << remote_machine)
+
+      // We want to launch a command like : 
+      // scp mpi_machine_file user@machine:Path
+      std::string command_remote("");
+      const ParserResourcesType& resInfo = _ResManager->GetImpl()->GetResourcesList(remote_machine);
+      if (resInfo.Protocol == rsh)
+       command_remote = "rcp ";
+      else 
+       command_remote = "scp ";
+
+      command_remote += machine_file_name;
+      command_remote += " ";
+      command_remote += resInfo.UserName;
+      command_remote += "@";
+      command_remote += remote_machine;
+      command_remote += ":";
+      command_remote += machine_file_name;
+
+      int status = system(command_remote.c_str());
+      if (status == -1)
+      {
+       INFOS("copy of the mpi machine file failed !");
+       return "";
+      }
     }
 
-  // log choice
-  if (log == "default")
+    if (is_a_proxy)
     {
-      command += " > /tmp/";
-      command += _NS->ContainerName(rtn);
-      command += "_";
-      command += Kernel_Utils::GetHostname();
-      command += "_";
-      command += getenv( "USER" ) ;
-      command += ".log 2>&1 &" ;
+      std::string command_remote("");
+      if (remote)
+      {
+       // We want to launch a command like : 
+       // ssh user@machine distantPath/runRemote.sh hostNS portNS
+       const ParserResourcesType& resInfo = _ResManager->GetImpl()->GetResourcesList(remote_machine);
+       if (resInfo.Protocol == rsh)
+         command_remote = "rsh ";
+       else 
+         command_remote = "ssh ";
+       command_remote += resInfo.UserName;
+       command_remote += "@";
+       command_remote += remote_machine;
+       command_remote += " ";
+       command_remote += resInfo.AppliPath; // path relative to user@machine $HOME
+       command_remote += "/runRemote.sh ";
+       ASSERT(getenv("NSHOST")); 
+       command_remote += getenv("NSHOST"); // hostname of CORBA name server
+       command_remote += " ";
+       ASSERT(getenv("NSPORT"));
+       command_remote += getenv("NSPORT"); // port of CORBA name server
+       command_remote += " ";
+
+       hostname = remote_machine;
+      }
+
+      // We use Dummy proxy for MPI parallel containers
+      real_exe_name  = exe_name + "Dummy";
+      command =  real_exe_name;
+      command += " " + _NS->ContainerName(rtn);
+      command += " Dummy";
+      command += " " + hostname;
+      command += " " + nbproc;
+      command += " -";
+      AddOmninamesParams(command);
+
+      command = command_begin + command_remote + command + command_end;
+      vect_machine.push_back(hostname);
     }
-  if (log == "xterm")
+    else                                          
     {
-      command = "/usr/X11R6/bin/xterm -e \"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH; export PATH=$PATH;  " 
-        + command + " \" &";
-      //             + command + "; echo $LD_LIBRARY_PATH; cat \" &";
-    }
-  return command;
+      std::string command_remote("");
+      if (remote)
+      {
+       const ParserResourcesType& resInfo = _ResManager->GetImpl()->GetResourcesList(remote_machine);
+       if (resInfo.Protocol == rsh)
+         command_remote = "rsh ";
+       else 
+         command_remote = "ssh ";
+       command_remote += resInfo.UserName;
+       command_remote += "@";
+       command_remote += remote_machine;
+       command_remote += " ";
+
+       std::string new_real_exe_name("");
+       new_real_exe_name += resInfo.AppliPath; // path relative to user@machine $HOME
+       new_real_exe_name += "/runRemote.sh ";
+       ASSERT(getenv("NSHOST")); 
+       new_real_exe_name += getenv("NSHOST"); // hostname of CORBA name server
+       new_real_exe_name += " ";
+       ASSERT(getenv("NSPORT"));
+       new_real_exe_name += getenv("NSPORT"); // port of CORBA name server
+       new_real_exe_name += " ";
+
+       real_exe_name = new_real_exe_name + real_exe_name;
+       hostname = remote_machine;
+      }
 
-  /*  if (log == "xterm")
+      const ParserResourcesType& resInfo = _ResManager->GetImpl()->GetResourcesList(hostname);
+      if (resInfo.mpi == lam)
       {
-      command = "/usr/X11R6/bin/xterm -e \"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH; export PATH=$PATH; echo $LD_LIBRARY_PATH; echo $PATH; " + command + "; cat \" &";
+       command = "mpiexec -ssi boot ";
+       if (resInfo.Protocol == rsh)
+         command += "rsh ";
+       else 
+         command += "ssh ";
+       command += "-machinefile " + machine_file_name + " "; 
+       command += "-n " + nbproc + " ";
+       command += real_exe_name;
+       command += " " + _NS->ContainerName(rtn);
+       command += " " + parallelLib;
+       command += " " + proxy_hostname;
+       command += " -";
+       AddOmninamesParams(command);
+      }
+      else
+      {
+       command = "mpirun -np " + nbproc + " ";
+       command += real_exe_name;
+       command += " " + _NS->ContainerName(rtn);
+       command += " " + parallelLib;
+       command += " " + proxy_hostname;
+       command += " -";
+       AddOmninamesParams(command);
       }
-  */
-  /*  command = "cd ; rm " + fichier_commande + "; touch " + \
-      fichier_commande + "; echo \" export LD_LIBRARY_PATH=$LD_LIBRARY_PATH; " + \
-      command + " >& /tmp/ribes_" + fichier_commande + " & \" > " + fichier_commande + ";";
-      command += "ssh cn01 sh " + fichier_commande + " &";
-      cerr << "La commande : " << command << endl;
-  */
-}
 
-void SALOME_ContainerManager::startMPI()
-{
-  cerr << "----------------------------------------------" << endl;
-  cerr << "----------------------------------------------" << endl;
-  cerr << "----------------------------------------------" << endl;
-  cerr << "-Only Lam on Localhost is currently supported-" << endl;
-  cerr << "----------------------------------------------" << endl;
-  cerr << "----------------------------------------------" << endl;
-  cerr << "----------------------------------------------" << endl;
-
-  int status = system("lamboot");
-  if (status == -1)
-    {
-      INFOS("lamboot failed : system command status -1");
-    }
-  else if (status == 217)
-    {
-      INFOS("lamboot failed : system command status 217");
+      command = command_begin + command_remote + command + command_end;
+      for (int i= 0; i < nb_nodes; i++)
+       vect_machine.push_back(proxy_hostname);
     }
+  }
   else
-    {
-      _MpiStarted = true;
-    }
+  {
+    std::string message("Unknown parallelLib : " + parallelLib);
+    throw SALOME_Exception(message.c_str());
+  }
+
+  MESSAGE("Parallel launch is: " << command);
+  return command;
 }
 
 string SALOME_ContainerManager::GetMPIZeroNode(string machine)
index 6d7d37c8af8860ba19ba8715b18922db45a20b9e..d5f4b2b2d3f3a6a6b23ec34013e48e563f20637d 100644 (file)
@@ -61,9 +61,10 @@ public:
 
   static const char *_ContainerManagerNameInNS;
 
-  // Parallel extension
+  // PaCO++ Parallel extension
   Engines::Container_ptr
-  FindOrStartParallelContainer(const Engines::MachineParameters& params);
+  StartParallelContainer(const Engines::MachineParameters& params);
+
 protected:
   Engines::Container_ptr
   FindContainer(const Engines::MachineParameters& params,
@@ -73,12 +74,6 @@ protected:
   FindContainer(const Engines::MachineParameters& params,
                 const char *theMachine);
 
-  // Parallel extension
-  CORBA::Object_ptr 
-  LaunchParallelContainer(const std::string& command, 
-                         const Engines::MachineParameters& params,
-                         const std::string& name);
-
   void fillBatchLaunchedContainers();
 
   std::string BuildCommandToLaunchRemoteContainer(const std::string& machine,
@@ -101,13 +96,17 @@ protected:
 
   std::string GetMPIZeroNode(std::string machine);
 
-  // Parallel extension
-  std::string BuildCommandToLaunchLocalParallelContainer(const std::string& exe_name, 
-                                                        const Engines::MachineParameters& params, 
-                                                        const std::string& log = "default");
-  void startMPI();
-  bool _MpiStarted;
-
+  // For PacO++ Parallel extension
+  typedef std::vector<std::string> actual_launch_machine_t;
+  std::string BuildCommandToLaunchParallelContainer(const std::string& exe_name, 
+                                                   const Engines::MachineParameters& params,
+                                                   SALOME_ContainerManager::actual_launch_machine_t & vect_machine, 
+                                                   const std::string proxy_hostname = ""); 
+  CORBA::Object_ptr 
+  LaunchParallelContainer(const std::string& command, 
+                         const Engines::MachineParameters& params,
+                         const std::string& name,
+                         SALOME_ContainerManager::actual_launch_machine_t & vect_machine);
   CORBA::ORB_var _orb;
   PortableServer::POA_var _poa;
 
index 46a9e4106107af0f11fa27bb798dc2f46e0d5130..1a512d102656aaaa39d2862527e795b1e21b4982 100644 (file)
 #  Author : André RIBES (EDF)
 #  Module : KERNEL
 #
+
+SUBDIRS_COMMON = DSC_Basic 
+
+if !WINDOWS
+  SUBDIRS_ADD = DSC_User DSC_Python
+endif
+
 if WITH_PACO_PARALLEL
-SUBDIR_PAR = ParallelDSC
+  SUBDIR_PAR = ParallelDSC
 endif
 
-SUBDIRS = DSC_Basic DSC_User $(SUBDIR_PAR) DSC_Python
+SUBDIRS = $(SUBDIRS_COMMON) $(SUBDIRS_ADD) $(SUBDIR_PAR) 
 
 EXTRA_DIST= DSC.dox
+
+DIST_SUBDIRS = DSC_Basic DSC_User DSC_Python ParallelDSC
index b25c20235493c0293f657bcee17d0ec6083017ff..64346973e79406e58aa4a8086f692ede77e8d2c2 100644 (file)
@@ -31,7 +31,9 @@ include $(top_srcdir)/salome_adm/unix/make_common_starter.am
 # ===============================================================
 #
 # header files  
-salomeinclude_HEADERS = ParallelDSC_i.hxx
+salomeinclude_HEADERS = ParallelDSC_i.hxx \
+                       Param_Double_Port_provides_i.hxx \
+                       Param_Double_Port_uses_i.hxx
 
 #
 # ===============================================================
@@ -53,7 +55,7 @@ COMMON_CPPFLAGS= -I$(top_srcdir)/src/Container \
                 -I$(top_srcdir)/src/Registry \
                 -I$(top_srcdir)/src/Utils \
                 @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ \
-                @PACO_INCLUDES@
+                @PACO_INCLUDES@ @MPI_INCLUDES@
 
 # This local variable defines the list of dependant libraries common to all target in this package.
 COMMON_LIBS = 
@@ -65,7 +67,9 @@ COMMON_LIBS =
 #
 lib_LTLIBRARIES =  libSalomeParallelDSCContainer.la 
 
-libSalomeParallelDSCContainer_la_SOURCES  = ParallelDSC_i.cxx
+libSalomeParallelDSCContainer_la_SOURCES  = ParallelDSC_i.cxx \
+                                           Param_Double_Port_provides_i.cxx \
+                                           Param_Double_Port_uses_i.cxx
 
 libSalomeParallelDSCContainer_la_CXXFLAGS = $(COMMON_CPPFLAGS)
 
index 7fb691aa215ace795cbec0ba655a60952ebd6cb5..0c2706efe2e48d04274501c4e6b573415c0912cf 100644 (file)
@@ -35,10 +35,15 @@ Engines_ParallelDSC_i::Engines_ParallelDSC_i(CORBA::ORB_ptr orb,
                                             bool notif) :
   Engines_Parallel_Component_i(orb, ior, rank, poa, contId, instanceName, interfaceName, notif),
   Engines::Parallel_DSC_serv(orb, ior, rank),
+  Engines::Parallel_DSC_base_serv(orb, ior, rank),
   Engines::DSC_serv(orb, ior, rank),
+  Engines::DSC_base_serv(orb, ior, rank),
   Engines::Superv_Component_serv(orb, ior, rank),
+  Engines::Superv_Component_base_serv(orb, ior, rank),
   Engines::Component_serv(orb, ior, rank),
+  Engines::Component_base_serv(orb, ior, rank),
   Engines::Parallel_Component_serv(orb, ior, rank),
+  Engines::Parallel_Component_base_serv(orb, ior, rank),
   InterfaceParallel_impl(orb, ior, rank)
 {
 }
index e745a1cb37109b67afd9472c60253c6cdb54cc4c..ac9273c46028eef812039b94d1c83b4dcd5583f9 100644 (file)
 #include <iostream>
 #include <map>
 
-#include "DSC_EnginesPaCO_Engines_Parallel_DSC_server.h"
 #include "DSC_interface.hxx"
 #include "SALOME_ParallelComponent_i.hxx"
 
+#include "SALOME_PACOExtensionPaCO_Engines_Parallel_DSC_server.hxx"
+#include "SALOME_PortsPaCO.hxx"
+
 class Engines_ParallelDSC_i: 
   public virtual Engines_Parallel_Component_i,
   public virtual Engines::Parallel_DSC_serv,
diff --git a/src/DSC/ParallelDSC/Param_Double_Port_provides_i.cxx b/src/DSC/ParallelDSC/Param_Double_Port_provides_i.cxx
new file mode 100644 (file)
index 0000000..ce1add0
--- /dev/null
@@ -0,0 +1,342 @@
+//  Copyright (C) 2009  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : param_double_port_provides.cxx
+//  Author : André RIBES (EDF)
+//  Module : KERNEL
+
+#include <iostream>
+#include <string>
+#include <sstream>
+
+#include "Param_Double_Port_provides_i.hxx"
+
+#include <paco_omni.h>
+#include <paco_dummy.h>
+#include <paco_mpi.h>
+#include <paco_direct_comScheduling.h>
+#include <GaBro.h>
+#include <BasicBC.h>
+
+Param_Double_Port_provides_i::Param_Double_Port_provides_i(CORBA::ORB_ptr orb, char * ior, int rank) :
+  Ports::Param_Double_Port_serv(orb,ior,rank),
+  Ports::Param_Double_Port_base_serv(orb,ior,rank),
+  Ports::Data_Port_serv(orb,ior,rank),
+  Ports::Data_Port_base_serv(orb,ior,rank),
+  Ports::Port_serv(orb,ior,rank),
+  Ports::Port_base_serv(orb,ior,rank),
+  InterfaceParallel_impl(orb,ior,rank)
+{
+  _seq_data = NULL;
+
+  seq_data_termine = false;                
+  seq_data_mutex = new pthread_mutex_t();
+  pthread_mutex_init(seq_data_mutex, NULL);
+  seq_data_condition = new pthread_cond_t();
+  pthread_cond_init(seq_data_condition, NULL);
+  seq_data_termine_cp = true;              
+  seq_data_mutex_cp = new pthread_mutex_t();
+  pthread_mutex_init(seq_data_mutex_cp, NULL);
+  seq_data_condition_cp = new pthread_cond_t();
+  pthread_cond_init(seq_data_condition_cp, NULL);
+
+  _seq_results = NULL;
+
+  seq_results_termine = false;             
+  seq_results_mutex = new pthread_mutex_t();
+  pthread_mutex_init(seq_results_mutex, NULL);
+  seq_results_condition = new pthread_cond_t();
+  pthread_cond_init(seq_results_condition, NULL);
+  seq_results_termine_cp = true;                   
+  seq_results_mutex_cp = new pthread_mutex_t();
+  pthread_mutex_init(seq_results_mutex_cp, NULL);
+  seq_results_condition_cp = new pthread_cond_t();
+  pthread_cond_init(seq_results_condition_cp, NULL);
+}
+
+Param_Double_Port_provides_i::~Param_Double_Port_provides_i() 
+{
+  if (_seq_data)
+    delete _seq_data;
+
+  pthread_mutex_destroy(seq_data_mutex);
+  delete seq_data_mutex;
+  pthread_cond_destroy(seq_data_condition);
+  delete seq_data_condition;
+  pthread_mutex_destroy(seq_data_mutex_cp);
+  delete seq_data_mutex_cp;
+  pthread_cond_destroy(seq_data_condition_cp);
+  delete seq_data_condition_cp;
+
+  if (_seq_results)
+    delete _seq_results;
+
+  pthread_mutex_destroy(seq_results_mutex);
+  delete seq_results_mutex;
+  pthread_cond_destroy(seq_results_condition);
+  delete seq_results_condition;
+  pthread_mutex_destroy(seq_results_mutex_cp);
+  delete seq_results_mutex_cp;
+  pthread_cond_destroy(seq_results_condition_cp);
+  delete seq_results_condition_cp;
+}
+
+Param_Double_Port_provides_i *
+Param_Double_Port_provides_i::init_port(Engines_ParallelDSC_i * par_compo, 
+                                       std::string port_name,
+                                       CORBA::ORB_ptr orb)
+{
+  int rank = par_compo->getMyRank();
+  int totalNode = par_compo->getTotalNode();
+  paco_com * com = par_compo->getCom();
+
+  MESSAGE("Configuration of Param_Double_Port_provides: rank = " << rank << " totalNode = " << totalNode);
+
+  // DOIT ETRE DEJA FAIT AVANT !!!???
+  paco_fabrique_manager* pfm = paco_getFabriqueManager();
+  pfm->register_com("pdp_dummy", new paco_dummy_fabrique());
+  pfm->register_thread("pdp_thread", new paco_omni_fabrique());
+  pfm->register_comScheduling("pdp_direct", new paco_direct_fabrique());
+  pfm->register_distribution("pdp_GaBro", new GaBro_fab());
+  pfm->register_distribution("pdp_BasicBC", new BasicBC_fab());
+
+  Param_Double_Port_provides_i * port = NULL; 
+  Ports::Param_Double_Port_proxy_impl * proxy_node = NULL; 
+
+  std::cerr << "Creating Proxy" << std::endl;
+  if (rank == 0) {
+    // On commence par créer le proxy
+    // Il est enregistré dans le composant et sera détruit automatiquement
+    // lorsque le composant sera détruit
+    proxy_node = 
+      new Ports::Param_Double_Port_proxy_impl(CORBA::ORB::_duplicate(orb),
+                                             pfm->get_thread("pdp_thread"));
+    proxy_node->setLibCom("pdp_dummy", proxy_node);
+    proxy_node->setLibThread("pdp_thread");
+    PaCO::PacoTopology_t serveur_topo;
+    serveur_topo.total = totalNode;
+    proxy_node->setTopology(serveur_topo);
+
+    // Création de la propriété
+    PortProperties_i * proxy_node_properties = new PortProperties_i();
+
+    // Enregistrement du proxy
+    par_compo->add_parallel_provides_proxy_port(proxy_node->_this(), 
+                                               port_name.c_str(),
+                                               proxy_node_properties->_this());
+    proxy_node->_remove_ref();
+    proxy_node_properties->_remove_ref();
+  }
+  else {
+    par_compo->add_parallel_provides_proxy_wait(port_name.c_str());
+  }
+
+  std::cerr << "Getting proxy" << std::endl;
+  char * proxy_ior = (char * ) par_compo->get_proxy(port_name.c_str());
+  std::cerr << "Proxy ior is : " << proxy_ior << std::endl;
+
+  port = new Param_Double_Port_provides_i(CORBA::ORB::_duplicate(orb), proxy_ior, rank);
+  port->copyClientGlobalContext(par_compo);
+
+  // Il faut maintenant configurer les bibliothèques
+  // de redistributions de la fonction put
+  ParallelMethodContext * method_ptr = port->getParallelMethodContext("put");
+  method_ptr->setLibComScheduling("pdp_direct"); 
+  method_ptr->setDistLibArg("param_data", "pdp_BasicBC", "in");
+  BasicBC * dislib = (BasicBC *) method_ptr->getDistLibArg("param_data", "in");
+  dislib->setEltSize(sizeof(CORBA::Double));
+
+  // Il faut maintenant configurer les bibliothèques
+  // de redistributions de la fonction get_results
+  method_ptr = port->getParallelMethodContext("get_results");
+  method_ptr->setLibComScheduling("pdp_direct"); 
+  method_ptr->setDistLibArg("param_results", "pdp_GaBro", "out");
+  GaBro * dislib_gabro = (GaBro *) method_ptr->getDistLibArg("param_results", "out");
+  dislib_gabro->setEltSize(sizeof(CORBA::Double));
+
+  // Enregistement du port 
+  for (int i = 0; i < totalNode; i++) 
+  {
+    std::ostringstream node_number;
+    node_number << i;
+    std::string event_name("AddNode");
+    event_name += node_number.str();
+    std::string tag_name = proxy_ior;
+
+    if (i == rank) {
+      std::cerr << "Adding node of processor : " << i << std::endl;
+      par_compo->add_parallel_provides_node_port(Ports::Port_PaCO::_narrow(port->_this()), port_name.c_str());
+      port->_remove_ref();
+      par_compo->InterfaceParallel_impl::_proxy->send_event(event_name.c_str(), tag_name.c_str());
+    }
+
+    par_compo->wait_event(event_name.c_str(), tag_name.c_str());
+  }
+
+  // On démarre l'objet parallèle
+  std::string event_name("StartingProxy");
+  std::string tag_name = proxy_ior;
+  if (rank == 0) 
+  {
+    proxy_node->start();
+    par_compo->InterfaceParallel_impl::_proxy->send_event(event_name.c_str(), tag_name.c_str());
+  }
+
+  CORBA::string_free(proxy_ior);
+  return port;
+}
+
+void
+Param_Double_Port_provides_i::wait_init_port(Engines_ParallelDSC_i * par_compo, 
+                                            std::string port_name,
+                                            CORBA::ORB_ptr orb)
+{
+  int rank = par_compo->getMyRank();
+  int totalNode = par_compo->getTotalNode();
+  // Enregistement du port 
+  for (int i = 0; i < totalNode; i++) 
+  {
+    std::ostringstream node_number;
+    node_number << i;
+    std::string event_name("WaitingNode");
+    event_name += node_number.str();
+    char * proxy_ior = (char * ) par_compo->get_proxy(port_name.c_str());
+    std::string tag_name(proxy_ior);
+    CORBA::string_free(proxy_ior);
+    if (i == rank) 
+      par_compo->InterfaceParallel_impl::_proxy->send_event(event_name.c_str(), tag_name.c_str());
+    par_compo->wait_event(event_name.c_str(), tag_name.c_str());
+  }
+}
+
+void 
+Param_Double_Port_provides_i::put(const Ports::Param_Double_Port::seq_double & param_data)
+{
+
+  // On attend que le get soit fait
+  // Au départ seq_data_termine_cp = TRUE
+  pthread_mutex_lock(seq_data_mutex_cp);
+  while (seq_data_termine_cp == false)
+  {
+     pthread_cond_wait(seq_data_condition_cp, seq_data_mutex_cp);
+  }
+  seq_data_termine_cp = false;
+  pthread_mutex_unlock(seq_data_mutex_cp);
+
+  pthread_mutex_lock(seq_data_mutex);
+
+  // Création d'une nouvelle séquence
+  // Elle prend le buffer sans le copier
+  Ports::Param_Double_Port::seq_double * n_param_data = (Ports::Param_Double_Port::seq_double *) &param_data;
+  _seq_data = new Ports::Param_Double_Port::seq_double(n_param_data->length(), n_param_data->length(), n_param_data->get_buffer(1), 1);
+
+  seq_data_termine = true;
+  pthread_cond_signal(seq_data_condition);
+  pthread_mutex_unlock(seq_data_mutex);
+}
+    
+void 
+Param_Double_Port_provides_i::get_results(Ports::Param_Double_Port::seq_double_out param_results)
+{
+  pthread_mutex_lock(seq_results_mutex);
+  while (seq_results_termine == false)
+  {
+     pthread_cond_wait(seq_results_condition, seq_results_mutex);
+  }
+
+  // Création d'une nouvelle séquence
+  // Elle prend le buffer sans le copier
+  param_results = new Ports::Param_Double_Port::seq_double(_seq_results->length(), _seq_results->length(), _seq_results->get_buffer(1), 1);
+  delete _seq_results;
+  _seq_results = NULL;
+
+  seq_results_termine = false;
+  pthread_mutex_unlock(seq_results_mutex);
+
+  // On indique que l'on a copié la valeur
+  // Et donc que l'on peut recevoir une nouvelle valeur
+  pthread_mutex_lock(seq_results_mutex_cp);
+  seq_results_termine_cp = true;
+  pthread_cond_signal(seq_results_condition_cp);
+  pthread_mutex_unlock(seq_results_mutex_cp);
+}
+
+Ports::Param_Double_Port::seq_double *
+Param_Double_Port_provides_i::get_data()
+{
+  Ports::Param_Double_Port::seq_double * result = NULL;
+
+  pthread_mutex_lock(seq_data_mutex);
+  while (seq_data_termine == false)
+  {
+     pthread_cond_wait(seq_data_condition, seq_data_mutex);
+  }
+
+  // Création d'une nouvelle séquence
+  // Elle prend le buffer sans le copier
+  result = new Ports::Param_Double_Port::seq_double(_seq_data->length(), _seq_data->length(), _seq_data->get_buffer(1), 1);
+  delete _seq_data;
+  _seq_data = NULL;
+
+  seq_data_termine = false;
+  pthread_mutex_unlock(seq_data_mutex);
+
+  // On indique que l'on a copié la valeur
+  // Et donc que l'on peut recevoir une nouvelle valeur
+  pthread_mutex_lock(seq_data_mutex_cp);
+  seq_data_termine_cp = true;
+  pthread_cond_signal(seq_data_condition_cp);
+  pthread_mutex_unlock(seq_data_mutex_cp);
+  return result;
+}
+
+void
+Param_Double_Port_provides_i::set_data(Ports::Param_Double_Port::seq_double * results)
+{
+  // On attend que le get soit fait
+  // Au départ seq_results_termine_cp = TRUE
+  pthread_mutex_lock(seq_results_mutex_cp);
+  while (seq_results_termine_cp == false)
+  {
+     pthread_cond_wait(seq_results_condition_cp, seq_results_mutex_cp);
+  }
+  seq_results_termine_cp = false;
+  pthread_mutex_unlock(seq_results_mutex_cp);
+
+  pthread_mutex_lock(seq_results_mutex);
+
+  // Création d'une nouvelle séquence
+  // Elle prend le buffer sans le copier
+  _seq_results = new Ports::Param_Double_Port::seq_double(results->length(), results->length(), results->get_buffer(1), 1);
+
+  seq_results_termine = true;
+  pthread_cond_signal(seq_results_condition);
+  pthread_mutex_unlock(seq_results_mutex);
+}
+
+void 
+Param_Double_Port_provides_i::configure_set_data(int data_length, int totalNbElt, int BeginEltPos)
+{
+  // Configuration de la biblothèque de redistribution
+  // pour les données actuelles
+  ParallelMethodContext * method_ptr = getParallelMethodContext("get_results");
+  GaBro * dislib = (GaBro *) method_ptr->getDistLibArg("param_results", "out");
+  dislib->setNodeNbElt(data_length);
+  dislib->setTotalNbElt(totalNbElt);
+  dislib->setNodePos(BeginEltPos);
+}
diff --git a/src/DSC/ParallelDSC/Param_Double_Port_provides_i.hxx b/src/DSC/ParallelDSC/Param_Double_Port_provides_i.hxx
new file mode 100644 (file)
index 0000000..7a01fc5
--- /dev/null
@@ -0,0 +1,78 @@
+//  Copyright (C) 2009  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : param_double_port_provides.hxx
+//  Author : André RIBES (EDF)
+//  Module : KERNEL
+
+#ifndef _PARAM_DOUBLE_PORT_PROVIDES_HXX_
+#define _PARAM_DOUBLE_PORT_PROVIDES_HXX_
+
+#include "SALOME_ParamPortsPaCO_Ports_Param_Double_Port_server.hxx"
+
+#include "ParallelDSC_i.hxx"
+#include "PortProperties_i.hxx"
+
+class Param_Double_Port_provides_i :
+  public virtual Ports::Param_Double_Port_serv
+{
+  public :
+    Param_Double_Port_provides_i(CORBA::ORB_ptr orb, char * ior, int rank);
+    virtual ~Param_Double_Port_provides_i();
+
+    void put(const Ports::Param_Double_Port::seq_double & param_data);
+    void get_results(Ports::Param_Double_Port::seq_double_out param_results);
+
+    // local methods
+    Ports::Param_Double_Port::seq_double * get_data();
+    void set_data(Ports::Param_Double_Port::seq_double * results);
+    void configure_set_data(int data_length, 
+                           int totalNbElt, 
+                           int BeginEltPos);
+
+    // Aide à la création du port
+    static Param_Double_Port_provides_i * init_port(Engines_ParallelDSC_i * par_compo, 
+                                                   std::string port_name,
+                                                   CORBA::ORB_ptr orb);
+
+    // Méthode temporaire en attendant d'avoir des méthodes parallèles bien synchronisé
+    static void wait_init_port(Engines_ParallelDSC_i * par_compo, 
+                              std::string port_name,
+                              CORBA::ORB_ptr orb);
+  private:
+    // Buffers pour la réception et l'envoi
+    Ports::Param_Double_Port::seq_double * _seq_data;
+    Ports::Param_Double_Port::seq_double * _seq_results;
+
+    // Variable pour la gestion du buffer de réception
+    pthread_mutex_t * seq_data_mutex;
+    pthread_cond_t * seq_data_condition;
+    bool seq_data_termine;
+    pthread_mutex_t * seq_data_mutex_cp;
+    pthread_cond_t * seq_data_condition_cp;
+    bool seq_data_termine_cp;
+
+    // Variable pour la gestion du buffer d'envoi
+    pthread_mutex_t * seq_results_mutex;
+    pthread_cond_t * seq_results_condition;
+    bool seq_results_termine;
+    pthread_mutex_t * seq_results_mutex_cp;
+    pthread_cond_t * seq_results_condition_cp;
+    bool seq_results_termine_cp;
+};
+#endif
diff --git a/src/DSC/ParallelDSC/Param_Double_Port_uses_i.cxx b/src/DSC/ParallelDSC/Param_Double_Port_uses_i.cxx
new file mode 100644 (file)
index 0000000..e06906f
--- /dev/null
@@ -0,0 +1,112 @@
+//  Copyright (C) 2009  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : param_double_port_uses.cxx
+//  Author : André RIBES (EDF)
+//  Module : KERNEL
+
+#include "Param_Double_Port_uses_i.hxx"
+
+Param_Double_Port_uses_i::Param_Double_Port_uses_i(Engines_ParallelDSC_i * par_compo, 
+                                                  std::string port_name,
+                                                  CORBA::ORB_ptr orb)
+{
+  _orb = CORBA::ORB::_duplicate(orb);
+  _fake_properties = new PortProperties_i();
+  _fake_prop_ref = _fake_properties->_this();
+  _fake_properties->_remove_ref();
+
+  _par_compo = par_compo;
+  _port_name = port_name;
+  _provides_port = NULL;
+
+  paco_fabrique_manager * pfm = paco_getFabriqueManager();
+  pfm->register_comScheduling("Param_Double_Port_uses_i_direct", new paco_direct_fabrique());
+  pfm->register_distribution("Param_Double_Port_uses_i_GaBro", new GaBro_fab());
+  pfm->register_distribution("Param_Double_Port_uses_i_BasicBC", new BasicBC_fab());
+}
+
+Param_Double_Port_uses_i::~Param_Double_Port_uses_i()
+{
+  if (_provides_port)
+  {
+    _provides_port->stop();
+    delete _provides_port;
+  }
+}
+
+void 
+Param_Double_Port_uses_i::add_port_to_component()
+{
+    _par_compo->add_uses_port("IDL:Ports/Param_Double_Port:1.0", 
+                             _port_name.c_str(),
+                             _fake_prop_ref);
+}
+
+void
+Param_Double_Port_uses_i::start_port()
+{
+  Engines::DSC::uses_port * uport = _par_compo->get_uses_port(_port_name.c_str());  
+  _proxy_port =  Ports::Param_Double_Port::_narrow((*uport)[0]);
+  _provides_port = Ports::PaCO_Param_Double_Port::PaCO_narrow(_proxy_port, _orb);
+  _provides_port->copyClientGlobalContext(_par_compo);
+  _provides_port->init(_par_compo->getMyRank(), _par_compo->getTotalNode());
+  
+  // Il faut maintenant configurer les bibliothèques
+  // de redistributions de la fonction put
+  ParallelMethodContext * method_ptr;
+  method_ptr = _provides_port->getParallelMethodContext("put");
+  method_ptr->setLibComScheduling("Param_Double_Port_uses_i_direct"); 
+  method_ptr->setDistLibArg("param_data", "Param_Double_Port_uses_i_BasicBC", "in");
+  BasicBC * dislib = (BasicBC *) method_ptr->getDistLibArg("param_data", "in");
+  dislib->setEltSize(sizeof(CORBA::Double));
+  dislib->setBlocSize(0); // BLOC
+  dislib->setNodeRank(_par_compo->getMyRank());
+
+  // Il faut maintenant configurer les bibliothèques
+  // de redistributions de la fonction get_results
+  method_ptr = _provides_port->getParallelMethodContext("get_results");
+  method_ptr->setLibComScheduling("Param_Double_Port_uses_i_direct"); 
+  method_ptr->setDistLibArg("param_results", "Param_Double_Port_uses_i_GaBro", "out");
+  GaBro * dislib_gabro = (GaBro *) method_ptr->getDistLibArg("param_results", "out");
+  dislib_gabro->setEltSize(sizeof(CORBA::Double));
+
+  _provides_port->start();
+  delete uport;
+}
+
+void 
+Param_Double_Port_uses_i::configure_port_method_put(int totalNbElt)
+{
+  ParallelMethodContext * method_ptr;
+  method_ptr = _provides_port->getParallelMethodContext("put");
+  BasicBC * dislib = (BasicBC *) method_ptr->getDistLibArg("param_data", "in");
+  dislib->setTotalNbElt(totalNbElt);
+}
+
+void 
+Param_Double_Port_uses_i::put(const Ports::Param_Double_Port::seq_double & param_data)
+{
+  _provides_port->put(param_data);
+}
+
+void 
+Param_Double_Port_uses_i::get_results(Ports::Param_Double_Port::seq_double_out param_results)
+{
+  _provides_port->get_results(param_results);
+}
diff --git a/src/DSC/ParallelDSC/Param_Double_Port_uses_i.hxx b/src/DSC/ParallelDSC/Param_Double_Port_uses_i.hxx
new file mode 100644 (file)
index 0000000..fa2e725
--- /dev/null
@@ -0,0 +1,62 @@
+//  Copyright (C) 2009  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  File   : param_double_port_uses.hxx
+//  Author : André RIBES (EDF)
+//  Module : KERNEL
+
+#ifndef _PARAM_DOUBLE_PORT_USES_HXX_
+#define _PARAM_DOUBLE_PORT_USES_HXX_
+
+#include "SALOME_ParamPortsPaCO_Ports_Param_Double_Port_client.hxx"
+
+#include "ParallelDSC_i.hxx"
+#include "PortProperties_i.hxx"
+
+#include <paco_direct_comScheduling.h>
+#include <GaBro.h>
+#include <BasicBC.h>
+
+class Param_Double_Port_uses_i
+{
+  public :
+    Param_Double_Port_uses_i(Engines_ParallelDSC_i * par_compo, 
+                            std::string port_name,
+                            CORBA::ORB_ptr orb);
+    virtual ~Param_Double_Port_uses_i();
+
+    // Port local init methods
+    virtual void add_port_to_component();
+    virtual void start_port();
+    void configure_port_method_put(int totalNbElt); 
+
+    // Port methods
+    void put(const Ports::Param_Double_Port::seq_double & param_data);
+    void get_results(Ports::Param_Double_Port::seq_double_out param_results);
+
+  private :
+    CORBA::ORB_var _orb;
+    std::string _port_name;
+    Engines_ParallelDSC_i * _par_compo;
+    Ports::Param_Double_Port_var _proxy_port;
+    PortProperties_i *  _fake_properties;
+    Ports::PortProperties_var _fake_prop_ref;
+    Ports::PaCO_Param_Double_Port * _provides_port;
+};
+#endif
+
index e1a48d3544eb609d1107bc894286cb1dadb765df..56322e56ebfdacfad8678b0e7ac64071a085bd33 100755 (executable)
@@ -149,14 +149,14 @@ def ensure_fromlist(m, fromlist, recursive=0):
             l.append((subname,submod))
     return l
 
-def import_hook(name, globals=None, locals=None, fromlist=None):
+def import_hook(name, globals=None, locals=None, fromlist=None, *args):
     """ Import replacement for sharing modules among multiple interpreters
         Mostly update sys.modules before doing real import
     """
     #print "import_hook",name,fromlist
     m=get_shared_imported(name,fromlist)
 
-    module= original_import(name, globals, locals, fromlist)
+    module= original_import(name, globals, locals, fromlist, *args)
 
     if fromlist:
        #when fromlist is specified, module is the real module
index cdc04fde9db39a9d2d95aa5899e5c9821b0816bb..eb2d2d9144b6026bf9ec2125f6dfd107a27fb117 100644 (file)
@@ -171,6 +171,9 @@ SALOME_LifeCycleCORBA::LoadComponent(const Engines::MachineParameters& params,
   parms.componentList.length(1);
   parms.componentList[0] = componentName;
 
+  Engines::MachineList_var listOfMachines = _ResManager->GetFittingResources(parms);
+  parms.computerList=listOfMachines;
+
   Engines::Component_var compo = _LoadComponent(parms,
                                                componentName,
                                                studyId);
@@ -211,9 +214,12 @@ FindOrLoad_Component(const Engines::MachineParameters& params,
                                                listOfMachines);
 
   if(CORBA::is_nil(compo))
-    compo = _LoadComponent(parms,
+    {
+      parms.computerList=listOfMachines;
+      compo = _LoadComponent(parms,
                           componentName,
                           studyId);
+    }
 
   return compo._retn();
 }
@@ -672,7 +678,7 @@ SALOME_LifeCycleCORBA::Load_ParallelComponent(const Engines::MachineParameters&
   parms.componentList[0] = componentName;
 
   MESSAGE("Starting Parallel Container");
-  Engines::Container_var cont = _ContManager->FindOrStartParallelContainer(parms);
+  Engines::Container_var cont = _ContManager->StartParallelContainer(parms);
   if (CORBA::is_nil(cont)) {
     INFOS("FindOrStartParallelContainer() returns a NULL container !");
     return Engines::Component::_nil();
@@ -688,7 +694,7 @@ SALOME_LifeCycleCORBA::Load_ParallelComponent(const Engines::MachineParameters&
   MESSAGE("Creating component instance");
   // @PARALLEL@ permits to identify that the component requested
   // is a parallel component.
-  string name = string(componentName) + string("@PARALLEL@");
+  string name = string(componentName);
   Engines::Component_var myInstance = cont->create_component_instance(name.c_str(), studyId);
   if (CORBA::is_nil(myInstance))
     INFOS("create_component_instance returns a NULL component !");
index 45de94d0ade1b251ddf8b0c6cf4538628a3860d5..943238344b4eba90beb58664b8d38fb9e24f4694 100644 (file)
@@ -23,7 +23,7 @@
 //  File   : MPIContainer_i.cxx
 //  Module : SALOME
 //
-#include <iostream.h>
+#include <iostream>
 #include <dlfcn.h>
 #include <stdio.h>
 #include "Basics_Utils.hxx"
index 33e94851b703501e0dbee396aa71714d85adc8c4..9b1d479f5e7b4046252d1ad30621dab61940b481 100644 (file)
@@ -67,7 +67,7 @@ SALOME_NamingService::SALOME_NamingService()
 SALOME_NamingService::SALOME_NamingService(CORBA::ORB_ptr orb)
 {
   MESSAGE("SALOME_NamingService creation");
-  _orb = orb ;
+  _orb = CORBA::ORB::_duplicate(orb);
   _initialize_root_context();
 }
 
@@ -99,7 +99,7 @@ void SALOME_NamingService::init_orb(CORBA::ORB_ptr orb)
   MESSAGE("SALOME_NamingService initialisation");
 
   Utils_Locker lock (&_myMutex);
-  _orb = orb;
+  _orb = CORBA::ORB::_duplicate(orb);
 
   _initialize_root_context();
 }
index daa5ca63691566a4e00b540e507ec2dc1c02a759..6e54c5f7dc9db0fc91763649c69a33f4c569fb82 100644 (file)
@@ -94,7 +94,7 @@ public:
 
 protected:
   Utils_Mutex _myMutex;
-  CORBA::ORB_ptr _orb;
+  CORBA::ORB_var _orb;
   CosNaming::NamingContext_var _root_context, _current_context;
 
   void _initialize_root_context();
index 62d705aacba7d5bde86a87863891299dfa05a4b5..59ef7f32f2119a0d31004ff5485415dc4053ae5c 100644 (file)
@@ -34,6 +34,7 @@ include $(top_srcdir)/salome_adm/unix/make_common_starter.am
 salomeinclude_HEADERS = SALOME_ParallelComponent_i.hxx \
                        SALOME_ParallelContainer_i.hxx \
                        SALOME_ParallelContainerProxy_i.hxx \
+                       SALOME_ParallelGlobalProcessVar_i.hxx \
                        Parallel_Salome_file_i.hxx
 
 #
@@ -54,8 +55,10 @@ COMMON_CPPFLAGS= -I$(top_srcdir)/src/Container \
                 -I$(top_builddir)/salome_adm/unix \
                 -I$(top_builddir)/idl \
                 -I$(top_srcdir)/src/SALOMETraceCollector \
+                @PYTHON_INCLUDES@ \
                 @CORBA_CXXFLAGS@ \
                 @CORBA_INCLUDES@ \
+                @MPI_INCLUDES@ \
                 @PACO_INCLUDES@
 
 # This local variable defines the list of dependant libraries common to all target in this package.
@@ -64,7 +67,8 @@ COMMON_LIBS = $(top_builddir)/src/Container/libSalomeContainer.la \
              $(top_builddir)/idl/libSalomeParallelIDLKernel.la \
              $(top_builddir)/idl/libSalomeIDLKernel.la \
              @CORBA_LIBS@ \
-             @PACO_LIBS@
+             @PACO_LIBS@ \
+             $(PYTHON_LIBS)
 
 #
 # ===============================================================
@@ -77,11 +81,12 @@ libSalomeParallelContainer_la_SOURCES  = SALOME_ParallelComponent_i.cxx \
                                         SALOME_ParallelContainer_i.cxx \
                                         SALOME_ParallelContainerProxy_i.cxx \
                                         $(top_srcdir)/src/Container/Salome_file_i.cxx \
-                                        Parallel_Salome_file_i.cxx
+                                        Parallel_Salome_file_i.cxx \
+                                        SALOME_ParallelGlobalProcessVar_i.cxx
 
 libSalomeParallelContainer_la_CXXFLAGS = $(COMMON_CPPFLAGS)
 
-libSalomeParallelContainer_la_LIBADD   = $(COMMON_LIBS)
+libSalomeParallelContainer_la_LIBADD   = $(COMMON_LIBS) @MPI_LIBS@
 
 libSalomeParallelContainer_la_LDFLAGS = -no-undefined -version-info=0:0:0
 
index c6969d61d316cce5d193f3c044952615d203f1e7..5ca8ec0c6780caee94a1b397de16dcb0750b7626 100644 (file)
@@ -32,8 +32,11 @@ Parallel_Salome_file_i::Parallel_Salome_file_i(CORBA::ORB_ptr orb,
                                               int rank) :
   InterfaceParallel_impl(orb,ior,rank), 
   Engines::Salome_file_serv(orb,ior,rank),
+  Engines::Salome_file_base_serv(orb,ior,rank),
   Engines::fileTransfer_serv(orb,ior,rank),
-  Engines::Parallel_Salome_file_serv(orb,ior,rank)
+  Engines::Parallel_Salome_file_serv(orb,ior,rank),
+  Engines::fileTransfer_base_serv(orb,ior,rank),
+  Engines::Parallel_Salome_file_base_serv(orb,ior,rank)
 {
   CORBA::Object_ptr obj = _orb->string_to_object(ior);
   proxy = Engines::Parallel_Salome_file::_narrow(obj);
index b2bcd852ce51d25ab1b00374f9843c5d3bc1f460..ee7ec3f0449f5a365e20c0f9634cd5aed692f03e 100644 (file)
@@ -32,7 +32,7 @@
 #include <map>
 #include <cstdio>
 
-#include "SALOME_ComponentPaCO_Engines_Parallel_Salome_file_server.h"
+#include "SALOME_PACOExtensionPaCO_Engines_Parallel_Salome_file_server.hxx"
 #include "Salome_file_i.hxx"
 
 class CONTAINER_EXPORT Parallel_Salome_file_i:
index 8e8cc6aee039c82c1e4b95072d231312e63245d2..80dbc354a570984924964a2409a2fde61a021501 100644 (file)
@@ -34,6 +34,7 @@
 #endif
 #include <cstdlib>
 #include "utilities.h"
+#include "Basics_Utils.hxx"
 
 #ifndef WIN32
 #include <sys/time.h>
@@ -55,21 +56,6 @@ static Engines_Parallel_Component_i * theEngines_Component ;
 bool Engines_Parallel_Component_i::_isMultiStudy = true;
 bool Engines_Parallel_Component_i::_isMultiInstance = false;
 
-//=============================================================================
-/*! 
- *  Default constructor, not for use
- */
-//=============================================================================
-
-Engines_Parallel_Component_i::Engines_Parallel_Component_i(CORBA::ORB_ptr orb, char * ior, int rank) : 
-  InterfaceParallel_impl(orb,ior,rank), 
-  Engines::Component_serv(orb,ior,rank), 
-  Engines::Parallel_Component_serv(orb,ior,rank)
-{
-  //ASSERT(0);
-  INFOS("Default Constructor...");
-}
-
 //=============================================================================
 /*! 
  *  Standard Constructor for generic Component, used in derived class
@@ -88,30 +74,39 @@ Engines_Parallel_Component_i::Engines_Parallel_Component_i(CORBA::ORB_ptr orb, c
                                         PortableServer::ObjectId * contId, 
                                         const char *instanceName,
                                         const char *interfaceName,
-                                         bool notif) :
+                                         bool notif,
+                                        bool regist) :
   InterfaceParallel_impl(orb,ior,rank), 
   Engines::Component_serv(orb,ior,rank),
+  Engines::Component_base_serv(orb,ior,rank),
   Engines::Parallel_Component_serv(orb,ior,rank),
+  Engines::Parallel_Component_base_serv(orb,ior,rank),
   _instanceName(instanceName),
   _interfaceName(interfaceName),
+  _id(NULL),
   _myConnexionToRegistry(0),
   _ThreadId(0) ,
   _ThreadCpuUsed(0) ,
   _Executed(false) ,
   _graphName("") ,
   _nodeName(""),
- _studyId(-1)
+  _studyId(-1),
+  _destroyed(false),
+  _CanceledThread(false)
 {
-  MESSAGE("Component constructor with instanceName "<< _instanceName);
+  MESSAGE("Parallel Component constructor with instanceName "<< _instanceName);
   //SCRUTE(pd_refCount);
   _orb = CORBA::ORB::_duplicate(orb);
   _poa = PortableServer::POA::_duplicate(poa);
   _contId = contId ;
   CORBA::Object_var o = _poa->id_to_reference(*contId); // container ior...
-  const CORBA::String_var the_ior = _orb->object_to_string(o);
-  _myConnexionToRegistry = new RegistryConnexion(0, 0, the_ior,"theSession",
-                                                _instanceName.c_str());
 
+  if (regist)
+  {
+    CORBA::String_var the_ior = _orb->object_to_string(o);
+    _myConnexionToRegistry = new RegistryConnexion(0, 0, the_ior,"theSession",
+                                                  _instanceName.c_str());
+  }
   _notifSupplier = new NOTIFICATION_Supplier(instanceName, notif);
 
   deploy_mutex = new pthread_mutex_t();
@@ -130,11 +125,15 @@ Engines_Parallel_Component_i::Engines_Parallel_Component_i(CORBA::ORB_ptr orb, c
 
 Engines_Parallel_Component_i::~Engines_Parallel_Component_i()
 {
-  MESSAGE("Component destructor");
+  MESSAGE("Parallel Component destructor");
   Engines_Parallel_Container_i::decInstanceCnt(_interfaceName);
+  if(_myConnexionToRegistry)delete _myConnexionToRegistry;
+  if(_notifSupplier)delete _notifSupplier;
+  if (_id)
+    delete(_id);
+
   pthread_mutex_destroy(deploy_mutex);
   delete deploy_mutex;
-
   if (_proxy)
     delete _proxy;
 }
@@ -183,7 +182,13 @@ CORBA::Long Engines_Parallel_Component_i::getStudyId()
 
 void Engines_Parallel_Component_i::ping()
 {
-  //  MESSAGE("Engines_Parallel_Component_i::ping_c() pid "<< getpid() << " threadid " << pthread_self());
+#ifndef WIN32
+  MESSAGE("Engines_Parallel_Component_i::ping() pid "<< getpid() << " threadid "
+          << pthread_self());
+#else
+  MESSAGE("Engines_Parallel_Component_i::ping() pid "<< _getpid()<< " threadid "
+          << pthread_self().p );
+#endif
 }
 
 //=============================================================================
@@ -200,20 +205,12 @@ void Engines_Parallel_Component_i::ping()
 void Engines_Parallel_Component_i::destroy()
 {
   MESSAGE("Engines_Parallel_Component_i::destroy()");
-  //SCRUTE(pd_refCount);
-
-  delete _notifSupplier;
-  _notifSupplier = 0;
-
-  delete _myConnexionToRegistry;
-  _myConnexionToRegistry = 0 ;
-  _poa->deactivate_object(*_id) ;
-  CORBA::release(_poa) ;
-  delete(_id) ;
-  //SCRUTE(pd_refCount);
-  _thisObj->_remove_ref();
-  //SCRUTE(pd_refCount);
-  MESSAGE("Engines_Parallel_Component_i::destroyed") ;
+  MESSAGE("Object Instance will be deleted when Shutdown of the container will be called");
+  if (!_destroyed)
+  {
+    _remove_ref();
+    _destroyed = true;
+  }
 }
 
 //=============================================================================
@@ -226,7 +223,7 @@ void Engines_Parallel_Component_i::destroy()
 Engines::Container_ptr Engines_Parallel_Component_i::GetContainerRef()
 {
   MESSAGE("Engines_Parallel_Component_i::GetContainerRef");
-  CORBA::Object_ptr o = _poa->id_to_reference(*_contId) ;
+  CORBA::Object_var o = _poa->id_to_reference(*_contId) ;
   return Engines::Container::_narrow(o);
 }
 
@@ -283,10 +280,10 @@ Engines::FieldsDict* Engines_Parallel_Component_i::getProperties()
 void Engines_Parallel_Component_i::Names( const char * graphName ,
                                  const char * nodeName )
 {
-  _graphName = graphName ;
-  _nodeName = nodeName ;
-  INFOS("Engines_Parallel_Component_i::Names( '" << _graphName << "' , '"
-       << _nodeName << "' )");
+  _graphName = graphName;
+  _nodeName = nodeName;
+  MESSAGE("Engines_Parallel_Component_i::Names( '" << _graphName << "' , '" 
+                                                  << _nodeName << "' )");
 }
 
 //=============================================================================
@@ -308,7 +305,7 @@ bool Engines_Parallel_Component_i::Kill_impl()
 #ifndef WIN32
   if ( _ThreadId > 0 && pthread_self() != _ThreadId )
     {
-      RetVal = Killer( _ThreadId , 0 ) ;
+      RetVal = Killer( _ThreadId , SIGUSR2 ) ;
       _ThreadId = (pthread_t ) -1 ;
     }
 
@@ -331,11 +328,19 @@ bool Engines_Parallel_Component_i::Kill_impl()
 
 bool Engines_Parallel_Component_i::Stop_impl()
 {
+#ifndef WIN32
   MESSAGE("Engines_Parallel_Component_i::Stop_i() pthread_t "<< pthread_self()
           << " pid " << getpid() << " instanceName "
           << _instanceName.c_str() << " interface " << _interfaceName.c_str()
           << " machineName " << Kernel_Utils::GetHostname().c_str()<< " _id " << hex << _id
           << dec << " _ThreadId " << _ThreadId );
+#else
+  MESSAGE("Engines_Parallel_Component_i::Stop_i() pthread_t "<< pthread_self().p
+          << " pid " << _getpid() << " instanceName "
+          << _instanceName.c_str() << " interface " << _interfaceName.c_str()
+          << " machineName " << Kernel_Utils::GetHostname().c_str()<< " _id " << hex << _id
+          << dec << " _ThreadId " << _ThreadId );
+#endif
   
 
   bool RetVal = false ;
@@ -363,11 +368,19 @@ bool Engines_Parallel_Component_i::Stop_impl()
 
 bool Engines_Parallel_Component_i::Suspend_impl()
 {
+#ifndef WIN32
   MESSAGE("Engines_Parallel_Component_i::Suspend_i() pthread_t "<< pthread_self()
           << " pid " << getpid() << " instanceName "
           << _instanceName.c_str() << " interface " << _interfaceName.c_str()
           << " machineName " << Kernel_Utils::GetHostname().c_str()<< " _id " << hex << _id
           << dec << " _ThreadId " << _ThreadId );
+#else
+  MESSAGE("Engines_Parallel_Component_i::Suspend_i() pthread_t "<< pthread_self().p
+          << " pid " << _getpid() << " instanceName "
+          << _instanceName.c_str() << " interface " << _interfaceName.c_str()
+          << " machineName " << Kernel_Utils::GetHostname().c_str()<< " _id " << hex << _id
+          << dec << " _ThreadId " << _ThreadId );
+#endif
 
   bool RetVal = false ;
 #ifndef WIN32
@@ -402,11 +415,19 @@ bool Engines_Parallel_Component_i::Suspend_impl()
 
 bool Engines_Parallel_Component_i::Resume_impl()
 {
+#ifndef WIN32
   MESSAGE("Engines_Parallel_Component_i::Resume_i() pthread_t "<< pthread_self()
           << " pid " << getpid() << " instanceName "
           << _instanceName.c_str() << " interface " << _interfaceName.c_str()
           << " machineName " << Kernel_Utils::GetHostname().c_str()<< " _id " << hex << _id
           << dec << " _ThreadId " << _ThreadId );
+#else
+  MESSAGE("Engines_Parallel_Component_i::Resume_i() pthread_t "<< pthread_self().p
+          << " pid " << _getpid() << " instanceName "
+          << _instanceName.c_str() << " interface " << _interfaceName.c_str()
+          << " machineName " << Kernel_Utils::GetHostname().c_str()<< " _id " << hex << _id
+          << dec << " _ThreadId " << _ThreadId );
+#endif
   bool RetVal = false ;
 #ifndef WIN32
   if ( _ThreadId > 0 && pthread_self() != _ThreadId )
@@ -542,8 +563,13 @@ PortableServer::ObjectId * Engines_Parallel_Component_i::getId()
 
 void Engines_Parallel_Component_i::beginService(const char *serviceName)
 {
+#ifndef WIN32
   MESSAGE(pthread_self() << "Send BeginService notification for " <<serviceName
-         << endl << "Component instance : " << _instanceName << endl << endl);
+         << endl << "Parallel Component instance : " << _instanceName << endl << endl);
+#else
+  MESSAGE(pthread_self().p << "Send BeginService notification for " <<serviceName
+         << endl << "Parallel Component instance : " << _instanceName << endl << endl);
+#endif
 #ifndef WIN32
   _ThreadId = pthread_self() ;
 #else
@@ -609,10 +635,18 @@ void Engines_Parallel_Component_i::beginService(const char *serviceName)
 
 void Engines_Parallel_Component_i::endService(const char *serviceName)
 {
-  _ThreadCpuUsed = CpuUsed_impl() ;
+  if ( !_CanceledThread )
+    _ThreadCpuUsed = CpuUsed_impl() ;
+
+#ifndef WIN32
   MESSAGE(pthread_self() << " Send EndService notification for " << serviceName
-         << endl << " Component instance : " << _instanceName << " StartUsed "
+         << endl << " Parallel Component instance : " << _instanceName << " StartUsed "
           << _StartUsed << " _ThreadCpuUsed "<< _ThreadCpuUsed << endl <<endl);
+#else
+  MESSAGE(pthread_self().p << " Send EndService notification for " << serviceName
+         << endl << " Parallel Component instance : " << _instanceName << " StartUsed "
+    << _StartUsed << " _ThreadCpuUsed "<< _ThreadCpuUsed << endl <<endl);
+#endif
   _ThreadId = 0 ;
 }
 
@@ -661,8 +695,13 @@ bool Engines_Parallel_Component_i::Killer( pthread_t ThreadId , int signum )
            }
          else
            {
+#ifndef WIN32
              MESSAGE(pthread_self() << "Killer : ThreadId " << ThreadId
                      << " pthread_canceled") ;
+#else
+        MESSAGE(pthread_self().p << "Killer : ThreadId " << ThreadId.p
+                     << " pthread_canceled") ;
+#endif
            }
        }
       else
@@ -674,8 +713,13 @@ bool Engines_Parallel_Component_i::Killer( pthread_t ThreadId , int signum )
            }
          else 
            {
-             MESSAGE(pthread_self() << "Killer : ThreadId " << ThreadId
+#ifndef WIN32
+        MESSAGE(pthread_self() << "Killer : ThreadId " << ThreadId
+                     << " pthread_killed(" << signum << ")") ;
+#else
+        MESSAGE(pthread_self().p << "Killer : ThreadId " << ThreadId.p
                      << " pthread_killed(" << signum << ")") ;
+#endif
            }
        }
     }
@@ -690,7 +734,8 @@ bool Engines_Parallel_Component_i::Killer( pthread_t ThreadId , int signum )
 
 void SetCpuUsed()
 {
-  theEngines_Component->SetCurCpu() ;
+  if (theEngines_Component)
+    theEngines_Component->SetCurCpu();
 }
 
 //=============================================================================
@@ -743,6 +788,23 @@ long Engines_Parallel_Component_i::CpuUsed()
   return cpu ;
 }
 
+void CallCancelThread()
+{
+  if ( theEngines_Component )
+    theEngines_Component->CancelThread() ;
+}
+
+//=============================================================================
+/*!
+ *  C++ method:
+ */
+//=============================================================================
+
+void Engines_Parallel_Component_i::CancelThread()
+{
+  _CanceledThread = true;
+}
+
 //=============================================================================
 /*! 
  *  C++ method: Send message to event channel
index 8f1f37e45cf6eea5f554a178829f50350f130fe1..530a66d881555bb9215aa75269d497efbba51f0b 100644 (file)
@@ -38,7 +38,7 @@
 #include <map>
 #include <SALOMEconfig.h>
 
-#include "SALOME_ComponentPaCO_Engines_Parallel_Component_server.h"
+#include "SALOME_PACOExtensionPaCO_Engines_Parallel_Component_server.hxx"
 
 #include "NOTIFICATION.hxx"
 #include "RegistryConnexion.hxx"
@@ -61,13 +61,13 @@ class CONTAINER_EXPORT Engines_Parallel_Component_i:
   public virtual PortableServer::RefCountServantBase
 {
 public:
-  Engines_Parallel_Component_i(CORBA::ORB_ptr orb, char * ior, int rank);
   Engines_Parallel_Component_i(CORBA::ORB_ptr orb, char * ior, int rank,
                               PortableServer::POA_ptr poa,
                               PortableServer::ObjectId * contId, 
                               const char *instanceName, 
                               const char *interfaceName,
-                              bool notif = false);
+                              bool notif = false,
+                              bool regist = true);
 
   virtual ~Engines_Parallel_Component_i();
 
@@ -112,6 +112,10 @@ public:
 
  void send_parallel_proxy_object(CORBA::Object_ptr proxy_ref);
 
+  // Object information
+  virtual bool hasObjectInfo() { return false; }
+  virtual char* getObjectInfo(CORBA::Long studyId, const char* entry) { return ""; }
+
   // --- local C++ methods
 
   PortableServer::ObjectId * getId(); 
@@ -130,6 +134,7 @@ public:
   bool Killer( pthread_t ThreadId , int signum );
   void SetCurCpu() ;
   long CpuUsed() ;
+  void CancelThread();
 
   void wait_parallel_object_proxy();
   char * get_parallel_proxy_object();
@@ -146,8 +151,8 @@ protected:
   std::string _instanceName ;
   std::string _interfaceName ;
 
-  CORBA::ORB_ptr _orb;
-  PortableServer::POA_ptr _poa;
+  CORBA::ORB_var _orb;
+  PortableServer::POA_var _poa;
   PortableServer::ObjectId * _id;
   PortableServer::ObjectId * _contId;
   Engines_Parallel_Component_i * _thisObj ;
@@ -196,6 +201,8 @@ private:
   long      _StartUsed ;
   long      _ThreadCpuUsed ;
   bool      _Executed ;
+  bool      _CanceledThread ;
+  bool     _destroyed;
 };
 
 #endif
index 61f5eda5c626218d2b63ede561af0d7be70458f4..e33ba98334eeabeea01c11f522bdb03f16bc9f51 100644 (file)
 #include "SALOME_NamingService.hxx"
 
 #include "utilities.h"
+#include "Basics_Utils.hxx"
 #include "Utils_ORB_INIT.hxx"
 #include "Utils_SINGLETON.hxx"
 #include "SALOMETraceCollector.hxx"
 #include "OpUtil.hxx"
 
+#include "Container_init_python.hxx"
+
 using namespace std;
 
 #ifdef _DEBUG_
@@ -119,15 +122,19 @@ int main(int argc, char* argv[])
 
   // Initialise the ORB.
   CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
+  KERNEL_PYTHON::init_python(argc,argv);
 
   std::string containerName("");
   if(argc > 1) {
     containerName = argv[1];
   }
-  std::string hostname("");
+  std::string proxy_hostname("");
   if(argc > 3) {
-    hostname = argv[3];
+    proxy_hostname = argv[3];
   }
+  int myid = 0;
+  if(argc > 4) 
+    sscanf(argv[4],"%d",&myid);
 
   try {  
     CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
@@ -141,10 +148,10 @@ int main(int argc, char* argv[])
     system(aCommand);
 #endif
 
-    SALOME_NamingService * ns = new SALOME_NamingService(CORBA::ORB::_duplicate(orb));
+    SALOME_NamingService * ns = new SALOME_NamingService(orb);
     // Get the proxy
     string proxyNameInNS = ns->BuildContainerNameForNS(containerName.c_str(), 
-                                                      hostname.c_str());
+                                                      proxy_hostname.c_str());
     obj = ns->Resolve(proxyNameInNS.c_str());
     char * proxy_ior = orb->object_to_string(obj);
 
@@ -152,10 +159,9 @@ int main(int argc, char* argv[])
     string node_name = containerName + "Node";
     Engines_Parallel_Container_i * servant = new Engines_Parallel_Container_i(CORBA::ORB::_duplicate(orb), 
                                                                              proxy_ior,
-                                                                             0,
+                                                                             myid,
                                                                              root_poa,
-                                                                             (char*) node_name.c_str(),
-                                                                             argc, argv);
+                                                                             node_name);
     // PaCO++ init
     paco_fabrique_manager * pfm = paco_getFabriqueManager();
     pfm->register_com("dummy", new paco_dummy_fabrique());
@@ -164,13 +170,10 @@ int main(int argc, char* argv[])
     servant->setLibThread("omni");
 
     // Activation
-    PortableServer::ObjectId * _id = root_poa->activate_object(servant);
-    servant->set_id(_id);
-    obj = root_poa->id_to_reference(*_id);
+    obj = servant->_this();
 
     // In the NamingService
     string hostname = Kernel_Utils::GetHostname();
-    int myid = 0;
     char buffer [5];
     snprintf(buffer, 5, "%d", myid);
     node_name = node_name + buffer;
@@ -180,6 +183,11 @@ int main(int argc, char* argv[])
     ns->Register(obj, _containerName.c_str());
     pman->activate();
     orb->run();
+    PyGILState_Ensure();
+    //Delete python container that destroy orb from python (pyCont._orb.destroy())
+    Py_Finalize();
+    CORBA::string_free(proxy_ior);
+    delete ns;
   }
   catch (PaCO::PACO_Exception& e)
   {
@@ -198,6 +206,13 @@ int main(int argc, char* argv[])
   {
     INFOS("Caught CORBA::Exception.");
   }
+  catch(omniORB::fatalException& fe) 
+  {
+    INFOS("Caught omniORB::fatalException:");
+    INFOS(" file: " << fe.file());
+    INFOS(" line: " << fe.line());
+    INFOS(" mesg: " << fe.errmsg());
+  }
   catch(std::exception& exc)
   {
     INFOS("Caught std::exception - "<<exc.what()); 
index 7c8f6afc86d69d5ddea64e694a259c190055e312..6ac427213f21cdd480c20ae681dc889e430c2201 100644 (file)
 #include "SALOME_NamingService.hxx"
 
 #include "utilities.h"
+#include "Basics_Utils.hxx"
 #include "Utils_ORB_INIT.hxx"
 #include "Utils_SINGLETON.hxx"
 #include "SALOMETraceCollector.hxx"
 #include "OpUtil.hxx"
 
+#include "Container_init_python.hxx"
+
 using namespace std;
 
 #ifdef _DEBUG_
 #include <signal.h>
 
-void test(int sigval) {
-  cerr << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
-  cerr << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
-  cerr << "SIGSEGV in :" << getpid() << endl;
-  cerr << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
-  cerr << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
-  while (1) {}
-}
-
 void handler(int t) {
   cerr << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
   cerr << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
@@ -128,13 +122,17 @@ int main(int argc, char* argv[])
   MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE ,&provided);
   MPI_Comm_rank(MPI_COMM_WORLD,&myid);
 
+#ifdef _DEBUG_
   if(getenv ("DEBUGGER"))
   {
     std::cerr << "Unexpected: unexpected exception !"  << std::endl;
     setsig(SIGSEGV,&Handler);
     set_terminate(&terminateHandler);
+    //set_terminate(__gnu_cxx::__verbose_terminate_handler);
     set_unexpected(&unexpectedHandler);
   }
+#endif
+
   cerr << "Level MPI_THREAD_SINGLE : " << MPI_THREAD_SINGLE << endl;
   cerr << "Level MPI_THREAD_SERIALIZED : " << MPI_THREAD_SERIALIZED << endl;
   cerr << "Level MPI_THREAD_FUNNELED : " << MPI_THREAD_FUNNELED << endl;
@@ -142,6 +140,7 @@ int main(int argc, char* argv[])
   cerr << "Level provided : " << provided << endl;
   // Initialise the ORB.
   CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
+  KERNEL_PYTHON::init_python(argc,argv);
 
   // Code pour choisir le reseau infiniband .....
   /*   string hostname_temp = GetHostname();
@@ -159,9 +158,9 @@ int main(int argc, char* argv[])
   std::string containerName("");
   containerName = argv[1];
 
-  std::string hostname("");
+  std::string proxy_hostname("");
   if(argc > 3) {
-    hostname = argv[3];
+    proxy_hostname = argv[3];
   }
 
   try {  
@@ -179,31 +178,26 @@ int main(int argc, char* argv[])
     SALOME_NamingService * ns = new SALOME_NamingService(CORBA::ORB::_duplicate(orb));
     // On récupère le proxy 
     string proxyNameInNS = ns->BuildContainerNameForNS(containerName.c_str(), 
-                                                      hostname.c_str());
+                                                      proxy_hostname.c_str());
     obj = ns->Resolve(proxyNameInNS.c_str());
     char * proxy_ior = orb->object_to_string(obj);
 
     // Node creation
     string node_name = containerName + "Node";
-    Engines_Parallel_Container_i * servant = 
-      new Engines_Parallel_Container_i(CORBA::ORB::_duplicate(orb), 
-                                      proxy_ior,
-                                      myid,
-                                      root_poa,
-                                      (char*) node_name.c_str(),
-                                      argc, argv);
+    Engines_Parallel_Container_i * servant =  new Engines_Parallel_Container_i(CORBA::ORB::_duplicate(orb), 
+                                                                              proxy_ior,
+                                                                              myid,
+                                                                              root_poa,
+                                                                              node_name);
     // PaCO++ init
     paco_fabrique_manager * pfm = paco_getFabriqueManager();
     pfm->register_com("mpi", new paco_mpi_fabrique());
     pfm->register_thread("omni", new paco_omni_fabrique());
-    MPI_Comm group = MPI_COMM_WORLD;
-    servant->setLibCom("mpi", &group);
+    servant->setLibCom("mpi", MPI_COMM_WORLD);
     servant->setLibThread("omni");
 
     // Activation
-    PortableServer::ObjectId * _id = root_poa->activate_object(servant);
-    servant->set_id(_id);
-    obj = root_poa->id_to_reference(*_id);
+    obj = servant->_this();
 
     // In the NamingService
     string hostname = Kernel_Utils::GetHostname();
@@ -213,12 +207,25 @@ int main(int argc, char* argv[])
     char buffer [5];
     snprintf(buffer, 5, "%d", myid);
     node_name = node_name + buffer;
+
+    // We register nodes in two different parts
+    // In the real machine name and in the proxy machine
     string _containerName = ns->BuildContainerNameForNS(node_name.c_str(),
                                                        hostname.c_str());
-    cerr << "---------" << _containerName << "----------" << endl;
+    string _proxymachine_containerName = ns->BuildContainerNameForNS(node_name.c_str(),
+                                                                    proxy_hostname.c_str());
+    cerr << "Register container node : " << _containerName << endl;
+    cerr << "Register container node : " << _proxymachine_containerName << endl;
     ns->Register(obj, _containerName.c_str());
+    ns->Register(obj, _proxymachine_containerName.c_str());
     pman->activate();
     orb->run();
+    PyGILState_Ensure();
+    //Delete python container that destroy orb from python (pyCont._orb.destroy())
+    Py_Finalize();
+    MPI_Finalize();
+    CORBA::string_free(proxy_ior);
+    delete ns;
   }
   catch (PaCO::PACO_Exception& e)
   {
@@ -245,9 +252,6 @@ int main(int argc, char* argv[])
   {
     INFOS("Caught unknown exception.");
   }
-
-  MPI_Finalize();
-
   return 0 ;
 }
 
index be5ee2add53943c6a59abdf885131a84fef38fef..3521a46d81d199fbc024f28a7f1b41c97724fc54 100644 (file)
 #include "SALOME_NamingService.hxx"
 
 #include "utilities.h"
+#include "Basics_Utils.hxx"
 #include "Utils_ORB_INIT.hxx"
 #include "Utils_SINGLETON.hxx"
 #include "SALOMETraceCollector.hxx"
 #include "OpUtil.hxx"
 
+#include "Container_init_python.hxx"
+
 #ifdef DEBUG_PARALLEL
 #include <signal.h>
 using namespace std;
@@ -71,12 +74,17 @@ int main(int argc, char* argv[])
 #endif
   // Initialise the ORB.
   CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
+  KERNEL_PYTHON::init_python(argc,argv);
 
   std::string containerName("");
   if(argc > 1) {
     containerName = argv[1];
   }
 
+  int nbnodes = 1;
+  if(argc > 4) 
+    sscanf(argv[4],"%d",&nbnodes);
+
   try {  
     CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
     ASSERT(!CORBA::is_nil(obj));
@@ -90,27 +98,28 @@ int main(int argc, char* argv[])
     system(aCommand);
 #endif
 
-    SALOME_NamingService * ns = new SALOME_NamingService(CORBA::ORB::_duplicate(orb));
-//    Engines::Container_proxy_impl * proxy = 
-//      new Engines::Container_proxy_impl(orb,
-//                                     new paco_omni_fabrique());
+    SALOME_NamingService * ns = new SALOME_NamingService(orb);
 
-    Container_proxy_impl_final * proxy = 
-      new Container_proxy_impl_final(orb,
-                                    new paco_omni_fabrique());
     // PaCO++ code
     paco_fabrique_manager* pfm = paco_getFabriqueManager();
     pfm->register_com("dummy", new paco_dummy_fabrique());
-    proxy->setLibCom("dummy", proxy);
     pfm->register_thread("omnithread", new paco_omni_fabrique());
+
+    Container_proxy_impl_final * proxy = 
+      new Container_proxy_impl_final(orb,
+                                    pfm->get_thread("omnithread"),
+                                    root_poa,
+                                    containerName);
+    proxy->setLibCom("dummy", proxy);
     proxy->setLibThread("omnithread");
     // Topo of the parallel object
     PaCO::PacoTopology_t serveur_topo;
-    serveur_topo.total = 1;
+    serveur_topo.total = nbnodes;
     proxy->setTopology(serveur_topo);
 
-    PortableServer::ObjectId_var _id = root_poa->activate_object(proxy);
-    obj = root_poa->id_to_reference(_id);
+    //PortableServer::ObjectId_var _id = root_poa->activate_object(proxy);
+    //obj = root_poa->id_to_reference(_id);
+    obj = proxy->_this();
 
     // In the NamingService
     string hostname = Kernel_Utils::GetHostname();
@@ -121,6 +130,10 @@ int main(int argc, char* argv[])
     ns->Register(pCont, _containerName.c_str());
     pman->activate();
     orb->run();
+    PyGILState_Ensure();
+    //Delete python container that destroy orb from python (pyCont._orb.destroy())
+    Py_Finalize();
+    delete ns;
   }
   catch (PaCO::PACO_Exception& e)
   {
index 49bb1899f5b482f2222edaa858fbcbe2f2e13ca1..f3029370e3b792a7a257ac67d1b8597239ca77a3 100644 (file)
 //#include "SALOME_ComponentPaCO_Engines_Container_server.h"
 #include "SALOME_ParallelContainerProxy_i.hxx"
 #include <paco_omni.h>
-#include <paco_mpi.h>
+#include <paco_dummy.h>
 
 #include <mpi.h>
 
 #include "SALOME_NamingService.hxx"
 
 #include "utilities.h"
+#include "Basics_Utils.hxx"
 #include "Utils_ORB_INIT.hxx"
 #include "Utils_SINGLETON.hxx"
 #include "SALOMETraceCollector.hxx"
 #include "OpUtil.hxx"
-using namespace std;
 
-#ifdef DEBUG_PARALLEL
+#include "Container_init_python.hxx"
+
+#ifdef _DEBUG_
 #include <signal.h>
+using namespace std;
+
+typedef void (*sighandler_t)(int);
+sighandler_t setsig(int sig, sighandler_t handler)
+{
+  struct sigaction context, ocontext;
+  context.sa_handler = handler;
+  sigemptyset(&context.sa_mask);
+  context.sa_flags = 0;
+  if (sigaction(sig, &context, &ocontext) == -1)
+    return SIG_ERR;
+  return ocontext.sa_handler;
+}
+
+void AttachDebugger()
+{
+  if(getenv ("DEBUGGER"))
+  {
+    std::stringstream exec;
+    exec << "$DEBUGGER SALOME_ParallelContainerProxyMpi " << getpid() << "&";
+    std::cerr << exec.str() << std::endl;
+    system(exec.str().c_str());
+    while(1);
+  }
+}
+
+void Handler(int theSigId)
+{
+  std::cerr << "SIGSEGV: "  << std::endl;
+  AttachDebugger();
+  //to exit or not to exit
+  exit(1);
+}
+
+void terminateHandler(void)
+{
+  std::cerr << "Terminate: not managed exception !"  << std::endl;
+  AttachDebugger();
+}
+
+void unexpectedHandler(void)
+{
+  std::cerr << "Unexpected: unexpected exception !"  << std::endl;
+  AttachDebugger();
+}
 
 void handler(int t) {
   cerr << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
@@ -67,7 +114,7 @@ int main(int argc, char* argv[])
 {
   INFOS("Launching a parallel Mpi proxy container");
 
-#ifdef DEBUG_PARALLEL
+#ifdef _DEBUG_
   signal(SIGSEGV, handler);
 #endif
 
@@ -75,6 +122,18 @@ int main(int argc, char* argv[])
   int provided;
   MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED ,&provided);
   CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
+  KERNEL_PYTHON::init_python(argc,argv);
+
+#ifdef _DEBUG_
+  if(getenv ("DEBUGGER"))
+  {
+    std::cerr << "Unexpected: unexpected exception !"  << std::endl;
+    setsig(SIGSEGV,&Handler);
+    //set_terminate(&terminateHandler);
+    set_terminate(__gnu_cxx::__verbose_terminate_handler);
+    set_unexpected(&unexpectedHandler);
+  }
+#endif
 
   std::string containerName("");
   containerName = argv[1];
@@ -95,27 +154,28 @@ int main(int argc, char* argv[])
 #endif
 
     SALOME_NamingService * ns = new SALOME_NamingService(CORBA::ORB::_duplicate(orb));
-//    Engines::Container_proxy_impl * proxy = 
-//      new Engines::Container_proxy_impl(orb, 
-//                                     new paco_omni_fabrique());
-    Container_proxy_impl_final * proxy = 
-      new Container_proxy_impl_final(orb, 
-                                    new paco_omni_fabrique());
 
     // PaCO++ code
     paco_fabrique_manager* pfm = paco_getFabriqueManager();
-    pfm->register_com("mpi", new paco_mpi_fabrique());
-    MPI_Comm group = MPI_COMM_WORLD;
-    proxy->setLibCom("mpi", &group);
+    pfm->register_com("dummy", new paco_dummy_fabrique());
     pfm->register_thread("omnithread", new paco_omni_fabrique());
+
+    Container_proxy_impl_final * proxy =   new Container_proxy_impl_final(orb,
+                                                                         pfm->get_thread("omnithread"),
+                                                                         root_poa,
+                                                                         containerName);
+
+    // PaCO++ code
+    proxy->setLibCom("dummy", proxy);
     proxy->setLibThread("omnithread");
     PaCO::PacoTopology_t serveur_topo;
     serveur_topo.total = nb_nodes;
     proxy->setTopology(serveur_topo);
 
     // Activation
-    PortableServer::ObjectId_var _id = root_poa->activate_object(proxy);
-    obj = root_poa->id_to_reference(_id);
+    //PortableServer::ObjectId_var _id = root_poa->activate_object(proxy);
+    //obj = root_poa->id_to_reference(_id);
+    obj = proxy->_this();
 
     // in the NamingService
     string hostname = Kernel_Utils::GetHostname();
@@ -126,6 +186,11 @@ int main(int argc, char* argv[])
     ns->Register(pCont, _containerName.c_str());
     pman->activate();
     orb->run();
+    PyGILState_Ensure();
+    //Delete python container that destroy orb from python (pyCont._orb.destroy())
+    Py_Finalize();
+    MPI_Finalize();
+    delete ns;
   }
   catch (PaCO::PACO_Exception& e)
   {
@@ -152,9 +217,6 @@ int main(int argc, char* argv[])
   {
     INFOS("Caught unknown exception.");
   }
-
-  MPI_Finalize();
-
   return 0 ;
 }
 
index dfdcab72d41b82c36a22e71fea947808fabb4a2c..ec268dc0192590ab2e80f30b7f0ec8843358ecca 100644 (file)
 //  SALOME_ParallelContainerProxy : implementation of container and engine for Parallel Kernel
 //  File   : SALOME_ParallelContainerProxy_i.cxx
 //  Author : André RIBES, EDF
-//
+
 #include "SALOME_ParallelContainerProxy_i.hxx"
 
 Container_proxy_impl_final::Container_proxy_impl_final(CORBA::ORB_ptr orb, 
                                                       paco_fabrique_thread * fab_thread, 
+                                                      PortableServer::POA_ptr poa,
+                                                      std::string containerName,
                                                       bool is_a_return_proxy) :
+  Engines::PACO_Container_proxy_impl(orb, fab_thread, is_a_return_proxy),
   Engines::Container_proxy_impl(orb, fab_thread, is_a_return_proxy),
   InterfaceManager_impl(orb, fab_thread, is_a_return_proxy)
-{}
+{
+  _numInstance = 0;
+  _hostname = Kernel_Utils::GetHostname();
+  _containerName = _NS->BuildContainerNameForNS(containerName.c_str(), _hostname.c_str());
+  _poa = PortableServer::POA::_duplicate(poa);
 
-Container_proxy_impl_final:: ~Container_proxy_impl_final() {}
+  _fab_thread = fab_thread;
+
+  // Add CORBA object to the poa
+  _id = _poa->activate_object(this);
+  this->_remove_ref();
+
+  // Init SALOME Naming Service
+  _NS = new SALOME_NamingService();
+  _NS->init_orb(_orb);
+
+  // Init Python container part
+  CORBA::Object_var container_node = _poa->id_to_reference(*_id);
+  CORBA::String_var sior =  _orb->object_to_string(container_node);
+  std::string myCommand="pyCont = SALOME_Container.SALOME_Container_i('";
+  myCommand += _containerName + "','";
+  myCommand += sior;
+  myCommand += "')\n";
+  Py_ACQUIRE_NEW_THREAD;
+  PyRun_SimpleString("import SALOME_Container\n");
+  PyRun_SimpleString((char*)myCommand.c_str());
+  Py_RELEASE_NEW_THREAD;
+}
+
+Container_proxy_impl_final:: ~Container_proxy_impl_final() {
+  if (_id)
+    delete _id;
+  if (_NS)
+    delete _NS;
+
+  // _fab_thread not deleted beacause fab_thread is managed
+  // by paco_fabrique_manager
+}
 
 void
 Container_proxy_impl_final::Shutdown()
 {
+  // We Start by destroying all the parallel object
+  std::list<Container_proxy_impl_final::proxy_object>::iterator itm;
+  for (itm = _par_obj_inst_list.begin(); itm != _par_obj_inst_list.end(); itm++)
+  {
+    try
+    {
+      ((*itm).proxy_corba_ref)->destroy();
+    }
+    catch(const CORBA::Exception& e)
+    {
+      // ignore this entry and continue
+    }
+    catch(...)
+    {
+      // ignore this entry and continue
+    }
+
+    // Destroy proxy object... parallel object nodes are
+    // destroyed into the Shutdown of each container nodes
+    _poa->deactivate_object(*((*itm).proxy_id));
+    if ((*itm).proxy_id)
+      delete (*itm).proxy_id;
+    if ((*itm).proxy_regist)
+      delete (*itm).proxy_regist;
+  }
+
+  // We call shutdown in each node
+  for (CORBA::ULong i = 0; i < _infos.nodes.length(); i++)
+  {
+    MESSAGE("Shutdown work node : " << i);
+    CORBA::Object_var object = _orb->string_to_object(_infos.nodes[i]);
+    Engines::Container_var node = Engines::Container::_narrow(object);
+    if (!CORBA::is_nil(node))
+    {
+      try 
+      {
+       node->Shutdown();
+       MESSAGE("Shutdown done node : " << i);
+      }
+      catch (...)
+      {
+       INFOS("Exception catch during Shutdown of node : " << i);
+      }
+    }
+    else
+    {
+      INFOS("Cannot shutdown node " << i << " ref is nil !");
+    }
+  }
+
   INFOS("Shutdown Parallel Proxy");
+  _NS->Destroy_FullDirectory(_containerName.c_str());
+  _NS->Destroy_Name(_containerName.c_str());
   if(!CORBA::is_nil(_orb))
     _orb->shutdown(0);
 }
 
+// On intercepte cette méthode pour pouvoir ensuite
+// déterminer si on doit créer une instance sequentielle
+// ou parallèle d'un composant dans la méthode create_component_instance
+CORBA::Boolean 
+Container_proxy_impl_final::load_component_Library(const char* componentName)
+{
+  MESSAGE("Begin of load_component_Library on proxy : " << componentName)
+  std::string aCompName = componentName;
+
+  CORBA::Boolean ret = true;
+  if (_libtype_map.count(aCompName) == 0)
+  {
+    _numInstanceMutex.lock(); // lock to be alone
+
+    // Default lib is seq
+    _libtype_map[aCompName] = "seq";
+
+    // --- try dlopen C++ component
+    // If is not a C++ or failed then is maybe 
+    // a seq component...
+
+    MESSAGE("Try to load C++ component");
+#ifndef WIN32
+    std::string impl_name = string ("lib") + aCompName + string("Engine.so");
+#else
+    std::string impl_name = aCompName + string("Engine.dll");
+#endif
+    void* handle;
+#ifndef WIN32
+    handle = dlopen( impl_name.c_str() , RTLD_LAZY ) ;
+#else
+    handle = dlopen( impl_name.c_str() , 0 ) ;
+#endif
+    if ( handle )
+    {
+      _library_map[impl_name] = handle;
+      MESSAGE("Library " << impl_name << " loaded");
+
+      //Test if lib could contain a parallel component
+
+      std::string paco_test_fct_signature = aCompName + std::string("_isAPACO_Component");
+      INFOS("SIG is : " << paco_test_fct_signature);
+      PACO_TEST_FUNCTION paco_test_fct = NULL;
+#ifndef WIN32
+      paco_test_fct = (PACO_TEST_FUNCTION)dlsym(handle, paco_test_fct_signature.c_str());
+#else
+      paco_test_fct = (PACO_TEST_FUNCTION)GetProcAddress((HINSTANCE)handle, paco_test_fct_signature.c_str());
+#endif
+      if (paco_test_fct)
+      {
+       // PaCO Component found
+       MESSAGE("PACO LIB FOUND");
+       _libtype_map[aCompName] = "par";
+      }
+      else
+      {
+       MESSAGE("SEQ LIB FOUND");
+#ifndef WIN32
+       MESSAGE("dlerror() result is : " << dlerror());
+#endif
+      }
+    }
+    else
+    {
+      MESSAGE("Error in importing Cpp component : " << impl_name);
+#ifndef WIN32
+      MESSAGE("dlerror() result is : " << dlerror());
+#endif
+
+      MESSAGE("Try to import Python component "<<componentName);
+      Py_ACQUIRE_NEW_THREAD;
+      PyObject *mainmod = PyImport_AddModule("__main__");
+      PyObject *globals = PyModule_GetDict(mainmod);
+      PyObject *pyCont = PyDict_GetItemString(globals, "pyCont");
+      PyObject *result = PyObject_CallMethod(pyCont,
+                                            (char*)"import_component",
+                                            (char*)"s",componentName);
+      int ret_p= PyInt_AsLong(result);
+      Py_XDECREF(result);
+      Py_RELEASE_NEW_THREAD;
+
+      if (ret_p) // import possible: Python component
+      {
+       MESSAGE("import Python: " << aCompName <<" OK");
+      }
+      else
+      {
+       MESSAGE("Error in importing Python component : " << aCompName);
+       ret = false;
+      }
+    }
+    _numInstanceMutex.unlock();
+  }
+
+  // Call load_component_Library in each node
+  if (ret)
+  {
+    for (CORBA::ULong i = 0; i < _infos.nodes.length(); i++)
+    {
+      MESSAGE("Call load_component_Library work node : " << i);
+      CORBA::Object_var object = _orb->string_to_object(_infos.nodes[i]);
+      Engines::Container_var node = Engines::Container::_narrow(object);
+      if (!CORBA::is_nil(node))
+      {
+       try 
+       {
+         node->load_component_Library(componentName);
+         MESSAGE("Call load_component_Library done node : " << i);
+       }
+       catch (...)
+       {
+         INFOS("Exception catch during load_component_Library of node : " << i);
+         ret = false;
+       }
+      }
+      else
+      {
+       INFOS("Cannot call load_component_Library node " << i << " ref is nil !");
+       ret = false;
+      }
+    }
+  }
+
+  // If ret is false -> lib is not loaded !
+  if (!ret)
+  {
+    INFOS("Cannot call load_component_Library " << aCompName);
+    _libtype_map.erase(aCompName);
+  }
+  return ret;
+}
+
+// Il y a deux cas :
+// Composant sequentiel -> on le créer sur le noeud 0 (on pourrait faire une répartition de charge)
+// Composant parallèle -> création du proxy ici puis appel de la création de chaque objet participant
+// au composant parallèle
+Engines::Component_ptr 
+Container_proxy_impl_final::create_component_instance(const char* componentName, ::CORBA::Long studyId)
+{
+  std::string aCompName = componentName;
+  if (_libtype_map.count(aCompName) == 0)
+  {
+    // Component is not loaded !
+    INFOS("Proxy: component is not loaded ! : " << aCompName);
+    return Engines::Component::_nil();
+  }
+
+  // If it is a sequential component
+  if (_libtype_map[aCompName] == "seq")
+  {
+    _numInstanceMutex.lock(); // lock on the instance number
+    _numInstance++;
+    _numInstanceMutex.unlock();
+    Engines::PACO_Container_proxy_impl::updateInstanceNumber();
+    return Engines::Container_proxy_impl::create_component_instance(componentName, studyId);
+  }
+
+  // Parallel Component !
+  Engines::Component_var component_proxy = Engines::Component::_nil();
+
+  // On commence par créer le proxy
+#ifndef WIN32
+  std::string impl_name = string ("lib") + aCompName + string("Engine.so");
+#else
+  std::string impl_name = aCompName + string("Engine.dll");
+#endif
+  void* handle = _library_map[impl_name];
+  std::string factory_name = aCompName + std::string("EngineProxy_factory");
+
+  MESSAGE("Creating component proxy : " << factory_name);
+  FACTORY_FUNCTION component_proxy_factory = (FACTORY_FUNCTION) dlsym(handle, factory_name.c_str());
+
+  if (!component_proxy_factory)
+  {
+    INFOS("Can't resolve symbol: " + factory_name);
+#ifndef WIN32
+    INFOS("dlerror() result is : " << dlerror());
+#endif
+    return Engines::Component::_nil() ;
+  }
+  try {
+    _numInstanceMutex.lock() ; // lock on the instance number
+    _numInstance++ ;
+    int numInstance = _numInstance ;
+    _numInstanceMutex.unlock() ;
+
+    char aNumI[12];
+    sprintf( aNumI , "%d" , numInstance ) ;
+    string instanceName = aCompName + "_inst_" + aNumI ;
+    string component_registerName = _containerName + "/" + instanceName;
+
+    // --- Instanciate required CORBA object
+    Container_proxy_impl_final::proxy_object * proxy = new Container_proxy_impl_final::proxy_object();
+    
+    proxy->proxy_id = (component_proxy_factory) (_orb, 
+                                                _fab_thread,
+                                                _poa, 
+                                                _id,
+                                                &(proxy->proxy_regist),
+                                                instanceName.c_str(), 
+                                                _parallel_object_topology.total);
+
+    // --- get reference & servant from id
+    CORBA::Object_var obj = _poa->id_to_reference(*(proxy->proxy_id));
+    component_proxy = Engines::Component::_narrow(obj);
+    proxy->proxy_corba_ref = component_proxy;
+
+    if (!CORBA::is_nil(component_proxy))
+    {
+      _cntInstances_map[impl_name] += 1;
+      _par_obj_inst_list.push_back(*proxy);
+      delete proxy;
+
+      // --- register the engine under the name
+      //     containerName(.dir)/instanceName(.object)
+      _NS->Register(component_proxy , component_registerName.c_str()) ;
+      MESSAGE(component_registerName.c_str() << " bound" ) ;
+    }
+    else
+    {
+      INFOS("The factory returns a nil object !");
+      return Engines::Component::_nil();
+    }
+      
+  }
+  catch (...)
+  {
+    INFOS( "Exception catched in Proxy creation" );
+    return Engines::Component::_nil();
+  }
+
+  // Create on each node a work node
+  for (CORBA::ULong i = 0; i < _infos.nodes.length(); i++)
+  {
+    MESSAGE("Call create_paco_component_node_instance on work node : " << i);
+    CORBA::Object_var object = _orb->string_to_object(_infos.nodes[i]);
+    Engines::PACO_Container_var node = Engines::PACO_Container::_narrow(object);
+    if (!CORBA::is_nil(node))
+    {
+      try 
+      {
+       node->create_paco_component_node_instance(componentName, _containerName.c_str(), studyId);
+       MESSAGE("Call create_paco_component_node_instance done on node : " << i);
+      }
+      catch (SALOME::SALOME_Exception & ex)
+      {
+       INFOS("SALOME_EXCEPTION : " << ex.details.text);
+       return Engines::Component::_nil();
+      }
+      catch (...)
+      {
+       INFOS("Unknown Exception catch during create_paco_component_node_instance on node : " << i);
+       return Engines::Component::_nil();
+      }
+    }
+    else
+    {
+      INFOS("Cannot call create_paco_component_node_instance on node " << i << " ref is nil !");
+      return Engines::Component::_nil();
+    }
+  }
+
+  // Start Parallel object
+  PaCO::InterfaceManager_var paco_proxy = PaCO::InterfaceManager::_narrow(component_proxy);
+  paco_proxy->start();
+
+  return component_proxy;
+}
index c35cddd6ca96030590040ae9a82b875c87b939d2..6e4c56db47274168ef1ebe4890fb7febacae3a33 100644 (file)
 //  SALOME_ParallelContainerProxy : implementation of container and engine for Parallel Kernel
 //  File   : SALOME_ParallelContainerProxy_i.hxx
 //  Author : André RIBES, EDF
-//
+
 #ifndef _SALOME_PARALLEL_CONTAINER_PROXY_I_HXX_
 #define _SALOME_PARALLEL_CONTAINER_PROXY_I_HXX_
 
 #include "utilities.h"
-#include "SALOME_ComponentPaCO_Engines_Container_server.h"
+#include "Basics_Utils.hxx"
+#include "SALOME_PACOExtensionPaCO_Engines_PACO_Container_server.hxx"
+#include "SALOME_ParallelGlobalProcessVar_i.hxx"
+#include "SALOME_NamingService.hxx"
+#include "RegistryConnexion.hxx"
+#include <map>
+#include <dlfcn.h>
+#include <paco_omni.h>
+
+#include <Python.h>
+#include "Container_init_python.hxx"
 
 class Container_proxy_impl_final :
-  public Engines::Container_proxy_impl
+  virtual public Engines::PACO_Container_proxy_impl,
+  virtual public ParallelGlobalProcessVar_i
 {
   public:
     Container_proxy_impl_final(CORBA::ORB_ptr orb, 
-                              paco_fabrique_thread * fab_thread, 
+                              paco_fabrique_thread * fab_thread,
+                              PortableServer::POA_ptr poa,
+                              std::string containerName,
                               bool is_a_return_proxy = false);
 
     virtual ~Container_proxy_impl_final();
 
     virtual void Shutdown();
+
+    virtual ::CORBA::Boolean load_component_Library(const char* componentName);
+    virtual Engines::Component_ptr create_component_instance(const char* componentName, ::CORBA::Long studyId);
+
+  private:
+    std::map<std::string, std::string> _libtype_map; // libname -> libtype (seq ou par)
+
+    struct proxy_object
+    {
+      Engines::Component_var     proxy_corba_ref;
+      PortableServer::ObjectId * proxy_id;
+      RegistryConnexion *       proxy_regist;
+    };
+
+    // Cette liste contient les references vers les différentes
+    // instances d'objets parallèles.
+    std::list<Container_proxy_impl_final::proxy_object> _par_obj_inst_list;
+
+    // Fonction de test pour savoir si les objets de la bib sont
+    // parallèles ou sequentiels
+    typedef void (*PACO_TEST_FUNCTION) ();
+    typedef PortableServer::ObjectId * (*FACTORY_FUNCTION) (CORBA::ORB_ptr,
+                                                           paco_fabrique_thread *,
+                                                           PortableServer::POA_ptr,
+                                                           PortableServer::ObjectId *,
+                                                           RegistryConnexion **,
+                                                           const char *,
+                                                           int);
+    int _numInstance;
+    std::string _hostname;
+    std::string _containerName;
+    PortableServer::POA_var _poa;
+    PortableServer::ObjectId * _id;
+    SALOME_NamingService *_NS;
+
+    paco_fabrique_thread * _fab_thread; 
 };
 
 #endif
index 52f5e70704c5459bf8dd69ee1945299fb587b894..1213347d2aa049811e81375639d9b78ac1d2f7c7 100644 (file)
 //
 //  SALOME_ParallelContainer : implementation of container and engine for ParallelKernel
 //  File   : SALOME_ParallelContainer_i.cxx
-//  Author : Andr� RIBES, EDF
-//  Author : Paul RASCLE, EDF - MARC TAJCHMAN, CEA 
-//
-#include <SALOMEconfig.h>
-#ifndef WIN32
-#else
-#include <SALOME_Component.hxx>
-#endif
-#include "SALOME_ParallelContainer_i.hxx"
+//  Author : André RIBES, EDF
 
+#include "SALOME_ParallelContainer_i.hxx"
 #include "SALOME_Component_i.hxx"
-
 #include "SALOME_FileRef_i.hxx"
 #include "SALOME_FileTransfer_i.hxx"
 #include "SALOME_NamingService.hxx"
 #include "OpUtil.hxx"
+#include "utilities.h"
+#include "Basics_Utils.hxx"
 
 #include <string.h>
 #include <stdio.h>
 #ifndef WIN32
+#include <sys/time.h>
 #include <dlfcn.h>
 #include <unistd.h>
 #else
-#include "../../adm/win32/SALOME_WNT.hxx"
 #include <signal.h>
 #include <process.h>
+#include <direct.h>
 int SIGUSR1 = 1000;
 #endif
 
 #include <paco_omni.h>
-#include "utilities.h"
+
+#include <Python.h>
+#include "Container_init_python.hxx"
+
 using namespace std;
 
 bool _Sleeping = false ;
 
-// Containers with name FactoryServer are started via rsh in LifeCycleCORBA
-// Other Containers are started via start_impl of FactoryServer
-
 extern "C" {void ActSigIntHandler() ; }
 #ifndef WIN32
 extern "C" {void SigIntHandler(int, siginfo_t *, void *) ; }
@@ -66,30 +61,14 @@ extern "C" {void SigIntHandler(int, siginfo_t *, void *) ; }
 extern "C" {void SigIntHandler( int ) ; }
 #endif
 
-
-map<std::string, int> Engines_Parallel_Container_i::_cntInstances_map;
-map<std::string, void *> Engines_Parallel_Container_i::_library_map;
-map<std::string, void *> Engines_Parallel_Container_i::_toRemove_map;
-omni_mutex Engines_Parallel_Container_i::_numInstanceMutex ;
-
-//=============================================================================
-/*! 
- *  Default constructor, not for use
+/*! \class Engines_Parallel_Container_i
+ *  \brief C++ implementation of Engines::Container interface for parallel
+ *  container implemented with PaCO++
  */
-//=============================================================================
-
-Engines_Parallel_Container_i::Engines_Parallel_Container_i (CORBA::ORB_ptr orb, 
-                                                           char * ior, 
-                                                           int rank) : 
-  InterfaceParallel_impl(orb,ior,rank), 
-  Engines::Container_serv(orb,ior,rank),
-  _numInstance(0)
-{
-}
 
 //=============================================================================
 /*! 
- *  Construtor to use
+ *  Construtor
  */
 //=============================================================================
 
@@ -97,33 +76,54 @@ Engines_Parallel_Container_i::Engines_Parallel_Container_i (CORBA::ORB_ptr orb,
                                                            char * ior, 
                                                            int rank,
                                                            PortableServer::POA_ptr poa,
-                                                           char *containerName ,
-                                                           int argc , char* argv[],
-                                                           bool activAndRegist,
-                                                           bool isServantAloneInProcess
-                                                          ) :
+                                                           std::string containerName,
+                                                           bool isServantAloneInProcess) :
   InterfaceParallel_impl(orb,ior,rank), 
+  Engines::PACO_Container_serv(orb,ior,rank),
+  Engines::PACO_Container_base_serv(orb,ior,rank),
   Engines::Container_serv(orb,ior,rank),
+  Engines::Container_base_serv(orb,ior,rank),
   _numInstance(0),_isServantAloneInProcess(isServantAloneInProcess)
 {
-  _pid = (long)getpid();
-
-  if(activAndRegist)
-    ActSigIntHandler() ;
-
-  _argc = argc ;
-  _argv = argv ;
-
-  string hostname = Kernel_Utils::GetHostname();
-
-  _orb = CORBA::ORB::_duplicate(orb) ;
-  _poa = PortableServer::POA::_duplicate(poa) ;
+  // Members init
+  _pid = getpid();
+  _hostname = Kernel_Utils::GetHostname();
+  _orb = CORBA::ORB::_duplicate(orb);
+  _poa = PortableServer::POA::_duplicate(poa);
+
+  // Add CORBA object to the poa
+  _id = _poa->activate_object(this);
+  this->_remove_ref();
+  CORBA::Object_var container_node = _poa->id_to_reference(*_id);
+
+  // Adding this servant to SALOME
   _NS = new SALOME_NamingService();
-  _NS->init_orb( CORBA::ORB::_duplicate(_orb) );
-  _containerName = _NS->BuildContainerNameForNS(containerName, hostname.c_str());
-
+  _NS->init_orb(_orb);
+  _containerName = _NS->BuildContainerNameForNS(containerName.c_str(), _hostname.c_str());
+
+  // Ajout du numero de noeud
+  char node_number[12];
+  sprintf(node_number, "%d", getMyRank());
+  _containerName = _containerName + node_number;
+
+  // Init Python container part
+  CORBA::String_var sior =  _orb->object_to_string(container_node);
+  std::string myCommand="pyCont = SALOME_Container.SALOME_Container_i('";
+  myCommand += _containerName + "','";
+  myCommand += sior;
+  myCommand += "')\n";
+  Py_ACQUIRE_NEW_THREAD;
+  PyRun_SimpleString("import SALOME_Container\n");
+  PyRun_SimpleString((char*)myCommand.c_str());
+  Py_RELEASE_NEW_THREAD;
+
+  // Init FileTransfer service
   fileTransfer_i* aFileTransfer = new fileTransfer_i();
-  _fileTransfer = Engines::fileTransfer::_narrow(aFileTransfer->_this());
+  _fileTransfer = aFileTransfer->_this();
+  aFileTransfer->_remove_ref();
+
+  // Some signal handlers
+  ActSigIntHandler();
 }
 
 //=============================================================================
@@ -135,10 +135,14 @@ Engines_Parallel_Container_i::Engines_Parallel_Container_i (CORBA::ORB_ptr orb,
 Engines_Parallel_Container_i::~Engines_Parallel_Container_i()
 {
   MESSAGE("Container_i::~Container_i()");
-  delete _id;
+  if (_id)
+    delete _id;
+  if(_NS)
+    delete _NS;
 }
 
 //=============================================================================
+//! Get container name
 /*! 
  *  CORBA attribute: Container name (see constructor)
  */
@@ -150,6 +154,42 @@ char* Engines_Parallel_Container_i::name()
 }
 
 //=============================================================================
+//! Get container working directory
+/*! 
+ *  CORBA attribute: Container working directory 
+ */
+//=============================================================================
+
+char* 
+Engines_Parallel_Container_i::workingdir()
+{
+  char wd[256];
+  getcwd (wd,256);
+  return CORBA::string_dup(wd) ;
+}
+
+//=============================================================================
+//! Get container log file name
+/*! 
+ *  CORBA attribute: Container log file name
+ */
+//=============================================================================
+
+char* 
+Engines_Parallel_Container_i::logfilename()
+{
+  return CORBA::string_dup(_logfilename.c_str()) ;
+}
+
+//! Set container log file name
+void 
+Engines_Parallel_Container_i::logfilename(const char* name)
+{
+  _logfilename=name;
+}
+
+//=============================================================================
+//! Get container host name
 /*! 
  *  CORBA method: Get the hostName of the Container (without domain extensions)
  */
@@ -157,12 +197,12 @@ char* Engines_Parallel_Container_i::name()
 
 char* Engines_Parallel_Container_i::getHostName()
 {
-  string s = Kernel_Utils::GetHostname();
-  MESSAGE("Engines_Parallel_Container_i::getHostName " << s);
-  return CORBA::string_dup(s.c_str()) ;
+  MESSAGE("Warning: getHostName of a parallel container returns the hostname of the first servant node");
+  return CORBA::string_dup(_hostname.c_str()) ;
 }
 
 //=============================================================================
+//! Get container PID
 /*! 
  *  CORBA method: Get the PID (process identification) of the Container
  */
@@ -170,10 +210,12 @@ char* Engines_Parallel_Container_i::getHostName()
 
 CORBA::Long Engines_Parallel_Container_i::getPID()
 {
-  return (CORBA::Long)getpid();
+  MESSAGE("Warning: getPID of a parallel container returns the PID of the first servant node");
+  return _pid;
 }
 
 //=============================================================================
+//! Ping the servant to check it is still alive
 /*! 
  *  CORBA method: check if servant is still alive
  */
@@ -181,10 +223,11 @@ CORBA::Long Engines_Parallel_Container_i::getPID()
 
 void Engines_Parallel_Container_i::ping()
 {
-  MESSAGE("Engines_Parallel_Container_i::ping() pid "<< getpid());
+  MESSAGE("Engines_Parallel_Container_i::ping() my pid is "<< _pid);
 }
 
 //=============================================================================
+//! Shutdown the container
 /*! 
  *  CORBA method, oneway: Server shutdown. 
  *  - Container name removed from naming service,
@@ -196,20 +239,46 @@ void Engines_Parallel_Container_i::ping()
 void Engines_Parallel_Container_i::Shutdown()
 {
   MESSAGE("Engines_Parallel_Container_i::Shutdown()");
+
+  /* For each seq component contained in this container
+  * tell it to self-destroy
+  */
+  std::map<std::string, Engines::Component_var>::iterator itm;
+  for (itm = _listInstances_map.begin(); itm != _listInstances_map.end(); itm++)
+  {
+    try
+    {
+      itm->second->destroy();
+    }
+    catch(const CORBA::Exception& e)
+    {
+      // ignore this entry and continue
+    }
+    catch(...)
+    {
+      // ignore this entry and continue
+    }
+  }
+
+  // Destroy each parallel component node...
+  std::map<std::string, PortableServer::ObjectId *>::iterator i;
+  for (i = _par_obj_inst_map.begin(); i != _par_obj_inst_map.end(); i++)
+    _poa->deactivate_object(*(i->second));
+
   _NS->Destroy_FullDirectory(_containerName.c_str());
-  //_remove_ref();
-  //_poa->deactivate_object(*_id);
+  _NS->Destroy_Name(_containerName.c_str());
+
   if(_isServantAloneInProcess)
   {
     MESSAGE("Effective Shutdown of container Begins...");
-    LocalTraceBufferPool* bp1 = LocalTraceBufferPool::instance();
-    bp1->deleteInstance(bp1);
-    _orb->shutdown(0);
+    if(!CORBA::is_nil(_orb))
+      _orb->shutdown(0);
   }
 }
 
 
 //=============================================================================
+//! load a new component class
 /*! 
  *  CORBA method: load a new component class (Python or C++ implementation)
  *  \param componentName like COMPONENT
@@ -222,54 +291,86 @@ void Engines_Parallel_Container_i::Shutdown()
 bool
 Engines_Parallel_Container_i::load_component_Library(const char* componentName)
 {
+  MESSAGE("Begin of load_component_Library : " << componentName)
   bool ret = false;
-  string aCompName = componentName;
-  // --- try dlopen C++ component
-
+  std::string aCompName = componentName;
 #ifndef WIN32
   string impl_name = string ("lib") + aCompName + string("Engine.so");
 #else
   string impl_name = aCompName + string("Engine.dll");
 #endif
 
-  SCRUTE(impl_name);
-
   _numInstanceMutex.lock(); // lock to be alone 
-  if (_toRemove_map[impl_name]) _toRemove_map.erase(impl_name);
-  if (_library_map[impl_name])
+
+  // Check if already loaded or imported in the container
+  if (_toRemove_map.count(impl_name) != 0) _toRemove_map.erase(impl_name);
+  if (_library_map.count(impl_name) != 0)
   {
     MESSAGE("Library " << impl_name << " already loaded");
-    _numInstanceMutex.unlock();
+    ret = true;
+  }
+  if (_library_map.count(aCompName) != 0)
+  {
+    MESSAGE("Python component already imported");
     ret = true;
   }
 
-  void* handle;
+  // --- try dlopen C++ component
+  if (!ret)
+  {
+    MESSAGE("Try to load C++ component");
+    void* handle;
 #ifndef WIN32
-  handle = dlopen( impl_name.c_str() , RTLD_LAZY ) ;
+    handle = dlopen( impl_name.c_str() , RTLD_LAZY ) ;
 #else
-  handle = dlopen( impl_name.c_str() , 0 ) ;
+    handle = dlopen( impl_name.c_str() , 0 ) ;
 #endif
-  if ( handle )
-  {
-    _library_map[impl_name] = handle;
-    _numInstanceMutex.unlock();
-    ret = true;
+    if ( handle )
+    {
+      _library_map[impl_name] = handle;
+      MESSAGE("Library " << impl_name << " loaded");
+      ret = true;
+    }
+    else
+    {
+      std::cerr << "Can't load shared library : " << impl_name << std::endl;
+      std::cerr << "error of dlopen: " << dlerror() << std::endl;
+    }
   }
-  else
+
+  // --- try import Python component
+  if (!ret)
   {
-    cerr << "Can't load shared library : " << impl_name << endl;
-    cerr << "error dlopen: " << dlerror() << endl;
-    _numInstanceMutex.unlock();
-    ret = false;
+    MESSAGE("Try to import Python component "<<componentName);
+    Py_ACQUIRE_NEW_THREAD;
+    PyObject *mainmod = PyImport_AddModule("__main__");
+    PyObject *globals = PyModule_GetDict(mainmod);
+    PyObject *pyCont = PyDict_GetItemString(globals, "pyCont");
+    PyObject *result = PyObject_CallMethod(pyCont,
+                                          (char*)"import_component",
+                                          (char*)"s",componentName);
+    int ret_p= PyInt_AsLong(result);
+    Py_XDECREF(result);
+    Py_RELEASE_NEW_THREAD;
+
+    if (ret_p) // import possible: Python component
+    {
+      _library_map[aCompName] = (void *)pyCont; // any non O value OK
+      MESSAGE("import Python: " << aCompName <<" OK");
+      ret = true;
+    }
+    else
+    {
+      std::cerr << "Error in importing Python component : " << aCompName << std::endl;
+    }
   }
 
-  // To be sure that all the nodes of the component as loaded the library
-  _my_com->paco_barrier();
-
+  _numInstanceMutex.unlock();
   return ret;
 }
 
 //=============================================================================
+//! Create a new component instance
 /*! 
  *  CORBA method: Creates a new servant instance of a component.
  *  The servant registers itself to naming service and Registry.
@@ -285,7 +386,7 @@ Engines::Component_ptr
 Engines_Parallel_Container_i::create_component_instance(const char*genericRegisterName,
                                                        CORBA::Long studyId)
 {
-  cerr << "----------------- create_component_instance node : " << getMyRank() << endl;
+  MESSAGE("Begin of create_component_instance in node : " << getMyRank());
 
   if (studyId < 0)
   {
@@ -293,52 +394,43 @@ Engines_Parallel_Container_i::create_component_instance(const char*genericRegist
     return Engines::Component::_nil() ;
   }
 
-  Engines::Component_var iobject = Engines::Component::_nil() ;
-
-  // is it a parallel component ?
-  bool parallel = false;
-  string aCompName = genericRegisterName;
-  int par = aCompName.find("@PARALLEL@");
-  if (par>0) {
-    parallel = true;
-    aCompName = aCompName.substr(0,par);
-  }
-
-  //--- try C++
+  std::string aCompName = genericRegisterName;
 #ifndef WIN32
   string impl_name = string ("lib") + aCompName +string("Engine.so");
 #else
   string impl_name = aCompName +string("Engine.dll");
 #endif
-  void* handle = _library_map[impl_name];
 
-  if ( !handle )
+  _numInstanceMutex.lock();
+  _numInstance++;
+
+  // Test if the component lib is loaded
+  std::string type_of_lib("Not Loaded");
+  void* handle = _library_map[impl_name];
+  if (handle)
+    type_of_lib = "cpp";
+  if (_library_map.count(aCompName) != 0 and !handle)
+    type_of_lib = "python";
+  
+  if (type_of_lib == "Not Loaded")
   {
-    cerr << "shared library " << impl_name <<"must be loaded before instance" << endl;;
-    return Engines::Component::_nil() ;
+    std::cerr << "Component library is not loaded or imported ! lib was : " << aCompName << std::endl;
+    _numInstanceMutex.unlock();
+    return Engines::Component::_nil();
   }
-  else
-  {
-    if (parallel) {
-      // Sequential component case
-      // Component parallel proxy created on node 0
-      iobject = createParallelInstance(aCompName,
-                                      handle,
-                                      studyId);
 
-    }
-    else {
-      // Sequential component case
-      iobject = createInstance(aCompName,
-                              handle,
-                              studyId);
-    }
+  Engines::Component_var iobject = Engines::Component::_nil();
+  if (type_of_lib == "cpp")
+    iobject = createCPPInstance(aCompName, handle, studyId);
+  else
+    iobject = createPythonInstance(aCompName, studyId);
 
-    return iobject._retn();
-  }
+  _numInstanceMutex.unlock();
+  return iobject._retn();
 }
 
 //=============================================================================
+//! Find an existing (in the container) component instance
 /*! 
  *  CORBA method: Finds a servant instance of a component
  *  \param registeredName  Name of the component in Registry or Name Service,
@@ -372,6 +464,7 @@ Engines::Component_ptr Engines_Parallel_Container_i::find_component_instance( co
 }
 
 //=============================================================================
+//! Find or create a new component instance
 /*! 
  *  CORBA method: find or create an instance of the component (servant),
  *  load a new component class (dynamic library) if required,
@@ -388,15 +481,15 @@ Engines::Component_ptr Engines_Parallel_Container_i::find_component_instance( co
 Engines::Component_ptr Engines_Parallel_Container_i::load_impl( const char* genericRegisterName,
                                                                const char* componentName )
 {
-  string impl_name = string ("lib") + genericRegisterName +string("Engine.so");
-  Engines::Component_var iobject = Engines::Component::_nil() ;
+  Engines::Component_var iobject = Engines::Component::_nil();
   if (load_component_Library(genericRegisterName))
-    iobject = find_or_create_instance(genericRegisterName, impl_name);
+    iobject = find_or_create_instance(genericRegisterName);
   return iobject._retn();
 }
 
 
 //=============================================================================
+//! Remove the component instance from container
 /*! 
  *  CORBA method: Stops the component servant, and deletes all related objects
  *  \param component_i     Component to be removed
@@ -405,15 +498,26 @@ Engines::Component_ptr Engines_Parallel_Container_i::load_impl( const char* gene
 
 void Engines_Parallel_Container_i::remove_impl(Engines::Component_ptr component_i)
 {
-  ASSERT(! CORBA::is_nil(component_i));
-  string instanceName = component_i->instanceName() ;
-  MESSAGE("unload component " << instanceName);
-  _listInstances_map.erase(instanceName);
-  component_i->destroy() ;
-  _NS->Destroy_Name(instanceName.c_str());
+  ASSERT(!CORBA::is_nil(component_i));
+  string instanceName = component_i->instanceName();
+  _numInstanceMutex.lock() ; // lock to be alone (stl container write)
+  // Test if the component is in this container
+  std::map<std::string, Engines::Component_var>::iterator itm;
+  itm = _listInstances_map.find(instanceName);
+  if (itm != _listInstances_map.end())
+  {
+    MESSAGE("Unloading component " << instanceName);
+    _listInstances_map.erase(instanceName);
+    component_i->destroy() ;
+    _NS->Destroy_Name(instanceName.c_str());
+  }
+  else
+    std::cerr << "WARNING !!!! component instance was not in this container !!!" << std::endl;
+  _numInstanceMutex.unlock() ;
 }
 
 //=============================================================================
+//! Unload component libraries from the container
 /*! 
  *  CORBA method: Discharges unused libraries from the container.
  */
@@ -421,27 +525,31 @@ void Engines_Parallel_Container_i::remove_impl(Engines::Component_ptr component_
 
 void Engines_Parallel_Container_i::finalize_removal()
 {
-  MESSAGE("finalize unload : dlclose");
-  _numInstanceMutex.lock(); // lock to be alone
+  MESSAGE("Finalize removal : dlclose");
+  MESSAGE("WARNING FINALIZE DOES CURRENTLY NOTHING !!!");
+
   // (see decInstanceCnt, load_component_Library)
-  map<string, void *>::iterator ith;
-  for (ith = _toRemove_map.begin(); ith != _toRemove_map.end(); ith++)
-  {
-    void *handle = (*ith).second;
-    string impl_name= (*ith).first;
-    if (handle)
-    {
-      SCRUTE(handle);
-      SCRUTE(impl_name);
-      //         dlclose(handle);                // SALOME unstable after ...
-      //         _library_map.erase(impl_name);
-    }
-  }
+  //map<string, void *>::iterator ith;
+  //for (ith = _toRemove_map.begin(); ith != _toRemove_map.end(); ith++)
+  //{
+  //  void *handle = (*ith).second;
+  //  string impl_name= (*ith).first;
+  //  if (handle)
+  //  {
+  //    SCRUTE(handle);
+  //    SCRUTE(impl_name);
+  //    dlclose(handle);                // SALOME unstable after ...
+  //    _library_map.erase(impl_name);
+  //  }
+  //}
+
+  _numInstanceMutex.lock(); // lock to be alone
   _toRemove_map.clear();
   _numInstanceMutex.unlock();
 }
 
 //=============================================================================
+//! Kill the container
 /*! 
  *  CORBA method: Kill the container process with exit(0).
  *  To remove :  never returns !
@@ -450,9 +558,9 @@ void Engines_Parallel_Container_i::finalize_removal()
 
 bool Engines_Parallel_Container_i::Kill_impl()
 {
-  MESSAGE("Engines_Parallel_Container_i::Kill() pid "<< getpid() << " containerName "
-         << _containerName.c_str() << " machineName "
-         << Kernel_Utils::GetHostname().c_str());
+  MESSAGE("Engines_Parallel_Container_i::Kill() my pid is "<< _pid 
+         << " my containerName is " << _containerName.c_str() 
+         << " my machineName is " << _hostname.c_str());
   INFOS("===============================================================");
   INFOS("= REMOVE calls to Kill_impl in C++ container                  =");
   INFOS("===============================================================");
@@ -462,6 +570,95 @@ bool Engines_Parallel_Container_i::Kill_impl()
 }
 
 //=============================================================================
+//! Get or create a file reference object associated to a local file (to transfer it)
+/*! 
+ *  CORBA method: get or create a fileRef object associated to a local file
+ *  (a file on the computer on which runs the container server), which stores
+ *  a list of (machine, localFileName) corresponding to copies already done.
+ * 
+ *  \param  origFileName absolute path for a local file to copy on other
+ *          computers
+ *  \return a fileRef object associated to the file.
+ */
+//=============================================================================
+
+Engines::fileRef_ptr
+Engines_Parallel_Container_i::createFileRef(const char* origFileName)
+{
+  string origName(origFileName);
+  Engines::fileRef_var theFileRef = Engines::fileRef::_nil();
+
+  if (origName[0] != '/')
+  {
+    INFOS("path of file to copy must be an absolute path begining with '/'");
+    return Engines::fileRef::_nil();
+  }
+
+  if (CORBA::is_nil(_fileRef_map[origName]))
+  {
+    CORBA::Object_var obj=_poa->id_to_reference(*_id);
+    Engines::Container_var pCont = Engines::Container::_narrow(obj);
+    fileRef_i* aFileRef = new fileRef_i(pCont, origFileName);
+    theFileRef = Engines::fileRef::_narrow(aFileRef->_this());
+    _numInstanceMutex.lock() ; // lock to be alone (stl container write)
+    _fileRef_map[origName] = theFileRef;
+    _numInstanceMutex.unlock() ;
+  }
+
+  theFileRef =  Engines::fileRef::_duplicate(_fileRef_map[origName]);
+  ASSERT(! CORBA::is_nil(theFileRef));
+  return theFileRef._retn();
+}
+
+//=============================================================================
+/*! 
+ *  CORBA method:
+ *  \return a reference to the fileTransfer object
+ */
+//=============================================================================
+
+Engines::fileTransfer_ptr
+Engines_Parallel_Container_i::getFileTransfer()
+{
+  Engines::fileTransfer_var aFileTransfer
+    = Engines::fileTransfer::_duplicate(_fileTransfer);
+  return aFileTransfer._retn();
+}
+
+
+Engines::Salome_file_ptr 
+Engines_Parallel_Container_i::createSalome_file(const char* origFileName) 
+{
+  string origName(origFileName);
+  if (CORBA::is_nil(_Salome_file_map[origName]))
+  {
+    Salome_file_i* aSalome_file = new Salome_file_i();
+    try 
+    {
+      aSalome_file->setLocalFile(origFileName);
+      aSalome_file->recvFiles();
+    }
+    catch (const SALOME::SALOME_Exception& e)
+    {
+      return Engines::Salome_file::_nil();
+    }
+
+    Engines::Salome_file_var theSalome_file = Engines::Salome_file::_nil();
+    theSalome_file = Engines::Salome_file::_narrow(aSalome_file->_this());
+    _numInstanceMutex.lock() ; // lock to be alone (stl container write)
+    _Salome_file_map[origName] = theSalome_file;
+    _numInstanceMutex.unlock() ;
+  }
+
+  Engines::Salome_file_ptr theSalome_file =  
+    Engines::Salome_file::_duplicate(_Salome_file_map[origName]);
+  ASSERT(!CORBA::is_nil(theSalome_file));
+  return theSalome_file;
+}
+
+
+//=============================================================================
+//! Finds an already existing component instance or create a new instance
 /*! 
  *  C++ method: Finds an already existing servant instance of a component, or
  *              create an instance.
@@ -469,7 +666,6 @@ bool Engines_Parallel_Container_i::Kill_impl()
  *  \param genericRegisterName    Name of the component instance to register
  *                                in Registry & Name Service,
  *                                (without _inst_n suffix, like "COMPONENT")
- *  \param componentLibraryName   like "libCOMPONENTEngine.so"
  *  \return a loaded component
  * 
  *  example with names:
@@ -485,65 +681,44 @@ bool Engines_Parallel_Container_i::Kill_impl()
 //=============================================================================
 
 Engines::Component_ptr
-Engines_Parallel_Container_i::find_or_create_instance(string genericRegisterName,
-                                                     string componentLibraryName)
+Engines_Parallel_Container_i::find_or_create_instance(string genericRegisterName)
 {
-  string aGenRegisterName = genericRegisterName;
-  string impl_name = componentLibraryName;
-  void* handle = _library_map[impl_name];
-  if ( !handle )
-  {
-    INFOS("shared library " << impl_name <<"must be loaded before instance");
-    return Engines::Component::_nil() ;
-  }
-  else
+  Engines::Component_var iobject = Engines::Component::_nil();
+  try
   {
+    string aGenRegisterName = genericRegisterName;
     // --- find a registered instance in naming service, or create
-
-    string component_registerBase =
-      _containerName + "/" + aGenRegisterName;
-    Engines::Component_var iobject = Engines::Component::_nil() ;
-    try
+    string component_registerBase = _containerName + "/" + aGenRegisterName;
+    CORBA::Object_var obj = _NS->ResolveFirst(component_registerBase.c_str());
+    if (CORBA::is_nil( obj ))
     {
-      CORBA::Object_var obj =
-       _NS->ResolveFirst( component_registerBase.c_str());
-      if ( CORBA::is_nil( obj ) )
+      iobject = create_component_instance(genericRegisterName.c_str(), 
+                                         0); // force multiStudy instance here !
+    }
+    else
+    { 
+      iobject = Engines::Component::_narrow(obj) ;
+      Engines_Component_i *servant = dynamic_cast<Engines_Component_i*>(_poa->reference_to_servant(iobject));
+      ASSERT(servant)
+      int studyId = servant->getStudyId();
+      ASSERT (studyId >= 0);
+      if (studyId != 0)  // monoStudy instance: NOK
       {
-       iobject = createInstance(genericRegisterName,
-                                handle,
-                                0); // force multiStudy instance here !
-      }
-      else
-      { 
-       iobject = Engines::Component::_narrow( obj ) ;
-       Engines_Component_i *servant =
-         dynamic_cast<Engines_Component_i*>
-         (_poa->reference_to_servant(iobject));
-       ASSERT(servant)
-         int studyId = servant->getStudyId();
-       ASSERT (studyId >= 0);
-       if (studyId == 0) // multiStudy instance, OK
-       {
-         // No ReBind !
-         MESSAGE(component_registerBase.c_str()<<" already bound");
-       }
-       else // monoStudy instance: NOK
-       {
-         iobject = Engines::Component::_nil();
-         INFOS("load_impl & find_component_instance methods "
-               << "NOT SUITABLE for mono study components");
-       }
+       iobject = Engines::Component::_nil();
+       INFOS("load_impl & find_component_instance methods "
+             << "NOT SUITABLE for mono study components");
       }
     }
-    catch (...)
-    {
-      INFOS( "Container_i::load_impl catched" ) ;
-    }
-    return iobject._retn();
   }
+  catch (...)
+  {
+    INFOS( "Container_i::load_impl catched" ) ;
+  }
+  return iobject._retn();
 }
 
 //=============================================================================
+//! Create a new Python component instance 
 /*! 
  *  C++ method: create a servant instance of a component.
  *  \param genericRegisterName    Name of the component instance to register
@@ -563,34 +738,97 @@ Engines_Parallel_Container_i::find_or_create_instance(string genericRegisterName
  *  component_registerName = /Containers/cli76ce/FactoryServer/COMPONENT_inst_1
  */
 //=============================================================================
+Engines::Component_ptr
+Engines_Parallel_Container_i::createPythonInstance(string genericRegisterName, int studyId)
+{
+
+  Engines::Component_var iobject = Engines::Component::_nil();
+
+  int numInstance = _numInstance;
+  char aNumI[12];
+  sprintf( aNumI , "%d" , numInstance ) ;
+  string instanceName = genericRegisterName + "_inst_" + aNumI ;
+  string component_registerName = _containerName + "/" + instanceName;
 
+  Py_ACQUIRE_NEW_THREAD;
+  PyObject *mainmod = PyImport_AddModule("__main__");
+  PyObject *globals = PyModule_GetDict(mainmod);
+  PyObject *pyCont = PyDict_GetItemString(globals, "pyCont");
+  PyObject *result = PyObject_CallMethod(pyCont,
+                                        (char*)"create_component_instance",
+                                        (char*)"ssl",
+                                        genericRegisterName.c_str(),
+                                        instanceName.c_str(),
+                                        studyId);
+  std::string iors = PyString_AsString(result);
+  Py_DECREF(result);
+  Py_RELEASE_NEW_THREAD;
+
+  if( iors!="" )
+  {
+    CORBA::Object_var obj = _orb->string_to_object(iors.c_str());
+    iobject = Engines::Component::_narrow(obj);
+    _listInstances_map[instanceName] = iobject;
+  }
+  else
+    std::cerr << "createPythonInstance ior is empty ! Error in creation" << std::endl;
+
+  return iobject._retn();
+}
+
+//=============================================================================
+//! Create a new CPP component instance 
+/*! 
+ *  C++ method: create a servant instance of a component.
+ *  \param genericRegisterName    Name of the component instance to register
+ *                                in Registry & Name Service,
+ *                                (without _inst_n suffix, like "COMPONENT")
+ *  \param handle                 loaded library handle
+ *  \param studyId                0 for multiStudy instance, 
+ *                                study Id (>0) otherwise
+ *  \return a loaded component
+ * 
+ *  example with names:
+ *  aGenRegisterName = COMPONENT (= first argument)
+ *  _containerName = /Containers/cli76ce/FactoryServer
+ *  factoryName = COMPONENTEngine_factory
+ *  component_registerBase = /Containers/cli76ce/FactoryServer/COMPONENT
+ *  instanceName = COMPONENT_inst_1
+ *  component_registerName = /Containers/cli76ce/FactoryServer/COMPONENT_inst_1
+ */
+//=============================================================================
 Engines::Component_ptr
-Engines_Parallel_Container_i::createInstance(string genericRegisterName,
-                                            void *handle,
-                                            int studyId)
+Engines_Parallel_Container_i::createCPPInstance(string genericRegisterName,
+                                               void *handle,
+                                               int studyId)
 {
+  MESSAGE("Entering Engines_Parallel_Container_i::createCPPInstance");
+
   // --- find the factory
 
   string aGenRegisterName = genericRegisterName;
   string factory_name = aGenRegisterName + string("Engine_factory");
 
-  SCRUTE(factory_name) ;
-
-  typedef  PortableServer::ObjectId * (*FACTORY_FUNCTION)
+  typedef  PortableServer::ObjectId * (*FACTORY_FUNCTION_2)
     (CORBA::ORB_ptr,
      PortableServer::POA_ptr, 
      PortableServer::ObjectId *, 
      const char *, 
      const char *) ;
 
-  FACTORY_FUNCTION Component_factory
-    = (FACTORY_FUNCTION) dlsym(handle, factory_name.c_str());
+  FACTORY_FUNCTION_2 Component_factory = NULL;
+#ifndef WIN32
+  Component_factory = (FACTORY_FUNCTION_2)dlsym( handle, factory_name.c_str() );
+#else
+  Component_factory = (FACTORY_FUNCTION_2)GetProcAddress( (HINSTANCE)handle, factory_name.c_str() );
+#endif
 
-  char *error ;
-  if ( (error = dlerror() ) != NULL)
+  if (!Component_factory)
   {
     INFOS("Can't resolve symbol: " + factory_name);
-    SCRUTE(error);
+#ifndef WIN32
+    INFOS("dlerror() result is : " << dlerror());
+#endif
     return Engines::Component::_nil() ;
   }
 
@@ -598,26 +836,27 @@ Engines_Parallel_Container_i::createInstance(string genericRegisterName,
   Engines::Component_var iobject = Engines::Component::_nil() ;
   try
   {
-    _numInstanceMutex.lock() ; // lock on the instance number
-    _numInstance++ ;
-    int numInstance = _numInstance ;
-    _numInstanceMutex.unlock() ;
-
+    int numInstance = _numInstance;
     char aNumI[12];
-    sprintf( aNumI , "%d" , numInstance ) ;
-    string instanceName = aGenRegisterName + "_inst_" + aNumI ;
+    sprintf( aNumI , "%d" , numInstance );
+    string instanceName = aGenRegisterName + "_inst_" + aNumI;
     string component_registerName =
       _containerName + "/" + instanceName;
 
     // --- Instanciate required CORBA object
 
-    PortableServer::ObjectId *id ; //not owner, do not delete (nore use var)
+    PortableServer::ObjectId *id; //not owner, do not delete (nore use var)
     id = (Component_factory) ( _orb, _poa, _id, instanceName.c_str(),
-                              aGenRegisterName.c_str() ) ;
+                              aGenRegisterName.c_str() );
+    if (id == NULL)
+    {
+      INFOS("Factory function returns NULL !");
+      return iobject._retn();
+    }
 
     // --- get reference & servant from id
     CORBA::Object_var obj = _poa->id_to_reference(*id);
-    iobject = Engines::Component::_narrow(obj) ;
+    iobject = Engines::Component::_narrow(obj);
 
     Engines_Component_i *servant = 
       dynamic_cast<Engines_Component_i*>(_poa->reference_to_servant(iobject));
@@ -625,181 +864,121 @@ Engines_Parallel_Container_i::createInstance(string genericRegisterName,
     servant->_remove_ref(); // compensate previous id_to_reference 
     _listInstances_map[instanceName] = iobject;
     _cntInstances_map[aGenRegisterName] += 1;
+#if defined(_DEBUG_) || defined(_DEBUG)
     bool ret_studyId = servant->setStudyId(studyId);
     ASSERT(ret_studyId);
+#else
+    servant->setStudyId(studyId);
+#endif
 
     // --- register the engine under the name
     //     containerName(.dir)/instanceName(.object)
-    _NS->Register(iobject , component_registerName.c_str()) ;
-    MESSAGE( component_registerName.c_str() << " bound" ) ;
+    _NS->Register(iobject , component_registerName.c_str());
+    MESSAGE( component_registerName.c_str() << " bound" );
   }
   catch (...)
   {
-    INFOS( "Container_i::createInstance exception catched" ) ;
+    INFOS( "Container_i::createInstance exception catched" );
   }
   return iobject._retn();
 }
 
-Engines::Component_ptr
-Engines_Parallel_Container_i::createParallelInstance(string genericRegisterName,
-                                                    void *handle,
-                                                    int studyId)
+void
+Engines_Parallel_Container_i::create_paco_component_node_instance(const char* componentName,
+                                                                 const char* proxy_containerName,
+                                                                 CORBA::Long studyId)
 {
-  cerr << "----------------- createParallelInstance node : " << getMyRank() << endl;
-  // --- create instance
-  Engines::Component_var iobject = Engines::Component::_nil();
-  string aGenRegisterName = genericRegisterName;
-
-  //////////////////////////////////////////////////////////////////////////
-  // 1: Proxy Step
-  // Node 0 create the proxy
-  if (getMyRank() == 0) {
-    // --- find the factory
-    string factory_name = aGenRegisterName + string("EngineProxy_factory");
-
-    typedef  PortableServer::ObjectId * (*FACTORY_FUNCTION)
-      (CORBA::ORB_ptr,
-       paco_fabrique_thread *,
-       PortableServer::POA_ptr,
-       PortableServer::ObjectId *, 
-       const char *,
-       int) ;
-
-    FACTORY_FUNCTION Component_factory
-      = (FACTORY_FUNCTION) dlsym(handle, factory_name.c_str());
-
-    char *error ;
-    if ( (error = dlerror() ) != NULL) {
-      INFOS("Can't resolve symbol: " + factory_name);
-      SCRUTE(error);
-      return Engines::Component::_nil();
-    }
-    try {
-      _numInstanceMutex.lock() ; // lock on the instance number
-      _numInstance++ ;
-      int numInstance = _numInstance ;
-      _numInstanceMutex.unlock() ;
-
-      char aNumI[12];
-      sprintf( aNumI , "%d" , numInstance ) ;
-      string instanceName = aGenRegisterName + "_inst_" + aNumI ;
-      string component_registerName =
-       _containerName + "/" + instanceName;
-
-      // --- Instanciate required CORBA object
-      PortableServer::ObjectId *id ; //not owner, do not delete (nore use var)
-      id = (Component_factory) ( _orb, new paco_omni_fabrique(), _poa, _id, instanceName.c_str(), getTotalNode()) ;
-
-      // --- get reference & servant from id
-      CORBA::Object_var obj = _poa->id_to_reference(*id);
-      iobject = Engines::Component::_narrow(obj) ;
-
-      _listInstances_map[instanceName] = iobject;
-      _cntInstances_map[aGenRegisterName] += 1;
-
-      // --- register the engine under the name
-      //     containerName(.dir)/instanceName(.object)
-      _NS->Register(iobject , component_registerName.c_str()) ;
-      MESSAGE( component_registerName.c_str() << " bound" ) ;
-    }
-    catch (...)
-    {
-      INFOS( "Container_i::createParallelInstance exception catched in Proxy creation" ) ;
-    }
-  }
-  else {
-    // We have to have the same numIntance to be able to get the proxy reference 
-    // in the nameing service.
-    _numInstanceMutex.lock() ; // lock on the instance number
-    _numInstance++ ;
-    //    int numInstance = _numInstance ;
-    _numInstanceMutex.unlock() ;
-  }
-  cerr << "Node " << getMyRank() << " entering in paco_barrier()" << endl;
-  _my_com->paco_barrier();
-  cerr << "Node " << getMyRank() << " quitting paco_barrier()" << endl;
-
-  //////////////////////////////////////////////////////////////////////////
-  // 2: Nodes Step
-
+  // Init de la méthode
   char * proxy_ior;
-  Engines::Component_PaCO_var iobject2;
+  Engines::Component_PaCO_var work_node;
+  std::string aCompName = componentName;
+  std::string _proxy_containerName = proxy_containerName;
 
+#ifndef WIN32
+  string impl_name = string ("lib") + aCompName +string("Engine.so");
+#else
+  string impl_name = aCompName +string("Engine.dll");
+#endif
+  void* handle = _library_map[impl_name];
+  _numInstanceMutex.lock() ; // lock on the instance number
+  _numInstance++ ;
+  int numInstance = _numInstance ;
+  _numInstanceMutex.unlock() ;
   char aNumI[12];
-  sprintf( aNumI , "%d" , _numInstance ) ;
-  string instanceName = aGenRegisterName + "_inst_" + aNumI ;
-
-  string component_registerName = _containerName + "/" + instanceName;
-  string hostname = Kernel_Utils::GetHostname();
+  sprintf( aNumI , "%d" , numInstance ) ;
+  string instanceName = aCompName + "_inst_" + aNumI ;
 
+  // Step 1 : Get proxy !
+  string component_registerName = _proxy_containerName + "/" + instanceName;
   CORBA::Object_var temp = _NS->Resolve(component_registerName.c_str());
   Engines::Component_var obj_proxy = Engines::Component::_narrow(temp);
+  if (CORBA::is_nil(obj_proxy))
+  {
+    INFOS("Proxy reference from NamingService is nil !");
+    INFOS("Proxy name was : " << component_registerName);
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::INTERNAL_ERROR;
+    es.text = "Proxy reference from NamingService is nil !";
+    throw SALOME::SALOME_Exception(es);
+  }
   proxy_ior = _orb->object_to_string(obj_proxy);
 
-  // --- find the factory
-  string factory_name = aGenRegisterName + string("Engine_factory");
-
-  typedef  PortableServer::ObjectId * (*FACTORY_FUNCTION)
-    (CORBA::ORB_ptr, char *, int,
-     PortableServer::POA_ptr, 
-     PortableServer::ObjectId *, 
-     const char *, 
-     const char *) ;
-
-  FACTORY_FUNCTION Component_factory
-    = (FACTORY_FUNCTION) dlsym(handle, factory_name.c_str());
-
-  char *error ;
-  if ( (error = dlerror() ) != NULL)
+  // Get factory
+  string factory_name = aCompName + string("Engine_factory");
+  FACTORY_FUNCTION Component_factory = (FACTORY_FUNCTION) dlsym(handle, factory_name.c_str());
+  if (!Component_factory)
   {
-    INFOS("Can't resolve symbol: " + factory_name);
-    SCRUTE(error);
-    return Engines::Component::_nil() ;
+    INFOS("Can't resolve symbol : " + factory_name);
+#ifndef WIN32
+    INFOS("dlerror() result is : " << dlerror());
+#endif
+    std::string ex_text = "Can't resolve symbol : " + factory_name;
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::INTERNAL_ERROR;
+    es.text = CORBA::string_dup(ex_text.c_str());
+    throw SALOME::SALOME_Exception(es);
   }
+
   try
   {
     char aNumI2[12];
     sprintf(aNumI2 , "%d" , getMyRank()) ;
-    string instanceName = aGenRegisterName + "_inst_node_" + aNumI2;
-    string component_registerName = _containerName + aNumI2 + "/" + instanceName;
-
-    // --- Instanciate required CORBA object
+    string instanceName = aCompName + "_inst_" + aNumI + "_work_node_" + aNumI2;
+    string component_registerName = _containerName + "/" + instanceName;
 
+    // --- Instanciate work node
     PortableServer::ObjectId *id ; //not owner, do not delete (nore use var)
-    id = (Component_factory) ( _orb, proxy_ior, getMyRank(), _poa, _id, instanceName.c_str(),
-                              aGenRegisterName.c_str() ) ;
+    id = (Component_factory) (_orb, proxy_ior, getMyRank(), _poa, _id, instanceName.c_str(), componentName);
+    CORBA::string_free(proxy_ior);
 
     // --- get reference & servant from id
     CORBA::Object_var obj = _poa->id_to_reference(*id);
-    iobject2 = Engines::Component_PaCO::_narrow(obj) ;
-
-    // --- register the engine under the name
-    _NS->Register(iobject2 , component_registerName.c_str()) ;
-    MESSAGE( component_registerName.c_str() << " bound" ) ;
+    work_node = Engines::Component_PaCO::_narrow(obj) ;
+    if (CORBA::is_nil(work_node))
+    {
+      INFOS("work_node reference from factory is nil !");
+      SALOME::ExceptionStruct es;
+      es.type = SALOME::INTERNAL_ERROR;
+      es.text = "work_node reference from factory is nil !";
+      throw SALOME::SALOME_Exception(es);
+    }
+    work_node->deploy();
+    _NS->Register(work_node, component_registerName.c_str());
+    _par_obj_inst_map[instanceName] = id;
+    MESSAGE(component_registerName.c_str() << " bound" );
   }
   catch (...)
   {
-    INFOS( "Container_i::createParallelInstance exception catched" ) ;
-  }
-
-  //////////////////////////////////////////////////////////////////////////
-  // 3: Deployment Step
-
-  iobject2->deploy();
-  _my_com->paco_barrier();
-  cerr << "--------- createParallelInstance : End Deploy step ----------" << endl;  
-  if (getMyRank() == 0) {
-    PaCO::InterfaceManager_var proxy = PaCO::InterfaceManager::_narrow(iobject);
-    proxy->start();
-    _my_com->paco_barrier();
+    INFOS("Container_i::create_paco_component_node_instance exception catched");
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::INTERNAL_ERROR;
+    es.text = "Container_i::create_paco_component_node_instance exception catched";
+    throw SALOME::SALOME_Exception(es);
   }
-  else
-    _my_com->paco_barrier();
-
-  return iobject._retn();
 }
 
 //=============================================================================
+//! Decrement component instance reference count
 /*! 
  *
  */
@@ -807,26 +986,30 @@ Engines_Parallel_Container_i::createParallelInstance(string genericRegisterName,
 
 void Engines_Parallel_Container_i::decInstanceCnt(string genericRegisterName)
 {
-  string aGenRegisterName =genericRegisterName;
-  MESSAGE("Engines_Parallel_Container_i::decInstanceCnt " << aGenRegisterName);
-  ASSERT(_cntInstances_map[aGenRegisterName] > 0); 
-  _numInstanceMutex.lock(); // lock to be alone
-  // (see finalize_removal, load_component_Library)
-  _cntInstances_map[aGenRegisterName] -= 1;
-  SCRUTE(_cntInstances_map[aGenRegisterName]);
-  if (_cntInstances_map[aGenRegisterName] == 0)
+  if(_cntInstances_map.count(genericRegisterName) !=0 )
   {
-    string impl_name =
-      Engines_Component_i::GetDynLibraryName(aGenRegisterName.c_str());
-    SCRUTE(impl_name);
-    void* handle = _library_map[impl_name];
-    ASSERT(handle);
-    _toRemove_map[impl_name] = handle;
+    string aGenRegisterName =genericRegisterName;
+    MESSAGE("Engines_Parallel_Container_i::decInstanceCnt " << aGenRegisterName);
+    ASSERT(_cntInstances_map[aGenRegisterName] > 0); 
+    _numInstanceMutex.lock(); // lock to be alone
+    // (see finalize_removal, load_component_Library)
+    _cntInstances_map[aGenRegisterName] -= 1;
+    SCRUTE(_cntInstances_map[aGenRegisterName]);
+    if (_cntInstances_map[aGenRegisterName] == 0)
+    {
+      string impl_name =
+       Engines_Component_i::GetDynLibraryName(aGenRegisterName.c_str());
+      SCRUTE(impl_name);
+      void* handle = _library_map[impl_name];
+      ASSERT(handle);
+      _toRemove_map[impl_name] = handle;
+    }
+    _numInstanceMutex.unlock();
   }
-  _numInstanceMutex.unlock();
 }
 
 //=============================================================================
+//! Indicate if container is a python one
 /*! 
  *  Retrieves only with container naming convention if it is a python container
  */
@@ -835,13 +1018,70 @@ void Engines_Parallel_Container_i::decInstanceCnt(string genericRegisterName)
 bool Engines_Parallel_Container_i::isPythonContainer(const char* ContainerName)
 {
   bool ret=false;
-  int len=strlen(ContainerName);
-  if(len>=2)
-    if(strcmp(ContainerName+len-2,"Py")==0)
-      ret=true;
   return ret;
 }
 
+
+// Cette méthode permet de tenir à jour le compteur des
+// instances pour le container parallèle.
+// En effet losrque l'on charge un composant séquentielle seul
+// le compteur du noeud 0 est augmenté, il faut donc tenir les autres 
+// noeuds à jour.
+void
+Engines_Parallel_Container_i::updateInstanceNumber()
+{
+  if (getMyRank() != 0)
+  {
+    _numInstanceMutex.lock();
+    _numInstance++;
+    _numInstanceMutex.unlock();
+  }
+}
+
+/*! \brief copy a file from a remote host (container) to the local host
+ * \param container the remote container
+ * \param remoteFile the file to copy locally from the remote host into localFile
+ * \param localFile the local file
+ */
+void 
+Engines_Parallel_Container_i::copyFile(Engines::Container_ptr container, const char* remoteFile, const char* localFile)
+{
+  Engines::fileTransfer_var fileTransfer = container->getFileTransfer();
+
+  FILE* fp;
+  if ((fp = fopen(localFile,"wb")) == NULL)
+    {
+      INFOS("file " << localFile << " cannot be open for writing");
+      return;
+    }
+
+  CORBA::Long fileId = fileTransfer->open(remoteFile);
+  if (fileId > 0)
+    {
+      Engines::fileBlock* aBlock;
+      int toFollow = 1;
+      int ctr=0;
+      while (toFollow)
+        {
+          ctr++;
+          SCRUTE(ctr);
+          aBlock = fileTransfer->getBlock(fileId);
+          toFollow = aBlock->length();
+          SCRUTE(toFollow);
+          CORBA::Octet *buf = aBlock->get_buffer();
+          fwrite(buf, sizeof(CORBA::Octet), toFollow, fp);
+          delete aBlock;
+        }
+      fclose(fp);
+      MESSAGE("end of transfer");
+      fileTransfer->close(fileId);
+    }
+  else
+    {
+      INFOS("open reference file for copy impossible");
+    }
+}
+
 //=============================================================================
 /*! 
  *  
@@ -860,6 +1100,7 @@ void ActSigIntHandler()
   // (SIGINT | SIGUSR1) :
   // it must be only one signal ===> one call for SIGINT 
   // and an other one for SIGUSR1
+
 #ifndef WIN32
   if ( sigaction( SIGINT , &SigIntAct, NULL ) ) {
     perror("SALOME_Container main ") ;
@@ -869,6 +1110,12 @@ void ActSigIntHandler()
     perror("SALOME_Container main ") ;
     exit(0) ;
   }
+  if ( sigaction( SIGUSR2 , &SigIntAct, NULL ) )
+  {
+    perror("SALOME_Container main ") ;
+    exit(0) ;
+  }
+
   //PAL9042 JR : during the execution of a Signal Handler (and of methods called through Signal Handlers)
   //             use of streams (and so on) should never be used because :
   //             streams of C++ are naturally thread-safe and use pthread_mutex_lock ===>
@@ -883,7 +1130,8 @@ void ActSigIntHandler()
 
 }
 
-void SetCpuUsed() ;
+void SetCpuUsed();
+void CallCancelThread();
 
 #ifndef WIN32
 void SigIntHandler(int what , siginfo_t * siginfo ,
@@ -908,6 +1156,10 @@ void SigIntHandler(int what , siginfo_t * siginfo ,
     if ( siginfo->si_signo == SIGUSR1 ) {
       SetCpuUsed() ;
     }
+    else if ( siginfo->si_signo == SIGUSR2 )
+    {
+      CallCancelThread() ;
+    }
     else {
       _Sleeping = true ;
       //      MESSAGE("SigIntHandler BEGIN sleeping.") ;
@@ -949,120 +1201,3 @@ void SigIntHandler( int what ) {
 }
 #endif
 
-//=============================================================================
-/*! 
- *  CORBA method: get or create a fileRef object associated to a local file
- *  (a file on the computer on which runs the container server), which stores
- *  a list of (machine, localFileName) corresponding to copies already done.
- * 
- *  \param  origFileName absolute path for a local file to copy on other
- *          computers
- *  \return a fileRef object associated to the file.
- */
-//=============================================================================
-
-Engines::fileRef_ptr
-Engines_Parallel_Container_i::createFileRef(const char* origFileName)
-{
-  string origName(origFileName);
-  Engines::fileRef_var theFileRef = Engines::fileRef::_nil();
-
-  if (origName[0] != '/')
-  {
-    INFOS("path of file to copy must be an absolute path begining with '/'");
-    return Engines::fileRef::_nil();
-  }
-
-  if (CORBA::is_nil(_fileRef_map[origName]))
-  {
-    CORBA::Object_var obj=_poa->id_to_reference(*_id);
-    Engines::Container_var pCont = Engines::Container::_narrow(obj);
-    fileRef_i* aFileRef = new fileRef_i(pCont, origFileName);
-    theFileRef = Engines::fileRef::_narrow(aFileRef->_this());
-    _numInstanceMutex.lock() ; // lock to be alone (stl container write)
-    _fileRef_map[origName] = theFileRef;
-    _numInstanceMutex.unlock() ;
-  }
-
-  theFileRef =  Engines::fileRef::_duplicate(_fileRef_map[origName]);
-  ASSERT(! CORBA::is_nil(theFileRef));
-  return theFileRef._retn();
-}
-
-//=============================================================================
-/*! 
- *  CORBA method:
- *  \return a reference to the fileTransfer object
- */
-//=============================================================================
-
-Engines::fileTransfer_ptr
-Engines_Parallel_Container_i::getFileTransfer()
-{
-  Engines::fileTransfer_var aFileTransfer
-    = Engines::fileTransfer::_duplicate(_fileTransfer);
-  return aFileTransfer._retn();
-}
-
-
-Engines::Salome_file_ptr 
-Engines_Parallel_Container_i::createSalome_file(const char* origFileName) 
-{
-  string origName(origFileName);
-  if (CORBA::is_nil(_Salome_file_map[origName]))
-  {
-    Salome_file_i* aSalome_file = new Salome_file_i();
-    try 
-    {
-      aSalome_file->setLocalFile(origFileName);
-      aSalome_file->recvFiles();
-    }
-    catch (const SALOME::SALOME_Exception& e)
-    {
-      return Engines::Salome_file::_nil();
-    }
-
-    Engines::Salome_file_var theSalome_file = Engines::Salome_file::_nil();
-    theSalome_file = Engines::Salome_file::_narrow(aSalome_file->_this());
-    _numInstanceMutex.lock() ; // lock to be alone (stl container write)
-    _Salome_file_map[origName] = theSalome_file;
-    _numInstanceMutex.unlock() ;
-  }
-
-  Engines::Salome_file_ptr theSalome_file =  
-    Engines::Salome_file::_duplicate(_Salome_file_map[origName]);
-  ASSERT(!CORBA::is_nil(theSalome_file));
-  return theSalome_file;
-}
-
-//=============================================================================
-/*! 
- *  CORBA attribute: Container working directory 
- */
-//=============================================================================
-
-char* 
-Engines_Parallel_Container_i::workingdir()
-{
-  char wd[256];
-  getcwd (wd,256);
-  return CORBA::string_dup(wd) ;
-}
-
-//=============================================================================
-/*! 
- *  CORBA attribute: Container log file name
- */
-//=============================================================================
-
-char* 
-Engines_Parallel_Container_i::logfilename()
-{
-  return CORBA::string_dup(_logfilename.c_str()) ;
-}
-
-void 
-Engines_Parallel_Container_i::logfilename(const char* name)
-{
-  _logfilename=name;
-}
index c76f18a11ede772e66880431de769899cf08dba8..ba014d4582f4618f5ab47373271739ac6b531c8f 100644 (file)
 //  SALOME_ParallelContainer : implementation of container and engine for Parallel Kernel
 //  File   : SALOME_ParallelContainer_i.hxx
 //  Author : André RIBES, EDF
-//  Author : Paul RASCLE, EDF - MARC TAJCHMAN, CEA
 //
 #ifndef _SALOME_PARALLEL_CONTAINER_I_HXX_
 #define _SALOME_PARALLEL_CONTAINER_I_HXX_
 
 #include <SALOMEconfig.h>
 
-#include "SALOME_ComponentPaCO_Engines_Container_server.h"
+#include "SALOME_PACOExtensionPaCO_Engines_PACO_Container_server.hxx"
+#include "SALOME_ParallelGlobalProcessVar_i.hxx"
 
 #include <iostream>
 #include <signal.h>
@@ -55,18 +55,18 @@ class SALOME_NamingService;
 #endif
 
 class CONTAINER_EXPORT Engines_Parallel_Container_i:
-  /*  public virtual POA_Engines::Container, */
-  public Engines::Container_serv,
-  public virtual PortableServer::RefCountServantBase
+  virtual public Engines::PACO_Container_serv,
+  virtual public ParallelGlobalProcessVar_i,
+  virtual public PortableServer::RefCountServantBase
 {
 public:
-  Engines_Parallel_Container_i(CORBA::ORB_ptr orb, char * ior, int rank);
-  Engines_Parallel_Container_i(CORBA::ORB_ptr orb, char * ior, int rank,
-                     PortableServer::POA_ptr poa,
-                     char * containerName ,
-                      int argc, char* argv[],
-                     bool activAndRegist = true,
-                     bool isServantAloneInProcess = true);
+  Engines_Parallel_Container_i(CORBA::ORB_ptr orb, 
+                              char * ior, 
+                              int rank,
+                              PortableServer::POA_ptr poa,
+                              std::string containerName ,
+                              bool isServantAloneInProcess = true);
+
   virtual ~Engines_Parallel_Container_i();
 
   // --- CORBA methods
@@ -85,6 +85,12 @@ public:
   load_impl(const char* nameToRegister,
            const char* componentName);
 
+  void
+  create_paco_component_node_instance(const char* componentName,
+                                     const char* proxy_containerName,
+                                     CORBA::Long studyId); // 0 for multiStudy
+
+  void updateInstanceNumber();
 
   void remove_impl(Engines::Component_ptr component_i);
   void finalize_removal();
@@ -98,65 +104,66 @@ public:
   virtual void Shutdown();
   char* getHostName();
   CORBA::Long getPID();
+
   //! Kill current container
   bool Kill_impl() ;
 
   // --- local C++ methods
-
   Engines::Component_ptr
-  find_or_create_instance( std::string genericRegisterName,
-                          std::string componentLibraryName);
+  find_or_create_instance(std::string genericRegisterName);
 
   Engines::Component_ptr
-  createInstance(std::string genericRegisterName,
-                void *handle,
-                int studyId);
+  createCPPInstance(std::string genericRegisterName,
+                   void *handle,
+                   int studyId);
 
   Engines::Component_ptr
-  createParallelInstance(std::string genericRegisterName,
-                        void *handle,
-                        int studyId);
+  createPythonInstance(std::string genericRegisterName,
+                      int studyId);
 
   static bool isPythonContainer(const char* ContainerName);
   static void decInstanceCnt(std::string genericRegisterName);
 
   // --- needed for parallel components, Numerical Platon
-
-  int getArgc() { return _argc; }
-  char **getArgv() { return _argv; }
-
   void set_id(PortableServer::ObjectId * id) { _id = id;}
 
   Engines::fileRef_ptr createFileRef(const char* origFileName);
   Engines::fileTransfer_ptr getFileTransfer();
 
   virtual Engines::Salome_file_ptr createSalome_file(const char* origFileName);
-protected:
-
-  static std::map<std::string, int> _cntInstances_map;
-  static std::map<std::string, void *> _library_map; // library names, loaded
-  static std::map<std::string, void *> _toRemove_map;// library names to remove
-  static omni_mutex _numInstanceMutex ; // lib and instance protection
+  void copyFile(Engines::Container_ptr container, const char* remoteFile, const char* localFile);
 
-  bool _isSupervContainer;
+protected:
 
-  SALOME_NamingService *_NS ;
+  SALOME_NamingService *_NS;
+  std::string _hostname;
   std::string _library_path;
   std::string _containerName;
   std::string _logfilename;
   CORBA::ORB_var _orb;
   PortableServer::POA_var _poa;
-  PortableServer::ObjectId * _id ;
-  int _numInstance ;
-  std::map<std::string,Engines::Component_var> _listInstances_map;
-  std::map<std::string,Engines::fileRef_var> _fileRef_map;
-  std::map<std::string,Engines::Salome_file_var> _Salome_file_map;
+  PortableServer::ObjectId * _id;
+  int _numInstance;
+  CORBA::Long   _pid;
+  bool   _isServantAloneInProcess;
   Engines::fileTransfer_var _fileTransfer;
 
-  int    _argc ;
-  char** _argv ;
-  long   _pid;
-  bool   _isServantAloneInProcess;
+  typedef std::map<std::string,Engines::Component_var> _listInstances_map_t;
+  typedef std::map<std::string,Engines::fileRef_var> _fileRef_map_t;
+  typedef std::map<std::string,Engines::Salome_file_var> _Salome_file_map_t;
+  _listInstances_map_t _listInstances_map;
+  _fileRef_map_t _fileRef_map;
+  _Salome_file_map_t _Salome_file_map;
+
+  // Cette map contient les references vers les différentes
+  // instances d'objets parallèles.
+  std::map<std::string, PortableServer::ObjectId *> _par_obj_inst_map;
+
+  typedef  PortableServer::ObjectId * (*FACTORY_FUNCTION) (CORBA::ORB_ptr, char *, int,
+                                                          PortableServer::POA_ptr, 
+                                                          PortableServer::ObjectId *, 
+                                                          const char *, 
+                                                          const char *);
 };
 
 #endif
diff --git a/src/ParallelContainer/SALOME_ParallelGlobalProcessVar_i.cxx b/src/ParallelContainer/SALOME_ParallelGlobalProcessVar_i.cxx
new file mode 100644 (file)
index 0000000..8217d00
--- /dev/null
@@ -0,0 +1,37 @@
+//  Copyright (C) 2007-2009  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME_ParallelContainer : implementation of container and engine for ParallelKernel
+//  File   : SALOME_ParallelContainer_i.cxx
+//  Author : André RIBES, EDF
+
+#include "SALOME_ParallelGlobalProcessVar_i.hxx"
+
+// Ces variables globales de classes permettent de ne charger
+// qu'une seule fois une bibliothèque dynamique.
+std::map<std::string, int>    ParallelGlobalProcessVar_i::_cntInstances_map;
+std::map<std::string, void *> ParallelGlobalProcessVar_i::_library_map;
+std::map<std::string, void *> ParallelGlobalProcessVar_i::_toRemove_map;
+omni_mutex ParallelGlobalProcessVar_i::_numInstanceMutex ;
+
+ParallelGlobalProcessVar_i::ParallelGlobalProcessVar_i() {}
+
+ParallelGlobalProcessVar_i::~ParallelGlobalProcessVar_i() {}
diff --git a/src/ParallelContainer/SALOME_ParallelGlobalProcessVar_i.hxx b/src/ParallelContainer/SALOME_ParallelGlobalProcessVar_i.hxx
new file mode 100644 (file)
index 0000000..39fe6d1
--- /dev/null
@@ -0,0 +1,59 @@
+//  Copyright (C) 2007-2009  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SALOME_ParallelContainer : implementation of container and engine for Parallel Kernel
+//  File   : SALOME_ParallelContainer_i.hxx
+//  Author : André RIBES, EDF
+//
+#ifndef _SALOME_PARALLEL_GLOBALPROCESSVAR_I_HXX_
+#define _SALOME_PARALLEL_GLOBALPROCESSVAR_I_HXX_
+
+#ifdef WIN32
+# ifdef CONTAINER_EXPORTS
+#  define CONTAINER_EXPORT __declspec( dllexport )
+# else
+#  define CONTAINER_EXPORT __declspec( dllimport )
+# endif
+#else
+# define CONTAINER_EXPORT
+#endif
+
+#include <SALOMEconfig.h>
+#include <omnithread.h>
+#include <map>
+#include <string>
+
+class CONTAINER_EXPORT ParallelGlobalProcessVar_i
+{
+public:
+  ParallelGlobalProcessVar_i();
+  virtual ~ParallelGlobalProcessVar_i();
+
+protected:
+  // Voir commentaire dans le fichier .cxx
+  static std::map<std::string, int> _cntInstances_map;
+  static std::map<std::string, void *> _library_map; // library names, loaded
+  static std::map<std::string, void *> _toRemove_map;// library names to remove
+  static omni_mutex _numInstanceMutex ; // lib and instance protection
+};
+
+#endif
+
index 381be2fd2fa403c48ede0d0f270c228a96111d8e..c874c7781296e2d4c0e117ae856d573c11cd76a2 100644 (file)
 #include <string.h>
 #include <map>
 #include <list>
-
 #include <sys/types.h>
 #include <sys/stat.h>
+#ifdef WNT
+#else
 #include <unistd.h>
+#endif
 #include <libxml/parser.h>
 
 #include <algorithm>
@@ -49,9 +51,9 @@ static LoadRateManagerAltCycl altcycl;
 //=============================================================================
 
 ResourcesManager_cpp::
-ResourcesManager_cpp(const char *xmlFilePath) :
-    _path_resources(xmlFilePath)
+ResourcesManager_cpp(const char *xmlFilePath)
 {
+  _path_resources.push_back(xmlFilePath);
 #if defined(_DEBUG_) || defined(_DEBUG)
   cerr << "ResourcesManager_cpp constructor" << endl;
 #endif
@@ -84,25 +86,34 @@ ResourcesManager_cpp::ResourcesManager_cpp() throw(ResourcesException)
   _resourceManagerMap["best"]=&altcycl;
   _resourceManagerMap[""]=&altcycl;
 
-  _isAppliSalomeDefined = (getenv("APPLI") != 0);
-  if(!getenv("KERNEL_ROOT_DIR"))
-    throw ResourcesException("you must define KERNEL_ROOT_DIR environment variable!!");
-
-  if (_isAppliSalomeDefined)
+  std::string default_file("");
+  if (getenv("APPLI") != 0)
     {
-      _path_resources = getenv("HOME");
-      _path_resources += "/";
-      _path_resources += getenv("APPLI");
-      _path_resources += "/CatalogResources.xml";
+      default_file += getenv("HOME");
+      default_file += "/";
+      default_file += getenv("APPLI");
+      default_file += "/CatalogResources.xml";
+      _path_resources.push_back(default_file);
     }
-
   else
     {
-      _path_resources = getenv("KERNEL_ROOT_DIR");
-      _path_resources += "/share/salome/resources/kernel/CatalogResources.xml";
+      if(!getenv("KERNEL_ROOT_DIR"))
+       throw ResourcesException("you must define KERNEL_ROOT_DIR environment variable!! -> cannot load a CatalogResources.xml");
+      default_file = getenv("KERNEL_ROOT_DIR");
+      default_file += "/share/salome/resources/kernel/CatalogResources.xml";
+      _path_resources.push_back(default_file);
     }
 
-  ParseXmlFile();
+  if (getenv("USER_CATALOG_RESOURCES_FILE") != 0)
+  {
+    std::string user_file("");
+    user_file = getenv("USER_CATALOG_RESOURCES_FILE");
+    _path_resources.push_back(user_file);
+  }
+
+  _lasttime=0;
+
+  ParseXmlFiles();
 #if defined(_DEBUG_) || defined(_DEBUG)
   cerr << "ResourcesManager_cpp constructor end";
 #endif
@@ -140,13 +151,43 @@ ResourcesManager_cpp::GetFittingResources(const machineParams& params) throw(Res
 {
   vector <std::string> vec;
 
-  ParseXmlFile();
+  ParseXmlFiles();
 
   const char *hostname = params.hostname.c_str();
 #if defined(_DEBUG_) || defined(_DEBUG)
   cerr << "GetFittingResources " << hostname << " " << Kernel_Utils::GetHostname().c_str() << endl;
 #endif
 
+  // PaCO++ parallel container case
+  std::string parallelLib(params.parallelLib);
+  if (params.nb_component_nodes > 0 && parallelLib != "")
+  {
+#if defined(_DEBUG_) || defined(_DEBUG)
+    std::cerr << "[GetFittingResources] ParallelContainer case" << std::endl;
+    std::cerr << "[GetFittingResources] parallelLib is " << parallelLib << std::endl;
+    std::cerr << "[GetFittingResources] nb_component_nodes is " << params.nb_component_nodes << std::endl;
+#endif
+
+    // Currently we only support parallel containers that define a hostname target
+    if (hostname[0] != '\0')
+    {
+      // Special case of localhost -> put containers into the real computer name
+      if (strcmp(hostname, "localhost") == 0)
+       vec.push_back(Kernel_Utils::GetHostname().c_str());
+      else 
+      {
+       // Try find the resource into the map
+       if (_resourcesList.find(hostname) != _resourcesList.end())
+         vec.push_back(hostname);
+       else
+         std::cerr << "[GetFittingResources] ParallelContainer hostname does not exist into the resource list !" << std::endl;
+      }
+    }
+    else
+      std::cerr << "[GetFittingResources] ParallelContainer hostname is empty -> cannot find a possible resource" << std::endl;
+    return vec;
+  }
+
   if (hostname[0] != '\0'){
 
     if ( strcmp(hostname, "localhost") == 0 ||
@@ -190,7 +231,9 @@ ResourcesManager_cpp::GetFittingResources(const machineParams& params) throw(Res
 #if defined(_DEBUG_) || defined(_DEBUG)
          cerr << "ResourcesManager_cpp::GetFittingResources : SALOME_Exception" << endl;
 #endif
-         throw ResourcesException("unknown host");
+         std::string error("GetFittinResouces : ResourcesManager doesn't find the host requested : ");
+         error += hostname;
+         throw ResourcesException(error);
        }
       }
   }
@@ -300,19 +343,19 @@ void ResourcesManager_cpp::DeleteResourceInCatalog(const char *hostname)
  */ 
 //=============================================================================
 
-void ResourcesManager_cpp::WriteInXmlFile()
+void ResourcesManager_cpp::WriteInXmlFile(std::string & xml_file)
 {
-  const char* aFilePath = _path_resources.c_str();
-  
+#if defined(_DEBUG_) || defined(_DEBUG)
+  std::cerr << "WriteInXmlFile : start" << std::endl;
+#endif
+  const char* aFilePath = xml_file.c_str();
   FILE* aFile = fopen(aFilePath, "w");
 
   if (aFile == NULL)
-    {
-#if defined(_DEBUG_) || defined(_DEBUG)
-      cerr << "Error opening file !"  << endl;
-#endif
-      return;
-    }
+  {
+    std::cerr << "Error opening file in WriteInXmlFile : " << xml_file << std::endl;
+    return;
+  }
   
   xmlDocPtr aDoc = xmlNewDoc(BAD_CAST "1.0");
   xmlNewDocComment(aDoc, BAD_CAST "ResourcesCatalog");
@@ -322,20 +365,15 @@ void ResourcesManager_cpp::WriteInXmlFile()
   handler->PrepareDocToXmlFile(aDoc);
   delete handler;
 
-#if defined(_DEBUG_) || defined(_DEBUG)
   int isOk = xmlSaveFile(aFilePath, aDoc);
-  if (!isOk) cerr << "Error while XML file saving." << endl;
-#else
-  xmlSaveFile(aFilePath, aDoc);
-#endif
+  if (!isOk) 
+     std::cerr << "Error while XML file saving : " << xml_file << std::endl;
   
   // Free the document
   xmlFreeDoc(aDoc);
-
   fclose(aFile);
-  
 #if defined(_DEBUG_) || defined(_DEBUG)
-  cerr << "WRITING DONE!" << endl;
+  std::cerr << "WriteInXmlFile : WRITING DONE!" << std::endl;
 #endif
 }
 
@@ -345,46 +383,86 @@ void ResourcesManager_cpp::WriteInXmlFile()
  */ 
 //=============================================================================
 
-const MapOfParserResourcesType& ResourcesManager_cpp::ParseXmlFile()
+const MapOfParserResourcesType& ResourcesManager_cpp::ParseXmlFiles()
 {
-  //Parse file only if its modification time is greater than lasttime (last registered modification time) 
-  static time_t lasttime=0;
-  struct stat statinfo;
-  int result = stat(_path_resources.c_str(), &statinfo);
-  if (result < 0) return _resourcesList;
-  if(statinfo.st_mtime <= lasttime)
-    return _resourcesList;
-  lasttime=statinfo.st_mtime;
+  // Parse file only if its modification time is greater than lasttime (last registered modification time)
+  bool to_parse = false;
+  for(_path_resources_it = _path_resources.begin(); _path_resources_it != _path_resources.end(); ++_path_resources_it)
+  {
+    struct stat statinfo;
+    int result = stat((*_path_resources_it).c_str(), &statinfo);
+    if (result < 0)
+    {
+      std::cerr << "Error in method stat for file : " << (*_path_resources_it).c_str() << " no new xml file is parsed" << std::endl;
+      return _resourcesList;
+    }
 
-  SALOME_ResourcesCatalog_Handler* handler =
-    new SALOME_ResourcesCatalog_Handler(_resourcesList, _resourcesBatchList);
+    if(statinfo.st_mtime > _lasttime)
+    {
+      to_parse = true;
+      _lasttime = statinfo.st_mtime;
+    }
+  }
 
-  const char* aFilePath = _path_resources.c_str();
-  FILE* aFile = fopen(aFilePath, "r");
-  
-  if (aFile != NULL)
+  if (to_parse)
+  {
+    _resourcesList.clear();
+    _resourcesBatchList.clear();
+    // On parse tous les fichiers
+    for(_path_resources_it = _path_resources.begin(); _path_resources_it != _path_resources.end(); ++_path_resources_it)
     {
-      xmlDocPtr aDoc = xmlReadFile(aFilePath, NULL, 0);
-      
-      if (aDoc != NULL)
-       handler->ProcessXmlDocument(aDoc);
-#if defined(_DEBUG_) || defined(_DEBUG)
+      MapOfParserResourcesType _resourcesList_tmp;
+      MapOfParserResourcesType _resourcesBatchList_tmp;
+      SALOME_ResourcesCatalog_Handler* handler =
+       new SALOME_ResourcesCatalog_Handler(_resourcesList_tmp, _resourcesBatchList_tmp);
+      const char* aFilePath = (*_path_resources_it).c_str();
+      FILE* aFile = fopen(aFilePath, "r");
+
+      if (aFile != NULL)
+      {
+       xmlDocPtr aDoc = xmlReadFile(aFilePath, NULL, 0);
+       if (aDoc != NULL)
+       {
+         handler->ProcessXmlDocument(aDoc);
+
+         // adding new resources to the file
+         for (MapOfParserResourcesType_it i = _resourcesList_tmp.begin(); i != _resourcesList_tmp.end(); ++i)
+         {
+           MapOfParserResourcesType_it j = _resourcesList.find(i->first);
+           if (j == _resourcesList.end())
+           {
+             _resourcesList[i->first] = i->second;
+           }
+           else
+           {
+             std::cerr << "ParseXmlFiles Warning, to resource with the same name was found, taking the first declaration : " << i->first << std::endl;
+           }
+         }
+         for (MapOfParserResourcesType_it i = _resourcesBatchList_tmp.begin(); i != _resourcesBatchList_tmp.end(); ++i)
+         {
+           MapOfParserResourcesType_it j = _resourcesBatchList.find(i->first);
+           if (j == _resourcesBatchList.end())
+           {
+             _resourcesBatchList[i->first] = i->second;
+           }
+           else
+           {
+             std::cerr << "ParseXmlFiles Warning, to resource with the same name was found, taking the first declaration : " << i->first << std::endl;
+           }
+         }
+       }
+       else
+         std::cerr << "ResourcesManager_cpp: could not parse file " << aFilePath << std::endl;
+       // Free the document
+       xmlFreeDoc(aDoc);
+       fclose(aFile);
+      }
       else
-       cerr << "ResourcesManager_cpp: could not parse file "<< aFilePath << endl;
-#endif
-      
-      // Free the document
-      xmlFreeDoc(aDoc);
+       std::cerr << "ResourcesManager_cpp: file " << aFilePath << " is not readable." << std::endl;
 
-      fclose(aFile);
+      delete handler;
     }
-#if defined(_DEBUG_) || defined(_DEBUG)
-  else
-    cerr << "ResourcesManager_cpp: file "<<aFilePath<<" is not readable." << endl;
-#endif
-  
-  delete handler;
-
+  }
   return _resourcesList;
 }
 
index c343a73e0fc0ef80c89a20e0420f449ddf37af10..9d95ee3f72d0e6a8e5637d5c12d49ee15d606b4c 100644 (file)
 #include <string>
 #include <fstream>
 #include <vector>
+#include <list>
 #include "SALOME_ResourcesCatalog_Parser.hxx"
 #include "SALOME_ResourcesCatalog_Handler.hxx"
 #include "SALOME_LoadRateManager.hxx"
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef WNT
+#else
+#include <unistd.h>
+#endif
 
 // --- WARNING ---
 // The call of BuildTempFileToLaunchRemoteContainer and RmTmpFile must be done
 struct machineParams{
   std::string hostname;
   std::string OS;
+  std::string parallelLib;
   unsigned int nb_node;
   unsigned int nb_proc_per_node;
   unsigned int cpu_clock;
   unsigned int mem_mb;
+  unsigned int nb_component_nodes;
   std::vector<std::string> componentList;
   std::vector<std::string> computerList;
 };
@@ -81,9 +90,9 @@ class RESOURCESMANAGER_EXPORT ResourcesManager_cpp
 
     void DeleteResourceInCatalog(const char *hostname);
 
-    void WriteInXmlFile();
+    void WriteInXmlFile(std::string & xml_file);
 
-    const MapOfParserResourcesType& ParseXmlFile();
+    const MapOfParserResourcesType& ParseXmlFiles();
 
     const MapOfParserResourcesType& GetList() const;
 
@@ -100,7 +109,8 @@ class RESOURCESMANAGER_EXPORT ResourcesManager_cpp
       throw(ResourcesException);
 
     //! will contain the path to the ressources catalog
-    std::string _path_resources;
+    std::list<std::string> _path_resources;
+    std::list<std::string>::iterator _path_resources_it;
 
     //! will contain the informations on the data type catalog(after parsing)
     MapOfParserResourcesType _resourcesList;
@@ -111,8 +121,8 @@ class RESOURCESMANAGER_EXPORT ResourcesManager_cpp
     //! a map that contains all the available load rate managers (the key is the name)
     std::map<std::string , LoadRateManager*> _resourceManagerMap;
 
-    //! different behaviour if $APPLI exists (SALOME Application) 
-    bool _isAppliSalomeDefined;    
+    //! contain the time where resourcesList was created
+    time_t _lasttime;
   };
 
 #endif // __RESOURCESMANAGER_HXX__
index e990944c05d4a643eda6b7733c223a6b40d1cf57..4234cda85e3162dacf7a25ce2f6c9518aac7d22f 100755 (executable)
@@ -47,8 +47,7 @@ SALOME_ResourcesCatalog_Handler(MapOfParserResourcesType& resources_list,
 {
   //XML tags initialisation
   test_machine = "machine";
-  test_resources = "resources";
-
+  test_cluster = "cluster";
   test_hostname = "hostname";
   test_alias = "alias";
   test_protocol = "protocol";
@@ -65,9 +64,12 @@ SALOME_ResourcesCatalog_Handler(MapOfParserResourcesType& resources_list,
   test_mem_in_mb = "memInMB";
   test_cpu_freq_mhz = "CPUFreqMHz";
   test_nb_of_nodes = "nbOfNodes";
+  test_nb_of_proc = "nbOfProc";
   test_nb_of_proc_per_node = "nbOfProcPerNode";
   test_batch_queue = "batchQueue";
   test_user_commands = "userCommands";
+  test_use = "use";
+  test_members = "members";
 }
 
 //=============================================================================
@@ -108,274 +110,487 @@ void SALOME_ResourcesCatalog_Handler::ProcessXmlDocument(xmlDocPtr theDoc)
   xmlNodePtr aCurNode = xmlDocGetRootElement(theDoc);
 
   aCurNode = aCurNode->xmlChildrenNode;
-  
   // Processing the document nodes
   while(aCurNode != NULL)
+  {
+    // Cas d'une machine ou d'une machine batch
+    if ( !xmlStrcmp(aCurNode->name,(const xmlChar*)test_machine) )
     {
-      if ( !xmlStrcmp(aCurNode->name,(const xmlChar*)test_machine) )
+      _resource.Clear();
+      bool Ok = ProcessMachine(aCurNode, _resource);
+      if (Ok)
+      {
+       // There is two lists
+       // _resources_list for interactive resources
+       // _resources_batch_list for batch resources
+       // This choice is done with Mode parameter
+       if (_resource.Mode == interactive)
        {
-          _resource.Clear();
-         if (xmlHasProp(aCurNode, (const xmlChar*)test_hostname))
-            {
-             xmlChar* hostname = xmlGetProp(aCurNode, (const xmlChar*)test_hostname);
-             _resource.DataForSort._hostName = (const char*)hostname;
-             _resource.HostName = (const char*)hostname;
-              xmlFree(hostname);
-            }
-         else
-           break;
-
-         if (xmlHasProp(aCurNode, (const xmlChar*)test_alias))
-            {
-             xmlChar* alias = xmlGetProp(aCurNode, (const xmlChar*)test_alias);
-             _resource.Alias = (const char*)alias;
-              xmlFree(alias);
-            }
+         // Adding a generic cluster
+         int aNbNodes = _resource.DataForSort._nbOfNodes;
+         if( aNbNodes > 1 ){
+           string clusterNode = _resource.DataForSort._hostName ;
+           for( int i=0; i < aNbNodes; i++ ){
+             char inode[64];
+             inode[0] = '\0' ;
+             sprintf(inode,"%s%d",clusterNode.c_str(),i+1);
+             std::string nodeName(inode);
+             _resource.DataForSort._hostName = nodeName ;
+             _resource.HostName = nodeName ;
+             _resources_list[nodeName] = _resource;
+           }
+         }
          else
-           _resource.Alias = "";
-
-          if (xmlHasProp(aCurNode, (const xmlChar*)test_batch_queue))
-            {
-              xmlChar* batch_queue = xmlGetProp(aCurNode, (const xmlChar*)test_batch_queue);
-              _resource.batchQueue = (const char*)batch_queue;
-              xmlFree(batch_queue);
-            }
-          else
-            _resource.batchQueue = "";
-
-          if (xmlHasProp(aCurNode, (const xmlChar*)test_user_commands))
-            {
-              xmlChar* user_commands= xmlGetProp(aCurNode, (const xmlChar*)test_user_commands);
-              _resource.userCommands = (const char*)user_commands;
-              xmlFree(user_commands);
-            }
-          else
-            _resource.userCommands = "";
-          
-          if (xmlHasProp(aCurNode, (const xmlChar*)test_protocol))
-            {
-              xmlChar* protocol= xmlGetProp(aCurNode, (const xmlChar*)test_protocol);
-              switch ( protocol[0])
-               {
-               case 'r':
-                 _resource.Protocol = rsh;
-                 break;
-               case 's':
-                 _resource.Protocol = ssh;
-                 break;
-               default:
-                 // If it'not in all theses cases, the protocol is affected to rsh
-                 _resource.Protocol = rsh;
-                 break;
-               }
-              xmlFree(protocol);
-            }
-          else
-            _resource.Protocol = rsh;
-         
-         if (xmlHasProp(aCurNode, (const xmlChar*)test_mode))
-            {
-             xmlChar* mode=xmlGetProp(aCurNode, (const xmlChar*)test_mode);
-             switch ( mode[0] )
-                {
-                case 'i':
-                  _resource.Mode = interactive;
-                  break;
-               case 'b':
-                  _resource.Mode = batch;
-                  break;
-                default:
-                  // If it'not in all theses cases, the mode is affected to interactive
-                  _resource.Mode = interactive;
-                  break;
-                }
-              xmlFree(mode);
-            }
-          else
-            _resource.Mode = interactive;
-
-         if (xmlHasProp(aCurNode, (const xmlChar*)test_batch))
-            {
-              xmlChar* batch = xmlGetProp(aCurNode, (const xmlChar*)test_batch);
-              std::string aBatch = (const char*)batch;
-              xmlFree(batch);
-              if (aBatch == "pbs")
-                _resource.Batch = pbs;
-              else if  (aBatch == "lsf")
-                _resource.Batch = lsf;
-              else if  (aBatch == "sge")
-                _resource.Batch = sge;
-              else
-                _resource.Batch = none;
-            }
-
-         if (xmlHasProp(aCurNode, (const xmlChar*)test_mpi))
-            {
-              xmlChar* mpi = xmlGetProp(aCurNode, (const xmlChar*)test_mpi);
-              std::string anMpi = (const char*)mpi;
-              xmlFree(mpi);
-              if (anMpi == "lam")
-                _resource.mpi = lam;
-              else if (anMpi == "mpich1")
-                _resource.mpi = mpich1;
-              else if (anMpi == "mpich2")
-                _resource.mpi = mpich2;
-              else if (anMpi == "openmpi")
-                _resource.mpi = openmpi;
-              else if  (anMpi == "slurm")
-                _resource.mpi = slurm;
-              else if  (anMpi == "prun")
-                _resource.mpi = prun;
-              else
-                _resource.mpi = nompi;
-            }
-
-         if (xmlHasProp(aCurNode, (const xmlChar*)test_user_name))
-            {
-             xmlChar* user_name= xmlGetProp(aCurNode, (const xmlChar*)test_user_name);
-             _resource.UserName = (const char*)user_name;
-              xmlFree(user_name);
-            }
-         
-         if (xmlHasProp(aCurNode, (const xmlChar*)test_appli_path))
-            {
-             xmlChar* appli_path = xmlGetProp(aCurNode, (const xmlChar*)test_appli_path);
-             _resource.AppliPath = (const char*)appli_path;
-              xmlFree(appli_path);
-            }
-         
-         if (xmlHasProp(aCurNode, (const xmlChar*)test_os))
-            {
-             xmlChar* os = xmlGetProp(aCurNode, (const xmlChar*)test_os);
-             _resource.OS = (const char*)os;
-              xmlFree(os);
-            }
-         
-         if (xmlHasProp(aCurNode, (const xmlChar*)test_mem_in_mb))
-            {
-             xmlChar* mem_in_mb = xmlGetProp(aCurNode, (const xmlChar*)test_mem_in_mb);
-             _resource.DataForSort._memInMB = atoi((const char*)mem_in_mb);
-              xmlFree(mem_in_mb);
-            }
-         
-         if (xmlHasProp(aCurNode, (const xmlChar*)test_cpu_freq_mhz))
-            {
-             xmlChar* cpu_freq_mhz = xmlGetProp(aCurNode, (const xmlChar*)test_cpu_freq_mhz);
-             _resource.DataForSort._CPUFreqMHz = atoi((const char*)cpu_freq_mhz);
-              xmlFree(cpu_freq_mhz);
-            }
-         
-         if (xmlHasProp(aCurNode, (const xmlChar*)test_nb_of_nodes))
-            {
-             xmlChar* nb_of_nodes = xmlGetProp(aCurNode, (const xmlChar*)test_nb_of_nodes);
-             _resource.DataForSort._nbOfNodes = atoi((const char*)nb_of_nodes);
-              xmlFree(nb_of_nodes);
-            }
-         
-         if (xmlHasProp(aCurNode, (const xmlChar*)test_nb_of_proc_per_node))
-            {
-             xmlChar* nb_of_proc_per_node = xmlGetProp(aCurNode, (const xmlChar*)test_nb_of_proc_per_node);
-             _resource.DataForSort._nbOfProcPerNode = atoi((const char*)nb_of_proc_per_node);
-              xmlFree(nb_of_proc_per_node);
-            }
-         
-         // Process components
-         xmlNodePtr aCurSubNode = aCurNode->xmlChildrenNode;
-         while(aCurSubNode != NULL)
+         {
+           // Adding a machine
+           _resources_list[_resource.HostName] = _resource;
+           if(_resource.HostName == "localhost")
            {
-             if ( !xmlStrcmp(aCurSubNode->name, (const xmlChar*)test_components) )
-               {
-                  //If a component is given, it is in a module with the same name
-                  //except if the module name is given
-                 if (xmlHasProp(aCurSubNode, (const xmlChar*)test_component_name)) 
-                   {
-                     xmlChar* component_name = xmlGetProp(aCurSubNode, (const xmlChar*)test_component_name);
-                     std::string aComponentName = (const char*)component_name;
-                      _resource.ComponentsList.push_back(aComponentName);
-                     if (xmlHasProp(aCurSubNode, (const xmlChar*)test_module_name)) 
-                        {
-                         xmlChar* module_name = xmlGetProp(aCurSubNode, (const xmlChar*)test_module_name);
-                         std::string aModuleName = (const char*)module_name;
-                          _resource.ModulesList.push_back(aModuleName);
-                          xmlFree(module_name);
-                        }
-                      else
-                        _resource.ModulesList.push_back(aComponentName);
-                      xmlFree(component_name);
-                   }
-               }
-              else if ( !xmlStrcmp(aCurSubNode->name, (const xmlChar*)test_modules) )
-               {
-                  // If a module is given, we create an entry in componentsList and modulesList
-                  // with the same name (module == component)
-                 if (xmlHasProp(aCurSubNode, (const xmlChar*)test_module_name)) 
-                   {
-                     xmlChar* component_name = xmlGetProp(aCurSubNode, (const xmlChar*)test_module_name);
-                     std::string aComponentName = (const char*)component_name;
-                      _resource.ComponentsList.push_back(aComponentName);
-                      _resource.ModulesList.push_back(aComponentName);
-                      xmlFree(component_name);
-                   }
-               }
-             aCurSubNode = aCurSubNode->next;
+             _resource.HostName = Kernel_Utils::GetHostname();
+             _resource.DataForSort._hostName = Kernel_Utils::GetHostname();
+             _resources_list[Kernel_Utils::GetHostname()] = _resource;
            }
-        
-         // There is two lists
-         // _resources_list for interactive resources
-         // _resources_batch_list for batch resources
-         // This choice is done with Mode parameter
-         if (_resource.Mode == interactive)
-         {
-           int aNbNodes = _resource.DataForSort._nbOfNodes;
-           if( aNbNodes > 1 ){
-             string clusterNode = _resource.DataForSort._hostName ;
-             for( int i=0; i < aNbNodes; i++ ){
-               char inode[64];
-               inode[0] = '\0' ;
-               sprintf(inode,"%s%d",clusterNode.c_str(),i+1);
-               std::string nodeName(inode);
-               _resource.DataForSort._hostName = nodeName ;
-               _resource.HostName = nodeName ;
-               _resources_list[nodeName] = _resource;
-             }
-            }
-            else
-              {
-                if(_resource.HostName == "localhost")
-                  {
-                    _resource.HostName = Kernel_Utils::GetHostname();
-                    _resource.DataForSort._hostName = Kernel_Utils::GetHostname();
-                    _resources_list[Kernel_Utils::GetHostname()] = _resource;
-                  }
-                else
-                  _resources_list[_resource.HostName] = _resource;
-              }
-          }
-          else
-            _resources_batch_list[_resource.HostName] = _resource;
-        }
-      aCurNode = aCurNode->next;
+         }
+       }
+       else
+         // Adding a batch machine/cluster
+         _resources_batch_list[_resource.HostName] = _resource;
+      }
     }
+    if ( !xmlStrcmp(aCurNode->name,(const xmlChar*)test_cluster) )
+    {
+      // Cas de la déclaration d'un cluster
+      _resource.Clear();
+      if(ProcessCluster(aCurNode, _resource))
+       _resources_list[_resource.HostName] = _resource;
+    }
+    aCurNode = aCurNode->next;
+  }
 
 #ifdef _DEBUG_
-    for (map<string, ParserResourcesType>::const_iterator iter =
-          _resources_list.begin();
-        iter != _resources_list.end();
-        iter++)
-      {
-       std::cerr << (*iter).first << std::endl;
-       std::cerr << (*iter).second.HostName << std::endl;
-       std::cerr << (*iter).second.Alias << std::endl;
-       std::cerr << (*iter).second.UserName << std::endl;
-       std::cerr << (*iter).second.AppliPath << std::endl;
-       std::cerr << (*iter).second.OS << std::endl;
-       std::cerr << (*iter).second.Protocol << std::endl;
-       std::cerr << (*iter).second.Mode << std::endl;
-      }
+  for (map<string, ParserResourcesType>::const_iterator iter = _resources_list.begin();
+       iter != _resources_list.end();
+       iter++)
+  {
+    std::cerr << (*iter).first << std::endl;
+    std::cerr << (*iter).second.HostName << std::endl;
+    std::cerr << (*iter).second.Alias << std::endl;
+    std::cerr << (*iter).second.UserName << std::endl;
+    std::cerr << (*iter).second.AppliPath << std::endl;
+    std::cerr << (*iter).second.OS << std::endl;
+    std::cerr << (*iter).second.Protocol << std::endl;
+    std::cerr << (*iter).second.Mode << std::endl;
+  }
 #endif
 
 }
 
+bool
+SALOME_ResourcesCatalog_Handler::ProcessCluster(xmlNodePtr cluster_descr, ParserResourcesType & resource)
+{
+  // Ajout d'un cluster
+  // hostname, use et nbOfProc sont obligatoires
+  if (xmlHasProp(cluster_descr, (const xmlChar*)test_hostname))
+  {
+    xmlChar* hostname = xmlGetProp(cluster_descr, (const xmlChar*)test_hostname);
+    resource.DataForSort._hostName = (const char*)hostname;
+    resource.HostName = (const char*)hostname;
+    xmlFree(hostname);
+  }
+  else
+  {
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessCluster : !!! Warning !!! found a cluster without a hostname" << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessCluster : !!! Warning !!! this cluster will not be added" << std::endl;
+    return false;
+  }
+
+  if (xmlHasProp(cluster_descr, (const xmlChar*)test_use))
+  {
+    xmlChar* use = xmlGetProp(cluster_descr, (const xmlChar*)test_use);
+    resource.use = (const char*)use;
+    xmlFree(use);
+  }
+  else
+  {
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessCluster : !!! Warning !!! found a cluster without a use" << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessCluster : !!! Warning !!! this cluster will not be added" << std::endl;
+    return false;
+  }
+
+  if (xmlHasProp(cluster_descr, (const xmlChar*)test_nb_of_proc))
+  {
+    xmlChar* nb_of_proc = xmlGetProp(cluster_descr, (const xmlChar*)test_nb_of_proc);
+    resource.nbOfProc = atoi((const char*)nb_of_proc);
+    xmlFree(nb_of_proc);
+  }
+  else
+  {
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessCluster : !!! Warning !!! found a cluster without a nbOfProc" << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessCluster : !!! Warning !!! this cluster will not be added" << std::endl;
+    return false;
+  }
+
+  if (xmlHasProp(cluster_descr, (const xmlChar*)test_mpi))
+  {
+    xmlChar* mpi = xmlGetProp(cluster_descr, (const xmlChar*)test_mpi);
+    std::string anMpi = (const char*)mpi;
+    xmlFree(mpi);
+    if (anMpi == "lam")
+      resource.mpi = lam;
+    else if (anMpi == "mpich1")
+      resource.mpi = mpich1;
+    else if (anMpi == "mpich2")
+      resource.mpi = mpich2;
+    else if (anMpi == "openmpi")
+      resource.mpi = openmpi;
+    else if  (anMpi == "slurm")
+      resource.mpi = slurm;
+    else if  (anMpi == "prun")
+      resource.mpi = prun;
+    else
+      resource.mpi = nompi;
+  }
+
+  // Parsing des membres du cluster 
+  xmlNodePtr aCurSubNode = cluster_descr->xmlChildrenNode;
+  while(aCurSubNode != NULL)
+  {
+    if (!xmlStrcmp(aCurSubNode->name, (const xmlChar*)test_members))
+    {
+       xmlNodePtr members = aCurSubNode->xmlChildrenNode;
+       while (members != NULL)
+       {
+        // Process members
+        if (!xmlStrcmp(members->name, (const xmlChar*)test_machine))
+        {
+          ParserResourcesClusterMembersType new_member;
+          if (ProcessMember(members, new_member))
+            resource.ClusterMembersList.push_back(new_member);
+        }
+        members = members->next;
+       }
+    }
+    aCurSubNode = aCurSubNode->next;
+  }
+
+  // Test: Il faut au moins un membre pour que le cluster soit correct !
+  if (resource.ClusterMembersList.empty())
+  {
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessCluster : !!! Warning !!! found a cluster without a member" << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessCluster : !!! Warning !!! this cluster will not be added" << std::endl;
+    return false;
+  }
+  return true;
+}
+
+bool
+SALOME_ResourcesCatalog_Handler::ProcessMember(xmlNodePtr member_descr, ParserResourcesClusterMembersType & resource)
+{
+  if (xmlHasProp(member_descr, (const xmlChar*)test_hostname))
+  {
+    xmlChar* hostname = xmlGetProp(member_descr, (const xmlChar*)test_hostname);
+    resource.DataForSort._hostName = (const char*)hostname;
+    resource.HostName = (const char*)hostname;
+    xmlFree(hostname);
+  }
+  else
+  {
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning found a machine without a hostname" << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning this machine will not be added" << std::endl;
+    return false;
+  }
+
+  if (xmlHasProp(member_descr, (const xmlChar*)test_protocol))
+  {
+    xmlChar* protocol= xmlGetProp(member_descr, (const xmlChar*)test_protocol);
+    switch (protocol[0])
+    {
+      case 'r':
+       resource.Protocol = rsh;
+       break;
+      case 's':
+       resource.Protocol = ssh;
+       break;
+      default:
+       std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning found a machine with a bad protocol" << std::endl;
+       std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning this machine will not be added" << std::endl;
+       return false;
+    }
+    xmlFree(protocol);
+  }
+  else
+  {
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning found a machine without a protocol" << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning this machine will not be added" << std::endl;
+    return false;
+  }
+
+  if (xmlHasProp(member_descr, (const xmlChar*)test_user_name))
+  {
+    xmlChar* user_name= xmlGetProp(member_descr, (const xmlChar*)test_user_name);
+    resource.UserName = (const char*)user_name;
+    xmlFree(user_name);
+  }
+  else
+  {
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning found a machine without a user name" << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning this machine will not be added" << std::endl;
+    return false;
+  }
+
+  if (xmlHasProp(member_descr, (const xmlChar*)test_nb_of_nodes))
+  {
+    xmlChar* nb_of_nodes = xmlGetProp(member_descr, (const xmlChar*)test_nb_of_nodes);
+    resource.DataForSort._nbOfNodes = atoi((const char*)nb_of_nodes);
+    xmlFree(nb_of_nodes);
+  }
+  else
+  {
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning found a machine without a nbOfNodes" << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning this machine will not be added" << std::endl;
+    return false;
+  }
+
+  if (xmlHasProp(member_descr, (const xmlChar*)test_nb_of_proc_per_node))
+  {
+    xmlChar* nb_of_proc_per_node = xmlGetProp(member_descr, (const xmlChar*)test_nb_of_proc_per_node);
+    resource.DataForSort._nbOfProcPerNode = atoi((const char*)nb_of_proc_per_node);
+    xmlFree(nb_of_proc_per_node);
+  }
+  else
+  {
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning found a machine without a nbOfProcPerNode" << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning this machine will not be added" << std::endl;
+    return false;
+  }
+
+  if (xmlHasProp(member_descr, (const xmlChar*)test_appli_path))
+  {
+    xmlChar* appli_path = xmlGetProp(member_descr, (const xmlChar*)test_appli_path);
+    resource.AppliPath = (const char*)appli_path;
+    xmlFree(appli_path);
+  }
+  else
+  {
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning found a machine without a AppliPath" << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning this machine will not be added" << std::endl;
+    return false;
+  }
+  return true;
+}
+
+bool
+SALOME_ResourcesCatalog_Handler::ProcessMachine(xmlNodePtr machine_descr, ParserResourcesType & resource)
+{
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_hostname))
+  {
+    xmlChar* hostname = xmlGetProp(machine_descr, (const xmlChar*)test_hostname);
+    resource.DataForSort._hostName = (const char*)hostname;
+    resource.HostName = (const char*)hostname;
+    xmlFree(hostname);
+  }
+  else
+  {
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMachine : Warning found a machine without a hostname" << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMachine : Warning this machine will not be added" << std::endl;
+    return false;
+  }
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_alias))
+  {
+    xmlChar* alias = xmlGetProp(machine_descr, (const xmlChar*)test_alias);
+    resource.Alias = (const char*)alias;
+    xmlFree(alias);
+  }
+  else
+    resource.Alias = "";
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_batch_queue))
+  {
+    xmlChar* batch_queue = xmlGetProp(machine_descr, (const xmlChar*)test_batch_queue);
+    resource.batchQueue = (const char*)batch_queue;
+    xmlFree(batch_queue);
+  }
+  else
+    resource.batchQueue = "";
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_user_commands))
+  {
+    xmlChar* user_commands= xmlGetProp(machine_descr, (const xmlChar*)test_user_commands);
+    resource.userCommands = (const char*)user_commands;
+    xmlFree(user_commands);
+  }
+  else
+    resource.userCommands = "";
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_protocol))
+  {
+    xmlChar* protocol= xmlGetProp(machine_descr, (const xmlChar*)test_protocol);
+    switch ( protocol[0])
+    {
+      case 'r':
+       resource.Protocol = rsh;
+       break;
+      case 's':
+       resource.Protocol = ssh;
+       break;
+      default:
+       // If it'not in all theses cases, the protocol is affected to rsh
+       resource.Protocol = rsh;
+       break;
+    }
+    xmlFree(protocol);
+  }
+  else
+    resource.Protocol = rsh;
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_mode))
+  {
+    xmlChar* mode=xmlGetProp(machine_descr, (const xmlChar*)test_mode);
+    switch ( mode[0] )
+    {
+      case 'i':
+       resource.Mode = interactive;
+       break;
+      case 'b':
+       resource.Mode = batch;
+       break;
+      default:
+       // If it'not in all theses cases, the mode is affected to interactive
+       resource.Mode = interactive;
+       break;
+    }
+    xmlFree(mode);
+  }
+  else
+    resource.Mode = interactive;
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_batch))
+  {
+    xmlChar* batch = xmlGetProp(machine_descr, (const xmlChar*)test_batch);
+    std::string aBatch = (const char*)batch;
+    xmlFree(batch);
+    if (aBatch == "pbs")
+      resource.Batch = pbs;
+    else if  (aBatch == "lsf")
+      resource.Batch = lsf;
+    else if  (aBatch == "sge")
+      resource.Batch = sge;
+    else
+      resource.Batch = none;
+  }
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_mpi))
+  {
+    xmlChar* mpi = xmlGetProp(machine_descr, (const xmlChar*)test_mpi);
+    std::string anMpi = (const char*)mpi;
+    xmlFree(mpi);
+    if (anMpi == "lam")
+      resource.mpi = lam;
+    else if (anMpi == "mpich1")
+      resource.mpi = mpich1;
+    else if (anMpi == "mpich2")
+      resource.mpi = mpich2;
+    else if (anMpi == "openmpi")
+      resource.mpi = openmpi;
+    else if  (anMpi == "slurm")
+      resource.mpi = slurm;
+    else if  (anMpi == "prun")
+      resource.mpi = prun;
+    else
+      resource.mpi = nompi;
+  }
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_user_name))
+  {
+    xmlChar* user_name= xmlGetProp(machine_descr, (const xmlChar*)test_user_name);
+    resource.UserName = (const char*)user_name;
+    xmlFree(user_name);
+  }
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_appli_path))
+  {
+    xmlChar* appli_path = xmlGetProp(machine_descr, (const xmlChar*)test_appli_path);
+    resource.AppliPath = (const char*)appli_path;
+    xmlFree(appli_path);
+  }
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_os))
+  {
+    xmlChar* os = xmlGetProp(machine_descr, (const xmlChar*)test_os);
+    resource.OS = (const char*)os;
+    xmlFree(os);
+  }
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_mem_in_mb))
+  {
+    xmlChar* mem_in_mb = xmlGetProp(machine_descr, (const xmlChar*)test_mem_in_mb);
+    resource.DataForSort._memInMB = atoi((const char*)mem_in_mb);
+    xmlFree(mem_in_mb);
+  }
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_cpu_freq_mhz))
+  {
+    xmlChar* cpu_freq_mhz = xmlGetProp(machine_descr, (const xmlChar*)test_cpu_freq_mhz);
+    resource.DataForSort._CPUFreqMHz = atoi((const char*)cpu_freq_mhz);
+    xmlFree(cpu_freq_mhz);
+  }
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_nb_of_nodes))
+  {
+    xmlChar* nb_of_nodes = xmlGetProp(machine_descr, (const xmlChar*)test_nb_of_nodes);
+    resource.DataForSort._nbOfNodes = atoi((const char*)nb_of_nodes);
+    xmlFree(nb_of_nodes);
+  }
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_nb_of_proc_per_node))
+  {
+    xmlChar* nb_of_proc_per_node = xmlGetProp(machine_descr, (const xmlChar*)test_nb_of_proc_per_node);
+    resource.DataForSort._nbOfProcPerNode = atoi((const char*)nb_of_proc_per_node);
+    xmlFree(nb_of_proc_per_node);
+  }
+
+  // Process children nodes
+  xmlNodePtr aCurSubNode = machine_descr->xmlChildrenNode;
+  while(aCurSubNode != NULL)
+  {
+    if ( !xmlStrcmp(aCurSubNode->name, (const xmlChar*)test_components) )
+    {
+      //If a component is given, it is in a module with the same name
+      //except if the module name is given
+      if (xmlHasProp(aCurSubNode, (const xmlChar*)test_component_name)) 
+      {
+       xmlChar* component_name = xmlGetProp(aCurSubNode, (const xmlChar*)test_component_name);
+       std::string aComponentName = (const char*)component_name;
+       _resource.ComponentsList.push_back(aComponentName);
+       if (xmlHasProp(aCurSubNode, (const xmlChar*)test_module_name)) 
+       {
+         xmlChar* module_name = xmlGetProp(aCurSubNode, (const xmlChar*)test_module_name);
+         std::string aModuleName = (const char*)module_name;
+         _resource.ModulesList.push_back(aModuleName);
+         xmlFree(module_name);
+       }
+       else
+         _resource.ModulesList.push_back(aComponentName);
+       xmlFree(component_name);
+      }
+    }
+    // Process modules
+    if ( !xmlStrcmp(aCurSubNode->name, (const xmlChar*)test_modules) )
+    {
+      if (xmlHasProp(aCurSubNode, (const xmlChar*)test_module_name)) 
+      {
+       xmlChar* module_name = xmlGetProp(aCurSubNode, (const xmlChar*)test_module_name);
+       std::string aModuleName = (const char*)module_name;
+       resource.ModulesList.push_back(aModuleName);
+       xmlFree(module_name);
+      }
+    }
+    aCurSubNode = aCurSubNode->next;
+  }
+  return true;
+}
 
 //=============================================================================
 /*!
index a48dded3cc61b7b178959346417cdc62e42ff9af..c0445989f6ed991b53590eeb992b71c706c2c585 100755 (executable)
@@ -50,6 +50,10 @@ class RESOURCESMANAGER_EXPORT SALOME_ResourcesCatalog_Handler
     virtual ~SALOME_ResourcesCatalog_Handler();
 
     void ProcessXmlDocument(xmlDocPtr theDoc);
+
+    bool ProcessMachine(xmlNodePtr machine_descr, ParserResourcesType & resource);
+    bool ProcessCluster(xmlNodePtr cluster_descr, ParserResourcesType & resource);
+    bool ProcessMember(xmlNodePtr member_descr, ParserResourcesClusterMembersType & resource);
   
     void PrepareDocToXmlFile(xmlDocPtr theDoc);
 
@@ -61,8 +65,7 @@ class RESOURCESMANAGER_EXPORT SALOME_ResourcesCatalog_Handler
     MapOfParserResourcesType& _resources_batch_list;
 
     const char *test_machine;
-    const char *test_resources;
-
+    const char *test_cluster;
     const char *test_hostname;
     const char *test_alias;
     const char *test_protocol;
@@ -80,9 +83,12 @@ class RESOURCESMANAGER_EXPORT SALOME_ResourcesCatalog_Handler
     const char *test_mem_in_mb;
     const char *test_cpu_freq_mhz;
     const char *test_nb_of_nodes;
+    const char *test_nb_of_proc;
     const char *test_nb_of_proc_per_node;
     const char *test_batch_queue;
     const char *test_user_commands;
+    const char *test_use;
+    const char *test_members;
 
   };
 
index 510a00437d4a82cc4765659561ee8611dcaf2f02..40870f49e2b2b5447a4680d32e8b7ae70c88c160 100644 (file)
@@ -114,7 +114,7 @@ void ResourceDataToSort::Print() const
     cout << _memInMB << endl;
   }
 
-void ParserResourcesType::Print() const
+void ParserResourcesType::Print()
 {
   ostringstream oss;
   oss << endl <<
@@ -133,11 +133,22 @@ void ParserResourcesType::Print() const
     "OS : " << OS << endl <<
     "batchQueue : " << batchQueue << endl <<
     "userCommands : " << userCommands << endl <<
+    "use : " << use << endl <<
+    "NbOfProc : " << nbOfProc << endl <<
+    "Modules : " << endl <<
     "Components : " << endl;
 
   for(int i=0;i<ComponentsList.size();i++)
     oss << "Component " << i+1 << " called : " << ComponentsList[i] << endl;
 
+  
+  std::list<ParserResourcesClusterMembersType>::iterator it;
+  for(it = ClusterMembersList.begin(); 
+      it != ClusterMembersList.end();
+      it++)
+  {
+    oss << "Cluster member  called : " << (*it).HostName << endl;
+  }
   cout << oss.str() << endl;
 
 }
@@ -161,4 +172,7 @@ void ParserResourcesType::Clear()
   userCommands = "";
   ComponentsList.clear();
   OS = "";
+  use = "";
+  ClusterMembersList.clear();
+  nbOfProc = 1;
 }
index 95ff5968373760c6dfe174e13dc85012525a36e7..e4ad2d55f1b80723e31b95667ed11e54361c0e8c 100755 (executable)
@@ -32,6 +32,7 @@
 
 #include <string>
 #include <vector>
+#include <list>
 #include <map>
 #include <iostream>
 
@@ -71,27 +72,40 @@ class RESOURCESMANAGER_EXPORT ResourceDataToSort
     unsigned int GetNumberOfPoints() const;
   };
 
+struct RESOURCESMANAGER_EXPORT ParserResourcesClusterMembersType
+{
+  std::string HostName;
+  AccessProtocolType Protocol;
+  std::string UserName;
+  std::string AppliPath;
+  ResourceDataToSort DataForSort;
+};
+
 struct RESOURCESMANAGER_EXPORT ParserResourcesType
-  {
-    ResourceDataToSort DataForSort;
-    std::string HostName;
-    std::string Alias;
-    AccessProtocolType Protocol;
-    AccessModeType Mode;
-    BatchType Batch;
-    MpiImplType mpi;
-    std::string UserName;
-    std::string AppliPath;
-    std::vector<std::string> ComponentsList;
-    std::vector<std::string> ModulesList;
-    std::string OS;
-    std::string batchQueue;
-    std::string userCommands;
+{
+  ResourceDataToSort DataForSort;
+  std::string HostName;
+  std::string Alias;
+  AccessProtocolType Protocol;
+  AccessModeType Mode;
+  BatchType Batch;
+  MpiImplType mpi;
+  std::string UserName;
+  std::string AppliPath;
+  std::vector<std::string> ComponentsList;
+  std::vector<std::string> ModulesList;
+  std::string OS;
+  std::string batchQueue;
+  std::string userCommands;
+  std::string use;
+  std::list<ParserResourcesClusterMembersType> ClusterMembersList;
+  unsigned int nbOfProc;
 
-    void Print() const;
-    void Clear();
-  };
+  void Print();
+  void Clear();
+};
 
 typedef std::map<std::string, ParserResourcesType> MapOfParserResourcesType;
+typedef std::map<std::string, ParserResourcesType>::iterator MapOfParserResourcesType_it;
 
 #endif //SALOME_RESOURCES_CATALOG_PARSER
index 3531bc30be0a4bbc529a5bfc55809bf3ddd1a78e..91d2de5c9cdd8938f9b081f8443ff1c9febf0444 100644 (file)
@@ -25,6 +25,7 @@
 #include "OpUtil.hxx"
 
 #include <stdlib.h>
+#include <stdio.h>
 #ifndef WIN32
 #include <unistd.h>
 #else
@@ -149,6 +150,8 @@ SALOME_ResourcesManager::GetFittingResources(const Engines::MachineParameters& p
   p.nb_proc_per_node = params.nb_proc_per_node;
   p.cpu_clock = params.cpu_clock;
   p.mem_mb = params.mem_mb;
+  p.parallelLib = params.parallelLib;
+  p.nb_component_nodes = params.nb_component_nodes;
 
   for(unsigned int i=0;i<params.componentList.length();i++)
     p.componentList.push_back(string(params.componentList[i]));
@@ -242,3 +245,121 @@ Engines::MachineDefinition* SALOME_ResourcesManager::GetMachineParameters(const
   return p_ptr;
 }
 
+std::string 
+SALOME_ResourcesManager::getMachineFile(std::string hostname, CORBA::Long nb_procs, 
+                                       std::string parallelLib)
+{
+  std::string machine_file_name("");
+
+  if (parallelLib == "Dummy")
+  {
+    MESSAGE("[getMachineFile] parallelLib is Dummy");
+    MapOfParserResourcesType resourcesList = _rm.GetList();
+    if (resourcesList.find(hostname) != resourcesList.end())
+    {
+      ParserResourcesType resource = resourcesList[hostname];
+
+      // Check if resource is cluster or not
+      if (resource.ClusterMembersList.empty())
+      {
+       //It is not a cluster so we create a cluster with one machine
+       ParserResourcesClusterMembersType fake_node;
+       fake_node.HostName = resource.HostName;
+       fake_node.Protocol = resource.Protocol;
+       fake_node.UserName = resource.UserName;
+       fake_node.AppliPath = resource.AppliPath;
+       fake_node.DataForSort = resource.DataForSort;
+
+       resource.ClusterMembersList.push_front(fake_node);
+      }
+
+      // Creating list of machines for creating the machine file
+      std::list<std::string> list_of_machines;
+      std::list<ParserResourcesClusterMembersType>::iterator cluster_it = 
+       resource.ClusterMembersList.begin();
+      while (cluster_it != resource.ClusterMembersList.end())
+      {
+       // For each member of the cluster we add a nbOfNodes * nbOfProcPerNode in the list
+       unsigned int number_of_proc = (*cluster_it).DataForSort._nbOfNodes * 
+                                     (*cluster_it).DataForSort._nbOfProcPerNode;
+       for (unsigned int i = 0; i < number_of_proc; i++)
+         list_of_machines.push_back((*cluster_it).HostName);
+       cluster_it++;
+      }
+
+      // Creating machine file
+      machine_file_name = tmpnam(NULL);
+      std::ofstream machine_file(machine_file_name.c_str(), ios_base::out);
+
+      CORBA::Long machine_number = 0;
+      std::list<std::string>::iterator it = list_of_machines.begin();
+      while (machine_number != nb_procs)
+      {
+       // Adding a new node to the machine file
+       machine_file << *it << endl;
+
+       // counting...
+       it++;
+       if (it == list_of_machines.end())
+         it = list_of_machines.begin();
+       machine_number++;
+      }
+    }
+    else
+      INFOS("[getMachineFile] Error hostname not found in resourcesList -> " << hostname);
+  }
+  else if (parallelLib == "Mpi")
+  {
+    MESSAGE("[getMachineFile] parallelLib is Mpi");
+
+    MapOfParserResourcesType resourcesList = _rm.GetList();
+    if (resourcesList.find(hostname) != resourcesList.end())
+    {
+      ParserResourcesType resource = resourcesList[hostname];
+      // Check if resource is cluster or not
+      if (resource.ClusterMembersList.empty())
+      {
+       //It is not a cluster so we create a cluster with one machine
+       ParserResourcesClusterMembersType fake_node;
+       fake_node.HostName = resource.HostName;
+       fake_node.Protocol = resource.Protocol;
+       fake_node.UserName = resource.UserName;
+       fake_node.AppliPath = resource.AppliPath;
+       fake_node.DataForSort = resource.DataForSort;
+
+       resource.ClusterMembersList.push_front(fake_node);
+      }
+
+      // Choose mpi implementation -> each MPI implementation has is own machinefile...
+      if (resource.mpi == lam)
+      {
+       // Creating machine file
+       machine_file_name = tmpnam(NULL);
+       std::ofstream machine_file(machine_file_name.c_str(), ios_base::out);
+
+       // We add all cluster machines to the file
+       std::list<ParserResourcesClusterMembersType>::iterator cluster_it = 
+         resource.ClusterMembersList.begin();
+       while (cluster_it != resource.ClusterMembersList.end())
+       {
+         unsigned int number_of_proc = (*cluster_it).DataForSort._nbOfNodes * 
+           (*cluster_it).DataForSort._nbOfProcPerNode;
+         machine_file << (*cluster_it).HostName << " cpu=" << number_of_proc << endl;
+         cluster_it++;
+       }
+      }
+      else if (resource.mpi == nompi)
+      {
+       INFOS("[getMachineFile] Error hostname MPI implementation was defined for " << hostname);
+      }
+      else
+       INFOS("[getMachineFile] Error hostname MPI implementation not currenly handled for " << hostname);
+    }
+    else
+      INFOS("[getMachineFile] Error hostname not found in resourcesList -> " << hostname);
+  }
+  else
+    INFOS("[getMachineFile] Error parallelLib is not handled -> " << parallelLib);
+
+  return machine_file_name;
+}
index c8ec2a911fb76204a026af0b0caf12dbfdb63d34..be58300ac0b8b942748c42a25fd0481f8b0f3b29 100644 (file)
@@ -63,20 +63,21 @@ class SALOMERESOURCESMANAGER_EXPORT SALOME_ResourcesManager:
 
     ~SALOME_ResourcesManager();
 
+    // CORBA Methods
     Engines::MachineList *
     GetFittingResources(const Engines::MachineParameters& params);
-
     char* FindFirst(const Engines::MachineList& listOfMachines);
     char* Find(const char *policy, const Engines::MachineList& listOfMachines);
-
     Engines::MachineDefinition* GetMachineParameters(const char *hostname);
 
+    // Cpp Methods
     void Shutdown();
-
-    static const char *_ResourcesManagerNameInNS;
-
     ResourcesManager_cpp *GetImpl() { return &_rm; }
+    std::string getMachineFile(std::string hostname, CORBA::Long nb_procs,
+                              std::string parallelLib);
+
 
+    static const char *_ResourcesManagerNameInNS;
   protected:
     
     SALOME_NamingService *_NS;
index 2fa36c294f3201e642ab01d1ecc2e7efd070ad9b..063562ae304ecf23228cfda72607fdf8f79acb2d 100644 (file)
@@ -1210,24 +1210,13 @@ bool SALOMEDSImpl_Study::DumpStudy(const string& thePath,
   //set sys.path and add a creation of the study.
   fp << GetDumpStudyComment() << endl << endl;
   fp << "import sys" << endl;
-  fp << "import os.path" << endl;
   fp << "import " << aBatchModeScript << endl << endl;
 
   fp << aBatchModeScript << ".salome_init()" << endl << endl;
 
-  fp << _GetNoteBookAccess() << endl;
-
-  // IPAL21005 (Dump/load python script works only with absolute path)
-  // try to use '__file__' to get an absolute path to the generated scripts
-  // or use the path passed to this method (case of using execfile() command)
-  fp << "#Get absolute path to generated scripts:" << endl;
-  fp << "try:"                                     << endl;
-  fp << "    absPath = os.path.dirname(__file__)"  << endl;
-  fp << "except NameError:"                        << endl;
-  fp << "    absPath = \'" << thePath << "\'"      << endl;
-  fp << "    pass"                                 << endl;
-  fp << "sys.path.insert( 0, absPath )"            << endl << endl;
-  //fp << "sys.path.insert( 0, \'" << thePath << "\')" << endl << endl;
+  fp << _GetNoteBookAccess();
+
+  fp << "sys.path.insert( 0, \'" << thePath << "\')" << endl << endl;
 
   //Dump NoteBook Variables
   fp << _GetStudyVariablesScript();
index 801307cecb0060e06522ab1b79d7f1b2b443e323..7edbea0230ed7582e92736a42292c2c093cf82ac 100644 (file)
@@ -36,6 +36,7 @@
 
 #include <HDFOI.hxx>
 #include <stdlib.h> 
+#include <string.h> 
 
 using namespace std;
 
index ee5457b34709f05b3e18ba06ddb4a39647bf493b..d0b767b4978a80e04671c289a67c13cd0700270a 100644 (file)
@@ -38,6 +38,7 @@
 #include "HDFOI.hxx"
 #include <iostream>
 #include <stdlib.h>
+#include <string.h>
 
 using namespace std;
 
index 4a027f02e9b588c1120f4385973cd4c4bf9cab57..ac82d4321f443b79021d7a986a4c2ea6684071cb 100644 (file)
@@ -30,7 +30,7 @@
 #ifndef _SALOME_TESTCOMPONENT_I_HXX_
 #define _SALOME_TESTCOMPONENT_I_HXX_
 
-#include <iostream.h>
+#include <iostream>
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SALOME_TestMPIComponent)
 #include "SALOME_Component_i.hxx"
index bf5b44fc8f148b0aabb67691f97077cb40c88583..c0404abd3478c2fac9cb536dc9e3a075f9aa83c7 100644 (file)
@@ -76,7 +76,7 @@ const char* get_adip( void )
 }
 const char* const get_pwname( void )
 {
-       struct passwd *papa = getpwuid( getuid() ) ;
+       struct passwd *papa = getpwuid(getuid());
        return papa->pw_name ;
 }
 
index 30d378266cd45dcbe8b44319f8c848f8085e6752..f1caac7589bf3edd72b453ce2415968c5206f805 100644 (file)
@@ -60,6 +60,8 @@ class SALOME_Exception;
 
 UTILS_EXPORT std::ostream& operator<<( std::ostream&, const SALOME_Exception& );
 
+UTILS_EXPORT const char *makeText( const char *text, const char *fileName, const unsigned int lineNumber );
+
 class UTILS_EXPORT SALOME_Exception : public std::exception
 {