1 from Logger import ExtLogger
5 # -----------------------------------------------------------------------------
11 # Remplacement de la fonction exit standard par une fonction
12 # qui n'interrompt pas l'execution
17 print "appel de exit: ",ier
26 sys.path[:0]=[os.path.join( eficasConfig.eficasPath,'Aster'),
27 os.path.join( eficasConfig.eficasPath,'Homard'),
28 os.path.join( eficasConfig.eficasPath,'Editeur'),
29 eficasConfig.eficasPath,
36 # mode de lancement Eficas
42 from Editeur import eficas
43 from Editeur import splash
49 #from qxembed import QXEmbed
56 msgWarning = "Attention"
57 msgSubShapeBadMainShape = "La sélection géométrique SALOME ne correspond pas à une sous-géométrie de la géométrie principale : "
58 msgMeshGroupBadMainShape = "Le groupe de maillage sélectionné dans SALOME ne référence pas la bonne géométrie principale : "
59 msgIncompleteSelection = "Tous les éléments de la sélection SALOME n'ont pu étre ajoutée"
60 msgUnAuthorizedSelecion = "Sélection SALOME non authorisé. Autorisé : sous-géométrie, groupe de maille"
61 msgErrorAddJdcInSalome = "Erreur dans l'export du fichier de commande dans l'arbre d'étude Salome"
62 msgErrorDisplayShape = "Erreur dans l'affichage de la forme géométrique sélectionnée"
65 # couleur pour visualisation des géometrie CS_CBO
66 COLORS = ( studyManager.RED,
72 studyManager.DARK_RED,
73 studyManager.DARK_GREEN,
74 studyManager.DARK_BLUE,
79 LEN_COLORS = len( COLORS )
83 #class MyEficas( Tkinter.Toplevel, eficas.EFICAS, QXEmbed ):
84 class MyEficas( Tkinter.Toplevel, eficas.EFICAS ):
86 Classe de lancement du logiciel EFICAS dans SALOME.
87 Cette classe spécialise le logiciel Eficas par l'ajout de:
88 a)la création de groupes de mailles dans le composant SMESH de SALOME
89 b)la visualisation d'éléments géométrique dans le coposant GEOM de SALOME par sélection dans EFICAS
91 def __init__(self, parent, code = None, fichier = None ):
96 @param parent: widget Qt parent
100 @param code: catalogue à lancer ( ASTER, HOMARD ). optionnel ( défaut = ASTER ).
102 @type fichier: string
103 @param fichier: chemin absolu du fichier eficas à ouvrir à dès le lancement. optionnel
105 #QXEmbed.__init__( self, parent, "", qt.Qt.WDestructiveClose | qt.Qt.WStyle_Customize | qt.Qt.WStyle_StaysOnTop )
106 Tkinter.Toplevel.__init__( self )
108 if Editeur.__dict__.has_key( 'session' ):
109 print 'CS_pbruno has_key session'
110 from Editeur import session
112 eficasArg += sys.argv
114 eficasArg += [ fichier ]
115 session.parse( eficasArg )
118 #---------------------------- initialisation EFICAS -----------------
119 splash.init_splash( self, code = code, titre = "Lancement d'EFICAS pour %s" %code )
120 splash._splash.configure( text="Chargement d'EFICAS en cours.\n Veuillez patienter ..." )
121 # différence eficas 1.7 et 1.8
124 eficas.EFICAS.__init__( self, self, code = code )
127 #----------------------------------------------------------------------
131 #------ embarcation dans une fenêtre qt pour mise au premier plan ---
132 #embedded = QXEmbed( parent, "", qt.Qt.WDestructiveClose | qt.Qt.WStyle_Customize | qt.Qt.WStyle_StaysOnTop )
133 embedded = QXEmbed( parent, "" )
134 #embedded.initialize()
136 embedded.embedTk( self.winfo_id() )
137 size = embedded.sizeHint()
138 print 'CS_pbruno size (%s, %s )'%( size.width(), size.height () )
139 embedded.resize( size.width(), size.height () )
140 embedded.setWFlags( qt.Qt.WDestructiveClose | qt.Qt.WStyle_Customize | qt.Qt.WStyle_StaysOnTop )
141 #----------------------------------------------------------------------
144 #--------------- spécialisation EFICAS dans SALOME -------------------
146 self.salome = True #active les parties de code spécifique dans Salome( pour le logiciel Eficas )
149 # donnée pour la création de groupe de maille
150 self.mainShapeNames = {} #dictionnaire pour gérer les multiples fichiers possibles ouverts par
151 self.mainShapeEntries = {} #eficas ( clé = identifiant du JDC ), une mainshape par fichier ouvert.
152 self.subShapes = {} #dictionnaire des sous-géométrie de la géométrie principale ( clé = entry, valeur = name )
153 #----------------------------------------------------------------------
156 self.icolor = 0 # compteur pour mémoriser la couleur courante
165 def __studySync( self ):
167 IMPORTANT( à appeler préalablement à chaque appel du gestionnaire d'étude ) : spécifique au lancement de Eficas dans Salome,
168 permet au gestionnaire d'étude ( studyManager.palStudy ) de pointer sur la bonne étude.
170 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(
171 gros plantage sinon )
173 activeStudyId = salome.sg.getActiveStudyId()
175 #print 'activeStudyId->',activeStudyId
176 #print 'salome.myStudyId->',salome.myStudyId
179 if activeStudyId == 0: # pas d'étude active
182 if activeStudyId != salome.myStudyId:
183 studyManager.palStudy.setCurrentStudyID( activeStudyId )
190 def __selectShape( self, jdcID, selectedEntry ):
192 sélection sous-géométrie dans Salome:
193 -test1) si c'est un élément géométrique.
194 -test2) si appartient à la géométrie principale.
196 met à jours la liste self.subShapes si test ok
198 print 'CS_pbruno __selectShape'
199 name, msgError = '',''
201 selectedMainShapeEntry = studyManager.palStudy.getMainShapeEntry( selectedEntry )
203 if selectedMainShapeEntry: #ok test1)
204 if not self.mainShapeEntries.has_key( jdcID ):
205 self.mainShapeEntries[ jdcID ] = selectedMainShapeEntry
206 if selectedMainShapeEntry == self.mainShapeEntries[ jdcID ]:
207 name = studyManager.palStudy.getName( selectedEntry )
208 self.subShapes[ selectedEntry ] = name
210 print 'CS_pbruno pas la même mainshape selectedEntry->',selectedEntry
211 if not self.mainShapeNames.has_key( jdcID ):
212 self.mainShapeNames[ jdcID ] = studyManager.palStudy.getName( self.mainShapeEntries[ jdcID ] )
213 msgError = msgSubShapeBadMainShape + self.mainShapeNames[ jdcID ]
215 return name, msgError
219 def __selectMeshGroup( self, jdcID, selectedEntry ):
221 sélection groupe de maille dans Salome:
222 -test 1) si c'est un groupe de maille
223 -test 2) si le maillage fait référence à la géométrie principale
225 print 'CS_pbruno __selectMeshGroup'
226 name, msgError = '',''
228 selectedMeshEntry = studyManager.palStudy.getMesh( selectedEntry )
230 if selectedMeshEntry: # ok test 1)
231 print 'CS_pbruno __selectMeshGroup selectedMeshEntry',selectedMeshEntry
232 selectedMainShapeEntry = studyManager.palStudy.getShapeFromMesh( selectedMeshEntry )
234 if selectedMainShapeEntry: #test 2)
235 print 'CS_pbruno __selectMeshGroup selectedMainShapeEntry',selectedMainShapeEntry
236 if not self.mainShapeEntries.has_key( jdcID ):
237 self.mainShapeEntries[ jdcID ] = selectedMainShapeEntry
238 if selectedMainShapeEntry == self.mainShapeEntries[ jdcID ]:
239 name = studyManager.palStudy.getName( selectedEntry ) #ok test 2)
241 print 'CS_pbruno pas la même mainshape selectedEntry ->',selectedEntry
242 if not self.mainShapeNames.has_key( jdcID ):
243 self.mainShapeNames[ jdcID ] = studyManager.palStudy.getName( self.mainShapeEntries[ jdcID ] )
244 msgError = msgMeshGroupBadMainShape + self.mainShapeNames[ jdcID ]
246 return name, msgError
251 def __updateSubShapes( self, jdcID, groupeNames ):
253 mise à jours de la liste self.subShapes à partir de la liste des noms de groupe fourni en entré
255 for name in groupeNames:
256 entries = studyManager.palStudy.getEntriesFromName( studyManager.SGeom, name )
257 for entry in entries:
258 ok, msgError = self.__selectShape( jdcID, entry ) # filtre
260 self.subShapes[ entry ] = name
263 def __getAllGroupeMa(self, item ):
265 Récupère tous les GROUPE_MA dans le JDC courant
269 itemName = item.get_nom()
270 #print 'CS_pbruno itemName',itemName
271 if itemName == 'GROUP_MA':
272 itemValue = item.get_valeur()
273 print 'CS_pbruno trouvé! GROUP_MA->', itemValue
274 if type( itemValue ) == str:
275 groupMa += ( itemValue , )
276 elif type( itemValue ) == tuple:
279 children = item.GetSubList()
280 for child in children:
281 groupMa += self.__getAllGroupeMa( child )
282 except: # à cause de GetSubList()...
284 print 'CS_pbruno groupMa',groupMa
288 def __getAllGroupeNo(self, item ):
290 Récupère tous les GROUPE_NO dans le JDC courant
294 itemName = item.get_nom()
295 print 'CS_pbruno itemName',itemName
296 if itemName == 'GROUP_NO':
297 itemValue = item.get_valeur()
298 print 'CS_pbruno trouvé! GROUP_NO->', itemValue
299 if type( itemValue ) == str:
300 groupNo += ( itemValue , )
301 elif type( itemValue ) == tuple:
304 children = item.GetSubList()
305 for child in children:
306 groupNo += self.__getAllGroupeNo( child )
307 except: # à cause de GetSubList()...
311 #----------------------- LISTE DES NOUVEAUX CAS D'UTILISATIONS -----------
312 def selectGroupFromSalome( self ):
314 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
315 retourne ( la liste des noms des groupes, message d'erreur )
317 Note: Appelé par EFICAS lorsqu'on clique sur le bouton ajouter à la liste du panel AFF_CHAR_MECA
321 atLeastOneStudy = self.__studySync()
322 if not atLeastOneStudy:
324 # récupère toutes les sélections de l'utilsateur dans l'arbre Salome
325 entries = salome.sg.getAllSelected()
326 print 'CS_pbruno entries->',entries
327 nbEntries = len( entries )
329 print 'CS_pbruno len( entries ) >= 1:'
330 jdcID = self.bureau.nb.getcurselection()
331 for entry in entries:
332 if studyManager.palStudy.isMeshGroup( entry ): #sélection d'un groupe de maille
333 name, msg = self.__selectMeshGroup( jdcID, entry )
334 elif studyManager.palStudy.isShape( entry ): #sélection d'une sous-géométrie
335 name, msg = self.__selectShape( jdcID, entry )
337 name, msg = '', msgUnAuthorizedSelecion
341 if names and len( names ) < nbEntries:
342 msg = msgIncompleteSelection
346 print 'CS_pbruno selectGroupFromSalome names = ',names
350 def addJdcInSalome( self, jdcPath ):
352 Ajoute le Jeu De Commande ASTER ou HOMARD dans l'arbre d'étude Salome dans la rubrique EFICAS
354 ok, msgError = False, ''
356 atLeastOneStudy = self.__studySync()
357 if not atLeastOneStudy:
359 if self.bureau.code == 'ASTER':
360 ok = studyManager.palStudy.addEficasItem( jdcPath, studyManager.FICHIER_EFICAS_ASTER )
361 elif self.bureau.code == 'HOMARD':
362 ok = studyManager.palStudy.addEficasItem( jdcPath, studyManager.FICHIER_EFICAS_HOMARD )
363 #ok = studyManager.palStudy.addEficasItem( jdcPath, studyManager.FICHIER_EFICAS_HOMARD_CONF ) CS_pbruno ?????
365 msgError = msgErrorAddJdcInSalome
371 def createOrUpdateMesh( self ):
373 Ouverture d'une boite de dialogue : Creation de groupes de mailles dans un maillage existant ou un nouveau maillage.
374 Note: Appelé par EFICAS à la sauvegarde du JDC.
377 atLeastOneStudy = self.__studySync()
378 if not atLeastOneStudy:
381 jdcID = self.bureau.nb.getcurselection()
383 groupeMaNames = self.__getAllGroupeMa( self.bureau.JDCDisplay_courant.tree.item )
384 groupeNoNames = self.__getAllGroupeNo( self.bureau.JDCDisplay_courant.tree.item )
386 print 'CS_pbruno createOrUpdateMesh groupeMaNames', groupeMaNames
387 print 'CS_pbruno createOrUpdateMesh groupeNoNames', groupeNoNames
389 # mise à jours de la liste des sous-géométrie ( self.subShapes )
390 self.__updateSubShapes( jdcID, groupeMaNames )
391 self.__updateSubShapes( jdcID, groupeNoNames )
394 # recupération des identifiants( entries ) associés aux noms des groupes
398 for entry, name in self.subShapes.items():
399 if name in groupeMaNames:
400 groupeMaEntries.append( entry )
401 if name in groupeNoNames:
402 groupeNoEntries.append( entry )
404 print 'CS_pbruno groupeMaEntries ->',groupeMaEntries
405 print 'CS_pbruno groupeNoEntries ->',groupeNoEntries
406 if groupeMaEntries or groupeNoEntries:
407 print 'if groupeMaEntries or groupeNoEntries:'
408 diag = meshGui.MeshUpdateDialogImpl( self.mainShapeEntries[jdcID], groupeMaEntries, groupeNoEntries, studyManager.palStudy,
415 def displayShape( self, shapeName ):
417 visualisation géométrie de nom shapeName dans salome
419 ok, msgError = False, ''
421 atLeastOneStudy = self.__studySync()
422 if not atLeastOneStudy:
426 #salome.sg.EraseAll()
427 print 'displayShapestrGeomShape shapeName -> ', shapeName
428 current_color = COLORS[ self.icolor % LEN_COLORS ]
429 ok = studyManager.palStudy.displayShapeByName( shapeName, current_color )
430 self.icolor = self.icolor + 1
433 msgError = msgErrorDisplayShape
439 def creeConfigTxt(self,fichier,dico):
441 sauvegarde = asksaveasfilename(title="fichier config.txt",
442 defaultextension='.txt',
443 initialdir = fichier)
444 f=open(sauvegarde,'w+')
445 for unite in dico.keys():
449 ligne="fort."+str(unite)+" "+type+" "+fic
452 self.rangeInStudy(sauvegarde)
453 print "==============================="
454 print "fin crreConfigTxt"
456 pass #CS_pbruno à implémenter
463 #-------------------------------------------------------------------------------------------------------
464 # Point d'entré lancement EFICAS
466 def runEficas( code="ASTER", fichier=None ):
468 if not appli: #une seul instance possible!
469 appli = MyEficas( SalomePyQt.SalomePyQt().getDesktop(), code = code, fichier = fichier )
474 def runHomard( code="HOMARD", fichier=None ):
476 if not appli: #une seul instance possible!
477 appli = MyEficas( SalomePyQt.SalomePyQt().getDesktop(), code = code, fichier = fichier )
483 def runAster(parent = SalomePyQt.SalomePyQt().getDesktop(), palStudyManager = studyManager.palStudy, code="ASTER", fichier=None ) :
485 if not appli: #une seul instance possible!
486 appli = MyEficas( parent, palStudyManager, code = code, fichier = fichier )
491 # Init globale du module
500 logger=ExtLogger( "eficasSalome.py" )
506 #embedded.showMaximized()
507 #embedded.embed( appli.winfo_id() )
509 embedded.setWFlags( qt.Qt.WStyle_Customize | qt.Qt.WStyle_StaysOnTop )
512 if embedded.hasFocus () :
518 if embedded.isFocusEnabled():
519 print 'isFocusEnabled()'
521 print 'not isFocusEnabled()'
523 focusP = embedded.focusPolicy()
525 if focusP == qt.QWidget.TabFocus:
526 print 'qt.QWidgetTabFocus'
527 elif focusP == qt.QWidget.ClickFocus:
528 print 'qt.ClickFocus'
529 elif focusP == qt.QWidget.StrongFocus:
530 print 'qt.StrongFocus'
531 elif focusP == qt.QWidget.WheelFocus:
532 print 'qt.WheelFocus'
533 elif focusP == qt.QWidget.NoFocus:
538 embedded.grabKeyboard()