1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013 EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 import types,sys,os, re
24 from PyQt4.QtGui import *
25 from PyQt4.QtCore import *
28 from datetime import date
29 from Extensions.i18n import tr
34 import convert, generator
35 from Editeur import session
36 from Editeur import comploader
37 from Editeur import Objecttreeitem
38 from desBaseWidget import Ui_baseWidget
39 from monViewTexte import ViewText
40 from monViewTexte import ViewText2
41 from monWidgetCreeParam import MonWidgetCreeParam
45 DictExtensions= {"MAP" : ".map"}
49 class JDCEditor(Ui_baseWidget,QtGui.QWidget):
50 # ----------------------------------------- #
55 def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None):
56 #----------------------------------------------------------------------------------------------------------#
58 QtGui.QWidget.__init__(self,None)
60 self.widgetOptionnel=None
61 self.fenetreCentraleAffichee=None
62 self.dejaDansPlieTout=False
63 self.afficheCommandesPliees = True
64 self.appliEficas = appli
65 self.appli = appli #---- attendu par IHM
67 self.fichier = fichier
70 self.QWParent = QWParent
73 self.salome = self.appliEficas.salome
76 print "dans JDC pas d appli ????????"
78 # ces attributs sont mis a jour par definitCode appelee par newEditor
79 self.code = self.appliEficas.CONFIGURATION.code
80 self.mode_nouv_commande=self.appliEficas.CONFIGURATION.mode_nouv_commande
81 self.affiche=self.appliEficas.CONFIGURATION.affiche
82 #if self.code in ['MAP','CARMELCND','PSEN'] : self.afficheCommandesPliees=False
83 if self.code in ['MAP','CARMELCND'] : self.afficheCommandesPliees=False
84 if self.code in ['MAP',] :
85 self.widgetTree.close()
87 self.appliEficas.resize(1440,self.appliEficas.height())
89 self.appliEficas.resize(2000,self.appliEficas.height())
91 self.version_code = session.d_env.cata
93 if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.multi==True:
94 self.readercata = readercata.READERCATA( self, self.appliEficas )
95 self.appliEficas.readercata=self.readercata
97 self.readercata=self.appliEficas.readercata
98 if self.readercata.fic_cata == None : return #Sortie Salome
99 self.titre=self.readercata.titre
100 self.Ordre_Des_Commandes=self.readercata.Ordre_Des_Commandes
101 self.Classement_Commandes_Ds_Arbre=self.readercata.Classement_Commandes_Ds_Arbre
103 self.format = self.appliEficas.format_fichier
106 self.liste_simp_reel=[]
109 nameConf='configuration_'+self.code
110 configuration=__import__(nameConf)
111 self.CONFIGURATION = self.appliEficas.CONFIGURATION
112 self.CONFIGStyle = self.appliEficas.CONFIGStyle
115 self.CONFIGURATION.generator_module
116 _module = __import__(self.CONFIGURATION.generator_module)
117 info = _module.entryPoint()
118 generator.plugins.addEntryPoint(info)
123 self.CONFIGURATION.convert_module
124 _module = __import__(self.CONFIGURATION.convert_module)
125 info = _module.entryPoint()
126 convert.plugins.addEntryPoint(info)
131 if hasattr(self.appliEficas,"statusBar"):
132 self.sb = self.appliEficas.statusBar()
135 self.lastModified = 0
137 self.modified = False
138 self.isReadOnly = False
139 self.node_selected = []
142 if self.code in ['Adao','MAP'] : self.afficheApresInsert=True
143 else : self.afficheApresInsert=False
144 if self.code in ['TELEMAC',] : self.enteteQTree='premier'
145 else : self.enteteQTree='complet'
146 if self.code in ['Adao','TELEMAC'] : self.affichePlie=True
147 else : self.affichePlie=False
149 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
151 #------- construction du jdc --------------
156 if self.fichier is not None: # fichier jdc fourni
157 self.fileInfo = QFileInfo(self.fichier)
158 self.fileInfo.setCaching(0)
162 self.jdc = self.readFile(self.fichier)
165 print "mauvaise lecture"
168 if self.jdc is not None and units is not None:
169 self.jdc.recorded_units=units
170 self.jdc.old_recorded_units=units
172 if not self.jdc: # nouveau jdc
174 self.jdc = self._newJDC(units=units)
176 self.jdc = self._newJDCInclude(units=units)
180 self.jdc.appli = self
181 self.jdc.lang = self.appli.langue
182 self.jdc.aReafficher=False
186 txt_exception = self.jdc.cr.get_mess_exception()
189 qApp.restoreOverrideCursor()
190 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
191 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
193 comploader.charger_composants("QT")
194 jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
195 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
196 self.viewJdcRapport()
201 self.tree = browser.JDCTree( jdc_item, self )
202 self.appliEficas.construitMenu()
204 #-------------------# Pour execution avec output sans une fenetre EFICAS. (erreurs encore dans la fenetre bash)
206 #-------------------#
207 if self.modified or self.fichier==None :
208 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
211 #monPython="/home/A96028/salome75/prerequisites/install/Python-273-tcl8513-tk8513/bin/python"
212 #monWrapper="/local00/home/A96028/GitEficasTravail/eficas/PSEN_Eficas/PSSEWrapper.py"
213 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
214 monWrapper = os.path.join(path1, 'PSSEWrapper.py')
215 cmd=['python',monWrapper]
217 w = ViewText2( self.QWParent, cmd )
218 w.setWindowTitle( "execution" )
222 #-------------------# Pour execution avec output et error dans le bash
224 #-------------------#
225 if self.modified or self.fichier==None :
226 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
229 #lancement avec le .bat
230 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
231 WrapperFilePath = os.path.join(path1, 'PSSEWrapper.py')
233 p = subprocess.Popen(['python',WrapperFilePath])
234 (out,err)=p.communicate()
238 #--------------------------------#
239 def _newJDC( self ,units = None):
240 #--------------------------------#
242 Initialise un nouveau JDC vierge
245 CONTEXT.unset_current_step()
248 if self.code == "CARMELCND" : texte=self._newJDCCND()
249 if self.code == "ZCRACKS" : texte=self._newZCRACKS()
250 if self.code == "TELEMAC" : texte=self._newTELEMAC()
251 if self.code == "PSEN" : texte = self._newPSEN()
252 # texte=self.newTexteCND
254 jdc=self.readercata.cata[0].JdC( procedure =texte,
256 cata=self.readercata.cata,
257 cata_ord_dico=self.readercata.cata_ordonne_dico,
258 rep_mat=self.CONFIGURATION.rep_mat
260 jdc.lang = self.appli.langue
261 if units is not None:
262 jdc.recorded_units=units
263 jdc.old_recorded_units=units
264 ## PNPN est ce que la ligne suivante est bien utile ?
265 if texte == "" :jdc.analyse()
268 #--------------------------------#
269 def _newJDCInclude( self ,units = None):
270 #--------------------------------#
272 Initialise un nouveau JDC vierge
274 import Extensions.jdc_include
275 JdC_aux=Extensions.jdc_include.JdC_include
276 CONTEXT.unset_current_step()
278 jaux=self.readercata.cata[0].JdC( procedure="",
280 cata=self.readercata.cata,
281 cata_ord_dico=self.readercata.cata_ordonne_dico,
282 rep_mat=self.CONFIGURATION.rep_mat,
286 J=JdC_aux( procedure="",
288 cata=self.readercata.cata,
289 cata_ord_dico=self.readercata.cata_ordonne_dico,
291 rep_mat=self.CONFIGURATION.rep_mat,
294 if units is not None:
295 J.recorded_units=units
296 J.old_recorded_units=units
300 #-------------------------------#
301 def readFile(self, fn):
302 #--------------------------------#
304 Public slot to read the text from a file.
305 @param fn filename to read from (string or QString)
309 # ------------------------------------------------------------------------------------
311 # ------------------------------------------------------------------------------------
313 jdcName=os.path.basename(fn)
314 # Il faut convertir le contenu du fichier en fonction du format
315 if convert.plugins.has_key( self.appliEficas.format_fichier_in ):
316 # Le convertisseur existe on l'utilise
318 p=convert.plugins[self.appliEficas.format_fichier_in]()
320 if p.text=="" : self.nouveau=1
321 pareil,texteNew=self.verifieCHECKSUM(p.text)
323 if pareil == False and (self.appliEficas.ssIhm == False) :
324 QMessageBox.warning( self, tr("fichier modifie"),tr("Attention! fichier change hors EFICAS"))
326 memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
327 if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
329 text=p.convert('exec',self.appliEficas)
330 if not p.cr.estvide():
331 self.affiche_infos("Erreur a la conversion",Qt.red)
333 self.affiche_infos("Type de fichier non reconnu",Qt.red)
334 if self.appliEficas.ssIhm == False:
335 QMessageBox.critical( self, tr("Type de fichier non reconnu"),
336 tr("EFICAS ne sait pas ouvrir le type de fichier %s" ,self.appliEficas.format_fichier_in))
339 CONTEXT.unset_current_step()
340 jdc=self.readercata.cata[0].JdC(procedure=text,
342 cata=self.readercata.cata,
343 cata_ord_dico=self.readercata.cata_ordonne_dico,
345 rep_mat=self.CONFIGURATION.rep_mat
347 # ----------------------------------------------------
349 # ----------------------------------------------------
350 self.modified = False
352 # qApp.restoreOverrideCursor()
353 if self.fileInfo!= None :
354 self.lastModified = self.fileInfo.lastModified()
356 self.lastModified = 1
357 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
358 self.appliEficas.setWindowTitle(nouveauTitre)
362 #-----------------------#
363 def get_source(self,file):
364 #-----------------------#
366 # Il faut convertir le contenu du fichier en fonction du format
367 if convert.plugins.has_key(self.format):
368 # Le convertisseur existe on l'utilise
369 p=convert.plugins[self.format]()
371 text=p.convert('execnoparseur')
372 if not p.cr.estvide():
373 self.affiche_infos("Erreur a la conversion",Qt.red)
376 # Il n'existe pas c'est une erreur
377 self.affiche_infos("Type de fichier non reconnu",Qt.red)
378 QMessageBox.critical( self, tr("Type de fichier non reconnu"),tr("EFICAS ne sait pas ouvrir ce type de fichier"))
381 #-----------------------------------------------------------------------#
382 def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
383 #--------------------------------------------------------------------#
384 w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
388 #----------------------------------------------#
389 def __generateTempFilename(self, prefix, suffix):
390 #----------------------------------------------#
392 (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
398 #----------------------------------------------#
399 def _viewTextExecute(self, txt, prefix, suffix):
400 #----------------------------------------------#
401 self.w = ViewText( self.QWParent )
402 self.w.setWindowTitle( "execution" )
403 self.monExe=QProcess(self.w)
404 pid=self.monExe.pid()
405 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
406 f=open(nomFichier,'w')
409 self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
410 self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
411 exe='sh ' + nomFichier
412 self.monExe.start(exe)
413 self.monExe.closeWriteChannel()
416 commande="rm "+ nomFichier
422 def readFromStdErr(self):
423 a=self.monExe.readAllStandardError()
424 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
426 def readFromStdOut(self) :
427 a=self.monExe.readAllStandardOutput()
428 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
432 #-----------------------#
433 def gestionParam(self):
434 #-----------------------#
435 w = MonWidgetCreeParam( self)
438 #-----------------------#
439 def viewJdcSource(self):
440 #-----------------------#
441 f=open(self.fichier,'r')
444 self._viewText(texteSource, "JDC_SOURCE")
446 #-----------------------#
448 #-----------------------#
449 strSource = str( self.get_text_JDC(self.format) )
450 self._viewText(strSource, "JDC_RESULTAT")
452 #-----------------------#
453 def viewJdcRapport(self):
454 #-----------------------#
455 strRapport = unicode( self.jdc.report() )
456 # on ajoute les regles
458 self._viewText(strRapport, "JDC_RAPPORT")
464 Public method called by the viewmanager to finally get rid of us.
470 #----------------------------------------------#
471 def affiche_infos(self,message,couleur=Qt.black):
472 #----------------------------------------------#
474 mapalette=self.sb.palette()
475 from PyQt4.QtGui import QPalette
476 mapalette.setColor( QPalette.WindowText, couleur )
477 self.sb.setPalette( mapalette );
478 self.sb.showMessage(QString.fromUtf8(message))#,2000)
480 #------------------------------#
481 def affiche_alerte(self,titre,message):
482 #------------------------------#
483 # appele par I_MACRO_ETAPE
484 QMessageBox.information( self, titre, message)
486 #-----------------------------------#
487 def affiche_commentaire(self,message):
488 #-----------------------------------#
489 self.labelCommentaire.setText(message)
491 #-------------------#
492 def init_modif(self):
493 #-------------------#
495 Met l'attribut modified a 'o' : utilise par Eficas pour savoir
496 si un JDC doit etre sauvegarde avant destruction ou non
500 #---------------------------------------#
501 def chercheNoeudSelectionne(self,copie=1):
502 #---------------------------------------#
504 appele par Cut et Copy pour positionner self.node_selected
506 self.node_selected=[]
507 if len(self.tree.selectedItems()) == 0 : return
508 self.node_selected=self.tree.selectedItems()
511 #---------------------#
512 def handleSupprimer(self):
513 #---------------------#
514 self.chercheNoeudSelectionne()
515 if len(self.node_selected) == 0 : return
516 self.QWParent.noeud_a_editer = []
517 if self.node_selected[0]==self.tree.racine: return
518 if len(self.node_selected) == 1 : self.node_selected[0].delete()
519 else : self.node_selected[0].deleteMultiple(self.node_selected)
521 #---------------------#
522 def handleRechercher(self):
523 #---------------------#
524 from monRecherche import DRecherche
525 monRechercheDialg=DRecherche(parent=self,fl=0)
526 monRechercheDialg.show()
528 #---------------------#
529 def handleDeplier(self):
530 #---------------------#
532 if self.tree == None : return
533 #self.tree.collapseAll()
536 self.tree.expandItem(self.tree.topLevelItem(0))
538 if self.fenetreCentraleAffichee != None :
539 if hasattr(self.fenetreCentraleAffichee.node,'plieToutEtReaffiche'):
540 self.fenetreCentraleAffichee.node.plieToutEtReaffiche()
543 self.tree.expandItem(self.tree.topLevelItem(0))
545 if self.fenetreCentraleAffichee != None :
546 if hasattr(self.fenetreCentraleAffichee.node,'deplieToutEtReaffiche'):
547 self.fenetreCentraleAffichee.node.deplieToutEtReaffiche()
549 #---------------------#
550 def handleEditCut(self):
551 #---------------------#
553 Stocke dans Eficas.noeud_a_editer le noeud a couper
555 #print "handleEditCut"
556 self.chercheNoeudSelectionne()
557 self.QWParent.edit="couper"
558 self.QWParent.noeud_a_editer = self.node_selected
560 #-----------------------#
561 def handleEditCopy(self):
562 #-----------------------#
564 Stocke dans Eficas.noeud_a_editer le noeud a copier
566 self.chercheNoeudSelectionne()
567 if len(self.node_selected) == 0 : return
568 if len(self.node_selected) == 1 : self.node_selected[0].update_node_label_in_blue()
569 else : self.node_selected[0].update_plusieurs_node_label_in_blue(self.node_selected)
570 self.QWParent.edit="copier"
571 self.QWParent.noeud_a_editer = self.node_selected
573 #------------------------#
574 def handleEditPaste(self):
575 #------------------------#
577 Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
578 Ne permet que la copie d'objets de type Commande ou MCF
580 self.chercheNoeudSelectionne()
581 if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
582 QMessageBox.information( self,
583 tr("Copie impossible"),
584 tr("Veuillez selectionner un objet a copier"))
586 if len(self.node_selected) != 1 :
587 QMessageBox.information( self,
588 tr("Copie impossible"),
589 tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
592 if len(self.QWParent.noeud_a_editer)!=1:
593 self.handleEditPasteMultiple()
596 noeudOuColler=self.node_selected[0]
598 if noeudOuColler == self.tree.racine:
602 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
605 noeudACopier=self.QWParent.noeud_a_editer[0]
606 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
608 QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
611 if (self.QWParent.edit != "couper"):
613 if noeudOuColler == self.tree.racine :
614 child=noeudOuColler.doPastePremier(noeudACopier)
616 child=noeudACopier.doPaste(noeudOuColler,pos)
617 if child==None or child==0:
618 QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
620 self.affiche_infos("Copie refusee",Qt.red)
621 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
623 nom=noeudACopier.item.sd.nom
624 child.item.nomme_sd(nom)
631 traceback.print_exc()
632 QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
634 self.affiche_infos("Copie refusee",Qt.red)
637 # il faut declarer le JDCDisplay_courant modifie
638 # suppression eventuelle du noeud selectionne
639 # si possible on renomme l objet comme le noeud couper
641 if (self.QWParent.edit == "couper"):
643 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
644 QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
648 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
649 noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
650 noeudACopier.treeParent.build_children()
655 self.QWParent.noeud_a_editer=[]
657 # on rend la copie a nouveau possible en liberant le flag edit
658 self.QWParent.edit="copier"
659 noeudACopier.select()
661 #----------------------------------#
662 def handleDeplaceMultiple(self):
663 #----------------------------------#
666 #----------------------------------#
667 def handleEditPasteMultiple(self):
668 #----------------------------------#
670 # On ne garde que les niveaux "Etape"
671 # On insere dans l'ordre du JDC
672 listeNoeudsACouper=[]
676 from InterfaceQT4 import compojdc
677 noeudOuColler=self.node_selected[0]
678 if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
679 QMessageBox.information( self,
680 tr("Copie impossible a cet endroit",),
681 tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
683 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
685 for noeud in self.QWParent.noeud_a_editer :
686 if not (isinstance(noeud.treeParent, compojdc.Node)): continue
687 indexInTree=noeud.treeParent.children.index(noeud)
689 for index in listeIndex:
690 if index < indexInTree : indice = indice +1
691 listeIndex.insert(indice, indexInTree)
692 listeNoeudsACouper.insert(indice, noeud)
694 noeudJdc=noeudOuColler.treeParent
696 # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
698 for index in listeIndex:
700 if indexNoeudOuColler < index:
701 indexTravail=indexTravail+dejaCrees
702 noeudOuColler=noeudJdc.children[indexNoeudOuColler]
703 noeud=noeudJdc.children[indexTravail]
704 child=noeud.doPaste(noeudOuColler)
705 listeChild.append(child)
706 dejaCrees=dejaCrees+1
708 self.QWParent.noeud_a_editer = []
709 for i in range(len(listeIndex)):
710 noeud=noeudJdc.children[indexNoeudOuColler+1+i]
711 self.QWParent.noeud_a_editer.append(noeud)
714 if self.QWParent.edit !="couper" : return
716 for index in listeIndex:
718 if indexNoeudOuColler < index:
719 indexTravail=indexTravail+(len(listeIndex))
720 noeud=noeudJdc.children[indexTravail]
722 listeItem.append(noeud.item)
723 listeASupprimer.append(noeud)
725 for i in range(len(listeChild)):
726 self.tree.item.suppitem(listeItem[i])
727 listeChild[i].item.update(listeItem[i])
729 self.QWParent.noeud_a_editer = []
732 #---------------------#
733 def getFileName(self):
734 #---------------------#
737 #---------------------------#
738 def get_file_variable(self) :
739 #---------------------------#
740 titre = tr("Choix d'un fichier XML")
741 texte = tr("Le fichier contient une commande MODEL\n")
742 texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
743 QMessageBox.information( self, titre,tr(texte))
745 fichier = QFileDialog.getOpenFileName(self.appliEficas,
746 tr('Ouvrir Fichier'),
747 self.appliEficas.CONFIGURATION.savedir,
748 self.appliEficas.trUtf8('Wrapper Files (*.xml);;''All Files (*)'))
751 #--------------------------------------------------#
752 def writeFile(self, fn, txt = None,formatLigne="beautifie"):
753 #--------------------------------------------------#
755 Public slot to write the text to a file.
757 @param fn filename to write to (string or QString)
758 @return flag indicating success
764 txt = self.get_text_JDC(self.format,formatLigne=formatLigne)
766 if len(txt) >= len(eol):
767 if txt[-len(eol):] != eol:
771 txt=self.ajoutVersionCataDsJDC(txt)
772 checksum=self.get_checksum(txt)
780 QMessageBox.critical(self, self.trUtf8('Save File'),
781 self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
782 .arg(unicode(fn)).arg(str(why)))
785 #-----------------------------------------------------------#
786 def get_text_JDC(self,format,pourRun=0,formatLigne="beautifie"):
787 #-----------------------------------------------------------#
788 if self.code == "MAP" and not(generator.plugins.has_key(format)): format = "MAP"
789 if generator.plugins.has_key(format):
791 # Le generateur existe on l'utilise
792 self.generator=generator.plugins[format]()
794 jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.CONFIGURATION)
795 if pourRun : jdc_formate=self.generator.textePourRun
797 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
798 if not self.generator.cr.estvide():
799 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
800 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
805 # Il n'existe pas c'est une erreur
806 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
807 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
813 fonction="run"+self.code
814 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
819 fonction="saveRun"+self.code
820 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
826 if not(self.jdc.isvalid()):
827 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
829 if len(self.jdc.etapes) != 1 :
830 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
832 if self.modified or self.fichier==None :
833 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
834 texte=self.get_text_JDC("MAP")
835 self.writeFile( self.fichierMapInput, txt = texte)
837 self.fichierMapInput=self.fichier
838 composant=self.jdc.etapes[0].nom.lower()[0:-5]
841 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
842 # then instantiate corresponding class and call getUseSalome() method
844 from mapengine.spec import factory
845 mapComponent = factory.new(composant)[0]
848 if mapComponent.getUseSalome():
849 command += " -r sappli"
850 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
853 self._viewTextExecute( textePython,"map_run",".sh")
855 # commande="rm "+self.fichierMapInput
856 # os.system(commande)
860 print traceback.print_exc()
862 #-------------------#
863 def runZCRACKS(self):
864 #-------------------#
865 if not(self.jdc.isvalid()):
866 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
868 if self.modified or self.fichier==None :
870 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
871 texte=self.get_text_JDC("ZCRACKS",pourRun=1)
872 self.writeFile( self.fichierZcracksInput, txt = texte)
874 self.fichierZcracksInput=self.fichier
876 #commande ="Zrun -zp "
878 textePython=(commande + self.fichierZcracksInput)
879 self._viewTextExecute( textePython,"run_zcracks",".sh")
881 print traceback.print_exc()
883 #-------------------#
884 def runCARMELCND(self):
885 #-------------------#
886 #if not(self.jdc.isvalid()):
887 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
889 if self.modified or self.fichier==None :
890 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
892 if not hasattr(self,'generator'): texte=self.get_text_JDC(self.format)
893 from PrepareRunCarmel import prepareRunCarmel
894 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
895 repMed=os.path.dirname(self.fichier)
896 repExeCarmel=self.generator.get_repExeCarmel()
897 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
898 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
899 f=open(nomFichier,'w')
902 commande="xterm -e sh "+nomFichier +"\n"
905 # self._viewTextExecute( textePython,"carmel_run",".sh")
906 #except Exception, e:
907 # print traceback.print_exc()
909 #-------------------#
910 def runCarmelCS(self):
911 #-------------------#
913 commande="runSession pilotyacsCS.py"
916 print traceback.print_exc()
918 #-----------------------------------------------------#
919 def determineNomFichier(self,path,extension):
920 #-----------------------------------------------------#
921 if DictExtensions.has_key(self.appli.code) :
922 chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
923 extensions= self.trUtf8(chaine1+ "All Files (*)")
925 extensions= self.trUtf8("JDC (*.comm);;" "All Files (*)")
927 if self.appli.code == "MAP" :
928 extensions = extensions + ";; Run (*.input);;"
930 fn = QFileDialog.getSaveFileName( self,
931 tr("sauvegarde"), path,
933 QFileDialog.DontConfirmOverwrite)
934 if fn.isNull(): return (0, None)
935 ext = QFileInfo(fn).suffix()
936 if ext.isEmpty(): fn.append(extension)
938 if QFileInfo(fn).exists():
939 abort = QMessageBox.warning(self,
940 tr("Sauvegarde du Fichier"),
941 tr("Le fichier <b>%s</b> existe deja.",str(fn)),
943 self.trUtf8("&Abandonner"))
944 if abort == 1 : return (0, "")
948 def saveRunMAP(self):
951 if not(self.jdc.isvalid()):
952 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
953 tr("Un JdC valide est necessaire pour creer un .input")
957 composant=self.jdc.etapes[0].nom.lower()[0:-5]
959 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
960 tr("Choix du composant obligatoire")
963 if hasattr(self.CONFIGURATION, "savedir"): path=self.CONFIGURATION.savedir
967 if self.fichier is not None and self.fichier != "" :
968 maBase=str(QFileInfo(self.fichier).baseName())+".input"
969 monPath=str(QFileInfo(self.fichier).absolutePath())
970 monNomFichier=os.path.join(monPath,maBase)
971 elif hasattr(self,'monNomFichierInput'):
972 monNomFichier=self.monNomFichierInput
975 monDialog=QFileDialog(self.appliEficas)
976 monDialog.setDirectory (path)
977 monDialog.setWindowTitle ("Save")
979 for c in monDialog.children():
980 if isinstance(c,QDialogButtonBox):
981 for b in c.children():
982 if isinstance(b,QPushButton):
984 if avant.toLatin1()=="&Open":
986 mesFiltres=QStringList()
987 mesFiltres << "input Map (*.input)" << "All Files (*)"
988 monDialog.setNameFilters(mesFiltres)
989 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
990 BOk=monDialog.exec_()
992 fn=str(monDialog.selectedFiles()[0].toLatin1())
993 if fn == "" or fn == None : return
994 if not fn.endswith(".input"):
996 self.monNomFichierInput=fn
998 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
999 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
1000 texte=self.get_text_JDC("MAP")
1001 self.writeFile( self.fichierMapInput, txt = texte)
1003 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
1004 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
1005 (output, err) = p.communicate()
1009 def saveRunPSEN(self):
1014 if not(self.jdc.isvalid()):
1015 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
1016 tr("Un JdC valide est necessaire pour creer un .input")
1020 print generator.plugins.has_key(self.format)
1021 if generator.plugins.has_key(self.format):
1022 # Le generateur existe on l'utilise
1023 self.generator=generator.plugins[self.format]()
1025 self.generator.gener(self.jdc)
1026 self.generator.writeDefault('')
1027 except ValueError,e:
1028 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
1029 if not self.generator.cr.estvide():
1030 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
1031 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
1034 # Il n'existe pas c'est une erreur
1035 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
1036 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
1043 #-----------------------------------------#
1044 def cherche_Groupes(self):
1045 #-----------------------------------------#
1046 listeMA,listeNO=self.get_text_JDC("GroupMA")
1047 return listeMA,listeNO
1049 #-----------------------------------------#
1050 def cherche_Dico(self):
1051 #-----------------------------------------#
1053 format = self.appliEficas.format_fichier
1054 if generator.plugins.has_key(format):
1055 # Le generateur existe on l'utilise
1056 self.generator=generator.plugins[format]()
1057 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
1058 dicoCourant=self.generator.dico
1063 #-----------------------------------------#
1064 def handleAjoutGroup(self,listeGroup):
1065 #-----------------------------------------#
1068 from ajoutGroupe import handleAjoutGroupFiltre
1070 handleAjoutGroupFiltre(self,listeGroup)
1071 #print "apres handleAjoutGroupFiltre"
1076 #-----------------------------------------------------------------#
1077 def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"):
1078 #-----------------------------------------------------------------#
1080 Public slot to save the text to a file.
1082 @param path directory to save the file in (string or QString)
1083 @return tuple of two values (boolean, string) giving a success indicator and
1084 the name of the saved file
1088 if not self.modified and not saveas:
1089 return (0, None) # do nothing if text wasn't changed
1092 if DictExtensions.has_key(self.appli.code) :
1093 extension=DictExtensions[self.appli.code]
1099 if self.fichier is None or saveas:
1101 path=self.CONFIGURATION.savedir
1102 bOK, fn=self.determineNomFichier(path,extension)
1103 if bOK == 0 : return (0, None)
1104 if fn == None : return (0, None)
1105 if fn.isNull(): return (0, None)
1107 ulfile = os.path.abspath(unicode(fn))
1108 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1109 fn = unicode(QDir.convertSeparators(fn))
1113 if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None)
1115 self.modified = False
1116 if self.fileInfo is None or saveas:
1117 self.fileInfo = QFileInfo(self.fichier)
1118 self.fileInfo.setCaching(0)
1119 self.lastModified = self.fileInfo.lastModified()
1120 if newName is not None:
1121 self.appliEficas.addToRecentList(newName)
1122 self.tree.racine.item.getObject().nom=os.path.basename(newName)
1123 self.tree.racine.update_node_label()
1125 if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
1126 self.generator.writeDefault(fn)
1129 self.appliEficas.addJdcInSalome( self.fichier)
1131 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1132 self.appliEficas.setWindowTitle(nouveauTitre)
1134 return (1, self.fichier)
1137 #----------------------------------------------#
1138 def sauveLigneFile(self):
1139 #----------------------------------------------#
1141 return self.saveFile(formatLigne="Ligne")
1144 #----------------------------------------------#
1145 def saveFileAs(self, path = None,fileName=None):
1146 #----------------------------------------------#
1148 Public slot to save a file with a new name.
1150 @param path directory to save the file in (string or QString)
1151 @return tuple of two values (boolean, string) giving a success indicator and
1152 the name of the saved file
1154 if fileName != None :
1155 self.fichier = fileName
1156 return self.saveFile()
1157 return self.saveFile(path,1,"beautifie")
1161 #---------------------------------------------#
1162 def get_file(self,unite=None,fic_origine = ''):
1163 #---------------------------------------------#
1171 titre = tr("Choix unite %d ", unite)
1172 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
1173 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
1174 labeltexte = tr('Fichier pour unite ') + repr( unite)
1176 titre = tr("Choix d'un fichier de poursuite")
1177 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
1178 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
1180 QMessageBox.information( self, titre,QString.fromUtf8(texte))
1181 fn = QFileDialog.getOpenFileName(self.appliEficas,
1183 self.appliEficas.CONFIGURATION.savedir)
1186 # ce retour est impose par le get_file d'I_JDC
1189 ulfile = os.path.abspath(unicode(fn))
1190 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1192 # On utilise le convertisseur defini par format_fichier
1193 source=self.get_source(ulfile)
1195 # On a reussia convertir le fichier self.ulfile
1198 # Une erreur a ete rencontree
1200 return ulfile, jdcText
1202 #-------------------------------#
1203 def updateJdc(self, itemApres,texte):
1204 #--------------------------------#
1206 etape=monItem.item.object
1208 CONTEXT.set_current_step(etape)
1209 etape.build_includeInclude(texte)
1210 self.tree.racine.build_children()
1215 #-------------------------------------#
1216 def ajoutVersionCataDsJDC(self,txt):
1217 #-------------------------------------#
1218 if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
1219 ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata[0].VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
1220 texte=txt+ligneVersion
1223 #-------------------------------------#
1224 def verifieVersionCataDuJDC(self,text):
1225 #-------------------------------------#
1227 indexDeb=text.find("#VERSION_CATALOGUE:")
1228 indexFin=text.find(":FIN VERSION_CATALOGUE")
1230 self.versionCataDuJDC="sans"
1233 self.versionCataDuJDC=text[indexDeb+19:indexFin]
1234 textJDC=text[0:indexDeb]+text[indexFin+23:-1]
1236 self.versionCata="sans"
1237 if hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata[0].VERSION_CATALOGUE
1239 if self.versionCata==self.versionCataDuJDC : memeVersion=True
1240 return memeVersion,textJDC
1242 #-------------------------------#
1243 def traduitCatalogue(self,texte):
1244 #-------------------------------#
1245 nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
1246 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
1248 traducteur=__import__(nomTraducteur)
1249 monTraducteur=traducteur.MonTraducteur(texte)
1250 nouveauTexte=monTraducteur.traduit()
1256 #------------------------------#
1257 def verifieCHECKSUM(self,text):
1258 #------------------------------#
1259 indexDeb=text.find("#CHECKSUM:")
1262 indexFin=text.find(":FIN CHECKSUM")
1263 checkAvant=text[indexDeb:indexFin+13]
1264 textJDC=text[0:indexDeb]+text[indexFin+13:-1]
1265 checksum=self.get_checksum(textJDC)
1266 pareil=(checkAvant==checksum)
1267 return pareil, textJDC
1269 #---------------------------#
1270 def get_checksum(self,texte):
1271 #---------------------------#
1272 newtexte=texte.replace('"','\\"')
1273 commande='echo "'+newtexte+'"|md5sum'
1274 a=os.popen(commande)
1277 ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
1281 #---------------------------#
1282 def _newTELEMAC(self):
1283 #---------------------------#
1284 texte="INITIALIZATION();BOUNDARY_CONDITIONS();GENERAL_PARAMETERS();PHYSICAL_PARAMETERS();NUMERICAL_PARAMETERS();"
1288 #---------------------------#
1290 #---------------------------#
1291 texte="DIRECTORY() ; PSSE_PARAMETERS() ; SIMULATION() ; sansnom=DISTRIBUTION() ; sansnom=DISTRIBUTION() ; CORRELATION() ;"
1295 #---------------------------#
1297 #---------------------------#
1298 def _newZCRACKS(self):
1299 #---------------------------#
1300 texte="MAILLAGES();REMESHING();"
1303 #---------------------------#
1304 def _newJDCCND(self):
1305 #---------------------------#
1306 extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
1308 #if self.salome == 0 :
1309 QMessageBox.information( self,
1311 tr("Veuillez selectionner un fichier Med"))
1312 QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
1313 caption='Fichier Med',
1315 self.fichierMED=str(QSfichier.toLatin1())
1316 from acquiertGroupes import getGroupes
1317 erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
1318 if erreur != "" : print "a traiter"
1319 texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
1325 for groupe in self.listeGroupes :
1326 if groupe[0:8]=='CURRENT_':
1327 texteSources +=groupe[8:]+"=SOURCE("
1328 texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
1329 if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n"
1330 if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n"
1331 if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n"
1332 if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n"
1333 texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
1334 self.newTexteCND=texte
1339 #---------------------------#
1340 def BoutonFileSelected(self):
1341 #---------------------------#
1343 QSfichier=self.openfile.selectedFiles()[0]
1344 self.fichierMED=str(QSfichier.toLatin1())
1345 from acquiertGroupes import getGroupes
1346 erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
1347 if erreur != "" : print "a traiter"
1349 #-----------------------------
1350 def BoutonSalomePressed(self):
1351 #----------------------------
1352 Msg,self.listeGroupes=self.appliEficas.ChercheGrpMailleInSalome()
1353 self.fichierMED="A_partir_de_SMESH"
1354 self.nomMaillage="A_partir_de_SMESH"
1355 self.openfile.close()
1358 if __name__ == "__main__":
1360 name='prefs_'+prefs.code
1361 prefsCode=__import__(name)
1364 if hasattr(prefsCode,'encoding'):
1365 # Hack pour changer le codage par defaut des strings
1368 sys.setdefaultencoding(prefs.encoding)
1369 del sys.setdefaultencoding
1374 app = QApplication(sys.argv)
1375 mw = JDCEditor(None,'azAster.comm')
1376 app.setMainWidget(mw)
1377 app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
1380 res = app.exec_loop()