Salome HOME
merge from V3_2_0_maintenance 17mar08
[modules/eficas.git] / src / EFICASGUI / eficasSalome.py
index b86f9e50c681324aa751442134ede29b5fde7697..6bbde01823c4f24e227a291dfbdb4038276e983c 100644 (file)
+# -*- coding: utf-8 -*-
+
+from Logger import ExtLogger
+
 import qt
 import notifqt
 # -----------------------------------------------------------------------------
-import sys
+import sys, os, re,types
+
 
+
+"""
 # Remplacement de la fonction exit standard par une fonction
 # qui n'interrompt pas l'execution
+
 sys._exit=sys.exit
 
 def exit(ier):
    print "appel de exit: ",ier
 
-#sys.exit=exit
+
 # Fin remplacement
+"""
+
+
+import eficasConfig
+
+sys.path[:0]=[os.path.join( eficasConfig.eficasPath,'Aster'),
+              os.path.join( eficasConfig.eficasPath,'Homard'),
+              os.path.join( eficasConfig.eficasPath,'InterfaceTK'),
+              os.path.join( eficasConfig.eficasPath,'Editeur'),
+              eficasConfig.eficasPath,
+             ]
+
 
-initialised=0
 import Tkinter
-root=Tkinter.Tk()
+
+
+# mode de lancement Eficas
+ASTER  = "ASTER"
+HOMARD = "HOMARD"
+
+
+import Editeur    
+try :
+   from Editeur import eficas
+   from Editeur import splash
+except :
+   from InterfaceTK import eficas
+   from InterfaceTK import splash
+
+import salome
+import meshGui
+import visuDriver
+import PALGUI_API
+import studyManager
+
+#from qxembed import QXEmbed
+
+import SalomePyQt
+
+
+from SelectMainShapeDiag_ui import SelectMainShapeDiag
+from SelectMeshDiag_ui import SelectMeshDiag
+
+
+
+# message utilisateur
+msgWarning                 = "Attention"
+msgMainShapeSelection      = "On travaille sur la géométrie principale : "
+msgSubShapeBadMainShape    = "La sélection géométrique SALOME ne correspond pas à une sous-géométrie de la géométrie principale : "
+msgMeshGroupBadMainShape   = "Le groupe de maillage sélectionné dans SALOME ne référence pas la bonne géométrie principale : "
+msgIncompleteSelection     = "Tous les éléments de la sélection SALOME n'ont pu étre ajoutée"
+msgUnAuthorizedSelecion    = "Sélection SALOME non authorisé. Autorisé : sous-géométrie, groupe de maille"
+msgErrorAddJdcInSalome     = "Erreur dans l'export du fichier de commande dans l'arbre d'étude Salome"
+msgErrorDisplayShape       = "Erreur dans l'affichage de la forme géométrique sélectionnée"
+msgErrorDisplayMeshGroup   = "Erreur dans l'affichage du groupe de maillage sélectionné"
+msgErrorNeedSubShape       = "Sélection d'un élément sous géométrique seulement"
+
+
+msgErrorGroupMaSelection    = "Sélection GROUP_MA ne peut pas prendre un point ou un noeud"
+msgWarningGroupNoSelection  = "Attention, GROUP_NO devrait prendre un point ou un noeud"
+
+
+
+
+# couleur pour visualisation des géometrie CS_CBO
+COLORS = ( studyManager.RED, 
+         studyManager.GREEN,
+         studyManager.BLUE,
+         studyManager.SANDY,
+         studyManager.ORANGE,
+         studyManager.PURPLE,
+         studyManager.DARK_RED,
+         studyManager.DARK_GREEN,
+         studyManager.DARK_BLUE,
+         studyManager.YELLOW,
+         studyManager.PINK,
+         studyManager.CYAN )
+
+LEN_COLORS = len( COLORS )
+
+
+
+
+class SelectMainShapeDiagImpl( SelectMainShapeDiag ):
+    def __init__( self, mainShapeEntries, parent = None,name = None,modal = 1,fl = 0 ):
+        SelectMainShapeDiag.__init__( self,parent,name,modal,fl )
+        
+        self.mainShapes = {} # ( entry, value )
+        for entry in mainShapeEntries:
+            name = studyManager.palStudy.getName( entry )
+            self.mainShapes[entry] = name
+            
+        self.lbMainShapes.clear()
+        for entry,name in self.mainShapes.items():
+            self.lbMainShapes.insertItem( name )
+        self.lbMainShapes.setCurrentItem( 0 )
+
+                                    
+    def getUserSelection( self ):
+        mainShapeEntry = None
+        
+        item = self.lbMainShapes.selectedItem()
+        mainShapeName = str( item.text() )        
+        
+        for entry, name in self.mainShapes.items():
+            if mainShapeName == name:
+                mainShapeEntry = entry
+                break                
+            
+        return mainShapeEntry 
+
+        
+class SelectMeshDiagImpl( SelectMeshDiag ):
+    def __init__( self, meshGroupEntries, parent = None,name = None,modal = 1,fl = 0 ):
+        SelectMeshDiag.__init__( self,parent,name,modal,fl )
+        
+        self.meshes = {} # ( entry, value )         
+        
+        for meshGroupEntry in meshGroupEntries:
+            meshEntry = studyManager.palStudy.getMesh(meshGroupEntry)
+            meshName  = studyManager.palStudy.getName(meshEntry)            
+            self.meshes[meshEntry] = meshName 
+                        
+        self.lbMeshes.clear()
+        for entry,name in self.meshes .items():
+            self.lbMeshes.insertItem( name )
+        self.lbMeshes.setCurrentItem( 0 )        
+                                    
+    def getUserSelection( self ):
+        selMeshEntry, keep = None, False
+        
+        item = self.lbMeshes.selectedItem()
+        meshName = str( item.text() )        
+        for entry, name in self.meshes.items():
+            if meshName == name:
+                selMeshEntry = entry
+                break
+            
+        keep = self.cbAgain.isChecked()
+            
+        return selMeshEntry, keep         
+
+
+
+
+#class MyEficas( Tkinter.Toplevel, eficas.EFICAS, QXEmbed ):
+class MyEficas( Tkinter.Toplevel, eficas.EFICAS ):
+    """
+    Classe de lancement du logiciel EFICAS dans SALOME.
+    Cette classe spécialise le logiciel Eficas par l'ajout de:        
+    a)la création de groupes de mailles dans le composant SMESH de SALOME
+    b)la visualisation d'éléments géométrique dans le coposant GEOM de SALOME par sélection dans EFICAS
+    """
+    def __init__( self, parent, code = None, fichier = None, module = studyManager.SEficas, version=None):
+        """
+        Constructeur.
+                
+        @type   parent: 
+        @param  parent: widget Qt parent
+                
+        
+        @type   code: string
+        @param  code: catalogue à lancer ( ASTER, HOMARD ). optionnel ( défaut = ASTER ).
+        
+        @type   fichier: string
+        @param  fichier: chemin absolu du fichier eficas à ouvrir à dès le lancement. optionnel
+        """
+        #QXEmbed.__init__( self, parent, "", qt.Qt.WDestructiveClose | qt.Qt.WStyle_Customize | qt.Qt.WStyle_StaysOnTop )        
+        Tkinter.Toplevel.__init__( self )
+                        
+        if Editeur.__dict__.has_key( 'session' ):
+            from Editeur import session
+            eficasArg = []
+            eficasArg += sys.argv            
+            if fichier:
+                eficasArg += [ fichier ]
+            if version:
+                eficasArg += [ "-c", version ]
+            session.parse( eficasArg )
+                        
+        
+        #----------------------------------------  initialisation EFICAS  --------------------------  
+        splash.init_splash( self, code = code, titre = "Lancement d'EFICAS pour %s" %code )
+        splash._splash.configure( text="Chargement d'EFICAS en cours.\n Veuillez patienter ..." )
+        # différence eficas 1.7 et 1.8
+        
+        # compatibilite 1.12
+        V112=0
+        try :
+          from Editeur import appli
+          V112=1
+        except :
+          pass
+               
+        if V112 :
+            eficas.EFICAS.__init__( self, self, code = code )
+        else :
+            eficas.EFICAS.__init__( self, self, code = code , salome = 1)
+        
+        
+        #---------------------------------------------------------------------------------------------
+        
+        
+        """
+        #------  embarcation dans une fenêtre qt pour mise au premier plan  ---
+        #embedded = QXEmbed( parent, "", qt.Qt.WDestructiveClose | qt.Qt.WStyle_Customize | qt.Qt.WStyle_StaysOnTop )        
+        embedded = QXEmbed( parent, "" )
+        #embedded.initialize()        
+        embedded.show()
+        embedded.embedTk( self.winfo_id() )        
+        size = embedded.sizeHint()
+        #print 'CS_pbruno size (%s, %s )'%( size.width(), size.height () )
+        embedded.resize( size.width(), size.height () )
+        embedded.setWFlags(  qt.Qt.WDestructiveClose | qt.Qt.WStyle_Customize | qt.Qt.WStyle_StaysOnTop )
+        #---------------------------------------------------------------------------------------------
+        """
+        
+        #--------------- spécialisation EFICAS dans SALOME  -------------------                
+        self.parent = parent        
+        self.salome = True      #active les parties de code spécifique dans Salome( pour le logiciel Eficas )
+        self.module = module    #indique sous quel module dans l'arbre d'étude ajouter le JDC.
+        
+        
+        # donnée pour la création de groupe de maille
+        self.mainShapeNames   = {} #dictionnaire pour gérer les multiples fichiers possibles ouverts par 
+        self.mainShapeEntries = {} #eficas ( clé = identifiant du JDC ), une mainshape par fichier ouvert.    
+        self.subShapes        = {} #dictionnaire des sous-géométrie de la géométrie principale ( clé = entry, valeur = name ) 
+        #----------------------------------------------------------------------    
+        
+        # visualisation groupes de mailles
+        self.workingMesh = {} #dictionnaire clé = identifiant JDC / valeur = entry Mesh
+        #----------------------------------------------------------------------        
+        
+        self.icolor = 0  # compteur pour mémoriser la couleur courante
+        
+        
+    def quit(self): 
+        global appli        
+        appli = None
+        self.destroy()
+
+    def destroy(self):
+        global appli
+        appli = None
+        Tkinter.Toplevel.destroy(self)
+                    
+    def __studySync( self ):
+        """
+        IMPORTANT( à appeler préalablement à chaque appel du gestionnaire d'étude ) : spécifique au lancement de Eficas dans Salome,
+        permet au gestionnaire d'étude ( studyManager.palStudy ) de pointer sur la bonne étude.
+        
+        Un retour à False indique qu'il n'y a aucune étude active, dans ce cas ne faire aucune opération avec le gestionnaire d'étude( 
+        gros plantage sinon )
+        """                
+        activeStudyId = salome.sg.getActiveStudyId()
+        
+        if activeStudyId == 0: # pas d'étude active
+            return False
+        
+        if activeStudyId != salome.myStudyId:
+            studyManager.palStudy.setCurrentStudyID( activeStudyId )            
+            
+        return True
+
+        
+    def __createOCCView( self ):
+        """
+        Création vue Occ
+        """        
+        #salome.salome_init()
+        import iparameters
+
+        # On détermine le nombre de GUI states déjà présents dans l'arbre d'étude
+        GUIStateID = 1
+
+        ipar = iparameters.IParameters(salome.myStudy.GetCommonParameters("Interface Applicative", GUIStateID))
+        properties = ipar.getProperties()
+
+        while properties != []:
+            GUIStateID += 1
+            ipar = iparameters.IParameters(salome.myStudy.GetCommonParameters("Interface Applicative", GUIStateID))
+            properties = ipar.getProperties()
+   
+        print "GUIStateID: ", GUIStateID
+
+        #Set up visual properties:
+        ipar.setProperty("AP_ACTIVE_VIEW", "OCCViewer_0_0")
+        ipar.setProperty("AP_WORKSTACK_INFO", "(splitter orientation=0 sizes=1045 (views active='OCCViewer_0_0' 'OCCViewer_0_0'))")
+        ipar.setProperty("AP_SAVEPOINT_NAME", "GUI state: %i"%(GUIStateID))
+
+        #Set up lists:
+        # fill list AP_VIEWERS_LIST
+        ipar.append("AP_VIEWERS_LIST", "OCCViewer_1")
+        # fill list OCCViewer_1
+        ipar.append("OCCViewer_1", "OCC scene:1 - viewer:1")
+        ipar.append("OCCViewer_1", "1.000000000000e+00*0.000000000000e+00*0.000000000000e+00*5.773502588272e-01*-5.773502588272e-01*5.773502588272e-01*0.000000000000e+00*0.000000000000e+00*0.000000000000e+00*0.000000000000e+00*2.886751294136e+02*-2.886751294136e+02*2.886751294136e+02")
+
+        if salome.sg.hasDesktop():
+            salome.sg.updateObjBrowser(1)
+            iparameters.getSession().restoreVisualState(GUIStateID)
+        
+                        
+    def __selectWorkingMesh( self, meshGroupEntries ):
+        """
+        Sélection intéractive du maillage sur lequel on travail
+        """
+        selMeshEntry, keep = None, False
+        diag = SelectMeshDiagImpl( meshGroupEntries, self.parent  )
+    
+        if diag.exec_loop() == qt.QDialog.Accepted:
+            selMeshEntry, keep = diag.getUserSelection()
+        return selMeshEntry, keep    
+            
+
+
+    def __selectMainShape( self, groupeMaNamesIn, groupeNoNamesIn, jdcID ):
+        """
+        Sélection intéractive de la main shape
+        """
+        groupeMaNamesOut, groupeNoNamesOut = [], []
+        selectedMainShape  =  None
+        mainShapes = {}
+        mainShapeEntries = []
+
+        # liste des main shape possibles
+        for groups in ( groupeMaNamesIn, groupeNoNamesIn ):
+            for subShapeName in groups:
+                entries = studyManager.palStudy.getEntriesFromName( studyManager.SGeom, subShapeName )
+                for entry in entries:
+                    mainShapeEntry = studyManager.palStudy.getMainShapeEntry( entry )
+                    if mainShapeEntry != entry:
+                        if mainShapes.has_key(subShapeName):
+                            mainShapes[ subShapeName ].append( mainShapeEntry )
+                        else:
+                            mainShapes[ subShapeName ] = [ mainShapeEntry ]
+                        if not mainShapeEntry in mainShapeEntries:
+                            mainShapeEntries += [ mainShapeEntry ]
+        
+        if mainShapes:
+            if len(mainShapeEntries)>1:
+                diag = SelectMainShapeDiagImpl( mainShapeEntries, self.parent  )
+        
+                if diag.exec_loop() == qt.QDialog.Accepted:
+                    selectedMainShape = diag.getUserSelection()                
+                    print 'main shape user selection ->',selectedMainShape
+
+            else:
+                selectedMainShape = mainShapeEntries[0]
+            
+            self.mainShapeEntries[ jdcID ] = selectedMainShape
+                    
+            # filtre sur la main shape sélectionnée
+            for name in groupeMaNamesIn:
+                try:
+                    if selectedMainShape in mainShapes[ name ] :
+                        groupeMaNamesOut += [ name ]
+                except:
+                    pass
+            
+            for name in groupeNoNamesIn:
+                try:
+                    if selectedMainShape in mainShapes[ name ] :
+                        groupeNoNamesOut += [ name ]
+                except:
+                    pass
+                        
+        return groupeMaNamesOut, groupeNoNamesOut
+
+
+
+
+    def __selectShape( self, jdcID, selectedEntry, kwType = None ):
+        """
+        sélection sous-géométrie dans Salome:
+        -test1) si c'est un élément sous-géométrique .
+        -test2) si appartient à la géométrie principale.
+        
+        met à jours la liste self.subShapes si test ok
+        """        
+        name, msgError = '',''
+        
+        selectedMainShapeEntry = studyManager.palStudy.getMainShapeEntry( selectedEntry )
+        
+        if selectedMainShapeEntry and selectedMainShapeEntry != selectedEntry: #ok test1)
+            
+            tGeo = studyManager.palStudy.getRealShapeType( selectedEntry )
+            if kwType == "GROUP_NO" and tGeo != studyManager.VERTEX:                
+                msgError = msgWarningGroupNoSelection
+            elif kwType == "GROUP_MA" and tGeo == studyManager.VERTEX:
+                name, msgError = '', msgErrorGroupMaSelection                
+                return name, msgError            
+                            
+            if not self.mainShapeEntries.has_key( jdcID ):
+                self.mainShapeEntries[ jdcID ] = selectedMainShapeEntry
+                name = studyManager.palStudy.getName( selectedMainShapeEntry )
+                msgError = msgMainShapeSelection + name
+            if selectedMainShapeEntry == self.mainShapeEntries[ jdcID ]:
+                name = studyManager.palStudy.getName( selectedEntry )
+                self.subShapes[ selectedEntry ] = name                
+            else:                
+                if not self.mainShapeNames.has_key( jdcID ):
+                    self.mainShapeNames[ jdcID ] = studyManager.palStudy.getName( self.mainShapeEntries[ jdcID ] )
+                msgError = msgSubShapeBadMainShape + self.mainShapeNames[ jdcID ]                
+        else:
+            name, msgError = '', msgErrorNeedSubShape
+
+        return name, msgError 
+        
+        
+        
+    def __selectMeshGroup( self, jdcID, selectedEntry, kwType = None ):
+        """
+        sélection groupe de maille dans Salome:
+        -test 1) si c'est un groupe de maille 
+        -test 2) si le maillage fait référence à la géométrie principale 
+        """        
+        name, msgError = '',''                
+                
+        selectedMeshEntry = studyManager.palStudy.getMesh( selectedEntry )
+                
+        if selectedMeshEntry: # ok test 1)            
+            tGroup = studyManager.palStudy.getGroupType( selectedEntry )
+            if kwType == "GROUP_NO" and tGroup != studyManager.NodeGroups:                
+                msgError = msgWarningGroupNoSelection
+            elif kwType == "GROUP_MA" and tGroup == studyManager.NodeGroups:
+                name, msgError = '', msgErrorGroupMaSelection                
+                return name, msgError                        
+                        
+            selectedMainShapeEntry = studyManager.palStudy.getShapeFromMesh( selectedMeshEntry )
+            
+            if selectedMainShapeEntry: #test 2)                
+                if not self.mainShapeEntries.has_key( jdcID ):
+                    self.mainShapeEntries[ jdcID ] = selectedMainShapeEntry
+                    name = studyManager.palStudy.getName( selectedMainShapeEntry )
+                    msgError = msgMainShapeSelection + name                    
+                if selectedMainShapeEntry == self.mainShapeEntries[ jdcID ]:
+                    name = studyManager.palStudy.getName( selectedEntry  )  #ok test 2)
+                else:                    
+                    if not self.mainShapeNames.has_key( jdcID ):
+                        self.mainShapeNames[ jdcID ] = studyManager.palStudy.getName(
+                                                            self.mainShapeEntries[ jdcID ] )
+                    msgError = msgMeshGroupBadMainShape + self.mainShapeNames[ jdcID ]
+            else:
+                # on authorise quand même les groupes de maillage ne faisant 
+                # pas référence à une géométrie principale (dixit CS_CBO )
+                name = studyManager.palStudy.getName( selectedEntry )
+                                          
+        return name, msgError
+        
+        
+    
+        
+    def __updateSubShapes( self, jdcID, groupeNames ):
+        """
+        mise à jours de la liste self.subShapes à partir de la liste des noms de groupe fourni en entré
+        """
+        for name in groupeNames:
+            entries = studyManager.palStudy.getEntriesFromName( studyManager.SGeom, name )            
+            for entry in entries:
+                if not self.subShapes.has_key( entry ):                    
+                    ok, msgError = self.__selectShape( jdcID, entry ) # filtre
+                    if ok:
+                        self.subShapes[ entry ] = name                    
+        
+    def __getAllGroupeMa(self, item ):
+        """
+        Récupère tous les GROUPE_MA dans le JDC courant
+        """
+        groupMa = ()                
+        try:
+            itemName  = item.get_nom()
+            if 'GROUP_MA' in itemName:
+                #print 'CS_pbruno itemName',itemName             
+                itemValue = item.get_valeur()
+                if type( itemValue ) == str:
+                    groupMa += ( itemValue , )
+                elif type( itemValue ) == tuple:
+                    groupMa += itemValue                
+               elif type( itemValue ) == list:
+                   groupMa += tuple(itemValue)
+               elif type( itemValue ) == types.InstanceType and itemValue.has_key('GROUP_MA'):
+                    # pour créer le groupe de mailles dans DEFI_GROUP> CREA_GROUP_MA> GROUP_MA
+                   groupMa += ( itemValue['GROUP_MA'], )
+            else:
+                children = item._GetSubList()
+                for child in children:            
+                    groupMa +=  self.__getAllGroupeMa( child )
+        except:
+       # traitement des MCLIST Pour CREA_GROUP_MA
+            try:
+                itemName  = item.get_nom()
+                if 'GROUP_MA' in itemName:
+                   children = item._GetSubList()
+                   for child in children:
+                       groupMa +=  self.__getAllGroupeMa( child )
+            except:
+               pass
+        return groupMa                
+        
+   
+    def __getAllGroupeNo(self, item ):
+        """
+        Récupère tous les GROUPE_NO dans le JDC courant
+        """
+        groupNo = ()                
+        try:
+            itemName  = item.get_nom()            
+            if 'GROUP_NO' in itemName:
+                itemValue = item.get_valeur()                
+                if type( itemValue ) == str:
+                    groupNo += ( itemValue , )
+                elif type( itemValue ) == tuple:
+                    groupNo += itemValue
+               elif type( itemValue ) == list:
+                   groupNo += tuple(itemValue)
+               elif type( itemValue ) == types.InstanceType and itemValue.has_key('GROUP_NO'):
+                    # pour créer le groupe de Noeuds dans DEFI_GROUP> CREA_GROUP_NO> GROUP_NO
+                   groupNo += ( itemValue['GROUP_NO'], )
+            else:
+                children = item._GetSubList()
+                for child in children:            
+                    groupNo += self.__getAllGroupeNo( child )
+        except:
+       # traitement des MCLIST Pour CREA_GROUP_NO dans DEFI_GROUP
+            try:
+                itemName  = item.get_nom()
+                if 'GROUP_NO' in itemName:
+                   children = item._GetSubList()
+                   for child in children:
+                       groupNo +=  self.__getAllGroupeNo( child )
+            except:
+               pass
+        return groupNo
+
+        
+    #-----------------------  LISTE DES NOUVEAUX CAS D'UTILISATIONS -----------    
+    def selectGroupFromSalome( self, kwType = None):
+        """
+        Sélection d'élément(s) d'une géométrie ( sub-shape ) ou d'élément(s) de maillage ( groupe de maille) à partir de l'arbre salome
+        retourne ( la liste des noms des groupes, message d'erreur )
+        
+        Note: Appelé par EFICAS lorsqu'on clique sur le bouton ajouter à la liste du panel AFF_CHAR_MECA        
+        """
+        names, msg = [], ''
+        try:            
+            atLeastOneStudy = self.__studySync()
+            if not atLeastOneStudy:
+                return names, msg
+            # récupère toutes les sélections de l'utilsateur dans l'arbre Salome
+            entries = salome.sg.getAllSelected()
+            nbEntries = len( entries )
+            if nbEntries >= 1:
+#                 jdcID = self.bureau.nb.getcurselection()
+                jdcID = self.bureau.JDCDisplay_courant                
+                for entry in entries:
+                    if studyManager.palStudy.isMeshGroup( entry ): #sélection d'un groupe de maille
+                        name, msg = self.__selectMeshGroup( jdcID, entry, kwType )
+                    elif studyManager.palStudy.isShape( entry ): #sélection d'une sous-géométrie
+                        name, msg = self.__selectShape( jdcID, entry, kwType )
+                    else:
+                        name, msg = '', msgUnAuthorizedSelecion
+                    if name:
+                        names.append( name )                    
+                        
+            if names and len( names ) < nbEntries:                        
+                msg = msgIncompleteSelection
+            salome.sg.EraseAll()
+        except:            
+            logger.debug(50*'=')
+        return names, msg                
+        
+        
+    def addJdcInSalome(  self, jdcPath ):
+        """
+        Ajoute le Jeu De Commande ASTER ou HOMARD dans l'arbre d'étude Salome dans la rubrique EFICAS
+        """
+        ok, msgError = False, msgErrorAddJdcInSalome
+        try:            
+            atLeastOneStudy = self.__studySync()
+            if not atLeastOneStudy:
+                return ok, msgError
+                        
+            fileType = { 'ASTER':  studyManager.FICHIER_EFICAS_ASTER,
+                        'HOMARD': studyManager.FICHIER_EFICAS_HOMARD }
+                        
+            folderName = {  'ASTER':  'AsterFiles',
+                            'HOMARD': 'HomardFiles' }                                    
+                        
+            moduleEntry = studyManager.palStudy.addComponent(self.module)
+            itemName    = re.split("/",jdcPath)[-1]
+            
+            fatherEntry = studyManager.palStudy.addItem(
+                                    moduleEntry,
+                                    itemName = folderName[self.bureau.code],
+                                    itemIcon = "ICON_COMM_FOLDER",
+                                    itemType = studyManager.ASTER_FILE_FOLDER,
+                                    bDoublonCheck = True  )
+                                                                        
+            commEntry = studyManager.palStudy.addItem( fatherEntry ,
+                                                        itemName = itemName,
+                                                        itemType = fileType[ self.bureau.code ],
+                                                        itemValue = jdcPath,
+                                                        itemComment = str( jdcPath ),
+                                                        itemIcon    = "ICON_COMM_FILE",
+                                                        bDoublonCheck = True )
+            studyManager.palStudy.refresh()                                                       
+            print 'addJdcInSalome commEntry->', commEntry            
+            if commEntry:
+                ok, msgError = True, ''        
+        except:                    
+            logger.debug(50*'=')
+        return ok, msgError        
+        
+                
+    def createOrUpdateMesh( self ):
+        """
+            Ouverture d'une boite de dialogue : Creation de groupes de mailles dans un maillage existant ou un nouveau maillage.                         
+            Note: Appelé par EFICAS à la sauvegarde du JDC.
+        """
+        try:            
+            atLeastOneStudy = self.__studySync()
+            if not atLeastOneStudy:
+                return
+            
+#             jdcID = self.bureau.nb.getcurselection()
+            jdcID = self.bureau.JDCDisplay_courant
+            
+            groupeMaNames = self.__getAllGroupeMa( self.bureau.JDCDisplay_courant.tree.item )
+            groupeNoNames = self.__getAllGroupeNo( self.bureau.JDCDisplay_courant.tree.item )
+            
+            # on elimine les doublons de la liste
+            groupeMaNames = dict.fromkeys(groupeMaNames).keys()
+            groupeNoNames = dict.fromkeys(groupeNoNames).keys()
+            
+            print 'CS_pbruno createOrUpdateMesh groupeMaNames', groupeMaNames
+            print 'CS_pbruno createOrUpdateMesh groupeNoNames', groupeNoNames
+                        
+            # mise à jours de la liste des sous-géométrie ( self.subShapes )
+            if not self.mainShapeEntries.has_key( jdcID ):
+                # l'utilisateur n'a sélectionné aucune sous-géométrie et donc pas de géométrie principale
+                groupeMaNames, groupeNoNames  = self.__selectMainShape( groupeMaNames, groupeNoNames, jdcID )
+                
+            if groupeMaNames or groupeNoNames:                                                
+                print 'CS_pbruno createOrUpdateMesh groupeMaNames', groupeMaNames
+                print 'CS_pbruno createOrUpdateMesh groupeNoNames', groupeNoNames            
+                self.__updateSubShapes( jdcID, groupeMaNames + groupeNoNames )
+    
+                # recupération des identifiants( entries ) associés aux noms des groupes        
+                groupeMaEntries = []
+                groupeNoEntries = []                            
+                
+                for entry, name in self.subShapes.items():
+                    if name in groupeMaNames:
+                        groupeMaEntries.append( entry )
+                    if name in groupeNoNames:                
+                        groupeNoEntries.append( entry )    
+
+                if groupeMaEntries or groupeNoEntries:                    
+                    diag = meshGui.MeshUpdateDialogImpl(
+                                self.mainShapeEntries[jdcID],
+                                groupeMaEntries,
+                                groupeNoEntries,
+                                studyManager.palStudy,
+                                self.parent )
+                    diag.show()
+                
+            self.subShapes.clear()
+            self.mainShapeNames.clear()
+            self.mainShapeEntries.clear()                
+        except:                    
+            logger.debug(50*'=')
+        
+                
+    def displayMeshGroups(self, meshGroupName):
+        """
+        visualisation group de maille de nom meshGroupName dans salome
+        """
+        ok, msgError = False, ''
+        try:
+            sg = salome.ImportComponentGUI('SMESH')
+            currentjdcID = self.bureau.nb.getcurselection()
+            meshGroupEntries = []
+            selMeshEntry = None
+            selMeshGroupEntry = None
+            
+            # liste des groupes de maille de nom meshGroupName
+            listSO = studyManager.palStudy._myStudy.FindObjectByName(meshGroupName, "SMESH")
+            print "liste des groupes de maille de nom %s: "%(meshGroupName), listSO
+            
+            if len(listSO)>0:
+                for SObjet in listSO:
+                    groupEntry = SObjet.GetID()                
+                    meshGroupEntries += [groupEntry]                    
+                
+                if len(meshGroupEntries)>1:
+                
+                    # choix d'un maillage
+                    if not self.workingMesh.has_key(currentjdcID): # aucun maillage de défini par défaut encore
+                        #selMeshEntry = "0:1:3:5" #CS_pbruno todo : choix maillage + test si c un maillage
+                        selMeshEntry, keep = self.__selectWorkingMesh(meshGroupEntries)
+                        if keep:
+                            self.workingMesh[currentjdcID] = selMeshEntry
+                    else: # déja un de défini par défaut
+                        selMeshEntry = self.workingMesh[currentjdcID]
+                            
+                    # le groupe de maille est il ds ce maillage?
+                    lselMeshEntry = len(selMeshEntry)            
+                    for groupEntry in meshGroupEntries:                
+                        if selMeshEntry == groupEntry[0:lselMeshEntry]:
+                            selMeshGroupEntry = groupEntry
+                            break
+    
+                else:
+                    selMeshGroupEntry = meshGroupEntries[0]
+                    
+                # on affiche le groupe ds la vue VTK
+                if selMeshGroupEntry:
+                    #CS_pbruno: marche QUE si le module SMESH est activé
+                    myComponent = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
+                    SCom        = studyManager.palStudy._myStudy.FindComponent("SMESH")
+                    studyManager.palStudy._myBuilder.LoadWith( SCom , myComponent  )                             
+                    sg.CreateAndDisplayActor(selMeshGroupEntry)
+                    salome.sg.Display(selMeshGroupEntry)
+                    salome.sg.FitAll()                
+                    ok = True                
+        except:
+            msgError = msgErrorDisplayMeshGroup
+            logger.debug(50*'=')
+        return ok, msgError
+
+            
+    def displayShape(  self, shapeName ):
+        """
+        visualisation géométrie de nom shapeName dans salome
+        """
+        ok, msgError = False, ''
+        try:
+            import VISU            
+            import visu_gui
+            currentViewType = None            
+            m = visu_gui.myVisu.GetViewManager()
+            v = m.GetCurrentView()
+            if v:
+                currentViewType = v.GetType()
+            
+            atLeastOneStudy = self.__studySync()
+            if not atLeastOneStudy:
+                return ok, msgError            
+                                     
+            #salome.sg.EraseAll()
+            print 'displayShapestrGeomShape shapeName -> ', shapeName
+            
+            if currentViewType == VISU.TVIEW3D: # maillage
+                print 'Vue courante = VTK : affichage groupe de maille'                
+                ok, msgError = self.displayMeshGroups(shapeName)
+            else: #geometrie
+                print 'Vue courante = OCC : affichage element geometrique'
+                #self.__createOCCView()
+                current_color = COLORS[ self.icolor % LEN_COLORS ]                
+                ok = studyManager.palStudy.displayShapeByName( shapeName, current_color )
+                salome.sg.FitAll()
+                self.icolor = self.icolor + 1             
+                if not ok:
+                    msgError = msgErrorDisplayShape
+        except:            
+            logger.debug(50*'=')
+        return ok, msgError    
+        
+        
+    def creeConfigTxt(self,fichier,dico):        
+        """
+           sauvegarde = asksaveasfilename(title="fichier config.txt",
+                                     defaultextension='.txt',
+                                     initialdir = fichier)
+           f=open(sauvegarde,'w+')
+           for unite in dico.keys():
+                print unite
+                type=dico[unite][0]
+                fic=dico[unite][1:]
+                ligne="fort."+str(unite)+" "+type+" "+fic
+                f.write(ligne)
+           f.close()
+           self.rangeInStudy(sauvegarde)
+          print "==============================="
+          print "fin crreConfigTxt"    
+        """
+        pass #CS_pbruno à implémenter
+           
+           
+    def buildCabriGeom( self, name, **param ):
+        """
+        visualisation dans GEOM d'une géométrie CABRI
+        """
+        import cabri        
+        qt.QApplication.setOverrideCursor( qt.QCursor.waitCursor )
+        cabri.tetra( name, **param )
+        qt.QApplication.restoreOverrideCursor()
+        
+        
+
+#-------------------------------------------------------------------------------------------------------
+#    Pilotage de la Visu des elements de structures
+#
+
+    def envoievisu(self,liste_commandes):
+        #try:
+        if ( 1 == 1 ):
+            atLeastOneStudy = self.__studySync()
+            if not atLeastOneStudy:
+                return
+            monDriver=visuDriver.visuDriver(studyManager.palStudy,liste_commandes)
+            monId = monDriver.analyse()
+            PALGUI_API.displaySE(monId)
+
+        else:
+        #except:
+            print "boum dans envoievisu"
+
+
+        
+#-------------------------------------------------------------------------------------------------------        
+#           Point d'entree lancement EFICAS
+#
+def runEficas( code="ASTER", fichier=None, module = studyManager.SEficas, version=None ):
+    global appli    
+    if not appli: #une seul instance possible!        
+        appli = MyEficas( SalomePyQt.SalomePyQt().getDesktop(), code = code, fichier = fichier, module = module, version=version )
+        
+        
+# pour compatibilitee           
+def runHomard( code="HOMARD", fichier=None ):
+    global appli    
+    if not appli: #une seul instance possible!                        
+        appli = MyEficas( SalomePyQt.SalomePyQt().getDesktop(), code = code, fichier = fichier )
+        
+
+        
+        
+"""        
+def runAster(parent = SalomePyQt.SalomePyQt().getDesktop(), palStudyManager = studyManager.palStudy, code="ASTER", fichier=None ) :
+    global appli    
+    if not appli: #une seul instance possible!                        
+        appli = MyEficas( parent, palStudyManager, code = code, fichier = fichier )
+"""    
+
+    
+     
+# Init globale du module
+root = Tkinter.Tk()
 root.withdraw()
 
-def runEficas(code="ASTER",fichier=None,studyId=None):
-    global initialised
-    if not initialised:
-        t=Tkinter.Toplevel()
-        t.withdraw()
-        import dataEficas; dataEficas.init(t,code,fichier,studyId=studyId)
-        t.update()
-        t.deiconify()
-        t.update()
 
-        #initialised=1
+appli = None
+
+
+
+logger=ExtLogger( "eficasSalome.py" )
+
+
 
-def runHomard() :
-    runEficas("HOMARD")
 
-def runAster() :
-    runEficas("ASTER")