]> SALOME platform Git repositories - modules/kernel.git/blob - src/KERNEL_PY/kernel/services.py
Salome HOME
python changes
[modules/kernel.git] / src / KERNEL_PY / kernel / services.py
1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 # Author: Guillaume Boulant (EDF/R&D)
22
23 ## \defgroup service service
24 #  \{ 
25 #  \details Helper for using %SALOME kernel services
26 #  \}
27
28 #
29 # WARNING: development notes
30 #
31 # This python module is aimed to be a (yet another?) end user
32 # interface to manipulate the KERNEL SALOME services. Note that it
33 # does not replace the salome module (i.e. what you get when typing
34 # "import salome", actually implemented in the file __init__.py of the
35 # salome python package). It provides instead functions that help to
36 # use the salome module in a end user context (development of domain
37 # specific tools by programmers that are not ten years experienced in
38 # SALOME development).
39
40 import salome
41 from deprecation import is_called_by_sphinx
42 if not is_called_by_sphinx() and salome.lcc is None:
43     try:
44         salome.salome_init()
45     except Exception, e:
46         print e
47
48 # Note that the salome module provides you with standard SALOME
49 # objects: CORBA broker (orb): salome.orb lyfe cycle (lcc) :
50 # salome.lcc naming service : salome.naming_service 
51 # The default study : salome.myStudy
52 #
53 # Alternatively, you may obtain these objects directly with the
54 # following instructions:
55 #
56 #   from omniORB import CORBA
57 #   from LifeCycleCORBA import LifeCycleCORBA
58 #   orb = CORBA.ORB_init( [''], CORBA.ORB_ID )
59 #   lcc = LifeCycleCORBA( orb )
60
61 #   from SALOME_NamingServicePy import SALOME_NamingServicePy_i
62 #   naming_service = SALOME_NamingServicePy_i( orb )
63 #
64 # (See salome.py page in the KERNEL documentation)
65
66 #
67 # ==============================================================================
68 # Helper functions for SALOME components
69 # ==============================================================================
70 #
71
72 ## Get a %SALOME CORBA component from its name
73 #  \param componentName is the name of the component as declared in the XML
74 #  %SALOME catalog. %A loadable library with name lib<componentName>Engine.so
75 #  is supposed to be reachable. This library is supposed to provide a
76 #  factory function with the prototype:
77 #
78 #  \code
79 #  PortableServer::ObjectId * <componentName>Engine_factory( CORBA::ORB_ptr orb,
80 #                                                            PortableServer::POA_ptr poa,
81 #                                                            PortableServer::ObjectId* contId,
82 #                                                            const char *instanceName,
83 #                                                            const char *interfaceName );
84 #  \endcode
85 #
86 #  \param corbaModule is the name of the IDL module that contains the
87 #  definition of the interface of the component. This name corresponds
88 #  to the namespace of the servant classes.
89 #
90 #  \param containerType specified the container in which the servants are
91 #  executed.
92 #  \ingroup service
93 def getComponent(componentName = "SalomeTestComponent",
94                  corbaModule   = "Engines",
95                  containerType = "FactoryServer"):
96     """
97     Get a SALOME CORBA component from its name
98     """
99     print "INF: getting component %s from CORBA module %s ..."%(componentName,corbaModule)
100     __import__(corbaModule)
101     component=salome.lcc.FindOrLoadComponent(containerType,componentName)
102     if component is None:
103         print "ERR: the SALOME component "+componentName+" can't be reached"
104     print "INF: component %s obtained from CORBA module %s"%(componentName,corbaModule)
105     return component
106
107 # Note that an alternative (and maybe better) method to get a component
108 # is to use the module catalog. Here, we just use the catalog to get
109 # the list of components defined in the current session.
110 import SALOME_ModuleCatalog
111
112 ## Get the list of names of all %SALOME componenents register in
113 #  the catalog.
114 #  \ingroup service
115 def getComponentList():
116     """
117     Get the list of names of all SALOME componenents register in
118     the catalog.
119     """
120     obj = salome.naming_service.Resolve('Kernel/ModulCatalog')
121     catalog = obj._narrow(SALOME_ModuleCatalog.ModuleCatalog)
122     if not catalog:
123         raise RuntimeError, "Can't accesss module catalog"
124     return catalog.GetComponentList()
125
126 ## Get a study
127 #  \ingroup service
128 def getStudy():
129     """Get a study"""
130     return salome.myStudy
131
132
133 import SALOMEDS
134 ## Get a study to create SALOME study. 
135 #  \warning you should use instead the variable salome.myStudy. 
136 #  This function is given for illustration of usage of the naming service
137 #  \ingroup service
138 def __getStudy_demo():
139     """
140     Get a study to create SALOME study. WARN: you
141     should use instead the variable salome.myStudy. This
142     function is given for illustration of usage of the naming service
143     """
144     naming_service = SALOME_NamingServicePy_i( orb )
145     obj = naming_service.Resolve( '/Study' )
146     study = obj._narrow( SALOMEDS.Study)
147     return study
148
149
150 #
151 # ==============================================================================
152 # Helper functions for manipulating objects, sobjects and entry
153 # ==============================================================================
154 #
155
156 # - the SObject is an item in a study (Study Object).
157 # - the entry is the identifier of an item.
158 # - the ID is the entry
159 # - the object (geom object or smesh object) is a CORBA servant
160 #   embedded in the SALOME component container and with a reference in
161 #   the SALOME study, so that it can be retrieved.
162
163 # __GBO__ WARN: theses functions are already defined in
164 # salome_study.py, but without the possibility to specify the
165 # underlying study (in salome_study.py, the study is the default study
166 # binded to the salome.myStudy attribute). TODO: see if it can be
167 # extends to the prototype (with the study as an argument) below and
168 # resorb the functions below.
169
170 def IDToObject(id, study=None):
171     myObj = None
172     if study is None:
173         myStudy = salome.myStudy
174     else:
175         myStudy = study
176     mySO = myStudy.FindObjectID(id);
177     if mySO is not None:
178         ok, anAttr = mySO.FindAttribute("AttributeIOR")
179         if ok:
180             AtIOR = anAttr._narrow(SALOMEDS.AttributeIOR)
181             if AtIOR.Value() != "":
182                 myObj = salome.orb.string_to_object(AtIOR.Value())
183     return myObj
184
185 def ObjectToSObject(obj, study=None):
186     mySO = None
187
188     if study is None:
189         myStudy = salome.myStudy
190     else:
191         myStudy = study
192
193     if obj is not None:
194         ior =  salome.orb.object_to_string(obj)
195         if ior != "":
196             mySO = myStudy.FindObjectIOR(ior)
197     return mySO
198
199 def ObjectToID(obj, study=None):
200     mySO = ObjectToSObject(obj,study)
201     if mySO:
202         return mySO.GetID()
203     return ""
204
205 def IDToSObject(id, study=None):
206     if study is None:
207         myStudy = salome.myStudy
208     else:
209         myStudy = study
210
211     mySO = myStudy.FindObjectID(id);
212     return mySO
213
214 def SObjectToID(sobject):
215     if sobject is None: return None
216     return sobject.GetID()
217
218
219 #
220 # ==============================================================================
221 # Basic use cases and unit tests
222 # ==============================================================================
223 #
224
225 def TEST_getComponent():
226     component=getComponent(componentName = "SalomeTestComponent")
227     
228     ref_string = 'TestComponent_i : L = 3'
229     res_string = component.Coucou(3)
230     if ref_string != ref_string:
231         return False
232     return True
233
234 def TEST_getComponentList():
235     componentList=getComponentList()
236     if 'SalomeTestComponent' not in componentList:
237         return False
238     return True
239
240 def TEST_createObject():
241     """
242     WARNING: for this test, we need GEOM (used to create an object) 
243     """
244     import GEOM
245     from salome.geom import geomBuilder
246     geompy = geomBuilder.New(salome.myStudy)
247
248     box = geompy.MakeBoxDXDYDZ(200, 200, 200)
249     id = geompy.addToStudy( box, 'box' )
250     return id
251
252 def TEST_objectsManipulation():
253     myEntry = TEST_createObject()
254
255     mySObject = IDToSObject(myEntry)
256     entry     = SObjectToID(mySObject)
257
258     if str(entry) != str(myEntry):
259         return False
260
261
262     myObject = IDToObject(myEntry)
263     print myObject
264     if myObject is None:
265         return False
266
267     return True
268
269 if __name__ == "__main__":
270     import unittester
271     unittester.run("services","TEST_getComponent")
272     unittester.run("services","TEST_getComponentList")
273     unittester.run("services","TEST_objectsManipulation")