Salome HOME
CCAR: import_hook.py was too strict in ensure_list (ImportError raised)
[modules/kernel.git] / src / KERNEL_PY / __init__.py
1 #  -*- coding: iso-8859-1 -*-
2 #  Copyright (C) 2007-2010  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.
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 #  $Header$
28 #
29 """ 
30 Module salome gives access to Salome ressources.
31
32 variables:
33
34   - salome.orb             : CORBA
35   - salome.naming_service  : instance of naming Service class
36       - methods:
37           - Resolve(name)  : find a CORBA object (ior) by its pathname
38           - Register(name) : register a CORBA object under a pathname
39
40   - salome.lcc             : instance of lifeCycleCORBA class
41       - methods:
42           - FindOrLoadComponent(server,name) :
43                            obtain an Engine (CORBA object)
44                            or launch the Engine if not found,
45                            with a Server name and an Engine name
46
47   - salome.sg              : salome object to communicate with the graphical user interface (if any)
48       - methods:
49          - updateObjBrowser(bool):
50          - getActiveStudyId():
51          - getActiveStudyName():
52
53          - SelectedCount():      returns number of selected objects
54          - getSelected(i):       returns entry of selected object number i
55          - getAllSelected():     returns list of entry of selected objects
56          - AddIObject(Entry):    select an existing Interactive object
57          - RemoveIObject(Entry): remove object from selection
58          - ClearIObjects():      clear selection
59
60          - Display(*Entry):
61          - DisplayOnly(Entry):
62          - Erase(Entry):
63          - DisplayAll():
64          - EraseAll():
65
66          - IDToObject(Entry):    returns CORBA reference from entry
67
68   - salome.myStudyName     : active Study Name
69   - salome.myStudyId       : active Study Id
70   - salome.myStudy         : the active Study itself (CORBA ior)
71       - methods : defined in SALOMEDS.idl
72
73 """
74 ## @package salome
75 # Module salome gives access to Salome ressources.
76 #
77 #  \param salome.orb             : CORBA orb object
78 #  \param salome.naming_service  : instance of naming Service class (SALOME_NamingServicePy::SALOME_NamingServicePy_i)
79 #  \param salome.lcc             : instance of lifeCycleCORBA class (SALOME_LifeCycleCORBA)
80 #  \param salome.sg              : Salome object to communicate with the graphical user interface, if running (see interface in salome_iapp::SalomeOutsideGUI)
81 #  \param salome.myStudyName     : active Study Name
82 #  \param salome.myStudyId       : active Study Id
83 #  \param salome.myStudy         : the active Study (interface SALOMEDS::Study)
84
85 #
86 # ==========================================================================
87 #
88 # The function extend_path is used here to aggregate in a single
89 # virtual python package all the python sub-packages embedded in each
90 # SALOME modules (python "namespace" pattern).
91 #
92 ROOT_PYTHONPACKAGE_NAME="salome"
93 #
94 # This root package name is expected to be found as a directory in
95 # some paths of the sys.path variable, especially the paths
96 # <MODULE_ROOT_DIR>/lib/pythonX.Y/site-packages/salome where are
97 # installed the python files. These paths are theorically appended by
98 # the SALOME main runner and should be in the sys.path at this point
99 # of the application. The extend_path is looking then for directories
100 # of the type:
101 #
102 # <MODULE_ROOT_DIR>/lib/pythonX.Y/site-packages/salome/<ROOT_PYTHONPACKAGE_NAME>
103 #
104 # And append them to the sys.path. These directories are supposed to
105 # be the pieces to be aggregated as a single virtual python package.
106 #
107 import os, sys
108 MATCH_ENDING_PATTERN="site-packages/salome"
109 def extend_path(pname):
110     for dir in sys.path:
111         if not isinstance(dir, basestring) or not os.path.isdir(dir) or not dir.endswith(MATCH_ENDING_PATTERN):
112             continue
113         subdir = os.path.join(dir, pname)
114         # XXX This may still add duplicate entries to path on
115         # case-insensitive filesystems
116         if os.path.isdir(subdir) and subdir not in __path__:
117             print "INFO - The directory %s is appended to sys.path" % subdir
118             __path__.append(subdir)
119
120 extend_path(ROOT_PYTHONPACKAGE_NAME)
121 # ==========================================================================
122 #
123
124 from salome_kernel import *
125 from salome_study import *
126 from salome_iapp import *
127 import salome_study
128
129 #
130 # The next block is workaround for the problem of shared symbols loading for the extension modules (e.g. SWIG-generated)
131 # that causes RTTI unavailable in some cases. To solve this problem, sys.setdlopenflags() function is used.
132 # Depending on the Python version and platform, the dlopen flags can be defined in the dl, DLFUN or ctypes module.
133
134 import sys
135 flags = None
136 if not flags:
137     try:
138         # dl module can be unavailable
139         import dl
140         flags = dl.RTLD_NOW | dl.RTLD_GLOBAL
141     except:
142         pass
143     pass
144 if not flags:
145     try:
146         # DLFCN module can be unavailable
147         import DLFCN
148         flags = DLFCN.RTLD_NOW | DLFCN.RTLD_GLOBAL
149     except:
150         pass
151     pass
152 if not flags:
153     try:
154         # ctypes module can be unavailable
155         import ctypes
156         flags = ctypes.RTLD_GLOBAL
157     except:
158         pass
159     pass
160
161 # Disable -> bug with scipy, seems very dangerous to do that
162 #if flags:
163 #    sys.setdlopenflags(flags)
164 #    pass
165
166 orb, lcc, naming_service, cm,sg=None,None,None,None,None
167 myStudyManager, myStudyId, myStudy, myStudyName=None,None,None,None
168
169 def setCurrentStudy(theStudy):
170     """
171     Change current study : an existing one given by a study object.
172
173     :param theStudy: the study CORBA object to set as current study
174     """
175     global myStudyId, myStudy, myStudyName
176     myStudyId, myStudy, myStudyName =salome_study.setCurrentStudy(theStudy)
177
178 def setCurrentStudyId(theStudyId=0):
179     """
180     Change current study : an existing or new one given by Id.
181
182     :param theStudyId: the study Id (optional argument)
183            0      : create a new study (default).
184            n (>0) : try connection to study with Id = n, or create a new one
185                       if study not found.
186     """
187     global myStudyId, myStudy, myStudyName
188     myStudyId, myStudy, myStudyName =salome_study.setCurrentStudyId(theStudyId)
189
190 salome_initial=1
191 def salome_init(theStudyId=0,embedded=0):
192     """
193     Performs only once SALOME general purpose intialisation for scripts.
194     optional argument : theStudyId
195       When in embedded interpreter inside IAPP, theStudyId is not used
196       When used without GUI (external interpreter)
197         0      : create a new study (default).
198         n (>0) : try connection to study with Id = n, or create a new one
199                  if study not found.
200                  If study creation, its Id may be different from theStudyId !
201     Provides:
202     orb             reference to CORBA
203     lcc             a LifeCycleCorba instance
204     naming_service  a naming service instance
205     cm              reference to the container manager
206     sg              access to SALOME GUI (when linked with IAPP GUI)
207     myStudyManager  the study manager
208     myStudyId       active study identifier
209     myStudy         active study itself (CORBA reference)
210     myStudyName     active study name
211     """
212     global salome_initial
213     global orb, lcc, naming_service, cm
214     global sg
215     global myStudyManager, myStudyId, myStudy, myStudyName
216
217     try:
218         if salome_initial:
219             salome_initial=0
220             sg = salome_iapp_init(embedded)
221             orb, lcc, naming_service, cm = salome_kernel_init()
222             myStudyManager, myStudyId, myStudy, myStudyName =salome_study_init(theStudyId)
223             pass
224         pass
225     except RuntimeError, inst:
226         # wait a little to avoid trace mix
227         import time
228         time.sleep(0.2)
229         x = inst
230         print "salome.salome_init():", x
231         print """
232         ============================================
233         May be there is no running SALOME session
234         salome.salome_init() is intented to be used
235         within an already running session
236         ============================================
237         """
238         raise
239
240 #to expose all objects to pydoc
241 __all__=dir()