1 # -*- coding: iso-8859-1 -*-
9 from Logger import Logger
10 logger=Logger( "EficasStudy" )
13 #Nom des composants SALOME dans l'arbre d'étude
20 class SalomeStudy( salomedsgui.guiDS ):
22 Classe de manipulation de l'arbre d'étude Salome. Cette classe permet à
23 l'utilisateur de manipuler les objets de 'arbre d'étude via leurs
24 identifiants( entry ).
26 Attention : Par défaut les opérations réalisée par cette classe portent sur
27 une étude courante ( positionnée dans le constructeur ou par la méthode
30 def __init__( self, studyID = salome.myStudyId ):
31 salomedsgui.guiDS.__init__( self )
32 self.setCurrentStudy( studyID)
34 # spécifique méthode __getMeshType() :
36 self.geomEngine = None
38 # spécifique méthode createMesh() :
39 self.smeshEngine = None
43 # --------------------------------------------------------------------------
44 # fonctions de manipulation générale ( porte sur toute l'arbre d'étude )
45 def __getCORBAObject( self, entry ):
47 Retourne l'objet CORBA correspondant son identifiant ( entry ) dans
51 @param entry : objet Corba
54 @return : l'objet CORBA, None si erreur.
58 mySO = self._myStudy.FindObjectID( entry )
60 object = mySO.GetObject()
62 if not object: # l'objet n'a pas encore chargé
63 path = self._myStudy.GetObjectPath( mySO )# recherche du nom du composant
64 componentName = ( path.split('/')[1] ).strip()
66 if componentName == SMesh:
67 strContainer, strComponentName = "FactoryServer", "SMESH"
68 elif componentName == SGeom:
69 strContainer, strComponentName = "FactoryServer", "GEOM"
70 elif componentName == SVisu:
71 strContainer, strComponentName = "FactoryServer", "VISU"
72 elif componentName == SAster:
73 strContainer, strComponentName = "FactoryServerPy", "ASTER"
75 logger.debug('>>>>CS_Pbruno StudyTree.__getCORBAObject chargement du composant %s non implémenté ' %componentName)
78 myComponent = salome.lcc.FindOrLoadComponent( strContainer, strComponentName )
79 SCom = self._myStudy.FindComponent( strComponentName )
80 self._myBuilder.LoadWith( SCom , myComponent )
81 object = mySO.GetObject()
84 type = sys.exc_info()[0]
85 value = sys.exc_info()[1]
86 logger.debug( '>>>>CS_Pbruno StudyTree.__getCORBAObject erreur recupération objet corba ( entry = %s ) ' %entry)
87 logger.debug( 'type = %s , value = %s '%( type, value ) )
93 def __getEntry( self, corbaObject ):
95 Retourne l'identifiant ( entry ) ds l'arbre d'étude de l'objet CORBA
98 @type corbaObject : objet Corba
99 @param corbaObject : objet Corba
102 @return : identifiant ( entry ), None si erreur.
105 currentStudy = self._myStudy
108 ior = salome.orb.object_to_string( corbaObject )
110 sObject = currentStudy.FindObjectIOR( ior )
111 entry = sObject.GetID()
116 def setCurrentStudyID( self, studyID):
118 Fixe l'étude courante sur laquel vont opérer toutes les fonctions
122 self._component = None
123 self._myStudy = self._myStudyManager.GetStudyByID( studyID)
124 self._myBuilder = self._myStudy.NewBuilder( )
126 salome.myStudy = self._myStudy
127 salome.myStudyId = studyID
128 salome.myStudyName = self._myStudy._get_Name()
132 Rafraichissement de l'arbre d'étude
134 salome.sg.updateObjBrowser(0)
136 def setName( self, entry, name ):
138 Fixe le nom( la valeur de l'attribut 'AttributeName' ) d'un objet de l'arbre d'étude
139 désigné par son identifiant( entry )
142 @param entry: identifiant de l'objet dans l'arbre d'étude
145 @param name: nom à attribuer
148 @return : True si Ok, False sinon, None si erreur
152 SObject = self._myStudy.FindObjectID( entry )
153 A1 = self._myBuilder.FindOrCreateAttribute( SObject, "AttributeName" )
154 AName = A1._narrow(SALOMEDS.AttributeName)
155 AName.SetValue( name )
159 type = sys.exc_info()[0]
160 value = sys.exc_info()[1]
161 logger.debug( '>>>>CS_Pbruno StudyTree.setName ( entry = %s, name = %s )' %( entry, name ) )
162 logger.debug( 'type = %s , value = %s '%( type, value ) )
167 def hasName( self, componentName, objectName ):
169 Vérifie si dans l'arbre d'étude le commposant de nom componentName
170 possède un objet de nom objectName.
172 @type componentName: string
173 @param componentName: nom du composant Salome
175 @type objectName: string
176 @param objectName: nom de l'objet
179 @return : True si Ok, False sinon, None si erreur
189 componentName = nom[ componentName ]
190 SObjects = self._myStudy.FindObjectByName( objectName, componentName )
191 if len( SObjects ) > 0:
195 type = sys.exc_info()[0]
196 value = sys.exc_info()[1]
197 logger.debug( '>>>>CS_Pbruno StudyTree.setName ( entry = %s, name = %s )' %( entry, name ) )
198 logger.debug( 'type = %s , value = %s '%( type, value ) )
207 # --------------------------------------------------------------------------
208 # fonctions de manipulation des objets géométriques dans l'arbre d'étude
209 # ( éléments contenu dans la sous-rubrique "Geometry' )
210 def isMainShape( self, entry ):
212 Teste si l'objet désigné par l'identifiant ( entry ) passé en argument
213 est bien un objet géométrique principal.
216 @param entry: identifiant de l'objet
219 @return: True si Ok, False sinon
223 anObject = self.__getCORBAObject( entry )
224 shape = anObject._narrow( GEOM.GEOM_Object )
225 if shape.IsMainShape():
229 type = sys.exc_info()[0]
230 value = sys.exc_info()[1]
231 logger.debug( '>>>>CS_Pbruno StudyTree.isMainShape( entry = %s ) ' %entry )
232 logger.debug( 'type = %s , value = %s '%( type, value ) )
237 def getMainShapeEntry( self, entry ):
239 Retourne l'identifiant de l'objet géométrique principal du sous-objet géométrique désigné par
240 l'identifiant ( entry ) passé en paramètre.
243 @param entry: identifiant du sous-objet géométrique
246 @return : identifiant de l'objet géométrique principal, None si erreur.
250 if self.isMainShape( entry ):
253 anObject = self.__getCORBAObject( entry )
254 shape = anObject._narrow( GEOM.GEOM_Object )
255 objMain = shape.GetMainShape()
256 result = self.__getEntry( objMain )
259 type = sys.exc_info()[0]
260 value = sys.exc_info()[1]
261 print '>>>>CS_Pbruno StudyTree.getMainShapeEntry( entry = %s ) ' %entry
262 print 'type = %s , value = %s '%( type, value )
267 def sameMainShape( self, shapeEntry1, shapeEntry2 ):
269 Détermine si les objets géometriques fournis en argument sont les
270 sous-objets d'une même géométrie principale
272 @type shapeEntry1: string
273 @param shapeEntry1: identifiant dans l'arbre d'étude d'un objet géométrique
275 @type shapeEntry2: string
276 @param shapeEntry2: identifiant dans l'arbre d'étude d'un objet géométrique
279 @return : True si même objet principal, False sinon, None si erreur.
283 mainShape1 = self.getMainShapeEntry( shapeEntry1 )
285 mainShape2 = self.getMainShapeEntry( shapeEntry2 )
287 result = mainShape1 == mainShape2
290 type = sys.exc_info()[0]
291 value = sys.exc_info()[1]
292 print '>>>>CS_Pbruno StudyTree.sameMainShape( shapeEntry1 = %s , shapeEntry2 = %s )'%( shapeEntry1, shapeEntry2 )
293 print 'type = %s , value = %s '%( type, value )
299 # --------------------------------------------------------------------------
300 # fonctions de manipulation des objets maillages dans l'arbre d'étude
301 # ( éléments contenu dans la sous-rubrique 'Mesh' )
302 def __getMeshType( self, shapeEntry ):
304 Determination du type de maille en fonction de la géométrie pour les conditions aux limites.
306 @type shapeEntry : string
307 @param shapeEntry : identifiant de l'objet géométrique
309 @rtype: SMESH::ElementType ( voir SMESH_Mesh.idl )
310 @return: type de maillage, None si erreur.
315 anObject = self.__getCORBAObject( shapeEntry )
316 shape = anObject._narrow( GEOM.GEOM_Object )
318 if shape: #Ok, c'est bien un objet géométrique
319 tgeo = str( shape.GetShapeType() )
322 "VERTEX" : SMESH.NODE,
325 "SOLID": SMESH.VOLUME,
328 result = meshTypeStr[ tgeo]
330 if not self.geomEngine:
331 self.geomEngine = salome.lcc.FindOrLoadComponent( "FactoryServer", "GEOM" )
333 self.GroupOp = self.geomEngine.GetIGroupOperations( salome.myStudyId )
335 tgeo = self.GroupOp.GetType( shape )
336 meshTypeInt = { #Voir le dictionnnaire ShapeType dans geompy.py pour les correspondances type - numero.
342 if meshTypeInt.has_key( int( tgeo ) ):
343 result = meshTypeInt[ tgeo]
346 type = sys.exc_info()[0]
347 value = sys.exc_info()[1]
348 logger.debug( '>>>>CS_Pbruno StudyTree.__getMeshType( shapeEntry = %s ) ' %shapeEntry )
349 logger.debug( 'type = %s , value = %s '%( type, value ))
354 def getAllMeshReferencingMainShape( self, mainShapeEntry ):
356 Retourne une liste de tous les maillages construits à partir de l'objet
357 principal géométrique passé en argument
359 @type mainShapeEntry : string
360 @param mainShapeEntry : identifiant( entry ) de l'objet principal géométrique
363 @return: liste des identifiants( entry ) des maillages, liste vide si aucun , None si erreur.
368 if self.isMainShape( mainShapeEntry ):
369 mainShapeSO = salome.IDToSObject( mainShapeEntry )
370 SObjectList = self._myStudy.FindDependances( mainShapeSO )
371 print '#### mainShapeSO=%s , SObjectList = %s'%( mainShapeSO, SObjectList )
372 if SObjectList: #Ok, il y a des objet référençant la mainShape
373 for SObject in SObjectList: # Recherche du type de chacun des objets
374 SFatherComponent = SObject.GetFatherComponent()
375 print '#### SFatherComponent = %s'%SFatherComponent
376 if SFatherComponent.GetName() == SMesh: #Ok, l'objet est un objet du composant 'Mesh'
377 SFather = SObject.GetFather()
378 print '#### SFather= %s'%SFather
379 ##CorbaObject = SFather.GetObject()
380 FatherEntry = SFather.GetID()
381 CorbaObject = self.__getCORBAObject( FatherEntry )
382 print '#### CorbaObject = %s'%CorbaObject
383 MeshObject = CorbaObject ._narrow( SMESH.SMESH_Mesh )
384 print '#### MeshObject = %s'%MeshObject
385 if MeshObject : #Ok, l'objet est un objet 'maillage'
386 MeshObjectEntry = self.__getEntry( MeshObject )
387 print '#### MeshObjectEntry = %s'%MeshObjectEntry
389 result.append( MeshObjectEntry ) # On l'ajoute ds la liste résultat!
390 else: # c'est pas une mainShape !
394 type = sys.exc_info()[0]
395 value = sys.exc_info()[1]
396 logger.debug( '>>>>CS_Pbruno StudyTree.getAllMeshReferencingMainShape( mainShapeEntry = %s ) ' %mainShapeEntry )
397 logger.debug( 'type = %s , value = %s '%( type, value ))
404 def updateMesh( self, meshEntry, groupeMaEntries, groupeNoEntries ):
406 Met à jours d'un objet maillage à partir d'une liste de sous-objet géométrique.
407 L'opération consiste à créer des groupes dans le maillage correspondant
408 aux sous-objets géométrique de la liste.
410 CS_pbruno Attention: ajoute des groupes sans vérifier si auparavant ils ont déjà été crées
412 @type meshEntry : string
413 @param meshEntry : identifiant du maillage
415 @type groupeMaEntries : liste de string
416 @param groupeMaEntries : liste contenant les identifiants ( entry ) des sous-objets géométriques
417 sur lesquel on veut construire des groupes de face.
419 @type groupeNoEntries : liste de string
420 @param groupeNoEntries : liste contenant les identifiants ( entry ) des sous-objets géométriques
421 sur lesquel on veut construire des groupes de noeuds.
424 @return: True si update OK, False en cas d'erreur
428 #print 'CS_pbruno updateMesh( self, meshEntry=%s, groupeMaEntries=%s )'%( meshEntry, groupeMaEntries )
429 corbaObject = self.__getCORBAObject( meshEntry )
430 mesh = corbaObject._narrow( SMESH.SMESH_Mesh )
432 if mesh: # Ok, c'est bien un maillage
436 #création groupes de noeud
437 for shapeEntry in groupeNoEntries:
438 anObject = self.__getCORBAObject( shapeEntry )
439 shape = anObject._narrow( GEOM.GEOM_Object )
440 if shape: #Ok, c'est bien un objet géométrique
441 shapeName = self.getNameAttribute( shapeEntry )
442 mesh.CreateGroupFromGEOM( SMESH.NODE, shapeName, shape )
444 pass # CS_pbruno au choix: 1)une seule erreur arrète l'intégralité de l'opération
445 #return False # 2)ou on continue et essaye les suivants ( choix actuel
447 #création groupes de face
448 for shapeEntry in groupeMaEntries:
449 meshType = self.__getMeshType( shapeEntry )
451 anObject = self.__getCORBAObject( shapeEntry )
452 shape = anObject._narrow( GEOM.GEOM_Object )
453 if shape: #Ok, c'est bien un objet géométrique
454 shapeName = self.getNameAttribute( shapeEntry )
455 mesh.CreateGroupFromGEOM( meshType, shapeName, shape )
457 pass #CS_pbruno au choix: 1)une seule erreur arrète l'intégralité de l'opération
458 #return False # 2)ou on continue et essaye les suivants ( choix actuel )
460 pass #CS_pbruno au choix: 1)une seule erreur arrète l'intégralité de l'opération
461 #return False # 2)ou on continue et essaye les suivants ( choix actuel )
467 type = sys.exc_info()[0]
468 value = sys.exc_info()[1]
469 logger.debug( '>>>>CS_Pbruno StudyTree.updateMesh( meshEntry= %s, groupeMaEntries = %s )' %( meshEntry, groupeMaEntries))
470 logger.debug( 'type = %s , value = %s '%( type, value ))
479 def createMesh( self, newMeshName, mainShapeEntry, groupeMaEntries, groupeNoEntries ):
481 Création d'un objet maillage à partir d'un objet géométrique principal
482 Les groupes dans le maillage sont crée à partir des sous-objets géométriques
483 contenu dans la liste fourni en paramètre d'entré.
485 @type newMeshName : string
486 @param newMeshName : nom du nouveau maillage
488 @type mainShapeEntry : string
489 @param mainShapeEntry : identifiant de l'objet géométrique principal
491 @type groupeMaEntries : liste de string
492 @param groupeMaEntries : liste contenant les identifiants ( entry ) des sous-objets géométriques
493 sur lesquel on veut construire des groupes de face.
495 @type groupeNoEntries : liste de string
496 @param groupeNoEntries : liste contenant les identifiants ( entry ) des sous-objets géométriques
497 sur lesquel on veut construire des groupes de noeuds.
500 @return: identifiant( entry ) dans l'arbre d'étude du nouveau maillage, None en cas d'erreur.
504 #print 'CS_pbruno createMesh( self, newMeshName=%s, mainShapeEntry=%s, groupeMaEntries=%s )'%( newMeshName, mainShapeEntry, groupeMaEntries )
506 anObject = self.__getCORBAObject( mainShapeEntry )
507 shape = anObject._narrow( GEOM.GEOM_Object )
509 # Création du nouveau maillage
510 if not self.smeshEngine:
511 self.smeshEngine = salome.lcc.FindOrLoadComponent( "FactoryServer", "SMESH" )
512 self.smeshEngine.SetCurrentStudy( salome.myStudy )
513 newMesh = self.smeshEngine.CreateMesh( shape )
514 newMeshEntry = self.__getEntry( newMesh )
516 ok = self.setName( newMeshEntry, newMeshName )
518 result = self.updateMesh( newMeshEntry, groupeMaEntries, groupeNoEntries )
521 type = sys.exc_info()[0]
522 value = sys.exc_info()[1]
523 logger.debug( '>>>>CS_Pbruno StudyTree.createMesh( self, newMeshName=%s, mainShapeEntry=%s, groupeMaEntries=%s )'%( newMeshName, mainShapeEntry, groupeMaEntries))
524 logger.debug( 'type = %s , value = %s '%( type, value ))
536 # --------------------------------------------------------------------------
538 study = SalomeStudy()