From 0f1f88baa99acd0de865c78733daa8fb382bf22c Mon Sep 17 00:00:00 2001 From: caremoli Date: Fri, 13 Feb 2009 10:43:51 +0000 Subject: [PATCH] CCAR: documentation update Now user documentation is built in gui/KERNEL directory and developer documentation is built in tui/KERNEL directory They are installed in directories with same names (so GUI module must be changed to access it) Old documentation files have been removed and new files have been added in gui and tui directories except .dox files in salome directory. Example files have been moved to salome/examples directory User documentation is built with EXTRACT_ALL=NO doxygen option and no template parsing to produce a smaller doc. Many source files have been modified to add descriptions (brief, class, module, file) because of EXTRACT_ALL option. --- bin/appli_gen.py | 6 +- bin/killSalome.py | 4 + bin/killSalomeWithPort.py | 8 + bin/orbmodule.py | 8 +- bin/runSalome.py | 5 + bin/salome_session.py | 7 + bin/salome_utils.py | 7 +- bin/showNS.py | 4 + bin/shutdownSalome.py | 5 + bin/waitContainers.py | 6 + bin/waitNS.py | 3 + configure.ac | 6 +- doc/INSTALL.txt | 394 -------- doc/KERNEL_Services.txt | 305 ------ doc/Makefile.am | 27 +- doc/SALOME_Application.txt | 353 ------- doc/UnitTests.txt | 217 ----- doc/index.txt | 113 --- doc/kernel_resources.txt | 507 ---------- doc/rst.css | 288 ------ doc/salome/Makefile.am | 37 +- doc/salome/batch.dox | 10 - doc/salome/examples/example1 | 45 + doc/salome/examples/example10 | 50 + doc/salome/examples/example11 | 49 + doc/salome/examples/example12 | 57 ++ doc/salome/examples/example13 | 60 ++ doc/salome/examples/example14 | 47 + doc/salome/examples/example15 | 43 + doc/salome/examples/example16 | 151 +++ doc/salome/examples/example17 | 154 +++ doc/salome/examples/example18 | 163 ++++ doc/salome/examples/example19 | 540 +++++++++++ doc/salome/examples/example20 | 152 +++ doc/salome/examples/example21 | 127 +++ doc/salome/examples/example22 | 128 +++ doc/salome/examples/example23 | 30 + doc/salome/examples/example3 | 60 ++ doc/salome/examples/example4 | 58 ++ doc/salome/examples/example5 | 50 + doc/salome/examples/example6 | 47 + doc/salome/examples/example7 | 45 + doc/salome/examples/example8 | 54 ++ doc/salome/examples/example9 | 50 + doc/salome/gui/Makefile.am | 27 + .../KERNEL/doxyuser.in => gui/doxyfile.in} | 47 +- doc/salome/gui/images/icon_about.png | Bin 0 -> 206458 bytes .../KERNEL/sources => gui/static}/footer.html | 0 .../myheader.html => gui/static/header.html} | 0 doc/salome/install.dox | 95 +- doc/salome/kernel_resources.dox | 194 +--- doc/salome/kernel_services.dox | 234 +++-- doc/salome/main.dox | 62 +- doc/salome/salome_application.dox | 149 +-- doc/salome/salome_file.dox | 7 +- doc/salome/tui/KERNEL/HTML/Logger.html | 18 - doc/salome/tui/KERNEL/HTML/SALOMEDS.html | 674 ------------- .../tui/KERNEL/HTML/SALOMEDS_Attributes.html | 894 ------------------ .../tui/KERNEL/HTML/SALOME_Component.html | 94 -- .../KERNEL/HTML/SALOME_DataTypeCatalog.html | 30 - .../tui/KERNEL/HTML/SALOME_Exception.html | 2 - .../tui/KERNEL/HTML/SALOME_ModuleCatalog.html | 82 -- .../tui/KERNEL/HTML/SALOME_Registry.html | 42 - .../KERNEL/HTML/SALOME_RessourcesCatalog.html | 22 - .../tui/KERNEL/HTML/SALOME_Session.html | 34 - .../tui/KERNEL/HTML/SALOME_TestComponent.html | 18 - doc/salome/tui/KERNEL/HTML/TestNotif.html | 22 - doc/salome/tui/KERNEL/HTML/TypeData.html | 2 - doc/salome/tui/KERNEL/doxyfile.in | 214 ----- doc/salome/tui/KERNEL/exemple/Example1.html | 54 -- doc/salome/tui/KERNEL/exemple/Example10.html | 59 -- doc/salome/tui/KERNEL/exemple/Example11.html | 59 -- doc/salome/tui/KERNEL/exemple/Example12.html | 67 -- doc/salome/tui/KERNEL/exemple/Example13.html | 68 -- doc/salome/tui/KERNEL/exemple/Example14.html | 57 -- doc/salome/tui/KERNEL/exemple/Example15.html | 51 - doc/salome/tui/KERNEL/exemple/Example16.html | 158 ---- doc/salome/tui/KERNEL/exemple/Example17.html | 162 ---- doc/salome/tui/KERNEL/exemple/Example18.html | 171 ---- doc/salome/tui/KERNEL/exemple/Example19.html | 547 ----------- doc/salome/tui/KERNEL/exemple/Example2.html | 46 - doc/salome/tui/KERNEL/exemple/Example20.html | 160 ---- doc/salome/tui/KERNEL/exemple/Example21.html | 136 --- doc/salome/tui/KERNEL/exemple/Example22.html | 137 --- doc/salome/tui/KERNEL/exemple/Example23.html | 35 - doc/salome/tui/KERNEL/exemple/Example3.html | 68 -- doc/salome/tui/KERNEL/exemple/Example4.html | 66 -- doc/salome/tui/KERNEL/exemple/Example5.html | 58 -- doc/salome/tui/KERNEL/exemple/Example6.html | 56 -- doc/salome/tui/KERNEL/exemple/Example7.html | 55 -- doc/salome/tui/KERNEL/exemple/Example8.html | 64 -- doc/salome/tui/KERNEL/exemple/Example9.html | 59 -- .../tui/KERNEL/sources/Application-About1.jpg | Bin 14327 -> 0 bytes doc/salome/tui/KERNEL/sources/application.gif | Bin 2602 -> 0 bytes doc/salome/tui/KERNEL/sources/application.jpg | Bin 792 -> 0 bytes doc/salome/tui/KERNEL/sources/doxygen.css | 170 ---- .../tui/KERNEL/sources/html_comments.gif | Bin 156 -> 0 bytes .../tui/KERNEL/sources/kernel_about_4.png | Bin 134730 -> 0 bytes doc/salome/tui/KERNEL/sources/logocorp.gif | Bin 1792 -> 0 bytes doc/salome/tui/KERNEL/sources/occ.gif | Bin 14790 -> 0 bytes doc/salome/tui/KERNEL/sources/static/Link.gif | Bin 13959 -> 0 bytes .../tui/KERNEL/sources/static/SObject.gif | Bin 4966 -> 0 bytes .../KERNEL/sources/static/Study_Struct.gif | Bin 5833 -> 0 bytes .../tui/KERNEL/sources/static/doxygen.css | 170 ---- .../sources/static/examples_Kernel.html | 134 --- .../sources/static/examples_Life_cycle.html | 116 --- .../sources/static/examples_Naming.html | 66 -- .../KERNEL/sources/static/examples_Study.html | 790 ---------------- .../tui/KERNEL/sources/static/mapping.html | 329 ------- .../tui/KERNEL/sources/static/ns_f3-1.jpg | Bin 8650 -> 0 bytes .../sources/static/overview_Kernel.html | 191 ---- .../sources/static/overview_Life_Cycle.html | 90 -- .../sources/static/overview_Naming.html | 197 ---- .../KERNEL/sources/static/overview_Study.html | 261 ----- .../tui/KERNEL/sources/static/page2.html | 34 - .../tui/KERNEL/sources/static/tree.js.in | 200 ---- .../tui/KERNEL/sources/static/treeview.js | 505 ---------- doc/salome/tui/Makefile.am | 102 +- .../tui/{KERNEL/doxydev.in => doxyfile.in} | 21 +- doc/salome/tui/pythfilter.py | 568 ----------- doc/salome/tui/static/footer.html | 10 + doc/salome/tui/static/header.html | 13 + doc/salome/unittests.dox | 55 +- doc/txt2html.sh | 54 -- idl/Calcium_Ports.idl | 7 +- idl/DSC_Engines.idl | 85 +- idl/Logger.idl | 14 +- idl/Palm_Ports.idl | 12 +- idl/SALOMEDS.idl | 332 +++---- idl/SALOMEDS_Attributes.idl | 224 ++--- idl/SALOME_Comm.idl | 5 + idl/SALOME_Component.idl | 183 ++-- idl/SALOME_ContainerManager.idl | 68 +- idl/SALOME_Exception.idl | 29 +- idl/SALOME_GenericObj.idl | 11 +- idl/SALOME_MPIContainer.idl | 8 + idl/SALOME_MPIObject.idl | 7 +- idl/SALOME_ModuleCatalog.idl | 273 +++--- idl/SALOME_Ports.idl | 27 +- idl/SALOME_Registry.idl | 23 +- idl/SALOME_RessourcesCatalog.idl | 42 +- idl/SALOME_Session.idl | 67 +- idl/SALOME_TestComponent.idl | 6 + idl/SALOME_TestMPIComponent.idl | 3 + idl/SALOME_TestModuleCatalog.idl | 6 + idl/TestNotif.idl | 5 + idl/TypeData.idl | 3 + idl/nstest.idl | 15 +- src/Container/Component_i.cxx | 17 +- src/Container/Container_i.cxx | 70 +- src/Container/SALOME_ComponentPy.py | 10 +- src/Container/SALOME_Container.py | 5 + src/Container/SALOME_FileTransfer_i.cxx | 20 +- src/Container/Salome_file_i.cxx | 5 + src/DSC/DSC_Basic/DSC_Callbacks.hxx | 21 +- src/DSC/DSC_Python/dsccalcium.py | 12 +- src/KERNEL_PY/salome.py | 73 +- src/KERNEL_PY/salome_iapp.py | 21 + .../SALOME_FileTransferCORBA.cxx | 20 +- src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx | 80 +- src/NamingService/SALOME_NamingService.cxx | 5 + src/NamingService/SALOME_NamingServicePy.py | 47 +- src/SALOMEDS/SALOME_DriverPy.py | 8 +- src/Utils/Utils_Identity.py | 29 +- 164 files changed, 3706 insertions(+), 12104 deletions(-) delete mode 100644 doc/INSTALL.txt delete mode 100644 doc/KERNEL_Services.txt delete mode 100644 doc/SALOME_Application.txt delete mode 100644 doc/UnitTests.txt delete mode 100644 doc/index.txt delete mode 100644 doc/kernel_resources.txt delete mode 100644 doc/rst.css delete mode 100644 doc/salome/batch.dox create mode 100644 doc/salome/examples/example1 create mode 100644 doc/salome/examples/example10 create mode 100644 doc/salome/examples/example11 create mode 100644 doc/salome/examples/example12 create mode 100644 doc/salome/examples/example13 create mode 100644 doc/salome/examples/example14 create mode 100644 doc/salome/examples/example15 create mode 100644 doc/salome/examples/example16 create mode 100644 doc/salome/examples/example17 create mode 100644 doc/salome/examples/example18 create mode 100644 doc/salome/examples/example19 create mode 100644 doc/salome/examples/example20 create mode 100644 doc/salome/examples/example21 create mode 100644 doc/salome/examples/example22 create mode 100644 doc/salome/examples/example23 create mode 100644 doc/salome/examples/example3 create mode 100644 doc/salome/examples/example4 create mode 100644 doc/salome/examples/example5 create mode 100644 doc/salome/examples/example6 create mode 100644 doc/salome/examples/example7 create mode 100644 doc/salome/examples/example8 create mode 100644 doc/salome/examples/example9 create mode 100644 doc/salome/gui/Makefile.am rename doc/salome/{tui/KERNEL/doxyuser.in => gui/doxyfile.in} (89%) create mode 100755 doc/salome/gui/images/icon_about.png rename doc/salome/{tui/KERNEL/sources => gui/static}/footer.html (100%) rename doc/salome/{tui/KERNEL/sources/myheader.html => gui/static/header.html} (100%) delete mode 100644 doc/salome/tui/KERNEL/HTML/Logger.html delete mode 100644 doc/salome/tui/KERNEL/HTML/SALOMEDS.html delete mode 100644 doc/salome/tui/KERNEL/HTML/SALOMEDS_Attributes.html delete mode 100644 doc/salome/tui/KERNEL/HTML/SALOME_Component.html delete mode 100644 doc/salome/tui/KERNEL/HTML/SALOME_DataTypeCatalog.html delete mode 100644 doc/salome/tui/KERNEL/HTML/SALOME_Exception.html delete mode 100644 doc/salome/tui/KERNEL/HTML/SALOME_ModuleCatalog.html delete mode 100644 doc/salome/tui/KERNEL/HTML/SALOME_Registry.html delete mode 100644 doc/salome/tui/KERNEL/HTML/SALOME_RessourcesCatalog.html delete mode 100644 doc/salome/tui/KERNEL/HTML/SALOME_Session.html delete mode 100644 doc/salome/tui/KERNEL/HTML/SALOME_TestComponent.html delete mode 100644 doc/salome/tui/KERNEL/HTML/TestNotif.html delete mode 100644 doc/salome/tui/KERNEL/HTML/TypeData.html delete mode 100755 doc/salome/tui/KERNEL/doxyfile.in delete mode 100755 doc/salome/tui/KERNEL/exemple/Example1.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example10.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example11.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example12.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example13.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example14.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example15.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example16.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example17.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example18.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example19.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example2.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example20.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example21.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example22.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example23.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example3.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example4.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example5.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example6.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example7.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example8.html delete mode 100755 doc/salome/tui/KERNEL/exemple/Example9.html delete mode 100755 doc/salome/tui/KERNEL/sources/Application-About1.jpg delete mode 100644 doc/salome/tui/KERNEL/sources/application.gif delete mode 100755 doc/salome/tui/KERNEL/sources/application.jpg delete mode 100755 doc/salome/tui/KERNEL/sources/doxygen.css delete mode 100755 doc/salome/tui/KERNEL/sources/html_comments.gif delete mode 100644 doc/salome/tui/KERNEL/sources/kernel_about_4.png delete mode 100755 doc/salome/tui/KERNEL/sources/logocorp.gif delete mode 100755 doc/salome/tui/KERNEL/sources/occ.gif delete mode 100755 doc/salome/tui/KERNEL/sources/static/Link.gif delete mode 100755 doc/salome/tui/KERNEL/sources/static/SObject.gif delete mode 100755 doc/salome/tui/KERNEL/sources/static/Study_Struct.gif delete mode 100755 doc/salome/tui/KERNEL/sources/static/doxygen.css delete mode 100755 doc/salome/tui/KERNEL/sources/static/examples_Kernel.html delete mode 100755 doc/salome/tui/KERNEL/sources/static/examples_Life_cycle.html delete mode 100755 doc/salome/tui/KERNEL/sources/static/examples_Naming.html delete mode 100755 doc/salome/tui/KERNEL/sources/static/examples_Study.html delete mode 100755 doc/salome/tui/KERNEL/sources/static/mapping.html delete mode 100755 doc/salome/tui/KERNEL/sources/static/ns_f3-1.jpg delete mode 100755 doc/salome/tui/KERNEL/sources/static/overview_Kernel.html delete mode 100755 doc/salome/tui/KERNEL/sources/static/overview_Life_Cycle.html delete mode 100755 doc/salome/tui/KERNEL/sources/static/overview_Naming.html delete mode 100755 doc/salome/tui/KERNEL/sources/static/overview_Study.html delete mode 100755 doc/salome/tui/KERNEL/sources/static/page2.html delete mode 100755 doc/salome/tui/KERNEL/sources/static/tree.js.in delete mode 100644 doc/salome/tui/KERNEL/sources/static/treeview.js rename doc/salome/tui/{KERNEL/doxydev.in => doxyfile.in} (94%) delete mode 100644 doc/salome/tui/pythfilter.py create mode 100755 doc/salome/tui/static/footer.html create mode 100755 doc/salome/tui/static/header.html delete mode 100755 doc/txt2html.sh diff --git a/bin/appli_gen.py b/bin/appli_gen.py index c57f4c25d..e6d035518 100644 --- a/bin/appli_gen.py +++ b/bin/appli_gen.py @@ -20,9 +20,9 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # -"""Create a virtual Salome installation - -""" +## \file appli_gen.py +# Create a %SALOME application (virtual Salome installation) +# usage="""usage: %prog [options] Typical use is: python appli_gen.py diff --git a/bin/killSalome.py b/bin/killSalome.py index 582152ceb..381f3f710 100755 --- a/bin/killSalome.py +++ b/bin/killSalome.py @@ -20,6 +20,10 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +## \file killSalome.py +# Stop all %SALOME servers from all sessions by killing them +# + import os, sys, re, signal from killSalomeWithPort import killMyPort, getPiDict diff --git a/bin/killSalomeWithPort.py b/bin/killSalomeWithPort.py index 4403a8bc2..fcdea4ec4 100755 --- a/bin/killSalomeWithPort.py +++ b/bin/killSalomeWithPort.py @@ -20,6 +20,14 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +## \file killSalomeWithPort.py +# Stop all %SALOME servers from given sessions by killing them +# +# The sessions are indicated by their ports on the command line as in : +# +# killSalomeWithPort.py 2811 2815 +# + import os, sys, pickle, signal, commands,glob from launchConfigureParser import verbose import Utils_Identity diff --git a/bin/orbmodule.py b/bin/orbmodule.py index ae4744432..d9aa08d7a 100755 --- a/bin/orbmodule.py +++ b/bin/orbmodule.py @@ -19,6 +19,11 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +## @package orbmodule +# \brief Module that provides a client for %SALOME +# +# + import sys,os,time import string from nameserver import * @@ -32,6 +37,7 @@ import CosNaming # ----------------------------------------------------------------------------- class client: + """Client for SALOME""" def __init__(self,args=None): #set GIOP message size for bug 10560: impossible to get field values in TUI mode @@ -93,7 +99,7 @@ class client: # -------------------------------------------------------------------------- def showNS(self): - """ Show the content of NS""" + """ Show the content of SALOME naming service """ self.showNScontext(self.rootContext) # -------------------------------------------------------------------------- diff --git a/bin/runSalome.py b/bin/runSalome.py index fe97b68ff..bf9cfc5fe 100755 --- a/bin/runSalome.py +++ b/bin/runSalome.py @@ -20,6 +20,11 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +## @package runSalome +# \brief Module that provides services to launch SALOME +# +# + import sys, os, string, glob, time, pickle, re import orbmodule import setenv diff --git a/bin/salome_session.py b/bin/salome_session.py index 9c648214d..be227c89f 100644 --- a/bin/salome_session.py +++ b/bin/salome_session.py @@ -19,6 +19,12 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +## @package salome_session +# \brief Module that provides the SalomeSession object that helps to launch +# a SALOME script session +# +# + import os import sys import string @@ -99,6 +105,7 @@ def searchFreePort(): class SalomeSession(object): + """Salome session launcher""" import runSalome import killSalomeWithPort import killSalome diff --git a/bin/salome_utils.py b/bin/salome_utils.py index ab9c0669c..cf22daf17 100644 --- a/bin/salome_utils.py +++ b/bin/salome_utils.py @@ -24,9 +24,10 @@ # Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com) # --- # -""" -Set of utility functions used by SALOME python scripts. -""" +## @package salome_utils +# \brief Set of utility functions used by SALOME python scripts. +# +# # # Exported functions diff --git a/bin/showNS.py b/bin/showNS.py index 48783acd8..7f4a0ba01 100755 --- a/bin/showNS.py +++ b/bin/showNS.py @@ -20,6 +20,10 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +## \file showNS.py +# \brief display the contents of %SALOME naming service +# + import orbmodule clt=orbmodule.client() diff --git a/bin/shutdownSalome.py b/bin/shutdownSalome.py index f4d54ea9c..3746788e9 100755 --- a/bin/shutdownSalome.py +++ b/bin/shutdownSalome.py @@ -20,6 +20,11 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +## \file shutdownSalome.py +# shutdown all %SALOME servers and naming service +# +# + import time import salome salome.salome_init() diff --git a/bin/waitContainers.py b/bin/waitContainers.py index dd8ba9b3b..ebc94e097 100755 --- a/bin/waitContainers.py +++ b/bin/waitContainers.py @@ -20,6 +20,12 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +## \file waitContainers.py +# \brief command to wait until containers are launched +# +# the container names (in naming service) are passed on the command line as in : +# waitContainers.py FactoryServer + import sys import time import orbmodule diff --git a/bin/waitNS.py b/bin/waitNS.py index 03ea33f23..576df3c79 100755 --- a/bin/waitNS.py +++ b/bin/waitNS.py @@ -20,6 +20,9 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +## \file waitNS.py +# \brief command to wait until module catalog server is launched +# import orbmodule clt=orbmodule.client() clt.waitNS("/Kernel/ModulCatalog") diff --git a/configure.ac b/configure.ac index 2b7a8c324..c2d7700f3 100644 --- a/configure.ac +++ b/configure.ac @@ -537,9 +537,9 @@ AC_OUTPUT([ \ ./doc/Makefile \ ./doc/salome/Makefile \ ./doc/salome/tui/Makefile \ - ./doc/salome/tui/INPUT/doxyuser:./doc/salome/tui/KERNEL/doxyuser.in \ - ./doc/salome/tui/INPUT/doxydev:./doc/salome/tui/KERNEL/doxydev.in \ - ./doc/salome/tui/INPUT/sources/static/tree.js:./doc/salome/tui/KERNEL/sources/static/tree.js.in \ + ./doc/salome/tui/doxyfile \ + ./doc/salome/gui/Makefile \ + ./doc/salome/gui/doxyfile \ ./idl/Makefile \ ./resources/Makefile \ ./resources/KERNELCatalog.xml \ diff --git a/doc/INSTALL.txt b/doc/INSTALL.txt deleted file mode 100644 index 7c01e348c..000000000 --- a/doc/INSTALL.txt +++ /dev/null @@ -1,394 +0,0 @@ -================================================================= -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 -$ mkdir -$ cd -$ ./build_configure -$ cd -$ /configure --prefix= -$ 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 (_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 /prerequis. -Then, your file system should probably look like:: - - /prerequis/Python-2.2.2 - /prerequis/omniORB-3.0.5 - /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 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 . - -- the build directory, denoted by in the following. This - directory can't be the same directory as . - -- the install directory, denoted by in the following. This - directory can't be the same directory as or - . - -The installing process is: - -STEP 1: - preparing directories - - create the and the directories:: - - $ mkdir - $ mkdir - -STEP 2: - build configure script - - go to directory and generate the "configure" script:: - - $ cd - $ ./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 - $ /configure --prefix= - - Note that 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 directory:: - - $ make - - -STEP 5: - Installing binary files, scripts and documentation - - Execute install target in the directory:: - - $ make install - - -6. Installing the SALOME components ------------------------------------ - -TInstalling a component is done by following the same -instructions as given for the KERNEL, replacing KERNEL by - (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 _ROOT_DIR to -localize the dependant components. The variables must be set to the -install path directory of the components (ex: -KERNEL_ROOT_DIR=). - -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 _ROOT_DIR. Here, you just have to set the - kernel and the components you need:: - - $ export KERNEL_ROOT_DIR= - $ export MED_ROOT_DIR= - $ ... - -- 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 - . - -- 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 - :: - - $ cp /prerequis.sh /. - $ cp /bin/salome/runSalome /. - - 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 _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 /prerequis.sh - $ source /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 deleted file mode 100644 index c848838ee..000000000 --- a/doc/KERNEL_Services.txt +++ /dev/null @@ -1,305 +0,0 @@ -================================================================= -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/Makefile.am b/doc/Makefile.am index d8d42009a..8bc7565fa 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -28,31 +28,14 @@ include $(top_srcdir)/salome_adm/unix/make_common_starter.am SUBDIRS = salome -# if RST2HTML_IS_OK -# DOC_FILES = \ -# index.html \ -# UnitTests.html \ -# SALOME_Application.html \ -# INSTALL.html \ -# kernel_resources.html \ -# KERNEL_Services.html -# CSS_FILE = rst.css -# endif - -nodist_doc_DATA = $(DOC_FILES) - -EXTRA_DIST=$(DOC_FILES:%.html=%.txt) $(CSS_FILE) - -# Building html from restructured text files -STYLESHEET=$(CSS_FILE) -RST2HTML=@RST2HTML@ -RSTOPTS=--output-encoding=latin1 --stylesheet=$(STYLESHEET) - -%.html: %.txt - $(RST2HTML) $(RSTOPTS) $< $@ +docs: usr_docs usr_docs: (cd salome && $(MAKE) $(AM_MAKEFLAGS) usr_docs) dev_docs: (cd salome && $(MAKE) $(AM_MAKEFLAGS) dev_docs) + +dist-hook: + cp -Rp $(srcdir)/configuration_examples $(distdir) + rm -rf $(distdir)/configuration_examples/CVS diff --git a/doc/SALOME_Application.txt b/doc/SALOME_Application.txt deleted file mode 100644 index 0abcaed1e..000000000 --- a/doc/SALOME_Application.txt +++ /dev/null @@ -1,353 +0,0 @@ -====================================================================== -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 /bin/salome/appli_gen.py --prefix= --config= - -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 deleted file mode 100644 index 987db0ec1..000000000 --- a/doc/UnitTests.txt +++ /dev/null @@ -1,217 +0,0 @@ -================================================================= -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 deleted file mode 100644 index 0120b1d9c..000000000 --- a/doc/index.txt +++ /dev/null @@ -1,113 +0,0 @@ -================================================================= -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 deleted file mode 100644 index 0bc9700da..000000000 --- a/doc/kernel_resources.txt +++ /dev/null @@ -1,507 +0,0 @@ -====================================================================== -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 - - 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() <::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_::Instance(), the pointer is returned -with the same value even if this is done in different -functions (threads ?):: - - POINT *p1=SINGLETON_::Instance() ; - ... - POINT *p2=SINGLETON_::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_::Instance()`` which - returns a pointer to the single object ; - -* to create an object, ``SINGLETON_::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 deleted file mode 100644 index 38bd7dcab..000000000 --- a/doc/rst.css +++ /dev/null @@ -1,288 +0,0 @@ -/* -: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 } diff --git a/doc/salome/Makefile.am b/doc/salome/Makefile.am index 81cbabb59..4d433e927 100644 --- a/doc/salome/Makefile.am +++ b/doc/salome/Makefile.am @@ -26,38 +26,17 @@ # include $(top_srcdir)/salome_adm/unix/make_common_starter.am -SUBDIRS= tui -SUBDIRSGUI= tui -SUBDIRSTUI= tui +SUBDIRS= tui gui -index_html: - $(INSTALL) -d $(DESTDIR)$(docdir); +docs:usr_docs -usr_docs: index_html - list='$(SUBDIRSGUI)'; for subdir in $$list; do \ - echo "Making usr_docs in $$subdir"; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) usr_docs) \ - done; +usr_docs: + echo "Making usr_docs in gui"; \ + (cd gui && $(MAKE) $(AM_MAKEFLAGS) usr_docs) -dev_docs: index_html - list='$(SUBDIRSTUI)'; for subdir in $$list; do \ - echo "Making dev_docs in $$subdir"; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) dev_docs) \ - done; - - -# VSR: nullify these make targets to avoid 'make distcheck' failure -dvi: -pdf: -ps: - -info_TEXINFOS = Batch.texi - -install-data-local: html usr_docs - cp -rp $(top_builddir)/doc/salome/Batch.html $(DESTDIR)$(docdir) - -uninstall-local: - rm -rf $(DESTDIR)$(docdir)/Batch.html +dev_docs: + echo "Making dev_docs in tui"; \ + (cd tui && $(MAKE) $(AM_MAKEFLAGS) dev_docs) EXTRA_DIST= main.dox install.dox \ kernel_resources.dox kernel_services.dox \ diff --git a/doc/salome/batch.dox b/doc/salome/batch.dox deleted file mode 100644 index 7e0e4e29b..000000000 --- a/doc/salome/batch.dox +++ /dev/null @@ -1,10 +0,0 @@ -/*! - -\page batch_page Batch - - Batch documentation - -*/ - - - diff --git a/doc/salome/examples/example1 b/doc/salome/examples/example1 new file mode 100644 index 000000000..eae882cae --- /dev/null +++ b/doc/salome/examples/example1 @@ -0,0 +1,45 @@ + +# create AttributeReal +#================================= +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeReal") +if A == None : + raise RuntimeError, "Can't create AttributeReal attribute" +A = A._narrow(SALOMEDS.AttributeReal) +A.SetValue(0.0001) +if A.Value() != 0.0001: + raise RuntimeError, "Error : wrong value of AttributeReal" + +# save / restore study +#================================= + +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +#file = "/tmp/ggg.hdf" + +print " ------- We will save to", file, "-----------" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy=batchmode_geompy.myStudyManager.Open(file) + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeReal +#================================= + +res,A=father.FindAttribute("AttributeReal") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeReal" + +A = A._narrow(SALOMEDS.AttributeReal) +if A.Value() != 0.0001: + raise RuntimeError, "Error : wrong value of AttributeReal" diff --git a/doc/salome/examples/example10 b/doc/salome/examples/example10 new file mode 100644 index 000000000..756e4a3f1 --- /dev/null +++ b/doc/salome/examples/example10 @@ -0,0 +1,50 @@ + +# create AttributeExpandable +#=========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute( batchmode_geompy.father, "AttributeExpandable") +if A == None : + raise RuntimeError, "Can't create AttributeExpandable attribute" +A = A._narrow(SALOMEDS.AttributeExpandable) + +if A == None : + raise RuntimeError, "Can't create AttributeExpandable attribute" + +A.SetExpandable(1) + +if A.IsExpandable() == 0: + "Error: wrong value of AttributeExpandable" + + +# save / restore study +#============================================================ +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy = batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeExpandable +#============================================================ + +res,A=father.FindAttribute("AttributeExpandable") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeExpandable" + +A = A._narrow(SALOMEDS.AttributeExpandable) + +if A == None : + raise RuntimeError, "Can't create AttributeExpandable attribute" + +if A.IsExpandable() == 0: + "Error: wrong value of AttributeExpandable" + diff --git a/doc/salome/examples/example11 b/doc/salome/examples/example11 new file mode 100644 index 000000000..4cfd732fd --- /dev/null +++ b/doc/salome/examples/example11 @@ -0,0 +1,49 @@ + +# create AttributeOpened +#=========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeOpened") +if A == None : + raise RuntimeError, "Can't create AttributeOpened attribute" +A = A._narrow(SALOMEDS.AttributeOpened) + +if A == None : + raise RuntimeError, "Can't create AttributeOpened attribute" + +A.SetOpened(1) + +if A.IsOpened() == 0: + "Error: wrong value of AttributeOpened" + + +# save / restore study +#============================================================ +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy=batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeOpened +#============================================================ + +res,A=father.FindAttribute("AttributeOpened") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeOpened" + +A = A._narrow(SALOMEDS.AttributeOpened) + +if A == None : + raise RuntimeError, "Can't create AttributeOpened attribute" + +if A.IsOpened() == 0: + "Error: wrong value of AttributeOpened" diff --git a/doc/salome/examples/example12 b/doc/salome/examples/example12 new file mode 100644 index 000000000..760587736 --- /dev/null +++ b/doc/salome/examples/example12 @@ -0,0 +1,57 @@ + +#-------------------------------------------------------------------------- +# create AttributeTextColor +#=========================================================== +import SALOMEDS_Attributes_idl +color = SALOMEDS_Attributes_idl._0_SALOMEDS.Color(234,345,231) + +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeTextColor") + +if A == None : + raise RuntimeError, "Can't create AttributeTextColor attribute" +A = A._narrow(SALOMEDS.AttributeTextColor) + +if A == None : + raise RuntimeError, "Can't create AttributeTextColor attribute" + +A.SetTextColor(color) + +c = A.TextColor(); + +if c.R != 234 or c.G != 345 or c.B != 231: + print "Error: wrong value of AttributeTextColor" + +# save / restore study +#============================================================ +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy = batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeTextColor +#============================================================ + +res,A=father.FindAttribute("AttributeTextColor") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeTextColor" + +A = A._narrow(SALOMEDS.AttributeTextColor) + +if A == None : + raise RuntimeError, "Can't create AttributeTextColor attribute" + +c = A.TextColor(); +if c.R != 234 or c.G != 345 or c.B != 231: + print "Error: wrong value of AttributeTextColor" + diff --git a/doc/salome/examples/example13 b/doc/salome/examples/example13 new file mode 100644 index 000000000..c05aaff52 --- /dev/null +++ b/doc/salome/examples/example13 @@ -0,0 +1,60 @@ + +#-------------------------------------------------------------------------- +# create AttributeTextHighlightColor +#=========================================================== + +import SALOMEDS_Attributes_idl +highlightcolor=SALOMEDS_Attributes_idl._0_SALOMEDS.Color(256,256,256) + +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeTextHighlightColor") + +if A == None : + raise RuntimeError, "Can't create AttributeTextHighlightColor attribute" +A = A._narrow(SALOMEDS.AttributeTextHighlightColor) + +if A == None : + raise RuntimeError, "Can't create AttributeTextHighlightColor attribute" + +A.SetTextHighlightColor(highlightcolor) + +c = A.TextHighlightColor(); +if c.R != 256 or c.G != 256 or c.B != 256: + print "Error: wrong value of AttributeTextHighlightColor" + + +# save / restore study +#============================================================ +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy=batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeTextHighlightColor +#============================================================ + +res, A = father.FindAttribute("AttributeTextHighlightColor") +print res, A +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeTextHighlightColor" + +A = A._narrow(SALOMEDS.AttributeTextHighlightColor) + +if A == None : + raise RuntimeError, "Can't create AttributeTextHighlightColor attribute" + +c = A.TextHighlightColor(); + +if c.R != 256 or c.G != 256 or c.B != 256: + print "Error: wrong value of AttributeTextTextHighlightColor" + diff --git a/doc/salome/examples/example14 b/doc/salome/examples/example14 new file mode 100644 index 000000000..a0acf346d --- /dev/null +++ b/doc/salome/examples/example14 @@ -0,0 +1,47 @@ + +#-------------------------------------------------------------------------- +# create AttributePixMap +#=============================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributePixMap") +if A == None : + raise RuntimeError, "Can't create AttributePixMap attribute" +aPixmap = A._narrow(SALOMEDS.AttributePixMap); +aPixmap.SetPixMap( "ICON_OBJBROWSER_Geometry" ); + +if aPixmap.GetPixMap() != "ICON_OBJBROWSER_Geometry": + print "Error: wrong value of AttributePixMap" + + +# save / restore study +#============================================================ +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy = batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributePixMap +#============================================================ + +res,A=father.FindAttribute("AttributePixMap") +if res == 0 or A == None: + raise RuntimeError, "Error: AttributePixMap not found " + +A = A._narrow(SALOMEDS.AttributePixMap) + +if A == None : + raise RuntimeError, "Can't create AttributePixMap attribute" + +if A.GetPixMap() != "ICON_OBJBROWSER_Geometry": + print "Error: wrong value of AttributePixMap" + diff --git a/doc/salome/examples/example15 b/doc/salome/examples/example15 new file mode 100644 index 000000000..42493fe01 --- /dev/null +++ b/doc/salome/examples/example15 @@ -0,0 +1,43 @@ + +# create AttributeLocalID +#================================= +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeLocalID") +if A == None : + raise RuntimeError, "Can't create AttributeLocalID attribute" +A = A._narrow(SALOMEDS.AttributeLocalID) + +A.SetValue(763242882) + +if A.Value() != 763242882: + print "Error: wrong value of AttributeLocalID" + +# save / restore study +#================================= +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy = batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeLocalID +#================================= + +res,A=father.FindAttribute("AttributeLocalID") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeLocalID" + +A = A._narrow(SALOMEDS.AttributeLocalID) + +if A.Value() != 763242882: + print "Error: wrong value of AttributeLocalID" + diff --git a/doc/salome/examples/example16 b/doc/salome/examples/example16 new file mode 100644 index 000000000..3be50d9b6 --- /dev/null +++ b/doc/salome/examples/example16 @@ -0,0 +1,151 @@ + +dir= os.getenv("TmpDir") +if dir == None: + dir = "/tmp" + +batchmode_geompy.myBuilder._set_UndoLimit(20) + +# 1st transaction ----------------------------------------- +batchmode_geompy.myBuilder.NewCommand() +# create AttributeSequenceOfInteger +#========================================================= +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeSequenceOfInteger") +if A == None : + raise RuntimeError, "Can't create AttributeSequenceOfInteger attribute" +A = A._narrow(SALOMEDS.AttributeSequenceOfInteger) +if A == None : + raise RuntimeError, "Can't create AttributeSequenceOfInteger attribute" + +A.Add(100) +A.Add(300) +A.Add(500) +A.Add(400) +A.Add(700) +print "First transaction goes on : HasOpenCommand() = ", batchmode_geompy.myBuilder.HasOpenCommand() +batchmode_geompy.myBuilder.CommitCommand() #-------------- + +# 2nd transaction ------------------------------------------ +batchmode_geompy.myBuilder.NewCommand() +A.Remove(3) +A.ChangeValue(4,500) +batchmode_geompy.myBuilder.CommitCommand() #-------------- + +if batchmode_geompy.myBuilder.GetAvailableUndos() == 0: + raise RuntimeError, "GetAvailableUndos() = 0 but must not !" + +if A.Length() != 4: + print "Wrong length of SequenceOfInteger" +if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 500: + raise RuntimeError, "Wrong value of AttributeSequenceOfInteger" + +file1 = dir + "/test1.hdf" +batchmode_geompy.myStudyManager.SaveAs(file1, batchmode_geompy.myStudy) + +# 1st Undo --------------------------------------- +batchmode_geompy.myBuilder.Undo() +res, A = batchmode_geompy.myBuilder.FindAttribute(batchmode_geompy.father, "AttributeSequenceOfInteger") +if A is None: + raise RuntimeError, "After first 'undo' can't find AttributeSequenceOfInteger" +if A.Length() != 5: + print "Wrong length of SequenceOfInteger" +if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 500 or A.Value(4) != 400 or A.Value(5) != 700: + print A.Value(1), A.Value(2), A.Value(3), A.Value(4), A.Value(5) + raise RuntimeError, "Wrong value of AttributeSequenceOfInteger after the first 'undo'!" +# save +file2 = dir + "/test2.hdf" +batchmode_geompy.myStudyManager.SaveAs(file2, batchmode_geompy.myStudy) +#------------------------------------------------- +# 2nd Undo --------------------------------------- +batchmode_geompy.myBuilder.Undo() +res, attr = batchmode_geompy.myBuilder.FindAttribute(batchmode_geompy.father, "AttributeSequenceOfInteger") +if res !=0 or attr != None : + raise RuntimeError, "After the second 'undo' AttributeSequenceOfInteger exists but must not!" +file3 = dir + "/test3.hdf" +batchmode_geompy.myStudyManager.SaveAs(file3, batchmode_geompy.myStudy) +#------------------------------------------------- + +#make redo twice --------------------------------- +if batchmode_geompy.myBuilder.GetAvailableRedos() == 0: + raise RuntimeError, "GetAvailableRedos() = 0 but must not !" +batchmode_geompy.myBuilder.Redo() +batchmode_geompy.myBuilder.Redo() +res, A = batchmode_geompy.myBuilder.FindAttribute(batchmode_geompy.father, "AttributeSequenceOfInteger") +if res ==0 or A== None : + raise RuntimeError, "AttributeSequenceOfInteger is not found but must be!" +if A.Length() != 4: + print "Wrong length of SequenceOfInteger" +if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 500: + raise RuntimeError, "Wrong value of AttributeSequenceOfInteger" + + +#---------------------------------------------------------------------- +openedStudy=batchmode_geompy.myStudyManager.Open(file1); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeSequenceOfInteger +#====================================== + +res,A=father.FindAttribute("AttributeSequenceOfInteger") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeSequenceOfInteger" + +A = A._narrow(SALOMEDS.AttributeSequenceOfInteger) + +if A.Length() != 4: + print "Wrong length of SequenceOfInteger" +if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 500: + print "Wrong value of AttributeSequenceOfInteger" +#---------------------------------------------------------------------- +openedStudy=batchmode_geompy.myStudyManager.Open(file2); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeSequenceOfInteger +#====================================== + +res,A=father.FindAttribute("AttributeSequenceOfInteger") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeSequenceOfInteger" + +A = A._narrow(SALOMEDS.AttributeSequenceOfInteger) + +if A.Length() != 5: + print "Wrong length of SequenceOfInteger" +if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 500 or A.Value(4) != 400 or A.Value(5) != 700: + raise RuntimeError, "Wrong value of AttributeSequenceOfInteger after the first 'undo'!" + +#---------------------------------------------------------------------- +openedStudy=batchmode_geompy.myStudyManager.Open(file3); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeSequenceOfInteger +#====================================== + +res,A=father.FindAttribute("AttributeSequenceOfInteger") + +if res!=0 or A != None: + raise RuntimeError, " AttributeSequenceOfInteger is found but must not!" + diff --git a/doc/salome/examples/example17 b/doc/salome/examples/example17 new file mode 100644 index 000000000..2c3e6b819 --- /dev/null +++ b/doc/salome/examples/example17 @@ -0,0 +1,154 @@ + +batchmode_geompy.myBuilder._set_UndoLimit(20) + +batchmode_geompy.myBuilder.NewCommand() +child = batchmode_geompy.myBuilder.NewObject(batchmode_geompy.father) +batchmode_geompy.myBuilder.CommitCommand() + +batchmode_geompy.myBuilder.NewCommand() +#========================================================== +# create AttributeSequenceOfReal +#========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributeSequenceOfReal") +if A == None : + raise RuntimeError, "Can't create AttributeSequenceOfReal attribute" +A = A._narrow(SALOMEDS.AttributeSequenceOfReal) +if A == None : + raise RuntimeError, "_narrow returns None instead of AttributeSequenceOfReal pointer" + +A.Add(0.0293) +A.Add(522) +A.Add(98234) +A.Add(83.287) +batchmode_geompy.myBuilder.CommitCommand() + + +batchmode_geompy.myBuilder.NewCommand() +#========================================================== +# create AttributeInteger +#========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributeInteger") +if A == None : + raise RuntimeError, "Can't create AttributeInteger attribute" +A = A._narrow(SALOMEDS.AttributeInteger) +A.SetValue(1000000) + +if A.Value() != 1000000: + raise RuntimeError, "Error : wrong value of AttributeInteger" + +batchmode_geompy.myBuilder.CommitCommand() + +batchmode_geompy.myBuilder.NewCommand() #=================== +# create AttributeName +#=========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributeName") +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A = A._narrow(SALOMEDS.AttributeName) + +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A.SetValue("AttributesTesting") + +if A.Value() != "AttributesTesting": + print "Wrong value of AttributeName" + +batchmode_geompy.myBuilder.CommitCommand() + +batchmode_geompy.myBuilder.NewCommand() #=================== +# create AttributeComment +#=========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributeComment") +if A == None : + raise RuntimeError, "Can't create AttributeComment attribute" +A = A._narrow(SALOMEDS.AttributeComment) + +if A == None : + raise RuntimeError, "Can't create AttributeComment attribute" + +A.SetValue("GEOM") + +batchmode_geompy.myBuilder.AbortCommand() + +batchmode_geompy.myBuilder.NewCommand() #=================== +# create AttributePersistentRef +#=========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributePersistentRef") +if A == None : + raise RuntimeError, "Can't create AttributePersistentRef attribute" +A = A._narrow(SALOMEDS.AttributePersistentRef) + +if A == None : + raise RuntimeError, "Can't create AttributePersistentRef attribute" + +A.SetValue("/tmp/test;1") +batchmode_geompy.myBuilder.CommitCommand() + +batchmode_geompy.myBuilder.NewCommand() #=================================== +# create AttributeDrawable +#=========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributeDrawable") +if A == None : + raise RuntimeError, "Can't create AttributeDrawable attribute" +A = A._narrow(SALOMEDS.AttributeDrawable) + +if A == None : + raise RuntimeError, "Can't create AttributeDrawable attribute" + +A.SetDrawable(1) + +if A.IsDrawable() == 0: + "Error: wrong value of AttributeDrawable" +batchmode_geompy.myBuilder.CommitCommand() + + + +batchmode_geompy.myBuilder.NewCommand() #=================== +# create AttributeSelectable +#=========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributeSelectable") +if A == None : + raise RuntimeError, "Can't create AttributeSelectable attribute" +A = A._narrow(SALOMEDS.AttributeSelectable) + +if A == None : + raise RuntimeError, "Can't create AttributeSelectable attribute" + +A.SetSelectable(1) + +if A.IsSelectable() == 0: + "Error: wrong value of AttributeSelectable" +batchmode_geompy.myBuilder.CommitCommand() + + +batchmode_geompy.myBuilder.NewCommand() #=================== +#=========================================================== +batchmode_geompy.myBuilder.RemoveAttribute(child,"AttributeSelectable") +batchmode_geompy.myBuilder.CommitCommand() + +# Control the attributes +#=========================================================== + +res, A = batchmode_geompy.myBuilder.FindAttribute(child, "AttributeComment") +print "res = ", res +if A != None : + print " AttributeComment was found" +else: + print " AttributeComment is not found. It's correct" + +attributes=[] + +attributes = child.GetAllAttributes() + +length = len(attributes) + +print "Attributes number = ", length +print attributes +for i in range(0, length) : + attr = attributes[i] + if attr is None : + print i,"None item of object attributes list" + +if length != 5 : + raise RuntimeError, "Wrong number of attributes" + diff --git a/doc/salome/examples/example18 b/doc/salome/examples/example18 new file mode 100644 index 000000000..477f8b2b6 --- /dev/null +++ b/doc/salome/examples/example18 @@ -0,0 +1,163 @@ + +child1 = batchmode_geompy.myBuilder.NewObject(batchmode_geompy.father) +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child1,"AttributeName") +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A = A._narrow(SALOMEDS.AttributeName) +A.SetValue("N1") +N1 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child1, "AttributeTreeNode") +if N1 == None : + raise RuntimeError, "Can't create AttributeTreeNode attribute" + +child2 = batchmode_geompy.myBuilder.NewObject(batchmode_geompy.father) +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child2,"AttributeName") +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A = A._narrow(SALOMEDS.AttributeName) +A.SetValue("N2") +N2 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child2, "AttributeTreeNode") +if N2 == None : + raise RuntimeError, "Can't create AttributeTreeNode attribute" + +child3 = batchmode_geompy.myBuilder.NewObject(batchmode_geompy.father) +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child3,"AttributeName") +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A = A._narrow(SALOMEDS.AttributeName) +A.SetValue("N3") +N3 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child3, "AttributeTreeNode") +if N3 == None : + raise RuntimeError, "Can't create AttributeTreeNode attribute" + + +child11 = batchmode_geompy.myBuilder.NewObject(child1) +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child11,"AttributeName") +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A = A._narrow(SALOMEDS.AttributeName) +A.SetValue("N11") + +N11 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child11, "AttributeTreeNode") + +if N11 == None : + raise RuntimeError, "Can't create AttributeTreeNode attribute" + +child111 = batchmode_geompy.myBuilder.NewObject(child11) +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child111, "AttributeName") +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A = A._narrow(SALOMEDS.AttributeName) +A.SetValue("N111") + +N111 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child111, "AttributeTreeNode") + +if N111 == None : + raise RuntimeError, "Can't create AttributeTreeNode attribute" + + +child31 = batchmode_geompy.myBuilder.NewObject(child3) +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child31,"AttributeName") +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A = A._narrow(SALOMEDS.AttributeName) +A.SetValue("N31") + +N31 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child31, "AttributeTreeNode") +if N31 == None : + raise RuntimeError, "Can't create AttributeTreeNode attribute" + +child32 = batchmode_geompy.myBuilder.NewObject(child3) +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child32,"AttributeName") +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A = A._narrow(SALOMEDS.AttributeName) +A.SetValue("N32") + +N32 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child32, "AttributeTreeNode") +if N32 == None : + raise RuntimeError, "Can't create AttributeTreeNode attribute" + +child321 = batchmode_geompy.myBuilder.NewObject(child32) +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child321,"AttributeName") +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A = A._narrow(SALOMEDS.AttributeName) +A.SetValue("N321") + +N321 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child321, "AttributeTreeNode") +if N321 == None : + raise RuntimeError, "Can't create AttributeTreeNode attribute" + +child33 = batchmode_geompy.myBuilder.NewObject(child3) +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child33,"AttributeName") +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A = A._narrow(SALOMEDS.AttributeName) +A.SetValue("N33") + +N33 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child33, "AttributeTreeNode") +if N33 == None : + raise RuntimeError, "Can't create AttributeTreeNode attribute" + +child34 = batchmode_geompy.myBuilder.NewObject(child3) +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child34,"AttributeName") +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A = A._narrow(SALOMEDS.AttributeName) +A.SetValue("N34") + +N34 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child34, "AttributeTreeNode") +if N34 == None : + raise RuntimeError, "Can't create AttributeTreeNode attribute" + + + +#Create links between tree nodes. +# -| root +# --N1 __ +# | N11__ +# | N111 +# --N2 +# | +# --N3__ +# N31 +# N32__ +# N321 +# N33 +# N34 + +N11.SetFather(N1) +N11.Append(N111) +N3.SetPrevious(N1) +N3.Prepend(N2) + +N32.SetFather(N3) +N32.Prepend(N31) +N33.InsertAfter(N32) +N33.Append(N34) +print "------------- ", N1, " ------------- " +print "N1.Label() = ", N1.Label() , "IsRoot() = ", N1.IsRoot(), "Depth() = ", N1.Depth() +print "N11.Label() = ", N11.Label() , "IsRoot() = ", N11.IsRoot(), "Depth() = ", N11.Depth() +print "N111.Label() = ", N111.Label() , "IsRoot() = ", N111.IsRoot(), "Depth() = ", N111.Depth() +print "N2.Label() = ", N2.Label() , "IsRoot() = ", N2.IsRoot(), "Depth() = ", N2.Depth() +print "N3.Label() = ", N3.Label() , "IsRoot() = ", N3.IsRoot(), "Depth() = ", N3.Depth() +print "N31.Label() = ", N31.Label() , "IsRoot() = ", N31.IsRoot(), "Depth() = ", N31.Depth() +print "N32.Label() = ", N32.Label() , "IsRoot() = ", N32.IsRoot(), "Depth() = ", N32.Depth() +print "N321.Label() = ", N321.Label() , "IsRoot() = ", N321.IsRoot(), "Depth() = ", N321.Depth() +print "N33.Label() = ", N33.Label() , "IsRoot() = ", N33.IsRoot(), "Depth() = ", N33.Depth() +print "N34.Label() = ", N34.Label() , "IsRoot() = ", N34.IsRoot(), "Depth() = ", N34.Depth() +print "N1.IsRoot()=", N1.IsRoot() + +print "N1.HasNext() = ",N1.HasNext() +if N1.HasNext(): + print N1.Next().Label() + +print "N32.HasPrevious() = ",N32.HasPrevious() +if N32.HasPrevious(): + print N32.GetPrevious().Label() + +print "N111.HasFirst()=",N111.HasFirst() +print "N111.HasFather()=",N111.HasFather() +if N111.HasFather() : + print "N111.GetFather().Label()=",N111.GetFather().Label() + diff --git a/doc/salome/examples/example19 b/doc/salome/examples/example19 new file mode 100644 index 000000000..4cf37eb34 --- /dev/null +++ b/doc/salome/examples/example19 @@ -0,0 +1,540 @@ + +#====================================================================== +#1. Create Study and add some components to it +#====================================================================== + +#================================= +# create AttributeReal +#================================= +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeReal") +if A == None : + raise RuntimeError, "Can't create AttributeReal attribute" +A = A._narrow(SALOMEDS.AttributeReal) +A.SetValue(0.0001) +if A.Value() != 0.0001: + raise RuntimeError, "Error : wrong value of AttributeReal" + +# === Geometry ================================================== + +import batchmode_geompy + +#=================================== +# define a box +#=================================== + +box = batchmode_geompy.MakeBox(0., 0., 0., 100., 200., 300.) +idbox = batchmode_geompy.addToStudy(box,"box") + + +geom = batchmode_geompy.geom +import SMESH +import batchmode_smesh +ShapeType = batchmode_smesh.ShapeType + +# ---- add first face of box in study + +subShapeList = batchmode_geompy.SubShapeAll(box,ShapeType["Face"]) +face=subShapeList[0] +name = "box_face" +print name +idface= batchmode_geompy.addToStudyInFather(box,face,name) + +# ---- add shell from box in study + +subShellList= batchmode_geompy.SubShapeAll(box,ShapeType["Shell"]) +shell = subShellList[0] +name = "box_shell" +print name +idshell= batchmode_geompy.addToStudyInFather(box,shell,name) + +# ---- add first edge of face in study + +edgeList = batchmode_geompy.SubShapeAll(face,ShapeType["Edge"]) +edge=edgeList[0]; +name = "face_edge" +print name +idedge= batchmode_geompy.addToStudyInFather(face,edge,name) + +# ---- launch SMESH, init a Mesh with the box + +smesh = batchmode_smesh.smesh +# -- Init -- +shape = batchmode_geompy.IDToObject(idbox) +mesh=smesh.Init(geom, batchmode_geompy.myStudyId, shape) + +orb = batchmode_geompy.orb + +idmesh = batchmode_smesh.AddNewMesh( orb.object_to_string(mesh) ) +batchmode_smesh.SetName(idmesh, "Meshbox"); +batchmode_smesh.SetShape(idbox, idmesh); + +# ---- create Hypothesis + +print "-------------------------- create Hypothesis ----------------------" +print "-------------------------- LocalLength" +hyp1 = smesh.CreateHypothesis("LocalLength", batchmode_geompy.myStudyId ) +hypLen1 = hyp1._narrow(SMESH.SMESH_LocalLength) +hypLen1.SetLength(100) +print hypLen1.GetName() +print hypLen1.GetId() +print hypLen1.GetLength() + +idlength = batchmode_smesh.AddNewHypothesis( orb.object_to_string(hypLen1) ); +batchmode_smesh.SetName(idlength, "Local_Length_100"); + +print "-------------------------- NumberOfSegments" +hyp2 = smesh.CreateHypothesis("NumberOfSegments", batchmode_geompy.myStudyId ) +hypNbSeg1=hyp2._narrow(SMESH.SMESH_NumberOfSegments) +hypNbSeg1.SetNumberOfSegments(7) +print hypNbSeg1.GetName() +print hypNbSeg1.GetId() +print hypNbSeg1.GetNumberOfSegments() + +idseg = batchmode_smesh.AddNewHypothesis( orb.object_to_string(hypNbSeg1) ); +batchmode_smesh.SetName(idseg, "NumberOfSegments_7"); + +print "-------------------------- MaxElementArea" +hyp3 = smesh.CreateHypothesis("MaxElementArea", batchmode_geompy.myStudyId) +hypArea1=hyp3._narrow(SMESH.SMESH_MaxElementArea) +hypArea1.SetMaxElementArea(2500) +print hypArea1.GetName() +print hypArea1.GetId() +print hypArea1.GetMaxElementArea() + +idarea1 = batchmode_smesh.AddNewHypothesis( orb.object_to_string(hypArea1) ); +batchmode_smesh.SetName(idarea1, "MaxElementArea_2500"); + +print "-------------------------- MaxElementArea" +hyp3 = smesh.CreateHypothesis("MaxElementArea", batchmode_geompy.myStudyId) +hypArea2 = hyp3._narrow(SMESH.SMESH_MaxElementArea) +hypArea2.SetMaxElementArea(500) +print hypArea2.GetName() +print hypArea2.GetId() +print hypArea2.GetMaxElementArea() + +idarea2 = batchmode_smesh.AddNewHypothesis( orb.object_to_string(hypArea2) ); +batchmode_smesh.SetName(idarea2, "MaxElementArea_500"); + +print "-------------------------- Regular_1D" +alg1 = smesh.CreateHypothesis("Regular_1D", batchmode_geompy.myStudyId) +algo1 = alg1._narrow(SMESH.SMESH_Algo) +listHyp = algo1.GetCompatibleHypothesis() +for hyp in listHyp: + print hyp +algoReg=alg1._narrow(SMESH.SMESH_Regular_1D) +print algoReg.GetName() +print algoReg.GetId() + +idreg = batchmode_smesh.AddNewAlgorithms( orb.object_to_string(algoReg) ); +batchmode_smesh.SetName(idreg, "Regular_1D"); + +print "-------------------------- MEFISTO_2D" +alg2 = smesh.CreateHypothesis("MEFISTO_2D", batchmode_geompy.myStudyId) +algo2 = alg2._narrow(SMESH.SMESH_Algo) +listHyp=algo2.GetCompatibleHypothesis() +for hyp in listHyp: + print hyp +algoMef=alg2._narrow(SMESH.SMESH_MEFISTO_2D) +print algoMef.GetName() +print algoMef.GetId() + +idmef = batchmode_smesh.AddNewAlgorithms( orb.object_to_string(algoMef) ); +batchmode_smesh.SetName(idmef, "MEFISTO_2D"); + + +# ---- add hypothesis to edge + +print "-------------------------- add hypothesis to edge" +edge = batchmode_geompy.IDToObject(idedge) +submesh = mesh.GetElementsOnShape(edge) +ret = mesh.AddHypothesis(edge,algoReg) +print ret +ret=mesh.AddHypothesis(edge,hypLen1) +print ret + +idsm1 = batchmode_smesh.AddSubMeshOnShape( idmesh, + idedge, + orb.object_to_string(submesh), + ShapeType["Edge"] ) +batchmode_smesh.SetName(idsm1, "SubMeshEdge") +batchmode_smesh.SetAlgorithms( idsm1, idreg ); +batchmode_smesh.SetHypothesis( idsm1, idlength ); + +print "-------------------------- add hypothesis to face" +face=batchmode_geompy.IDToObject(idface) +submesh=mesh.GetElementsOnShape(face) +ret=mesh.AddHypothesis(face,hypArea2) +print ret + +idsm2 = batchmode_smesh.AddSubMeshOnShape( idmesh, + idface, + orb.object_to_string(submesh), + ShapeType["Face"] ) +batchmode_smesh.SetName(idsm2, "SubMeshFace") +batchmode_smesh.SetHypothesis( idsm2, idarea2 ); + +# ---- add hypothesis to box + +print "-------------------------- add hypothesis to box" +box=batchmode_geompy.IDToObject(idbox) +submesh=mesh.GetElementsOnShape(box) +ret=mesh.AddHypothesis(box,algoReg) +print ret +ret=mesh.AddHypothesis(box,hypNbSeg1) +print ret +ret=mesh.AddHypothesis(box,algoMef) +print ret +ret=mesh.AddHypothesis(box,hypArea1) +print ret + +batchmode_smesh.SetAlgorithms( idmesh, idreg ); +batchmode_smesh.SetHypothesis( idmesh, idseg ); +batchmode_smesh.SetAlgorithms( idmesh, idmef ); +batchmode_smesh.SetHypothesis( idmesh, idarea1 ); + +# ---- compute box + +print "-------------------------- compute box" +ret=smesh.Compute(mesh,box) +print ret +log=mesh.GetLog(0); # no erase trace +for linelog in log: + print linelog + + +#======================================================= +# add SuperVision component +#======================================================= + +from batchmode_SuperV import * +import os +dir= os.getenv("SUPERV_ROOT_DIR") +if dir == None: + raise RuntimeError, "SUPERV_ROOT_DIR is not defined" +xmlfile = dir +"/examples/GraphEssai.xml" +print "--------------\n"+xmlfile+"\n--------------\n" + +myGraph = Graph ( xmlfile ) + +# This DataFlow is "valid" : no loop, correct links between Nodes etc... +print myGraph.IsValid() + +# Get Nodes +myGraph.PrintNodes() +Add,Sub,Mul,Div = myGraph.Nodes() + +# Load Datas +Addx = Add.Input("x",3.) +Addy = Add.Input("y",4.5) +Subx = Sub.Input("x",1.5) + +# Get Output Port +Addz = Add.Port('z') +Subz = Sub.Port('z') +Mulz = Mul.Port('z') +Divz = Div.Port('z') + +# This DataFlow is "executable" : all pending Ports are defined with Datas +print myGraph.IsExecutable() + +# Starts only execution of that DataFlow and gets control immediatly +print myGraph.Run() + +# That DataFlow is running ==> 0 (false) +print myGraph.IsDone() + +# Events of execution : +aStatus,aNode,anEvent,aState = myGraph.Event() +while aStatus : + print aNode.Thread(),aNode.SubGraph(),aNode.Name(),anEvent,aState + aStatus,aNode,anEvent,aState = myGraph.Event() +print myGraph.IsDone() + +# Wait for Completion (but it is already done after event loop ...) +print "Done : ",myGraph.DoneW() + +# Get result +print "Result : ",Divz.ToString() + +# Intermediate results : +print "Intermediate Result Add\z : ",Addz.ToString() +print "Intermediate Result Sub\z : ",Subz.ToString() +print "Intermediate Result Mul\z : ",Mulz.ToString() + +print " " +#print "Type : print myGraph.IsDone()" +#print " If execution is finished ==> 1 (true)" +res=myGraph.IsDone() +if res != 1: + raise RuntimeError, "myGraph.Run() is not done" + +print " " +print "Type : print Divz.ToString()" +print " You will get the result" +Divz.ToString() + +print " " +print "Type : myGraph.PrintPorts()" +print " to see input and output values of the graph" +myGraph.PrintPorts() + +print " " +print "Type : Add.PrintPorts()" +Add.PrintPorts() + +print "Type : Sub.PrintPorts()" +Sub.PrintPorts() + +print "Type : Mul.PrintPorts()" +Mul.PrintPorts() + +print "Type : Div.PrintPorts()" +print " to see input and output values of nodes" +Div.PrintPorts() + +# Export will create newsupervisionexample.xml and the corresponding .py file +tmpdir=os.getenv("TmpDir") +if tmpdir is None: + tmpdir="/tmp" +file = tmpdir + "/newsupervisionexample" +print "--------------\n"+file+"\n--------------\n" +myGraph.Export(file) + +ior = batchmode_geompy.orb.object_to_string(myGraph.G) +addStudy(ior) + +GraphName = myGraph.Name() +print "Befor save ", +nodes = myGraph.Nodes() +length_bs = len(nodes) +print "ListOfNodes length = ", length_bs +names=[] +for node in nodes: + names.append(node.Name()) +print names + + +#================================= +# save / restore study +#================================= +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + + +#================================================== +#1. SaveAs +#================================================== +print " ------- We will save to", file, "-----------" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +batchmode_geompy.myStudyManager.Close(batchmode_geompy.myStudy) + +#rename the file and try to reread it again + +os.mkdir(str + "/test_dir") + +#2.================================================== +print " ------- We rename the file as " + str + "/test_dir/test_new.hdf" +os.rename(file, str+"/test_dir/test_new.hdf") + +#================================================== +#3. Open +#================================================== +print " ------- We try to open " + str + "/test_dir/test_new.hdf" + +try: + openedStudy=batchmode_geompy.myStudyManager.Open(str+"/test_dir/test_new.hdf") +except Exception: + raise RuntimeError, "Can't open saved study!" + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "GEOM component is not found! Wrong study is opened." + + +#================================= +# find AttributeReal +#================================= + +res,A=father.FindAttribute("AttributeReal") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeReal" + +A = A._narrow(SALOMEDS.AttributeReal) +if A.Value() != 0.0001: + raise RuntimeError, "Error : wrong value of AttributeReal" + +#================================================== +# find box +#================================================== +box = openedStudy.FindObject("box") +if box is None : + raise RuntimeError, "box was not found! Wrong study is opened." + +edge=openedStudy.FindObject("face_edge") +if edge is None : + raise RuntimeError, "face_edge was not found! Wrong study is opened." + + +father = openedStudy.FindComponent("MESH") +if father is None: + raise RuntimeError, "MESH component is not found! Wrong study is opened." + +hp=openedStudy.FindObject("Meshbox") +if hp is None: + raise RuntimeError, "Meshbox object was not found! Wrong study is opened." + +hp = openedStudy.FindObject("Algorithms Definition") +if hp is None: + raise RuntimeError, "Algorithms Definition object was not found! Wrong study is opened." + +hp = openedStudy.FindObject("MEFISTO_2D") +if hp is None: + raise RuntimeError, "MEFISTO_2D object was not found! Wrong study is opened." + +hp = openedStudy.FindObject("Hypothesis Definition") +if hp is None: + raise RuntimeError, "Algoriths Definition was not found! Wrong study is opened." + +#================================================== +# Find Supervisor +#================================================== +father = openedStudy.FindComponent("SUPERV") +if father is None: + raise RuntimeError, "SUPERV component is not found! Wrong study is opened." + +SuperV = lcc.FindOrLoadComponent("SuperVisionContainer","Supervision") +Builder = openedStudy.NewBuilder() +Builder.LoadWith(father, SuperV) +import SALOMEDS + +aChildIterator = openedStudy.NewChildIterator(father) + +#while aChildIterator.More(): +anSObject = aChildIterator.Value() +#print "iterate: ", anSObject.GetID() +res, anAttr=anSObject.FindAttribute("AttributeIOR") +if res : + anAttr=anAttr._narrow(SALOMEDS.AttributeIOR) + ior = anAttr.Value() + Graph=SuperV.getGraph(ior) + ListOfNodes=Graph.Nodes() + length_as= len(ListOfNodes) + print "ListOfNodes length = ", length_as + if length_as != length_bs: + raise RuntimeErrror, "defferent length of nodes after study open" +#aChildIterator.Next() + +Names = [] +for node in ListOfNodes: + Names.append(node.Name()) +names.sort() +Names.sort() +if names != Names : + raise RuntimeError, "List of dataflow nodes after save differs from one befor save operation" + +#================================================== +#4. Save +#================================================== +batchmode_geompy.myStudyManager.Save(openedStudy) +batchmode_geompy.myStudyManager.Close(openedStudy) +#================================================== +#5. Open +#================================================== +try: + openedStudy = batchmode_geompy.myStudyManager.Open(str+"/test_dir/test_new.hdf") +except Exception: + raise RuntimeError, "Can't open saved study!" + + + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +#find AttributeReal +res,A=father.FindAttribute("AttributeReal") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeReal" + +A = A._narrow(SALOMEDS.AttributeReal) +if A.Value() != 0.0001: + raise RuntimeError, "Error : wrong value of AttributeReal" +#================================================== +# find box +#================================================== +box = openedStudy.FindObject("box") +if box is None : + raise RuntimeError, "box was not found! Wrong study is opened." + +edge=openedStudy.FindObject("face_edge") +if edge is None : + raise RuntimeError, "face_edge was not found! Wrong study is opened." + + +father = openedStudy.FindComponent("MESH") +if father is None: + raise RuntimeError, "MESH component is not found! Wrong study is opened." + +hp=openedStudy.FindObject("Meshbox") +if hp is None: + raise RuntimeError, "Meshbox object was not found! Wrong study is opened." + +hp = openedStudy.FindObject("Algorithms Definition") +if hp is None: + raise RuntimeError, "Algorithms Definition object was not found! Wrong study is opened." + +hp = openedStudy.FindObject("MEFISTO_2D") +if hp is None: + raise RuntimeError, "MEFISTO_2D object was not found! Wrong study is opened." + +hp = openedStudy.FindObject("Hypothesis Definition") +if hp is None: + raise RuntimeError, "Algoriths Definition was not found! Wrong study is opened." + +#================================================== +# Find Supervisor +#================================================== +father = openedStudy.FindComponent("SUPERV") +if father is None: + raise RuntimeError, "SUPERV component is not found! Wrong study is opened." + +SuperV = lcc.FindOrLoadComponent("SuperVisionContainer","Supervision") +Builder = openedStudy.NewBuilder() +Builder.LoadWith(father, SuperV) +import SALOMEDS + +aChildIterator = openedStudy.NewChildIterator(father) + +#while aChildIterator.More(): +anSObject = aChildIterator.Value() + +res, anAttr=anSObject.FindAttribute("AttributeIOR") +if res : + anAttr=anAttr._narrow(SALOMEDS.AttributeIOR) + ior = anAttr.Value() + Graph=SuperV.getGraph(ior) + ListOfNodes=Graph.Nodes() + length_as= len(ListOfNodes) + print "ListOfNodes length = ", length_as + if length_as != length_bs: + raise RuntimeErrror, "defferent length of nodes after study open" +#aChildIterator.Next() + +Names = [] +for node in ListOfNodes: + Names.append(node.Name()) +names.sort() +Names.sort() +if names != Names : + raise RuntimeError, "List of dataflow nodes after save differs from one befor save operation" + diff --git a/doc/salome/examples/example20 b/doc/salome/examples/example20 new file mode 100644 index 000000000..9326da115 --- /dev/null +++ b/doc/salome/examples/example20 @@ -0,0 +1,152 @@ + +batchmode_geompy.myBuilder._set_UndoLimit(20) + +#-------------------------------------------------------------------------- +# create AttributeReal +#=============================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeReal") +if A == None : + raise RuntimeError, "Can't create AttributeReal attribute" +A = A._narrow(SALOMEDS.AttributeReal) +A.SetValue(0.0001) +if A.Value() != 0.0001: + raise RuntimeError, "Error : wrong value of AttributeReal" + +# create AttributeStudyProperties +#================================================ +A = batchmode_geompy.myStudy.GetProperties() +if A == None : + raise RuntimeError, "Can't create AttributeStudyProperties attribute" +A = A._narrow(SALOMEDS.AttributeStudyProperties) + +batchmode_geompy.myBuilder.NewCommand(); +print "A.GetUserName()= ", A.GetUserName() +res,mm,hh,dd,mnth,yy=A.GetCreationDate() +print "A.GetCreationDate() = ", mm,hh,dd,mnth,yy +print "A.GetCreationMode() = ", A.GetCreationMode() +print "A.IsModified() = ", A.IsModified() +print "A.IsLocked() = ", A.IsLocked() +if A.IsLocked() == 0 : + A.SetUserName("tester"); print 'A.SetUserName("tester"), A.GetUserName() = ', A.GetUserName() + A.SetCreationDate(11,11,11,11,2002); print 'A.SetCreationDate(11,11,11,11,2002), A.GetCreationDate() =', A.GetCreationDate() + print "A.IsModified() = ", A.IsModified() +A.SetLocked(1) + +#check the transaction result +batchmode_geompy.myBuilder.CommitCommand() +if A.GetUserName() != "tester": + print 'Control after transaction close : A.GetUserName() = ', A.GetUserName() + raise RuntimeError, "Field 'UserName' was not modified but had to!" + +# try to make some changes wrapped by transaction +#================================================ +batchmode_geompy.myBuilder.NewCommand() +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeInteger") + +if A == None : + raise RuntimeError, "Can't create AttributeInteger attribute" +A = A._narrow(SALOMEDS.AttributeInteger) +A.SetValue(1000000) + +exception_was = None +try : batchmode_geompy.myBuilder.CommitCommand() +except Exception: exception_was = 1 + +if exception_was is None: + raise RuntimeError, "Study was locked for changes but CommitCommand did not generate an exception !" + +# save / restore study + +#================================================ +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +print " ------- We will save to", file, "-----------" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) + + +#--------------------------------------------------------------------------# +#--------------------------- Open file ------------------------------------# +#--------------------------------------------------------------------------# + +print" -------------- Open " + file + "-------------- " + +openedStudy = batchmode_geompy.myStudyManager.Open(file) +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +#1. find AttributeReal +#================================================ + +res,A=father.FindAttribute("AttributeReal") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeReal" + +A = A._narrow(SALOMEDS.AttributeReal) +if A.Value() != 0.0001: + raise RuntimeError, "Error : wrong value of AttributeReal" + + +#2. find AttributeStudyProperties +#================================================= +A=openedStudy.GetProperties() +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeStudyProperties" + +A = A._narrow(SALOMEDS.AttributeStudyProperties) +if A.IsLocked() == 0 : + raise RuntimeError, "Error : AttributeStudyProperties must have Locked flag but have no!" + +#get the builder +myBuilder = openedStudy.NewBuilder() + +#3. try to make some changes wrapped by transaction +#================================================== +exception_was = None +try : + myBuilder.NewCommand() + A = myBuilder.FindOrCreateAttribute(father, "AttributeInteger") + + if A == None : + raise RuntimeError, "Can't create AttributeInteger attribute" + A = A._narrow(SALOMEDS.AttributeInteger) + A.SetValue(1000000) + myBuilder.CommitCommand() +except Exception: exception_was = 1 + +if exception_was is None: + raise RuntimeError, "Study was locked for changes but CommitCommand did not generate an exception !" + + +myBuilder.NewCommand() +A=openedStudy.GetProperties() +A = A._narrow(SALOMEDS.AttributeStudyProperties) +A.SetLocked(0) +myBuilder.CommitCommand() + +#4. +myBuilder.NewCommand() +A.SetLocked(0); +print "A.GetUserName()= ", A.GetUserName() +print "A.GetCreationDate() = ", A.GetCreationDate() +print "A.GetCreationMode() = ", A.GetCreationMode() +print "A.IsModified() = ", A.IsModified() +myBuilder.CommitCommand() + +#5. +myBuilder.NewCommand() +A.SetUserName("tester1") +myBuilder.CommitCommand() +print "A.GetUserName()= ", A.GetUserName() + +#remove the document file +os.remove(file) + diff --git a/doc/salome/examples/example21 b/doc/salome/examples/example21 new file mode 100644 index 000000000..33526d956 --- /dev/null +++ b/doc/salome/examples/example21 @@ -0,0 +1,127 @@ + +# create AttributeReal +#======================================================================================================= +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeTableOfInteger") +if A == None : + raise RuntimeError, "Can't create AttributeTableOfInteger attribute" +A = A._narrow(SALOMEDS.AttributeTableOfInteger) +a=[1,2] + +b=[3,4] + +# 2x2 +# --- rows --- +A.AddRow(a) +A.AddRow(b) +a=[34,14] +A.SetRow(1,a) + +# 3x3 +# +b=[54,56] +A.AddRow(b) + +# --- columns --- +a=[76,25,12] + +A.AddColumn(a) +a=[836,3425,342] +A.SetColumn(3,a) + +# change attribute values +print "A.GetValue(2,2) = ", A.GetValue(2,2) +print "A.PutValue(2,2,625323)" +A.PutValue(625323,2,2) +print "A.GetValue(2,2) = ", A.GetValue(2,2) + +#set Titles + +A.SetTitle("TEST") + +A.SetRowTitle(1,"FR") +A.SetRowTitle(2,"SR") +A.SetRowTitle(3,"TR") + +A.SetColumnTitle(1,"FC") +A.SetColumnTitle(2,"SC") +A.SetColumnTitle(3,"TC") + + +#check the table +print "Common title : ",A.GetTitle() +print "Rows titles : ", A.GetRowTitles() +rnb = A.GetNbRows() +for i in range(1, rnb): + b=A.GetRow(i) + print b + +cnb = A.GetNbColumns() +print "Columns title : ", A.GetColumnTitles() +for i in range(1, cnb): + b=A.GetColumn(i) + print b + +# set titles +#titles=["11","12","13"] +#A.SetRowTitles(titles) +#titles=["21","22","23"] +#A.SetRowTitles(2,titles) +#titles=["31","32","33"] +#A.SetRowTitles(3,titles) + +#--------------------------------------------------------------------------# +# ----------------------- save the study ----------------------------------# +#--------------------------------------------------------------------------# +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +print " ------- We will save to", file, "-----------" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) + +#--------------------------------------------------------------------------# +#---------------------------- Open file -----------------------------------# +#--------------------------------------------------------------------------# + +print" -------------- Open " + file + "-------------- " + +openedStudy=batchmode_geompy.myStudyManager.Open(file) +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + +# --- check attribute --- + +res,A=father.FindAttribute("AttributeTableOfInteger") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeTableOfInteger" + +A = A._narrow(SALOMEDS.AttributeTableOfInteger) + +#check the table +print "Common title : ",A.GetTitle() +print "Rows titles : ", A.GetRowTitles() +rnb = A.GetNbRows() +for i in range(1, rnb): + b=A.GetRow(i) + print b + +cnb = A.GetNbColumns() +print "Columns title : ", A.GetColumnTitles() +for i in range(1, cnb): + b=A.GetColumn(i) + print b + +titles=["ff","ss","tt"] +A.SetRowTitles(titles) +print "Rows titles : ", A.GetRowTitles() + +titles=["ww","zz","cc"] +A.SetColumnTitles(titles) +print "Column titles : ", A.GetColumnTitles() + diff --git a/doc/salome/examples/example22 b/doc/salome/examples/example22 new file mode 100644 index 000000000..bba273be6 --- /dev/null +++ b/doc/salome/examples/example22 @@ -0,0 +1,128 @@ + +# create AttributeReal +#=============================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeTableOfReal") +if A == None : + raise RuntimeError, "Can't create AttributeTableOfReal attribute" +A = A._narrow(SALOMEDS.AttributeTableOfReal) +a=[1,2] + +b=[3,4] + +# 2x2 +# --- rows --- +A.AddRow(a) +A.AddRow(b) +a=[34,14] +A.SetRow(1,a) + +# 3x3 +# +b=[54,56] +A.AddRow(b) + +# --- columns --- +a=[76,25,12] + +A.AddColumn(a) +a=[836,3425,342] +A.SetColumn(3,a) + +# change attribute values +print "A.GetValue(2,2) = ", A.GetValue(2,2) +print "A.PutValue(2,2,625323)" +A.PutValue(625323,2,2) +print "A.GetValue(2,2) = ", A.GetValue(2,2) + +#set Titles + +A.SetTitle("TEST") + +A.SetRowTitle(1,"FR") +A.SetRowTitle(2,"SR") +A.SetRowTitle(3,"TR") + +A.SetColumnTitle(1,"FC") +A.SetColumnTitle(2,"SC") +A.SetColumnTitle(3,"TC") + + +#check the table +print "Common title : ",A.GetTitle() +print "Rows titles : ", A.GetRowTitles() +rnb = A.GetNbRows() + 1 +for i in range(1, rnb): + b=A.GetRow(i) + print b + +cnb = A.GetNbColumns() + 1 +print "Columns title : ", A.GetColumnTitles() +for i in range(1, cnb): + b=A.GetColumn(i) + print b + +# set titles +#titles=["11","12","13"] +#A.SetRowTitles(titles) +#titles=["21","22","23"] +#A.SetRowTitles(2,titles) +#titles=["31","32","33"] +#A.SetRowTitles(3,titles) + +#--------------------------------------------------------------------------# +#------------------------ save the study ----------------------------------# +#--------------------------------------------------------------------------# +import os +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +print " ------- We will save to", file, "-----------" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) + +#--------------------------------------------------------------------------# +#---------------------------- Open file -----------------------------------# +#--------------------------------------------------------------------------# + +print" -------------- Open " + file + "-------------- " + +openedStudy = batchmode_geompy.myStudyManager.Open(file) +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + +# --- check attribute --- + +res,A=father.FindAttribute("AttributeTableOfReal") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeTableOfReal" + +A = A._narrow(SALOMEDS.AttributeTableOfReal) + +#check the table +print "Common title : ",A.GetTitle() +print "Rows titles : ", A.GetRowTitles() +rnb = A.GetNbRows() + 1 +for i in range(1, rnb): + b=A.GetRow(i) + print b + +cnb = A.GetNbColumns() + 1 +print "Columns title : ", A.GetColumnTitles() +for i in range(1, cnb): + b=A.GetColumn(i) + print b + +titles=["ff","ss","tt"] +A.SetRowTitles(titles) +print "Rows titles : ", A.GetRowTitles() + +titles=["ww","zz","cc"] +A.SetColumnTitles(titles) +print "Column titles : ", A.GetColumnTitles() + diff --git a/doc/salome/examples/example23 b/doc/salome/examples/example23 new file mode 100644 index 000000000..da60ce0e9 --- /dev/null +++ b/doc/salome/examples/example23 @@ -0,0 +1,30 @@ + +import batchmode_salome +#import SALOMEDS + +aStudy = batchmode_salome.myStudy + +#Add new component 'User data' +aBuilder = aStudy.NewBuilder() +aComponent = aBuilder.NewComponent("User data") +anAttr = aBuilder.FindOrCreateAttribute(aComponent, "AttributeName") +anAttrName = anAttr._narrow(SALOMEDS.AttributeName) +anAttrName.SetValue("User data") + + +#Add a new case 'Case1' to the component 'User data' +aBuilder.AddDirectory("/User data/Case1") + +#Set a study context to '/User data/Case1' +aStudy.SetContext("/User data/Case1") + +#Print the current study context +print aStudy.GetContext() + +#Add a sub directory 'aSubCase' to 'Case1' (under the current context) +aBuilder.AddDirectory("aSubCase") + + +#Add a new case 'Case2' to component 'User data' +aBuilder.AddDirectory("/User data/Case2") + diff --git a/doc/salome/examples/example3 b/doc/salome/examples/example3 new file mode 100644 index 000000000..95e18e8e7 --- /dev/null +++ b/doc/salome/examples/example3 @@ -0,0 +1,60 @@ + +# create AttributeSequenceOfReal +#================================= +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeSequenceOfReal") +if A == None : + raise RuntimeError, "Can't create AttributeSequenceOfReal attribute" +A = A._narrow(SALOMEDS.AttributeSequenceOfReal) +if A == None : + raise RuntimeError, "_narrow returns None instead of AttributeSequenceOfReal pointer" + +A.Add(0.0293) +A.Add(625.1e+2) +A.Add(0.928e+100) +A.Add(83.287) + +print "initial values ",A.Value(1), A.Value(2), A.Value(3), A.Value(4) +A.Remove(3) +print "after remove ", A.Value(1), A.Value(2), A.Value(3) +A.ChangeValue(2,76.265) +print "after second item change", A.Value(1), A.Value(2), A.Value(3) + +if A.Length() != 3: + print "Error : wrong length of SequenceOfReal" +if A.Value(1) != 0.0293 or A.Value(2) != 76.265 or A.Value(3) != 83.287: + print "Error : wrong value of AttributeSequenceOfReal" + +# save / restore study +#================================= +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy=batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeSequenceOfReal +#================================= + +res,A=father.FindAttribute("AttributeSequenceOfReal") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeSequenceOfReal" + +A = A._narrow(SALOMEDS.AttributeSequenceOfReal) + +if A.Length() != 3: + print "Error : wrong length of SequenceOfReal" +if A.Value(1) != 0.0293 or A.Value(2) != 76.265 or A.Value(3) != 83.287: + print "Error : wrong value of AttributeSequenceOfReal" +print "after restoring ", A.Value(1), A.Value(2), A.Value(3) + diff --git a/doc/salome/examples/example4 b/doc/salome/examples/example4 new file mode 100644 index 000000000..2dd1966db --- /dev/null +++ b/doc/salome/examples/example4 @@ -0,0 +1,58 @@ + +# create AttributeSequenceOfInteger +#========================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeSequenceOfInteger") +if A == None : + raise RuntimeError, "Can't create AttributeSequenceOfInteger attribute" +A = A._narrow(SALOMEDS.AttributeSequenceOfInteger) +if A == None : + raise RuntimeError, "Can't create AttributeSequenceOfInteger attribute" + +A.Add(100) +A.Add(300) +A.Add(500) +A.Add(400) +A.Add(700) + +A.Remove(3) +A.ChangeValue(4,500) + + +if A.Length() != 4: + print "Wrong length of SequenceOfInteger" +if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 700: + print "Wrong value of AttributeSequenceOfInteger" + + +# save / restore study +#================================= +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy=batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeSequenceOfInteger +#====================================== + +res,A=father.FindAttribute("AttributeSequenceOfInteger") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeSequenceOfInteger" + +A = A._narrow(SALOMEDS.AttributeSequenceOfInteger) + +if A.Length() != 4: + print "Wrong length of SequenceOfInteger" +if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 700: + print "Wrong value of AttributeSequenceOfInteger" + diff --git a/doc/salome/examples/example5 b/doc/salome/examples/example5 new file mode 100644 index 000000000..59e3bc6a0 --- /dev/null +++ b/doc/salome/examples/example5 @@ -0,0 +1,50 @@ + +# create AttributeName +#=========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeName") +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A = A._narrow(SALOMEDS.AttributeName) + +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" +A.SetValue("AttributesTesting") + +if A.Value() != "AttributesTesting": + print "Wrong value of AttributeName" + + +# save / restore study +#================================= +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy = batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeName +#====================================== + +res,A=father.FindAttribute("AttributeName") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeName" + +A = A._narrow(SALOMEDS.AttributeName) + +if A == None : + raise RuntimeError, "Can't create AttributeName attribute" + +if A.Value() != "AttributesTesting": + print "Wrong value of AttributeName" + diff --git a/doc/salome/examples/example6 b/doc/salome/examples/example6 new file mode 100644 index 000000000..71a5859e7 --- /dev/null +++ b/doc/salome/examples/example6 @@ -0,0 +1,47 @@ + +# create AttributeComment +#=========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeComment") +if A == None : + raise RuntimeError, "Can't create AttributeComment attribute" +A = A._narrow(SALOMEDS.AttributeComment) + +if A == None : + raise RuntimeError, "Can't create AttributeComment attribute" + +A.SetValue("GEOM") + + +# save / restore study +#============================================================ +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy = batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeComment +#============================================================ + +res,A=father.FindAttribute("AttributeComment") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeComment" + +A = A._narrow(SALOMEDS.AttributeComment) + +if A == None : + raise RuntimeError, "Can't create AttributeComment attribute" + +if A.Value() != "GEOM": + "Error: wrong value of AttributeComment" + diff --git a/doc/salome/examples/example7 b/doc/salome/examples/example7 new file mode 100644 index 000000000..8ddf8bb2b --- /dev/null +++ b/doc/salome/examples/example7 @@ -0,0 +1,45 @@ + +# create AttributePersistentRef +#=========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributePersistentRef") +if A == None : + raise RuntimeError, "Can't create AttributePersistentRef attribute" +A = A._narrow(SALOMEDS.AttributePersistentRef) + +if A == None : + raise RuntimeError, "Can't create AttributePersistentRef attribute" + +A.SetValue("/tmp/test;1") + +# save / restore study +#============================================================ +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy = batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributePersistentRef +#============================================================ + +res,A=father.FindAttribute("AttributePersistentRef") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributePersistentRef" + +A = A._narrow(SALOMEDS.AttributePersistentRef) + +if A == None : + raise RuntimeError, "Can't create AttributePersistentRef attribute" + +if A.Value() != "/tmp/test;1": + "Error: wrong value of AttributePersistentRef" diff --git a/doc/salome/examples/example8 b/doc/salome/examples/example8 new file mode 100644 index 000000000..eadb13feb --- /dev/null +++ b/doc/salome/examples/example8 @@ -0,0 +1,54 @@ + +from batchmode_geompy import * +import os + +#-------------------------------------------------------------------------- +# create AttributeDrawable +#=========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeDrawable") +if A == None : + raise RuntimeError, "Can't create AttributeDrawable attribute" +A = A._narrow(SALOMEDS.AttributeDrawable) + +if A == None : + raise RuntimeError, "Can't create AttributeDrawable attribute" + +A.SetDrawable(1) + +if A.IsDrawable() == 0: + "Error: wrong value of AttributeDrawable" + + +# save / restore study +#============================================================ +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy=batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeDrawable +#============================================================ + +res,A=father.FindAttribute("AttributeDrawable") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeDrawable" + +A = A._narrow(SALOMEDS.AttributeDrawable) + +if A == None : + raise RuntimeError, "Can't create AttributeDrawable attribute" + +if A.IsDrawable() == 0: + "Error: wrong value of AttributeDrawable" + diff --git a/doc/salome/examples/example9 b/doc/salome/examples/example9 new file mode 100644 index 000000000..d29c9bab7 --- /dev/null +++ b/doc/salome/examples/example9 @@ -0,0 +1,50 @@ + +# create AttributeSelectable +#=========================================================== +A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeSelectable") +if A == None : + raise RuntimeError, "Can't create AttributeSelectable attribute" +A = A._narrow(SALOMEDS.AttributeSelectable) + +if A == None : + raise RuntimeError, "Can't create AttributeSelectable attribute" + +A.SetSelectable(1) + +if A.IsSelectable() == 0: + "Error: wrong value of AttributeSelectable" + + +# save / restore study +#============================================================ +str= os.getenv("TmpDir") +if str == None: + str = "/tmp" +file = str+"/test.hdf" + +batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy) +openedStudy = batchmode_geompy.myStudyManager.Open(file); + +if openedStudy == None: + raise RuntimeError, "Can't open saved study!" + +father = openedStudy.FindComponent("GEOM") +if father is None: + raise RuntimeError, "Geom component is not found! Wrong study is opened." + + +# find AttributeSelectable +#============================================================ + +res,A=father.FindAttribute("AttributeSelectable") +if res == 0 or A == None: + raise RuntimeError, "Error: not found AttributeSelectable" + +A = A._narrow(SALOMEDS.AttributeSelectable) + +if A == None : + raise RuntimeError, "Can't create AttributeSelectable attribute" + +if A.IsSelectable() == 0: + "Error: wrong value of AttributeSelectable" + diff --git a/doc/salome/gui/Makefile.am b/doc/salome/gui/Makefile.am new file mode 100644 index 000000000..6205e23b6 --- /dev/null +++ b/doc/salome/gui/Makefile.am @@ -0,0 +1,27 @@ +include $(top_srcdir)/salome_adm/unix/make_common_starter.am + +usr_docs: doxyfile ../Batch.html + echo "Running doxygen in directory: "`pwd`; \ + $(DOXYGEN) $< ; \ + cp -rf ../Batch.html KERNEL + +docs: usr_docs + +info_TEXINFOS = ../Batch.texi + +install-data-local: usr_docs + $(INSTALL) -d $(DESTDIR)$(docdir)/gui + cp -rp KERNEL $(DESTDIR)$(docdir)/gui + +uninstall-local: + rm -rf $(DESTDIR)$(docdir)/gui/KERNEL + +clean-local: + -rm -fr KERNEL log.txt + +dist-hook: + cp -Rp $(srcdir)/images $(distdir) ; \ + rm -rf $(distdir)/images/CVS ; \ + cp -Rp $(srcdir)/static $(distdir) ; \ + rm -rf $(distdir)/static/CVS + diff --git a/doc/salome/tui/KERNEL/doxyuser.in b/doc/salome/gui/doxyfile.in similarity index 89% rename from doc/salome/tui/KERNEL/doxyuser.in rename to doc/salome/gui/doxyfile.in index d3387500b..b81ddc6ed 100644 --- a/doc/salome/tui/KERNEL/doxyuser.in +++ b/doc/salome/gui/doxyfile.in @@ -5,18 +5,17 @@ #--------------------------------------------------------------------------- PROJECT_NAME = "SALOME v.@VERSION@" PROJECT_NUMBER = -OUTPUT_DIRECTORY = ../ +OUTPUT_DIRECTORY = KERNEL CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = NO +REPEAT_BRIEF = YES ABBREVIATE_BRIEF = ALWAYS_DETAILED_SEC = YES INLINE_INHERITED_MEMB = YES FULL_PATH_NAMES = YES -STRIP_FROM_PATH = @top_builddir@ \ - @top_srcdir@ +STRIP_FROM_PATH = @top_builddir@ @top_srcdir@ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = YES @@ -35,7 +34,7 @@ SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- -EXTRACT_ALL = YES +EXTRACT_ALL = NO EXTRACT_PRIVATE = NO EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES @@ -47,7 +46,7 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = YES CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES +SHOW_INCLUDE_FILES = NO INLINE_INFO = YES SORT_MEMBER_DOCS = NO SORT_BRIEF_DOCS = NO @@ -58,8 +57,8 @@ GENERATE_BUGLIST = NO GENERATE_DEPRECATEDLIST= NO ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 25 -SHOW_USED_FILES = YES -SHOW_DIRECTORIES = YES +SHOW_USED_FILES = NO +SHOW_DIRECTORIES = NO FILE_VERSION_FILTER = #--------------------------------------------------------------------------- @@ -84,17 +83,21 @@ INPUT = \ @top_srcdir@/src/LifeCycleCORBA \ @top_srcdir@/src/NamingService \ @top_srcdir@/src/Notification \ + @top_srcdir@/src/SALOMEDS/SALOME_DriverPy.py \ + @top_srcdir@/src/KERNEL_PY/salome.py \ + @top_srcdir@/src/KERNEL_PY/salome_iapp.py \ @top_srcdir@/src/Utils \ @top_srcdir@/src/DSC -FILE_PATTERNS = *.dox *.idl *.hxx *.cxx python_extension_must_be_here + +FILE_PATTERNS = *.dox *.idl *.hxx *.cxx *.py RECURSIVE = YES -EXCLUDE = +EXCLUDE = @top_srcdir@/doc/salome/batch.dox EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = -EXAMPLE_PATH = +EXAMPLE_PATH = @top_srcdir@/doc/salome/examples EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO -IMAGE_PATH = sources/ +IMAGE_PATH = @srcdir@/images INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO @@ -102,11 +105,11 @@ FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- -SOURCE_BROWSER = YES -INLINE_SOURCES = YES +SOURCE_BROWSER = NO +INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO USE_HTAGS = NO VERBATIM_HEADERS = YES @@ -121,10 +124,10 @@ IGNORE_PREFIX = # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES -HTML_OUTPUT = KERNEL +HTML_OUTPUT = . HTML_FILE_EXTENSION = .html -HTML_HEADER = sources/myheader.html -HTML_FOOTER = sources/footer.html +HTML_HEADER = @srcdir@/static/header.html +HTML_FOOTER = @srcdir@/static/footer.html HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO @@ -219,7 +222,7 @@ PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- -CLASS_DIAGRAMS = NO +CLASS_DIAGRAMS = YES HIDE_UNDOC_RELATIONS = NO HAVE_DOT = YES CLASS_GRAPH = YES @@ -230,8 +233,8 @@ TEMPLATE_RELATIONS = YES INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = NO CALL_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES +GRAPHICAL_HIERARCHY = NO +DIRECTORY_GRAPH = NO DOT_IMAGE_FORMAT = jpg DOT_PATH = DOTFILE_DIRS = diff --git a/doc/salome/gui/images/icon_about.png b/doc/salome/gui/images/icon_about.png new file mode 100755 index 0000000000000000000000000000000000000000..bbbc7a931919d52bf27c6f563daefb1ad2349237 GIT binary patch literal 206458 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 literal 0 HcmV?d00001 diff --git a/doc/salome/tui/KERNEL/sources/footer.html b/doc/salome/gui/static/footer.html similarity index 100% rename from doc/salome/tui/KERNEL/sources/footer.html rename to doc/salome/gui/static/footer.html diff --git a/doc/salome/tui/KERNEL/sources/myheader.html b/doc/salome/gui/static/header.html similarity index 100% rename from doc/salome/tui/KERNEL/sources/myheader.html rename to doc/salome/gui/static/header.html diff --git a/doc/salome/install.dox b/doc/salome/install.dox index 8090ff92f..f77b0a2e0 100644 --- a/doc/salome/install.dox +++ b/doc/salome/install.dox @@ -1,23 +1,20 @@ /*! \page INSTALL Installation instructions -NOT UP TO DATE %SALOME 4 -WORK in PROGRESS, INCOMPLETE DOCUMENT +NOT UP TO DATE AND INCOMPLETE DOCUMENT BUT CAN BE HELPFUL -You'll find here generic instructions for installing the SALOME2 platform. +You'll find here generic instructions for installing the SALOME platform. \section Summary -

    -
  1. \ref S1_install
  2. -
  3. \ref S2_install
  4. -
  5. \ref S3_install
  6. -
  7. \ref S4_install
  8. -
  9. \ref S5_install
  10. -
  11. \ref S6_install
  12. -
  13. \ref S7_install
  14. -
  15. \ref S8_install
  16. -
+-# \ref S1_install +-# \ref S2_install +-# \ref S3_install +-# \ref S4_install +-# \ref S5_install +-# \ref S6_install +-# \ref S7_install +-# \ref S8_install \section S1_install Quick Overview @@ -25,16 +22,16 @@ 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 +- third party softwares used in %SALOME building or runtime process (python, OCC, VTK, ...) -Further details can be found in sections [2] and [3]. +Further details can be found in sections \ref S2_install and \ref S3_install. 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"). +(cf. \ref S4_install). -The next step is to install the KERNEL (cf. [5] "Installing KERNEL"): +The next step is to install the KERNEL (cf. \ref S5_install): \code $ mkdir @@ -48,10 +45,10 @@ $ make install \endcode Then, the %SALOME components GEOM, MED, VISU, ... can be installed -with a similar procedure (cf. [6]). +with a similar procedure (cf. \ref S6_install). -Eventually, the platform ccodean be run by executing the shell script -runSalome (cf. [7]). Here, somme additionnal variables have to be set +Eventually, the platform can be run by executing the shell script +%runSalome (cf. \ref S7_install). Here, somme additionnal variables have to be set to describe the %SALOME runtime configuration (_ROOT_DIR, OMNIORB_CONFIG) @@ -122,7 +119,7 @@ Additionnal software may be installed for optional features: In the following, we assume that all the third-party softwares are installed in the same root directory, named /prerequis. -Then, your file system should probably look like:: +Then, your file system should probably look like: \code /prerequis/Python-2.2.2 @@ -133,7 +130,7 @@ Then, your file system should probably look like:: \section S4_install Preparing the shell environment -Some variables have to be set to get acces to third-party software +Some variables have to be set to get access to third-party software components (include files, executable, library, ...) during building process and runtime. @@ -157,7 +154,7 @@ $ source prerequis.sh We use here the notation to specify the source directory of the KERNEL component. The shell environment is supposed to have -been set (cf. 4). +been set (cf. \ref S4_install). Installing the KERNEL from a source package needs three directories: @@ -193,11 +190,11 @@ $ ./build_configure \endcode If it doesn't work, check your system automake tools as specified in - section [2]. + section \ref S2_install. STEP 3: configure the building process - go to the build directory and execute the configuration process:: + go to the build directory and execute the configuration process: \code $ cd @@ -207,7 +204,7 @@ $ /configure --prefix= Note that 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:: + third-party softwares detection. You should have a status like: \code --------------------------------------------- @@ -250,7 +247,7 @@ installed (optional for most usages). STEP 4 : Building the binary files - Execute make in the directory:: + Execute make in the directory: \code $ make @@ -259,7 +256,7 @@ $ make STEP 5: Installing binary files, scripts and documentation - Execute install target in the directory:: + Execute install target in the directory: \code $ make install @@ -267,7 +264,7 @@ $ make install \section S6_install Installing the SALOME components -TInstalling a component is done by following the same +Installing a component is done by following the same instructions as given for the KERNEL, replacing KERNEL by (build_configure, configure, make, make install). @@ -277,7 +274,7 @@ You just have to be aware of the dependencies between components: - GEOM depends on KERNEL - SMESH depends on KERNEL, MED, GEOM - VISU depends on KERNEL, MED -- SUPERV depends on KERNEL +- YACS depends on KERNEL For example, installing the component SMESH needs the previous installation of the KERNEL component, and then the GEOM and MED components. @@ -294,23 +291,21 @@ building process of the SMESH component (STEP 3). \section S7_install Runtime -See SALOME_Application to define your own configuration of %SALOME and run it +See \ref SALOME_Application to define your own configuration of %SALOME and run it on one or several computers. This is the recommended way of configuration. 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: - -\code +- set the shell environment to get access to third-party softwares: + \code $ source prerequis.sh -\endcode + \endcode - define the %SALOME configuration by setting the whole set of variables _ROOT_DIR. Here, you just have to set the - kernel and the components you need:: - + kernel and the components you need: \code $ export KERNEL_ROOT_DIR= $ export MED_ROOT_DIR= @@ -320,14 +315,12 @@ $ ... - 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:: - + before running. We suggest: \code $ export OMNIORB_CONFIG=$HOME/.omniORB.cfg \endcode -- run the %SALOME platform by executing the script runSalome: - +- run the %SALOME platform by executing the script %runSalome: \code $KERNEL_ROOT_DIR/bin/salome/runSalome \endcode @@ -336,43 +329,39 @@ $KERNEL_ROOT_DIR/bin/salome/runSalome For convenience or customization, we suggest the following organisation: -- chose and create a root directory for the %SALOME platform, say +- choose and create a root directory for the %SALOME platform, say . - 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 +- make personnal copies of the files prerequis.sh and %runSalome in : - \code $ cp /prerequis.sh /. $ cp /bin/salome/runSalome /. \endcode - Edit the file prerequis.sh and adjust it to your own configuration. -- define the SALOME2 configuration - +- define the SALOME2 configuration\n This step consists in setting the KERNEL_ROOT_DIR, the whole set of variables _ROOT_DIR you need, and the OMNIORB_CONFIG variable. - + \n We suggest to create a shell file envSalome.sh containing those settings. Then the configuration consists in loading envSalome.sh in the runtime shell: - -\code + \code $ source envSalome.sh -\endcode + \endcode - When installed with this file organisation, running %SALOME is done - with the following shell commands:: - + with the following shell commands: \code $ source /prerequis.sh $ source /envSalome.sh $ ./runSalome \endcode + */ diff --git a/doc/salome/kernel_resources.dox b/doc/salome/kernel_resources.dox index 6401e942b..1bcbead6f 100644 --- a/doc/salome/kernel_resources.dox +++ b/doc/salome/kernel_resources.dox @@ -1,12 +1,9 @@ /*! -\page kernel_resources SALOME Kernel resources for developer +\page kernel_resources Salome Kernel resources for developer -WORK in PROGRESS, INCOMPLETE DOCUMENT -\section S1_kernel_res Abstract - This document describes the development environment for C++ and Python. Makefiles generation and usage are introduced in another document: "using the %SALOME @@ -28,9 +25,7 @@ variables values and if necessary, to stop the execution at debug time, in order to validate all parts of code. -
    -
  1. -Two modes: debug and release +\subsection subsection21 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 @@ -49,9 +44,8 @@ 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. -
  2. -
  3. -C++ Macros for trace and debug + +\subsection subsection22 C++ Macros for trace and debug %SALOME provides C++ macros for trace and debug. These macros are in: @@ -62,11 +56,11 @@ 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_`` +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 +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 @@ -81,33 +75,23 @@ 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. -
      -
    1. -Macros defined in debug and release modes -\n -INFOS_COMPILATION +\subsection subsection23 Macros defined in debug and release modes +- INFOS_COMPILATION\n 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_. - + mode : _DEBUG_ and _RELEASE_.\n Example: - \code #include "utilities.h" int main(int argc , char **argv) @@ -115,17 +99,13 @@ int main(int argc , char **argv) INFOS_COMPILATION; ... } -INFOS(str) \endcode -\n -INFOS +- INFOS\n 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. - + which has been passed in argument by the user.\n Example: - \code #include "utilities.h" int main(int argc , char **argv) @@ -135,42 +115,33 @@ int main(int argc , char **argv) return 0; } \endcode - Displays: - \code main.cxx [5] : NORMAL END OF THE PROCESS \endcode -\n -INTERRUPTION(str) +- INTERRUPTION(str)\n 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) - +- IMMEDIATE_ABORT(str)\n 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. -
    2. -
    3. -Macros defined only in debug mode -\n -MESSAGE(str) +\subsection subsection24 Macros defined only in debug mode +- MESSAGE(str)\n 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. - + compiling mode, this macro is blank.\n Example: - \code #include "utilities.h" #include @@ -189,25 +160,19 @@ int main(int argc , char **argv) } \endcode - Displays: - \code - Trace main.cxx [8] : Salome - Trace main.cxx [12] : Aster and CASTEM \endcode -\n -BEGIN_OF(func_name) - +- BEGIN_OF(func_name)\n 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. - + macro is blank.\n Example: - \code #include "utilities.h" int main(int argc , char **argv) @@ -216,23 +181,18 @@ int main(int argc , char **argv) return 0; } \endcode - Displays: - \code - Trace main.cxx [3] : Begin of a.out \endcode -\n -END_OF(func_name) +- END_OF(func_name)\n 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. - + macro is blank.\n Example: - \code #include "utilities.h" int main(int argc , char **argv) @@ -241,22 +201,17 @@ int main(int argc , char **argv) return 0; } \endcode - Displays: - \code - Trace main.cxx [4] : Normal end of a.out \endcode -\n -SCRUTE(var) +- SCRUTE(var)\n 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. - + compiling mode, this macro is blank.\n Example: - \code #include "utilities.h" int main(int argc , char **argv) @@ -266,25 +221,20 @@ int main(int argc , char **argv) return 0; } \endcode - Displays: - \code - Trace main.cxx [5] : i=999 \endcode -\n -ASSERT(condition) +- ASSERT(condition)\n 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. - + defined, this macro is ignored.\n Example: - \code #include "utilities.h" ... @@ -298,20 +248,11 @@ ASSERT(k<10); cout << table[k]; \endcode -
    4. -
    -
  4. -
- \section S3_kernel_res Exceptions -
    -
  1. -C++ exceptions: class SALOME_Exception +\subsection subsection31 C++ exceptions: class SALOME_Exception -
      -
    1. -definition +\subsubsection subsubsection311 Definition The class SALOME_Exception provides a generic method to send a message, with optional source file name and line @@ -324,9 +265,8 @@ log file. The class SALOME_Exception inherits its behavior from the STL class exception. -
    2. -
    3. -usage + +\subsubsection subsubsection312 Usage The header %SALOME/src/utils/utils_SALOME_Exception.hxx must be included in the C++ source, when raised or trapped: @@ -356,7 +296,7 @@ throw SALOME_Exception(LOCALIZED("my pertinent message")); \endcode where LOCALIZED is a macro provided with -``utils_SALOME_Exception.hxx`` which gives file name and +utils_SALOME_Exception.hxx which gives file name and line number. The exception is handled like this: @@ -374,15 +314,10 @@ catch (const SALOME_Exception &ex) The what() method overrides the one defined in the STL exception class. -
    4. -
    -
  2. -
  3. -CORBA exceptions -
      -
    1. -definition +\subsection subsection32 CORBA exceptions + +\subsubsection subsubsection321 Definition The idl SALOME_Exception provides a generic CORBA exception for %SALOME, with an attribute that gives an @@ -407,16 +342,12 @@ CORBA system and user exceptions already defined in the packages used within %SALOME, such as OmniORB exceptions, must be handled separately. -
    2. -
    3. -usage -
        -
      1. +\subsubsection subsubsection322 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``: + header KERNEL_SRC/src/Utils/Utils_CorbaException.hxx: \code #include "Utils_CorbaException.hxx" @@ -431,17 +362,13 @@ if (myStudyName.size() == 0) SALOME::BAD_PARAM); \endcode -
      2. -
      3. -CORBA Client, GUI Qt C++ - - NO MORE AVAILABLE in %SALOME 3.x +CORBA Client, GUI Qt C++ (NO MORE AVAILABLE in %SALOME 3.x and later) 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`` + KERNEL_SRC/src/SALOMEGUI/SALOMEGUI_QtCatchCorbaException.hxx \code #include "SALOMEGUI_QtCatchCorbaException.hxx" @@ -461,8 +388,6 @@ catch (const SALOME::SALOME_Exception & S_ex) } \endcode -
      4. -
      5. CORBA Client, C++, without GUI Nothing specific has been provided to the developer @@ -470,20 +395,10 @@ catch (const SALOME::SALOME_Exception & S_ex) SALOMEGUI_QtCatchCorbaException.hxx to see how to get the information given by the exception %object. -
      6. -
      -
    4. -
    -
- \section S4_kernel_res Miscellaneous tools -
    -
  1. -Singleton -
      -
    1. -Definition +\subsection subsection41 Singleton +\subsubsection subsubsection411 Definition %A singleton is an application data which is created and deleted only once at the end of the application @@ -491,14 +406,12 @@ 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 +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. -
    2. -
    3. -Usage +\subsubsection subsubsection412 Usage To create a single instance of a POINT %object: @@ -524,36 +437,25 @@ POINT *p2=SINGLETON_::Instance() ; assert(p1==p2) \endcode -
    4. -
    5. -Design description +\subsubsection subsubsection413 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_::Instance()`` which + class method SINGLETON_::Instance() which returns a pointer to the single %object ; - -- to create an %object, ``SINGLETON_::Instance()`` +- to create an %object, SINGLETON_::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 + 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_(). -- the ``Nettoyage()`` C function using ``atexit()`` C function - is embedded in a static single %object ``ATEXIT_()``. - -
    6. -
    -
  2. -
*/ diff --git a/doc/salome/kernel_services.dox b/doc/salome/kernel_services.dox index d363c84cf..241a82ff0 100644 --- a/doc/salome/kernel_services.dox +++ b/doc/salome/kernel_services.dox @@ -1,8 +1,6 @@ /*! \page KERNEL_Services KERNEL Services for end user (Python interface) -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, @@ -16,14 +14,12 @@ script). \section S1_kernel_ser General purpose services -
    -
  1. -%SALOME services access from a Python shell +\subsection subsection11 SALOME services access from a Python shell -See \ref SALOME_Application for detailed instructions to launch a Python -interpreter with full acces to the %SALOME environment and services. +See \ref SALOME_Application for detailed instructions on how to launch a Python +interpreter with full access to the %SALOME environment and services. -You can use the embedded Python interpreter in Grahic User Interface, or an +You can use the embedded Python interpreter in Graphical User Interface, or an external interpreter, with: \code @@ -42,11 +38,9 @@ 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. -
  2. -
  3. -Container and component instanciation +\subsection subsection12 Container and component instanciation -See LifeCycleCORBA for the C++ interface (Python interface obtained with SWIG +See SALOME_LifeCycleCORBA for the C++ interface (Python interface obtained with SWIG is very similar). In the following example, a test component provided in KERNEL is launched @@ -83,7 +77,7 @@ without the _narrow() instruction: 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 +computer. Note that in Utils_Identity, 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: @@ -143,9 +137,7 @@ myStudyManager.object SalomeAppEngine.object \endcode -
  4. -
  5. -File transfer service +\subsection subsection13 File transfer service See SALOME_FileTransferCORBA for the C++ interface (Python interface obtained with SWIG is very similar). @@ -166,71 +158,165 @@ aFileTransfer=LifeCycleCORBA.SALOME_FileTransferCORBA('cli76cc',remotefile) localFile=aFileTransfer.getLocalFile() \endcode -
  6. -
  7. -CORBA Naming service access +\subsection subsection14 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 +SALOME_NamingServicePy::SALOME_NamingServicePy_i is not yet derived from the C++ interface and offers only the most useful functions. -
  8. -
  9. -Batch services - -See \ref batch_page documentation (in french only). +\subsection subsection5 Batch services -
  10. -
+See Batch documentation (in french only). \section S2_kernel_ser All IDL Interfaces -
    -
  1. -Containers and component life cycle, File transfer service - -- Engines : engines CORBA module. -- Engines::Component : generic component interface. All %SALOME components inherit this interface. -- Engines::Container : host for C++ and Python components components instances -- Engines::fileTransfer : agent for file transfer created by a container copy a local file to a distent client -- Engines::fileRef : reference to a file, used by a container for file transfers -- Engines::ContainerManager : unique instance, in charge of container creation on remote computers -- Engines::MPIContainer : an exemple of parallel implementation for containers and components -- Engines::MPIObject - -
  2. -
  3. -Study management - -- SALOMEDS : SALOMEDS CORBA module -- SALOMEDS.idl -- SALOMEDS_Attributes.idl - -
  4. -
  5. -High speed transfer, object life cycle, exceptions, GUI interface... - -- SALOME : %SALOME CORBA module -- SALOME_Comm.idl -- SALOME_GenericObj.idl -- SALOME_Exception -- SALOME_Session.idl - -
  6. -
  7. -Miscelleanous - -- SALOME_ModuleCatalog -- SALOME_RessourcesCatalog -- SALOME_Registry.idl -- Logger.idl - -Other idl for test purposes -\n -- nstest.idl -- SALOME_TestComponent.idl -- SALOME_TestModuleCatalog.idl -- SALOME_TestMPIComponent.idl -- TestNotif.idl +-# Containers and component life cycle, File transfer service + - Engines : engines CORBA module. + - Engines::Component : generic component interface. All %SALOME components inherit this interface. + - Engines::Container : host for C++ and Python components components instances + - Engines::fileTransfer : agent for file transfer created by a container copy a local file to a distent client + - Engines::fileRef : reference to a file, used by a container for file transfers + - Engines::ContainerManager : unique instance, in charge of container creation on remote computers + - Engines::MPIContainer : a parallel implementation for containers and components + - Engines::MPIObject + . +-# Study management + - SALOMEDS : SALOMEDS CORBA module + - SALOMEDS.idl : \copybrief SALOMEDS.idl + - SALOMEDS_Attributes.idl : \copybrief SALOMEDS_Attributes.idl + . +-# High speed transfer, object life cycle, exceptions, GUI interface... + - SALOME : \copybrief SALOME + - SALOME_Comm.idl : \copybrief SALOME_Comm.idl + - SALOME_GenericObj.idl : \copybrief SALOME_GenericObj.idl + - SALOME_Exception.idl : \copybrief SALOME_Exception.idl + - SALOME_Session.idl : \copybrief SALOME_Session.idl + . +-# Miscelleanous + - SALOME_ModuleCatalog : \copybrief SALOME_ModuleCatalog + - SALOME_RessourcesCatalog : \copybrief SALOME_RessourcesCatalog + - Registry : \copybrief Registry + - SALOME_Logger : \copybrief SALOME_Logger + . +-# Other idl for test purposes + - NSTEST : for naming service test + - SALOME_TestComponent.idl : for Component test + - SALOME_TestModuleCatalog : for SALOME_ModuleCatalog test + - SALOME_TestMPIComponent.idl : \copybrief SALOME_TestMPIComponent.idl + - TestNotif.idl : \copybrief TestNotif.idl + . +-# Some useful command scripts + - waitNS.py : \copybrief waitNS.py + - waitContainers.py : \copybrief waitContainers.py + - showNS.py : \copybrief showNS.py + - shutdownSalome.py : \copybrief shutdownSalome.py + - killSalome.py : \copybrief killSalome.py + - killSalomeWithPort.py : \copybrief killSalomeWithPort.py + - appli_gen.py : \copybrief appli_gen.py + . */ + +/** \example example1 +AttributeReal interface (creations/saving/restoring) +\n +Methods : FindOrCreateAttribute, Value, SaveAs, SetValue, FindComponent, FindAttribute, Open + */ +/** \example example3 +AttributeSequenceOfReal interface(creations/saving/restoring)\n +AttributeSequenceOfReal : ChangeValue, Add, Value, Remove, Length\n +SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open + */ +/** \example example16 +Methods : GetAvailableUndos, ChangeValue, FindOrCreateAttribute, SaveAs, GetAvailableRedos, Undo, FindComponent, Redo, FindAttribute, Open, CommitCommand, NewCommand + */ +/** \example example17 +SALOMEDS methods : RemoveAttribute, FindOrCreateAttribute, NewStudy, GetAllAttributes, NewCommand, CommitCommand, AbortCommand, NewComponent + */ +/** \example example18 +AttributeTreeNode interface(creations/saving/restoring)\n +SALOMEDS methods : FindOrCreateAttribute, NewObject\n +Attribute methods : HasFirst, HasFather, SetPrevious, Next, InsertAfter, GetFather, HasNext, SetValue, Append, NewStudy, Label, IsRoot, Prepend, SetFather, Depth, HasPrevious + */ +/** \example example19 + SALOMEDS methods : FindOrCreateAttribute, Save, SaveAs, Close, Open, FindComponent, FindAttribute, FindObject, LoadWith +\n + Attribute methods : Value, SetValue + */ +/** \example example20 +SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, NewCommand, GetProperties, Open, CommitCommand, NewBuilder\n +Attribute methods : SetLocked, IsLocked, GetCreationMode, SetCreationDate, IsModified, GetUserName, Value, SetUserName, SetValue, GetCreationDate + */ +/** \example example23 +Methods: + */ +/** \example example8 +AttributeDrawable interface(creations/saving/restoring)\n +SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open\n +Attribute methods : SetDrawable, IsDrawable + */ +/** \example example9 +AttributeSelectable interface(creations/saving/restoring)\n +SALOMEDS methods: FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open\n +Attribute methods: SetSelectable, IsSelectable + */ +/** \example example10 +AttributeExpandable interface(creations/saving/restoring)\n +SALOMEDS methods : SaveAs FindComponent FindAttribute Open\n +Attribute methods : SetExpandable IsExpandable + */ +/** \example example11 +Test AttributeOpened (creations/saving/restoring)\n +SALOMEDS methods : FindOrCreateAttribute SaveAs, FindComponent, FindAttribute, Open\n +Attribute methods : SetOpened, IsOpened + */ +/** \example example12 +AttributeTextColor interface (creations/saving/restoring)\n +SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open\n +Attribute methods : SetTextColor TextColor + */ +/** \example example13 +Test AttributeTextHighlightColor interface(creations/saving/restoring)\n +SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open\n +Attribute methods : SetTextHighlightColor TextHighlightColor + */ +/** \example example14 +AttributePixMap interface (creations/saving/restoring)\n +SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open\n +Attribute methods : SetPixMap, GetPixMap + */ + +/** \example example21 +SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open\n +Attribute methods: GetValue, GetNbColumns, AddColumn, SetRowTitles, PutValue, GetColumn, GetColumnTitles, GetTitle, SetRow, GetRowTitles, SetColumnTitles, SetColumn, GetRow, GetNbRows, SetColumnTitle, AddRow, SetTitle, SetRowTitle + */ +/** \example example15 +AttributeLocalID interface(creations/saving/restoring)\n +SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open\n +Attribute methods : Value, SetValue +*/ +/** \example example22 +SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open\n +Attribute methods : GetValue, GetNbColumns, AddColumn, SetRowTitles, PutValue, GetColumn, GetColumnTitles, GetTitle, SetRow, GetRowTitles, SetColumnTitles, SetColumn, GetRow, GetNbRows, SetColumnTitle, AddRow, SetTitle, SetRowTitle +*/ +/** \example example4 +AttributeSequenceOfInteger interface(creations/saving/restoring)\n +SALOMEDS methods : FindOrCreateAttribute FindComponent FindAttribute Open Add SaveAs +AttributeSequenceOfInteger methods : Value, Remove, Length +*/ +/** \example example5 +AttributeName interface(creations/saving/restoring)\n +SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent FindAttribute Open\n +Attribute methods : SetValue, Value +*/ +/** \example example6 +AttributeComment interface(creations/saving/restoring)\n +SALOMEDS methods : FindOrCreateAttribute, SaveAs FindComponent FindAttribute Open\n +Attribute methods : Value, SetValue +*/ +/** \example example7 +AttributePersistentRef interface(creations/saving/restoring)\n +SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent FindAttribute Open\n +Attribute methods : SetValue, Value +*/ + diff --git a/doc/salome/main.dox b/doc/salome/main.dox index 7515c353c..03c610c0e 100644 --- a/doc/salome/main.dox +++ b/doc/salome/main.dox @@ -1,82 +1,60 @@ /*! \mainpage SALOME KERNEL Reference Documentation - \image html kernel_about_4.png - - \section S1_main Introduction + \image html icon_about.png Welcome to the %SALOME KERNEL documentation ! Following your kind of usage of %SALOME, you will find some specific introductory documentation, listed below. - \section S2_main End user +\section S2_main End user -
      -
    1. - How to configure a %SALOME application - \n The end user may have to configure his own %SALOME application by selection of a +-# How to configure a %SALOME application\n + 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 \subpage SALOME_Application to define your own configuration of %SALOME and run it on one or several computers. This is the recommended way of configuration. -
    2. -
    3. - How to launch %SALOME in a %SALOME application - \n See \ref SALOME_Application. -
    4. -
    5. - How to use KERNEL services in Python scripts - \n The %SALOME KERNEL offers a list of services available in Python. See \subpage KERNEL_Services. -
    6. -
    +-# How to launch %SALOME in a %SALOME application\n + See \ref SALOME_Application. +-# How to use KERNEL services in Python scripts\n + The %SALOME KERNEL offers a list of services available in Python. See \subpage KERNEL_Services. - \section S3_main Application Integrator +\section S3_main 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. -
      -
    1. - How to install %SALOME - \n See \subpage INSTALL for general information on required configuration and +-# How to install %SALOME\n + See \subpage INSTALL for general information on required configuration and prerequisites, compilation procedure, setting environment principles. -
    2. -
    3. - How to configure a %SALOME application - \n See \ref SALOME_Application to define your own configuration of %SALOME and run it +-# How to configure a %SALOME application\n + See \ref SALOME_Application to define your own configuration of %SALOME and run it on one or several computers. This is the recommended way of configuration. -
    4. -
    - \section S4_main Module maintainer +\section S4_main 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. -
      -
    1. - Source code structuration and Unit Tests - \n See \subpage UnitTests for general information on code directories structure, +-# Source code structuration and Unit Tests\n + See \subpage UnitTests for general information on code directories structure, unit tests associated to the different kind of classes, and how to run the unit tests. -
    2. -
    3. - Some development utilities - \n See \subpage kernel_resources for information on basic utilities for C++ and Python +-# Some development utilities \n + See \subpage kernel_resources for information on basic utilities for C++ and Python development, like trace and debug, exceptions, singleton. -
    4. -
    - \section S5_main SALOME programming model +\section S5_main SALOME programming model You will find in the next pages informations about specific points of %SALOME Kernel : - \subpage dsc_page : DSC documentation page. - \subpage salome_file_page : Salome_file documentation page. - - \subpage batch_page : BATCH documentation page. + - Batch documentation */ diff --git a/doc/salome/salome_application.dox b/doc/salome/salome_application.dox index d970338a3..31961aa32 100644 --- a/doc/salome/salome_application.dox +++ b/doc/salome/salome_application.dox @@ -1,17 +1,17 @@ /*! - \page SALOME_Application SALOME Application Concept + \page SALOME_Application Salome Application Concept - Configuration for one or more computers - - - **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. \section S1_sal_appl General principles -%A %SALOME application is defined by a set of modules (GEOM, SMESH, ASTER...). +%A %SALOME application is defined by a set of modules (GEOM, SMESH, ASTER...). %A %SALOME application +lives in an application directory. +%A %SALOME application is a virtual installation of %SALOME in the application directory +(bin, lib, doc, share...), with, for each file (executable, script, data, +library, resources...), symbolic links to the actual files. %A %SALOME User can define several %SALOME Applications. These applications are runnable from the same user account. These applications may share the same @@ -42,126 +42,76 @@ computer. \section S2_sal_appl Application Directory -There are two ways for creation of an application directory, the recommended way is -the second, easier to configure. - -
      -
    1. - 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. The path given, ${APPLI}, is -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 - -
    2. -
    3. - Second and easiest way - one single virtual install directory - -The user must create a %SALOME application configuration file by modifying a +First, 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:: +The following command: \code python /bin/salome/appli_gen.py --prefix= --config= \endcode -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. -Note: it is recommended to set the environment for %SALOME prerequisites -before invoking the above command, in order to use the same python as SALOME, -otherwise installation may be wrong +creates a %SALOME application in the application directory given by the prefix option (local directory +by default) with the configuration file given by the config option (config_appli.xml by default). Providing 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). -
    4. -
    \section S3_sal_appl General rules -Directory ${APPLI} must be created on each computer of the application. +The application directory 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 +The application 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. +scripts are in the env.d subdirectory. -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 +The script envd sources \b all the files (*.sh) in subdirectory env.d +in alphanumeric order (after edition, think to remove backup files). The envd script is used by run scripts.
    1. 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. +env.d scripts are built automatically. - SALOMEAppConfig is also defined by: +You can add your own environment scripts in env.d subdirectory, they will be sourced as +the generated ones provided they have a .sh extension. -\code -export SALOMEAppConfig=${HOME}/${APPLI} -\endcode - - 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.
    2. User run scripts The %SALOME user can use 4 scripts: -- runAppli +- runAppli\n Launches a %SALOME Session (similar to ${KERNEL_ROOT_DIR}/bin/salome/runSalome but with a different name to avoid confusions). See parameters below. -- runSession +- runSession\n 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 +- runConsole\n Gives a python console connected to the current %SALOME Session. It is also possible to use runSession, then python. -- runTests +- runTests\n Similar to runSession, used for unit testing, but runSession tries to use an already existing naming service definition from a running session (hostname and port number), and runTests defines a new configuration for naming service @@ -170,12 +120,12 @@ The %SALOME user can use 4 scripts:
    3. %SALOME internal run scripts -- envd +- envd\n Sets %SALOME application environment, envd is sourced by other scripts. For remote calls, %SALOME uses one script. -- runRemote.sh +- runRemote.sh\n This script is mainly used to launch containers. The first 3 arguments define the hostname and port userd for naming service, plus a working directory, the remaining arguments define the command to execute. @@ -183,20 +133,19 @@ For remote calls, %SALOME uses one script.
    4. Other configuration files -- SALOMEApp.xml +- SALOMEApp.xml\n 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 +- CatalogRessources.xml\n + This file describes all the computers the application can use. The given + example is minimal and suppose application directory is the same relative path to ${HOME}, on all the computers. %A different directory can be set on a particular computer with a line: - -\code + \code appliPath="my/specific/path/on/this/computer" -\endcode + \endcode
    @@ -207,7 +156,7 @@ appliPath="my/specific/path/on/this/computer"
  8. Launch a %SALOME session with a GUI interface -Launch is done with a command like:: +Launch is done with a command like: \code ./runAppli --logger @@ -216,7 +165,7 @@ Launch is done with a command like:: 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:: +There are a lot of options, a complete list is given by: \code ./runAppli --help @@ -237,20 +186,20 @@ 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:: +with arguments, you can kill all the servers of your session with: \code >>> killLocalPort() \endcode -or the servers of all the sessions with:: +or the servers of all the sessions with: \code >>> killAllPorts() \endcode 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:: +kill all the %SALOME servers of all the sessions on a given computer: \code ./runSession killSalome.py @@ -263,7 +212,7 @@ 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:: +the naming service port number: \code ./runSession killSalomeWithPort 2810 @@ -273,7 +222,7 @@ 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:: +the last launched session with: \code ./runSession NSparam.py @@ -295,7 +244,7 @@ import GEOM_usinggeom raw_input("Press a key and the servers will be killed ...") \endcode -This script is run in a non interactive way with:: +This script is run in a non interactive way with: \code ./runSession python test_session_geom.py @@ -310,23 +259,23 @@ All the process are automatically killed when Python is closed 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:: +first, launch a %SALOME session with gui, then, on another terminal: \code ./runSession python \endcode -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 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): \code import salome salome.salome_init() \endcode -An example of script given with SMESH:: +An example of script given with SMESH: \code import ex01_cube2build @@ -336,8 +285,8 @@ 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... +by the external script). AVOID modifications with GUI when a Python script +is running. Not all the modules are protected against concurrent actions...
  9. Different uses of the runSession shell interpreter @@ -349,13 +298,13 @@ 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:: +references, hostname and port: \code [NS=cli76cc:2811]prascle@cli76cc:~/SALOME2/Run/Virtual$ \endcode -If there is no running session, prompt looks like:: +If there is no running session, prompt looks like: \code [NS=:]prascle@cli76cc:~/SALOME2/Run/Virtual$ @@ -364,7 +313,7 @@ If there is no running session, prompt looks like:: 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:: +launch a %SALOME session with gui, then, on another terminal: \code ./runSession ddd diff --git a/doc/salome/salome_file.dox b/doc/salome/salome_file.dox index dffb378b9..2f29ea7d4 100644 --- a/doc/salome/salome_file.dox +++ b/doc/salome/salome_file.dox @@ -9,7 +9,7 @@ SALOME_FileTransfer. It extends it to enable a higher model for managing files i \section S1_Salome_file Principles Salome_file is a CORBA %object. It's role is to managed many system files. When a Salome_file -is created, no files are managed. Then, files are added using Salome_file interface. %A file is represented +is created, no files are managed. Then, files are added using Salome_file_i interface. %A file is represented by a name and a path. There is two different cases when a file is added : @@ -115,9 +115,4 @@ To avoid these cases, Salome_file API provides advanced methods : }; \endcode -\section S3_Salome_file Using Salome_file into %SALOME services - -Currently you can't use Salome_file into YACS schema. In the next version of %SALOME, -files ports will be available to connect output files to input files. - */ diff --git a/doc/salome/tui/KERNEL/HTML/Logger.html b/doc/salome/tui/KERNEL/HTML/Logger.html deleted file mode 100644 index 1a73901c0..000000000 --- a/doc/salome/tui/KERNEL/HTML/Logger.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - -
    interface Logger
    IDL file
    Python
    void putMessage ( in string message )
    putMessage ( message )
    void ping ( )
    ping ( )

    -
    diff --git a/doc/salome/tui/KERNEL/HTML/SALOMEDS.html b/doc/salome/tui/KERNEL/HTML/SALOMEDS.html deleted file mode 100644 index f9d2b559d..000000000 --- a/doc/salome/tui/KERNEL/HTML/SALOMEDS.html +++ /dev/null @@ -1,674 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface Study
    IDL file
    Python
    PersistentReference GetPersistentReference ( )
    return_value = GetPersistentReference ( )
    SalomeReference GetTransientReference ( )
    return_value = GetTransientReference ( )
    boolean IsEmpty ( )
    return_value = IsEmpty ( )
    SComponent FindComponent ( in string aComponentName )
    return_value = FindComponent ( aComponentName )
    SComponent FindComponentID ( in ID aComponentID )
    return_value = FindComponentID ( aComponentID )
    SObject FindObject ( in string anObjectName )
    return_value = FindObject ( anObjectName )
    SObject FindObjectID ( in ID aObjectID )
    return_value = FindObjectID ( aObjectID )
    SObject CreateObjectID ( in ID aObjectID )
    return_value = CreateObjectID ( aObjectID )
    SObject FindObjectIOR ( in ID aObjectIOR )
    return_value = FindObjectIOR ( aObjectIOR )
    ListOfSObject FindObjectByName ( in string anObjectName, in string aComponentName )
    return_value = FindObjectByName ( anObjectName, aComponentName )
    SObject FindObjectByPath ( in string thePath )
    return_value = FindObjectByPath ( thePath )
    string GetObjectPath ( in Object theObject )
    return_value = GetObjectPath ( theObject )
    void SetContext ( in string thePath )
    SetContext ( thePath )
    string GetContext ( )
    return_value = GetContext ( )
    ListOfStrings GetObjectNames ( in string theContext )
    return_value = GetObjectNames ( theContext )
    ListOfStrings GetDirectoryNames ( in string theContext )
    return_value = GetDirectoryNames ( theContext )
    ListOfStrings GetFileNames ( in string theContext )
    return_value = GetFileNames ( theContext )
    ListOfStrings GetComponentNames ( in string theContext )
    return_value = GetComponentNames ( theContext )
    ChildIterator NewChildIterator ( in SObject aSO )
    return_value = NewChildIterator ( aSO )
    SComponentIterator NewComponentIterator ( )
    return_value = NewComponentIterator ( )
    StudyBuilder NewBuilder ( )
    return_value = NewBuilder ( )
    void UpdateIORLabelMap ( in string anIOR, in string anEntry )
    UpdateIORLabelMap ( anIOR, anEntry )
    AttributeStudyProperties GetProperties ( )
    return_value = GetProperties ( )
    boolean IsModified ( )
    return_value = IsModified ( )
    ListOfSObject FindDependances ( in SObject anObject )
    return_value = FindDependances ( anObject )
    string GetLastModificationDate ( )
    return_value = GetLastModificationDate ( )
    ListOfDates GetModificationsDate ( )
    return_value = GetModificationsDate ( )
    string ConvertObjectToIOR ( in Object theObject )
    return_value = ConvertObjectToIOR ( theObject )
    Object ConvertIORToObject ( in string theIOR )
    return_value = ConvertIORToObject ( theIOR )
    UseCaseBuilder GetUseCaseBuilder ( )
    return_value = GetUseCaseBuilder ( )
    void Close ( )
    Close ( )
    void EnableUseCaseAutoFilling ( in boolean isEnabled )
    EnableUseCaseAutoFilling ( isEnabled )
    void AddPostponed ( in string theIOR )
    AddPostponed ( theIOR )
    void AddCreatedPostponed ( in string theIOR )
    AddCreatedPostponed ( theIOR )
    void RemovePostponed ( in long theUndoLimit )
    RemovePostponed ( theUndoLimit )
    void UndoPostponed ( in long theWay )
    UndoPostponed ( theWay )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface StudyBuilder
    IDL file
    Python
    SComponent NewComponent ( in string ComponentDataType )
    return_value = NewComponent ( ComponentDataType )
    void DefineComponentInstance ( in SComponent aComponent, in Object ComponentIOR )
    DefineComponentInstance ( aComponent, ComponentIOR )
    void RemoveComponent ( in SComponent aComponent )
    RemoveComponent ( aComponent )
    SObject NewObject ( in SObject theFatherObject )
    return_value = NewObject ( theFatherObject )
    SObject NewObjectToTag ( in SObject theFatherObject, in long atag )
    return_value = NewObjectToTag ( theFatherObject, atag )
    void RemoveObject ( in SObject anObject )
    RemoveObject ( anObject )
    void RemoveObjectWithChildren ( in SObject anObject )
    RemoveObjectWithChildren ( anObject )
    void LoadWith ( in SComponent sco, in Driver Engine )
    LoadWith ( sco, Engine )
    void Load ( in SObject sco )
    Load ( sco )
    GenericAttribute FindOrCreateAttribute ( in SObject anObject, in string aTypeOfAttribute )
    return_value = FindOrCreateAttribute ( anObject, aTypeOfAttribute )
    boolean FindAttribute ( in SObject anObject, out GenericAttribute anAttribute, in string aTypeOfAttribute )
    [ return_value, anAttribute ] = FindAttribute ( anObject, aTypeOfAttribute )
    void RemoveAttribute ( in SObject anObject, in string aTypeOfAttribute )
    RemoveAttribute ( anObject, aTypeOfAttribute )
    void Addreference ( in SObject anObject, in SObject theReferencedObject )
    Addreference ( anObject, theReferencedObject )
    void RemoveReference ( in SObject anObject )
    RemoveReference ( anObject )
    void AddDirectory ( in string theName )
    AddDirectory ( theName )
    void SetGUID ( in SObject anObject, in string theGUID )
    SetGUID ( anObject, theGUID )
    boolean IsGUID ( in SObject anObject, in string theGUID )
    return_value = IsGUID ( anObject, theGUID )
    void NewCommand ( )
    NewCommand ( )
    void CommitCommand ( )
    CommitCommand ( )
    boolean HasOpenCommand ( )
    return_value = HasOpenCommand ( )
    void AbortCommand ( )
    AbortCommand ( )
    void Undo ( )
    Undo ( )
    void Redo ( )
    Redo ( )
    boolean GetAvailableUndos ( )
    return_value = GetAvailableUndos ( )
    boolean GetAvailableRedos ( )
    return_value = GetAvailableRedos ( )
    Callback SetOnAddSObject ( in Callback theCallback )
    return_value = SetOnAddSObject ( theCallback )
    Callback SetOnRemoveSObject ( in Callback theCallback )
    return_value = SetOnRemoveSObject ( theCallback )
    void SetName ( in SObject theSO, in string theValue )
    SetName ( theSO, theValue )
    void SetComment ( in SObject theSO, in string theValue )
    SetComment ( theSO, theValue )
    void SetIOR ( in SObject theSO, in string theValue )
    SetIOR ( theSO, theValue )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface StudyManager
    IDL file
    Python
    void ping ( )
    ping ( )
    Study NewStudy ( in string study_name )
    return_value = NewStudy ( study_name )
    Study Open ( in URL aStudyUrl )
    return_value = Open ( aStudyUrl )
    void Close ( in Study aStudy )
    Close ( aStudy )
    void Save ( in Study aStudy, in boolean theMultiFile )
    Save ( aStudy, theMultiFile )
    void SaveASCII ( in Study aStudy, in boolean theMultiFile )
    SaveASCII ( aStudy, theMultiFile )
    void SaveAs ( in URL aUrl, in Study aStudy, in boolean theMultiFile )
    SaveAs ( aUrl, aStudy, theMultiFile )
    void SaveAsASCII ( in URL aUrl, in Study aStudy, in boolean theMultiFile )
    SaveAsASCII ( aUrl, aStudy, theMultiFile )
    ListOfOpenStudies GetOpenStudies ( )
    return_value = GetOpenStudies ( )
    Study GetStudyByName ( in string aStudyName )
    return_value = GetStudyByName ( aStudyName )
    Study GetStudyByID ( in short aStudyID )
    return_value = GetStudyByID ( aStudyID )
    boolean CanCopy ( in SObject theObject )
    return_value = CanCopy ( theObject )
    boolean Copy ( in SObject theObject )
    return_value = Copy ( theObject )
    boolean CanPaste ( in SObject theObject )
    return_value = CanPaste ( theObject )
    SObject Paste ( in SObject theObject )
    return_value = Paste ( theObject )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface SObject
    IDL file
    Python
    ID GetID ( )
    return_value = GetID ( )
    SComponent GetFatherComponent ( )
    return_value = GetFatherComponent ( )
    SObject GetFather ( )
    return_value = GetFather ( )
    short Tag ( )
    return_value = Tag ( )
    short Depth ( )
    return_value = Depth ( )
    boolean FindSubObject ( in long atag, out SObject obj )
    [ return_value, obj ] = FindSubObject ( atag )
    boolean FindAttribute ( out GenericAttribute anAttribute, in string aTypeOfAttribute )
    [ return_value, anAttribute ] = FindAttribute ( aTypeOfAttribute )
    boolean ReferencedObject ( out SObject obj )
    [ return_value, obj ] = ReferencedObject ( )
    ListOfAttributes GetAllAttributes ( )
    return_value = GetAllAttributes ( )
    Study GetStudy ( )
    return_value = GetStudy ( )
    Object GetObject ( )
    return_value = GetObject ( )
    string GetName ( )
    return_value = GetName ( )
    string GetComment ( )
    return_value = GetComment ( )
    string GetIOR ( )
    return_value = GetIOR ( )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface GenericAttribute
    IDL file
    Python
    void CheckLocked ( )
    CheckLocked ( )
    string Store ( )
    return_value = Store ( )
    void Restore ( in string theData )
    Restore ( theData )
    string Type ( )
    return_value = Type ( )
    SObject GetSObject ( )
    return_value = GetSObject ( )

    - - - - - - - - - - - - - - - -
    interface SComponent
    IDL file
    Python
    string ComponentDataType ( )
    return_value = ComponentDataType ( )
    boolean ComponentIOR ( out ID theID )
    [ return_value, theID ] = ComponentIOR ( )

    - - - - - - - - - - - - - - - - - - - - - - - -
    interface SComponentIterator
    IDL file
    Python
    void Init ( )
    Init ( )
    boolean More ( )
    return_value = More ( )
    void Next ( )
    Next ( )
    SComponent Value ( )
    return_value = Value ( )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface ChildIterator
    IDL file
    Python
    void Init ( )
    Init ( )
    void InitEx ( in boolean allLevels )
    InitEx ( allLevels )
    boolean More ( )
    return_value = More ( )
    void Next ( )
    Next ( )
    SObject Value ( )
    return_value = Value ( )

    - - - - - - - - - - - - - - - - - - - - - - - -
    interface UseCaseIterator
    IDL file
    Python
    void Init ( in boolean allLevels )
    Init ( allLevels )
    boolean More ( )
    return_value = More ( )
    void Next ( )
    Next ( )
    SObject Value ( )
    return_value = Value ( )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface UseCaseBuilder
    IDL file
    Python
    boolean Append ( in SObject theObject )
    return_value = Append ( theObject )
    boolean Remove ( in SObject theObject )
    return_value = Remove ( theObject )
    boolean AppendTo ( in SObject theFather, in SObject theObject )
    return_value = AppendTo ( theFather, theObject )
    boolean InsertBefore ( in SObject theFirst, in SObject theNext )
    return_value = InsertBefore ( theFirst, theNext )
    boolean SetCurrentObject ( in SObject theObject )
    return_value = SetCurrentObject ( theObject )
    boolean SetRootCurrent ( )
    return_value = SetRootCurrent ( )
    boolean HasChildren ( in SObject theObject )
    return_value = HasChildren ( theObject )
    boolean SetName ( in string theName )
    return_value = SetName ( theName )
    string GetName ( )
    return_value = GetName ( )
    boolean IsUseCase ( in SObject theObject )
    return_value = IsUseCase ( theObject )
    SObject GetCurrentObject ( )
    return_value = GetCurrentObject ( )
    SObject AddUseCase ( in string theName )
    return_value = AddUseCase ( theName )
    UseCaseIterator GetUseCaseIterator ( in SObject theObject )
    return_value = GetUseCaseIterator ( theObject )

    - - - - - - - - - - - - - - - -
    interface Callback
    IDL file
    Python
    void OnAddSObject ( in SObject theObject )
    OnAddSObject ( theObject )
    void OnRemoveSObject ( in SObject theObject )
    OnRemoveSObject ( theObject )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface Driver
    IDL file
    Python
    TMPFile Save ( in SComponent theComponent, in string theURL, in boolean isMultiFile )
    return_value = Save ( theComponent, theURL, isMultiFile )
    TMPFile SaveASCII ( in SComponent theComponent, in string theURL, in boolean isMultiFile )
    return_value = SaveASCII ( theComponent, theURL, isMultiFile )
    boolean Load ( in SComponent theComponent, in TMPFile theStream, in string theURL, in boolean isMultiFile )
    return_value = Load ( theComponent, theStream, theURL, isMultiFile )
    boolean LoadASCII ( in SComponent theComponent, in TMPFile theStream, in string theURL, in boolean isMultiFile )
    return_value = LoadASCII ( theComponent, theStream, theURL, isMultiFile )
    void Close ( in SComponent aSComponent )
    Close ( aSComponent )
    string ComponentDataType ( )
    return_value = ComponentDataType ( )
    string IORToLocalPersistentID ( in SObject theSObject, in string IORString, in boolean isMultiFile, in boolean isASCII )
    return_value = IORToLocalPersistentID ( theSObject, IORString, isMultiFile, isASCII )
    string LocalPersistentIDToIOR ( in SObject theSObject, in string aLocalPersistentID, in boolean isMultiFile, in boolean isASCII )
    return_value = LocalPersistentIDToIOR ( theSObject, aLocalPersistentID, isMultiFile, isASCII )
    boolean CanPublishInStudy ( in Object theIOR )
    return_value = CanPublishInStudy ( theIOR )
    SObject PublishInStudy ( in Study theStudy, in SObject theSObject, in Object theObject, in string theName )
    return_value = PublishInStudy ( theStudy, theSObject, theObject, theName )
    boolean CanCopy ( in SObject theObject )
    return_value = CanCopy ( theObject )
    TMPFile CopyFrom ( in SObject theObject, out long theObjectID )
    [ return_value, theObjectID ] = CopyFrom ( theObject )
    boolean CanPaste ( in string theComponentName, in long theObjectID )
    return_value = CanPaste ( theComponentName, theObjectID )
    SObject PasteInto ( in TMPFile theStream, in long theObjectID, in SObject theObject )
    return_value = PasteInto ( theStream, theObjectID, theObject )

    -
    diff --git a/doc/salome/tui/KERNEL/HTML/SALOMEDS_Attributes.html b/doc/salome/tui/KERNEL/HTML/SALOMEDS_Attributes.html deleted file mode 100644 index 49f848f73..000000000 --- a/doc/salome/tui/KERNEL/HTML/SALOMEDS_Attributes.html +++ /dev/null @@ -1,894 +0,0 @@ - - - - - - - - - - - - - - - - -
    interface AttributeReal
    IDL file
    Python
    double Value ( )
    return_value = Value ( )
    void SetValue ( in double value )
    SetValue ( value )

    - - - - - - - - - - - - - - - -
    interface AttributeInteger
    IDL file
    Python
    long Value ( )
    return_value = Value ( )
    void SetValue ( in long value )
    SetValue ( value )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface AttributeSequenceOfReal
    IDL file
    Python
    void Assign ( in DoubleSeq other )
    Assign ( other )
    DoubleSeq CorbaSequence ( )
    return_value = CorbaSequence ( )
    void Add ( in double value )
    Add ( value )
    void Remove ( in long index )
    Remove ( index )
    void ChangeValue ( in long index, in double value )
    ChangeValue ( index, value )
    double Value ( in short index )
    return_value = Value ( index )
    long Length ( )
    return_value = Length ( )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface AttributeSequenceOfInteger
    IDL file
    Python
    void Assign ( in LongSeq other )
    Assign ( other )
    LongSeq CorbaSequence ( )
    return_value = CorbaSequence ( )
    void Add ( in long value )
    Add ( value )
    void Remove ( in long index )
    Remove ( index )
    void ChangeValue ( in long index, in long value )
    ChangeValue ( index, value )
    long Value ( in short index )
    return_value = Value ( index )
    long Length ( )
    return_value = Length ( )

    - - - - - - - - - - - - - - - -
    interface AttributeName
    IDL file
    Python
    string Value ( )
    return_value = Value ( )
    void SetValue ( in string value )
    SetValue ( value )

    - - - - - - - - - - - - - - - -
    interface AttributeComment
    IDL file
    Python
    string Value ( )
    return_value = Value ( )
    void SetValue ( in string value )
    SetValue ( value )

    - - - - - - - - - - - - - - - -
    interface AttributeIOR
    IDL file
    Python
    string Value ( )
    return_value = Value ( )
    void SetValue ( in string value )
    SetValue ( value )

    - - - - - - - - - - - - - - - -
    interface AttributePersistentRef
    IDL file
    Python
    string Value ( )
    return_value = Value ( )
    void SetValue ( in string value )
    SetValue ( value )

    - - - - - - - - - - - - - - - -
    interface AttributeExternalFileDef
    IDL file
    Python
    string Value ( )
    return_value = Value ( )
    void SetValue ( in string value )
    SetValue ( value )

    - - - - - - - - - - - - - - - -
    interface AttributeFileType
    IDL file
    Python
    string Value ( )
    return_value = Value ( )
    void SetValue ( in string value )
    SetValue ( value )

    - - - - - - - - - - - - - - - -
    interface AttributeDrawable
    IDL file
    Python
    boolean IsDrawable ( )
    return_value = IsDrawable ( )
    void SetDrawable ( in boolean value )
    SetDrawable ( value )

    - - - - - - - - - - - - - - - -
    interface AttributeSelectable
    IDL file
    Python
    boolean IsSelectable ( )
    return_value = IsSelectable ( )
    void SetSelectable ( in boolean value )
    SetSelectable ( value )

    - - - - - - - - - - - - - - - -
    interface AttributeExpandable
    IDL file
    Python
    boolean IsExpandable ( )
    return_value = IsExpandable ( )
    void SetExpandable ( in boolean value )
    SetExpandable ( value )

    - - - - - - - - - - - - - - - -
    interface AttributeOpened
    IDL file
    Python
    boolean IsOpened ( )
    return_value = IsOpened ( )
    void SetOpened ( in boolean value )
    SetOpened ( value )

    - - - - - - - - - - - - - - - -
    interface AttributeTextColor
    IDL file
    Python
    Color TextColor ( )
    return_value = TextColor ( )
    void SetTextColor ( in Color value )
    SetTextColor ( value )

    - - - - - - - - - - - - - - - -
    interface AttributeTextHighlightColor
    IDL file
    Python
    Color TextHighlightColor ( )
    return_value = TextHighlightColor ( )
    void SetTextHighlightColor ( in Color value )
    SetTextHighlightColor ( value )

    - - - - - - - - - - - - - - - - - - - -
    interface AttributePixMap
    IDL file
    Python
    boolean HasPixMap ( )
    return_value = HasPixMap ( )
    string GetPixMap ( )
    return_value = GetPixMap ( )
    void SetPixMap ( in string value )
    SetPixMap ( value )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface AttributeTreeNode
    IDL file
    Python
    void SetFather ( in AttributeTreeNode value )
    SetFather ( value )
    boolean HasFather ( )
    return_value = HasFather ( )
    AttributeTreeNode GetFather ( )
    return_value = GetFather ( )
    void SetPrevious ( in AttributeTreeNode value )
    SetPrevious ( value )
    boolean HasPrevious ( )
    return_value = HasPrevious ( )
    AttributeTreeNode GetPrevious ( )
    return_value = GetPrevious ( )
    void SetNext ( in AttributeTreeNode value )
    SetNext ( value )
    boolean HasNext ( )
    return_value = HasNext ( )
    AttributeTreeNode GetNext ( )
    return_value = GetNext ( )
    void SetFirst ( in AttributeTreeNode value )
    SetFirst ( value )
    boolean HasFirst ( )
    return_value = HasFirst ( )
    AttributeTreeNode GetFirst ( )
    return_value = GetFirst ( )
    void SetTreeID ( in string value )
    SetTreeID ( value )
    string GetTreeID ( )
    return_value = GetTreeID ( )
    void Append ( in AttributeTreeNode value )
    Append ( value )
    void Prepend ( in AttributeTreeNode value )
    Prepend ( value )
    void InsertBefore ( in AttributeTreeNode value )
    InsertBefore ( value )
    void InsertAfter ( in AttributeTreeNode value )
    InsertAfter ( value )
    void Remove ( )
    Remove ( )
    long Depth ( )
    return_value = Depth ( )
    boolean IsRoot ( )
    return_value = IsRoot ( )
    boolean IsDescendant ( in AttributeTreeNode value )
    return_value = IsDescendant ( value )
    boolean IsFather ( in AttributeTreeNode value )
    return_value = IsFather ( value )
    boolean IsChild ( in AttributeTreeNode value )
    return_value = IsChild ( value )
    string Label ( )
    return_value = Label ( )

    - - - - - - - - - - - - - - - -
    interface AttributeLocalID
    IDL file
    Python
    long Value ( )
    return_value = Value ( )
    void SetValue ( in long value )
    SetValue ( value )

    - - - - - - - - - - - - - - - -
    interface AttributeUserID
    IDL file
    Python
    string Value ( )
    return_value = Value ( )
    void SetValue ( in string value )
    SetValue ( value )

    - - - - - - - - - - - - - - - - - - - -
    interface AttributeTarget
    IDL file
    Python
    void Add ( in SObject anObject )
    Add ( anObject )
    ListOfSObject Get ( )
    return_value = Get ( )
    void Remove ( in SObject anObject )
    Remove ( anObject )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface AttributeTableOfInteger
    IDL file
    Python
    void SetTitle ( in string theTitle )
    SetTitle ( theTitle )
    string GetTitle ( )
    return_value = GetTitle ( )
    void SetRowTitle ( in long theIndex, in string theTitle )
    SetRowTitle ( theIndex, theTitle )
    void SetRowTitles ( in StringSeq theTitles )
    SetRowTitles ( theTitles )
    StringSeq GetRowTitles ( )
    return_value = GetRowTitles ( )
    void SetColumnTitle ( in long theIndex, in string theTitle )
    SetColumnTitle ( theIndex, theTitle )
    void SetColumnTitles ( in StringSeq theTitles )
    SetColumnTitles ( theTitles )
    StringSeq GetColumnTitles ( )
    return_value = GetColumnTitles ( )
    void SetRowUnit ( in long theIndex, in string theUnit )
    SetRowUnit ( theIndex, theUnit )
    void SetRowUnits ( in StringSeq theUnits )
    SetRowUnits ( theUnits )
    StringSeq GetRowUnits ( )
    return_value = GetRowUnits ( )
    long GetNbRows ( )
    return_value = GetNbRows ( )
    long GetNbColumns ( )
    return_value = GetNbColumns ( )
    void AddRow ( in LongSeq theData )
    AddRow ( theData )
    void SetRow ( in long theRow, in LongSeq theData )
    SetRow ( theRow, theData )
    LongSeq GetRow ( in long theRow )
    return_value = GetRow ( theRow )
    void AddColumn ( in LongSeq theData )
    AddColumn ( theData )
    void SetColumn ( in long theColumn, in LongSeq theData )
    SetColumn ( theColumn, theData )
    LongSeq GetColumn ( in long theColumn )
    return_value = GetColumn ( theColumn )
    void PutValue ( in long theValue, in long theRow, in long theColumn )
    PutValue ( theValue, theRow, theColumn )
    boolean HasValue ( in long theRow, in long theColumn )
    return_value = HasValue ( theRow, theColumn )
    long GetValue ( in long theRow, in long theColumn )
    return_value = GetValue ( theRow, theColumn )
    void SetNbColumns ( in long theNbColumns )
    SetNbColumns ( theNbColumns )
    LongSeq GetRowSetIndices ( in long theRow )
    return_value = GetRowSetIndices ( theRow )
    boolean ReadFromFile ( in TMPFile theStream )
    return_value = ReadFromFile ( theStream )
    TMPFile SaveToFile ( )
    return_value = SaveToFile ( )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface AttributeTableOfReal
    IDL file
    Python
    void SetTitle ( in string theTitle )
    SetTitle ( theTitle )
    string GetTitle ( )
    return_value = GetTitle ( )
    void SetRowTitle ( in long theIndex, in string theTitle )
    SetRowTitle ( theIndex, theTitle )
    void SetRowTitles ( in StringSeq theTitles )
    SetRowTitles ( theTitles )
    StringSeq GetRowTitles ( )
    return_value = GetRowTitles ( )
    void SetColumnTitle ( in long theIndex, in string theTitle )
    SetColumnTitle ( theIndex, theTitle )
    void SetColumnTitles ( in StringSeq theTitles )
    SetColumnTitles ( theTitles )
    StringSeq GetColumnTitles ( )
    return_value = GetColumnTitles ( )
    void SetRowUnit ( in long theIndex, in string theUnit )
    SetRowUnit ( theIndex, theUnit )
    void SetRowUnits ( in StringSeq theUnits )
    SetRowUnits ( theUnits )
    StringSeq GetRowUnits ( )
    return_value = GetRowUnits ( )
    long GetNbRows ( )
    return_value = GetNbRows ( )
    long GetNbColumns ( )
    return_value = GetNbColumns ( )
    void AddRow ( in DoubleSeq theData )
    AddRow ( theData )
    void SetRow ( in long theRow, in DoubleSeq theData )
    SetRow ( theRow, theData )
    DoubleSeq GetRow ( in long theRow )
    return_value = GetRow ( theRow )
    void AddColumn ( in DoubleSeq theData )
    AddColumn ( theData )
    void SetColumn ( in long theColumn, in DoubleSeq theData )
    SetColumn ( theColumn, theData )
    DoubleSeq GetColumn ( in long theColumn )
    return_value = GetColumn ( theColumn )
    void PutValue ( in double theValue, in long theRow, in long theColumn )
    PutValue ( theValue, theRow, theColumn )
    boolean HasValue ( in long theRow, in long theColumn )
    return_value = HasValue ( theRow, theColumn )
    double GetValue ( in long theRow, in long theColumn )
    return_value = GetValue ( theRow, theColumn )
    void SetNbColumns ( in long theNbColumns )
    SetNbColumns ( theNbColumns )
    LongSeq GetRowSetIndices ( in long theRow )
    return_value = GetRowSetIndices ( theRow )
    boolean ReadFromFile ( in TMPFile theStream )
    return_value = ReadFromFile ( theStream )
    TMPFile SaveToFile ( )
    return_value = SaveToFile ( )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface AttributeTableOfString
    IDL file
    Python
    void SetTitle ( in string theTitle )
    SetTitle ( theTitle )
    string GetTitle ( )
    return_value = GetTitle ( )
    void SetRowTitle ( in long theIndex, in string theTitle )
    SetRowTitle ( theIndex, theTitle )
    void SetRowTitles ( in StringSeq theTitles )
    SetRowTitles ( theTitles )
    StringSeq GetRowTitles ( )
    return_value = GetRowTitles ( )
    void SetColumnTitle ( in long theIndex, in string theTitle )
    SetColumnTitle ( theIndex, theTitle )
    void SetColumnTitles ( in StringSeq theTitles )
    SetColumnTitles ( theTitles )
    StringSeq GetColumnTitles ( )
    return_value = GetColumnTitles ( )
    void SetRowUnit ( in long theIndex, in string theUnit )
    SetRowUnit ( theIndex, theUnit )
    void SetRowUnits ( in StringSeq theUnits )
    SetRowUnits ( theUnits )
    StringSeq GetRowUnits ( )
    return_value = GetRowUnits ( )
    long GetNbRows ( )
    return_value = GetNbRows ( )
    long GetNbColumns ( )
    return_value = GetNbColumns ( )
    void AddRow ( in StringSeq theData )
    AddRow ( theData )
    void SetRow ( in long theRow, in StringSeq theData )
    SetRow ( theRow, theData )
    StringSeq GetRow ( in long theRow )
    return_value = GetRow ( theRow )
    void AddColumn ( in StringSeq theData )
    AddColumn ( theData )
    void SetColumn ( in long theColumn, in StringSeq theData )
    SetColumn ( theColumn, theData )
    StringSeq GetColumn ( in long theColumn )
    return_value = GetColumn ( theColumn )
    void PutValue ( in string theValue, in long theRow, in long theColumn )
    PutValue ( theValue, theRow, theColumn )
    boolean HasValue ( in long theRow, in long theColumn )
    return_value = HasValue ( theRow, theColumn )
    string GetValue ( in long theRow, in long theColumn )
    return_value = GetValue ( theRow, theColumn )
    void SetNbColumns ( in long theNbColumns )
    SetNbColumns ( theNbColumns )
    LongSeq GetRowSetIndices ( in long theRow )
    return_value = GetRowSetIndices ( theRow )
    boolean ReadFromFile ( in TMPFile theStream )
    return_value = ReadFromFile ( theStream )
    TMPFile SaveToFile ( )
    return_value = SaveToFile ( )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface AttributeStudyProperties
    IDL file
    Python
    void SetUserName ( in string theName )
    SetUserName ( theName )
    string GetUserName ( )
    return_value = GetUserName ( )
    void SetCreationDate ( in long theMinute, in long theHour, in long theDay, in long theMonth, in long theYear )
    SetCreationDate ( theMinute, theHour, theDay, theMonth, theYear )
    boolean GetCreationDate ( out long theMinute, out long theHour, out long theDay, out long theMonth, out long theYear )
    [ return_value, theMinute, theHour, theDay, theMonth, theYear ] = GetCreationDate ( )
    void SetCreationMode ( in string theMode )
    SetCreationMode ( theMode )
    string GetCreationMode ( )
    return_value = GetCreationMode ( )
    void SetModified ( in long theModified )
    SetModified ( theModified )
    boolean IsModified ( )
    return_value = IsModified ( )
    long GetModified ( )
    return_value = GetModified ( )
    void SetLocked ( in boolean theLocked )
    SetLocked ( theLocked )
    boolean IsLocked ( )
    return_value = IsLocked ( )
    void SetModification ( in string theName, in long theMinute, in long theHour, in long theDay, in long theMonth, in long theYear )
    SetModification ( theName, theMinute, theHour, theDay, theMonth, theYear )
    void GetModificationsList ( out StringSeq theNames, out LongSeq theMinutes, out LongSeq theHours, out LongSeq theDays, out LongSeq theMonths, out LongSeq theYears, in boolean theWithCreator )
    [ theNames, theMinutes, theHours, theDays, theMonths, theYears ] = GetModificationsList ( theWithCreator )

    - - - - - - - - - - - - - - - - - - - -
    interface AttributePythonObject
    IDL file
    Python
    void SetObject ( in string theSequence, in boolean IsScript )
    SetObject ( theSequence, IsScript )
    string GetObject ( )
    return_value = GetObject ( )
    boolean IsScript ( )
    return_value = IsScript ( )

    -
    diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_Component.html b/doc/salome/tui/KERNEL/HTML/SALOME_Component.html deleted file mode 100644 index 2d802860c..000000000 --- a/doc/salome/tui/KERNEL/HTML/SALOME_Component.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface Container
    IDL file
    Python
    Container start_impl ( in string ContainerName )
    return_value = start_impl ( ContainerName )
    Component load_impl ( in string nameToRegister, in string componentName )
    return_value = load_impl ( nameToRegister, componentName )
    void remove_impl ( in Component component_i )
    remove_impl ( component_i )
    void finalize_removal ( )
    finalize_removal ( )
    void ping ( )
    ping ( )
    boolean Kill_impl ( )
    return_value = Kill_impl ( )
    string getHostName ( )
    return_value = getHostName ( )
    long getPID ( )
    return_value = getPID ( )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface Component
    IDL file
    Python
    void ping ( )
    ping ( )
    void destroy ( )
    destroy ( )
    Container GetContainerRef ( )
    return_value = GetContainerRef ( )
    void setProperties ( in FieldsDict dico )
    setProperties ( dico )
    FieldsDict getProperties ( )
    return_value = getProperties ( )
    void Names ( in string aGraphName, in string aNodeName )
    Names ( aGraphName, aNodeName )
    boolean Kill_impl ( )
    return_value = Kill_impl ( )
    boolean Stop_impl ( )
    return_value = Stop_impl ( )
    boolean Suspend_impl ( )
    return_value = Suspend_impl ( )
    boolean Resume_impl ( )
    return_value = Resume_impl ( )
    long CpuUsed_impl ( )
    return_value = CpuUsed_impl ( )

    -
    diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_DataTypeCatalog.html b/doc/salome/tui/KERNEL/HTML/SALOME_DataTypeCatalog.html deleted file mode 100644 index c73173ffd..000000000 --- a/doc/salome/tui/KERNEL/HTML/SALOME_DataTypeCatalog.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface DataCatalog
    IDL file
    Python
    ListOfDataTypeName GetDataTypeList ( )
    return_value = GetDataTypeList ( )
    boolean isDerivedFrom ( in string type_in, in string type_out )
    return_value = isDerivedFrom ( type_in, type_out )
    string GetDataInterfaceRead ( in string type )
    return_value = GetDataInterfaceRead ( type )
    string GetDataInterfaceWrite ( in string type )
    return_value = GetDataInterfaceWrite ( type )
    ListOfDataTypeName GetDataTypeParents ( in string type )
    return_value = GetDataTypeParents ( type )

    -
    diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_Exception.html b/doc/salome/tui/KERNEL/HTML/SALOME_Exception.html deleted file mode 100644 index 37c3107c9..000000000 --- a/doc/salome/tui/KERNEL/HTML/SALOME_Exception.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_ModuleCatalog.html b/doc/salome/tui/KERNEL/HTML/SALOME_ModuleCatalog.html deleted file mode 100644 index 5f618eb1a..000000000 --- a/doc/salome/tui/KERNEL/HTML/SALOME_ModuleCatalog.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface Acomponent
    IDL file
    Python
    ListOfInterfaces GetInterfaceList ( )
    return_value = GetInterfaceList ( )
    DefinitionInterface GetInterface ( in string interfacename )
    return_value = GetInterface ( interfacename )
    ListOfServices GetServiceList ( in string interfacename )
    return_value = GetServiceList ( interfacename )
    Service GetService ( in string interfacename, in string servicename )
    return_value = GetService ( interfacename, servicename )
    Service GetDefaultService ( in string interfacename )
    return_value = GetDefaultService ( interfacename )
    string GetPathPrefix ( in string machinename )
    return_value = GetPathPrefix ( machinename )

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface ModuleCatalog
    IDL file
    Python
    void ping ( )
    ping ( )
    ListOfComputers GetComputerList ( )
    return_value = GetComputerList ( )
    string GetPathPrefix ( in string machinename )
    return_value = GetPathPrefix ( machinename )
    ListOfComponents GetComponentList ( )
    return_value = GetComponentList ( )
    ListOfIAPP_Affich GetComponentIconeList ( )
    return_value = GetComponentIconeList ( )
    ListOfComponents GetTypedComponentList ( in ComponentType component_type )
    return_value = GetTypedComponentList ( component_type )
    Acomponent GetComponent ( in string componentname )
    return_value = GetComponent ( componentname )
    Component GetComponentInfo ( in string componentName )
    return_value = GetComponentInfo ( componentName )
    void ImportXmlCatalogFile ( in string filename )
    ImportXmlCatalogFile ( filename )
    void shutdown ( )
    shutdown ( )

    -
    diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_Registry.html b/doc/salome/tui/KERNEL/HTML/SALOME_Registry.html deleted file mode 100644 index fd319e119..000000000 --- a/doc/salome/tui/KERNEL/HTML/SALOME_Registry.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface Components
    IDL file
    Python
    void ping ( )
    ping ( )
    unsigned long add ( in Infos lesInfos )
    return_value = add ( lesInfos )
    void remove ( in unsigned long id )
    remove ( id )
    unsigned long size ( )
    return_value = size ( )
    AllInfos getall ( )
    return_value = getall ( )
    AllInfos history ( )
    return_value = history ( )
    void end ( )
    end ( )
    void hello ( in unsigned long id )
    hello ( id )

    -
    diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_RessourcesCatalog.html b/doc/salome/tui/KERNEL/HTML/SALOME_RessourcesCatalog.html deleted file mode 100644 index 787a6283e..000000000 --- a/doc/salome/tui/KERNEL/HTML/SALOME_RessourcesCatalog.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
    interface RessourcesCatalog
    IDL file
    Python
    ListOfComputer GetComputerList ( )
    return_value = GetComputerList ( )
    ListOfContainerType GetContainerTypeList ( in string computer )
    return_value = GetContainerTypeList ( computer )
    computer_info GetComputerInfo ( in string computer )
    return_value = GetComputerInfo ( computer )

    -
    diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_Session.html b/doc/salome/tui/KERNEL/HTML/SALOME_Session.html deleted file mode 100644 index 37b46747d..000000000 --- a/doc/salome/tui/KERNEL/HTML/SALOME_Session.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    interface Session
    IDL file
    Python
    void GetInterface ( )
    GetInterface ( )
    Component GetVisuComponent ( )
    return_value = GetVisuComponent ( )
    void StopSession ( )
    StopSession ( )
    StatSession GetStatSession ( )
    return_value = GetStatSession ( )
    void ping ( )
    ping ( )
    long GetActiveStudyId ( )
    return_value = GetActiveStudyId ( )

    -
    diff --git a/doc/salome/tui/KERNEL/HTML/SALOME_TestComponent.html b/doc/salome/tui/KERNEL/HTML/SALOME_TestComponent.html deleted file mode 100644 index 56348f8a1..000000000 --- a/doc/salome/tui/KERNEL/HTML/SALOME_TestComponent.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - -
    interface TestComponent
    IDL file
    Python
    string Coucou ( in long L )
    return_value = Coucou ( L )
    void Setenv ( )
    Setenv ( )

    -
    diff --git a/doc/salome/tui/KERNEL/HTML/TestNotif.html b/doc/salome/tui/KERNEL/HTML/TestNotif.html deleted file mode 100644 index a181974d2..000000000 --- a/doc/salome/tui/KERNEL/HTML/TestNotif.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
    interface Solver
    IDL file
    Python
    boolean Connect ( )
    return_value = Connect ( )
    void Start ( )
    Start ( )
    void ReStart ( )
    ReStart ( )

    -
    diff --git a/doc/salome/tui/KERNEL/HTML/TypeData.html b/doc/salome/tui/KERNEL/HTML/TypeData.html deleted file mode 100644 index 37c3107c9..000000000 --- a/doc/salome/tui/KERNEL/HTML/TypeData.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/doc/salome/tui/KERNEL/doxyfile.in b/doc/salome/tui/KERNEL/doxyfile.in deleted file mode 100755 index a4f54eba4..000000000 --- a/doc/salome/tui/KERNEL/doxyfile.in +++ /dev/null @@ -1,214 +0,0 @@ -# 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/exemple/Example1.html b/doc/salome/tui/KERNEL/exemple/Example1.html deleted file mode 100755 index 1ec12baf9..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example1.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Exemple - -
    #%AttributeReal interface (creations/saving/restoring)%
    -#%Methods : FindOrCreateAttribute, Value, SaveAs, SetValue, FindComponent, FindAttribute, Open%
    -
    -
    -#       create AttributeReal      
    -#=================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeReal")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeReal attribute"
    -A = A._narrow(SALOMEDS.AttributeReal)
    -A.SetValue(0.0001)
    -if A.Value() != 0.0001:
    -        raise  RuntimeError, "Error : wrong value of  AttributeReal"
    -
    -#      save / restore study      
    -#=================================
    -
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -#file = "/tmp/ggg.hdf"
    -
    -print " -------  We will save to", file, "-----------"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy=batchmode_geompy.myStudyManager.Open(file)
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find AttributeReal
    -#=================================
    -
    -res,A=father.FindAttribute("AttributeReal")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeReal"
    -
    -A = A._narrow(SALOMEDS.AttributeReal)
    -if A.Value() != 0.0001:
    -        raise  RuntimeError, "Error : wrong value of  AttributeReal"
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example10.html b/doc/salome/tui/KERNEL/exemple/Example10.html deleted file mode 100755 index fde0125ea..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example10.html +++ /dev/null @@ -1,59 +0,0 @@ - - - -Example - -
    #%AttributeExpandable interface(creations/saving/restoring)%
    -#%SALOMEDS methods : SaveAs FindComponent  FindAttribute Open%
    -#%Attribute methods : SetExpandable IsExpandable%
    -
    -#              create    AttributeExpandable
    -#===========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute( batchmode_geompy.father, "AttributeExpandable")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeExpandable attribute"
    -A = A._narrow(SALOMEDS.AttributeExpandable)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeExpandable attribute"
    -
    -A.SetExpandable(1)
    -
    -if A.IsExpandable() == 0:
    -        "Error: wrong value of AttributeExpandable"
    -
    -
    -#      save / restore study      
    -#============================================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file,  batchmode_geompy.myStudy)
    -openedStudy = batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find   AttributeExpandable
    -#============================================================
    -
    -res,A=father.FindAttribute("AttributeExpandable")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeExpandable"
    -
    -A = A._narrow(SALOMEDS.AttributeExpandable)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeExpandable attribute"
    -
    -if A.IsExpandable() == 0:
    -        "Error: wrong value of AttributeExpandable"
    -
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example11.html b/doc/salome/tui/KERNEL/exemple/Example11.html deleted file mode 100755 index 38218bddc..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example11.html +++ /dev/null @@ -1,59 +0,0 @@ - - - -Example - -
    #%Test AttributeOpened (creations/saving/restoring)%
    -#%SALOMEDS methods : FindOrCreateAttribute SaveAs, FindComponent, FindAttribute, Open%
    -#%Attribute methods : SetOpened, IsOpened%
    -
    -#              create    AttributeOpened
    -#===========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeOpened")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeOpened attribute"
    -A = A._narrow(SALOMEDS.AttributeOpened)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeOpened attribute"
    -
    -A.SetOpened(1)
    -
    -if A.IsOpened() == 0:
    -        "Error: wrong value of AttributeOpened"
    -
    -
    -#      save / restore study      
    -#============================================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy=batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find   AttributeOpened
    -#============================================================
    -
    -res,A=father.FindAttribute("AttributeOpened")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeOpened"
    -
    -A = A._narrow(SALOMEDS.AttributeOpened)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeOpened attribute"
    -
    -if A.IsOpened() == 0:
    -        "Error: wrong value of AttributeOpened"
    -
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example12.html b/doc/salome/tui/KERNEL/exemple/Example12.html deleted file mode 100755 index 57c5d4531..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example12.html +++ /dev/null @@ -1,67 +0,0 @@ - - - -Example - -
    #%AttributeTextColor interface (creations/saving/restoring)%
    -#%SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%
    -#%Attribute methods : SetTextColor  TextColor%
    -
    -
    -#--------------------------------------------------------------------------
    -#              create    AttributeTextColor
    -#===========================================================
    -import SALOMEDS_Attributes_idl
    -color = SALOMEDS_Attributes_idl._0_SALOMEDS.Color(234,345,231)
    -
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeTextColor")
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeTextColor attribute"
    -A = A._narrow(SALOMEDS.AttributeTextColor)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeTextColor attribute"
    -
    -A.SetTextColor(color)
    -
    -c = A.TextColor();
    -
    -if c.R != 234 or c.G != 345 or c.B != 231:
    -        print "Error: wrong value of AttributeTextColor"
    -
    -#      save / restore study      
    -#============================================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy = batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#       find   AttributeTextColor
    -#============================================================
    -
    -res,A=father.FindAttribute("AttributeTextColor")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeTextColor"
    -
    -A = A._narrow(SALOMEDS.AttributeTextColor)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeTextColor attribute"
    -
    -c = A.TextColor();
    -if c.R != 234 or c.G != 345 or c.B != 231:
    -        print "Error: wrong value of AttributeTextColor"
    -
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example13.html b/doc/salome/tui/KERNEL/exemple/Example13.html deleted file mode 100755 index 9ecf9964b..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example13.html +++ /dev/null @@ -1,68 +0,0 @@ - - - -Example - -
    #%Test AttributeTextHighlightColor interface(creations/saving/restoring)%
    -#%SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%
    -#%Attribute methods :  SetTextHighlightColor TextHighlightColor%
    -
    -#--------------------------------------------------------------------------
    -#              create    AttributeTextHighlightColor
    -#===========================================================
    -
    -import SALOMEDS_Attributes_idl
    -highlightcolor=SALOMEDS_Attributes_idl._0_SALOMEDS.Color(256,256,256)
    -
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeTextHighlightColor")
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeTextHighlightColor attribute"
    -A = A._narrow(SALOMEDS.AttributeTextHighlightColor)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeTextHighlightColor attribute"
    -
    -A.SetTextHighlightColor(highlightcolor)
    -
    -c = A.TextHighlightColor();
    -if c.R != 256 or c.G != 256 or c.B != 256:
    -        print "Error: wrong value of AttributeTextHighlightColor"
    -
    -
    -#      save / restore study      
    -#============================================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy=batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#       find   AttributeTextHighlightColor
    -#============================================================
    -
    -res, A = father.FindAttribute("AttributeTextHighlightColor")
    -print res, A
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeTextHighlightColor"
    -
    -A = A._narrow(SALOMEDS.AttributeTextHighlightColor)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeTextHighlightColor attribute"
    -
    -c = A.TextHighlightColor();
    -
    -if c.R != 256 or c.G != 256 or c.B != 256:
    -        print "Error: wrong value of AttributeTextTextHighlightColor"
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example14.html b/doc/salome/tui/KERNEL/exemple/Example14.html deleted file mode 100755 index a4e0ada09..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example14.html +++ /dev/null @@ -1,57 +0,0 @@ - - - -Example - -
    #%AttributePixMap interface (creations/saving/restoring)%
    -#%SALOMEDS methods  : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%
    -#%Attribute methods : SetPixMap, GetPixMap%
    -
    -#--------------------------------------------------------------------------
    -
    -#--------------------------------------------------------------------------
    -#   create  AttributePixMap
    -#===============================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributePixMap")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributePixMap attribute"
    -aPixmap = A._narrow(SALOMEDS.AttributePixMap);
    -aPixmap.SetPixMap( "ICON_OBJBROWSER_Geometry" );
    -
    -if aPixmap.GetPixMap() != "ICON_OBJBROWSER_Geometry":
    -        print "Error: wrong value of AttributePixMap"
    -
    -
    -#      save / restore study      
    -#============================================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy = batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#       find   AttributePixMap
    -#============================================================
    -
    -res,A=father.FindAttribute("AttributePixMap")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error: AttributePixMap not found "
    -
    -A = A._narrow(SALOMEDS.AttributePixMap)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributePixMap attribute"
    -
    -if A.GetPixMap() != "ICON_OBJBROWSER_Geometry":
    -        print "Error: wrong value of AttributePixMap"
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example15.html b/doc/salome/tui/KERNEL/exemple/Example15.html deleted file mode 100755 index f6cddac5a..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example15.html +++ /dev/null @@ -1,51 +0,0 @@ - - - -Example - -
    #%AttributeLocalID interface(creations/saving/restoring)%
    -#%SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%    
    -#%Attribute methods : Value,  SetValue%
    -
    -#       create AttributeLocalID
    -#=================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeLocalID")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeLocalID attribute"
    -A = A._narrow(SALOMEDS.AttributeLocalID)
    -
    -A.SetValue(763242882)
    -
    -if A.Value() != 763242882:
    -        print "Error: wrong value of AttributeLocalID"
    -
    -#      save / restore study      
    -#=================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy = batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find  AttributeLocalID
    -#=================================
    -
    -res,A=father.FindAttribute("AttributeLocalID")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeLocalID"
    -
    -A = A._narrow(SALOMEDS.AttributeLocalID)
    -
    -if A.Value() != 763242882:
    -        print "Error: wrong value of AttributeLocalID"
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example16.html b/doc/salome/tui/KERNEL/exemple/Example16.html deleted file mode 100755 index ec8bfd5e3..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example16.html +++ /dev/null @@ -1,158 +0,0 @@ - - - -Example - -
    Methods : GetAvailableUndos, ChangeValue, FindOrCreateAttribute, SaveAs, GetAvailableRedos, Undo, FindComponent, Redo, FindAttribute, Open, CommitCommand, NewCommand
    -
    -
    -dir= os.getenv("TmpDir")
    -if dir == None:
    -        dir = "/tmp"
    -
    -batchmode_geompy.myBuilder._set_UndoLimit(20)
    -
    -# 1st transaction -----------------------------------------
    -batchmode_geompy.myBuilder.NewCommand()
    -#       create AttributeSequenceOfInteger      
    -#=========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeSequenceOfInteger")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeSequenceOfInteger attribute"
    -A = A._narrow(SALOMEDS.AttributeSequenceOfInteger)
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeSequenceOfInteger attribute"
    -
    -A.Add(100)
    -A.Add(300)
    -A.Add(500)
    -A.Add(400)
    -A.Add(700)
    -print "First transaction goes on :  HasOpenCommand() = ", batchmode_geompy.myBuilder.HasOpenCommand()
    -batchmode_geompy.myBuilder.CommitCommand() #--------------
    -
    -# 2nd transaction ------------------------------------------
    -batchmode_geompy.myBuilder.NewCommand() 
    -A.Remove(3)
    -A.ChangeValue(4,500)
    -batchmode_geompy.myBuilder.CommitCommand() #--------------
    -
    -if batchmode_geompy.myBuilder.GetAvailableUndos() == 0:
    -        raise RuntimeError, "GetAvailableUndos() = 0 but must not !"
    -
    -if A.Length() != 4:
    -        print "Wrong length of SequenceOfInteger"
    -if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 500:
    -        raise  RuntimeError, "Wrong  value of  AttributeSequenceOfInteger"
    -
    -file1 = dir + "/test1.hdf"
    -batchmode_geompy.myStudyManager.SaveAs(file1, batchmode_geompy.myStudy)
    -
    -# 1st Undo ---------------------------------------
    -batchmode_geompy.myBuilder.Undo()
    -res, A = batchmode_geompy.myBuilder.FindAttribute(batchmode_geompy.father, "AttributeSequenceOfInteger")
    -if A is None:
    -        raise  RuntimeError, "After first 'undo' can't find AttributeSequenceOfInteger"
    -if A.Length() != 5:
    -        print "Wrong length of SequenceOfInteger"
    -if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 500 or A.Value(4) != 400 or  A.Value(5) != 700:
    -        print  A.Value(1), A.Value(2), A.Value(3), A.Value(4), A.Value(5)
    -        raise  RuntimeError, "Wrong  value of  AttributeSequenceOfInteger after the first 'undo'!"
    -# save 
    -file2 = dir + "/test2.hdf"
    -batchmode_geompy.myStudyManager.SaveAs(file2, batchmode_geompy.myStudy)
    -#-------------------------------------------------
    -# 2nd Undo ---------------------------------------
    -batchmode_geompy.myBuilder.Undo()
    -res, attr = batchmode_geompy.myBuilder.FindAttribute(batchmode_geompy.father, "AttributeSequenceOfInteger")
    -if res !=0 or attr != None :
    -        raise  RuntimeError, "After the second 'undo' AttributeSequenceOfInteger exists but must not!"
    -file3 = dir + "/test3.hdf"
    -batchmode_geompy.myStudyManager.SaveAs(file3, batchmode_geompy.myStudy)
    -#-------------------------------------------------
    -
    -#make redo twice ---------------------------------
    -if batchmode_geompy.myBuilder.GetAvailableRedos() == 0:
    -        raise RuntimeError, "GetAvailableRedos() = 0 but must not !"
    -batchmode_geompy.myBuilder.Redo()
    -batchmode_geompy.myBuilder.Redo()
    -res, A = batchmode_geompy.myBuilder.FindAttribute(batchmode_geompy.father, "AttributeSequenceOfInteger")
    -if res ==0 or A== None :
    -        raise  RuntimeError, "AttributeSequenceOfInteger is not found but must be!"
    -if A.Length() != 4:
    -        print "Wrong length of SequenceOfInteger"
    -if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 500:
    -        raise  RuntimeError, "Wrong  value of  AttributeSequenceOfInteger"
    -
    -
    -#----------------------------------------------------------------------
    -openedStudy=batchmode_geompy.myStudyManager.Open(file1);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find AttributeSequenceOfInteger
    -#======================================
    -
    -res,A=father.FindAttribute("AttributeSequenceOfInteger")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeSequenceOfInteger"
    -
    -A = A._narrow(SALOMEDS.AttributeSequenceOfInteger)
    -
    -if A.Length() != 4:
    -        print "Wrong length of SequenceOfInteger"
    -if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 500:
    -        print "Wrong  value of  AttributeSequenceOfInteger"
    -#----------------------------------------------------------------------
    -openedStudy=batchmode_geompy.myStudyManager.Open(file2);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find AttributeSequenceOfInteger
    -#======================================
    -
    -res,A=father.FindAttribute("AttributeSequenceOfInteger")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeSequenceOfInteger"
    -
    -A = A._narrow(SALOMEDS.AttributeSequenceOfInteger)
    -
    -if A.Length() != 5:
    -        print "Wrong length of SequenceOfInteger"
    -if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 500 or A.Value(4) != 400 or  A.Value(5) != 700:
    -        raise  RuntimeError, "Wrong  value of  AttributeSequenceOfInteger after the first 'undo'!"
    -
    -#----------------------------------------------------------------------
    -openedStudy=batchmode_geompy.myStudyManager.Open(file3);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find AttributeSequenceOfInteger
    -#======================================
    -
    -res,A=father.FindAttribute("AttributeSequenceOfInteger")
    -
    -if res!=0 or A != None:
    -        raise RuntimeError, " AttributeSequenceOfInteger is found but must not!"
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example17.html b/doc/salome/tui/KERNEL/exemple/Example17.html deleted file mode 100755 index 458ba1e08..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example17.html +++ /dev/null @@ -1,162 +0,0 @@ - - - -Example - -
    #% Check  methods : %
    -SALOMEDS methods : RemoveAttribute, FindOrCreateAttribute, NewStudy, GetAllAttributes, NewCommand, CommitCommand, AbortCommand, NewComponent%
    -
    -batchmode_geompy.myBuilder._set_UndoLimit(20)
    -
    -batchmode_geompy.myBuilder.NewCommand() 
    -child = batchmode_geompy.myBuilder.NewObject(batchmode_geompy.father)
    -batchmode_geompy.myBuilder.CommitCommand()
    -
    -batchmode_geompy.myBuilder.NewCommand() 
    -#==========================================================
    -#       create AttributeSequenceOfReal      
    -#==========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributeSequenceOfReal")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeSequenceOfReal attribute"
    -A = A._narrow(SALOMEDS.AttributeSequenceOfReal)
    -if A == None :
    -        raise  RuntimeError, "_narrow returns None instead of AttributeSequenceOfReal pointer"
    -
    -A.Add(0.0293)
    -A.Add(522)
    -A.Add(98234)
    -A.Add(83.287)
    -batchmode_geompy.myBuilder.CommitCommand()
    -
    -
    -batchmode_geompy.myBuilder.NewCommand() 
    -#==========================================================
    -#      create  AttributeInteger      
    -#==========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributeInteger")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeInteger attribute"
    -A = A._narrow(SALOMEDS.AttributeInteger)
    -A.SetValue(1000000)
    -
    -if A.Value() != 1000000:
    -        raise  RuntimeError, "Error : wrong value of  AttributeInteger"
    -
    -batchmode_geompy.myBuilder.CommitCommand()
    -
    -batchmode_geompy.myBuilder.NewCommand() #===================
    -#              create AttributeName     
    -#===========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributeName")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A = A._narrow(SALOMEDS.AttributeName)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A.SetValue("AttributesTesting")
    -
    -if A.Value() != "AttributesTesting":
    -        print "Wrong  value of AttributeName"        
    -
    -batchmode_geompy.myBuilder.CommitCommand()
    -
    -batchmode_geompy.myBuilder.NewCommand() #===================
    -#              create     AttributeComment 
    -#===========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributeComment")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeComment attribute"
    -A = A._narrow(SALOMEDS.AttributeComment)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeComment attribute"
    -
    -A.SetValue("GEOM")
    -
    -batchmode_geompy.myBuilder.AbortCommand()
    -
    -batchmode_geompy.myBuilder.NewCommand() #===================
    -#             create   AttributePersistentRef   
    -#===========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributePersistentRef")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributePersistentRef attribute"
    -A = A._narrow(SALOMEDS.AttributePersistentRef)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributePersistentRef attribute"
    -
    -A.SetValue("/tmp/test;1")
    -batchmode_geompy.myBuilder.CommitCommand()
    -
    -batchmode_geompy.myBuilder.NewCommand()  #===================================
    -#              create    AttributeDrawable  
    -#===========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributeDrawable")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeDrawable attribute"
    -A = A._narrow(SALOMEDS.AttributeDrawable)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeDrawable attribute"
    -
    -A.SetDrawable(1)
    -
    -if A.IsDrawable() == 0:
    -        "Error: wrong value of AttributeDrawable"
    -batchmode_geompy.myBuilder.CommitCommand()
    -
    -
    -
    -batchmode_geompy.myBuilder.NewCommand() #===================
    -#              create    AttributeSelectable  
    -#===========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child, "AttributeSelectable")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeSelectable attribute"
    -A = A._narrow(SALOMEDS.AttributeSelectable)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeSelectable attribute"
    -
    -A.SetSelectable(1)
    -
    -if A.IsSelectable() == 0:
    -        "Error: wrong value of AttributeSelectable"
    -batchmode_geompy.myBuilder.CommitCommand()
    -
    -
    -batchmode_geompy.myBuilder.NewCommand() #===================
    -#===========================================================
    -batchmode_geompy.myBuilder.RemoveAttribute(child,"AttributeSelectable")
    -batchmode_geompy.myBuilder.CommitCommand()
    -
    -# Control the attributes 
    -#===========================================================
    -
    -res, A = batchmode_geompy.myBuilder.FindAttribute(child, "AttributeComment")
    -print "res = ", res
    -if A != None :
    -        print " AttributeComment was found"
    -else:
    -        print " AttributeComment is not found. It's correct"
    -
    -attributes=[]
    - 
    -attributes = child.GetAllAttributes()
    -
    -length = len(attributes)
    -
    -print "Attributes number = ", length
    -print attributes
    -for i in range(0, length) :
    -        attr = attributes[i]
    -        if attr is None :
    -                print i,"None item of object attributes list"
    -
    -if length != 5 :
    -        raise RuntimeError, "Wrong number of attributes"
    -
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example18.html b/doc/salome/tui/KERNEL/exemple/Example18.html deleted file mode 100755 index a6c00d67d..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example18.html +++ /dev/null @@ -1,171 +0,0 @@ - - - -Example - -
    #%AttributeTreeNode interface(creations/saving/restoring)%
    -#%SALOMEDS methods : FindOrCreateAttribute, NewObject%
    -#%Attribute methods : HasFirst, HasFather, SetPrevious, Next, InsertAfter, GetFather, HasNext, SetValue, Append, NewStudy, Label, IsRoot, Prepend, SetFather, Depth, HasPrevious%
    -
    -child1 = batchmode_geompy.myBuilder.NewObject(batchmode_geompy.father)
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child1,"AttributeName")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A = A._narrow(SALOMEDS.AttributeName)
    -A.SetValue("N1")
    -N1 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child1, "AttributeTreeNode")
    -if N1 == None :
    -        raise  RuntimeError, "Can't create AttributeTreeNode attribute"
    -
    -child2 = batchmode_geompy.myBuilder.NewObject(batchmode_geompy.father)
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child2,"AttributeName")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A = A._narrow(SALOMEDS.AttributeName)
    -A.SetValue("N2")
    -N2 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child2, "AttributeTreeNode")
    -if N2 == None :
    -        raise  RuntimeError, "Can't create AttributeTreeNode attribute"
    -
    -child3 = batchmode_geompy.myBuilder.NewObject(batchmode_geompy.father)
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child3,"AttributeName")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A = A._narrow(SALOMEDS.AttributeName)
    -A.SetValue("N3")
    -N3 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child3, "AttributeTreeNode")
    -if N3 == None :
    -        raise  RuntimeError, "Can't create AttributeTreeNode attribute"
    -
    -
    -child11 = batchmode_geompy.myBuilder.NewObject(child1)
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child11,"AttributeName")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A = A._narrow(SALOMEDS.AttributeName)
    -A.SetValue("N11")
    -
    -N11 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child11, "AttributeTreeNode")
    -
    -if N11 == None :
    -        raise  RuntimeError, "Can't create AttributeTreeNode attribute"
    -
    -child111 = batchmode_geompy.myBuilder.NewObject(child11)
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child111, "AttributeName")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A = A._narrow(SALOMEDS.AttributeName)
    -A.SetValue("N111")
    -
    -N111 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child111, "AttributeTreeNode")
    -
    -if N111 == None :
    -        raise  RuntimeError, "Can't create AttributeTreeNode attribute"
    - 
    -
    -child31 = batchmode_geompy.myBuilder.NewObject(child3)
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child31,"AttributeName")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A = A._narrow(SALOMEDS.AttributeName)
    -A.SetValue("N31")
    -
    -N31 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child31, "AttributeTreeNode")
    -if N31 == None :
    -        raise  RuntimeError, "Can't create AttributeTreeNode attribute"
    -
    -child32 = batchmode_geompy.myBuilder.NewObject(child3)
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child32,"AttributeName")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A = A._narrow(SALOMEDS.AttributeName)
    -A.SetValue("N32")
    -
    -N32 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child32, "AttributeTreeNode")
    -if N32 == None :
    -        raise  RuntimeError, "Can't create AttributeTreeNode attribute"
    -
    -child321 = batchmode_geompy.myBuilder.NewObject(child32)
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child321,"AttributeName")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A = A._narrow(SALOMEDS.AttributeName)
    -A.SetValue("N321")
    -
    -N321 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child321, "AttributeTreeNode")
    -if N321 == None :
    -        raise  RuntimeError, "Can't create AttributeTreeNode attribute"
    -
    -child33 = batchmode_geompy.myBuilder.NewObject(child3)
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child33,"AttributeName")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A = A._narrow(SALOMEDS.AttributeName)
    -A.SetValue("N33")
    -
    -N33 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child33, "AttributeTreeNode")
    -if N33 == None :
    -        raise  RuntimeError, "Can't create AttributeTreeNode attribute"
    -
    -child34 = batchmode_geompy.myBuilder.NewObject(child3)
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(child34,"AttributeName")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A = A._narrow(SALOMEDS.AttributeName)
    -A.SetValue("N34")
    -
    -N34 = batchmode_geompy.myBuilder.FindOrCreateAttribute(child34, "AttributeTreeNode")
    -if N34 == None :
    -        raise  RuntimeError, "Can't create AttributeTreeNode attribute"
    -
    -
    -
    -#Create links between tree nodes.
    -#  -| root
    -#   --N1 __
    -#   |     N11__
    -#   |           N111
    -#   --N2           
    -#   |   
    -#   --N3__
    -#         N31
    -#         N32__
    -#              N321
    -#         N33
    -#         N34
    -        
    -N11.SetFather(N1)
    -N11.Append(N111)
    -N3.SetPrevious(N1)
    -N3.Prepend(N2)
    -
    -N32.SetFather(N3)
    -N32.Prepend(N31)
    -N33.InsertAfter(N32)
    -N33.Append(N34)
    -print "-------------  ", N1, "  -------------  "
    -print "N1.Label() = ", N1.Label() , "IsRoot() = ", N1.IsRoot(), "Depth() = ", N1.Depth()
    -print "N11.Label() = ", N11.Label() , "IsRoot() = ", N11.IsRoot(), "Depth() = ", N11.Depth()
    -print "N111.Label() = ", N111.Label() , "IsRoot() = ", N111.IsRoot(), "Depth() = ", N111.Depth()
    -print "N2.Label() = ", N2.Label() , "IsRoot() = ",  N2.IsRoot(), "Depth() = ", N2.Depth()
    -print "N3.Label() = ", N3.Label() , "IsRoot() = ", N3.IsRoot(), "Depth() = ", N3.Depth()
    -print "N31.Label() = ", N31.Label() , "IsRoot() = ", N31.IsRoot(), "Depth() = ", N31.Depth()
    -print "N32.Label() = ", N32.Label() , "IsRoot() = ", N32.IsRoot(), "Depth() = ", N32.Depth()
    -print "N321.Label() = ", N321.Label() , "IsRoot() = ", N321.IsRoot(), "Depth() = ", N321.Depth()
    -print "N33.Label() = ", N33.Label() , "IsRoot() = ", N33.IsRoot(), "Depth() = ", N33.Depth()
    -print "N34.Label() = ", N34.Label() , "IsRoot() = ", N34.IsRoot(), "Depth() = ", N34.Depth()
    -print "N1.IsRoot()=", N1.IsRoot()
    -
    -print "N1.HasNext() = ",N1.HasNext()
    -if  N1.HasNext():
    -        print N1.Next().Label()
    -
    -print "N32.HasPrevious() = ",N32.HasPrevious()
    -if  N32.HasPrevious():
    -        print N32.GetPrevious().Label()
    -
    -print "N111.HasFirst()=",N111.HasFirst()
    -print "N111.HasFather()=",N111.HasFather()
    -if N111.HasFather() :
    -        print "N111.GetFather().Label()=",N111.GetFather().Label()
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example19.html b/doc/salome/tui/KERNEL/exemple/Example19.html deleted file mode 100755 index 4c5c2902b..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example19.html +++ /dev/null @@ -1,547 +0,0 @@ - - - -Exemple - -
    -#^ SALOMEDS methods :  FindOrCreateAttribute, Save, SaveAs, Close, Open, FindComponent, FindAttribute, FindObject, LoadWith^
    -#^ Attribute methods : Value, SetValue^
    -#======================================================================
    -#1. Create Study and add some components to it
    -#======================================================================
    -
    -#=================================
    -#       create AttributeReal      
    -#=================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeReal")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeReal attribute"
    -A = A._narrow(SALOMEDS.AttributeReal)
    -A.SetValue(0.0001)
    -if A.Value() != 0.0001:
    -        raise  RuntimeError, "Error : wrong value of  AttributeReal"
    -
    -# ===  Geometry  ==================================================
    -
    -import batchmode_geompy
    - 
    -#===================================
    -#     define a box
    -#===================================
    -
    -box = batchmode_geompy.MakeBox(0., 0., 0., 100., 200., 300.)
    -idbox = batchmode_geompy.addToStudy(box,"box")
    -
    -
    -geom = batchmode_geompy.geom
    -import SMESH
    -import batchmode_smesh
    -ShapeType = batchmode_smesh.ShapeType
    -
    -# ---- add first face of box in study
    -
    -subShapeList = batchmode_geompy.SubShapeAll(box,ShapeType["Face"])
    -face=subShapeList[0]
    -name = "box_face"
    -print name
    -idface= batchmode_geompy.addToStudyInFather(box,face,name)
    -
    -# ---- add shell from box  in study
    -
    -subShellList= batchmode_geompy.SubShapeAll(box,ShapeType["Shell"])
    -shell = subShellList[0]
    -name = "box_shell"
    -print name
    -idshell= batchmode_geompy.addToStudyInFather(box,shell,name)
    -
    -# ---- add first edge of face in study
    -
    -edgeList =  batchmode_geompy.SubShapeAll(face,ShapeType["Edge"])
    -edge=edgeList[0];
    -name = "face_edge"
    -print name
    -idedge= batchmode_geompy.addToStudyInFather(face,edge,name)
    -
    -# ---- launch SMESH, init a Mesh with the box
    -
    -smesh =  batchmode_smesh.smesh
    -#  --  Init  --
    -shape = batchmode_geompy.IDToObject(idbox)
    -mesh=smesh.Init(geom, batchmode_geompy.myStudyId, shape)
    -
    -orb = batchmode_geompy.orb
    -
    -idmesh = batchmode_smesh.AddNewMesh( orb.object_to_string(mesh) )
    -batchmode_smesh.SetName(idmesh, "Meshbox");
    -batchmode_smesh.SetShape(idbox, idmesh);
    -
    -# ---- create Hypothesis
    -
    -print "-------------------------- create Hypothesis ----------------------"
    -print "-------------------------- LocalLength"
    -hyp1 = smesh.CreateHypothesis("LocalLength", batchmode_geompy.myStudyId )
    -hypLen1 = hyp1._narrow(SMESH.SMESH_LocalLength)
    -hypLen1.SetLength(100)
    -print hypLen1.GetName()
    -print hypLen1.GetId()
    -print hypLen1.GetLength()
    -
    -idlength = batchmode_smesh.AddNewHypothesis( orb.object_to_string(hypLen1) );
    -batchmode_smesh.SetName(idlength, "Local_Length_100");
    -
    -print "-------------------------- NumberOfSegments"
    -hyp2 =  smesh.CreateHypothesis("NumberOfSegments", batchmode_geompy.myStudyId )
    -hypNbSeg1=hyp2._narrow(SMESH.SMESH_NumberOfSegments)
    -hypNbSeg1.SetNumberOfSegments(7)
    -print hypNbSeg1.GetName()
    -print hypNbSeg1.GetId()
    -print hypNbSeg1.GetNumberOfSegments()
    -
    -idseg =  batchmode_smesh.AddNewHypothesis( orb.object_to_string(hypNbSeg1) );
    -batchmode_smesh.SetName(idseg, "NumberOfSegments_7");
    -
    -print "-------------------------- MaxElementArea"
    -hyp3 = smesh.CreateHypothesis("MaxElementArea",  batchmode_geompy.myStudyId)
    -hypArea1=hyp3._narrow(SMESH.SMESH_MaxElementArea)
    -hypArea1.SetMaxElementArea(2500)
    -print hypArea1.GetName()
    -print hypArea1.GetId()
    -print hypArea1.GetMaxElementArea()
    -
    -idarea1 = batchmode_smesh.AddNewHypothesis( orb.object_to_string(hypArea1) );
    -batchmode_smesh.SetName(idarea1, "MaxElementArea_2500");
    -
    -print "-------------------------- MaxElementArea"
    -hyp3 = smesh.CreateHypothesis("MaxElementArea",  batchmode_geompy.myStudyId)
    -hypArea2 = hyp3._narrow(SMESH.SMESH_MaxElementArea)
    -hypArea2.SetMaxElementArea(500)
    -print hypArea2.GetName()
    -print hypArea2.GetId()
    -print hypArea2.GetMaxElementArea()
    -
    -idarea2 = batchmode_smesh.AddNewHypothesis( orb.object_to_string(hypArea2) );
    -batchmode_smesh.SetName(idarea2, "MaxElementArea_500");
    -
    -print "-------------------------- Regular_1D"
    -alg1 = smesh.CreateHypothesis("Regular_1D",  batchmode_geompy.myStudyId)
    -algo1 = alg1._narrow(SMESH.SMESH_Algo)
    -listHyp = algo1.GetCompatibleHypothesis()
    -for hyp in listHyp:
    -    print hyp
    -algoReg=alg1._narrow(SMESH.SMESH_Regular_1D)
    -print algoReg.GetName()
    -print algoReg.GetId()
    -
    -idreg = batchmode_smesh.AddNewAlgorithms( orb.object_to_string(algoReg) );
    -batchmode_smesh.SetName(idreg, "Regular_1D");
    -
    -print "-------------------------- MEFISTO_2D"
    -alg2 = smesh.CreateHypothesis("MEFISTO_2D",  batchmode_geompy.myStudyId)
    -algo2 = alg2._narrow(SMESH.SMESH_Algo)
    -listHyp=algo2.GetCompatibleHypothesis()
    -for hyp in listHyp:
    -    print hyp
    -algoMef=alg2._narrow(SMESH.SMESH_MEFISTO_2D)
    -print algoMef.GetName()
    -print algoMef.GetId()
    -
    -idmef = batchmode_smesh.AddNewAlgorithms( orb.object_to_string(algoMef) );
    -batchmode_smesh.SetName(idmef, "MEFISTO_2D");
    -
    -
    -# ---- add hypothesis to edge
    -
    -print "-------------------------- add hypothesis to edge"
    -edge = batchmode_geompy.IDToObject(idedge)
    -submesh = mesh.GetElementsOnShape(edge)
    -ret = mesh.AddHypothesis(edge,algoReg)
    -print ret
    -ret=mesh.AddHypothesis(edge,hypLen1)
    -print ret
    -
    -idsm1 = batchmode_smesh.AddSubMeshOnShape( idmesh,
    -                                           idedge,
    -                                           orb.object_to_string(submesh),
    -                                           ShapeType["Edge"] )
    -batchmode_smesh.SetName(idsm1, "SubMeshEdge")
    -batchmode_smesh.SetAlgorithms( idsm1, idreg );
    -batchmode_smesh.SetHypothesis( idsm1, idlength );
    -
    -print "-------------------------- add hypothesis to face"
    -face=batchmode_geompy.IDToObject(idface)
    -submesh=mesh.GetElementsOnShape(face)
    -ret=mesh.AddHypothesis(face,hypArea2)
    -print ret
    -
    -idsm2 = batchmode_smesh.AddSubMeshOnShape( idmesh,
    -                                    idface,
    -                                    orb.object_to_string(submesh),
    -                                    ShapeType["Face"] )
    -batchmode_smesh.SetName(idsm2, "SubMeshFace")
    -batchmode_smesh.SetHypothesis( idsm2, idarea2 );
    -
    -# ---- add hypothesis to box
    -
    -print "-------------------------- add hypothesis to box"
    -box=batchmode_geompy.IDToObject(idbox)
    -submesh=mesh.GetElementsOnShape(box)
    -ret=mesh.AddHypothesis(box,algoReg)
    -print ret
    -ret=mesh.AddHypothesis(box,hypNbSeg1)
    -print ret
    -ret=mesh.AddHypothesis(box,algoMef)
    -print ret
    -ret=mesh.AddHypothesis(box,hypArea1)
    -print ret
    -
    -batchmode_smesh.SetAlgorithms( idmesh, idreg );
    -batchmode_smesh.SetHypothesis( idmesh, idseg );
    -batchmode_smesh.SetAlgorithms( idmesh, idmef );
    -batchmode_smesh.SetHypothesis( idmesh, idarea1 );
    -
    -# ---- compute box
    -
    -print "-------------------------- compute box"
    -ret=smesh.Compute(mesh,box)
    -print ret
    -log=mesh.GetLog(0); # no erase trace
    -for linelog in log:
    -    print linelog
    -
    -
    -#=======================================================
    -#    add  SuperVision component
    -#=======================================================
    -
    -from batchmode_SuperV import *
    -import os
    -dir= os.getenv("SUPERV_ROOT_DIR")
    -if dir == None:
    -        raise RuntimeError, "SUPERV_ROOT_DIR is not defined"
    -xmlfile = dir +"/examples/GraphEssai.xml"
    -print "--------------\n"+xmlfile+"\n--------------\n"
    -
    -myGraph = Graph ( xmlfile )
    -
    -# This DataFlow is "valid" : no loop, correct links between Nodes etc...
    -print myGraph.IsValid()
    -
    -# Get Nodes
    -myGraph.PrintNodes()
    -Add,Sub,Mul,Div = myGraph.Nodes()
    -
    -# Load Datas
    -Addx = Add.Input("x",3.)
    -Addy = Add.Input("y",4.5)
    -Subx = Sub.Input("x",1.5)
    -
    -# Get Output Port
    -Addz = Add.Port('z')
    -Subz = Sub.Port('z')
    -Mulz = Mul.Port('z')
    -Divz = Div.Port('z')
    -
    -# This DataFlow is "executable" : all pending Ports are defined with Datas
    -print myGraph.IsExecutable()
    -
    -# Starts only execution of that DataFlow and gets control immediatly
    -print myGraph.Run()
    -
    -# That DataFlow is running ==> 0 (false)
    -print myGraph.IsDone()
    -
    -# Events of execution :
    -aStatus,aNode,anEvent,aState = myGraph.Event()
    -while aStatus :
    -    print aNode.Thread(),aNode.SubGraph(),aNode.Name(),anEvent,aState
    -    aStatus,aNode,anEvent,aState = myGraph.Event()
    -print myGraph.IsDone()
    -
    -# Wait for Completion (but it is already done after event loop ...)
    -print "Done : ",myGraph.DoneW()
    -
    -# Get result
    -print "Result : ",Divz.ToString()
    -
    -# Intermediate results :
    -print "Intermediate Result Add\z : ",Addz.ToString()
    -print "Intermediate Result Sub\z : ",Subz.ToString()
    -print "Intermediate Result Mul\z : ",Mulz.ToString()
    -
    -print " "
    -#print "Type : print myGraph.IsDone()"
    -#print "       If execution is finished ==> 1 (true)"
    -res=myGraph.IsDone()
    -if res != 1:
    -        raise RuntimeError, "myGraph.Run() is not done"
    -
    -print " "
    -print "Type : print Divz.ToString()"
    -print "       You will get the result"
    -Divz.ToString()
    -
    -print " "
    -print "Type : myGraph.PrintPorts()"
    -print "       to see input and output values of the graph"
    -myGraph.PrintPorts()
    -
    -print " "
    -print "Type : Add.PrintPorts()"
    -Add.PrintPorts()
    -
    -print "Type : Sub.PrintPorts()"
    -Sub.PrintPorts()
    -
    -print "Type : Mul.PrintPorts()"
    -Mul.PrintPorts()
    -
    -print "Type : Div.PrintPorts()"
    -print "       to see input and output values of nodes"
    -Div.PrintPorts()
    -
    -# Export will create newsupervisionexample.xml and the corresponding .py file
    -tmpdir=os.getenv("TmpDir")
    -if tmpdir is None:
    -        tmpdir="/tmp"
    -file = tmpdir + "/newsupervisionexample"
    -print "--------------\n"+file+"\n--------------\n"
    -myGraph.Export(file)
    -
    -ior = batchmode_geompy.orb.object_to_string(myGraph.G)
    -addStudy(ior)
    -
    -GraphName = myGraph.Name()
    -print "Befor save ",
    -nodes = myGraph.Nodes()
    -length_bs = len(nodes)
    -print "ListOfNodes length = ", length_bs
    -names=[]
    -for node in nodes:
    -        names.append(node.Name())
    -print names
    -
    -
    -#=================================
    -#      save / restore study      
    -#=================================
    -str= os.getenv("TmpDir")
    -if str == None:  
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -
    -#==================================================
    -#1. SaveAs
    -#==================================================
    -print " -------  We will save to", file, "-----------"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -batchmode_geompy.myStudyManager.Close(batchmode_geompy.myStudy)
    -
    -#rename the file and try to reread it again
    -
    -os.mkdir(str + "/test_dir")
    -
    -#2.==================================================
    -print " ------- We rename the file as " + str + "/test_dir/test_new.hdf"
    -os.rename(file, str+"/test_dir/test_new.hdf")
    -
    -#==================================================
    -#3. Open
    -#==================================================
    -print " ------- We try to open " + str + "/test_dir/test_new.hdf"
    -
    -try:
    -        openedStudy=batchmode_geompy.myStudyManager.Open(str+"/test_dir/test_new.hdf")
    -except Exception:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "GEOM component is not found!  Wrong study is opened." 
    -
    -
    -#=================================
    -#     find AttributeReal
    -#=================================
    -
    -res,A=father.FindAttribute("AttributeReal")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeReal"
    -
    -A = A._narrow(SALOMEDS.AttributeReal)
    -if A.Value() != 0.0001:
    -        raise  RuntimeError, "Error : wrong value of  AttributeReal"
    -
    -#==================================================
    -#     find  box
    -#==================================================
    -box = openedStudy.FindObject("box")
    -if box is None :
    -        raise  RuntimeError, "box was not found! Wrong study is opened."
    -
    -edge=openedStudy.FindObject("face_edge")
    -if edge is None :
    -        raise  RuntimeError, "face_edge was not found! Wrong study is opened."
    -
    -
    -father = openedStudy.FindComponent("MESH")
    -if father is None:
    -         raise  RuntimeError, "MESH component is not found!  Wrong study is opened." 
    -
    -hp=openedStudy.FindObject("Meshbox")
    -if hp is None:
    -        raise  RuntimeError, "Meshbox object was not found! Wrong study is opened."
    -
    -hp = openedStudy.FindObject("Algorithms Definition")
    -if hp is None:
    -        raise  RuntimeError, "Algorithms Definition object was not found! Wrong study is opened."
    -
    -hp = openedStudy.FindObject("MEFISTO_2D")
    -if hp is None:
    -        raise  RuntimeError, "MEFISTO_2D object was not found! Wrong study is opened."
    -
    -hp = openedStudy.FindObject("Hypothesis Definition")
    -if hp is None:
    -        raise  RuntimeError, "Algoriths Definition was not found! Wrong study is opened."
    -
    -#==================================================
    -# Find Supervisor
    -#==================================================
    -father = openedStudy.FindComponent("SUPERV")
    -if father is None: 
    -         raise  RuntimeError, "SUPERV component is not found!  Wrong study is opened." 
    -
    -SuperV = lcc.FindOrLoadComponent("SuperVisionContainer","Supervision")
    -Builder = openedStudy.NewBuilder()
    -Builder.LoadWith(father, SuperV)
    -import SALOMEDS
    -
    -aChildIterator = openedStudy.NewChildIterator(father)
    -
    -#while aChildIterator.More():
    -anSObject = aChildIterator.Value()
    -#print "iterate: ", anSObject.GetID()
    -res, anAttr=anSObject.FindAttribute("AttributeIOR")
    -if res :
    -        anAttr=anAttr._narrow(SALOMEDS.AttributeIOR)
    -        ior = anAttr.Value()
    -        Graph=SuperV.getGraph(ior)
    -        ListOfNodes=Graph.Nodes()
    -        length_as= len(ListOfNodes)
    -        print "ListOfNodes length = ", length_as
    -        if length_as != length_bs:
    -                raise RuntimeErrror, "defferent length of nodes after study open"
    -#aChildIterator.Next()
    -
    -Names = []
    -for node in ListOfNodes:
    -        Names.append(node.Name())
    -names.sort()
    -Names.sort()
    -if names != Names :
    -        raise RuntimeError, "List of dataflow nodes after save differs from one befor save operation"
    -
    -#==================================================
    -#4. Save
    -#==================================================
    -batchmode_geompy.myStudyManager.Save(openedStudy)
    -batchmode_geompy.myStudyManager.Close(openedStudy)
    -#==================================================
    -#5. Open
    -#==================================================
    -try:
    -        openedStudy = batchmode_geompy.myStudyManager.Open(str+"/test_dir/test_new.hdf")
    -except Exception:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#find AttributeReal
    -res,A=father.FindAttribute("AttributeReal")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeReal"
    -
    -A = A._narrow(SALOMEDS.AttributeReal)
    -if A.Value() != 0.0001:
    -        raise  RuntimeError, "Error : wrong value of  AttributeReal"
    -#==================================================
    -#     find  box
    -#==================================================
    -box = openedStudy.FindObject("box")
    -if box is None :
    -        raise  RuntimeError, "box was not found! Wrong study is opened."
    -
    -edge=openedStudy.FindObject("face_edge")
    -if edge is None :
    -        raise  RuntimeError, "face_edge was not found! Wrong study is opened."
    -
    -
    -father = openedStudy.FindComponent("MESH")
    -if father is None:
    -         raise  RuntimeError, "MESH component is not found!  Wrong study is opened." 
    -
    -hp=openedStudy.FindObject("Meshbox")
    -if hp is None:
    -        raise  RuntimeError, "Meshbox object was not found! Wrong study is opened."
    -
    -hp = openedStudy.FindObject("Algorithms Definition")
    -if hp is None:
    -        raise  RuntimeError, "Algorithms Definition object was not found! Wrong study is opened."
    -
    -hp = openedStudy.FindObject("MEFISTO_2D")
    -if hp is None:
    -        raise  RuntimeError, "MEFISTO_2D object was not found! Wrong study is opened."
    -
    -hp = openedStudy.FindObject("Hypothesis Definition")
    -if hp is None:
    -        raise  RuntimeError, "Algoriths Definition was not found! Wrong study is opened."
    -
    -#==================================================
    -# Find Supervisor
    -#==================================================
    -father = openedStudy.FindComponent("SUPERV")
    -if father is None:
    -         raise  RuntimeError, "SUPERV component is not found!  Wrong study is opened." 
    -
    -SuperV = lcc.FindOrLoadComponent("SuperVisionContainer","Supervision")
    -Builder = openedStudy.NewBuilder()
    -Builder.LoadWith(father, SuperV)
    -import SALOMEDS
    -
    -aChildIterator = openedStudy.NewChildIterator(father)
    -
    -#while aChildIterator.More():
    -anSObject = aChildIterator.Value()
    -
    -res, anAttr=anSObject.FindAttribute("AttributeIOR")
    -if res :
    -        anAttr=anAttr._narrow(SALOMEDS.AttributeIOR)
    -        ior = anAttr.Value()
    -        Graph=SuperV.getGraph(ior)
    -        ListOfNodes=Graph.Nodes()
    -        length_as= len(ListOfNodes)
    -        print "ListOfNodes length = ", length_as
    -        if length_as != length_bs:
    -                raise RuntimeErrror, "defferent length of nodes after study open"
    -#aChildIterator.Next()
    -
    -Names = []
    -for node in ListOfNodes:
    -        Names.append(node.Name())
    -names.sort()
    -Names.sort()
    -if names != Names :
    -        raise RuntimeError, "List of dataflow nodes after save differs from one befor save operation"
    -
    diff --git a/doc/salome/tui/KERNEL/exemple/Example2.html b/doc/salome/tui/KERNEL/exemple/Example2.html deleted file mode 100755 index 16361364f..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example2.html +++ /dev/null @@ -1,46 +0,0 @@ - - - -Example - -
    #%AttributeInteger interface(creation/saving/restoring)%
    -#%Methods : FindOrCreateAttribute , Value, SaveAs, SetValue, FindComponent, FindAttribute, Open%
    -
    -#      create  AttributeInteger      
    -#=================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeInteger")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeInteger attribute"
    -A = A._narrow(SALOMEDS.AttributeInteger)
    -A.SetValue(1000000)
    -
    -if A.Value() != 1000000:
    -        raise  RuntimeError, "Error : wrong value of  AttributeInteger"
    -
    -#   save and restore the study
    -#=================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -# ... save ...
    -batchmode_geompy.myStudyManager.SaveAs(str+"/test.hdf", batchmode_geompy.myStudy)
    -# ... open ...
    -openedStudy= batchmode_geompy.myStudyManager.Open(str+"/test.hdf");
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -#     find AttributeInteger
    -#================================
    -res,A=father.FindAttribute("AttributeInteger")
    -if res == 0  or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeInteger"
    -A = A._narrow(SALOMEDS.AttributeInteger)
    -if A.Value() != 1000000:
    -        raise  RuntimeError, "Error : wrong value of  AttributeInteger after study restoring"
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example20.html b/doc/salome/tui/KERNEL/exemple/Example20.html deleted file mode 100755 index 3019ad80e..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example20.html +++ /dev/null @@ -1,160 +0,0 @@ - - - -Exemple - -
    -#^SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, NewCommand, GetProperties, Open, CommitCommand, NewBuilder^
    -#^Attribute methods : SetLocked, IsLocked, GetCreationMode, SetCreationDate, IsModified, GetUserName, Value, SetUserName, SetValue, GetCreationDate^
    -
    -batchmode_geompy.myBuilder._set_UndoLimit(20)
    -
    -#--------------------------------------------------------------------------
    -#       create AttributeReal      
    -#===============================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeReal")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeReal attribute"
    -A = A._narrow(SALOMEDS.AttributeReal)
    -A.SetValue(0.0001)
    -if A.Value() != 0.0001:
    -        raise  RuntimeError, "Error : wrong value of  AttributeReal"
    -
    -#      create AttributeStudyProperties
    -#================================================
    -A = batchmode_geompy.myStudy.GetProperties()
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeStudyProperties attribute"
    -A = A._narrow(SALOMEDS.AttributeStudyProperties)
    -
    -batchmode_geompy.myBuilder.NewCommand();
    -print "A.GetUserName()= ", A.GetUserName()
    -res,mm,hh,dd,mnth,yy=A.GetCreationDate()
    -print "A.GetCreationDate() = ", mm,hh,dd,mnth,yy
    -print "A.GetCreationMode() = ", A.GetCreationMode()
    -print "A.IsModified() = ", A.IsModified()
    -print "A.IsLocked() = ", A.IsLocked()
    -if A.IsLocked() == 0 :
    -        A.SetUserName("tester"); print 'A.SetUserName("tester"), A.GetUserName() = ', A.GetUserName()
    -        A.SetCreationDate(11,11,11,11,2002); print 'A.SetCreationDate(11,11,11,11,2002), A.GetCreationDate() =', A.GetCreationDate()
    -        print "A.IsModified() = ", A.IsModified()
    -A.SetLocked(1)
    -
    -#check the transaction result 
    -batchmode_geompy.myBuilder.CommitCommand()
    -if A.GetUserName() != "tester":
    -        print 'Control after transaction close : A.GetUserName() = ', A.GetUserName()
    -        raise RuntimeError, "Field 'UserName' was not modified but had to!"
    -
    -# try to make some changes wrapped by transaction 
    -#================================================
    -batchmode_geompy.myBuilder.NewCommand()
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeInteger")
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeInteger attribute"
    -A = A._narrow(SALOMEDS.AttributeInteger)
    -A.SetValue(1000000)
    -
    -exception_was = None
    -try : batchmode_geompy.myBuilder.CommitCommand()
    -except Exception: exception_was = 1
    -
    -if exception_was is None:
    -        raise RuntimeError, "Study was locked for changes but CommitCommand did not generate an exception !"
    -
    -#      save / restore study      
    -
    -#================================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -print " -------  We will save to", file, "-----------"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -
    -
    -#--------------------------------------------------------------------------#
    -#--------------------------- Open file ------------------------------------# 
    -#--------------------------------------------------------------------------#
    -
    -print" -------------- Open  " + file + "-------------- " 
    -
    -openedStudy = batchmode_geompy.myStudyManager.Open(file)
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#1.     find AttributeReal
    -#================================================
    -
    -res,A=father.FindAttribute("AttributeReal")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeReal"
    -
    -A = A._narrow(SALOMEDS.AttributeReal)
    -if A.Value() != 0.0001:
    -        raise  RuntimeError, "Error : wrong value of  AttributeReal"
    - 
    -
    -#2.     find AttributeStudyProperties
    -#=================================================
    -A=openedStudy.GetProperties()
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeStudyProperties"
    -
    -A = A._narrow(SALOMEDS.AttributeStudyProperties)
    -if A.IsLocked() == 0 :
    -        raise  RuntimeError, "Error : AttributeStudyProperties must have Locked flag but have no!"
    -
    -#get the builder
    -myBuilder = openedStudy.NewBuilder()
    -
    -#3. try to make some changes wrapped by transaction 
    -#==================================================
    -exception_was = None
    -try : 
    -        myBuilder.NewCommand()
    -        A = myBuilder.FindOrCreateAttribute(father, "AttributeInteger")
    -
    -        if A == None :
    -                raise  RuntimeError, "Can't create AttributeInteger attribute"
    -        A = A._narrow(SALOMEDS.AttributeInteger)
    -        A.SetValue(1000000)
    -        myBuilder.CommitCommand()
    -except Exception: exception_was = 1
    -
    -if exception_was is None:
    -        raise RuntimeError, "Study was locked for changes but CommitCommand did not generate an exception !"
    -
    -
    -myBuilder.NewCommand()
    -A=openedStudy.GetProperties()
    -A = A._narrow(SALOMEDS.AttributeStudyProperties)
    -A.SetLocked(0)
    -myBuilder.CommitCommand()
    -
    -#4.
    -myBuilder.NewCommand()
    -A.SetLocked(0);
    -print "A.GetUserName()= ", A.GetUserName()
    -print "A.GetCreationDate() = ", A.GetCreationDate()
    -print "A.GetCreationMode() = ", A.GetCreationMode()
    -print "A.IsModified() = ", A.IsModified()
    -myBuilder.CommitCommand()
    -
    -#5.
    -myBuilder.NewCommand()
    -A.SetUserName("tester1")
    -myBuilder.CommitCommand()
    -print "A.GetUserName()= ", A.GetUserName()
    -
    -#remove the document file
    -os.remove(file)
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example21.html b/doc/salome/tui/KERNEL/exemple/Example21.html deleted file mode 100755 index 981e9d7ff..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example21.html +++ /dev/null @@ -1,136 +0,0 @@ - - - -Exemple - -
    -#^SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open^
    -#^Attribute methods: GetValue, GetNbColumns, AddColumn, SetRowTitles, PutValue, GetColumn, GetColumnTitles, GetTitle, SetRow, GetRowTitles, SetColumnTitles, SetColumn, GetRow, GetNbRows, SetColumnTitle, AddRow, SetTitle, SetRowTitle^
    -
    -#       create AttributeReal      
    -#=======================================================================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeTableOfInteger")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeTableOfInteger attribute"
    -A = A._narrow(SALOMEDS.AttributeTableOfInteger)
    -a=[1,2]
    -
    -b=[3,4]
    -
    -#    2x2
    -# --- rows ---
    -A.AddRow(a)
    -A.AddRow(b)
    -a=[34,14]
    -A.SetRow(1,a)
    -
    -#    3x3
    -#
    -b=[54,56]
    -A.AddRow(b)
    -
    -# --- columns ---
    -a=[76,25,12]
    -
    -A.AddColumn(a)
    -a=[836,3425,342]
    -A.SetColumn(3,a)
    -
    -# change attribute values
    -print "A.GetValue(2,2) = ", A.GetValue(2,2)
    -print "A.PutValue(2,2,625323)"
    -A.PutValue(625323,2,2)
    -print "A.GetValue(2,2) = ", A.GetValue(2,2)
    -
    -#set Titles
    -
    -A.SetTitle("TEST")
    -
    -A.SetRowTitle(1,"FR")
    -A.SetRowTitle(2,"SR")
    -A.SetRowTitle(3,"TR")
    -
    -A.SetColumnTitle(1,"FC")
    -A.SetColumnTitle(2,"SC")
    -A.SetColumnTitle(3,"TC")
    -
    -
    -#check the table
    -print "Common title : ",A.GetTitle()
    -print "Rows titles : ",  A.GetRowTitles()
    -rnb = A.GetNbRows()
    -for i in range(1, rnb):
    -        b=A.GetRow(i)
    -        print b
    -
    -cnb = A.GetNbColumns()
    -print "Columns title : ", A.GetColumnTitles()
    -for i in range(1, cnb):
    -        b=A.GetColumn(i)
    -        print b
    -
    -# set titles
    -#titles=["11","12","13"]
    -#A.SetRowTitles(titles)
    -#titles=["21","22","23"]
    -#A.SetRowTitles(2,titles)
    -#titles=["31","32","33"]
    -#A.SetRowTitles(3,titles)
    -
    -#--------------------------------------------------------------------------#
    -# ----------------------- save the study ----------------------------------#
    -#--------------------------------------------------------------------------#
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -print " -------  We will save to", file, "-----------"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -
    -#--------------------------------------------------------------------------#
    -#---------------------------- Open file -----------------------------------# 
    -#--------------------------------------------------------------------------#
    -
    -print" -------------- Open  " + file + "-------------- " 
    -
    -openedStudy=batchmode_geompy.myStudyManager.Open(file)
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -# --- check attribute ---
    -
    -res,A=father.FindAttribute("AttributeTableOfInteger")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeTableOfInteger"
    -
    -A = A._narrow(SALOMEDS.AttributeTableOfInteger)
    -
    -#check the table
    -print "Common title : ",A.GetTitle()
    -print "Rows titles : ",  A.GetRowTitles()
    -rnb = A.GetNbRows()
    -for i in range(1, rnb):
    -        b=A.GetRow(i)
    -        print b
    -
    -cnb = A.GetNbColumns()
    -print "Columns title : ", A.GetColumnTitles()
    -for i in range(1, cnb):
    -        b=A.GetColumn(i)
    -        print b
    -
    -titles=["ff","ss","tt"]
    -A.SetRowTitles(titles)
    -print "Rows titles : ",  A.GetRowTitles()
    -
    -titles=["ww","zz","cc"]
    -A.SetColumnTitles(titles)
    -print "Column titles : ",  A.GetColumnTitles()
    -
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example22.html b/doc/salome/tui/KERNEL/exemple/Example22.html deleted file mode 100755 index f6a3f6e3b..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example22.html +++ /dev/null @@ -1,137 +0,0 @@ - - - -Exemple - -
    -#^ SALOMEDS methods  : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open^
    -#^ Attribute methods : GetValue, GetNbColumns, AddColumn, SetRowTitles, PutValue,  GetColumn,  GetColumnTitles, GetTitle, SetRow, GetRowTitles, SetColumnTitles,  SetColumn,  GetRow,  GetNbRows, SetColumnTitle, AddRow, SetTitle, SetRowTitle^
    -
    -#       create AttributeReal      
    -#===============================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeTableOfReal")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeTableOfReal attribute"
    -A = A._narrow(SALOMEDS.AttributeTableOfReal)
    -a=[1,2]
    -
    -b=[3,4]
    -
    -#    2x2
    -# --- rows ---
    -A.AddRow(a)
    -A.AddRow(b)
    -a=[34,14]
    -A.SetRow(1,a)
    -
    -#    3x3
    -#
    -b=[54,56]
    -A.AddRow(b)
    -
    -# --- columns ---
    -a=[76,25,12]
    -
    -A.AddColumn(a)
    -a=[836,3425,342]
    -A.SetColumn(3,a)
    -
    -# change attribute values
    -print "A.GetValue(2,2) = ", A.GetValue(2,2)
    -print "A.PutValue(2,2,625323)"
    -A.PutValue(625323,2,2)
    -print "A.GetValue(2,2) = ", A.GetValue(2,2)
    -
    -#set Titles
    -
    -A.SetTitle("TEST")
    -
    -A.SetRowTitle(1,"FR")
    -A.SetRowTitle(2,"SR")
    -A.SetRowTitle(3,"TR")
    -
    -A.SetColumnTitle(1,"FC")
    -A.SetColumnTitle(2,"SC")
    -A.SetColumnTitle(3,"TC")
    -
    -
    -#check the table
    -print "Common title : ",A.GetTitle()
    -print "Rows titles : ",  A.GetRowTitles()
    -rnb = A.GetNbRows() + 1
    -for i in range(1, rnb):
    -        b=A.GetRow(i)
    -        print b
    -
    -cnb = A.GetNbColumns() + 1
    -print "Columns title : ", A.GetColumnTitles()
    -for i in range(1, cnb):
    -        b=A.GetColumn(i)
    -        print b
    -
    -# set titles
    -#titles=["11","12","13"]
    -#A.SetRowTitles(titles)
    -#titles=["21","22","23"]
    -#A.SetRowTitles(2,titles)
    -#titles=["31","32","33"]
    -#A.SetRowTitles(3,titles)
    -
    -#--------------------------------------------------------------------------#
    -#------------------------ save the study ----------------------------------#
    -#--------------------------------------------------------------------------#
    -import os
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -print " -------  We will save to", file, "-----------"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -
    -#--------------------------------------------------------------------------#
    -#---------------------------- Open file -----------------------------------# 
    -#--------------------------------------------------------------------------#
    -
    -print" -------------- Open  " + file + "-------------- " 
    -
    -openedStudy = batchmode_geompy.myStudyManager.Open(file)
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -# --- check attribute ---
    -
    -res,A=father.FindAttribute("AttributeTableOfReal")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeTableOfReal"
    -
    -A = A._narrow(SALOMEDS.AttributeTableOfReal)
    -
    -#check the table
    -print "Common title : ",A.GetTitle()
    -print "Rows titles : ",  A.GetRowTitles()
    -rnb = A.GetNbRows() + 1
    -for i in range(1, rnb):
    -        b=A.GetRow(i)
    -        print b
    -
    -cnb = A.GetNbColumns() + 1
    -print "Columns title : ", A.GetColumnTitles()
    -for i in range(1, cnb):
    -        b=A.GetColumn(i)
    -        print b
    -
    -titles=["ff","ss","tt"]
    -A.SetRowTitles(titles)
    -print "Rows titles : ",  A.GetRowTitles()
    -
    -titles=["ww","zz","cc"]
    -A.SetColumnTitles(titles)
    -print "Column titles : ",  A.GetColumnTitles()
    -
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example23.html b/doc/salome/tui/KERNEL/exemple/Example23.html deleted file mode 100755 index 623170417..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example23.html +++ /dev/null @@ -1,35 +0,0 @@ - - - -Exemple - -
    -import batchmode_salome
    -#import SALOMEDS
    -
    -aStudy = batchmode_salome.myStudy    
    -
    -#Add new component 'User data'
    -aBuilder = aStudy.NewBuilder()
    -aComponent = aBuilder.NewComponent("User data")
    -anAttr = aBuilder.FindOrCreateAttribute(aComponent, "AttributeName")
    -anAttrName = anAttr._narrow(SALOMEDS.AttributeName) 
    -anAttrName.SetValue("User data")
    -
    -
    -#Add a new case 'Case1' to the component 'User data'
    -aBuilder.AddDirectory("/User data/Case1")
    -
    -#Set a study context to '/User data/Case1'
    -aStudy.SetContext("/User data/Case1")
    -
    -#Print the current study context
    -print aStudy.GetContext()
    -
    -#Add a sub directory 'aSubCase' to 'Case1' (under the current context)
    -aBuilder.AddDirectory("aSubCase")
    -
    -
    -#Add a new case 'Case2' to component 'User data'
    -aBuilder.AddDirectory("/User data/Case2")
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example3.html b/doc/salome/tui/KERNEL/exemple/Example3.html deleted file mode 100755 index 477d80cda..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example3.html +++ /dev/null @@ -1,68 +0,0 @@ - - - -Example - -
    #%AttributeSequenceOfReal interface(creations/saving/restoring)%
    -#% AttributeSequenceOfReal  : ChangeValue, Add,  Value,  Remove,  Length%
    -#% SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%
    -
    -#       create AttributeSequenceOfReal      
    -#=================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeSequenceOfReal")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeSequenceOfReal attribute"
    -A = A._narrow(SALOMEDS.AttributeSequenceOfReal)
    -if A == None :
    -        raise  RuntimeError, "_narrow returns None instead of AttributeSequenceOfReal pointer"
    -
    -A.Add(0.0293)
    -A.Add(625.1e+2)
    -A.Add(0.928e+100)
    -A.Add(83.287)
    -
    -print "initial values ",A.Value(1), A.Value(2), A.Value(3), A.Value(4)
    -A.Remove(3)
    -print "after remove ", A.Value(1), A.Value(2), A.Value(3)
    -A.ChangeValue(2,76.265)
    -print "after second item change", A.Value(1), A.Value(2), A.Value(3)
    -
    -if A.Length() != 3:
    -        print "Error : wrong length of SequenceOfReal"
    -if A.Value(1) != 0.0293 or A.Value(2) != 76.265 or A.Value(3) != 83.287:
    -        print "Error : wrong value of  AttributeSequenceOfReal"
    -
    -#      save / restore study      
    -#=================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy=batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find AttributeSequenceOfReal
    -#=================================
    -
    -res,A=father.FindAttribute("AttributeSequenceOfReal")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeSequenceOfReal"
    -
    -A = A._narrow(SALOMEDS.AttributeSequenceOfReal)
    -
    -if A.Length() != 3:
    -        print "Error : wrong length of SequenceOfReal"
    -if A.Value(1) != 0.0293 or A.Value(2) != 76.265 or A.Value(3) != 83.287:
    -        print "Error : wrong value of  AttributeSequenceOfReal"
    -print "after restoring ", A.Value(1), A.Value(2), A.Value(3)
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example4.html b/doc/salome/tui/KERNEL/exemple/Example4.html deleted file mode 100755 index 4539170b6..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example4.html +++ /dev/null @@ -1,66 +0,0 @@ - - - -Example - -
    #%AttributeSequenceOfInteger interface(creations/saving/restoring)%
    -#%SALOMEDS methods : FindOrCreateAttribute FindComponent FindAttribute Open Add SaveAs%
    -#%AttributeSequenceOfInteger methods :  Value, Remove, Length%
    -
    -#       create AttributeSequenceOfInteger      
    -#==========================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeSequenceOfInteger")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeSequenceOfInteger attribute"
    -A = A._narrow(SALOMEDS.AttributeSequenceOfInteger)
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeSequenceOfInteger attribute"
    -
    -A.Add(100)
    -A.Add(300)
    -A.Add(500)
    -A.Add(400)
    -A.Add(700)
    -
    -A.Remove(3)
    -A.ChangeValue(4,500)
    -
    -
    -if A.Length() != 4:
    -        print "Wrong length of SequenceOfInteger"
    -if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 700:
    -        print "Wrong  value of  AttributeSequenceOfInteger"
    -
    -
    -#      save / restore study      
    -#=================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy=batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find AttributeSequenceOfInteger
    -#======================================
    -
    -res,A=father.FindAttribute("AttributeSequenceOfInteger")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeSequenceOfInteger"
    -
    -A = A._narrow(SALOMEDS.AttributeSequenceOfInteger)
    -
    -if A.Length() != 4:
    -        print "Wrong length of SequenceOfInteger"
    -if A.Value(1) != 100 or A.Value(2) != 300 or A.Value(3) != 400 or A.Value(4) != 700:
    -        print "Wrong  value of  AttributeSequenceOfInteger"
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example5.html b/doc/salome/tui/KERNEL/exemple/Example5.html deleted file mode 100755 index 79be2e442..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example5.html +++ /dev/null @@ -1,58 +0,0 @@ - - - -Example - -
    #%AttributeName interface(creations/saving/restoring)%
    -#%SALOMEDS methods : FindOrCreateAttribute,  SaveAs, FindComponent FindAttribute Open%
    -#%Attribute methods : SetValue, Value%
    -
    -#              create AttributeName     
    -#===========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeName")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A = A._narrow(SALOMEDS.AttributeName)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -A.SetValue("AttributesTesting")
    -
    -if A.Value() != "AttributesTesting":
    -        print "Wrong  value of AttributeName"
    -
    -
    -#      save / restore study      
    -#=================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy = batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find AttributeName
    -#======================================
    -
    -res,A=father.FindAttribute("AttributeName")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeName"
    -
    -A = A._narrow(SALOMEDS.AttributeName)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeName attribute"
    -
    -if A.Value() != "AttributesTesting":
    -        print "Wrong  value of AttributeName"
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example6.html b/doc/salome/tui/KERNEL/exemple/Example6.html deleted file mode 100755 index 197c6b3b1..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example6.html +++ /dev/null @@ -1,56 +0,0 @@ - - - -Example - -
    #%AttributeComment interface(creations/saving/restoring)%
    -#%SALOMEDS methods : FindOrCreateAttribute, SaveAs FindComponent FindAttribute  Open%
    -#%Attribute methods : Value, SetValue%
    -
    -#              create     AttributeComment 
    -#===========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeComment")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeComment attribute"
    -A = A._narrow(SALOMEDS.AttributeComment)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeComment attribute"
    -
    -A.SetValue("GEOM")
    -
    -
    -#      save / restore study      
    -#============================================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy = batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#      find    AttributeComment
    -#============================================================
    -
    -res,A=father.FindAttribute("AttributeComment")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeComment"
    -
    -A = A._narrow(SALOMEDS.AttributeComment)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeComment attribute"
    -
    -if A.Value() != "GEOM":
    -        "Error: wrong value of AttributeComment"
    -
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example7.html b/doc/salome/tui/KERNEL/exemple/Example7.html deleted file mode 100755 index 9bf85152b..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example7.html +++ /dev/null @@ -1,55 +0,0 @@ - - - -Example - -
    #%AttributePersistentRef interface(creations/saving/restoring)%
    -#%SALOMEDS methods : FindOrCreateAttribute,  SaveAs, FindComponent FindAttribute Open%
    -#%Attribute methods : SetValue, Value%
    -
    -#              create   AttributePersistentRef   
    -#===========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributePersistentRef")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributePersistentRef attribute"
    -A = A._narrow(SALOMEDS.AttributePersistentRef)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributePersistentRef attribute"
    -
    -A.SetValue("/tmp/test;1")
    -
    -#      save / restore study      
    -#============================================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy = batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find AttributePersistentRef
    -#============================================================
    -
    -res,A=father.FindAttribute("AttributePersistentRef")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributePersistentRef"
    -
    -A = A._narrow(SALOMEDS.AttributePersistentRef)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributePersistentRef attribute"
    -
    -if A.Value() != "/tmp/test;1":
    -        "Error: wrong value of AttributePersistentRef"
    -
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example8.html b/doc/salome/tui/KERNEL/exemple/Example8.html deleted file mode 100755 index db962290a..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example8.html +++ /dev/null @@ -1,64 +0,0 @@ - - - -Example - -
    #%AttributeDrawable interface(creations/saving/restoring)%
    -#%SALOMEDS methods : FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%
    -#%Attribute methods : SetDrawable, IsDrawable% 
    -#--------------------------------------------------------------------------
    -
    -from batchmode_geompy import *
    -import os
    -
    -#--------------------------------------------------------------------------
    -#              create    AttributeDrawable  
    -#===========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeDrawable")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeDrawable attribute"
    -A = A._narrow(SALOMEDS.AttributeDrawable)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeDrawable attribute"
    -
    -A.SetDrawable(1)
    -
    -if A.IsDrawable() == 0:
    -        "Error: wrong value of AttributeDrawable"
    -
    -
    -#      save / restore study      
    -#============================================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy=batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find   AttributeDrawable
    -#============================================================
    -
    -res,A=father.FindAttribute("AttributeDrawable")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeDrawable"
    -
    -A = A._narrow(SALOMEDS.AttributeDrawable)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeDrawable attribute"
    -
    -if A.IsDrawable() == 0:
    -        "Error: wrong value of AttributeDrawable"
    -
    -
    \ No newline at end of file diff --git a/doc/salome/tui/KERNEL/exemple/Example9.html b/doc/salome/tui/KERNEL/exemple/Example9.html deleted file mode 100755 index 6809dab3c..000000000 --- a/doc/salome/tui/KERNEL/exemple/Example9.html +++ /dev/null @@ -1,59 +0,0 @@ - - - -Example - -
    #%AttributeSelectable interface(creations/saving/restoring)%
    -#%SALOMEDS methods: FindOrCreateAttribute, SaveAs, FindComponent, FindAttribute, Open%
    -#%Attribute methods: SetSelectable, IsSelectable%
    -
    -#              create    AttributeSelectable  
    -#===========================================================
    -A = batchmode_geompy.myBuilder.FindOrCreateAttribute(batchmode_geompy.father, "AttributeSelectable")
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeSelectable attribute"
    -A = A._narrow(SALOMEDS.AttributeSelectable)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeSelectable attribute"
    -
    -A.SetSelectable(1)
    -
    -if A.IsSelectable() == 0:
    -        "Error: wrong value of AttributeSelectable"
    -
    -
    -#      save / restore study      
    -#============================================================
    -str= os.getenv("TmpDir")
    -if str == None:
    -        str = "/tmp"
    -file = str+"/test.hdf"
    -
    -batchmode_geompy.myStudyManager.SaveAs(file, batchmode_geompy.myStudy)
    -openedStudy = batchmode_geompy.myStudyManager.Open(file);
    -
    -if openedStudy == None:
    -        raise  RuntimeError, "Can't open saved study!"
    -
    -father = openedStudy.FindComponent("GEOM")
    -if father is None:
    -         raise  RuntimeError, "Geom component is not found!  Wrong study is opened." 
    -
    -
    -#     find   AttributeSelectable
    -#============================================================
    -
    -res,A=father.FindAttribute("AttributeSelectable")
    -if res == 0 or A == None:
    -        raise  RuntimeError, "Error:  not found AttributeSelectable"
    -
    -A = A._narrow(SALOMEDS.AttributeSelectable)
    -
    -if A == None :
    -        raise  RuntimeError, "Can't create AttributeSelectable attribute"
    -
    -if A.IsSelectable() == 0:
    -        "Error: wrong value of AttributeSelectable"
    -
    -
    \ 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 deleted file mode 100755 index cf7ab8ba025d6bd9212f8bd5681e77d1aaef8e4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14327 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 Ao&W#< diff --git a/doc/salome/tui/KERNEL/sources/application.gif b/doc/salome/tui/KERNEL/sources/application.gif deleted file mode 100644 index 0b05d5c18ee88779d283508781836e2b151f606f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2602 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 diff --git a/doc/salome/tui/KERNEL/sources/doxygen.css b/doc/salome/tui/KERNEL/sources/doxygen.css deleted file mode 100755 index 88e613d23..000000000 --- a/doc/salome/tui/KERNEL/sources/doxygen.css +++ /dev/null @@ -1,170 +0,0 @@ -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/html_comments.gif b/doc/salome/tui/KERNEL/sources/html_comments.gif deleted file mode 100755 index f0c0f0b47100447f7d3a8104b0b4930c548f5437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmV;N0Av40Nk%w1VQT;h0Du4hv>+h=|NkNW6+?1mVRU6=Aa`kWXdqN*WgtgMO;7+K z`2+z90096j00000YXAuV00LT!kEzS;4#1l<$#<*OH8amG5(oyRc7{m0hHSLOstHBc z2p=%3&u96YxeS>bktgh7J}aBf$+6{%G-U^B!de@_Bt+>MZM~unISNh_&rFnzZP`Jm KJ9x`c0029x$~vY1 diff --git a/doc/salome/tui/KERNEL/sources/kernel_about_4.png b/doc/salome/tui/KERNEL/sources/kernel_about_4.png deleted file mode 100644 index 5c9c09a795758f733b327c4e39d9d7d80ad6943b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134730 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

    KVHX9C@uxw!Yt;J6lmZ@Z@ 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

    eTAqSYsScu0q%7_n~s*`{vm1A?zx(1UW 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 diff --git a/doc/salome/tui/KERNEL/sources/occ.gif b/doc/salome/tui/KERNEL/sources/occ.gif deleted file mode 100755 index ce017c8ae11236ef5c52eee1723657cb8b08989f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14790 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⁣iMxf-qnJ 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 diff --git a/doc/salome/tui/KERNEL/sources/static/Link.gif b/doc/salome/tui/KERNEL/sources/static/Link.gif deleted file mode 100755 index 75330d0c82be86f95a77075a906d8fb6b4af6e72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13959 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 M)V!}C!ol$TKY@nC6951J diff --git a/doc/salome/tui/KERNEL/sources/static/SObject.gif b/doc/salome/tui/KERNEL/sources/static/SObject.gif deleted file mode 100755 index 1d4e9cb24adb525809f8e97a21e96ecdafd4c11b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4966 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 diff --git a/doc/salome/tui/KERNEL/sources/static/Study_Struct.gif b/doc/salome/tui/KERNEL/sources/static/Study_Struct.gif deleted file mode 100755 index bc0ce35be243b94242ac361985adf86c250a071e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5833 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 diff --git a/doc/salome/tui/KERNEL/sources/static/doxygen.css b/doc/salome/tui/KERNEL/sources/static/doxygen.css deleted file mode 100755 index 88e613d23..000000000 --- a/doc/salome/tui/KERNEL/sources/static/doxygen.css +++ /dev/null @@ -1,170 +0,0 @@ -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 deleted file mode 100755 index beb74ae4f..000000000 --- a/doc/salome/tui/KERNEL/sources/static/examples_Kernel.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - Main Page - - - - -   -

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

    Examples

    - Package SALOME_ModuleCatalog
    -
    -      interface SALOME_ModuleCatalog::ModuleCatalog
    -
    -Package SALOME
    -
    -   
    interface SALOME::Session
    -
    -Package Engines
    -   

    -    interface Engines::Container
    -

    -   
    -   

    -
    -
        SALOME_ModuleCatalog::ModuleCatalog interface -
    -
    -
    -

    -
    -

    -Acomponent -GetComponent (in string componentname)
    -
    -See the example below
    -
    -
    -
    -
    SALOME::Session interface

    -

    -
    -GetInterface (), StopSession () raises (GUIActive, RunningStudies)
    -
    -Stop session and restart GUI application:
    -
    -mySession.StopSession()
    -
    -mySession.GetInterface()
    -
    -
    -
    Engines::Container -interface
    -
    -
    -
    Component -load_impl (in string nameToRegister, in string componentName)
    -
    -Load component with defined component name:
    -
    -compinfo = module_catalog.GetComponent(componentName)
    -
    - try:
    -    machineName = theComputer # name of machine
    -    path = compoinfo.GetPathPrefix(machineName) + "/"
    - except SALOME_ModuleCatalog.NotFound, ex:
    -    MESSAGE( "machine " + machineName + " not found in Module -Catalog" )
    -    MESSAGE( "trying localhost" )
    -    try:
    -    path = compoinfo.GetPathPrefix("localhost") + "/"
    -    except SALOME_ModuleCatalog.NotFound, ex:
    -    path = ""
    -
    -implementation = path + "lib" + componentName + "Engine.so"
    -MESSAGE( "Trying to load " + implementation )
    -
    - try:
    -
        component = container.load_impl(componentName, -implementation) # Loads into the container a new component, registers -it and starts it's CORBA servant.
    -
    -    MESSAGE( "component " + component._get_instanceName() -+ " launched !" )
    -    return component
    -except:
    -    MESSAGE( "component " + componentName + " NOT launched -!" )
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    - - diff --git a/doc/salome/tui/KERNEL/sources/static/examples_Life_cycle.html b/doc/salome/tui/KERNEL/sources/static/examples_Life_cycle.html deleted file mode 100755 index 080112eb4..000000000 --- a/doc/salome/tui/KERNEL/sources/static/examples_Life_cycle.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - Main Page - - - - -   -
    - - - - - - - - -
    - - -
    -
    - -

    Examples

    - //There is a CXX example of LifeCycleCORBA using
    -

    -#include CORBA_CLIENT_HEADER(TestComponent)
    -#include "SALOME_NamingService.hxx"
    -#include "SALOME_LifeCycleCORBA.hxx"
    -
    -int main (int argc, char * argv[]){
    -  try {
    -      // Initializing omniORB
    -
          CORBA::ORB_var orb = CORBA::ORB_init(argc, -argv);
    -   
    -      // Obtain a reference -to the root POA
    -
          CORBA::Object_var obj = orb->resolve_initial_references("RootPOA") -;
    -      PortableServer::POA_var poa = PortableServer::POA::_narrow(obj) -;
    -   
    -      SALOME_NamingService _NS(orb) ;
    -
    -      SALOME_LifeCycleCORBA _LCC(&_NS) ;
    -
    -      Engines::Component_var myComponent = _LCC.FindOrLoad_Component("FactoryServerPy","TestComponentPy");
    -       if(!CORBA::is_nil(myComponent)){
    -          Engines::TestComponent_var -myConcreateComponent = TestComponent::_narrow(myComponent);
    -          //do something -what you like with the interface
    -          ...
    -
              return 0;
    -       }
    -    }
    -  catch(CORBA::COMM_FAILURE& ex){
    -      cout<<"Caught system exception COMM_FAILURE --- unable to contact the object.\n";
    -  }catch(CORBA::SystemException&){
    -      cout<<"Caught a CORBA::SystemException.\n";
    -  }catch(CORBA::Exception&){
    -      cout<<"Caught CORBA::Exception.\n";
    -  }catch(...){
    -      cout<<"Caught unknown exception.\n";
    -  }
    -  return 1;
    -}
    -
    -#The example may be rewritten on Python like this:
    -

    -from omniORB import CORBA
    -from SALOME_TestComponent import *
    -from SALOME_NamingServicePy import *
    -from LifeCycleCORBA import *
    -
    -try:
    -    orb = CORBA.ORB_init(sys.argv,CORBA.ORB_ID)
    -    _NS = SALOME_NamingService(orb)
    -    _LCC = SALOME_LifeCycleCORBA(orb)
    -
    -     myComponent = _LCC.FindOrLoadComponent("FactoryServerPy","TestComponentPy");
    -     myConcreatComponent = myComponent._narrow(TestComponent)
    -    if myConcreatComponent is not None :
    -        //do something what you like with the -interface
    -         ...
    -
            return 0
    -    }
    -except CosNaming.NamingContext.NotFound, e :
    -    print "Caught exception: Naming Service can't found Logger"
    -except CORBA.COMM_FAILURE, e:
    -    print "Caught CORBA::SystemException CommFailure"
    -except CORBA.SystemException, e:
    -    print "Caught CORBA::SystemException."
    -except CORBA.Exception, e:
    -    print "Caught CORBA::Exception."
    -except Exception, e:
    -    print "Caught unknown exception."
    -  
    -
    -
    - - diff --git a/doc/salome/tui/KERNEL/sources/static/examples_Naming.html b/doc/salome/tui/KERNEL/sources/static/examples_Naming.html deleted file mode 100755 index ac08a6753..000000000 --- a/doc/salome/tui/KERNEL/sources/static/examples_Naming.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - Main Page - - - - -   -
    - - - - - - - - -
    - - -
    -
    - -

    Examples

    - #There is a python example of using SALOME_NamingService
    -

    -from omniORB import CORBA
    -from time import sleep
    -from LifeCycleCORBA import *
    -from SALOME_NamingServicePy import *
    -
    -# initialise the ORB
    -
    orb = CORBA.ORB_init([''], CORBA.ORB_ID)
    -
    -# create an LifeCycleCORBA instance
    -
    myLifeCycleCORBA = LifeCycleCORBA(orb)
    -
    -#create a naming service instance
    -
    naming_service = SALOME_NamingServicePy_i(orb)
    -
    -mySession = myNamingService.Resolve("/Kernel/Session")
    -mySession.GetInterface()
    -sleep(10)
    -myLocalVisu = myLifeCycleCORBA.FindOrLoadComponent("FactoryServer", "Visu")
    -
    -
    -//There is some part of a code written by C++
    -

    -SALOME_NamingService aNamingService(orb);
    -CORBA::Object_ptr anObject = aNamingService.Resolve("/Kernel/Session");
    -SALOME::Session_var aSession = SALOME::Session::_narrow(anObject);
    -Engines::Component_var aComponent = aSession->GetVisuGen();
    -myVisuGen = VISU::VISU_Gen::_narrow(aComponent);
    -
    - - diff --git a/doc/salome/tui/KERNEL/sources/static/examples_Study.html b/doc/salome/tui/KERNEL/sources/static/examples_Study.html deleted file mode 100755 index 859f6297f..000000000 --- a/doc/salome/tui/KERNEL/sources/static/examples_Study.html +++ /dev/null @@ -1,790 +0,0 @@ - - - - - - - - Main Page - - - - -   -
    - - - - - - - - -
    - - -
    -
    - -

    Examples

    -
    -
    - -
          Interfaces:
    -
    -       SALOMEDS::Study
    -       SALOMEDS::StudyBuilder
    -       SALOMEDS::StudyManager
    -       SALOMEDS::SObject
    -      SALOMEDS::SComponent
    -       SALOMEDS::SComponentIterator
    -       SALOMEDS::ChildIterator
    -
          SALOMEDS::AttributeComment
    -      
    -
    -
    -
    -
    - -
          SALOMEDS::Study interface
    -
    - -

    -
    -
    -
    -
    SComponent FindComponent( -in string aComponentName )
    -
    - Find GEOMETRY component in the opened study by its name:

    -
    -     str= os.getenv("TmpDir")
    -     if str == None:
    -         str = "/tmp"
    -     file = str+"/test.hdf"
    -
    -     openedStudy=batchmode_geompy.myStudyManager.Open(file)
    -
    -     father = openedStudy.FindComponent("GEOM")
    -     if father is None:
    -          raise  RuntimeError, "Geom - component is not found!  Wrong study is opened."
    -
    -
    -
    - -
    SObject FindObject ( in string -anObjectName )
    -
    - Find the SObject of the box by its NameAttribute "box":
    -
    - -

    -
    - -
    box = openedStudy.FindObject("box")
    - if box is None :
    -     raise  RuntimeError, "box was not found! Wrong -study is opened."
    -
    -
    - SObject FindObjectID - ( in ID aObjectID -)
    - #result: "/User data/Case1".
    -
    Find - the SObject of the box by its ID "0:1:1:2":
    -
    -
    - -
    box =openedStudy.FindObjectID("0:1:1:2")
    -
    - -
    if box is None :
    -     raise  RuntimeError, "box was not found! Wrong -ID is used."
    -
    -
    - SObject FindObjectIOR - ( in ID  aObjectIOR -)
    -
    - Find the SObject of the result on imported MED file -by it's IOR:
    -
    - theResult = myVisu.ImportFile(medFile)
    - aSObj = myStudy.FindObjectIOR(theResult.GetID())
    -
    -
    - SObject - FindObjectByPath ( in string thePath )
    -
    - Find SObject by path to it:
    -
    - # create new auxiliary componen
    t
    - aComponent = myStudyBuilder.NewComponent("Virtual Component")
    -
    - # create auxiliary subtree
    - aPath = "/Virtual Component/Case1"
    - myStudyBuilder.AddDirectory(aPath)
    -
    - aSObj = myStudy.FindObjectByPath(aPath)
    -
    -
    - void SetContext ( in string thePath) / - string GetContext ()
    -
    - Set context of the study to the created case and get it for printing:
    -
    - aComponent = myStudyBuilder.NewComponent("User data")
    - anAttr = aBuilder.FindOrCreateAttribute(aComponent, "AttributeName")
    - anAttrName = anAttr._narrow(SALOMEDS.AttributeName)
    - anAttrName.SetValue("User data")
    -
    - #Add a new case 'Case1' to the component 'User data'
    - aBuilder.AddDirectory("/User data/Case1")
    -
    - #Set a study context to '/User data/Case1'
    - aStudy.SetContext("/User data/Case1")
    -
    - #Print the current study context
    - print aStudy.GetContext()
    -
    -
    #result: "/User data/Case1".

    -
    -
    - ChildIterator - NewChildIterator ( in SObject aSO )
    -
    - Import med file and print all mesh names that this file includes -(mesh is a child of the result of imported file):
    -
    - # define file name
    - aFileName = datadir + "fra.med"
    -
    - # import file in visu module and get result
    - theVisu = batchmode_visu.myVisu
    - aResult = theVisu.ImportFile(aFileName)
    - if aResult is None : raise RuntimeError, "Error"
    - else : print "OK"
    -  
    - # get current study and its' SObject        -
    - myLocalStudy = theVisu.GetCurrentStudy()
    - aSObj = myLocalStudy.FindObjectIOR(aResult.GetID())
    - if aSObj is None : raise RuntimeError, "Error"
    - else : print "OK"
    -
    - # create iterator by SObject of the current study
    - aMeshIter = myLocalStudy.NewChildIterator(aSObj);
    -
    - # iterating in the current study (with the help of created iterator) -to find all mesh names  
    - while aMeshIter.More() :
    -         aMeshSObj = aMeshIter.Value()
    -         aMeshIter.Next()
    -         anAttr = aMeshSObj.FindAttribute("AttributeName")[1]
    -         if anAttr is None :
    -             aMeshSObj - = aMeshIter.Value()
    -             aMeshIter.Next()
    -             anAttr - = aMeshSObj.FindAttribute("AttributeName")[1]
    -         anAttr = anAttr._narrow(SALOMEDS.AttributeName);
    -         aMeshName = anAttr.Value()
    -         print "  ", aMeshName
    -
    -
    - SComponentIterator -NewComponentIterator ()
    -
    - Find the number an names of all components in the study:
    -
    - aCompItr = myStudy.NewComponentIterator()
    -
    - compNb = 0
    - while aCompItr.More():
    -     aComp = aCompItr.Value()
    -     aName = aComp.ComponentDataType()
    -     print "Component name = ", aName
    -     compNb += 1
    -     aCompItr.Next()
    -
    -
    - StudyBuilder -NewBuilder ()
    -
    -
    -
    - Create a new StudyBuilder (uses to add or modify an object in the -study ):
    -
    - myBuilder = myStudy.NewBuilder()
    -
    -
    - AttributeStudyProperties -GetProperties ()
    -
    - Get the attribute, which contains the properties of the study, and -change properties of the study by changing it:
    -
    - aProperties = myStudy.GetProperties()
    - if aProperties == None :
    -     raise  RuntimeError, "Can't create AttributeStudyProperties -attribute"
    - aProperties = aProperties._narrow(SALOMEDS.AttributeStudyProperties)
    -
    - A = aProperties
    -
    - # print stydy properties
    - print "A.GetUserName()= ", A.GetUserName()
    - res,mm,hh,dd,mnth,yy=A.GetCreationDate()
    - print "A.GetCreationDate() = ", mm,hh,dd,mnth,yy
    - print "A.GetCreationMode() = ", A.GetCreationMode()
    - print "A.IsModified() = ", A.IsModified()
    - print "A.IsLocked() = ", A.IsLocked()
    -
    - # change the properties of the study
    - if A.IsLocked() == 0 :
    -     A.SetUserName("tester"); print 'A.SetUserName("tester"), -A.GetUserName() = ', A.GetUserName()
    -     A.SetCreationDate(11,11,11,11,2002); print 'A.SetCreationDate(11,11,11,11,2002), -A.GetCreationDate() =', A.GetCreationDate()
    -     print "A.IsModified() = ", A.IsModified()
    - A.SetLocked(1)
    -
    -
    - boolean IsModified ()
    -
    - Find if study is modified:
    -
    - IsModified = myStudy.IsModified()
    -
    - if IsModified == 1:
    -     print "The study is modified and not saved"
    -
    -
    - boolean IsEmpty ()
    -
    - Find if study is empty:
    -
    - IsEmpty = myStudy.IsEmpty()
    -
    - if IsEmpty == 1:
    -     print "The study is empty"
    -
    -
    -
    -
    - -
    SALOMEDS::StudyBuilder -interface
    -
    -
    -
    -
    - SComponent -NewComponent ( in string ComponentDataType )
    -
    - Create Geometry SComponent:
    -
    - myBuilder = myStudy.NewBuilder()
    - father = myBuilder.NewComponent("GEOM")
    -
    -
    - void DefineComponentInstance ( in SComponent aComponent, -in Object ComponentIOR )

    -
    - Define the instance to the created geometry component:
    -
    - # find geom component
    - myLCC = batchmode_salome.lcc
    - geom = myLCC.FindOrLoadComponent("FactoryServer", "Geometry")
    - geom = geom._narrow(GEOM.GEOM_Gen)
    - geom.GetCurrentStudy(myStudyId)
    -
    - myBuilder = myStudy.NewBuilder()
    -
    - father = myBuilder.NewComponent("GEOM")
    - myBuilder.DefineComponentInstance(father,geom)
    -
    -
    - SObject -NewObject ( in SObject theFatherObject -)
    -
    - Create box and add it to study:
    -
    - from batchmode_geompy import *
    -
    - # create a box
    - box = geom.MakeBox(0,0,0,100,100,150)
    -
    - ior = orb.object_to_string(box)
    - box._set_Name(ior)     
    -
    - # create Geometry SComponent
    - father = myBuilder.NewComponent("GEOM")
    - A1 = myBuilder.FindOrCreateAttribute(father, "AttributeName");
    - FName = A1._narrow(SALOMEDS.AttributeName)
    - FName.SetValue("Geometry")
    - myBuilder.DefineComponentInstance(father,geom)
    -
    - # add box to Study
    - myBuilder.NewCommand()
    - newObj = myBuilder.NewObject(father)
    - A1 = myBuilder.FindOrCreateAttribute(newObj, "AttributeIOR");
    - ObjIOR = A1._narrow(SALOMEDS.AttributeIOR)
    - ObjIOR.SetValue(ior)
    - A2 = myBuilder.FindOrCreateAttribute(newObj, "AttributeName");
    - ObjName = A2._narrow(SALOMEDS.AttributeName)
    - ObjName.SetValue("Common_operation")
    - id = newObj.GetID()
    - box._set_StudyShapeId(id)
    - myBuilder.CommitCommand()
    -
    -
    - void RemoveObject ( in SObject anObject )
    -
    - # Remove CutPlanes SObject from the StudyBuilder (delete cutplanes):
    -
    - SObj=myStudy.FindObjectIOR(cutplanes.GetID())
    - myBuilder = newStudy.NewBuilder()
    - myBuilder.RemoveObject(SObj)
    -
    -
    - void LoadWith ( in SComponent sco, in -Driver Engine -) raises (SALOME::SALOME_Exception)

    -
    - # Load Visu component:
    -
    - myBuilder = openedStudy.NewBuilder()
    - SCom=openedStudy.FindComponent("VISU")
    - myBuilder.LoadWith(SCom ,myVisu)
    -
    -
    - GenericAttribute -FindOrCreateAttribute ( in SObject anObject,  -in string aTypeOfAttribute)
    -
    - Create AttributeName attribute for created component an set value -to it:
    -
    - myBuilder = myStudy.NewBuilder()
    - aComponent = myBuilder.NewComponent("User data")
    -
    - anAttr = myBuilder.FindOrCreateAttribute(aComponent, "AttributeName")
    -
    - anAttrName = anAttr._narrow(SALOMEDS.AttributeName)
    - anAttrName.SetValue("User data")
    -
    -
    - boolean FindAttribute ( in SObject anObject, out GenericAttribute -anAttribute, in string aTypeOfAttribute )
    -
    -
    Find AttributeName attribute of the field and print the -field name:
    -
    - aFieldSObj  = myStudy.FindObject("Head, -")
    -
    - myStudyBuilder.FindAttribute( aFieldSObj, anAttr, "AttributeName")
    - if res == 0:
    -     raise  RuntimeError, "Error:  Attribute not -found"
    -
    - anAttr = anAttr._narrow(SALOMEDS.AttributeName);
    - aFieldName = anAttr.Value()
    - print "      ", aFieldName
    -
    -
    - void RemoveAttribute ( in SObject anObject, in -string aTypeOfAttribute )
    -
    -
    Remove AttributeSelectable attribute of the field SObject:
    -
    -
    aFieldSObj  = myStudy.FindObject("Head, -")
    -
    - myStudyBuilder.RemoveAttribute( aFieldSObj, "AttributeSelectable")
    -
    -
    -
    void Addreference ( in  SObject -anObject, in  SObject theReferencedObject -)

    -
    - Create a reference between created SObject and the existing field:
    -
    - aFieldSObj  = myStudy.FindObject("Head, -")
    - aNewSObj = myBuilder.NewObject(myVisu)
    -
    - myBuilder.Addreference(aFieldSObj, aNewSObj)
    -
    -
    -
    void -NewCommand ()
    -
    -
    Create new command wich containes actions for changing the -properties of the study:
    -
    -
    A = myStudy.GetProperties()
    - A = aProperties._narrow(SALOMEDS.AttributeStudyProperties)
    -
    - myBuilder = myStudy.NewBuilder()
    -
    - myBuilder.NewCommand() # creates a new command
    -
    - # change the properties of the study
    - if A.IsLocked() == 0 :
    -     A.SetUserName("tester"); print 'A.SetUserName("tester"), -A.GetUserName() = ', A.GetUserName()
    -     A.SetCreationDate(11,11,11,11,2002); print 'A.SetCreationDate(11,11,11,11,2002), -A.GetCreationDate() =', A.GetCreationDate()
    -     print "A.IsModified() = ", A.IsModified()
    - A.SetLocked(1)
    -
    -
    myBuilder.CommitCommand() # commits all actions declared -within the created command
    -
    -
    - void CommitCommand()
    -

    -
    See the end of the previous example
    -
    -
    - void AbortCommand ()

    -
    - Create new command wich containes actions for changing -the properties of the study, cancel all declared actions:
    -
    - A = myStudy.GetProperties()
    - A = aProperties._narrow(SALOMEDS.AttributeStudyProperties)
    -
    - myBuilder = myStudy.NewBuilder()
    -
    - myBuilder.NewCommand() # creates a new command
    -
    - # change the properties of the study
    - if A.IsLocked() == 0 :
    -     A.SetUserName("tester"); print 'A.SetUserName("tester"), -A.GetUserName() = ', A.GetUserName()
    -     A.SetCreationDate(11,11,11,11,2002); print 'A.SetCreationDate(11,11,11,11,2002), -A.GetCreationDate() =', A.GetCreationDate()
    -     print "A.IsModified() = ", A.IsModified()
    - A.SetLocked(1)
    -
    -
    myBuilder.AbortCommand() # abort all actions declared -within the created command
    -
    -
    - void Undo () raises (LockProtection) -,
    - void Redo () raises (LockProtection)
    -
    - Create new command wich containes actions for changing -the properties of the study,
    - cancel all declared actions and then redo it with the help of undo/redo -mechanism:

    -
    - A = myStudy.GetProperties()
    - A = aProperties._narrow(SALOMEDS.AttributeStudyProperties)
    -
    - myBuilder = myStudy.NewBuilder()
    -
    - myBuilder.NewCommand() # creates a new command
    -
    - # change the properties of the study
    - if A.IsLocked() == 0 :
    -     A.SetUserName("tester"); print 'A.SetUserName("tester"), -A.GetUserName() = ', A.GetUserName()
    -     A.SetCreationDate(11,11,11,11,2002); print 'A.SetCreationDate(11,11,11,11,2002), -A.GetCreationDate() =', A.GetCreationDate()
    -     print "A.IsModified() = ", A.IsModified()
    - A.SetLocked(1)
    -
    -
    myBuilder.CommitCommand() # commits all actions declared -within the created command
    -
    -
    myBuilder.Undo() # cancels all actions of the command
    -
    -
    myBuilder.Redo() # redoes all actions of the command
    -
    -
    -
    -
    -
    SALOMEDS::StudyManager -interface
    -
    -
    -
    -
    -
    Study -NewStudy ( in string study_name )
    -
    - Create the study with the name "Test_Study":

    -
    - myNewStudy = myStudyManager.NewStudy("Test_Study")
    -
    -
    - Study Open -( in URL -aStudyUrl ) raises (SALOME::SALOME_Exception)
    -
    - Open the study saved in the HDF file:
    -
    - file = 'saved_study.hdf'
    -
    - openedStudy=myStudyManager.Open(file)
    -
    - if openedStudy == None:
    -     raise  RuntimeError, "Can't open saved study!"
    -
    -
    - void Save (in Study aStudy, in boolean -theMultifile )
    -
    -
    Open study, import med file into it and save with the old -path and filename:
    -
    -
    file = "saved_study.hdf"
    - myMedFile ="medfile.med"
    -
    - openedStudy=myStudyManager.Open(file)
    -
    - myVisu.SetCurrentStudy(openedStudy)
    - myResult = myVisu.ImportFile(myMedFile)
    -
    - myStudyManager.Save(openedStudy, 0)
    -
    -
    - void SaveAs ( in URL -aUrl, in  Study aStudy, - 
    in boolean theMultifile -)
    -
    - Open study from the file and resave it in several files (using -Multifile option while saving)
    -
    -
    file = "saved_study.hdf"
    - newfile = "resaved_study.hdf"
    -
    - openedStudy=myStudyManager.Open(file)
    - myStudyManager.SaveAs(newfile, openedStudy, 1)
    -
    -
    - void Close ( in  Study aStudy )

    -
    - Close just opened study:
    -
    - file = "saved_study.hdf"
    -
    - openedStudy=myStudyManager.Open(file)
    - myStudyManager.Close(openedStudy)
    -
    -
    -
    - -
    SALOMEDS::SObject interface
    -
    -
    -
    -
    - ID GetID ()
    -
    - Create new SObject and get its ID:
    -
    - mySObj = myBuilder.NewObject(myFather)
    -
    - myID =  mySObj.GetID()
    -
    -
    - SComponent -GetFatherComponent ()
    -
    - Get father component of the SObject:
    -
    - myFather = mySObj.GetFatherComponent();
    -
    -
    - boolean FindAttribute ( out GenericAttribute anAttribute, -in string aTypeOfAttribute )
    -
    - Find the AttributeName attribute of the field:
    -
    - aFieldSObj  = myStudy.FindObject("Head, -")
    -
    - res = aFieldSObj.FindAttribute( anAttr, "AttributeName")
    - if res == 0:
    -     raise  RuntimeError, "Error:  Attribute not -found"
    -
    -
    - ListOfAttributes -GetAllAttributes ()
    -
    - Get list of all attributes of the SObject, find the number of attributes:
    -
    - attrs = mySObj.GetAllAttributes()
    - aLen = len(attrs) # number of attributes
    -
    -
    -
    -
    - -
    SALOMEDS::SComponent interface
    -
    -
    -
    -
    - string ComponentDataType ()
    -
    - Print names of all components wich -the study contains:
    -
    - aCompItr = myStudy.NewComponentIterator()
    -
    - while aCompItr.More():
    -     aComp = aCompItr.Value()
    -     aName = aComp.ComponentDataType()
    -     print "Component name = ", aName
    -     aCompItr.Next()
    -
    -
    - Other methods are inherited.
    -
    -
    -
    -
    - -
    SALOMEDS::SComponentIterator - interface
    -
    -
    -
    -
    - boolean More (), void Next (), SComponent Value -()
    -
    - See another -example
    -
    -   
    -
    - -
    SALOMEDS::ChildIterator - interface
    -
    -
    -
    -
    - boolean More () , void Next (), SObject Value ()
    -
    - Print all mesh names of imported MED file with the help of ChildIterator:
    -
    - aResult = myVisu.ImportFile("MedFile.med")
    -        
    - myStudy = theVisu.GetCurrentStudy()
    - aSObj = myLocalStudy.FindObjectIOR(aResult.GetID())
    -
    - aMeshIter = myLocalStudy.NewChildIterator(aSObj);  # creating new -child iterator
    -
    - while aMeshIter.More() :               -                      -           # check if one more -child level exists.
    -         aMeshSObj = aMeshIter.Value() -                  -         # returns the SObject corresponding -to the current object found by the iterator.  
    -         aMeshIter.Next()     -                      -                      -   # passes the iterator to the next level.
    -         anAttr = aMeshSObj.FindAttribute("AttributeName")[1]
    -         if anAttr is None :
    -                 -aMeshSObj = aMeshIter.Value()
    -               -  aMeshIter.Next()
    -                 -anAttr = aMeshSObj.FindAttribute("AttributeName")[1]
    -         anAttr = anAttr._narrow(SALOMEDS.AttributeName);
    -         aMeshName = anAttr.Value()
    -         print "  ", aMeshName
    -
    -
    -
    - -
    SALOMEDS::AttributeComment - interface
    -
    -
    -
    - string Value (),  void SetValue ( in string value )
    -
    - Find the AttributeComment attribute of the "Head" field in the study, -print it, then change it to "My Comment" string:
    -
    - aFieldSObj  = myStudy.FindObject("Head, -")
    - anAttr = aFieldSObj.FindAttribute("AttributeComment")[1]
    -                     -anAttr = anAttr._narrow(SALOMEDS.AttributeComment);
    -                     -aFieldComment = anAttr.Value()
    -
    - print "AttributeComment", anAttr
    -
    - anAttr.SetValue ("My Comment")
    - -
    
    - 
    - - diff --git a/doc/salome/tui/KERNEL/sources/static/mapping.html b/doc/salome/tui/KERNEL/sources/static/mapping.html deleted file mode 100755 index f3f0a3f53..000000000 --- a/doc/salome/tui/KERNEL/sources/static/mapping.html +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - Main Page - - - -  -
    - - - - - -
    -
    -
    - -

    -Mapping of IDL definitions to Python language.

    - -

    -Introduction

    -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. -

    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. -

    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 here. -
      -

    CONTENTS: -

    -
    - -

    -Using Scoped Names

    -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. -

    Because of these constraints, scoped names are translated into Python -using the following rules: -

    • An IDL module mapped into a Python module. Modules containing modules -are mapped to packages (i.e., directories with an __init__ 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. -

    • For all other scopes, a Python class is introduced that contains all -the definitions inside this scope. -

    • 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. -

    For instance, -

    -
    module SALOMEDS {
    - interface StudyManager {
    -  void  Close(in Study aStudy);
    - };
    -};
    -
    -would introduce a module SALOMEDS.py, which contains the following definitions: -
    -
    # module SALOMEDS.py
    -class StudyManager:
    -  def _Close(self,aStudy):
    -   pass #interfaces are discussed later
    -
    -To avoid conflicts, IDL names that are also Python identifiers are prefixed -with an underscore (‘_’). -

    Back to the contents -

    -

    -Mapping for Template and Array Types

    -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: -

    • For the wide string X and the integer n, X[n] returns the nth character, -which is a wide string of length 1. -

    • len(X) returns the number of characters of wide string X. -

    • CORBA.wstr(c) returns a wide character with the code point c in an -implementation-defined encoding. -

    • X+Y returns the concatenation of wide strings X and Y. -

    • CORBA.word(CORBA.wstr(c)) == c -

    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. -

    For example, given the IDL definitions -

    -
    module SALOMEDS {
    -  typedef sequence <string> StringSeq;
    -   
    -   interface AttributeTableOfInteger : GenericAttribute {
    -
    -    void SetRowTitles(in StringSeq theTitles) raises(IncorrectArgumentLength);
    - };
    -};
    -
    -a client could invoke the operation -
    -
    print My_AttributeTableOfInteger.SetRowTitles(["X","F"])
    -
    -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. -

    Another example with arrays. The following IDL definition -

    -
    module SALOMEDS {
    - typedef sequence<GenericAttribute> ListOfAttributes;
    - interface SObject {
    -  ListOfAttributes     GetAllAttributes();
    - };
    -};
    -
    -is equal to -
    -
    import SALOMEDS
    -
    -attributes=[]
    - 
    -attributes = My_SObject.GetAllAttributes()
    -
    -length = len(attributes)
    -
    -print "Attributes number = ", length
    -print attributes
    -
    -Back to the contents -

    -

    -Mapping for Objects and Operations

    -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. -

    The nil object is represented by None. -

    If an operation expects parameters of the IDL Object type, any Python -object representing an object reference might be passed as actual argument. -

    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. -

    Operations of an interface map to methods available on the object references. -Parameters with a parameter attribute of in or inout are -passed from left to right tothe method, skipping out parameters. -The return value of a method depends on the number of out parameters -and the return type. If the operation returns a value, this value forms -the first result value. All inout or out parameters -form consecutive result values. The method result depends then on -the number of result values: -

    • If there is no result value, the method returns None. -

    • If there is exactly one result value, it is returned as a single -value. -

    • If there is more than one result value, all of them are packed -into a tuple, and this tuple is returned. -

    Assuming the IDL definition -

    -
    module SALOMEDS{
    - interface StudyBuilder{
    -  boolean FindAttribute  ( in SObject anObject, 
    -                           out GenericAttribute anAttribute, 
    -                           in string aTypeOfAttribute );
    - };
    -};
    -
    -a client could write -
    -
    from SALOMEDS import StudyBuilder;
    -my_StudyBuilder=...
    -  
    -  res,A=my_StudyBuilder.FindAttribute(Sobj, "AttributeSequenceOfReal")
    -
    -In this example A corresponds to the return value anAttribute -and res to the boolean return value. -

    If an interface defines an attribute name, for example, the attribute -is mapped into an operation _get_name. If the attribute is not readonly, -there is an additional operation _set_name. -

    The IDL definition -

    -
    module SALOMEDS{
    - interface Study{
    -  attribute string Name;
    - };
    -};
    -
    -is equal to the following -
    -
    from SALOMEDS import Study
    -My_Study=...
    -  Name=My_Study._get_name();
    -  Name=My_Study._set_name();
    -
    -Back to the contents -

    -

    -Narrowing Object References

    -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. -

    Since there is no efficient and reliable way of automatically creating -the most specific type, explicit narrowing is necessary. To narrow an object -reference A to an interface class AttributeSequenceOfReal, -the client can use the following operation -

    -
    A = A._narrow(SALOMEDS.AttributeSequenceOfReal)
    -
    -Back to the contents -

    -

    -Mapping for Exceptions

    -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 -
    -
    module SALOMEDS{
    - interface StudyBuilder{
    -  exception LockProtection {};
    -  void CommitCommand() raises(LockProtection);
    - };
    -};
    -
    -could be used caught as -
    -
    from SALOMEDS import StudyBuilder;
    -my_StudyBuilder=...
    -try:
    -  my_StudyBuilder.CommitCommand();
    -except StudyBuilder.LockProtection,value:
    -  print "Error! Study is locked for modifications"
    -
    - -


    Back to the contents -

    -

    -Mapping for Enumeration Types

    -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 -
    -
    module VISU {
    - interface PrsObject{
    - 
    -  enum PrsObjType{ TCURVE, TTABLE, TMESH, TCONTAINER,
    -                   TSCALARMAP, TISOSURFACE, TDEFORMEDSHAPE,
    -                   TCUTPLANES, TVECTORS };
    - };
    -};
    -
    -introduces the objects -
    -
    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
    -
    -Back to the contents -

    -

    -Mapping for Structured Types

    -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 -
    -
    struct SDate {
    -               short Second;
    -               short Minute;
    -               short Hour;
    -               short Day;
    -               short Month;
    -               short Year;
    -             };
    -
    -could be used in the Python statements -
    -
    Date=SDate(30, 12, 15, 26, 1, 79)
    -print Date.Second,Date.Minute,Date.Hour,Date.Day,Date.Month,Date.Year
    -
    - -
    -Back to the contents
    - - - - diff --git a/doc/salome/tui/KERNEL/sources/static/ns_f3-1.jpg b/doc/salome/tui/KERNEL/sources/static/ns_f3-1.jpg deleted file mode 100755 index fd4f4560240a2a12e80d2e7ab6a942c046e80114..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8650 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 DlLFx% diff --git a/doc/salome/tui/KERNEL/sources/static/overview_Kernel.html b/doc/salome/tui/KERNEL/sources/static/overview_Kernel.html deleted file mode 100755 index 7f64f4369..000000000 --- a/doc/salome/tui/KERNEL/sources/static/overview_Kernel.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - Main Page - - - -  -
    - - - - - - -
    -
    -
    - - -

    General overview -

    -

    Table of contents

    - - -
    -

    1. Introduction

    -

    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.

    -

    The list of the kernel services related to communication issues is:

    -
      -
    • The Naming service
    • -
    • The Session service
    • -
    • The Life Cycle service
    • -
    • The Registry service
    • -
    • The Notification service
    • -
    -

    This list is enlarged with CORBA independent services :

    - -
      -
    • The module catalog service
    • -
    • The Data Type Catalog service
    • -
    • The resource catalog service
    • -
    -

    SALOME kernel module also encapsulates the Engine -Back to the contents -

    2. Basic principles

    -

    The SALOME user's desktop is a process on a machine. This process includes:

    -
      -
    • A graphic interface (based on Qt),
    • -
    • A text interface (Python interpreter),
    • -
    • A 3D visualization window shared by components.
    • -
    -

    SALOME Modules decompose into an interface (widgets GUI, text mode TUI, 3D visualization V3D) and -an engine.

    -

    The description of a module and its components is obtained by consulting the module catalog.

    -

    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.

    -

    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. -

    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.

    -

    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.

    -Back to the contents - -

    3. Services and features of the SALOME kernel module

    -

    This section gives a brief overview of the services composing the kernel module. - The Life Cycle and Naming - services are described in separate chapters of this reference manual.

    - -

    3.1 Session service

    -

    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.

    -

    Implementation of this service in SALOME application is provided by the class -Session encapsulated in the package -SALOME.

    - -

    3.2 Registry service

    -

    The active component registry should contain:

    - -
      -
    • The list of the active components
    • -
    • The list of the active containers during a SALOME session.
    • -
    -

    It should allow the state of a session. It also should allow to know if session can be stopped.

    -

    The API reference for this service is not included in the current version of the reference manual.

    - -

    3.3 Notification service

    -

    The notification service is a kernel function which allows exchanging of events between CORBA objects.

    -

    In comparison with traditional CORBA event service, SALOME notification service allows to:

    -
      -
    • Filter the events,
    • -
    • Structure the events,
    • -
    • Establish quality policies of services,
    • -
    • Subscribe to various event channels.
    • -
    -

    The API reference for this service is not included in the current version of the reference - manual.

    - -

    3.4 Module catalog service

    -

    There are two module catalogs in SALOME application:

    -
      -
    • 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, -
    • 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. -
    -

    The objective of these two module catalogs is to:

    -
      -
    • List the available modules; -
    • Allow the addition, the modification and the deletion of a module in catalogs; -
    • Look for a module and\or a service fulfilling some given criteria (in catalogs); -
    -

    Implementation of this service in SALOME application is provided by two classes -ModuleCatalogand AComponent encapsulated in the package -SALOME_ModuleCatalog.

    - -

    3.5 Data type catalog

    - -

    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.

    -

    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.

    -

    The purpose of the data type catalog is to:

    -
      -
    • List the available data types in the catalog; -
    • Browse the type hierarchy to check the compatibility of types (specialized output toward generic input); -
    • Allow the addition, the modification and the deletion of a data type in the catalog; -
    -

    The API reference for this service is not included in the current version of the reference - manual.

    -

    3.6 Resource catalog

    - -

    This catalog describes machines, possible types of container on a machine, resources of machines... This catalog is used by the SALOME LifeCycle service.

    -

    The API reference for this service is not included in the current version of the reference - manual.

    - -

    3.7 Engine

    -

    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.

    -

    The SALOME engine in - the current version of the application is implemented - as Engines package of interfaces. It encapsulates two classes: Component, Container.

    -

    The API refernce for Engines package can be found here. -

    -

    3.7.1 Component class

    -

    This class is used for interaction between the container and the component and between the components inside the container. -

    -

    The API reference for this class can be found here.

    - -

    3.7.2 Container class

    -

    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.

    -

    The API reference for this class can be found here.

    - -Back to the contents - - diff --git a/doc/salome/tui/KERNEL/sources/static/overview_Life_Cycle.html b/doc/salome/tui/KERNEL/sources/static/overview_Life_Cycle.html deleted file mode 100755 index f1a1fb8af..000000000 --- a/doc/salome/tui/KERNEL/sources/static/overview_Life_Cycle.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - Life Cycle service Description - - - - - - -  -
    - - - - - - -
    -
    -
    - - -

    Life Cycle service Description

    -

    Introduction

    -

    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 here. -

    -

    Table of contents

    - -
    - -

    1. Overview

    - -

    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.

    -
    - - -

    2. SALOME Life Cycle service description

    -

    The SALOME Life Cycle service represents a partial implementation of the CORBA LifeCycle service.

    -

    From general point of view, the SALOME Life Cycle service allows to find or load with the help of a given container a definte SALOME component with its further -initialization and registration in the Naming service.

    -

    Container - it's a certain engine realizing the mechanism of loading a SALOME module.

    -

    Component - it's a certain abstract shell wrapping SALOME modules, performing all operations concerned with their initialization and registration.

    -

    From the point of view of the service user, the Life Cycle provides a set of functions allowing to :

    -
      -
    • Locate a machine (more generally a container) by a logical set of required features (of both container and - machine);
    • -
    • Load components on the obtained containers;
    • -
    • Create a container;
    • -
    • Obtain the container containing a given component;
    • -
    • Treat the list of the active components;
    • -
    • Treat the list of the available containers.
    • -
    - - - -

    The SALOME Life Cycle is a CORBA server. This server at its initialization is registered with the naming service.

    -

    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. -

    -

    The Life Cycle service then returns a CORBA reference of a launched container.

    -

    Containers are launched on demand depending on components to be loaded. The Life Cycle service manages loading of containers.

    -

    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.

    -

    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.

    -

    The Life Cycle service can implement a loading strategy for new containers on new machines, depending on the state of the already launched containers.

    -

    The Life Cycle service can stop containers at the end of session on -demand.

    - -

    In SALOME platform the Life Cycle service is implemented in SALOME_Life CycleCORBA class. The API refernce for the methods of this class -can be found here.

    -Back to the contents -
    - - -
    - - - diff --git a/doc/salome/tui/KERNEL/sources/static/overview_Naming.html b/doc/salome/tui/KERNEL/sources/static/overview_Naming.html deleted file mode 100755 index 8af6b10ec..000000000 --- a/doc/salome/tui/KERNEL/sources/static/overview_Naming.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - Naming Service Description - - - -  -
    - - - - - - -
    -
    -
    - - -

    Naming Service Description

    -
    -

    Introduction

    -

    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 here. -

    -
    -

    Table of contents

    - - -
    - -

    1. Overview

    -

    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. -

    - -

    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: -

    -
      -
    • Clients and servers can use meaningful names instead of having to deal with stringified references.
    • -
    • By changing a reference in the service without changing its name, you can transparently direct clients to a different object.
    • -
    • The Naming Service solves the bootstrapping problem because it provides a fixed point for clients and servers to rendezvous.
    • -
    -

    The Naming Service is much like a white pages phone book. Given a name, it - returns an object reference.

    - -

    The terminology used in description of NamigService is the following:

    - -
      -
    • A name-to-IOR association is called by a name binding.
    • -
    • Each binding identifies exactly one object reference, but an object reference - may be bound more than once (have more than one name).
    • -
    • 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 naming graph — 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 compound name) defines a path in the naming graph to navigate the - resolution process. Figure 1-1 shows an example of a naming graph.
    • -
    • Binding a name to a context means to add a name–IOR pair to a context.
    • -
    • Resolving a name means to look for a name in a context and to obtain the - IOR bound under that name.
    • -
    - - -
    -

    Figure 1-1 A Naming Graph

    - Back to the contents -
    - -

    2. SALOME Naming Service

    - -

    2.1 Introduction

    -

    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:

    - -
      -
    • The kernel services
    • -
    • Containers -
    • SALOME components instances -
    -

    The name directory hierarchy in SALOME represents a graph of directories containing - symbolic associations name-reference on objects. (It has been described in the - previous section)

    - -

    2.2 Definitions

    -
    -
    Directory
    -
    Context of names containing symbolic associations name-reference on objects.


    -
    "/"
    -
    Character used in SALOME to separate two names of a directory


    -
    Access path
    -
    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).
    -
    -
    Note:An object can be referenced by several symbolic names - in one or several directories.
    - -

    2.3 Partition of SALOME name directory hierarchy

    -

    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:

    -
     
    - /Kernel
    - /Container/
    -	       /Component	
    -
    - -

    2.4 SALOME name directory persistence

    -

    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 Unreachable service.

    - -

    2.5 SALOME Naming Service features

    -

    Usage and administration of the name directory hierarchy is realized by means of the following functions:

    -
      -
    • Recording and recovering of the reference of an object
    • -
    • Searching for a symbolic name
    • -
    • Creating of a directory, reading and modifying of the current directory
    • -
    • Destructing of a symbolic name and a diredtory
    • -
    -

    The access path used in these functions can be defined, either from the root, or from any -directory of SALOME name directory hierarchy.

    - -

    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.

    -

    The precise API reference for these functions you can find here.

    -

    Here is a short list of public methods which are used for working with the SALOME Naming Service:

    -
    -

    Register

    -
    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.
    -

    -

    Resolve

    -
    Try to obtain object reference from name. It's necessary before publishing - IOR in the Naming Service by Register method.
    -

    -

    Find

    -
    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.
    -

    -

    CreateDirectory

    -
    This method allows to create one or several directories in the current directory
    -

    -

    ChangeDirectory

    -
    Moves the current directory. The current directory is moved to the root directory if the input parameter Name is "/".
    -

    -

    CurrentDirectory

    -
    Method allowing to get the current directory.
    -

    -

    list

    -
    Method allowing to list and print the whole context beginning from the current context.
    -

    -

    list_directory

    -
    Method to get all contexts contained in the current directory.
    -

    -

    DestroyName

    -
    Destroys a symbolic name-object reference association.
    -

    -

    DestroyDirectory

    -
    Destroys an empty directory.
    -
    - -Back to the contents -
    - - diff --git a/doc/salome/tui/KERNEL/sources/static/overview_Study.html b/doc/salome/tui/KERNEL/sources/static/overview_Study.html deleted file mode 100755 index 0526536e9..000000000 --- a/doc/salome/tui/KERNEL/sources/static/overview_Study.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - Main Page - - - -  -
    - - - - - - -
    -
    -
    - - -

    General overview -

    -
    -

    Table of contents

    - -

    1. Introduction

    -

    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.
    -

    -

    2. Representation of the study

    -

    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.

    -

    The study allows to describe the following relations:

    -
      -
    • The link between the transient and persistent values of an SObject.
    • -
    • The relations between the SObjects produced by different components.
    • -
    • The relations between the SObjects produced by the same component.
    • -
    • The link between an object and its user name.
    • -
    • The access to the definition of the component which produce an object of - the study.
    • -
    • The access to instance of the component (if this one exists) which has produced - this SObject of the study.
    • -
    - -

    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.

    -

    As the structure of the study is tree-like it is possible to associate sub-objects - to objects.

    -

    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.

    -

    For example Component Data GEOM will contain the data produced by the component - Geom.

    - - - - - -
    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.
    -

    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

    -

    2.1 Study in transient format

    -

    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 a tag representing an integer value.

    -

    The exploration of the tree from the root to a node supplies a sequence of tags which establishes a -unique identifier ID. ID represents a character string containing the sequence of tags separated by -one ':'.

    -

    For example 0:1:12:4

    -

    To every node we can associate a set of attributes.

    -

    The attributes which the study can contain can be of the following types:

    -
      -
    • All standard attributes supplied by OCC (package TdataStd) which allow to define (integers, -real, strings, identifiers, references etc.)
    • -
    • Attributes which contain CORBA references.
    • -
    • Attributes which contain the path HDF to reach the persistent datum. (Cf. the following chapter)
    • -
    -

    Remark: 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.

    -

    Example of a Study Object as a set of various attributes.

    - -

    2.2 Study in persistent format

    -

    To store a study HDF format is used, this tool allows to represent persistent data in the form of a tree.

    -

    Under the root of the persistent document, you can find a set of nodes:

    -
      -
    • 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.
    • -
    • 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.
    • -
    -

    2.3 Link between transient and persistent formats

    -

    It will be possible to complete the definition of one object in the study by associating to it an attribute -HDFPath which will contain the path to the persistent data.

    - -

    Back to the contents

    -

    3. Services and features of the study

    -

    The Study in SALOME application possess a wide functionality. This functionality is provided by a set of classes which are described -below. -

    3.1 Study class

    -

    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 StudyManager - and the StudyBuilder. 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.

    -

    Nevertheless, the Study class contains a set of methods providing:

    - -
      -
    • management of study properties -
    • search for SObjects. -
    • search for SComponents -
    • creation of a new StudyBuilder, ComponentIterator, ChildIterator etc. -
    -

    The API reference for this class can be found here.

    -

    3.2 StudyBuilder class

    -

    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.

    -

    StudyBulder provides the following functionality:

    -
      -
    • creation, modification or deletetion of SObjects in the study
    • -
    • creation or removal of SComponents
    • -
    • undo/redo functionality. For that purpose it supplies the methods NewCommand, - CommitCommand, AbortCommand.
    • -
    -

    The API reference for this class can be found here.

    -

    3.3 StudyManager class

    -

    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.

    -

    For that purpose StudyManager provides the following functionality:

    -
      -
    • creation, opening, closing and saving studies
    • -
    • navigation through a set of studies present in the current working session
    • -
    • copy/paste of the objects in the study functionality.
    • -
    -

    The API reference for this class can be found here.

    -

    3.4 SObject class

    -

    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.

    -

    The API reference for this class can be found here.

    -

    3.5 SComponent class

    -

    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.

    -

    The API reference for this class can be found here.

    -

    3.6 ChildIterator class

    -

    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.

    -

    The API reference for this class can be found here.

    -

    3.7 SComponentIterator

    -

    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.

    -

    The API reference for this class can be found here.

    - -

    3.8 GenericAttribute class

    -

    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.

    -

    The API reference for this class can be found here.

    - -

    In SALOME application a SObject can possess the following attributes:

    - - - - - -
    - -
    -

    3.9 UseCaseBuilder class

    -

    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.

    -

    The API reference for this class can be found here.

    - -

    3.10 UseCaseIterator

    -

    This class represents an exploration tool for the UseCase. It contains a set of methods used for iteration over the objects in the UseCase.

    -

    The API reference for this class can be found here.

    - -

    3.11 Callback class

    -

    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 adding and removing the objects.

    -

    The API reference for this class can be found here.

    - -

    3.12 Driver class

    - -

    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: -

      -
    • publishing in the study of the objects created by a definite component
    • -
    • 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.
    • -
    • transforming of the transient references into persistant references (or - vice versa) of the SObjects when saving (or loading) a study
    • -
    • copy/paste common functionality. These methods can be called by any component - in order to copy/paste its object created in the study
    • -
    -

    The API reference for this class can be found here.

    -

    Back to the contents

    - - diff --git a/doc/salome/tui/KERNEL/sources/static/page2.html b/doc/salome/tui/KERNEL/sources/static/page2.html deleted file mode 100755 index 40eed1f98..000000000 --- a/doc/salome/tui/KERNEL/sources/static/page2.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Main Page - - - -  -
    - - - - - - -
    -
    -
    - - - - - -

    Mapping of SALOME IDL definitions to Python language. -

    - - diff --git a/doc/salome/tui/KERNEL/sources/static/tree.js.in b/doc/salome/tui/KERNEL/sources/static/tree.js.in deleted file mode 100755 index b7422d7b8..000000000 --- a/doc/salome/tui/KERNEL/sources/static/tree.js.in +++ /dev/null @@ -1,200 +0,0 @@ -foldersTree = gFld("SALOME v.@VERSION@ ", "", "") - 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 deleted file mode 100644 index 55eb43d07..000000000 --- a/doc/salome/tui/KERNEL/sources/static/treeview.js +++ /dev/null @@ -1,505 +0,0 @@ -//**************************************************************** -// 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 0) - auxEv = "" - else - auxEv = "" - - if (level>0) - if (lastNode) //the last 'brother' in the children array - { - this.renderOb(leftSide + auxEv + "") -// leftSide = leftSide + "" - this.isLastNode = 1 - } - else - { - this.renderOb(leftSide + auxEv + "") - leftSide = leftSide + "" - 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("") - } - if (browserVersion == 3) - { - doc.write("
    ") - } - - doc.write("\n") - doc.write("\n\n") - doc.write("\n
    ") - doc.write(leftSide) - this.outputLink() - doc.write("") - doc.write("") - if (USETEXTLINKS) - { - this.outputLink() - doc.write(this.desc + "") - } - else - doc.write(this.desc) - -/*! - if (this.tagName!="") - { - doc.write(" [external]") - } -*/ - doc.write("
    \n") - - if (browserVersion == 2) { - doc.write("") - } - if (browserVersion == 3) { - doc.write("
    ") - } - - 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(" 0) - doc.write("onClick='javascript:clickOnFolder("+this.id+")'") - doc.write(">") - } - else - doc.write("") -} - -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 + "") - leftSide = leftSide + "" - } - else - { - this.renderOb(leftSide + "") - leftSide = leftSide + "" - } - else - this.renderOb("") -} - -function drawItem(leftSide) -{ - if (browserVersion == 2) - doc.write("") - if (browserVersion == 3) - doc.write("
    ") - - doc.write("\n\n") - doc.write("\n
    ") - doc.write(leftSide) - if (this.link!="") - { - doc.write("") - } - doc.write("") - if (this.link!="") - { - doc.write("") - } - doc.write("") - if (USETEXTLINKS && this.link!="") - doc.write("" + this.desc + "") - else - doc.write(this.desc) -/*! - if (this.tagName!="") - { - doc.write(" [external]"); - } -*/ - doc.write("\n
    \n") - - if (browserVersion == 2) - doc.write("") - if (browserVersion == 3) - doc.write("
    ") - - 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(" ") - - // 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/Makefile.am b/doc/salome/tui/Makefile.am index 7aa79e067..b06306d1e 100644 --- a/doc/salome/tui/Makefile.am +++ b/doc/salome/tui/Makefile.am @@ -26,94 +26,36 @@ # include $(top_srcdir)/salome_adm/unix/make_common_starter.am -EXTRA_DIST = pythfilter.py - -dist-hook: - cp -rf $(srcdir)/KERNEL $(distdir) - if test -d "KERNEL"; then \ - find "KERNEL" -name "*.*" -exec cp -rf {} $(distdir)/KERNEL ';' ; \ - fi - rm -rf `find $(distdir) -name CVS` - -clean-local: - rm -rf KERNEL - chmod -R +w INPUT - @for filen in `find INPUT -type f` ; do \ - case $${filen} in \ - INPUT/doxydev | INPUT/doxyuser | INPUT/sources/static/tree.js ) ;; \ - . | .. ) ;; \ - *) echo "Removing $${filen}" ; rm -rf $${filen} ;; \ - esac ; \ - done ; - -KERNEL/main.html:../main.dox - cp -fr $(srcdir)/KERNEL/* ./INPUT; \ - cd ./INPUT; \ - pwd; ls;\ +dev_docs: echo "DOXYGEN SUPPORT PYTHON - $(DOXYGEN_WITH_PYTHON)"; \ if( test "x$(DOXYGEN_WITH_PYTHON)" = "xyes"); then \ - sed 's|python_extension_must_be_here|*.py|' ./doxyuser > ./doxyuser1; \ - $(DOXYGEN) -u ./doxyuser1; \ + sed 's|python_extension_must_be_here|*.py|' ./doxyfile > ./doxyfile1; \ + $(DOXYGEN) -u ./doxyfile1; \ else \ - sed 's|python_extension_must_be_here||' ./doxyuser > ./doxyuser1; \ + sed 's|python_extension_must_be_here||' ./doxyfile > ./doxyfile1; \ fi; \ echo "DOXYGEN SUPPORT STL - $(DOXYGEN_WITH_STL)"; \ if( test "x$(DOXYGEN_WITH_STL)" = "xyes"); then \ - sed -e 's|BUILTIN_STL_SUPPORT = NO|BUILTIN_STL_SUPPORT = YES|' ./doxyuser1 > ./doxyuser2; \ - mv -f doxyuser2 doxyuser1; \ + sed -e 's|BUILTIN_STL_SUPPORT = NO|BUILTIN_STL_SUPPORT = YES|' ./doxyfile1 > ./doxyfile2; \ + mv -f doxyfile2 doxyfile1; \ fi; \ - $(DOXYGEN) ./doxyuser1; \ - cd ..; + $(DOXYGEN) ./doxyfile1 + +clean-local: + -rm -fr KERNEL log.txt doxyfile1.bak doxyfile1 -usr_docs:KERNEL/main.html - if test -d "KERNEL"; then b=; else b="$(srcdir)/"; fi; \ - cp -fr $(srcdir)/KERNEL/sources/static/*.* $(DESTDIR)$(docdir); \ - cp -fr $(srcdir)/KERNEL/sources/ $(DESTDIR)$(docdir); \ - find $$b"KERNEL" -name "*.*" -exec cp -rf {} $(DESTDIR)$(docdir) ';' ; \ - cp -fr $(srcdir)/KERNEL/HTML/ $(DESTDIR)$(docdir); \ - cp -f $(srcdir)/pythfilter.py $(DESTDIR)$(docdir); \ - cp -fr $(srcdir)/KERNEL/exemple/ $(DESTDIR)$(docdir); +install-data-local: + if test -d KERNEL; then \ + $(INSTALL) -d $(DESTDIR)$(docdir)/tui ; \ + cp -rp KERNEL $(DESTDIR)$(docdir)/tui ; \ + fi; uninstall-local: -# chmod +w $(DESTDIR)$(docdir)/sources -# chmod +w $(DESTDIR)$(docdir)/sources/static -# chmod +w $(DESTDIR)$(docdir)/HTML - chmod -R +w $(DESTDIR)$(docdir) - rm -rf $(DESTDIR)$(docdir)/pythfilter.py - find $(DESTDIR)$(docdir) -name "*.html" -type f -exec rm -rf {} \; - find $(DESTDIR)$(docdir) -name "*.jpg" -type f -exec rm -rf {} \; - find $(DESTDIR)$(docdir) -name "*.map" -type f -exec rm -rf {} \; - find $(DESTDIR)$(docdir) -name "*.md5" -type f -exec rm -rf {} \; - find $(DESTDIR)$(docdir) -name "*.png" -type f -exec rm -rf {} \; - find $(DESTDIR)$(docdir) -name "*.gif" -type f -exec rm -rf {} \; - find $(DESTDIR)$(docdir) -name "*.css" -type f -exec rm -rf {} \; - find $(DESTDIR)$(docdir) -name "*.js*" -type f -exec rm -rf {} \; - rm -rf $(DESTDIR)$(docdir)/sources - rm -rf $(DESTDIR)$(docdir)/HTML - rm -rf $(DESTDIR)$(docdir)/exemple - rm -rf $(DESTDIR)$(docdir)/*.in + rm -rf $(DESTDIR)$(docdir)/tui/KERNEL + +EXTRA_DIST=static KERNEL/exemple + +dist-hook: + rm -rf $(distdir)/static/CVS ; \ + rm -rf $(distdir)/KERNEL/exemple/CVS -dev_docs: - cp -fr $(srcdir)/KERNEL/* ./INPUT; \ - cd ./INPUT; \ - pwd; ls;\ - echo "DOXYGEN SUPPORT PYTHON - $(DOXYGEN_WITH_PYTHON)"; \ - if( test "x$(DOXYGEN_WITH_PYTHON)" = "xyes"); then \ - sed 's|python_extension_must_be_here|*.py|' ./doxydev > ./doxydev1; \ - $(DOXYGEN) -u ./doxydev1; \ - else \ - sed 's|python_extension_must_be_here||' ./doxydev > ./doxydev1; \ - fi; \ - echo "DOXYGEN SUPPORT STL - $(DOXYGEN_WITH_STL)"; \ - if( test "x$(DOXYGEN_WITH_STL)" = "xyes"); then \ - sed -e 's|BUILTIN_STL_SUPPORT = NO|BUILTIN_STL_SUPPORT = YES|' ./doxydev1 > ./doxydev2; \ - mv -f doxydev2 doxydev1; \ - fi; \ - $(DOXYGEN) ./doxydev1; \ - cd ..; - $(INSTALL) -d $(docdir)/tui/KERNEL; -# cp -fr KERNEL $(docdir)/tui -# cp -fr $(srcdir)/KERNEL/sources/static/*.* $(docdir)/tui/KERNEL; -# cp -fr $(srcdir)/KERNEL/sources/ $(docdir)/tui/KERNEL; -# cp -fr $(srcdir)/KERNEL/HTML/ $(docdir)/tui/KERNEL; -# cp -f $(srcdir)/pythfilter.py $(docdir)/tui/KERNEL; diff --git a/doc/salome/tui/KERNEL/doxydev.in b/doc/salome/tui/doxyfile.in similarity index 94% rename from doc/salome/tui/KERNEL/doxydev.in rename to doc/salome/tui/doxyfile.in index 168d1c5ee..544dd2015 100644 --- a/doc/salome/tui/KERNEL/doxydev.in +++ b/doc/salome/tui/doxyfile.in @@ -5,7 +5,7 @@ #--------------------------------------------------------------------------- PROJECT_NAME = "SALOME v.@VERSION@" PROJECT_NUMBER = -OUTPUT_DIRECTORY = ../ +OUTPUT_DIRECTORY = KERNEL CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English USE_WINDOWS_ENCODING = NO @@ -15,8 +15,7 @@ ABBREVIATE_BRIEF = ALWAYS_DETAILED_SEC = YES INLINE_INHERITED_MEMB = YES FULL_PATH_NAMES = YES -STRIP_FROM_PATH = @top_builddir@ \ - @top_srcdir@ +STRIP_FROM_PATH = @top_builddir@ @top_srcdir@ STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = YES @@ -77,8 +76,8 @@ 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 + @top_srcdir@/src/DSC +FILE_PATTERNS = *.idl *.cxx *.hxx *.h *.hh *.i *c *.cc python_extension_must_be_here RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO @@ -86,10 +85,10 @@ EXCLUDE_PATTERNS = EXAMPLE_PATH = EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO -IMAGE_PATH = sources/ +IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = -FILTER_SOURCE_FILES = YES +FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing @@ -113,11 +112,11 @@ IGNORE_PREFIX = # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES -HTML_OUTPUT = KERNEL +HTML_OUTPUT = . HTML_FILE_EXTENSION = .html -HTML_HEADER = sources/myheader.html -HTML_FOOTER = sources/footer.html -HTML_STYLESHEET = sources/doxygen.css +HTML_HEADER = @srcdir@/static/header.html +HTML_FOOTER = @srcdir@/static/footer.html +HTML_STYLESHEET = HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = diff --git a/doc/salome/tui/pythfilter.py b/doc/salome/tui/pythfilter.py deleted file mode 100644 index 4a7f180c2..000000000 --- a/doc/salome/tui/pythfilter.py +++ /dev/null @@ -1,568 +0,0 @@ -# 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/salome/tui/static/footer.html b/doc/salome/tui/static/footer.html new file mode 100755 index 000000000..56d52a61a --- /dev/null +++ b/doc/salome/tui/static/footer.html @@ -0,0 +1,10 @@ + + + + + +
    +
    Copyright © 2003-2007 CEA, EDF
    +
    + + diff --git a/doc/salome/tui/static/header.html b/doc/salome/tui/static/header.html new file mode 100755 index 000000000..bddc997ec --- /dev/null +++ b/doc/salome/tui/static/header.html @@ -0,0 +1,13 @@ + + + + + $title + + + +
    +
    +SALOME documentation central +
    +
    diff --git a/doc/salome/unittests.dox b/doc/salome/unittests.dox index fc5ebdd47..199a0a392 100644 --- a/doc/salome/unittests.dox +++ b/doc/salome/unittests.dox @@ -10,60 +10,57 @@ the unit tests. \section S1_unit SALOME KERNEL source code structuration -
      -
    1. General structure of KERNEL_SRC +\subsection sub11 General structure of KERNEL_SRC -- KERNEL_SRC : +- KERNEL_SRC :\n Some README files and configuration tools for build -- KERNEL_SRC/adm_local : +- KERNEL_SRC/adm_local :\n Part of the configuration files, other modules have a directory with the same name. Not used in KERNEL. -- KERNEL_SRC/bin : +- KERNEL_SRC/bin :\n Python and shell scripts used at run time. Kit to install a %SALOME Application. -- KERNEL_SRC/doc : +- KERNEL_SRC/doc :\n Kit for KERNEL end user documentation production: public interfaces, Python, CORBA. Integrator and Developper documentation. -- KERNEL_SRC/idl : +- KERNEL_SRC/idl :\n All CORBA interfaces from KERNEL are regrouped here. -- KERNEL_SRC/resources : +- KERNEL_SRC/resources :\n Configuration files for servers (examples). Interfaces definitions for KERNEL test components. -- KERNEL_SRC/salome_adm : +- KERNEL_SRC/salome_adm :\n Configuration files used by autotools (M4 macros & co.) -- KERNEL_SRC/src : +- KERNEL_SRC/src :\n The source code (C++ and Python) -
    2. -
    3. -Directory src: C++ and Python source code +\subsection sub12 Directory src: C++ and Python source code
      1. Basic services non related to CORBA -- Basics +- Basics\n %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 +- SALOMELocalTrace\n %A multithread trace system that allows message tracing on standard error or a file. -- CASCatch +- CASCatch\n Exceptions and signal handler. -- HDFPersist +- HDFPersist\n %A C++ interface to HDF.
      2. @@ -71,22 +68,22 @@ the unit tests.
      3. Basic CORBA services -- Logger : +- Logger :\n %A CORBA %server that collects the trace messages from differents CORBA process. -- SALOMETraceCollector : +- SALOMETraceCollector :\n %A multithread trace system derived from SALOMELocalTrace, that sends messages to Logger %server via CORBA. -- Utils : +- Utils :\n %A set of general purpose services related to CORBA, such as basic CORBA exception system. See also Basics directory above. -- NamingService : +- NamingService :\n C++ and Python interfaces to name, store and retrieve CORBA objects -- GenericObj : +- GenericObj :\n %A generic CORBA interface for CORBA objects, to count distributed references, and to allow destruction by client. @@ -94,21 +91,21 @@ the unit tests.
      4. Miscellaneous CORBA servers -- %Registry : +- %Registry :\n Implements SALOME_registry.idl. Provides a CORBA %server library and a separate %server program. -- ModuleCatalog : +- ModuleCatalog :\n Implements SALOME_moduleCatalog.idl. Provide a CORBA %server library and separate %server and client programs. -- ModuleGenerator : +- ModuleGenerator :\n Tool to generate a module catalog from CORBA idl -- ResourcesManager : +- ResourcesManager :\n library included in container %server -- Notification : +- Notification :\n library included in differents servers (container) - NOTIFICATION_SWIG @@ -137,7 +134,7 @@ the unit tests. - SALOMEDSImpl -- SALOMEDS +- %SALOMEDS
      5. @@ -182,7 +179,7 @@ the unit tests. \section S2_unit Tools and principles used for Unit testing -**TO BE COMPLETED** +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. diff --git a/doc/txt2html.sh b/doc/txt2html.sh deleted file mode 100755 index cfaff46ad..000000000 --- a/doc/txt2html.sh +++ /dev/null @@ -1,54 +0,0 @@ -# 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 - diff --git a/idl/Calcium_Ports.idl b/idl/Calcium_Ports.idl index cce57e90f..9f1096498 100644 --- a/idl/Calcium_Ports.idl +++ b/idl/Calcium_Ports.idl @@ -19,7 +19,7 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File : SALOME_Ports.idl +// File : Calcium_Ports.idl // Author : Eric Fayolle, EDF // #ifndef _CALCIUM_PORTS_IDL_ @@ -27,8 +27,13 @@ #include "SALOME_Ports.idl" +/*! \file Calcium_Ports.idl \brief interfaces for Calcium ports +*/ + module Ports { +/*! \brief module that contains interfaces to define Calcium ports +*/ module Calcium_Ports { const long UNLIMITED_STORAGE_LEVEL = -70; diff --git a/idl/DSC_Engines.idl b/idl/DSC_Engines.idl index 5d42e6693..cbe349e27 100644 --- a/idl/DSC_Engines.idl +++ b/idl/DSC_Engines.idl @@ -29,9 +29,8 @@ #include "SALOME_Component.idl" #include "SALOME_Ports.idl" -/*! \file - This is a package that contains IDL interfaces that permits to add - a dynamic port model to the SALOME object model. +/*! \file DSC_Engines.idl + \brief interfaces that permits to add a dynamic port model to the SALOME object model. */ module Engines { @@ -63,6 +62,7 @@ module Engines { /*--------------------------------------------------------------------------------------------*/ /*-------------------------------------- Types Part ------------------------------------------*/ + //! a uses port /*! This sequence is a uses port. It's a sequence since a uses port can be connected with x provides port. Sometimes this kind of uses port is called multiple port. @@ -71,33 +71,25 @@ module Engines { */ typedef sequence uses_port; + //! This enumeration is used when the connection of a port (uses or provides) is changed. /*! - This enumeration is used when the connection of a port (uses or provides) - is changed. This information is for the component's user code. + This information is for the component's user code. */ enum Message {AddingConnection, RemovingConnection, ApplicationError}; - /*! - This exception is raised when a port's name is gived before - it is added to the component. - */ + //! This exception is raised when a port is used before it is added to the component. exception PortNotDefined {}; - /*! - This exception is raised if you try to add a port with the same - name than a previous defined port. - */ + //! This exception is raised if you try to add a port with the same name than a previous defined port. exception PortAlreadyDefined {}; - /*! - This exception is raised when you try to use a port that is not connected. - */ + //! This exception is raised when you try to use a port that is not connected. exception PortNotConnected {}; + //! This exception is raised if the type of the provides port is bad. /*! - This exception is raised if the type of the provides port is bad. This exception contains a string that gives what type is expected and the type that the operation received. */ @@ -106,27 +98,21 @@ module Engines { string received; }; - /*! - Port's reference is Nil ! - */ + //! Port's reference is Nil ! exception NilPort {}; - /*! - Port's reference is not the right reference. - */ + //! Port's reference is not the right reference. exception BadPortReference {}; - /*! - Object porperty is not good for the port - */ + //! Object property is not good for the port exception BadProperty {}; /*--------------------------------------------------------------------------------------------*/ /*-------------------------------------- Operation Part --------------------------------------*/ + //! This operation adds a provides port to the component. /*! - This operation adds a provides port to the component. \param ref port's Corba reference. \param provides_port_name port's name. @@ -146,8 +132,8 @@ module Engines { NilPort, BadProperty); + //! This operation adds a uses port to the component. /*! - This operation adds a uses port to the component. \param repository_id port's Corba repository id. Eg : IDL:toto.tata/MODULE/INTERFACE_NAME:1.0 @@ -166,8 +152,8 @@ module Engines { in Ports::PortProperties port_prop) raises(PortAlreadyDefined, BadProperty); + //! Get a provides port of the component. /*! - This operation is used to get a provides port of the component. It can be used by the framework or the component himself. If it's the framework that wants the port, the reference has to be gived @@ -191,8 +177,8 @@ module Engines { PortNotConnected, BadPortType); + //! Get a uses port of the component. /*! - This operation is used to get a uses port of the component. It can be used by the framework or the component himself. Actually, only the user layer of the component will use this operation. A uses port could be obtained if and only if the uses port is connected. The sequence @@ -215,8 +201,8 @@ module Engines { BadPortType); + //! Connect a provides port with a uses port. /*! - This operation connects a provides port with a uses port. \param provides_port_name provides port's name. @@ -226,8 +212,8 @@ module Engines { */ void connect_provides_port(in string provides_port_name) raises(PortNotDefined); + //! Connect a uses port with a provides port. /*! - This operation connects a uses port with a provides port. \param uses_port_name uses port's name. \param provides_port_ref provides port's Corba reference. @@ -240,9 +226,10 @@ module Engines { in Ports::Port provides_port_ref) raises(PortNotDefined, BadPortType, NilPort); + + //! Check if a port is connected. /*! - This operation tests if a port is connected. You can test - a uses port or a provides port. + You can test a uses port or a provides port. \param port_name port's name. \return true if the uses port is connected. @@ -251,8 +238,8 @@ module Engines { */ boolean is_connected(in string port_name) raises(PortNotDefined); + //! Disconnect a uses port from a provides port. /*! - This operation disconnects a uses port to a provides port. \param provides_port_name provides port's name. \param message state associated with the disconnection. @@ -264,8 +251,8 @@ module Engines { in Engines::DSC::Message message) raises(PortNotDefined, PortNotConnected); + //! Disconnect a provides port from a uses port. /*! - This operation disconnects a provides port to a uses port. \param uses_port_name uses port's name. \param provides_port_ref CORBA reference of the provides port. @@ -280,8 +267,8 @@ module Engines { in Engines::DSC::Message message) raises(PortNotDefined, PortNotConnected, BadPortReference); + //! Get port's property object. /*! - This operation permits to get port's property object. \param port_name port's name. \return properties object's CORBA reference. @@ -298,18 +285,14 @@ module Engines { */ interface ConnectionManager { - /*! - The Id gived to the disconnect method is bad. - */ + //! The Id given to the disconnect method is bad. exception BadId {}; - /*! - A connection Id. It's unique. - */ + //! A connection Id. It's unique. typedef short connectionId; + //! Connect a uses port with a provides port. /*! - This operation connects a uses port with a provides port. \param uses_component The component that have the uses port. \param uses_port_name uses port's name. @@ -331,9 +314,8 @@ module Engines { Engines::DSC::BadPortType, Engines::DSC::NilPort); + //! Release a connection that has been previously created by the ConnectionManager. /*! - This operation releases a connection that has been previously created by - the ConnectionManager. \param id The id of the connection previously gived by the connect operation of the ConnectionManager. @@ -347,14 +329,10 @@ module Engines { Engines::DSC::PortNotConnected, Engines::DSC::BadPortReference); - /*! - Shutdown the ConnectionManager process. - */ + //! Shutdown the ConnectionManager process. oneway void ShutdownWithExit(); - /*! - Returns the PID of the connection manager - */ + //! Return the PID of the connection manager long getPID(); }; @@ -368,9 +346,10 @@ module Engines { */ interface Superv_Component : Engines::DSC { + //! Operation to create the service ports before it is executed /*! The SUPERV module call this method before starting the service. Thus the service - can add is dynamics ports before it is started. + can add its dynamics ports before it is started. \param service_name service's name. \return true if the service is correctly initialised. diff --git a/idl/Logger.idl b/idl/Logger.idl index e69d5f2dd..91a0234c2 100644 --- a/idl/Logger.idl +++ b/idl/Logger.idl @@ -26,14 +26,26 @@ #define SALOME_LOGGER_IDL #pragma prefix "opencascade.com" +/*! \file Logger.idl \brief interfaces for %SALOME logger +*/ +/*! \brief module that provides interface to %SALOME logger +*/ module SALOME_Logger { +/*! \brief interface to use the %SALOME logger +*/ interface Logger { - //put message into one special place for all servers using Logger + /*! \brief put message into one special place for all servers using %SALOME logger + + \param message the message to send + */ oneway void putMessage (in string message); + + //! check if the logger is running void ping (); + //! shutdown the logger server void shutdown(); }; }; diff --git a/idl/Palm_Ports.idl b/idl/Palm_Ports.idl index 062d0bb5f..46223d805 100644 --- a/idl/Palm_Ports.idl +++ b/idl/Palm_Ports.idl @@ -19,7 +19,7 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File : SALOME_Ports.idl +// File : Palm_Ports.idl // Author : André RIBES, EDF // #ifndef _PALM_PORTS_IDL_ @@ -27,8 +27,8 @@ #include "SALOME_Ports.idl" -/*! \file - This file contains IDL palm ports declations. +/*! \file Palm_Ports.idl + \brief This file contains IDL palm ports declarations. */ module Ports { @@ -39,8 +39,7 @@ module Ports { */ interface Palm_Data_Short_Port : Ports::Data_Port { - /*! - This operation permits to transmit a short. + /*! \brief This operation permits to transmit a short. \param data the short transmitted. \param time time associated to the short. @@ -57,8 +56,7 @@ module Ports { /*! \brief Interface of a sequence of short port. */ interface Palm_Data_Seq_Short_Port : Ports::Data_Port { - /*! - This operation permits to transmit a sequence of short. + /*! \brief This operation permits to transmit a sequence of short. \param data the sequence transmitted. \param time time associated to the data. diff --git a/idl/SALOMEDS.idl b/idl/SALOMEDS.idl index 9c2877937..80b69b51a 100644 --- a/idl/SALOMEDS.idl +++ b/idl/SALOMEDS.idl @@ -23,8 +23,7 @@ // Author : Yves FRICAUD // $Header$ // -/*! - \file SALOMEDS.idl This file contains a set of interfaces used for creation, managment +/*! \file SALOMEDS.idl \brief This file contains a set of interfaces used for creation, management and modification of the %Study */ @@ -34,49 +33,43 @@ #include "SALOME_Exception.idl" #include "SALOME_GenericObj.idl" -/*! +/*! \brief This package contains the interfaces used for creation, managment and modification of the %Study */ module SALOMEDS { -/*! \typedef URL - Name of the file in which the %Study is saved. - +/*! \brief Name of the file in which the %Study is saved. */ typedef string URL; -/*! Main identifier of an object in %SALOME application +/*! \brief Main identifier of an object in %SALOME application */ typedef string ID; -/*! While saving the data, IOR is transformed into persistent reference +/*! \brief While saving the data, IOR is transformed into persistent reference */ typedef string PersistentReference; -/*! IOR of the study in %SALOME application +/*! \brief IOR of the study in %SALOME application */ typedef string SalomeReference; -/*! List of the names of studies which are currently open in this %SALOME session. +/*! \brief List of the names of studies which are currently open in this %SALOME session. + Since %SALOME is a multi-study application, it allows to open a lot of studies during each working session. */ typedef sequence ListOfOpenStudies; -/*! List of file names -*/ +//! List of file names typedef sequence ListOfFileNames; -/*! List of modification dates of a study -*/ +//! List of modification dates of a study typedef sequence ListOfDates ; -/*! An unbounded sequence of strings -*/ +//! An unbounded sequence of strings typedef sequence ListOfStrings ; -/*! An unbounded sequence of sequence of strings -*/ +//! An unbounded sequence of sequence of strings typedef sequence ListOfListOfStrings ; -/*! A byte stream which is used for binary data transfer between different components -*/ +//! A byte stream which is used for binary data transfer between different components typedef sequence TMPFile; // Reference to other objects is treated with function AddReference @@ -100,12 +93,10 @@ during each working session. interface UseCaseIterator; interface UseCaseBuilder; -/*! List of attributes of %SObjects -*/ +//! List of attributes of %SObjects typedef sequence ListOfAttributes; -/*! Exception indicating that this feature hasn't been implemented in %SALOME PRO application. -*/ +//! Exception indicating that this feature hasn't been implemented in %SALOME application. exception NotImplemented {}; @@ -128,19 +119,21 @@ during each working session. interface Study { +//! Invalid study context exception StudyInvalidContext {}; +//! Invalid study component exception StudyInvalidComponent {}; -/*! Invalid directory of the %study exception -*/ +//! Invalid directory of the %study exception exception StudyInvalidDirectory {}; -/*! Exception pointing that this name of the study has already been used. -*/ +//! Exception pointing that this name of the study has already been used. exception StudyNameAlreadyUsed {}; +//! study object already exists exception StudyObjectAlreadyExists {}; -/*! Invalid name of the %study exception -*/ +//! Invalid name of the %study exception exception StudyNameError {}; +//! Invalid study comment exception StudyCommentError {}; + /*! \brief The name of the %Study This is equivalent to the methods setName() & getName() @@ -151,139 +144,123 @@ during each working session. This is equivalent to the methods setID() & getID() */ attribute short StudyId; -/*! Sequence containing %SObjects -*/ +//! Sequence containing %SObjects typedef sequence ListOfSObject; -/*! - Gets the persistent reference to the %Study. -*/ +//! Get the persistent reference to the %Study. PersistentReference GetPersistentReference(); -/*! - Gets a transient reference to the %Study. -*/ +//! Get a transient reference to the %Study. SalomeReference GetTransientReference(); -/*! - Returns True if the %Study is empty +/*! \brief indicate whether the %Study is empty + + \return True if the %Study is empty */ boolean IsEmpty(); -/*! - Allows to find a %SComponent by its name. +/*! \brief Find a %SComponent by its name. + \param aComponentName It's a string value in the Comment Attribute of the Component, which is looked for, defining the data type of this Component. -
        See also
        an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. + */ SComponent FindComponent (in string aComponentName); -/*! - Allows to find a %SComponent by ID of the according %SObject + +/*! \brief Find a %SComponent by ID of the according %SObject */ SComponent FindComponentID(in ID aComponentID); -/*! - Allows to find a %SObject by the Name Attribute of this %SObject +/*! \brief Find a %SObject by the Name Attribute of this %SObject \param anObjectName String parameter defining the name of the object \return The obtained %SObject -
        See also an example of this method usage in batchmode of %SALOME application. - +See \ref example19 for an example of this method usage in batchmode of %SALOME application. */ SObject FindObject (in string anObjectName); -/*! - Allows to find a %SObject by its ID +/*! \brief Find a %SObject by its ID + \param aObjectID This parameter defines the ID of the required object \return The obtained %SObject - */ SObject FindObjectID (in ID aObjectID); -/*! - Allows to create a %SObject by its ID +/*! \brief Create a %SObject by its ID + \param aObjectID This parameter defines the ID of the required object \return The created %SObject - */ SObject CreateObjectID (in ID aObjectID); -/*! - Allows to find a %SObject by IOR of the object belonging to this %SObject. +/*! \brief Find a %SObject by IOR of the object belonging to this %SObject. + \param anObjectName This parameter defines the IOR of the object \return The obtained %SObject - */ SObject FindObjectIOR (in ID aObjectIOR); -/*! - Finds in the study all %SObjects produced by a given %Component. +/*! \brief Find in the study all %SObjects produced by a given %Component. + \param anObjectName The Name Attribute of the searched %SObjects should correspond to anObjectName. \param aComponentName The name of the component, which objects are searched for. */ ListOfSObject FindObjectByName(in string anObjectName, in string aComponentName); -/*! - Allows to find a %SObject by the path to it. +/*! \brief Find a %SObject by the path to it. \param thePath The path to the required %SObject. \return The obtained %SObject. - */ SObject FindObjectByPath(in string thePath); -/*! - Returns the path to the %SObject. +/*! \brief Get the path to the %SObject. */ string GetObjectPath(in Object theObject); -/*! - Sets the context of the %Study. - \param thePath String parameter defining the context of the study. +/*! \brief Set the context of the %Study. -
        See also an example of this method usage in batchmode of %SALOME application. + \param thePath String parameter defining the context of the study. +See \ref example23 for an example of this method usage in batchmode of %SALOME application. */ void SetContext(in string thePath); -/*! - Gets the context of the %Study. +/*! \brief Get the context of the %Study. -
        See also an example of this method usage in batchmode of %SALOME application. - +See \ref example23 for an example of this method usage in batchmode of %SALOME application. */ string GetContext(); -/*! - Returns a list of names of objects corresponding to the context. +/*! \brief Get a list of names of objects corresponding to the context. + \note If the parameter theContext is empty, then the current context will be used. */ ListOfStrings GetObjectNames(in string theContext); -/*! - Returns a list of names of directories and subdirectories corresponding to the context. +/*! \brief Get a list of names of directories and subdirectories corresponding to the context. + \note If the parameter theContext is empty, then the current context will be used. */ ListOfStrings GetDirectoryNames(in string theContext); -/*! - Returns a list of names of Files corresponding to the context. +/*! \brief Get a list of names of Files corresponding to the context. + \note If the parameter theContext is empty, then the current context will be used. */ ListOfStrings GetFileNames(in string theContext); -/*! - Returns a list of names of Components corresponding to the context. +/*! \brief Get a list of names of Components corresponding to the context. + \note If the parameter theContext is empty, then the current context will be used. */ ListOfStrings GetComponentNames(in string theContext); -/*! - Creates a new iterator of child levels of the given %SObject. +/*! \brief Create a new iterator of child levels of the given %SObject. + \param aSO The given %SObject \return A new iterator of child levels of the given %SObject. */ ChildIterator NewChildIterator(in SObject aSO); -/*! - Creates a new iterator of the %SComponents. +/*! \brief Create a new iterator of the %SComponents. \return A new iterator of the %SComponents. */ SComponentIterator NewComponentIterator(); -/*! - Creates a new %StudyBuilder to add or modify an object in the study. - \return A new %StudyBuilder. +/*! \brief Create a new %StudyBuilder to add or modify an object in the study. -
        See also an example of this method usage in batchmode of %SALOME application. + \return A new %StudyBuilder. +See \ref example20 for an example of this method usage in batchmode of %SALOME application. */ StudyBuilder NewBuilder() ; /*! \brief Labels dependency @@ -294,28 +271,26 @@ during each working session. /*! \brief Getting properties of the study - Returns the attriubte, which contains the properties of this study. + Returns the attribute, which contains the properties of this study. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example20 for an example of this method usage in batchmode of %SALOME application. */ AttributeStudyProperties GetProperties(); -/*! - Determines whether the %study has been saved +/*! \brief Indicate whether the %study has been saved */ attribute boolean IsSaved; -/*! +/*! \brief Indicate whether the %study has been modified and not saved. + Returns True if the %study has been modified and not saved. */ boolean IsModified(); -/*! - Marks the %study as being modified and not saved. +/*! \brief Mark the %study as being modified and not saved. */ void Modified(); -/*! - Determines the file where the %study has been saved +/*! \brief Indicate the file where the %study has been saved */ attribute string URL; @@ -348,18 +323,15 @@ during each working session. \return An object */ Object ConvertIORToObject(in string theIOR); -/*! - Gets a new %UseCaseBuilder. +/*! \brief Get a new %UseCaseBuilder. */ UseCaseBuilder GetUseCaseBuilder(); -/*! - Closes the components in the study, removes itself from the %StudyManager. +/*! \brief Close the components in the study, remove itself from the %StudyManager. */ void Close(); -/*! - Enables(if isEnabled = True)/disables automatic addition of new %SObjects to the use case. +/*! \brief Enable (if isEnabled = True)/disable automatic addition of new %SObjects to the use case. */ void EnableUseCaseAutoFilling(in boolean isEnabled); @@ -376,15 +348,15 @@ during each working session. boolean DumpStudy(in string thePath, in string theBaseName, in boolean isPublished); -/*! - Returns an AttributeParameter used to store common parameters for given %theSavePoint. +/*! \brief Get an AttributeParameter used to store common parameters for given %theSavePoint. + \param theID identifies a common parameters set (Example: "Interface Applicative") \param theSavePoint is number of a set of parameters as there can be several sets */ AttributeParameter GetCommonParameters(in string theID, in long theSavePoint); -/*! - Returns an AttributeParameter used to store parameters for given %theModuleName. +/*! \brief Get an AttributeParameter used to store parameters for given %theModuleName. + \param theID identifies a common parameters set (Example: "Interface Applicative") \param theModuleName is a name of the module (Example: "Geometry") \param theSavePoint is number of a set of parameters as there can be several sets @@ -392,8 +364,8 @@ during each working session. AttributeParameter GetModuleParameters(in string theID, in string theModuleName, in long theSavePoint); -/*! - Returns a default Python script to restore visual parameters for given %theModuleName. +/*! \brief Get a default Python script to restore visual parameters for given %theModuleName. + \param theID identifies a common parameters set (Example: "Interface Applicative") \param theModuleName is a name of the module (Example: "Geometry") */ @@ -408,101 +380,106 @@ during each working session. long long GetLocalImpl(in string theHostname, in long thePID, out boolean isLocal); -/*! - Marks this Study as being locked by the given locker. The lock status can be checked by method IsStudyLocked +/*! \brief Mark this Study as being locked by the given locker. + + The lock status can be checked by method IsStudyLocked \param theLockerID identifies a locker of the study can be for ex. IOR of the engine that locks the study. */ void SetStudyLock(in string theLockerID); -/*! - Returns True if the Study was marked locked. +/*! \brief Indicate if the Study is locked + + Returns True if the Study was marked locked. */ boolean IsStudyLocked(); -/*! - Marks this Study as being unlocked by the given locker. The lock status can be checked by method IsStudyLocked +/*! \brief Mark this Study as being unlocked by the given locker. + + The lock status can be checked by method IsStudyLocked \param theLockerID identifies a locker of the study can be for ex. IOR of the engine that unlocks the study. */ void UnLockStudy(in string theLockerID); -/*! - Returns the list iof IDs of the Study's lockers. +/*! \brief Get the list of IDs of the Study's lockers. */ ListOfStrings GetLockerID(); -/*! - Create real variable with Name theVarName value theValue - (or set if variable value in to theValue already exists) +/*! \brief Create real variable with Name theVarName and value theValue + + (or set if variable value into theValue already exists) \param theVarName is a name of the variable \param theVarName is a value of the variable. */ void SetReal( in string theVarName, in double theValue ); -/*! - Create integer variable with Name theVarName value theValue - (or set if variable value in to theValue already exists) +/*! \brief Create integer variable with Name theVarName and value theValue + + (or set if variable value into theValue already exists) \param theVarName is a name of the variable \param theVarName is a value of the variable. */ void SetInteger( in string theVarName, in long theValue ); -/*! - Create boolean variable with Name theVarName value theValue - (or set if variable value in to theValue already exists) +/*! \brief Create boolean variable with Name theVarName and value theValue + + (or set if variable value into theValue already exists) \param theVarName is a name of the variable \param theVarName is a value of the variable. */ void SetBoolean( in string theVarName, in boolean theValue ); -/*! - Return real value of the variable +/*! \brief Get value of a real variable + \param theVarName is a name of the variable. */ double GetReal( in string theVarName ); -/*! - Return integer value of the variable +/*! \brief Get value of an integer variable + \param theVarName is a name of the variable. */ long GetInteger( in string theVarName ); -/*! - Return boolean value of the variable +/*! \brief Get value of a boolean variable + \param theVarName is a name of the variable. */ boolean GetBoolean( in string theVarName ); -/*! +/*! \brief Indicate if a variable is real + Return true if variable is real otherwise return false. \param theVarName is a name of the variable. */ boolean IsReal( in string theVarName ); -/*! +/*! \brief Indicate if a variable is integer + Return true if variable is integer otherwise return false. \param theVarName is a name of the variable. */ boolean IsInteger( in string theVarName ); -/*! +/*! \brief Indicate if a variable is boolean + Return true if variable is boolean otherwise return false. \param theVarName is a name of the variable. */ boolean IsBoolean( in string theVarName ); -/*! +/*! \brief Indicate if a variable exists in the study + Return true if variable exists in the study, otherwise return false. \param theVarName is a name of the variable. */ boolean IsVariable( in string theVarName ); -/*! - Return names of all variables from the study. +/*! \brief Get names of all variables from the study. */ ListOfStrings GetVariableNames(); -/*! \brief Removing variable +/*! \brief Remove a variable Remove variable with the specified name from the study with substitution of its value. @@ -511,7 +488,7 @@ during each working session. */ boolean RemoveVariable( in string theVarName ); -/*! \brief Renaming variable +/*! \brief Rename a variable Rename variable with the specified name within the study. @@ -521,7 +498,7 @@ during each working session. */ boolean RenameVariable( in string theVarName, in string theNewVarName ); -/*! \brief Checking variable usage +/*! \brief Indicate whether variable is used Check that variable is used in the study. @@ -564,7 +541,7 @@ during each working session. Creates a new %SComponent \param ComponentDataType Data type of the %SComponent which will be created. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example17 for an example of this method usage in batchmode of %SALOME application. */ SComponent NewComponent(in string ComponentDataType) raises(LockProtection); @@ -587,7 +564,7 @@ during each working session. \param theFatherObject The father %SObject under which this one should be created. \return New %SObject -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example18 for an example of this method usage in batchmode of %SALOME application. */ @@ -620,7 +597,7 @@ during each working session. /*! Loads a %SComponent. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example19 for an example of this method usage in batchmode of %SALOME application. */ void LoadWith (in SComponent sco, in Driver Engine) raises (SALOME::SALOME_Exception); @@ -637,7 +614,7 @@ during each working session. \param anObject The %SObject corresponding to the attribute which is looked for. \param aTypeOfAttribute Type of the attribute. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ GenericAttribute FindOrCreateAttribute(in SObject anObject, @@ -661,7 +638,7 @@ during each working session. \param anObject The %SObject corresponding to the attribute. \param aTypeOfAttribute Type of the attribute. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example17 for an example of this method usage in batchmode of %SALOME application. */ void RemoveAttribute(in SObject anObject, in string aTypeOfAttribute) raises(LockProtection); @@ -685,7 +662,7 @@ during each working session. Adds a directory in the %Study. \param theName String parameter defining the name of the directory. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example23 for an example of this method usage in batchmode of %SALOME application. */ void AddDirectory(in string theName) raises(LockProtection); @@ -712,7 +689,7 @@ Searches for a definite %SObject with a definite GUID and returns True if it fin Creates a new command which can contain several different actions. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example3 for an example of this method usage in batchmode of %SALOME application. */ void NewCommand(); // command management @@ -722,7 +699,7 @@ Searches for a definite %SObject with a definite GUID and returns True if it fin \exception LockProtection This exception is raised, when trying to perform this command a study, which is protected for modifications. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example16 for an example of this method usage in batchmode of %SALOME application. */ void CommitCommand() raises(LockProtection); // command management @@ -734,7 +711,7 @@ Searches for a definite %SObject with a definite GUID and returns True if it fin Cancels all actions declared within the command. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example17 for an example of this method usage in batchmode of %SALOME application. */ void AbortCommand(); // command management /*! \brief Undolimit @@ -748,7 +725,7 @@ Searches for a definite %SObject with a definite GUID and returns True if it fin \exception LockProtection This exception is raised, when trying to perform this command a study, which is protected for modifications. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example16 for an example of this method usage in batchmode of %SALOME application. */ void Undo() raises (LockProtection); @@ -758,21 +735,21 @@ Searches for a definite %SObject with a definite GUID and returns True if it fin \exception LockProtection This exception is raised, when trying to perform this command a study, which is protected for modifications. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example16 for an example of this method usage in batchmode of %SALOME application. */ void Redo() raises (LockProtection); /*! Returns True if at this moment there are any actions which can be canceled. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example16 for an example of this method usage in batchmode of %SALOME application. */ boolean GetAvailableUndos(); /*! Returns True if at this moment there are any actions which can be redone. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example3 for an example of this method usage in batchmode of %SALOME application. */ boolean GetAvailableRedos(); @@ -837,7 +814,7 @@ Searches for a definite %SObject with a definite GUID and returns True if it fin \param study_name String parameter defining the name of the study -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example17 for an example of this method usage in batchmode of %SALOME application. */ Study NewStudy(in string study_name); @@ -848,7 +825,7 @@ Searches for a definite %SObject with a definite GUID and returns True if it fin \param aStudyUrl The path to the study \warning This method doesn't activate the corba objects. Only a component can do it. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ Study Open (in URL aStudyUrl) raises (SALOME::SALOME_Exception); @@ -863,7 +840,7 @@ Searches for a definite %SObject with a definite GUID and returns True if it fin \param theMultiFile If this parameter is True the study will be saved in several files. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example19 for an example of this method usage in batchmode of %SALOME application. */ boolean Save(in Study aStudy, in boolean theMultiFile); @@ -880,7 +857,7 @@ Searches for a definite %SObject with a definite GUID and returns True if it fin \param aStudy The study which will be saved \param theMultiFile If this parameter is True the study will be saved in several files. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ boolean SaveAs(in URL aUrl, // if the file already exists in Study aStudy, @@ -1027,7 +1004,7 @@ Gets the list of open studies \param aTypeOfAttribute String value defining the type of the required attribute of the given %SObject. \return True if it finds an attribute of a definite type of the given %SObject as well as the discovered attribute. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ boolean FindAttribute(out GenericAttribute anAttribute, in string aTypeOfAttribute); @@ -1041,7 +1018,7 @@ Gets the list of open studies \return The list of all attributes of the given %SObject. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example17 for an example of this method usage in batchmode of %SALOME application. */ ListOfAttributes GetAllAttributes(); @@ -1107,14 +1084,17 @@ Gets the list of open studies */ void CheckLocked() raises (LockProtection); + //! Get Type string Type(); + //! Get the class type string GetClassType(); + //! Get SObject SObject GetSObject(); + //! Private method, returns an implementation of this GenericAttribute. /*! - Private method, returns an implementation of this GenericAttribute. \param theHostname is a hostname of the caller \param thePID is a process ID of the caller \param isLocal is set True if the GenericAttribute is launched locally with the caller @@ -1134,12 +1114,12 @@ Gets the list of open studies //========================================================================== interface SComponent : SObject { -/*! Gets the data type of the given %SComponent +/*! \brief Gets the data type of the given %SComponent \return The data type of this %SComponent. */ string ComponentDataType(); -/*! Gets the IOR of the given component +/*! \brief Gets the IOR of the given component \return True (if there is an instance of the given component) and its IOR. */ @@ -1158,22 +1138,22 @@ Gets the list of open studies interface SComponentIterator : SALOME::GenericObj { /*! -Activates the %SComponentIterator. +\brief Activates the %SComponentIterator. */ void Init(); -/*! Method More +/*! \brief Method More \return True if there is one more %SComponent in the list. */ boolean More(); /*! -Moves the iterator to the next %SComponent in the list. +\brief Moves the iterator to the next %SComponent in the list. */ void Next(); /*! - Returns the %SComponent corresponding to the current %SComponent found by the iterator. + \brief Returns the %SComponent corresponding to the current %SComponent found by the iterator. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ SComponent Value(); @@ -1190,27 +1170,27 @@ Moves the iterator to the next %SComponent in the list. { /*! -Activates the %ChildIterator. +\brief Activates the %ChildIterator. */ void Init(); /*! -Activates the %ChildIterator for all child levels. +\brief Activates the %ChildIterator for all child levels. \param allLevels If this boolean parameter is True, the %ChildIterator will be activated for all child levels. */ void InitEx(in boolean allLevels); -/*! Method More +/*! \brief Method More \return True if there is one more %ChildIterator in the list. */ boolean More(); /*! - Passes the iterator to the next level. + \brief Passes the iterator to the next level. */ void Next(); /*! - Returns the %SObject corresponding to the current object found by the iterator. + \brief Returns the %SObject corresponding to the current object found by the iterator. */ SObject Value(); }; @@ -1336,7 +1316,7 @@ can be called by any component and which provide the following functionality: \param isMultiFile If the value of this boolean parameter is True, the data will be saved in several files. \return A byte stream TMPFile that contains all saved data -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example19 for an example of this method usage in batchmode of %SALOME application. */ @@ -1351,7 +1331,7 @@ can be called by any component and which provide the following functionality: \param isMultiFile If the value of this boolean parameter is True, the data will be saved in several files. \return A byte stream TMPFile that will contain all saved data -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example19 for an example of this method usage in batchmode of %SALOME application. */ TMPFile SaveASCII(in SComponent theComponent, in string theURL, in boolean isMultiFile); diff --git a/idl/SALOMEDS_Attributes.idl b/idl/SALOMEDS_Attributes.idl index 787f9aadd..dd49ef584 100644 --- a/idl/SALOMEDS_Attributes.idl +++ b/idl/SALOMEDS_Attributes.idl @@ -19,11 +19,12 @@ // // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// File : SALOMEDS.idl +// File : SALOMEDS_Attributes.idl // Author : Yves FRICAUD // $Header$ // -/*! \file SALOMEDS_Attributes.idl This file contains a set of interfaces +/*! \file SALOMEDS_Attributes.idl + \brief This file contains a set of interfaces for the attributes which can be assigned to %SObject */ #ifndef _SALOMEDS_AttributesIDL_ @@ -33,28 +34,23 @@ module SALOMEDS { -/*! Sequence of double values -*/ +//! Sequence of double values typedef sequence DoubleSeq; -/*! Sequence of long values -*/ +//! Sequence of long values typedef sequence LongSeq; -/*! Sequence of string values -*/ +//! Sequence of string values typedef sequence StringSeq; -/*! \struct Color - This structure stores a set of elements defining the color based on RGB palette. These elements are +/*! \brief This structure stores a set of elements defining the color based on RGB palette. + + These elements are used as input parameters for methods necessary for color definition of different items. */ struct Color { -/*! Red color -*/ +//! Red color double R; -/*! Green color -*/ +//! Green color double G; -/*! Blue color -*/ +//! Blue color double B; }; //========================================================================== @@ -66,16 +62,16 @@ module SALOMEDS interface AttributeReal : GenericAttribute { +//! Returns the value of this attribute. /*! - Returns the value of this attribute. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ double Value(); + //! Sets the value of this attribute. /*! - Sets the value of this attribute. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ void SetValue(in double value); @@ -88,16 +84,17 @@ module SALOMEDS //========================================================================== interface AttributeInteger : GenericAttribute { + //! Returns the value of this attribute /*! - Returns the value of this attribute -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ long Value(); + + //! Sets the value of this attribute /*! - Sets the value of this attribute -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ void SetValue(in long value); }; @@ -109,51 +106,45 @@ module SALOMEDS //========================================================================== interface AttributeSequenceOfReal : GenericAttribute { + //! Initialization of the attribute with initial data. /*! - Initialization of the attribute with initial data. \param other Initially assigned sequence of real numbers. */ void Assign (in DoubleSeq other); -/*! - Returns the sequence of real numbers stored in the attribute. -*/ +//! Returns the sequence of real numbers stored in the attribute. DoubleSeq CorbaSequence(); -/*! - Adds to the end of the sequence a real number. +/*! \brief Adds to the end of the sequence a real number. \param value A real number added to the sequence. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example3 for an example of this method usage in batchmode of %SALOME application. */ void Add (in double value); -/*! - Removes a real number with a definite index +/*! \brief Removes a real number with a definite index from the sequence of real numbers stored in the Attribute. \param index The index of the given real number */ void Remove(in long index); -/*! - Substitutes a given real number with a definite index for another real number. +/*! \brief Substitutes a given real number with a definite index for another real number. + \param index The index of the given real number. \param value The value of another real number. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example3 for an example of this method usage in batchmode of %SALOME application. */ void ChangeValue(in long index, in double value); -/*! - Returns a given real number with a definite index - in the sequence of real numbers stored in the Attribute. +/*! \brief Returns a given real number with a definite index in the sequence of real numbers stored in the Attribute. + \param index The index of the given real number. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ double Value(in short index); -/*! - Returns the length of the sequence of real numbers stored in the Attribute. +/*! \brief Returns the length of the sequence of real numbers stored in the Attribute. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example3 for an example of this method usage in batchmode of %SALOME application. */ long Length(); @@ -166,51 +157,44 @@ module SALOMEDS //========================================================================== interface AttributeSequenceOfInteger : GenericAttribute { -/*! - Initialisation of the attribute with initial data. +/*! \brief Initialisation of the attribute with initial data. \param other Initially assigned sequence of integer numbers. */ void Assign (in LongSeq other); -/*! - Returns the sequence of integer numbers stored in the Attribute. -*/ +//! Returns the sequence of integer numbers stored in the Attribute. LongSeq CorbaSequence(); -/*! - Adds to the end of the sequence an integer number. +/*! \brief Adds to the end of the sequence an integer number. + \param value An integer number added to the sequence. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example3 for an example of this method usage in batchmode of %SALOME application. */ void Add (in long value); -/*! - Removes an integer number with a definite index - from the sequence of integer numbers stored in the Attribute. +/*! \brief Removes an integer number with a definite index from the sequence of integer numbers stored in the Attribute. + \param index The index of the given integer number. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example3 for an example of this method usage in batchmode of %SALOME application. */ void Remove(in long index); -/*! - Substitutes an integer number with a definite index for another integer number. +/*! \brief Substitutes an integer number with a definite index for another integer number. + \param index The index of the given integer number. \param value The value of another integer number. */ void ChangeValue(in long index, in long value); -/*! - Returns a given integer number with a definite index - in the sequence of integer numbers stored in the Attribute. +/*! \brief Returns a given integer number with a definite index in the sequence of integer numbers stored in the Attribute. \param index The index of the given integer number. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ long Value(in short index); -/*! - Returns the length of the sequence of integer numbers stored in the Attribute. +/*! \brief Returns the length of the sequence of integer numbers stored in the Attribute. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example3 for an example of this method usage in batchmode of %SALOME application. */ long Length(); @@ -226,18 +210,16 @@ module SALOMEDS interface AttributeName : GenericAttribute { -/*! - Returns the value of this attribute +/*! \brief Returns the value of this attribute -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ string Value(); -/*! - Sets the value of this attribute +/*! \brief Sets the value of this attribute \param value This parameter defines the value of this attribute. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ void SetValue(in string value); }; @@ -251,17 +233,15 @@ module SALOMEDS //========================================================================== interface AttributeComment : GenericAttribute { -/*! - Returns the value of this attribute +/*! \brief Returns the value of this attribute -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ string Value(); -/*! - Sets the value of this attribute +/*! \brief Sets the value of this attribute \param value This string parameter defines the value of this attribute - a description of a %SObject. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ void SetValue(in string value); }; @@ -295,14 +275,14 @@ module SALOMEDS /*! Returns the value of this attribute -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ string Value(); /*! Sets the value of this attribute \param value This parameter defines the value of this attribute - IOR of a %SObject. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ void SetValue(in string value); }; @@ -318,14 +298,14 @@ module SALOMEDS /*! Returns the value of this attribute -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ string Value(); /*! Sets the value of this attribute \param value This parameter defines the value of this attribute. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ void SetValue(in string value); }; @@ -340,12 +320,12 @@ module SALOMEDS { /*! Returns the value of this attribute -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ string Value(); /*! Sets the value of this attribute -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ void SetValue(in string value); }; @@ -360,12 +340,12 @@ module SALOMEDS { /*! Returns the value of this attribute -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ string Value(); /*! Sets the value of this attribute -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ void SetValue(in string value); }; @@ -387,7 +367,7 @@ module SALOMEDS /*! Returns TRUE if the item is drawable (as it is by default) and FALSE if it isn't. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example8 for an example of this method usage in batchmode of %SALOME application. */ boolean IsDrawable(); @@ -396,7 +376,7 @@ Sets the item to be drawable. \param value If the value of this boolean parameter is TRUE (default) the item will be drawable. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example8 for an example of this method usage in batchmode of %SALOME application. */ void SetDrawable(in boolean value); @@ -415,7 +395,7 @@ Sets the item to be drawable. Returns TRUE if the item is selectable (as it is by default) and FALSE if it isn't. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example9 for an example of this method usage in batchmode of %SALOME application. */ boolean IsSelectable(); @@ -424,7 +404,7 @@ Sets the item to be selectable \param value If the value of this parameter is TRUE (the default) the item will be set as selectable. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example9 for an example of this method usage in batchmode of %SALOME application. */ void SetSelectable(in boolean value); @@ -443,7 +423,7 @@ Sets the item to be selectable /*! Returns TRUE if this item is expandable even when it has no children. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example10 for an example of this method usage in batchmode of %SALOME application. */ boolean IsExpandable(); @@ -451,7 +431,7 @@ Sets the item to be selectable \param value If the value of this boolean parameter is TRUE, this item will be set as expandable. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example10 for an example of this method usage in batchmode of %SALOME application. */ void SetExpandable(in boolean value); @@ -500,7 +480,7 @@ Sets the item to be selectable /*! Returns TRUE if this item is open (its children are visible) and FALSE if it isn't. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example11 for an example of this method usage in batchmode of %SALOME application. */ boolean IsOpened(); @@ -510,7 +490,7 @@ Sets the item to be selectable \param value If the value of this boolean parameter is TRUE this item will be set as open, and as closed if FALSE. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example11 for an example of this method usage in batchmode of %SALOME application. */ void SetOpened(in boolean value); @@ -526,7 +506,7 @@ Sets the item to be selectable /*! Returns the color of an item. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example12 for an example of this method usage in batchmode of %SALOME application. */ Color TextColor(); @@ -535,7 +515,7 @@ Sets the item to be selectable \param value This parameter defines the color of the item. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example12 for an example of this method usage in batchmode of %SALOME application. */ void SetTextColor(in Color value); @@ -554,7 +534,7 @@ Sets the item to be selectable -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example13 for an example of this method usage in batchmode of %SALOME application. */ Color TextHighlightColor(); @@ -562,7 +542,7 @@ Sets the item to be selectable Sets the highlight color of an item. \param value This parameter defines the highlight color of the item. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example13 for an example of this method usage in batchmode of %SALOME application. */ void SetTextHighlightColor(in Color value); @@ -582,7 +562,7 @@ Sets the item to be selectable /*! Returns the name of the icon in the format of a string. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example14 for an example of this method usage in batchmode of %SALOME application. */ string GetPixMap(); @@ -590,7 +570,7 @@ Sets the item to be selectable Sets the name of the icon. \param value This string parameter defines the name of the icon. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example14 for an example of this method usage in batchmode of %SALOME application. */ void SetPixMap(in string value); @@ -603,7 +583,7 @@ Sets the item to be selectable tree whith its own structure and identifier. The quantity of such trees with different identifiers can be arbitrary. -
        See also an example of usage of the methods of this interface in batchmode of %SALOME application. +See \ref example18 for an example of usage of the methods of this interface in batchmode of %SALOME application. */ //========================================================================== @@ -691,7 +671,7 @@ Sets the item to be selectable /*! Deletes a tree node. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example3 for an example of this method usage in batchmode of %SALOME application. */ void Remove(); @@ -734,7 +714,7 @@ Sets the item to be selectable /*! Returns the value of this attribute. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ long Value(); /*! @@ -742,7 +722,7 @@ Sets the item to be selectable \param value This parameter defines the local ID which will be set. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ void SetValue(in long value); }; @@ -758,13 +738,13 @@ Sets the item to be selectable /*! Returns the value of this attribute -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ string Value(); /*! Sets the value of this attribute -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example1 for an example of this method usage in batchmode of %SALOME application. */ void SetValue(in string value); }; @@ -783,7 +763,7 @@ Sets the item to be selectable /*! Adds a %SObject to the list of %SObjects which refer to this %SObject. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example3 for an example of this method usage in batchmode of %SALOME application. */ void Add(in SObject anObject); @@ -794,7 +774,7 @@ Sets the item to be selectable /*! Deletes a %SObject from the list of %SObjects which refer to this %SObject. -
        See also an example of this method usage in batchmode of %SALOME application. +See \ref example3 for an example of this method usage in batchmode of %SALOME application. */ void Remove(in SObject anObject); @@ -805,20 +785,16 @@ Sets the item to be selectable This attribute allows to store a table of integers (indexing from 1 like in CASCADE) and string titles of this table, of each row, of each column. -
        See also an example of usage of these methods in batchmode of %SALOME application. +See \ref example21 for an example of usage of these methods in batchmode of %SALOME application. */ //========================================================================== interface AttributeTableOfInteger : GenericAttribute { -/*! - This exception is raised when an incorrect index is passed as parameter. -*/ +//! This exception is raised when an incorrect index is passed as parameter. exception IncorrectIndex {}; -/*! - This exception is raised when an incorrect length of the argument is passed as parameter. -*/ +//! This exception is raised when an incorrect length of the argument is passed as parameter. exception IncorrectArgumentLength {}; // titles: for table, for each row, for each column @@ -964,20 +940,16 @@ Sets the item to be selectable This attribute allows to store a table of reals (indexing from 1 like in CASCADE) and string titles of this table, of each row, of each column. -
        See also an example of usage of these methods in batchmode of %SALOME application. +See \ref example21 for an example of usage of these methods in batchmode of %SALOME application. */ //========================================================================== interface AttributeTableOfReal : GenericAttribute { -/*! - This exception is raised when an incorrect index is passed as parameter. -*/ +//! This exception is raised when an incorrect index is passed as parameter. exception IncorrectIndex {}; -/*! - This exception is raised when an incorrect length of the argument is passed as parameter. -*/ +//! This exception is raised when an incorrect length of the argument is passed as parameter. exception IncorrectArgumentLength {}; // titles: for table, for each row, for each column @@ -1114,20 +1086,16 @@ Sets the item to be selectable This attribute allows to store a table of strings (indexing from 1 like in CASCADE) and string titles of this table, of each row, of each column. -
        See also an example of usage of these methods in batchmode of %SALOME application. +See \ref example21 for an example of usage of these methods in batchmode of %SALOME application. */ //========================================================================== interface AttributeTableOfString : GenericAttribute { -/*! - This exception is raised when an incorrect index is passed as parameter. -*/ +//! This exception is raised when an incorrect index is passed as parameter. exception IncorrectIndex {}; -/*! - This exception is raised when an incorrect length of the argument is passed as parameter. -*/ +//! This exception is raised when an incorrect length of the argument is passed as parameter. exception IncorrectArgumentLength {}; // titles: for table, for each row, for each column @@ -1263,7 +1231,7 @@ Sets the item to be selectable This attribute allows to store study properties: user name, creation date, creation mode, modified flag, locked flag. -
        See also an example of usage of these methods in batchmode of %SALOME application. +See \ref example20 for an example of usage of these methods in batchmode of %SALOME application. */ //========================================================================== diff --git a/idl/SALOME_Comm.idl b/idl/SALOME_Comm.idl index 3c2e3f173..31d5d9643 100644 --- a/idl/SALOME_Comm.idl +++ b/idl/SALOME_Comm.idl @@ -24,6 +24,11 @@ #include "SALOME_Exception.idl" +/*! + \file SALOME_Comm.idl \brief This file contains a set of interfaces used for communication + between components + */ + module SALOME { enum TypeOfDataTransmitted { _DOUBLE_,_INT_ }; diff --git a/idl/SALOME_Component.idl b/idl/SALOME_Component.idl index d12f1e190..e47f886d0 100644 --- a/idl/SALOME_Component.idl +++ b/idl/SALOME_Component.idl @@ -29,6 +29,9 @@ #include "SALOMEDS.idl" #include "SALOME_Exception.idl" +/*! \file SALOME_Component.idl \brief interfaces for Component and Container +*/ + /*! \brief This is a package of interfaces used for connecting new components to %SALOME application. It also contains a set of interfaces used for management of %MED @@ -42,9 +45,7 @@ module Engines */ typedef sequence TMPFile; - /*! - General Key Value Structure to set or get properties, for component - */ + //! General Key Value Structure to set or get properties, for component struct KeyValuePair { string key; @@ -66,8 +67,8 @@ module Engines interface Container { - /*! - Loads a new component class (dynamic library). + /*! \brief Loads a new component class (dynamic library). + \param componentName like COMPONENT, (Python or C++ implementation) try to make a Python import of COMPONENT, then a lib open of libCOMPONENTEngine.so @@ -75,8 +76,8 @@ module Engines */ boolean load_component_Library(in string componentName); + //! Create a new servant instance of a component. /*! - Creates a new servant instance of a component. Component library must be loaded. \param componentName Name of the component which will be registered in Registry and Name Service, @@ -88,8 +89,8 @@ module Engines Engines::Component create_component_instance(in string componentName, in long studyId); + //! Find a servant instance of a component /*! - Finds a servant instance of a component \param registeredName Name of the component in Registry or Name Service, without instance suffix number \param studyId 0 if instance is not associated to a study, @@ -99,8 +100,8 @@ module Engines Component find_component_instance(in string registeredName, in long studyId); + //! Find a servant instance of a component, or create a new one. /*! - Find a servant instance of a component, or create a new one. Loads the component library if needed. Only applicable to multiStudy components. \param nameToRegister Name of the component which will be registered @@ -112,52 +113,37 @@ module Engines Component load_impl(in string nameToRegister, in string componentName); + //! Remove the component servant, and deletes all related objects /*! - Stops the component servant, and deletes all related objects \param component_i Component to be removed */ void remove_impl(in Component component_i); - /*! - Discharges all components from the container. - */ + //! Unload component libraries from the container. void finalize_removal() ; - /*! - Determines whether the server has been loaded or not. - */ + //! Determines whether the server has been loaded or not. void ping(); - /*! - Name of the %container - */ + //! Name of the %container readonly attribute string name ; - /*! - working directory of the %container - */ + //! working directory of the %container readonly attribute string workingdir ; - /*! - name of the %container log file (this has been set by the launcher) - */ + //! name of the %container log file (this has been set by the launcher) attribute string logfilename ; - /*! - Shutdown the Container process. - */ + //! Shutdown the Container process. void Shutdown(); - /*! - Returns the hostname of the container - */ + //! Returns the hostname of the container string getHostName(); - /*! - Returns the PID of the container - */ + //! Returns the PID of the container long getPID(); + //! Kill the container /*! Returns True if the %container has been killed. Kept for Superv compilation but can't work, unless oneway... @@ -165,6 +151,7 @@ module Engines */ boolean Kill_impl() ; + //! Create a fileRef /*! returns a fileRef object if origFileName exists and is readable else returns null object. Only one fileRef is created for a given @@ -173,6 +160,7 @@ module Engines */ fileRef createFileRef(in string origFileName); + //! Create a Salome_file /*! returns a Salome_file object if origFileName exists and is readable else returns null object. @@ -183,6 +171,7 @@ module Engines */ Salome_file createSalome_file(in string origFileName); + //! Create a fileTransfer /*! returns a fileTransfer object used to copy files from the container machine to the clients machines. Only one fileTransfer instance is @@ -198,30 +187,25 @@ module Engines */ interface Component { - /*! - The name of the instance of the %Component - */ + //! The name of the instance of the %Component readonly attribute string instanceName ; - /*! - The name of the interface of the %Component - */ + //! The name of the interface of the %Component readonly attribute string interfaceName ; - /*! - Determines whether the server has already been loaded or not. - */ + //! Determines whether the server has already been loaded or not. void ping(); -// /*! +// // Set study associated to component instance // \param studyId // (=0: multistudy component instance, // >0: study id associated to this instance // \return false if already set with a different value (change not possible) -// */ +// // boolean setStudyId(in long studyId); + //! Get study associated to component instance /*! get study associated to component instance \return -1: not initialised (Internal Error) @@ -230,6 +214,7 @@ module Engines */ long getStudyId(); + //! Remove component instance from container /*! Deactivates the %Component. -- TO BE USED BY CONTAINER ONLY (Container housekeeping) -- @@ -237,11 +222,10 @@ module Engines */ void destroy() ; - /*! - Returns the container that the %Component refers to. - */ + //! Returns the container that the %Component refers to. Container GetContainerRef() ; + //! Set component instance properties /*! Gives a sequence of (key=string,value=any) to the component. Base class component stores the sequence in a map. @@ -250,12 +234,14 @@ module Engines */ void setProperties(in FieldsDict dico); + //! Get component instance properties /*! returns a previously stored map (key=string,value=any) as a sequence. See setProperties(in FieldsDict dico). */ FieldsDict getProperties(); + //! Set name of a node in a graph (for %SUPERVISOR use) /*! This method is used by the %SUPERVISOR component. It sets the names of the graph and of the node. @@ -264,33 +250,39 @@ module Engines */ void Names( in string aGraphName , in string aNodeName ) ; + //! Kill the component (if you can) /*! Returns True if the %Component has been killed. */ boolean Kill_impl() ; + //! Stop the component (if you can) /*! Returns True if the activity of the %Component has been stopped. (It's action can't be resumed) */ boolean Stop_impl() ; + //! Suspend the component /*! Returns True if the activity of the %Component has been suspended. (It's action can be resumed) */ boolean Suspend_impl() ; + //! Resume the component /*! Returns True if the activity of the %Component has been resumed. */ boolean Resume_impl() ; + //! Get the cpu used /*! - Returns the Cpu used (long does not run with python !...) + Returns the Cpu used */ long CpuUsed_impl() ; + //! Get a python dump /*! Returns a python script, which is being played back reproduces the data model of component @@ -300,8 +292,8 @@ module Engines out boolean isValidScript); + //! Returns a CORBA Ref of a input Salome_file managed by a service. /*! - Returns a CORBA Ref of a input Salome_file managed by a service. \param service_name service's name. \param file_name name of the requested file. @@ -314,6 +306,7 @@ module Engines Engines::Salome_file getInputFileToService(in string service_name, in string Salome_file_name) raises(SALOME::SALOME_Exception); + //! Check service input files (transfer them if needed) /*! This method is used before the activation of the service. It calls recvFiles() on all the input Salome_file files of the service. @@ -331,8 +324,8 @@ module Engines */ void checkInputFilesToService(in string service_name) raises(SALOME::SALOME_Exception); + //! This method adds a input Salome_file to a service of the component. /*! - This method adds a input Salome_file to a service of the component. \param service_name service's name. \param Salome_file_name name of the Salome_file @@ -345,8 +338,8 @@ module Engines Engines::Salome_file setInputFileToService(in string service_name, in string Salome_file_name) raises(SALOME::SALOME_Exception); + //! Returns a CORBA Ref of a output Salome_file managed by a service. /*! - Returns a CORBA Ref of a output Salome_file managed by a service. \param service_name service's name. \param file_name name of the requested file. @@ -359,6 +352,7 @@ module Engines Engines::Salome_file getOutputFileToService(in string service_name, in string Salome_file_name) raises(SALOME::SALOME_Exception); + //! Check service output files (transfer them if needed) /*! This method is used at the end of the service. It calls recvFiles() on all the output Salome_file files of the service. @@ -376,8 +370,8 @@ module Engines */ void checkOutputFilesToService(in string service_name) raises(SALOME::SALOME_Exception); + //! This method adds an output Salome_file to a service of the component. /*! - This method adds an output Salome_file to a service of the component. \param service_name service's name. \param Salome_file_name name of the Salome_file @@ -389,6 +383,8 @@ module Engines */ Engines::Salome_file setOutputFileToService(in string service_name, in string Salome_file_name) raises(SALOME::SALOME_Exception); + + //! Indicate if the component instance provides custom information about its objects. /*! Returns true if the component provides custom information about its objects, false otherwise. Should be redefined in the certain component to return true in case of this @@ -396,6 +392,7 @@ module Engines */ boolean hasObjectInfo(); + //! Get custom information about the given object. /*! This method is used to get the custom information about the given object. Should be redefined in the certain component in case of this @@ -414,10 +411,7 @@ module Engines 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. - */ + //! A block of binary data used for file transfer. The maximum size of the block is defined on server side. typedef sequence fileBlock; /*! \brief Interface of fileTransfer. @@ -426,6 +420,7 @@ module Engines */ interface fileTransfer { + //! Open the file transfer /*! open method returns a key (fileId) that identifies the structure (ex: C FILE), associated to the original file on the server. @@ -436,12 +431,14 @@ module Engines */ long open(in string fileName); + //! Close the file transfer /*! when the file transfer is finished, close method releases structures created by open method, identified by fileId. */ void close(in long fileId); + //! Get a file data block /*! Get successive blocks of octets from the original file. The last block is empty, and identifies the end of file. @@ -449,36 +446,35 @@ module Engines fileBlock getBlock(in long fileId); }; - /*! - This is a file managed by a Salome_file. It contains file's name, path and status. - The status is : "present" or "notpresent". - */ + //! A file managed by a Salome_file. struct file { + //! file name string file_name; - string path; + //! path name + string path; string type; string source_file_name; - string status; + //! status ("present" or "notpresent") + string status; long node; Engines::Container container; }; - /*! - A sequence of Engines::file. - */ + //! A sequence of Engines::file. typedef sequence files; - /*! - It is the state of a Salome_file. It contains the Salome_file's name, the name - of the hdf5 file where it can be saved, the number of files managed and the information - if all the files are received. - */ + //! The state of a Salome_file. struct SfState { - string name; - string hdf5_file_name; - long number_of_files; - boolean files_ok; + //! file name + string name; + //! hdf5 file where the file can be saved + string hdf5_file_name; + //! number of files managed + long number_of_files; + //! information if all the files are received + boolean files_ok; + }; /*! \brief Interface of a Salome_file managed @@ -488,8 +484,8 @@ module Engines */ interface Salome_file : Engines::fileTransfer { + //! Load a Salome_file from a hdf5 file. /*! - Load a Salome_file from a hdf5 file. \param hdf5_file name (with path) of the hdf5_file. @@ -497,8 +493,8 @@ module Engines */ void load(in string hdf5_file) raises (SALOME::SALOME_Exception); + //! Save a Salome_file into a hdf5_file. /*! - Save a Salome_file into a hdf5_file. \param hdf5_file name (with path) of the hdf5_file. @@ -507,9 +503,9 @@ module Engines */ void save(in string hdf5_file) raises (SALOME::SALOME_Exception); + //! Save a Salome_file into a hdf5_file. /*! - Save a Salome_file into a hdf5_file. All files that are managed - are saved into the hdf5_file + All files that are managed are saved into the hdf5_file \param hdf5_file name (with path) of the hdf5_file. @@ -520,8 +516,8 @@ module Engines /**************/ + //! Add a Local file to the Salome_file. /*! - Add a Local file to the Salome_file. \param file_name name of the file with the path. @@ -529,8 +525,8 @@ module Engines */ void setLocalFile(in string comp_file_name) raises (SALOME::SALOME_Exception); + //! Add a Distributed file to the Salome_file. /*! - Add a Distributed file to the Salome_file. \param comp_file_name name of the file with the path. @@ -538,8 +534,8 @@ module Engines */ void setDistributedFile(in string comp_file_name) raises (SALOME::SALOME_Exception); + //! Connect a Salome_file with another Salome_file. /*! - Connect a Salome_file with another Salome_file. It works only if the Salome_file managed only one file \param source_Salome_file Salome_file that managed the distributed version of the file. @@ -548,8 +544,8 @@ module Engines */ void connect(in Engines::Salome_file source_Salome_file) raises (SALOME::SALOME_Exception); + //! Connect the managed file file_name to a Salome_file. /*! - Connect the managed file file_name to a Salome_file. \param file_name name of the file without the path. \param source_Salome_file Salome_file that managed the distributed version of the file. @@ -559,8 +555,8 @@ module Engines void connectDistributedFile(in string file_name, in Engines::Salome_file source_Salome_file) raises (SALOME::SALOME_Exception); + //! Connect the file_name with a Distributed file_name. /*! - Connect the file_name with a Distributed file_name. \param file_name name of the file without the path. \param source_file_name It's the name of the file managed by the distributed source Salome_file. @@ -572,9 +568,8 @@ module Engines /**************/ + //! Get all the distributed files managed by the Salome_file and check all the local files. /*! - Get all the distributed files managed by the Salome_file and - check all the local files. \exception raised if some of the files are not ok. */ @@ -582,8 +577,8 @@ module Engines /**************/ + //! Remove a file of the Salome_file. /*! - Remove a file of the Salome_file. \param file_name name of the file. @@ -591,21 +586,19 @@ module Engines */ void removeFile(in string file_name) raises (SALOME::SALOME_Exception); - /*! - Remove all the files of the Salome_file. - */ + //! Remove all the files of the Salome_file. void removeFiles(); /**************/ + //! Get the list of the files managed by the Salome_file. /*! - Get the list of the files managed by the Salome_file. The list can be empty. */ Engines::files getFilesInfos(); + //! Get a file managed by the Salome_file. /*! - Get a file managed by the Salome_file. \param file_name the name of the file. @@ -615,14 +608,12 @@ module Engines */ Engines::file getFileInfos(in string file_name) raises (SALOME::SALOME_Exception); - /*! - Return the state of the Salome_file. - */ + //! Return the state of the Salome_file. Engines::SfState getSalome_fileState(); + //! Set the container where files are. /*! - Set the container where files are. \param container container CORBA's reference. */ @@ -648,7 +639,9 @@ module Engines */ interface fileRef { + //! the original file readonly attribute string origFileName; + //! the machine of the original file readonly attribute string refMachine; Container getContainer(); diff --git a/idl/SALOME_ContainerManager.idl b/idl/SALOME_ContainerManager.idl index 7fe11b29b..32b8e364e 100644 --- a/idl/SALOME_ContainerManager.idl +++ b/idl/SALOME_ContainerManager.idl @@ -25,20 +25,22 @@ #include "SALOME_Exception.idl" #include "SALOME_Component.idl" +/*! \file SALOME_ContainerManager.idl \brief interfaces for %SALOME launcher and container manager +*/ + module Engines { -/*! - Type to transmit list of machines. -*/ +//! Type to transmit list of machines. typedef sequence MachineList; +//! components list typedef sequence CompoList; +//! files list typedef sequence FilesList; +//! modules list typedef sequence ModulesList; -/*! - Type to describe properties of resource. -*/ +//! Type to describe properties of a resource. struct MachineParameters { string container_name; @@ -63,26 +65,31 @@ struct MachineParameters long nb_component_nodes; }; -/*! - exception thrown if a computer is not found in the catalog -*/ +//! exception thrown if a computer is not found in the catalog exception NotFound {}; - enum policy {P_FIRST,P_CYCL,P_BEST}; +//! enumeration to set a resource management policy + enum policy { + //! first machine in the list of admissible computers + P_FIRST, + //! next machine in the list of admissible computers + P_CYCL, + //! best machine in the list of admissible computers + P_BEST}; +//! resource management policy typedef policy ResPolicy; -/*! - Structure used for Salome Batch Job parameters -*/ +//! Structure used for Salome Batch Job parameters struct BatchParameters { - string batch_directory; // Where batch command will be launched - // and log files will be created - string expected_during_time; // Time for the batch - // has to be like this : hh:mm - string mem; // Minimum of memory needed - // has to be like : 32gb or 512mb - long nb_proc; // Number of processors requested + //! Where batch command will be launched and log files will be created + string batch_directory; + //! Time for the batch (has to be like this : hh:mm) + string expected_during_time; + //! Minimum of memory needed (has to be like : 32gb or 512mb) + string mem; + //! Number of processors requested + long nb_proc; }; /*! \brief Interface of the %salomelauncher @@ -116,11 +123,12 @@ struct BatchParameters */ interface ContainerManager { + //! Find an existing container satisfying the constraints given by input parameters or start a new one. Container FindOrStartContainer( in MachineParameters params, in MachineList possibleComputers); - /*! - This operation launches a PaCO++ container. + //! This operation launches a PaCO++ container. + /*! \param Description of the container resquested. \param List of computers ressources. @@ -130,14 +138,23 @@ struct BatchParameters Container FindOrStartParallelContainer( in MachineParameters params, in MachineList possibleComputers); + //! Start a new container satisfying the constraints given by input parameters. Container StartContainer( in MachineParameters params, in ResPolicy policy, in CompoList componentList ); + //! Same as StartContainer except that in batch all containers have already been launched + /*! + + We are in batch if environment variable SALOME_BATCH is 1. + In this case, containers have been launched at the beginning of the Salome session and + the container manager picks one in the pool of existing containers. + */ Container GiveContainer( in MachineParameters params, in ResPolicy policy, in CompoList componentList ); + //! Shutdown all containers that have been launched by the container manager void ShutdownContainers(); } ; @@ -148,12 +165,19 @@ struct BatchParameters */ interface ResourcesManager { + //! Find first available computer in a computers list string FindFirst(in MachineList possibleComputers); + //! Get a list of computers that are best suited to launch a container given constraints + /*! + + The constraints are resource constraints (params) and components constraints (componentList) + */ MachineList GetFittingResources( in MachineParameters params, in CompoList componentList ) raises (SALOME::SALOME_Exception); + //! Get the current machine parameters of a computer MachineParameters GetMachineParameters( in string hostname ); } ; diff --git a/idl/SALOME_Exception.idl b/idl/SALOME_Exception.idl index e338e4220..aa39c1db5 100644 --- a/idl/SALOME_Exception.idl +++ b/idl/SALOME_Exception.idl @@ -23,8 +23,10 @@ // Author : Paul RASCLE, EDF // $Header$ // -/*! \file SALOME_Exception.idl This file contains the objects defining the main exception used -in %SALOME application. The idl SALOME_Exception provides a generic CORBA exception for SALOME, +/*! \file SALOME_Exception.idl \brief This file contains the objects defining the main exception used +in %SALOME application. + +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 @@ -34,25 +36,21 @@ handled in a single catch. #ifndef _SALOME_EXCEPTION_IDL_ #define _SALOME_EXCEPTION_IDL_ -/*! -Module %SALOME regroups all idl definitions for %SALOME Kernel component +/*! \brief +Module %SALOME contains all base interfaces of %SALOME Kernel + */ module SALOME { -/*! -This enumeration contains the elements indicating the type of the exception -which can be raised during %SALOME session. -*/ +//! This enumeration contains the elements indicating the type of the exception which can be raised during %SALOME session. enum ExceptionType { COMM, /*!< Communication problem */ BAD_PARAM, /*!< Bad User parameters */ INTERNAL_ERROR /*!< Application level problem, irrecoverable */ }; -/*! -This struct contains a set of fields defining the structure of the exception. -*/ +//! This struct contains a set of fields defining the structure of the exception. struct ExceptionStruct { ExceptionType type; /*! IORTab; + /*! \brief Interface of a parallel %object for the MPI parallel container. + */ interface MPIObject { attribute IORTab tior; diff --git a/idl/SALOME_ModuleCatalog.idl b/idl/SALOME_ModuleCatalog.idl index 683e93943..caccfeb0b 100644 --- a/idl/SALOME_ModuleCatalog.idl +++ b/idl/SALOME_ModuleCatalog.idl @@ -23,20 +23,19 @@ // Author : Estelle Deville // $Header$ // -/*! \file SALOME_ModuleCatalog.idl This file conatins a set of interfaces used for - creation of the catalog of components in %SALOME application +/*! \file SALOME_ModuleCatalog.idl \brief interfaces used for + getting information from module catalog in %SALOME application */ -/*! -The main package of interfaces used for creation of the module catalog in %SALOME application. +/*! \brief +The main package of interfaces used for the module catalog in %SALOME application. + Module catalog allows to manage components of %SALOME application, to call specified in the xml files interfaces with the help of AComponent interface. */ module SALOME_ModuleCatalog { - // Type Definitions -/*! -This enumeration contains a current set of definitions of the components integrated +/*! \brief This enumeration contains a current set of definitions of the components integrated into %SALOME application. */ enum ComponentType { GEOM, /*! ListOfServicesParameter; +//! The list of datastream parameters of service. typedef sequence ListOfServicesDataStreamParameter; +//! a string list typedef sequence ListOfString; + +//! enumeration to define data types used by services enum TypeKind { NONE , - Dble , - Int , - Str , - Bool , - Objref , - Seq , - Array , - Struc + Dble , /*!< a double */ + Int , /*!< an integer */ + Str , /*!< a string */ + Bool , /*!< a boolean */ + Objref , /*!< an object reference */ + Seq , /*!< a sequence of a content type */ + Array , /*!< an array */ + Struc /*!< a structure with named members */ }; + +//! struct to define members of a Struc TypeKind struct MemberDefinition { - string name; /*! Name of the member */ - string type; /*! Type of the member */ + string name; /*!< Member name */ + string type; /*!< Member type name */ }; +//! List of member definitions in a structure typedef sequence ListOfMemberDefinition; -/*! - * Struct to get the definition of types used in Salome catalogs - */ + +//! Struct to get the definition of types used in Salome catalogs struct TypeDefinition { - string name; /*! Name of the type */ - TypeKind kind; /*! Kind of the type.*/ - string id; /*! id (if needed) */ - string content; /*! Content type (if needed) */ - ListOfString bases; /*! Content type (if needed) */ - ListOfMemberDefinition members; /*! Members types (if needed) */ + string name; /*!< Type name*/ + TypeKind kind; /*!< Type kind.*/ + string id; /*!< id (if needed) */ + string content; /*!< Content type (if needed) */ + ListOfString bases; /*!< base types (if needed) */ + ListOfMemberDefinition members; /*!< Member types (if needed) */ }; +//! list of type definitions typedef sequence ListOfTypeDefinition; -/*! -This struct contains fields completely defining each service. -*/ - +//! This struct contains fields defining each service. struct Service { string ServiceName; /*! ListOfInterfaceService; -/*! -List of services. -*/ +//! List of services. typedef sequence ListOfServices ; -/*! -This struct contains fields defining each interface. -*/ +//! This struct contains fields defining each interface. struct DefinitionInterface { string interfacename ; /*! ListOfDefInterface ; -/*! -List of names of interfaces. -*/ +//! List of interface names. typedef sequence ListOfInterfaces ; -/*! -PathPrefix : association of a machine name and +/*! \brief PathPrefix : association of a machine name and a path to a component */ struct PathPrefix { @@ -160,24 +148,18 @@ a path to a component string path; }; -/*! -List of path prefixes -*/ +//! List of path prefixes typedef sequence PathPrefixes; -/*! -Implementation type -*/ +//! Component implementation type enum ImplType { - SO, /* component implemented as a dynamic library loadable with dlopen */ - PY, /* component implemented as a python module loadable with import */ - EXE, /* component implemented as an executable */ - CEXE /* component to be loaded by a container which executable is given in the catalog */ + SO, /*!< component implemented as a dynamic library loadable with dlopen */ + PY, /*!< component implemented as a python module loadable with import */ + EXE, /*!< component implemented as an executable */ + CEXE /*!< component to be loaded by a container which executable is given in the catalog */ } ; -/*! -Description of a component -*/ +//! Description of a component struct ComponentDef { ComponentType type; @@ -192,17 +174,11 @@ Description of a component PathPrefixes paths; }; -/*! -List of names of components. -*/ +//! List of component names. typedef sequence ListOfComponents ; -/*! -List of names of computers. -*/ +//! List of computer names. typedef sequence ListOfComputers ; -/*! -This struct contains GUI elements used for representation of the module in %IAPP component. -*/ +//! This struct contains GUI elements used for representation of the module in %IAPP component. struct IAPP_Affich { string modulename; /*! ListOfIAPP_Affich ; -/*! - This exception is raised when a %component, a %service or a % pathPrefix is not found. -*/ +//! This exception is raised when a %component, a %service or a %pathPrefix is not found. exception NotFound { string what ; /*!If the specified interface doesn't exist, Notfound exception is thrown \param interfacename Name of the interface \return Required interface */ DefinitionInterface GetInterface(in string interfacename) raises(NotFound); - // GetServiceList : operation to get a list of the services name of - // an interface of a component - /*! - Gets the list of names of services of a definite interface belonging to the component. + /*! \brief Get the list of service names of an interface belonging to the component. + \note
        If the specified interface doesn't exist, Notfound exception is thrown. \param interfacename Name of the interface \return List of services of the required interface @@ -260,77 +228,66 @@ List of pair GUI elements (component name, component icone) ListOfServices GetServiceList(in string interfacename) raises(NotFound); - // GetService : operation to get one service of an interface of a component - - /*! - Gets a definite service of an interface of the component. + /*! \brief Get a service of an interface of the component. + \note
        If the required service or the specified interface don't exist, Notfound exception is thrown. \param interfacename Name of the interface \param servicename Name of the service \return Required service */ - Service GetService(in string interfacename, in string servicename) raises(NotFound); - // GetDefaultService : operation to get the default service - // of an interface of a component -/*! - Gets the default service of an interface of the component. +/*! \brief Get the default service of an interface of the component. + \note
        If the required service or the specified interface don't exist, Notfound exception is thrown. \param interfacename Name of the interface \return Required service */ - Service GetDefaultService(in string interfacename) raises(NotFound); - // GetPathPrefix : operation to get the PathPrefix of a computer - /*! - Gets the prefix path of the computer containing the %component. + /*! \brief Get the prefix path of the computer containing the %component. + \note
        If the required computer doesn't exist, Notfound exception is thrown \param machinename Name of the machine \return Prefix path */ - string GetPathPrefix(in string machinename) raises(NotFound); -/*! - Get the constraint affected to the component - (to be resolved by LifeCycle for the computer choice) +/*! \brief Get the constraint affected to the component + + constraint to be resolved by LifeCycle for the computer choice */ readonly attribute string constraint ; -/*! -Get the name of the component +/*! \brief Get the component name */ readonly attribute string componentname; -/*! -Get the user name of the component +/*! \brief Get the user name of the component */ readonly attribute string componentusername; -/*! -Ask whether the component is multistudy or not +/*! \brief Get whether the component is multistudy or not */ readonly attribute boolean multistudy; -/*! -Ask the type of the component +/*! \brief Get the type of the component */ readonly attribute ComponentType component_type ; -/*! -Gets the icone of the component (for IAPP) +/*! \brief Get the icone of the component (for IAPP) */ readonly attribute string component_icone; -/*! -Gets the implementation type of the component : C++ (dyn lib), Python (module) or executable +/*! \brief Get the implementation type of the component + + C++ (dyn lib), Python (module) or executable */ readonly attribute ImplType implementation_type; -/*! -Gets the implementation name of the component : name of the dyn lib or the python module or the executable +/*! \brief Get the implementation name of the component + + It's the name of the dyn lib or the python module or the executable if the default naming scheme is not convenient. */ readonly attribute string implementation_name; @@ -338,69 +295,61 @@ if the default naming scheme is not convenient. /*! \brief %Module catalog interface -This interface is used for creation of the module catalog in %SALOME application. +Interface to get information about components from the module catalog in %SALOME application. */ interface ModuleCatalog { +/*! \brief ping the ModuleCatalog server +*/ void ping(); -/*! - Returns the PID of the server +/*! \brief Returns the PID of the ModuleCatalog server */ long getPID(); -/*! - Shutdown the ModuleCatalog process. +/*! \brief Shutdown the ModuleCatalog server */ oneway void ShutdownWithExit(); -/*! - * Get the types of the catalog +/*! \brief Get the types of the catalog */ ListOfTypeDefinition GetTypes(); -/*! - Gets a list of names of computers of the catalog +/*! \brief Get a list of computer names of the catalog */ ListOfComputers GetComputerList(); -/*! -Gets the %PathPrefix of a computer -*/ +//! Get the %PathPrefix of a computer string GetPathPrefix(in string machinename) raises(NotFound); -/*! - Gets a list of names of components of the catalog -*/ + +//! Get a list of component names of the catalog ListOfComponents GetComponentList(); -/*! -Gets a list of pair GUI elements (component name, component icone) + +/*! \brief Get a list of pair GUI elements (component name, component icone) used for representation of the module in %IAPP component. */ - ListOfIAPP_Affich GetComponentIconeList(); -/*! -Gets a list of names of components of a particular type, which belong to this catalog. + +/*! \brief Get a list of component names of a particular type, which belong to this catalog. */ - // GetComponentList : operation to get a list of the components name of - // a particular type of the catalog ListOfComponents GetTypedComponentList(in ComponentType _component_type); -/*! -Gets one component of the catalog. +/*! \brief Get one component of the catalog. */ Acomponent GetComponent(in string componentname) raises(NotFound); -/*! -Gets the description of a component of the catalog. +/*! \brief Get the description of a component of the catalog. */ ComponentDef GetComponentInfo(in string componentName) raises(NotFound); -/*! -Reads a xml file and imports new components from this file. +/*! \brief Read a xml file and import new components from this file. + New components replace existing components with the same name. */ void ImportXmlCatalogFile(in string filename) raises(NotFound); +/*! \brief Shutdown the module catalog server +*/ void shutdown(); } ; }; diff --git a/idl/SALOME_Ports.idl b/idl/SALOME_Ports.idl index 4408561bc..844052a38 100644 --- a/idl/SALOME_Ports.idl +++ b/idl/SALOME_Ports.idl @@ -26,11 +26,13 @@ #ifndef _SALOME_PORTS_IDL_ #define _SALOME_PORTS_IDL_ -/*! \file - This file contains the IDL declarations of the kind of ports provided by the - SALOME component model. +/*! \file SALOME_Ports.idl + \brief This file contains the IDL base interfaces for ports in the SALOME component model. */ +/*! \brief module that contains interfaces to define the kind of ports provided by the +SALOME component model. +*/ module Ports { /*! \brief Interface of a DSC Port. @@ -68,21 +70,13 @@ module Ports { */ interface Data_And_Control_Port : Ports::Port {}; - /*! - This exception indicates that the property doesn't not exist. - */ + //! This exception indicates that the property doesn't not exist. exception NotDefined {}; - /*! - This exception indicates that the given value to the property is not - of a good type. - */ + //! This exception indicates that the given value to the property is not of a good type. exception BadType {}; - /*! - This exception indicates that the given value to the property is not - authorized. - */ + //! This exception indicates that the given value to the property is not authorized. exception BadValue {}; /*! \brief Interface of a PortProperties. @@ -92,8 +86,8 @@ module Ports { */ interface PortProperties { + //! This operation permits to set a value of a property. /*! - This operation permits to set a value of a property. \param name property's name. \param value value of the property. @@ -105,8 +99,8 @@ module Ports { Ports::BadValue, Ports::NotDefined); + //! This operation permits to get property's value. /*! - This operation permits to get property's value. \param name property's name. \return value of the property. @@ -122,6 +116,7 @@ module Ports { a port in the DSC_User programming model. */ interface Data_Short_Port : Ports::Data_Port { + //! this operation can be used by a uses port to send me a short void put(in short data); }; }; diff --git a/idl/SALOME_Registry.idl b/idl/SALOME_Registry.idl index 22e2f4700..03831123f 100644 --- a/idl/SALOME_Registry.idl +++ b/idl/SALOME_Registry.idl @@ -24,8 +24,14 @@ # ifndef __registry_idl__ # define __registry_idl__ +/*! \file SALOME_Registry.idl \brief interfaces for %SALOME registry +*/ + +/*! \brief module that provides interface to %SALOME registry +*/ module Registry { + //! a struct to collect informations about servers (processes) struct Infos { string name; @@ -43,20 +49,33 @@ module Registry string ior; // client }; + //! a list of informations typedef sequence AllInfos; +/*! \brief interface to use %SALOME registry +*/ interface Components { + //! check if registry is running void ping(); - long getPID(); + //! Get the pid of registry server + long getPID(); + //! Add one information to the registry unsigned long add ( in Infos lesInfos ) ; + //! Remove an information from the registry void remove ( in unsigned long id ) ; + //! Get the size of the registry unsigned long size() ; + //! Get all informations from registry AllInfos getall () ; + //! Get history information from registry AllInfos history () ; + //! Stop the registry (hard exit) oneway void end() ; + //! Say hello to registry from process id oneway void hello( in unsigned long id ) ; - void Shutdown(); + //! Shutdown registry server (CORBA exit) + void Shutdown(); } ; } ; diff --git a/idl/SALOME_RessourcesCatalog.idl b/idl/SALOME_RessourcesCatalog.idl index 42f657d05..c430744cd 100755 --- a/idl/SALOME_RessourcesCatalog.idl +++ b/idl/SALOME_RessourcesCatalog.idl @@ -23,42 +23,68 @@ // Author : Estelle Deville // $Header$ // + +/*! \file SALOME_RessourcesCatalog.idl \brief interfaces for %SALOME Resources Catalog +*/ + +/*! \brief module that provides interface to manage the Resources Catalog of %SALOME +*/ module SALOME_RessourcesCatalog{ - // Type Definitions - //Proc_info : information about a processor + //! Information about a processor struct proc_info{ + //! processor number long number; + //! model name string model_name; + //! frequency in MHz float cpu_mhz; + //! cache size in MB float cache_size; }; + //! a list of processor informations typedef sequence ListOfProc; - //Computer_info : information about a computer - // Os and informations about processors + //! Information about a computer + /*! + Os and informations about processors + */ struct computer_info{ + //! computer name string name; + //! OS name string OS; + //! OS version string OS_version; + //! processors list ListOfProc procs; }; - enum ContainerType {Cpp, python, NP}; + //! Container type + enum ContainerType { + Cpp, /*!< C++ container */ + python, /*!< python container */ + NP /*!< NP container */ + }; + //! a list of container types typedef sequence ListOfContainerType; + //! a list of computer names typedef sequence ListOfComputer; - // exception thrown if a computer is not found in the catalog - + //! exception thrown if a computer is not found in the catalog exception NotFound {}; //------------------------------------------------------------------ - //Interface +/*! \brief interface to get information about Resources +*/ interface RessourcesCatalog { + //! Get the catalog computers list ListOfComputer GetComputerList(); + //! Get the container types list for a given computer ListOfContainerType GetContainerTypeList (in string computer) raises(NotFound); + //! Get computer information for a given computer computer_info GetComputerInfo(in string computer) raises(NotFound); }; }; diff --git a/idl/SALOME_Session.idl b/idl/SALOME_Session.idl index 2b663a488..502104a43 100644 --- a/idl/SALOME_Session.idl +++ b/idl/SALOME_Session.idl @@ -25,9 +25,9 @@ // #include "SALOME_Component.idl" -/*! - This package contains interfaces used for management of the session in %SALOME application. -*/ +/*! \file SALOME_Session.idl \brief file that contains interface of the session + */ + module SALOME { /*! \brief State of the session @@ -35,8 +35,8 @@ module SALOME This enumeration contains values defining the state of the session */ - enum SessionState {asleep, /*! Session is inactive */ - running /*! Session is running */ + enum SessionState {asleep, /*!< Session is inactive */ + running /*!< Session is running */ } ; /*! \brief %Session State and Statistics @@ -50,17 +50,16 @@ module SALOME /*! \brief State of the session It can be: - * -# asleep : no running study - * -# running : one or more running studies + -# asleep : no running study + -# running : one or more running studies */ SessionState state ; -/*! Number of running studies -*/ +//! Number of running studies short runningStudies ; -/*! It is True if GUI is active in the session -*/ +//! It is True if GUI is active in the session boolean activeGUI ; } ; + /*! \brief Interface of the session The %session Server launches and stops GUI (Graphical User Interface). @@ -69,52 +68,34 @@ module SALOME interface Session { -/*! - This exception is raised when trying to stop the %session with active GUI -*/ +//! This exception is raised when trying to stop the %session with active GUI exception GUIActive {} ; -/*! - This exception is raised when trying to stop the %session with a number of running studies. -*/ +//! This exception is raised when trying to stop the %session with a number of running studies. exception RunningStudies {} ; -/*! - Launches GUI in the session -*/ +//! Launches GUI in the session void GetInterface(); -/*! - Returns a standalone component -*/ +//! Returns a standalone component Engines::Component GetComponent(in string theLibraryName); -/*! - Stops the %Session (It must be idle) -*/ +//! Stops the %Session (It must be idle) void StopSession() raises(GUIActive, RunningStudies) ; -/*! - Gets Session State -*/ +//! Gets Session State StatSession GetStatSession() ; -/*! - Determines whether the server has already been loaded or not. -*/ + +//! Determines whether the server has already been loaded or not. void ping(); -/*! - Returns the PID of the server -*/ +//! Returns the PID of the server long getPID(); -/*! - Get Active study ID -*/ +//! Get Active study ID long GetActiveStudyId(); -/*! - Restores a state of the study at theSavePoint -*/ +//! Restores a state of the study at theSavePoint boolean restoreVisualState(in long theSavePoint); + + //! Send a message to the session GUI desktop that will emit a qt signal /*! - Emit a qt signal from the session GUI desktop window. This method can be used to send a message to the GUI from the standalone container. Caution: this method can block the Session and the calling container @@ -123,6 +104,8 @@ module SALOME In such a case it is recommended to use oneway method. */ void emitMessage(in string theMessage); + + //! same as emitMessage but in a non blocking way /*! Emit a qt signal from the session GUI desktop window. This method can be used to send a message to the GUI from the standalone diff --git a/idl/SALOME_TestComponent.idl b/idl/SALOME_TestComponent.idl index dc6ae8c48..6bd472f21 100644 --- a/idl/SALOME_TestComponent.idl +++ b/idl/SALOME_TestComponent.idl @@ -25,9 +25,14 @@ // #include "SALOME_Component.idl" +/*! \file SALOME_TestComponent.idl \brief an interface for testing Component and Container +*/ + module Engines { +/*! \brief a component with 2 operations (Coucou and Setenv) +*/ interface TestComponent : Component { string Coucou(in long L); @@ -35,3 +40,4 @@ module Engines }; }; + diff --git a/idl/SALOME_TestMPIComponent.idl b/idl/SALOME_TestMPIComponent.idl index 090d74ef5..4aad69891 100644 --- a/idl/SALOME_TestMPIComponent.idl +++ b/idl/SALOME_TestMPIComponent.idl @@ -30,6 +30,9 @@ #include "SALOME_Component.idl" #include "SALOME_MPIObject.idl" +/*! \file SALOME_TestMPIComponent.idl \brief interface to test MPIObject and MPIContainer +*/ + module Engines { diff --git a/idl/SALOME_TestModuleCatalog.idl b/idl/SALOME_TestModuleCatalog.idl index 06be6c8db..39fa80084 100644 --- a/idl/SALOME_TestModuleCatalog.idl +++ b/idl/SALOME_TestModuleCatalog.idl @@ -27,6 +27,12 @@ #include "SALOME_Component.idl" +/*! \file SALOME_TestModuleCatalog.idl \brief interfaces for %SALOME module catalog test +*/ + +/*! \brief module to test SALOME_ModuleCatalog +*/ + module SALOME_TestModuleCatalog { interface Adder ; diff --git a/idl/TestNotif.idl b/idl/TestNotif.idl index ebf91fa51..f0170baa7 100644 --- a/idl/TestNotif.idl +++ b/idl/TestNotif.idl @@ -24,6 +24,11 @@ # ifndef __TESTNOTIF_IDL_ # define __TESTNOTIF_IDL_ +/*! \file TestNotif.idl \brief for testing notification service +*/ + +/* \brief interface to test notification service +*/ interface Solver { boolean Connect(); diff --git a/idl/TypeData.idl b/idl/TypeData.idl index c75ea69e2..692839d4a 100644 --- a/idl/TypeData.idl +++ b/idl/TypeData.idl @@ -24,6 +24,9 @@ #ifndef _SALOME_TYPEDATA_IDL_ #define _SALOME_TYPEDATA_IDL_ +/*! \file TypeData.idl \brief data definition for tests +*/ + module Engines { diff --git a/idl/nstest.idl b/idl/nstest.idl index c704ff273..3245a5253 100644 --- a/idl/nstest.idl +++ b/idl/nstest.idl @@ -22,17 +22,30 @@ #ifndef NSTEST_IDL #define NSTEST_IDL +/*! \file nstest.idl \brief interfaces for naming service test +*/ + +/*! \brief module with one interface to test naming service +*/ module NSTEST { +/*! \brief small interface for test +*/ interface echo { +/*! \brief operation that returns a long +*/ long getId(); }; +/*! \brief factory interface for test +*/ interface aFactory { +/*! \brief operation that creates a echo %object +*/ echo createInstance(); }; }; -#endif \ No newline at end of file +#endif diff --git a/src/Container/Component_i.cxx b/src/Container/Component_i.cxx index dfcae478f..aa0922248 100644 --- a/src/Container/Component_i.cxx +++ b/src/Container/Component_i.cxx @@ -56,6 +56,11 @@ static Engines_Component_i * theEngines_Component ; bool Engines_Component_i::_isMultiStudy = true; bool Engines_Component_i::_isMultiInstance = false; +/*! \class Engines_Component_i + * \brief C++ implementation of Engines::Component interface + * + */ + //============================================================================= /*! * Default constructor, not for use @@ -69,8 +74,8 @@ Engines_Component_i::Engines_Component_i():_myConnexionToRegistry(0), _notifSupp } //============================================================================= -/*! - * Standard Constructor for generic Component, used in derived class +/*! \brief Standard Constructor for generic Component, used in derived class + * * Connection to Registry and Notification * \param orb Object Request broker given by Container * \param poa Portable Object Adapter from Container (normally root_poa) @@ -115,8 +120,8 @@ Engines_Component_i::Engines_Component_i(CORBA::ORB_ptr orb, } //============================================================================= -/*! - * Standard Constructor for standalone Component, used in derived class +/*! \brief Standard Constructor for standalone Component, used in derived class + * * Connection to Registry and Notification * \param orb Object Request broker given by Container * \param poa Portable Object Adapter from Container (normally root_poa) @@ -168,8 +173,8 @@ Engines_Component_i::Engines_Component_i(CORBA::ORB_ptr orb, //============================================================================= -/*! - * Standard constructor for parallel component +/*! \brief Standard constructor for parallel component + * * Connection Notification (no connection to Registry !) * \param orb Object Request broker given by Container * \param poa Portable Object Adapter from Container (normally root_poa) diff --git a/src/Container/Container_i.cxx b/src/Container/Container_i.cxx index 954c8fcf7..28c58e407 100644 --- a/src/Container/Container_i.cxx +++ b/src/Container/Container_i.cxx @@ -64,10 +64,6 @@ bool _Sleeping = false ; int _ArgC ; char ** _ArgV ; - -// 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 *) ; } @@ -87,6 +83,12 @@ map Engines_Container_i::_library_map; map Engines_Container_i::_toRemove_map; omni_mutex Engines_Container_i::_numInstanceMutex ; +/*! \class Engines_Container_i + * \brief C++ implementation of Engines::Container interface + * + */ + + //============================================================================= /*! * Default constructor, not for use @@ -233,6 +235,7 @@ Engines_Container_i::~Engines_Container_i() } //============================================================================= +//! Get container name /*! * CORBA attribute: Container name (see constructor) */ @@ -244,6 +247,7 @@ char* Engines_Container_i::name() } //============================================================================= +//! Get container working directory /*! * CORBA attribute: Container working directory */ @@ -257,6 +261,7 @@ char* Engines_Container_i::workingdir() } //============================================================================= +//! Get container log file name /*! * CORBA attribute: Container log file name */ @@ -267,12 +272,14 @@ char* Engines_Container_i::logfilename() return CORBA::string_dup(_logfilename.c_str()) ; } +//! Set container log file name void Engines_Container_i::logfilename(const char* name) { _logfilename=name; } //============================================================================= +//! Get container host name /*! * CORBA method: Get the hostName of the Container (without domain extensions) */ @@ -286,6 +293,7 @@ char* Engines_Container_i::getHostName() } //============================================================================= +//! Get container PID /*! * CORBA method: Get the PID (process identification) of the Container */ @@ -297,6 +305,7 @@ CORBA::Long Engines_Container_i::getPID() } //============================================================================= +//! Ping the servant to check it is still alive /*! * CORBA method: check if servant is still alive */ @@ -308,6 +317,7 @@ void Engines_Container_i::ping() } //============================================================================= +//! Shutdown the container /*! * CORBA method, oneway: Server shutdown. * - Container name removed from naming service, @@ -473,6 +483,7 @@ int findpathof(string& pth, const string& exe) //============================================================================= +//! load a new component class /*! * CORBA method: load a new component class (Python or C++ implementation) * \param componentName like COMPONENT @@ -572,6 +583,7 @@ Engines_Container_i::load_component_Library(const char* componentName) } //============================================================================= +//! Create a new component instance /*! * CORBA method: Creates a new servant instance of a component. * The servant registers itself to naming service and Registry. @@ -749,6 +761,7 @@ Engines_Container_i::create_component_instance(const char*genericRegisterName, } //============================================================================= +//! 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, @@ -783,11 +796,15 @@ Engines_Container_i::find_component_instance( const char* registeredName, } //============================================================================= +//! 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, +* * ---- FOR COMPATIBILITY WITH 2.2 ---- +* * ---- USE ONLY FOR MULTISTUDY INSTANCES ! -------- +* * The servant registers itself to naming service and Registry. * \param genericRegisterName Name of the component to register * in Registry & Name Service @@ -809,6 +826,7 @@ Engines_Container_i::load_impl( const char* genericRegisterName, //============================================================================= +//! Remove the component instance from container /*! * CORBA method: Stops the component servant, and deletes all related objects * \param component_i Component to be removed @@ -828,6 +846,7 @@ void Engines_Container_i::remove_impl(Engines::Component_ptr component_i) } //============================================================================= +//! Unload component libraries from the container /*! * CORBA method: Discharges unused libraries from the container. */ @@ -856,6 +875,7 @@ void Engines_Container_i::finalize_removal() } //============================================================================= +//! Kill the container /*! * CORBA method: Kill the container process with exit(0). * To remove : never returns ! @@ -876,6 +896,7 @@ bool Engines_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 @@ -916,6 +937,7 @@ Engines_Container_i::createFileRef(const char* origFileName) } //============================================================================= +//! Get a fileTransfer reference /*! * CORBA method: * \return a reference to the fileTransfer object @@ -931,6 +953,7 @@ Engines_Container_i::getFileTransfer() } +//! Create a Salome file Engines::Salome_file_ptr Engines_Container_i::createSalome_file(const char* origFileName) { @@ -962,6 +985,7 @@ Engines_Container_i::createSalome_file(const char* origFileName) 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. @@ -973,20 +997,19 @@ Engines_Container_i::createSalome_file(const char* origFileName) * \return a loaded component * * example with names: -* aGenRegisterName = COMPONENT (= first argument) -* impl_name = libCOMPONENTEngine.so (= second 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 +* - aGenRegisterName = COMPONENT (= first argument) +* - impl_name = libCOMPONENTEngine.so (= second 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_Container_i::find_or_create_instance(string genericRegisterName, - string componentLibraryName) +Engines_Container_i::find_or_create_instance(std::string genericRegisterName, + std::string componentLibraryName) { string aGenRegisterName = genericRegisterName; string impl_name = componentLibraryName; @@ -1044,6 +1067,7 @@ Engines_Container_i::find_or_create_instance(string genericRegisterName, } //============================================================================= +//! Create a new component instance /*! * C++ method: create a servant instance of a component. * \param genericRegisterName Name of the component instance to register @@ -1055,17 +1079,17 @@ Engines_Container_i::find_or_create_instance(string genericRegisterName, * \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 +* - 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_Container_i::createInstance(string genericRegisterName, +Engines_Container_i::createInstance(std::string genericRegisterName, void *handle, int studyId) { @@ -1161,12 +1185,13 @@ Engines_Container_i::createInstance(string genericRegisterName, } //============================================================================= +//! Decrement component instance reference count /*! * */ //============================================================================= -void Engines_Container_i::decInstanceCnt(string genericRegisterName) +void Engines_Container_i::decInstanceCnt(std::string genericRegisterName) { if(_cntInstances_map.count(genericRegisterName)==0) return; @@ -1190,6 +1215,7 @@ void Engines_Container_i::decInstanceCnt(string genericRegisterName) } //============================================================================= +//! Indicate if container is a python one /*! * Retrieves only with container naming convention if it is a python container */ diff --git a/src/Container/SALOME_ComponentPy.py b/src/Container/SALOME_ComponentPy.py index e69c17ba7..1d5722ad9 100755 --- a/src/Container/SALOME_ComponentPy.py +++ b/src/Container/SALOME_ComponentPy.py @@ -26,6 +26,11 @@ # Module : SALOME # $Header$ # +## @package SALOME_ComponentPy +# \brief python implementation of component interface for Kernel +# +# + import os import sys import time @@ -46,8 +51,9 @@ from thread import * _Sleeping = 0 -#define an implementation of the component interface - +## define an implementation of the component interface Engines::Component +# +# class SALOME_ComponentPy_i (Engines__POA.Component): _orb = None _poa = None diff --git a/src/Container/SALOME_Container.py b/src/Container/SALOME_Container.py index 9b6d7f893..1a92f6b54 100644 --- a/src/Container/SALOME_Container.py +++ b/src/Container/SALOME_Container.py @@ -26,6 +26,11 @@ # Module : SALOME # $Header$ # +## @package SALOME_Container +# \brief python implementation of container interface for Kernel +# +# + import os import sys import string diff --git a/src/Container/SALOME_FileTransfer_i.cxx b/src/Container/SALOME_FileTransfer_i.cxx index 2c7d762f2..b11959726 100644 --- a/src/Container/SALOME_FileTransfer_i.cxx +++ b/src/Container/SALOME_FileTransfer_i.cxx @@ -27,6 +27,11 @@ #include "SALOME_FileTransfer_i.hxx" #include "utilities.h" +/*! \class fileTransfer_i + \brief A class to manage file transfer in SALOME + +*/ + //============================================================================= /*! * Default constructor, @@ -52,8 +57,9 @@ fileTransfer_i::~fileTransfer_i() //============================================================================= -/*! - * CORBA method: try to open the file given. If the file is readable, return +/*! \brief open the given file + * + * CORBA method: try to open the file. If the file is readable, return * a positive integer else return 0; * \param fileName path to the file to be transfered * \return fileId = positive integer > 0 if open OK. @@ -76,7 +82,8 @@ CORBA::Long fileTransfer_i::open(const char* fileName) } //============================================================================= -/*! +/*! \brief close a file + * * CORBA method: close the file associated to the fileId given at open. * \param fileId got in return from open method */ @@ -93,8 +100,11 @@ void fileTransfer_i::close(CORBA::Long fileId) else fclose(fp); } +#define FILEBLOCK_SIZE 256*1024 + //============================================================================= -/*! +/*! \brief get a data block from a file + * * CORBA method: get a block of data from the file associated to the fileId * given at open. * \param fileId got in return from open method @@ -102,8 +112,6 @@ void fileTransfer_i::close(CORBA::Long fileId) */ //============================================================================= -#define FILEBLOCK_SIZE 256*1024 - Engines::fileBlock* fileTransfer_i::getBlock(CORBA::Long fileId) { MESSAGE("fileTransfer_i::getBlock"); diff --git a/src/Container/Salome_file_i.cxx b/src/Container/Salome_file_i.cxx index 525dcc08d..567fd1dc5 100644 --- a/src/Container/Salome_file_i.cxx +++ b/src/Container/Salome_file_i.cxx @@ -38,6 +38,11 @@ # include #endif +/*! \class Salome_file_i + * \brief A class to manage file transfer in %SALOME + * + */ + //============================================================================= /*! diff --git a/src/DSC/DSC_Basic/DSC_Callbacks.hxx b/src/DSC/DSC_Basic/DSC_Callbacks.hxx index 24ba2b006..c1e8b884b 100644 --- a/src/DSC/DSC_Basic/DSC_Callbacks.hxx +++ b/src/DSC/DSC_Basic/DSC_Callbacks.hxx @@ -33,7 +33,8 @@ /*! \class DSC_Callbacks * \brief This is an abstract class that defines methods that the component - * uses to prevent the component user code that the state of the component has changed. + * uses to notify the component user code that the state of the component has changed. + * * Currently only port's connection modifications are signaled. */ class DSC_BASIC_EXPORT DSC_Callbacks @@ -42,11 +43,10 @@ class DSC_BASIC_EXPORT DSC_Callbacks DSC_Callbacks() {} virtual ~DSC_Callbacks() {} - /*! - * This method is used by the component when the number of connection - * on a provides port changes. This information helps the user code to detect - * operation on its ports. - * + /*! \brief This method is used by the component when the number of connection + * on a provides port changes. + * + * This information helps the user code to detect operation on its ports. * * \param provides_port_name the name of the provides name that has changed. * \param connection_nbr the new number of connection on the provides port. @@ -56,11 +56,10 @@ class DSC_BASIC_EXPORT DSC_Callbacks int connection_nbr, const Engines::DSC::Message message) = 0; - /*! - * This method is used by the component when the number of connection - * on a uses port changes. This information helps the user code to detect - * operation on its ports. - * + /*! \brief This method is used by the component when the number of connection + * on a uses port changes. + * + * This information helps the user code to detect operation on its ports. * * \param uses_port_name the name of the uses name that has changed. * \param new_uses_port the new sequence representing the uses port. diff --git a/src/DSC/DSC_Python/dsccalcium.py b/src/DSC/DSC_Python/dsccalcium.py index d928701c8..6aa2d6c4b 100644 --- a/src/DSC/DSC_Python/dsccalcium.py +++ b/src/DSC/DSC_Python/dsccalcium.py @@ -19,20 +19,26 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +## @package dsccalcium +# \brief Module that provides the base class for DSC components implemented in python +# +# + import calcium import SALOME_ComponentPy import SALOME_DriverPy import Engines +## The SALOME base class for all DSC components implemented in python (interface Engines::Superv_Component). +# +# class PyDSCComponent(SALOME_ComponentPy.SALOME_ComponentPy_i, SALOME_DriverPy.SALOME_DriverPy_i): """ - A Python SALOME component is implemented by a Python class that has + A Python DSC component is implemented by a Python class that has the name of the component and is located in a python module that has the name of the component. - This class is a base class for Python DSC components. - You must derive it and implement init_service and those methods that are services of the component. """ diff --git a/src/KERNEL_PY/salome.py b/src/KERNEL_PY/salome.py index 4756cd580..446c3e08d 100755 --- a/src/KERNEL_PY/salome.py +++ b/src/KERNEL_PY/salome.py @@ -24,49 +24,62 @@ # Module : SALOME # $Header$ # -""" +""" Module salome gives access to Salome ressources. variables: - salome.orb : CORBA - salome.naming_service : instance of naming Service class - methods: - Resolve(name) : find a CORBA object (ior) by its pathname - Register(name) : register a CORBA object under a pathname - salome.lcc : instance of lifeCycleCORBA class - methods: - FindOrLoadComponent(server,name) : + - salome.orb : CORBA + - salome.naming_service : instance of naming Service class + - methods: + - Resolve(name) : find a CORBA object (ior) by its pathname + - Register(name) : register a CORBA object under a pathname + + - salome.lcc : instance of lifeCycleCORBA class + - methods: + - FindOrLoadComponent(server,name) : obtain an Engine (CORBA object) or launch the Engine if not found, with a Server name and an Engine name - salome.sg - methods: - updateObjBrowser(bool): - getActiveStudyId(): - getActiveStudyName(): - SelectedCount(): returns number of selected objects - getSelected(i): returns entry of selected object number i - getAllSelected(): returns list of entry of selected objects - AddIObject(Entry): select an existing Interactive object - RemoveIObject(Entry): remove object from selection - ClearIObjects(): clear selection + - salome.sg : salome object to communicate with the graphical user interface (if any) + - methods: + - updateObjBrowser(bool): + - getActiveStudyId(): + - getActiveStudyName(): + + - SelectedCount(): returns number of selected objects + - getSelected(i): returns entry of selected object number i + - getAllSelected(): returns list of entry of selected objects + - AddIObject(Entry): select an existing Interactive object + - RemoveIObject(Entry): remove object from selection + - ClearIObjects(): clear selection - Display(*Entry): - DisplayOnly(Entry): - Erase(Entry): - DisplayAll(): - EraseAll(): + - Display(*Entry): + - DisplayOnly(Entry): + - Erase(Entry): + - DisplayAll(): + - EraseAll(): - IDToObject(Entry): returns CORBA reference from entry + - IDToObject(Entry): returns CORBA reference from entry - salome.myStudyName : active Study Name - salome.myStudyId : active Study Id - salome.myStudy : the active Study itself (CORBA ior) - methods : defined in SALOMEDS.idl + - salome.myStudyName : active Study Name + - salome.myStudyId : active Study Id + - salome.myStudy : the active Study itself (CORBA ior) + - methods : defined in SALOMEDS.idl """ +## @package salome +# Module salome gives access to Salome ressources. +# +# \param salome.orb : CORBA orb object +# \param salome.naming_service : instance of naming Service class (SALOME_NamingServicePy::SALOME_NamingServicePy_i) +# \param salome.lcc : instance of lifeCycleCORBA class (SALOME_LifeCycleCORBA) +# \param salome.sg : Salome object to communicate with the graphical user interface, if running (see interface in salome_iapp::SalomeOutsideGUI) +# \param salome.myStudyName : active Study Name +# \param salome.myStudyId : active Study Id +# \param salome.myStudy : the active Study (interface SALOMEDS::Study) + from salome_kernel import * from salome_study import * diff --git a/src/KERNEL_PY/salome_iapp.py b/src/KERNEL_PY/salome_iapp.py index 323a079e3..b8e394ae6 100644 --- a/src/KERNEL_PY/salome_iapp.py +++ b/src/KERNEL_PY/salome_iapp.py @@ -24,6 +24,10 @@ # Module : SALOME # $Header$ # +## @package salome_iapp +# Module salome gives access to Salome GUI ressources (if GUI has been launched). +# + import salome_ComponentGUI #-------------------------------------------------------------------------- @@ -70,69 +74,86 @@ class SalomeOutsideGUI(object): global myStudyId, myStudyName def hasDesktop(self): + """Indicate if GUI is running""" return False def updateObjBrowser(self, bid): + """update the GUI object browser""" print "SalomeOutsideGUI: no objectBrowser update outside GUI" pass def getActiveStudyId(self): + """Get the active study id""" print "SalomeOutsideGUI.getActiveStudyId: avoid use outside GUI" return myStudyId def getActiveStudyName(self): + """Get the active study name""" print "SalomeOutsideGUI.getActiveStudyName: avoid use outside GUI" return myStudyName def SelectedCount(self): + """Get the number of active selections""" print "SalomeOutsideGUI: no selection mecanism available outside GUI" return 0 def getSelected(self, i): + """Get the selection number i """ print "SalomeOutsideGUI: no selection mecanism available outside GUI" return none def AddIObject(self, Entry): + """Add an entry""" print "SalomeOutsideGUI.AddIOObject: not available outside GUI" pass def RemoveIObject(self, Entry): + """Remove an entry""" print "SalomeOutsideGUI.REmoveIOObject: not available outside GUI" pass def ClearIObjects(self): + """Clear entries""" print "SalomeOutsideGUI.ClearIOObject: not available outside GUI" pass def Display(self, Entry): + """Display an entry""" print "SalomeOutsideGUI.Display: not available outside GUI" pass def DisplayOnly(self, Entry): + """Display only an entry""" print "SalomeOutsideGUI.DisplayOnly: not available outside GUI" pass def Erase(self, Entry): + """Erase en entry""" print "SalomeOutsideGUI.Erase: not available outside GUI" pass def DisplayAll(self): + """Display all""" print "SalomeOutsideGUI.Erase: not available outside GUI" pass def EraseAll(self): + """Erase all""" print "SalomeOutsideGUI.EraseAll: not available outside GUI" pass def IsInCurrentView(self, Entry): + """Indicate if an entry is in current view""" print "SalomeOutsideGUI.IsIncurentView: not available outside GUI" return False def getComponentName(self, ComponentUserName ): + """Get component name from component user name""" print "SalomeOutsideGUI.getComponentName: not available outside GUI" return "" def getComponentUserName( self, ComponentName ): + """Get component user name from component name""" print "SalomeOutsideGUI.getComponentUserName: not available outside GUI" return "" diff --git a/src/LifeCycleCORBA/SALOME_FileTransferCORBA.cxx b/src/LifeCycleCORBA/SALOME_FileTransferCORBA.cxx index b2c653586..3f80d7453 100644 --- a/src/LifeCycleCORBA/SALOME_FileTransferCORBA.cxx +++ b/src/LifeCycleCORBA/SALOME_FileTransferCORBA.cxx @@ -31,6 +31,11 @@ using namespace std; +/*! \class SALOME_FileTransferCORBA + \brief A class to manage file transfer in SALOME (CORBA context) + +*/ + //============================================================================= /*! * Default constructor, not for use. @@ -43,8 +48,8 @@ SALOME_FileTransferCORBA::SALOME_FileTransferCORBA() } //============================================================================= -/*! - * Constructor to use when we get a fileRef CORBA object from a component. +/*! \brief Constructor to use when we get a fileRef CORBA object from a component + * * \param aFileRef file reference CORBA object */ //============================================================================= @@ -57,9 +62,9 @@ SALOME_FileTransferCORBA::SALOME_FileTransferCORBA(Engines::fileRef_ptr } //============================================================================= -/*! - * Constructor to use when we have the file name and machine from which to - * copy, plus an optional Container name on the machine. +/*! \brief Constructor to use when we have the file name and machine from which to + * copy, plus an optional Container name on the machine. + * * \param refMachine the machine on which is the file to transfer * \param origFileName abolute file path on refMachine * \param containerName default container name used (FactoryServer) if empty @@ -93,8 +98,9 @@ SALOME_FileTransferCORBA::~SALOME_FileTransferCORBA() } //============================================================================= -/*! - * CORBA method: get a local copy of the reference file. +/*! \brief Get a local copy of the reference file + * + * CORBA method * \param localFile optional absolute path to store the copy * \return the file name (absolute path) of the copy, may be different from * localFile parameter if the copy was already done before the call diff --git a/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx b/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx index e6e5936e7..a9ab219c8 100644 --- a/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx +++ b/src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx @@ -64,6 +64,11 @@ IncompatibleComponent::IncompatibleComponent(const IncompatibleComponent &ex): { } +/*! \class SALOME_LifeCycleCORBA + \brief A class to manage life cycle of SALOME components. + +*/ + //============================================================================= /*! * Constructor @@ -112,15 +117,14 @@ SALOME_LifeCycleCORBA::~SALOME_LifeCycleCORBA() } //============================================================================= -/*! Public - - * Find and aready existing and registered component instance. +/*! \brief Find an already existing and registered component instance. + * * \param params machine parameters like type or name... * \param componentName the name of component class * \param studyId default = 0 : multistudy instance * \return a CORBA reference of the component instance, or _nil if not found */ //============================================================================= - Engines::Component_ptr SALOME_LifeCycleCORBA::FindComponent(const Engines::MachineParameters& params, const char *componentName, @@ -144,8 +148,8 @@ SALOME_LifeCycleCORBA::FindComponent(const Engines::MachineParameters& params, } //============================================================================= -/*! Public - - * Load a component instance on a container defined by machine parameters +/*! \brief Load a component instance on a container defined by machine parameters + * * \param params machine parameters like type or name... * \param componentName the name of component class * \param studyId default = 0 : multistudy instance @@ -178,9 +182,9 @@ SALOME_LifeCycleCORBA::LoadComponent(const Engines::MachineParameters& params, } //============================================================================= -/*! Public - - * Find and aready existing and registered component instance or load a new - * component instance on a container defined by machine parameters. +/*! \brief Find an already existing and registered component instance or load a new + * component instance on a container defined by machine parameters. + * * \param params machine parameters like type or name... * \param componentName the name of component class * \param studyId default = 0 : multistudy instance @@ -220,9 +224,9 @@ FindOrLoad_Component(const Engines::MachineParameters& params, } //============================================================================= -/*! Public - - * Find and aready existing and registered component instance or load a new - * component instance on a container defined by name +/*! \brief Find an already existing and registered component instance or load a new + * component instance on a container defined by name + * * \param containerName the name of container, under one of the forms * - 1 aContainer (local container) * - 2 machine/aContainer (container on hostname = machine) @@ -292,8 +296,8 @@ SALOME_LifeCycleCORBA::FindOrLoad_Component(const char *containerName, } //============================================================================= -/*! Public - - * Check if the component class is known in module catalog +/*! \brief Check if the component class is known in module catalog + * * \param componentName the name of component class * \return true if found, false otherwise */ @@ -330,7 +334,7 @@ bool SALOME_LifeCycleCORBA::isKnownComponentClass(const char *componentName) } //============================================================================= -/*! Public - +/*! * Not so complex... useful ? */ //============================================================================= @@ -347,9 +351,8 @@ SALOME_LifeCycleCORBA::isMpiContainer(const Engines::MachineParameters& params) //============================================================================= -/*! Public - - * Pre initialisation of a given Engines::MachineParameters with default - * values. +/*! \brief Initialisation of a given Engines::MachineParameters with default values. + * * - container_name = "" : not relevant * - hostname = "" : not relevant * - OS = "" : not relevant @@ -377,7 +380,7 @@ void SALOME_LifeCycleCORBA::preSet( Engines::MachineParameters& params) } //============================================================================= -/*! Public - +/*! * \return a number of processors not 0, only for MPI containers */ //============================================================================= @@ -397,7 +400,8 @@ int SALOME_LifeCycleCORBA::NbProc(const Engines::MachineParameters& params) } //============================================================================= -/*! Public - +/*! \brief Get the container manager + * * \return the container Manager */ //============================================================================= @@ -410,7 +414,8 @@ Engines::ContainerManager_ptr SALOME_LifeCycleCORBA::getContainerManager() } //============================================================================= -/*! Public - +/*! \brief Get the resources manager + * * \return the container Manager */ //============================================================================= @@ -423,8 +428,7 @@ Engines::ResourcesManager_ptr SALOME_LifeCycleCORBA::getResourcesManager() } //============================================================================= -/*! Public - - * shutdown all the SALOME servers except SALOME_Session_Server, omniNames and notifd +/*! \brief shutdown all the SALOME servers except SALOME_Session_Server, omniNames and notifd */ //============================================================================= @@ -516,8 +520,7 @@ void SALOME_LifeCycleCORBA::shutdownServers() } //============================================================================= -/*! Public - - * shutdown omniNames and notifd +/*! \brief shutdown omniNames and notifd */ //============================================================================= @@ -550,15 +553,16 @@ void SALOME_LifeCycleCORBA::killOmniNames() } //============================================================================= -/*! Protected - - * Find and aready existing and registered component instance. +/*! \brief Find an already existing and registered component instance. + * + * - build a list of machines on which an instance of the component is running, + * - find the best machine among the list + * * \param params machine parameters like type or name... * \param componentName the name of component class * \param studyId default = 0 : multistudy instance * \param listOfMachines list of machine address * \return a CORBA reference of the component instance, or _nil if not found - * - build a list of machines on which an instance of the component is running, - * - find the best machine among the list */ //============================================================================= @@ -610,16 +614,17 @@ _FindComponent(const Engines::MachineParameters& params, } //============================================================================= -/*! Protected - - * Load a component instance. +/*! \brief Load a component instance. + * + * - Finds a container in the list of machine or start one. + * - Try to load the component library in the container, + * - then create an instance of the component. + * * \param params machine parameters like type or name... * \param componentName the name of component class * \param studyId default = 0 : multistudy instance * \param listOfMachines list of machine address * \return a CORBA reference of the component instance, or _nil if problem - * - Finds a container in the list of machine or start one. - * - Try to load the component library in the container, - * - then create an instance of the component. */ //============================================================================= @@ -646,6 +651,15 @@ _LoadComponent(const Engines::MachineParameters& params, return myInstance._retn(); } +//============================================================================= +/*! \brief Load a parallel component instance. + * + * \param params machine parameters like type or name... + * \param componentName the name of component class + * \param studyId default = 0 : multistudy instance + * \return a CORBA reference of the parallel component instance, or _nil if problem + */ +//============================================================================= Engines::Component_ptr SALOME_LifeCycleCORBA::Load_ParallelComponent(const Engines::MachineParameters& params, const char *componentName, diff --git a/src/NamingService/SALOME_NamingService.cxx b/src/NamingService/SALOME_NamingService.cxx index be057c0f8..ab6eece0a 100644 --- a/src/NamingService/SALOME_NamingService.cxx +++ b/src/NamingService/SALOME_NamingService.cxx @@ -36,6 +36,11 @@ using namespace std; +/*! \class SALOME_NamingService + \brief A class to manage the SALOME naming service + +*/ + // ============================================================================ /*! \brief Default Constructor without ORB reference. * diff --git a/src/NamingService/SALOME_NamingServicePy.py b/src/NamingService/SALOME_NamingServicePy.py index 1a41f7ddb..3797ae961 100644 --- a/src/NamingService/SALOME_NamingServicePy.py +++ b/src/NamingService/SALOME_NamingServicePy.py @@ -26,6 +26,11 @@ # Module : SALOME # $Header$ # +## @package SALOME_NamingServicePy +# \brief Module to manage SALOME naming service from python +# +# + import sys import time from omniORB import CORBA @@ -37,6 +42,9 @@ from SALOME_utilities import * #============================================================================= class SALOME_NamingServicePy_i(object): + """ + A class to manage SALOME naming service from python code + """ _orb = None _root_context=None _current_context=None @@ -45,13 +53,18 @@ class SALOME_NamingServicePy_i(object): #------------------------------------------------------------------------- def __init__(self, orb): + """ + Standard Constructor, with ORB reference. + + Initializes the naming service root context + """ #MESSAGE ( "SALOME_NamingServicePy_i::__init__" ) self._orb = orb # initialize root context and current context - ok = 0 - steps = 240 - while steps > 0 and ok == 0: - try: + ok = 0 + steps = 240 + while steps > 0 and ok == 0: + try: obj =self._orb.resolve_initial_references("NameService") self._root_context =obj._narrow(CosNaming.NamingContext) self._current_context = self._root_context @@ -60,13 +73,13 @@ class SALOME_NamingServicePy_i(object): if self._root_context is None : #MESSAGE ( "Name Service Reference is invalid" ) #sys.exit(1) - MESSAGE(" Name service not found") - else: - ok = 1 - except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): - MESSAGE(" Name service not found") - time.sleep(0.25) - steps = steps - 1 + MESSAGE(" Name service not found") + else: + ok = 1 + except (CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE): + MESSAGE(" Name service not found") + time.sleep(0.25) + steps = steps - 1 if steps == 0 and self._root_context is None: MESSAGE ( "Name Service Reference is invalid" ) sys.exit(1) @@ -180,6 +193,10 @@ class SALOME_NamingServicePy_i(object): #------------------------------------------------------------------------- def Create_Directory(self,ObjRef, Path): + """ ns.Create_Directory(ObjRef, Path) + + create a sub directory + """ MESSAGE ( "SALOME_NamingServicePy_i::Create_Directory" ) _not_exist = 0 path_list = list(Path) @@ -205,6 +222,10 @@ class SALOME_NamingServicePy_i(object): MESSAGE ( "Create_Directory : CORBA.TRANSIENT,CORBA.OBJECT_NOT_EXIST,CORBA.COMM_FAILURE" ) def Destroy_Name(self,Path): + """ ns.Destroy_Name(Path) + + remove a name in naming service + """ resolve_path=string.split(Path,'/') if resolve_path[0] == '': del resolve_path[0] dir_path=resolve_path[:-1] @@ -221,6 +242,10 @@ class SALOME_NamingServicePy_i(object): return def Destroy_FullDirectory(self,Path): + """ ns.Destroy_FullDirectory(Path) + + remove recursively a directory + """ context_name=[] for e in string.split(Path,'/'): if e == '':continue diff --git a/src/SALOMEDS/SALOME_DriverPy.py b/src/SALOMEDS/SALOME_DriverPy.py index f59953f84..c47e814b9 100644 --- a/src/SALOMEDS/SALOME_DriverPy.py +++ b/src/SALOMEDS/SALOME_DriverPy.py @@ -19,11 +19,17 @@ # # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # +## @package SALOME_DriverPy +# \brief python implementation of SALOMEDS::Driver interface +# +# import SALOMEDS__POA +## Python implementation of generic SALOMEDS::Driver. +# +# class SALOME_DriverPy_i(SALOMEDS__POA.Driver): """ - Python implementation of generic SALOMEDS driver. Should be inherited by any Python module's engine to provide persistence mechanism. """ diff --git a/src/Utils/Utils_Identity.py b/src/Utils/Utils_Identity.py index 489060f8c..046750465 100644 --- a/src/Utils/Utils_Identity.py +++ b/src/Utils/Utils_Identity.py @@ -26,19 +26,30 @@ # Module : SALOME # $Header$ # +## @package Utils_Identity +# \brief Module to get information about user and version +# +# + import sys import os import socket if not sys.platform == "win32": import pwd - + def getUserName(uid): + return pwd.getpwuid(uid)[0] +else + def getUserName(uid): + return os.environ["USER"] + import time import string def getShortHostName(): """ gives Hostname without domain extension. + SALOME naming service needs short Hostnames (without domain extension). HOSTNAME is not allways defined in environment, socket.gethostname() gives short or complete Hostname, depending on @@ -51,18 +62,12 @@ class Identity: self._name = name self._pid = os.getpid() self._machine = socket.gethostname() - self._adip = socket.gethostbyname(self._machine) # IP adress - if sys.platform == "win32": - self._uid = os.getpid() - self._pwname = os.environ["USER"] - else: - self._uid = os.getuid() - list = pwd.getpwuid(self._uid) - self._pwname = list[0] # user name - - self._tc_start = time.time() + self._adip = socket.gethostbyname(self._machine) # IP adress + self._uid = os.getpid() + self._pwname = getUserName(self._uid) + self._tc_start = time.time() self._cstart = time.ctime(self._tc_start) - self._cdir = os.getcwd() + self._cdir = os.getcwd() def getapplipath(): """ -- 2.39.2