Salome HOME
Attempt of test correction
[modules/kernel.git] / src / KERNEL_PY / __init__.py
1 #  -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
3 #
4 # Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
5 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 #
7 # This library is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU Lesser General Public
9 # License as published by the Free Software Foundation; either
10 # version 2.1 of the License, or (at your option) any later version.
11 #
12 # This library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 # Lesser General Public License for more details.
16 #
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this library; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
20 #
21 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 #
23
24 #  File   : salome.py renamed as __init__.py for python packaging (gboulant)
25 #  Author : Paul RASCLE, EDF
26 #  Module : SALOME
27 #
28 """ 
29 Module salome gives access to Salome resources.
30
31 variables:
32
33   - salome.orb             : CORBA
34   - salome.naming_service  : instance of naming Service class
35       - methods:
36           - Resolve(name)  : find a CORBA object (ior) by its pathname
37           - Register(name) : register a CORBA object under a pathname
38
39   - salome.lcc             : instance of lifeCycleCORBA class
40       - methods:
41           - FindOrLoadComponent(server,name) :
42                            obtain an Engine (CORBA object)
43                            or launch the Engine if not found,
44                            with a Server name and an Engine name
45
46   - salome.sg              : salome object to communicate with the graphical user interface (if any)
47       - methods:
48          - updateObjBrowser(bool):
49          - getActiveStudyId():
50          - getActiveStudyName():
51
52          - SelectedCount():      returns number of selected objects
53          - getSelected(i):       returns entry of selected object number i
54          - getAllSelected():     returns list of entry of selected objects
55          - AddIObject(Entry):    select an existing Interactive object
56          - RemoveIObject(Entry): remove object from selection
57          - ClearIObjects():      clear selection
58
59          - Display(*Entry):
60          - DisplayOnly(Entry):
61          - Erase(Entry):
62          - DisplayAll():
63          - EraseAll():
64
65          - IDToObject(Entry):    returns CORBA reference from entry
66
67   - salome.myStudyName     : active Study Name
68   - salome.myStudyId       : active Study Id
69   - salome.myStudy         : the active Study itself (CORBA ior)
70       - methods : defined in SALOMEDS.idl
71
72 """
73 ## @package salome
74 # Module salome gives access to Salome resources.
75 #
76 #  \param salome.orb             : CORBA orb object
77 #  \param salome.naming_service  : instance of naming Service class (SALOME_NamingServicePy::SALOME_NamingServicePy_i)
78 #  \param salome.lcc             : instance of lifeCycleCORBA class (SALOME_LifeCycleCORBA)
79 #  \param salome.sg              : Salome object to communicate with the graphical user interface, if running (see interface in salome_iapp::SalomeOutsideGUI)
80 #  \param salome.myStudyName     : active Study Name
81 #  \param salome.myStudyId       : active Study Id
82 #  \param salome.myStudy         : the active Study (interface SALOMEDS::Study)
83
84 #
85 # ==========================================================================
86 #
87 # The function extend_path is used here to aggregate in a single
88 # virtual python package all the python sub-packages embedded in each
89 # SALOME modules (python "namespace" pattern).
90 #
91 ROOT_PYTHONPACKAGE_NAME="salome"
92 #
93 # This root package name is expected to be found as a directory in
94 # some paths of the sys.path variable, especially the paths
95 # <MODULE_ROOT_DIR>/lib/pythonX.Y/site-packages/salome where are
96 # installed the python files. These paths are theorically appended by
97 # the SALOME main runner and should be in the sys.path at this point
98 # of the application. The extend_path is looking then for directories
99 # of the type:
100 #
101 # <MODULE_ROOT_DIR>/lib/pythonX.Y/site-packages/salome/<ROOT_PYTHONPACKAGE_NAME>
102 #
103 # And append them to the sys.path. These directories are supposed to
104 # be the pieces to be aggregated as a single virtual python package.
105 #
106 import os, sys
107 from salome_utils import verbose
108
109 MATCH_ENDING_PATTERN="site-packages" + os.path.sep + "salome"
110
111 def extend_path(pname):
112     for dir in sys.path:
113         if not isinstance(dir, basestring) or not os.path.isdir(dir) or not dir.endswith(MATCH_ENDING_PATTERN):
114             continue
115         subdir = os.path.join(dir, pname)
116         # XXX This may still add duplicate entries to path on
117         # case-insensitive filesystems
118         if os.path.isdir(subdir) and subdir not in __path__:
119             if verbose(): print "INFO - The directory %s is appended to sys.path" % subdir
120             __path__.append(subdir)
121
122 extend_path(ROOT_PYTHONPACKAGE_NAME)
123 # ==========================================================================
124 #
125
126 from salome_kernel import *
127 from salome_study import *
128 from salome_iapp import *
129 import salome_study
130
131 #
132 # The next block is workaround for the problem of shared symbols loading for the extension modules (e.g. SWIG-generated)
133 # that causes RTTI unavailable in some cases. To solve this problem, sys.setdlopenflags() function is used.
134 # Depending on the Python version and platform, the dlopen flags can be defined in the dl, DLFUN or ctypes module.
135
136 import sys
137 flags = None
138 if not flags:
139     try:
140         # dl module can be unavailable
141         import dl
142         flags = dl.RTLD_NOW | dl.RTLD_GLOBAL
143     except:
144         pass
145     pass
146 if not flags:
147     try:
148         # DLFCN module can be unavailable
149         import DLFCN
150         flags = DLFCN.RTLD_NOW | DLFCN.RTLD_GLOBAL
151     except:
152         pass
153     pass
154 if not flags:
155     try:
156         # ctypes module can be unavailable
157         import ctypes
158         flags = ctypes.RTLD_GLOBAL
159     except:
160         pass
161     pass
162
163 # Disable -> bug with scipy, seems very dangerous to do that
164 #if flags:
165 #    sys.setdlopenflags(flags)
166 #    pass
167
168 orb, lcc, naming_service, cm,sg=None,None,None,None,None
169 myStudyManager, myStudyId, myStudy, myStudyName=None,None,None,None
170
171 def setCurrentStudy(theStudy):
172     """
173     Change current study : an existing one given by a study object.
174
175     :param theStudy: the study CORBA object to set as current study
176     """
177     global myStudyId, myStudy, myStudyName
178     myStudyId, myStudy, myStudyName =salome_study.setCurrentStudy(theStudy)
179
180 def setCurrentStudyId(theStudyId=0):
181     """
182     Change current study : an existing or new one given by Id.
183
184     :param theStudyId: the study Id (optional argument)
185            0      : create a new study (default).
186            n (>0) : try connection to study with Id = n, or create a new one
187                       if study not found.
188     """
189     global myStudyId, myStudy, myStudyName
190     myStudyId, myStudy, myStudyName =salome_study.setCurrentStudyId(theStudyId)
191
192 salome_initial=1
193 def salome_init(theStudyId=0,embedded=0):
194     """
195     Performs only once SALOME general purpose initialisation for scripts.
196     optional argument : theStudyId
197       When in embedded interpreter inside IAPP, theStudyId is not used
198       When used without GUI (external interpreter)
199         0      : create a new study (default).
200         n (>0) : try connection to study with Id = n, or create a new one
201                  if study not found.
202                  If study creation, its Id may be different from theStudyId !
203     Provides:
204     orb             reference to CORBA
205     lcc             a LifeCycleCorba instance
206     naming_service  a naming service instance
207     cm              reference to the container manager
208     sg              access to SALOME GUI (when linked with IAPP GUI)
209     myStudyManager  the study manager
210     myStudyId       active study identifier
211     myStudy         active study itself (CORBA reference)
212     myStudyName     active study name
213     """
214     global salome_initial
215     global orb, lcc, naming_service, cm
216     global sg
217     global myStudyManager, myStudyId, myStudy, myStudyName
218
219     try:
220         if salome_initial:
221             salome_initial=0
222             sg = salome_iapp_init(embedded)
223             orb, lcc, naming_service, cm = salome_kernel_init()
224             myStudyManager, myStudyId, myStudy, myStudyName = salome_study_init(theStudyId)
225             pass
226         pass
227     except RuntimeError, inst:
228         # wait a little to avoid trace mix
229         import time
230         time.sleep(0.2)
231         x = inst
232         print "salome.salome_init():", x
233         print """
234         ============================================
235         May be there is no running SALOME session
236         salome.salome_init() is intended to be used
237         within an already running session
238         ============================================
239         """
240         raise
241     
242 def salome_close():
243     global salome_initial, myStudy, myStudyId, myStudyName
244     try:
245         # study can be closed either from GUI or directly with salome.myStudy.Close()
246         myStudy.Close()
247     except:
248         pass
249     salome_initial=1
250     salome_iapp_close()
251     salome_study_close()
252     myStudyId, myStudy, myStudyName=None,None,None
253     pass
254
255
256 #to expose all objects to pydoc
257 __all__=dir()