1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2017 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 from __future__ import absolute_import
21 from __future__ import print_function
23 from builtins import str
24 from builtins import range
27 import types,sys,os, re
32 from monCodeMeteoAppelRun import Profil_Neutre
35 from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog, QApplication, QSplitter, QLabel
36 from PyQt5.QtGui import QPalette
37 from PyQt5.QtCore import QProcess, QFileInfo, QTimer, Qt, QDir, QSize
42 from Extensions.i18n import tr
44 from Editeur import session
45 from Editeur import comploader
46 from Editeur import Objecttreeitem
47 from InterfaceQT4 import browser
49 from desBaseWidget import Ui_baseWidget
50 from InterfaceQT4.monViewTexte import ViewText
51 from monWidgetCreeParam import MonWidgetCreeParam
53 DictExtensions= {"MAP" : ".map", "TELEMAC" : '.cas'}
57 from InterfaceQT4.editorSsIhm import JDCEditorSsIhm
60 class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
61 # ----------------------------------------- #
66 # ----------------------------------------
67 # Methodes faisant appel a ssIhm
68 # ----------------------------------------
70 def __init__ (self,appli,fichier = None, jdc=None, QWParent=None, units = None, include=0):
71 #------------------------------------------------------------------------------------------
74 QWidget.__init__(self,None)
78 self.widgetOptionnel=None
79 self.fenetreCentraleAffichee=None
80 self.dejaDansPlieTout=False
81 self.listeDesListesOuvertes=set()
82 self.afficheListesPliees=True
83 if appli!=None and hasattr(appli,"statusBar"): self.sb = appli.statusBar()
85 self.QWParent=QWParent
87 JDCEditorSsIhm. __init__ (self,appli,fichier, jdc,units,include)
89 # Particularites IHM : met la fenetre a jour
91 self.initSplitterSizes()
92 if self.code == "ASTER" or self.code == "monCode" : self.afficheListesPliees =True
93 if self.code == 'PSEN_N1' : self.afficheListesPliees = False
95 #self.affiche=self.appliEficas.maConfiguration.affiche
97 if self.code in ['MAP','CARMELCND','PSEN'] : self.maConfiguration.afficheCommandesPliees=False
98 if self.code in ['MAP',]: self.fermeArbre()
99 # self.widgetTree.close()
100 # self.widgetTree=None
102 if self.maConfiguration.closeArbre: self.fermeArbre()
103 if self.maConfiguration.boutonDsMenuBar : self.appliEficas.remplitIconesCommandes()
105 self.version_code = session.d_env.cata
107 self.format = self.appliEficas.format_fichier
109 self.node_selected = []
112 self.afficheApresInsert=False
113 if self.maConfiguration.closeArbre : self.afficheApresInsert=True
114 if self.code in ['Adao','ADAO','MAP'] : self.afficheApresInsert=True
115 if self.code in ['TELEMAC',] : self.enteteQTree='premier'
116 else : self.enteteQTree='complet'
117 if self.code in ['Adao','ADAO','TELEMAC'] : self.affichePlie=True
118 else : self.affichePlie=False
120 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
122 if self.appliEficas.readercata.demandeCatalogue==True :
123 nomFichierTranslation='translatorFichier'+'_'+str(self.appliEficas.readercata.versionCode)
124 if hasattr(self.appliEficas.maConfiguration,nomFichierTranslation) :
125 translatorFichier=getattr(self.appliEficas.maConfiguration,nomFichierTranslation)
126 from Extensions import localisation
127 localisation.localise(None,self.appliEficas.langue,translatorFichier=translatorFichier)
130 if self.jdc_item and self.appliEficas.ssIhm==False :
131 self.tree = browser.JDCTree( self.jdc_item, self )
132 self.appliEficas.construitMenu()
137 #-------------------------------#
138 def readFile(self, fn):
139 #--------------------------------#
141 Public slot to read the text from a file.
142 @param fn filename to read from (string or QString)
145 jdc=JDCEditorSsIhm.readFile(self, fn)
147 # Particularites IHM : met le titre de la fenetre a jour
148 # qApp.restoreOverrideCursor()
149 if self.fileInfo!= None : self.lastModified = self.fileInfo.lastModified()
150 nouveauTitre=self.titre+" "+os.path.basename(self.fichier)
151 self.appliEficas.setWindowTitle(nouveauTitre)
155 # ---------------------------------------------
156 # Methodes Inchangees
157 # ---------------------------------------------
160 # __generateTempFilename
177 # ---------------------------------------------
178 # Methodes Surchargees
179 # ---------------------------------------------
181 #-----------------------------------------------------------------------#
182 def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
183 #--------------------------------------------------------------------#
184 w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
187 #--------------------------------#
188 def informe(self,titre,txt,critique=True):
189 #--------------------------------#
191 self.afficheInfos(tr(txt),Qt.red)
192 QMessageBox.critical( self, tr(titre), tr(txt))
194 QMessageBox.warning( self, tr(titre),tr(txt))
196 #--------------------------------#
197 def ajoutCommentaire(self):
198 #--------------------------------#
199 if self.tree.selectedItems()==[] :
200 QMessageBox.warning( self, tr("Pas de noeud selectionne"),tr("Selectionnez un Noeud \nLe commentaire sera place apres le noeud selectionne"))
202 noeudAvantCommentaire=self.tree.selectedItems()[0]
203 if noeudAvantCommentaire ==self.tree.racine :
204 self.tree.racine.appendChild("COMMENTAIRE",pos=0)
206 noeudAvantCommentaire.addComment(True)
209 #----------------------------------------------#
210 def _viewTextExecute(self, txt, prefix, suffix):
211 #----------------------------------------------#
212 self.w = ViewText( self.QWParent )
213 self.w.setWindowTitle( "execution" )
214 self.monExe=QProcess(self.w)
215 pid=self.monExe.pid()
216 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
217 f=open(nomFichier,'w')
220 self.monExe.readyReadStandardOutput.connect( self.readFromStdOut)
221 self.monExe.readyReadStandardError.connect( self.readFromStdErr)
222 exe='sh ' + nomFichier
223 self.monExe.start(exe)
224 self.monExe.closeWriteChannel()
227 commande="rm "+ nomFichier
232 def readFromStdErr(self):
233 a=self.monExe.readAllStandardError()
234 self.w.view.append(str(a.data()))
236 def readFromStdOut(self) :
237 a=self.monExe.readAllStandardOutput()
238 self.w.view.append(str(a.data()))
241 #-----------------------#
242 def gestionParam(self):
243 #-----------------------#
244 w = MonWidgetCreeParam( self)
252 Public method called by the viewmanager to finally get rid of us.
254 if self.jdc: self.jdc.supprime()
257 #----------------------------------------------#
258 def afficheInfos(self,message,couleur=Qt.black):
259 #----------------------------------------------#
260 if couleur=='red' : couleur = Qt.red
262 mapalette=self.sb.palette()
263 mapalette.setColor( QPalette.WindowText, couleur )
264 self.sb.setPalette( mapalette );
265 self.sb.showMessage(message,4000)
268 #------------------------------#
269 def afficheAlerte(self,titre,message):
270 #------------------------------#
271 # appele par I_MACRO_ETAPE
272 QMessageBox.information( self, titre, message)
274 #-----------------------------------#
275 def afficheCommentaire(self,message):
276 #-----------------------------------#
277 self.labelCommentaire.setText(message)
278 QTimer.singleShot(6000, self.rendInvisible)
280 #----------------------#
281 def rendInvisible(self):
282 #----------------------#
283 self.labelCommentaire.setText("")
285 #---------------------------------------#
286 def chercheNoeudSelectionne(self,copie=1):
287 #---------------------------------------#
289 appele par Cut et Copy pour positionner self.node_selected
291 self.node_selected=[]
292 if len(self.tree.selectedItems()) == 0 : return
293 self.node_selected=self.tree.selectedItems()
296 #---------------------#
297 def handleSupprimer(self):
298 #---------------------#
299 self.chercheNoeudSelectionne()
300 if len(self.node_selected) == 0 : return
301 self.QWParent.noeud_a_editer = []
302 if self.node_selected[0]==self.tree.racine: return
303 if len(self.node_selected) == 1 : self.node_selected[0].delete()
304 else : self.node_selected[0].deleteMultiple(self.node_selected)
306 #---------------------#
307 def handleRechercher(self):
308 #---------------------#
309 from .monRecherche import DRecherche
310 monRechercheDialg=DRecherche(parent=self,fl=0)
311 monRechercheDialg.show()
314 #--------------------------------#
315 def handleRechercherDsCatalogue(self):
316 #-----------------------------#
317 from .monRechercheCatalogue import DRechercheCatalogue
318 monRechercheDialg=DRechercheCatalogue(self.QWParent,self)
319 monRechercheDialg.show()
321 #---------------------#
322 def handleDeplier(self):
323 #---------------------#
324 if self.tree == None : return
325 #self.tree.collapseAll()
328 self.tree.expandItem(self.tree.topLevelItem(0))
330 if self.fenetreCentraleAffichee != None :
331 if hasattr(self.fenetreCentraleAffichee.node,'plieToutEtReaffiche'):
332 self.fenetreCentraleAffichee.node.plieToutEtReaffiche()
335 self.tree.expandItem(self.tree.topLevelItem(0))
337 if self.fenetreCentraleAffichee != None :
338 if hasattr(self.fenetreCentraleAffichee.node,'deplieToutEtReaffiche'):
339 self.fenetreCentraleAffichee.node.deplieToutEtReaffiche()
341 #---------------------#
342 def handleEditCut(self):
343 #---------------------#
345 Stocke dans Eficas.noeud_a_editer le noeud a couper
347 #print "handleEditCut"
348 self.chercheNoeudSelectionne()
349 self.QWParent.edit="couper"
350 self.QWParent.noeud_a_editer = self.node_selected
352 #-----------------------#
353 def handleEditCopy(self):
354 #-----------------------#
356 Stocke dans Eficas.noeud_a_editer le noeud a copier
358 self.chercheNoeudSelectionne()
359 if len(self.node_selected) == 0 : return
360 if len(self.node_selected) == 1 : self.node_selected[0].updateNodeLabelInBlue()
361 else : self.node_selected[0].updatePlusieursNodeLabelInBlue(self.node_selected)
362 self.QWParent.edit="copier"
363 self.QWParent.noeud_a_editer = self.node_selected
365 #------------------------#
366 def handleEditPaste(self):
367 #------------------------#
369 Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
370 Ne permet que la copie d'objets de type Commande ou MCF
372 self.chercheNoeudSelectionne()
373 if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
374 QMessageBox.information( self,
375 tr("Copie impossible"),
376 tr("Veuillez selectionner un objet a copier"))
378 if len(self.node_selected) != 1 :
379 QMessageBox.information( self,
380 tr("Copie impossible"),
381 tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
383 noeudOuColler=self.node_selected[0]
385 if len(self.QWParent.noeud_a_editer)!=1:
386 #self.handleEditPasteMultiple()
387 QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
390 noeudACopier=self.QWParent.noeud_a_editer[0]
392 if (self.QWParent.edit != "couper"):
393 #print (noeudOuColler.item.parent.getChild(noeudOuColler.item.nom))
395 if noeudOuColler == self.tree.racine :
396 child=noeudOuColler.doPastePremier(noeudACopier)
398 child=noeudACopier.doPaste(noeudOuColler,'after')
400 if child==None or child==0:
401 QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
403 self.afficheInfos("Copie refusee",Qt.red)
404 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
406 nom=noeudACopier.item.sd.nom
407 child.item.nommeSd(nom)
414 traceback.print_exc()
415 QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
417 self.afficheInfos("Copie refusee",Qt.red)
420 # il faut declarer le JDCDisplay_courant modifie
421 # suppression eventuelle du noeud selectionne
422 # si possible on renomme l objet comme le noeud couper
424 if (self.QWParent.edit == "couper"):
426 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
427 QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
431 # indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
432 indexNoeudACopier=self.getTreeIndex(noeudACopier)
433 noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
434 noeudACopier.treeParent.buildChildren()
439 self.QWParent.noeud_a_editer=[]
441 # on rend la copie a nouveau possible en liberant le flag edit
442 self.QWParent.edit="copier"
443 noeudACopier.select()
445 #----------------------------------#
446 def handleDeplaceMultiple(self):
447 #----------------------------------#
450 #----------------------------------#
451 def handleEditPasteMultiple(self):
452 #----------------------------------#
454 # On ne garde que les niveaux "Etape"
455 # On insere dans l'ordre du JDC
456 listeNoeudsACouper=[]
460 from InterfaceQT4 import compojdc
461 noeudOuColler=self.node_selected[0]
462 if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
463 QMessageBox.information( self,
464 tr("Copie impossible a cet endroit",),
465 tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
467 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
469 for noeud in self.QWParent.noeud_a_editer :
470 if not (isinstance(noeud.treeParent, compojdc.Node)): continue
471 indexInTree=noeud.treeParent.children.index(noeud)
473 for index in listeIndex:
474 if index < indexInTree : indice = indice +1
475 listeIndex.insert(indice, indexInTree)
476 listeNoeudsACouper.insert(indice, noeud)
478 noeudJdc=noeudOuColler.treeParent
480 # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
482 for index in listeIndex:
484 if indexNoeudOuColler < index:
485 indexTravail=indexTravail+dejaCrees
486 noeudOuColler=noeudJdc.children[indexNoeudOuColler]
487 noeud=noeudJdc.children[indexTravail]
488 child=noeud.doPaste(noeudOuColler)
489 listeChild.append(child)
490 dejaCrees=dejaCrees+1
492 self.QWParent.noeud_a_editer = []
493 for i in range(len(listeIndex)):
494 noeud=noeudJdc.children[indexNoeudOuColler+1+i]
495 self.QWParent.noeud_a_editer.append(noeud)
498 if self.QWParent.edit !="couper" : return
500 for index in listeIndex:
502 if indexNoeudOuColler < index:
503 indexTravail=indexTravail+(len(listeIndex))
504 noeud=noeudJdc.children[indexTravail]
506 listeItem.append(noeud.item)
507 listeASupprimer.append(noeud)
509 for i in range(len(listeChild)):
510 self.tree.item.suppItem(listeItem[i])
511 listeChild[i].item.update(listeItem[i])
513 self.QWParent.noeud_a_editer = []
515 #----------------------------------#
516 def handleAjoutEtape(self,nomEtape):
517 #----------------------------------#
518 self.chercheNoeudSelectionne()
519 if len(self.node_selected) == 0 or self.node_selected[0] == self.tree.racine :
520 nodeOuAjouter=self.tree.racine
521 nouveau=nodeOuAjouter.appendChild(nomEtape,pos='first')
523 nodeOuAjouter=self.node_selected[0]
524 if nodeOuAjouter != self.tree.racine :
525 while nodeOuAjouter.treeParent != self.tree.racine:
526 print (nodeOuAjouter)
527 nodeOuAjouter=nodeOuAjouter.treeParent
528 print (nodeOuAjouter.parent == self.tree.racine)
529 nouveau=nodeOuAjouter.appendBrother(nomEtape)
531 self.node_selected[0].setSelected(False)
533 nouveau.setSelected(True)
534 nouveau.affichePanneau()
537 #---------------------------#
538 def getFileVariable(self) :
539 #---------------------------#
540 titre = tr("Choix d'un fichier XML")
541 texte = tr("Le fichier contient une commande MODEL\n")
542 texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
543 QMessageBox.information( self, titre,tr(texte))
545 fichier = QFileDialog.getOpenFileName(self.appliEficas,
546 tr('Ouvrir Fichier'),
547 self.appliEficas.maConfiguration.savedir,
548 tr('Wrapper Files (*.xml);;''All Files (*)'))
554 fonction="run"+self.code
556 if fonction in JDCEditor.__dict__: JDCEditor.__dict__[fonction](self,)
561 fonction="saveRun"+self.code
562 if fonction in JDCEditor.__dict__: JDCEditor.__dict__[fonction](self,)
565 # ---------------------------------------------
566 # Methodes Non Crees dans ssIHM
567 # ---------------------------------------------
573 if not(self.jdc.isValid()):
574 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
576 if len(self.jdc.etapes) != 1 :
577 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
579 if self.modified or self.fichier==None :
580 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
581 texte=self.getTextJDC("MAP")
582 self.writeFile( self.fichierMapInput, txt = texte)
584 self.fichierMapInput=self.fichier
585 composant=self.jdc.etapes[0].nom.lower()[0:-5]
588 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
589 # then instantiate corresponding class and call getUseSalome() method
591 from mapengine.spec import factory
592 mapComponent = factory.new(composant)[0]
595 if mapComponent.getUseSalome():
596 command += " -r sappli"
597 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
600 self._viewTextExecute( textePython,"map_run",".sh")
602 # commande="rm "+self.fichierMapInput
603 # os.system(commande)
606 except Exception as e:
607 print((traceback.print_exc()))
609 #-------------------#
610 def runZCRACKS(self):
611 #-------------------#
612 if not(self.jdc.isValid()):
613 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
615 if self.modified or self.fichier==None :
617 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
618 texte=self.getTextJDC("ZCRACKS",pourRun=1)
619 self.writeFile( self.fichierZcracksInput, txt = texte)
621 self.fichierZcracksInput=self.fichier
623 #commande ="Zrun -zp "
625 textePython=(commande + self.fichierZcracksInput)
626 self._viewTextExecute( textePython,"run_zcracks",".sh")
627 except Exception as e:
628 print((traceback.print_exc()))
630 #-------------------#
631 def runCARMELCND(self):
632 #-------------------#
633 #if not(self.jdc.isValid()):
634 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
636 if self.modified or self.fichier==None :
637 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
639 if not hasattr(self,'generator'): texte=self.getTextJDC(self.format)
640 from PrepareRunCarmel import prepareRunCarmel
641 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
642 repMed=os.path.dirname(self.fichier)
643 repExeCarmel=self.generator.get_repExeCarmel()
644 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
645 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
646 f=open(nomFichier,'w')
649 commande="xterm -e sh "+nomFichier +"\n"
652 #-------------------#
653 def runCarmelCS(self):
654 #-------------------#
656 commande="runSession pilotyacsCS.py"
658 except Exception as e:
659 print((traceback.print_exc()))
661 #-----------------------------------------------------#
662 def determineNomFichier(self,path,extension):
663 #-----------------------------------------------------#
664 if self.appli.code in DictExtensions:
665 chaine1=DictExtensions[self.appli.code]+" (*."+DictExtensions[self.appli.code]+");;"
666 extensions= tr(chaine1+ "All Files (*)")
668 extensions= tr("JDC (*.comm);;" "All Files (*)")
670 if self.appli.code == "MAP" :
671 extensions = extensions + ";; Run (*.input);;"
673 fn = QFileDialog.getSaveFileName( self,
674 tr("sauvegarde"), path,
676 QFileDialog.DontConfirmOverwrite)
677 if fn == None : return (0, None)
679 if fn=='': return (0, None)
681 ext = QFileInfo(fn).suffix()
682 if ext == '': fn+=extension
684 if QFileInfo(fn).exists():
685 msgBox = QMessageBox(self)
686 msgBox.setWindowTitle(tr("Sauvegarde du Fichier"))
687 msgBox.setText(tr("Le fichier <b>%s</b> existe deja.", six.text_type(fn)))
688 msgBox.addButton(tr("&Ecraser"),0)
689 msgBox.addButton(tr("&Abandonner"),1)
691 if abort == 1 : return (0, "")
695 def saveRunMAP(self):
698 if not(self.jdc.isValid()):
699 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
700 tr("Un JdC valide est necessaire pour creer un .input")
704 composant=self.jdc.etapes[0].nom.lower()[0:-5]
706 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
707 tr("Choix du composant obligatoire")
710 if hasattr(self.maConfiguration, "savedir"): path=self.maConfiguration.savedir
714 if self.fichier is not None and self.fichier != "" :
715 maBase=str(QFileInfo(self.fichier).baseName())+".input"
716 monPath=str(QFileInfo(self.fichier).absolutePath())
717 monNomFichier=os.path.join(monPath,maBase)
718 elif hasattr(self,'monNomFichierInput'):
719 monNomFichier=self.monNomFichierInput
722 monDialog=QFileDialog(self.appliEficas)
723 monDialog.setDirectory (path)
724 monDialog.setWindowTitle ("Save")
726 for c in monDialog.children():
727 if isinstance(c,QDialogButtonBox):
728 for b in c.children():
729 if isinstance(b,QPushButton):
731 if avant=="&Open": b.setText("Save")
732 mesFiltres= "input Map (*.input);;All Files (*)"
733 monDialog.setNameFilters(mesFiltres)
734 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
735 BOk=monDialog.exec_()
737 fn=str(monDialog.selectedFiles()[0])
738 if fn == "" or fn == None : return
739 if not fn.endswith(".input"):
741 self.monNomFichierInput=fn
743 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
744 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
745 texte=self.getTextJDC("MAP")
746 self.writeFile( self.fichierMapInput, txt = texte)
748 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
749 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
750 (output, err) = p.communicate()
754 def saveRunPSEN(self):
756 #print ("saveRunPSEN")
761 #-----------------------------------------#
762 def handleAjoutGroup(self,listeGroup):
763 #-----------------------------------------#
766 from ajoutGroupe import handleAjoutGroupFiltre
768 handleAjoutGroupFiltre(self,listeGroup)
769 #print "apres handleAjoutGroupFiltre"
775 #-----------------------------------------------------------------#
776 def saveCompleteFile(self, path = None, saveas= 0,formatLigne="beautifie"):
777 #-----------------------------------------------------------------#
779 fn = self.fichierComplet
780 #saveas=True # Pour forcer le nom
781 self.generator=self.maConfiguration.mesGenerators.plugins[self.format]()
782 if self.fichierComplet is None or saveas:
783 if path is None: path=self.maConfiguration.savedir
784 bOK, fn=self.determineNomFichier(path,extension)
785 if bOK == 0 : return (0, None)
786 if fn == None : return (0, None)
787 if fn== '' : return (0, None)
789 ulfile = os.path.abspath(six.text_type(fn))
790 self.appliEficas.maConfiguration.savedir=os.path.split(ulfile)[0]
791 fn = six.text_type(QDir.toNativeSeparators(fn))
793 self.fichierComplet = os.path.splitext(fn)[0]+extension
795 if hasattr(self.generator, "writeComplet"):
796 self.generator.writeComplet(self.fichierComplet,self.jdc,config=self.appliEficas.maConfiguration,appli=self.appliEficas)
798 if self.salome : self.appliEficas.addJdcInSalome( self.fichierComplet)
801 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichierComplet))
802 self.appliEficas.setWindowTitle(nouveauTitre)
803 return (1, self.fichierComplet)
805 #-----------------------------------------------------------------#
806 def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"):
807 #-----------------------------------------------------------------#
809 Public slot to save the text to a file.
811 @param path directory to save the file in (string or QString)
812 @return tuple of two values (boolean, string) giving a success indicator and
813 the name of the saved file
817 if not self.modified and not saveas:
818 return (0, None) # do nothing if text wasn't changed
820 if self.appli.code in DictExtensions :
821 extension=DictExtensions[self.appli.code]
827 if self.fichier is None or saveas:
828 if path is None: path=self.maConfiguration.savedir
829 bOK, fn=self.determineNomFichier(path,extension)
830 if bOK == 0 : return (0, None)
831 if fn == None : return (0, None)
832 if fn== '' : return (0, None)
834 ulfile = os.path.abspath(six.text_type(fn))
835 self.appliEficas.maConfiguration.savedir=os.path.split(ulfile)[0]
836 fn = six.text_type(QDir.toNativeSeparators(fn))
840 if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None)
842 self.modified = False
843 if self.fileInfo is None or saveas:
844 self.fileInfo = QFileInfo(self.fichier)
845 self.fileInfo.setCaching(0)
846 self.lastModified = self.fileInfo.lastModified()
847 if newName is not None:
848 self.appliEficas.addToRecentList(newName)
849 self.tree.racine.item.getObject().nom=os.path.basename(newName)
850 self.tree.racine.updateNodeLabel()
854 if self.jdc.isValid() != 0 and hasattr(self.generator, "writeDefault"):
855 #if hasattr(self.generator, "writeDefault"):
856 self.generator.writeDefault(fn)
857 elif self.code=="TELEMAC" and hasattr(self.generator, "writeDefault"):
858 msgBox = QMessageBox(None)
859 msgBox.setWindowTitle(tr("Fichier .cas invalide / incomplet"))
860 msgBox.setText(tr("Le fichier .cas est invalide / incomplet"))
861 msgBox.addButton(tr("&Sauvegarder"),1)
862 msgBox.addButton(tr("&Quitter sans sauvegarder"),0)
863 msgBox.addButton(tr("&Annuler"),2)
866 self.generator.writeDefault(fn)
867 return (1, self.fichier)
868 if res == 2 : return (0, None)
869 if self.appliEficas.salome : self.appliEficas.close()
873 self.appliEficas.addJdcInSalome( self.fichier)
875 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
876 self.appliEficas.setWindowTitle(nouveauTitre)
878 return (1, self.fichier)
881 #----------------------------------------------#
882 def sauveLigneFile(self):
883 #----------------------------------------------#
885 return self.saveFile(formatLigne="Ligne")
888 #----------------------------------------------#
889 def saveFileAs(self, path = None,fileName=None):
890 #----------------------------------------------#
892 Public slot to save a file with a new name.
894 @param path directory to save the file in (string or QString)
895 @return tuple of two values (boolean, string) giving a success indicator and
896 the name of the saved file
898 if fileName != None :
899 self.fichier = fileName
900 return self.saveFile()
901 return self.saveFile(path,1,"beautifie")
905 #---------------------------------------------#
906 def getFile(self,unite=None,fic_origine = ''):
907 #---------------------------------------------#
915 titre = tr("Choix unite %d ", unite)
916 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
917 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
918 labeltexte = tr('Fichier pour unite ') + repr( unite)
920 titre = tr("Choix d'un fichier de poursuite")
921 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
922 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
924 QMessageBox.information( self, titre,texte)
925 fn = QFileDialog.getOpenFileName(self.appliEficas,
927 self.appliEficas.maConfiguration.savedir)
929 # ce retour est impose par le getFile d'I_JDC
930 if fn== '' : return None," "
931 if not fn : return (0, " ")
934 ulfile = os.path.abspath(six.text_type(fn))
935 self.appliEficas.maConfiguration.savedir=os.path.split(ulfile)[0]
937 # On utilise le convertisseur defini par format_fichier
938 source=self.getSource(ulfile)
940 # On a reussia convertir le fichier self.ulfile
943 # Une erreur a ete rencontree
945 return ulfile, jdcText
947 #-----------------------------------#
948 def updateJdc(self, etape,texte):
949 #------------------------------------#
950 # ajoute une etape de JdC a partir d un texte
951 CONTEXT.setCurrentStep(etape)
952 etape.buildIncludeEtape(texte)
953 self.tree.racine.buildChildren()
955 #-----------------------------------#
956 def updateJdcEtape(self, itemApres,texte):
957 #------------------------------------#
958 # ajoute une etape de JdC a partir d un texte
960 etape=monItem.item.object
962 CONTEXT.setCurrentStep(etape)
964 ok=etape.buildIncludeEtape(texte)
968 QMessageBox.information( self,
970 tr("Impossible d importer le texte"))
971 self.tree.racine.buildChildren()
974 #-------------------------------------------#
975 def updateJdcAfterEtape(self, etape,texte):
976 #--------------------------------------------#
977 # ajoute une etape de JdC a partir d un texte
978 CONTEXT.setCurrentStep(etape)
980 ok=etape.buildIncludeEtape(texte,doitEtreValide=0)
984 QMessageBox.information( self,
986 tr("Impossible d importer le texte"))
987 self.tree.racine.buildChildren()
991 #-------------------------------------#
992 def deleteEtape(self,etape):
993 #-------------------------------------#
995 self.jdc.suppEntite(etape)
997 #-------------------------------------#
998 def deleteMC(self,etape,MCFils,listeAvant=()):
999 #-------------------------------------#
1002 for mot in listeAvant :
1003 ouChercher=ouChercher.getChild(mot,restreint="oui")
1004 monMC=ouChercher.getChild(MCFils,restreint="oui")
1005 if monMC != None : ouChercher.suppEntite(monMC)
1006 ouChercher.state='changed'
1007 ouChercher.isValid()
1009 #-------------------------------------#
1010 def ajoutMC(self,etape,MCFils,valeurs,listeAvant=()):
1011 #-------------------------------------#
1014 for mot in listeAvant :
1015 ouChercher=ouChercher.getChild(mot,restreint="oui")
1016 monMC=etape.getChild(ouChercher,restreint="oui")
1017 if monMC== None : monMC= ouChercher.addEntite(MCFils)
1018 monMC.valeur=valeurs
1020 monMC.state='changed'
1023 #----------------------------------------------#
1024 def ajoutMCFact(self,etape,MCFils,listeAvant=()):
1025 #----------------------------------------------#
1027 print ('ajoutMCFact')
1030 for mot in listeAvant :
1031 ouChercher=ouChercher.getChild(mot,restreint="oui")
1034 monMC=etape.getChild(ouChercher,restreint="oui")
1035 if monMC== None : monMC= ouChercher.addEntite(MCFils)
1039 #-----------------------------------------
1040 def initSplitterSizes(self, nbWidget=3):
1041 #-----------------------------------------
1042 #print ("je passe ds initSplitterSizes", nbWidget)
1044 if self.code in [ 'Adao', 'ADAO','MAP' ] : self.splitterSizes3=[1,1550,150]
1045 #elif self.code in [ 'MAP'] : self.splitterSizes3=[700,300]
1046 else : self.splitterSizes3=[150,1000,300]
1048 if self.code in [ 'Adao', 'ADAO','MAP' ] : self.splitterSizes2=[5,1500]
1049 else : self.splitterSizes2=[300,1000]
1052 #-----------------------------------------
1053 def restoreSplitterSizes(self,nbWidget=3):
1054 #----------------------------------------
1056 #traceback.print_stack()
1057 #print ("je passe ds restoreSplitterSizes")
1058 if not(hasattr(self,'splitter')) : return
1059 if nbWidget==2 : newSizes=self.splitterSizes2
1060 if nbWidget==3 : newSizes=self.splitterSizes3
1061 #self.inhibeSplitter = 1
1062 self.splitter.setSizes(newSizes)
1063 #self.inhibeSplitter = 0
1064 QApplication.processEvents()
1065 # seule la fentetre du milieu est necessaire
1066 self.splitter.widget(1).resizeEvent=self.saveSplitterSizes
1068 #-----------------------------------------
1069 def saveSplitterSizes(self,event):
1070 #-----------------------------------------
1071 #print ("je passe ds saveSplitterSizes")
1072 if self.inhibeSplitter : return
1073 if self.widgetOptionnel == None : self.splitterSizes2 = self.splitter.sizes()[0:2]
1074 else : self.splitterSizes3 = self.splitter.sizes()[0:3]
1076 #------------------------
1077 def fermeOptionnel(self):
1078 #------------------------
1079 if self.widgetOptionnel == None : return
1081 self.inhibeSplitter=1
1082 self.widgetOptionnel.setParent(None)
1083 self.widgetOptionnel.close()
1084 self.widgetOptionnel.deleteLater()
1085 self.widgetOptionnel=None
1086 self.inhibeSplitter=0
1087 self.restoreSplitterSizes(2)
1089 #------------------------
1090 def ajoutOptionnel(self):
1091 #------------------------
1092 #if len(self.splitterSizes) == 2 : self.splitterSizes.append(self.oldSizeWidgetOptionnel)
1093 #else : self.splitterSizes[2] = self.oldSizeWidgetOptionnel # ceinture pour les close bizarres
1094 #self.splitterSizes[1] = self.splitterSizes[1] - self.splitterSizes[2]
1096 self.restoreSplitterSizes(3)
1099 #------------------------
1100 def fermeArbre(self):
1101 #------------------------
1102 #print (self.widgetTree)
1103 self.oldWidgetTree=self.widgetTree
1104 self.widgetTree.hide()
1105 #self.widgetTree=None
1107 #------------------------
1108 def ouvreArbre(self):
1109 #------------------------
1110 #print ('je passe la')
1111 #print (self.widgetTree)
1112 #self.widgetTree=self.oldWidgetTree
1113 self.widgetTree.show()
1114 #self.restoreSplitterSizes(3)
1116 #-----------------------
1117 def getEtapeCourante(self) :
1118 #-----------------------
1119 print (self.tree.selectedItems())
1120 if len(self.tree.selectedItems()) != 1 : return None
1121 etape=self.tree.selectedItems()[0].item.object.getEtape()
1123 #-----------------------------
1124 def getTreeIndex(self,noeud):
1125 #----------------------------
1127 if noeud in noeud.treeParent.children :
1128 indexNoeud=noeud.treeParent.children.index(noeud)
1130 if hasattr(noeud,'vraiParent') :
1132 noeudVraiParent = noeud.vraiParent
1133 while noeudVraiParent != noeud.treeParent and hasattr(noeudVraiParent,'vraiParent') :
1134 noeudVrai = noeudVraiParent
1135 noeudVraiParent = noeudVraiParent.vraiParent
1137 if noeudVraiParent == noeud.treeParent :
1138 indexNoeud=noeud.treeParent.children.index(noeudVrai)
1144 #-------------------#
1146 #-------------------#
1148 if not(self.jdc.isValid()):
1149 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution Meteo"))
1151 strSource = str( self.getTextJDC(self.format) )
1152 code = compile(strSource, strSource, 'exec')
1153 exec(code, globals(), {})
1157 #-------------------# Pour execution avec output et error dans le bash
1159 #-------------------#
1161 #if self.modified or self.fichier==None : self.saveFile()
1164 #lancement avec le .bat
1165 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
1166 WrapperFilePath = os.path.join(path1, 'PSSEWrapper.py')
1168 p = subprocess.Popen(['python',WrapperFilePath])
1169 (out,err)=p.communicate()
1173 #-------------------# Pour execution avec output et error dans le bash
1174 def runPSEN_N1(self):
1175 #-------------------#
1179 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','ProcessOutputs_Eficas','TreatOutputs'))
1180 sys.path.append(path1)
1182 if not(self.jdc.isValid()):
1183 QMessageBox.information( self, tr( "Unvalid JDC"),tr("incorrect keywords will be ignored"))
1184 if 'dicoImbrique' in generator.plugins:
1185 self.generator=generator.plugins['dicoImbrique']()
1186 jdc_formate=self.generator.gener(self.jdc)
1187 dico=self.generator.Dico
1190 #fileDico = r'C:\Logiciels DER\PSEN_V16\Code\ProcessOutputs_Eficas\TreatOutputs\dicoN1.py'
1191 fileDico = os.path.join(path1, 'dicoN1.py') #r'C:\Logiciels DER\PSEN_V16\Code\ProcessOutputs_Eficas\TreatOutputs\dicoN1.py'
1192 f = open( str(fileDico), 'w')
1193 f.write("Dico =" + str(dico) )
1198 print ('in runPSEN_N1', dico)
1202 #res,txt_exception=run(dico)
1203 #if res : QMessageBox.information( self, tr("fin de script run"), txt_exception)
1204 #else : QMessageBox.critical( self, tr("Erreur fatale script run"), txt_exception)
1206 #-------------------# Pour execution avec output et error dans le bash
1207 def process_N1(self):
1208 #-------------------#
1210 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','ProcessOutputs_Eficas','TreatOutputs'))
1211 sys.path.append(path1)
1214 if 'dicoImbrique' in generator.plugins:
1215 self.generator=generator.plugins['dicoImbrique']()
1216 jdc_formate=self.generator.gener(self.jdc)
1217 dico=self.getDico() #generator.Dico
1220 for k in dico['CONTINGENCY_PROCESSING']:
1222 if k[0:19] == 'Component_List_For_' or k[0:21] =='Contingency_List_For_' :
1223 newK=k.replace('__',' ')
1225 dico['CONTINGENCY_PROCESSING'][l]=dico['CONTINGENCY_PROCESSING'][k]
1226 del dico['CONTINGENCY_PROCESSING'][k]
1229 fileDico = os.path.join(path1, 'dicoN1_process.py')
1230 f = open( str(fileDico), 'w')
1231 f.write("Dico =" + str(dico) )
1236 #return self.getDico()
1238 #-------------------# Pour execution avec output et error dans le bash
1239 def process_VP(self):
1240 #-------------------#
1241 if 'dicoImbrique' in generator.plugins:
1242 self.generator=generator.plugins['dicoImbrique']()
1243 jdc_formate=self.generator.gener(self.jdc)
1244 dico=self.getDico() #generator.Dico
1248 if __name__ == "__main__":