3 # -----------------------------------------------------------------------------
9 # Remplacement de la fonction exit standard par une fonction
10 # qui n'interrompt pas l'execution
15 print "appel de exit: ",ier
23 sys.path[:0]=[os.path.join( eficasConfig.eficasPath,'Aster'),
24 os.path.join( eficasConfig.eficasPath,'Homard'),
25 os.path.join( eficasConfig.eficasPath,'Editeur'),
26 eficasConfig.eficasPath,
33 # mode de lancement Eficas
39 from Editeur import eficas
40 from Editeur import splash
46 #from qxembed import QXEmbed
53 msgWarning = "Attention"
54 msgSubShapeBadMainShape = "La sélection géométrique SALOME ne correspond pas à une sous-géométrie de la géométrie principale : "
55 msgMeshGroupBadMainShape = "Le groupe de maillage sélectionné dans SALOME ne référence pas la bonne géométrie principale : "
56 msgIncompleteSelection = "Tous les éléments de la sélection SALOME n'ont pu étre ajoutée"
57 msgUnAuthorizedSelecion = "Sélection SALOME non authorisé. Autorisé : sous-géométrie, groupe de maille"
58 msgErrorAddJdcInSalome = "Erreur dans l'export du fichier de commande dans l'arbre d'étude Salome"
59 msgErrorDisplayShape = "Erreur dans l'affichage de la forme géométrique sélectionnée"
65 #class MyEficas( Tkinter.Toplevel, eficas.EFICAS, QXEmbed ):
66 class MyEficas( Tkinter.Toplevel, eficas.EFICAS ):
68 Classe de lancement du logiciel EFICAS dans SALOME.
69 Cette classe spécialise le logiciel Eficas par l'ajout de:
70 a)la création de groupes de mailles dans le composant SMESH de SALOME
71 b)la visualisation d'éléments géométrique dans le coposant GEOM de SALOME par sélection dans EFICAS
73 def __init__(self, parent, palStudyManager, code = None, fichier = None ):
78 @param parent: widget Qt parent
80 @type palStudyManager: studyManager.SalomeStudy
81 @param palStudyManager: gestionnaire d'étude SALOME
84 @param code: catalogue à lancer ( ASTER, HOMARD ). optionnel ( défaut = ASTER ).
87 @param fichier: chemin absolu du fichier eficas à ouvrir à dès le lancement. optionnel
89 #QXEmbed.__init__( self, parent, "", qt.Qt.WDestructiveClose | qt.Qt.WStyle_Customize | qt.Qt.WStyle_StaysOnTop )
90 Tkinter.Toplevel.__init__( self )
92 #---------------------------- initialisation EFICAS -----------------
93 splash.init_splash( self, code = code, titre = "Lancement d'EFICAS pour %s" %code )
94 splash._splash.configure( text="Chargement d'EFICAS en cours.\n Veuillez patienter ..." )
95 # différence eficas 1.7 et 1.8
96 if Editeur.__dict__.has_key( 'session' ):
97 print 'CS_pbruno has_key session'
98 from Editeur import session
101 eficasArg += [ fichier ]
102 session.parse( eficasArg )
104 eficas.EFICAS.__init__( self, self, code = code )
105 #----------------------------------------------------------------------
109 #------ embarcation dans une fenêtre qt pour mise au premier plan ---
110 #embedded = QXEmbed( parent, "", qt.Qt.WDestructiveClose | qt.Qt.WStyle_Customize | qt.Qt.WStyle_StaysOnTop )
111 embedded = QXEmbed( parent, "" )
112 embedded.initialize()
114 embedded.embedTk( self.winfo_id() )
115 size = embedded.sizeHint()
116 print 'CS_pbruno size (%s, %s )'%( size.width(), size.height () )
117 embedded.resize( size.width(), size.height () )
118 embedded.setWFlags( qt.Qt.WDestructiveClose | qt.Qt.WStyle_Customize | qt.Qt.WStyle_StaysOnTop )
119 #----------------------------------------------------------------------
122 #--------------- spécialisation EFICAS dans SALOME -------------------
124 self.salome = True #active les parties de code spécifique dans Salome
125 self.palStudyManager = palStudyManager # gestionnaire étude SALOME
127 # donnée pour la création de groupe de maille
128 self.mainShapeNames = {} #dictionnaire pour gérer les multiples fichiers possibles ouverts par
129 self.mainShapeEntries = {} #eficas ( clé = identifiant du JDC ), une mainshape par fichier ouvert.
130 self.subShapes = {} #dictionnaire des sous-géométrie de la géométrie principale ( clé = entry, valeur = name )
131 #----------------------------------------------------------------------
141 def __selectShape( self, jdcID, selectedEntry ):
143 sélection sous-géométrie dans Salome:
144 -test1) si c'est un élément géométrique.
145 -test2) si appartient à la géométrie principale.
147 met à jours la liste self.subShapes si test ok
149 print 'CS_pbruno __selectShape'
150 name, msgError = '',''
152 selectedMainShapeEntry = self.palStudyManager.getMainShapeEntry( selectedEntry )
154 if selectedMainShapeEntry: #ok test1)
155 if not self.mainShapeEntries.has_key( jdcID ):
156 self.mainShapeEntries[ jdcID ] = selectedMainShapeEntry
157 if selectedMainShapeEntry == self.mainShapeEntries[ jdcID ]:
158 name = self.palStudyManager.getNameAttribute( selectedEntry )
159 self.subShapes[ selectedEntry ] = name
161 print 'CS_pbruno pas la même mainshape selectedEntry->',selectedEntry
162 if not self.mainShapeNames.has_key( jdcID ):
163 self.mainShapeNames[ jdcID ] = self.palStudyManager.getNameAttribute( self.mainShapeEntries[ jdcID ] )
164 msgError = msgSubShapeBadMainShape + self.mainShapeNames[ jdcID ]
166 return name, msgError
170 def __selectMeshGroup( self, jdcID, selectedEntry ):
172 sélection groupe de maille dans Salome:
173 -test 1) si c'est un groupe de maille
174 -test 2) si le maillage fait référence à la géométrie principale
176 print 'CS_pbruno __selectMeshGroup'
177 name, msgError = '',''
179 selectedMeshEntry = self.palStudyManager.getMesh( selectedEntry )
181 if selectedMeshEntry: # ok test 1)
182 print 'CS_pbruno __selectMeshGroup selectedMeshEntry',selectedMeshEntry
183 selectedMainShapeEntry = self.palStudyManager.getShapeFromMesh( selectedMeshEntry )
185 if selectedMainShapeEntry: #test 2)
186 print 'CS_pbruno __selectMeshGroup selectedMainShapeEntry',selectedMainShapeEntry
187 if not self.mainShapeEntries.has_key( jdcID ):
188 self.mainShapeEntries[ jdcID ] = selectedMainShapeEntry
189 if selectedMainShapeEntry == self.mainShapeEntries[ jdcID ]:
190 name = self.palStudyManager.getNameAttribute( selectedEntry ) #ok test 2)
192 print 'CS_pbruno pas la même mainshape selectedEntry ->',selectedEntry
193 if not self.mainShapeNames.has_key( jdcID ):
194 self.mainShapeNames[ jdcID ] = self.palStudyManager.getNameAttribute( self.mainShapeEntries[ jdcID ] )
195 msgError = msgMeshGroupBadMainShape + self.mainShapeNames[ jdcID ]
197 return name, msgError
202 def __updateSubShapes( self, jdcID, groupeNames ):
204 mise à jours de la liste self.subShapes à partir de la liste des noms de groupe fourni en entré
206 for name in groupeNames:
207 entries = self.palStudyManager.getEntriesFromName( studyManager.SGeom, name )
208 for entry in entries:
209 ok, msgError = self.__selectShape( jdcID, entry ) # filtre
211 self.subShapes[ entry ] = name
214 def __getAllGroupeMa(self, item ):
216 Récupère tous les GROUPE_MA dans le JDC courant
220 itemName = item.get_nom()
221 #print 'CS_pbruno itemName',itemName
222 if itemName == 'GROUP_MA':
223 itemValue = item.get_valeur()
224 print 'CS_pbruno trouvé! GROUP_MA->', itemValue
225 if type( itemValue ) == str:
226 groupMa += ( itemValue , )
227 elif type( itemValue ) == tuple:
230 children = item.GetSubList()
231 for child in children:
232 groupMa += self.__getAllGroupeMa( child )
233 except: # à cause de GetSubList()...
235 print 'CS_pbruno groupMa',groupMa
239 def __getAllGroupeNo(self, item ):
241 Récupère tous les GROUPE_NO dans le JDC courant
245 itemName = item.get_nom()
246 print 'CS_pbruno itemName',itemName
247 if itemName == 'GROUP_NO':
248 itemValue = item.get_valeur()
249 print 'CS_pbruno trouvé! GROUP_NO->', itemValue
250 if type( itemValue ) == str:
251 groupNo += ( itemValue , )
252 elif type( itemValue ) == tuple:
255 children = item.GetSubList()
256 for child in children:
257 groupNo += self.__getAllGroupeNo( child )
258 except: # à cause de GetSubList()...
262 #----------------------- LISTE DES NOUVEAUX CAS D'UTILISATIONS -----------
263 def selectGroupFromSalome( self ):
265 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
266 retourne ( la liste des noms des groupes, message d'erreur )
268 Note: Appelé par EFICAS lorsqu'on clique sur le bouton ajouter à la liste du panel AFF_CHAR_MECA
270 print 'CS_pbruno selectGroupFromSalome'
273 # récupère toutes les sélections de l'utilsateur dans l'arbre Salome
274 entries = salome.sg.getAllSelected()
275 print 'CS_pbruno entries->',entries
276 nbEntries = len( entries )
278 print 'CS_pbruno len( entries ) >= 1:'
279 jdcID = self.bureau.nb.getcurselection()
280 for entry in entries:
281 if self.palStudyManager.isMeshGroup( entry ): #sélection d'un groupe de maille
282 name, msg = self.__selectMeshGroup( jdcID, entry )
283 elif self.palStudyManager.isShape( entry ): #sélection d'une sous-géométrie
284 name, msg = self.__selectShape( jdcID, entry )
286 name, msg = '', msgUnAuthorizedSelecion
290 if names and len( names ) < nbEntries:
291 msg = msgIncompleteSelection
295 print 'CS_pbruno selectGroupFromSalome names = ',names
299 def addJdcInSalome( self, jdcPath ):
301 Ajoute le Jeu De Commande ASTER ou HOMARD dans l'arbre d'étude Salome dans la rubrique EFICAS
303 ok, msgError = False, ''
305 if self.bureau.code == 'ASTER':
306 ok = self.palStudyManager.addEficasItem( jdcPath, studyManager.FICHIER_EFICAS_ASTER )
307 elif self.bureau.code == 'HOMARD':
308 ok = self.palStudyManager.addEficasItem( jdcPath, studyManager.FICHIER_EFICAS_HOMARD )
309 #ok = self.palStudyManager.addEficasItem( jdcPath, studyManager.FICHIER_EFICAS_HOMARD_CONF ) CS_pbruno ?????
311 msgError = msgErrorAddJdcInSalome
315 def createOrUpdateMesh( self ):
317 Ouverture d'une boite de dialogue : Creation de groupes de mailles dans un maillage existant ou un nouveau maillage.
318 Note: Appelé par EFICAS à la sauvegarde du JDC.
321 jdcID = self.bureau.nb.getcurselection()
323 groupeMaNames = self.__getAllGroupeMa( self.bureau.JDCDisplay_courant.tree.item )
324 groupeNoNames = self.__getAllGroupeNo( self.bureau.JDCDisplay_courant.tree.item )
326 print 'CS_pbruno createOrUpdateMesh groupeMaNames', groupeMaNames
327 print 'CS_pbruno createOrUpdateMesh groupeNoNames', groupeNoNames
329 # mise à jours de la liste des sous-géométrie ( self.subShapes )
330 self.__updateSubShapes( jdcID, groupeMaNames )
331 self.__updateSubShapes( jdcID, groupeNoNames )
334 # recupération des identifiants( entries ) associés aux noms des groupes
338 for entry, name in self.subShapes.items():
339 if name in groupeMaNames:
340 groupeMaEntries.append( entry )
341 if name in groupeNoNames:
342 groupeNoEntries.append( entry )
345 print 'CS_pbruno groupeMaEntries ->',groupeMaEntries
346 print 'CS_pbruno groupeNoEntries ->',groupeNoEntries
347 if groupeMaEntries or groupeNoEntries:
348 print 'if groupeMaEntries or groupeNoEntries:'
349 diag = meshGui.MeshUpdateDialogImpl( self.mainShapeEntries[jdcID], groupeMaEntries, groupeNoEntries, self.palStudyManager,
354 def displayShape( self, shapeName ):
356 visualisation géométrie de nom shapeName dans salome
358 ok, msgError = False, ''
360 print 'displayShapestrGeomShape shapeName -> ', shapeName
361 ok = self.palStudyManager.displayShapeByName( shapeName )
363 msgError = msgErrorDisplayShape
367 def creeConfigTxt(self,fichier,dico):
369 sauvegarde = asksaveasfilename(title="fichier config.txt",
370 defaultextension='.txt',
371 initialdir = fichier)
372 f=open(sauvegarde,'w+')
373 for unite in dico.keys():
377 ligne="fort."+str(unite)+" "+type+" "+fic
380 self.rangeInStudy(sauvegarde)
381 print "==============================="
382 print "fin crreConfigTxt"
384 pass #CS_pbruno à implémenter
393 #def runEficas( palStudyManager, code="ASTER", fichier=None, studyId=None):
394 def runEficas( parent = SalomePyQt.SalomePyQt().getDesktop(), palStudyManager = studyManager.study, code="ASTER", fichier=None ):
396 if not appli: #une seul instance possible!
397 appli = MyEficas( parent, palStudyManager, code = code, fichier = fichier )
400 def runHomard( parent = SalomePyQt.SalomePyQt().getDesktop(), palStudyManager = studyManager.study, code="HOMARD", fichier=None ):
402 if not appli: #une seul instance possible!
403 appli = MyEficas( parent, palStudyManager, code = code, fichier = fichier )
407 def runAster(parent = SalomePyQt.SalomePyQt().getDesktop(), palStudyManager = studyManager.study, code="ASTER", fichier=None ) :
409 if not appli: #une seul instance possible!
410 appli = MyEficas( parent, palStudyManager, code = code, fichier = fichier )
415 # Init globale du module
429 #embedded.showMaximized()
430 #embedded.embed( appli.winfo_id() )
432 embedded.setWFlags( qt.Qt.WStyle_Customize | qt.Qt.WStyle_StaysOnTop )
435 if embedded.hasFocus () :
441 if embedded.isFocusEnabled():
442 print 'isFocusEnabled()'
444 print 'not isFocusEnabled()'
446 focusP = embedded.focusPolicy()
448 if focusP == qt.QWidget.TabFocus:
449 print 'qt.QWidgetTabFocus'
450 elif focusP == qt.QWidget.ClickFocus:
451 print 'qt.ClickFocus'
452 elif focusP == qt.QWidget.StrongFocus:
453 print 'qt.StrongFocus'
454 elif focusP == qt.QWidget.WheelFocus:
455 print 'qt.WheelFocus'
456 elif focusP == qt.QWidget.NoFocus:
461 embedded.grabKeyboard()