1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2021 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
33 from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog, QApplication, QSplitter, QLabel
34 from PyQt5.QtGui import QPalette
35 from PyQt5.QtCore import QProcess, QFileInfo, QTimer, Qt, QDir, QSize
40 from Extensions.i18n import tr
42 from Editeur import session
43 from Editeur import comploader
44 from Editeur import Objecttreeitem
45 from InterfaceQT4 import browser
47 from desBaseWidget import Ui_baseWidget
48 from InterfaceQT4.monViewTexte import ViewText
49 from monWidgetCreeParam import MonWidgetCreeParam
51 DictExtensions= {"MAP" : ".map", "TELEMAC" : '.cas'}
55 from InterfaceQT4.editorSsIhm import JDCEditorSsIhm
58 class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
59 # ----------------------------------------- #
64 # ----------------------------------------
65 # Methodes faisant appel a ssIhm
66 # ----------------------------------------
68 def __init__ (self,appli,fichier = None, jdc=None, QWParent=None, units = None, include=0):
69 #------------------------------------------------------------------------------------------
72 QWidget.__init__(self,None)
76 self.widgetOptionnel=None
77 self.fenetreCentraleAffichee=None
78 self.dejaDansPlieTout=False
79 self.listeDesListesOuvertes=set()
80 self.afficheListesPliees=True
81 if appli!=None and hasattr(appli,"statusBar"): self.sb = appli.statusBar()
83 self.QWParent=QWParent
85 JDCEditorSsIhm. __init__ (self,appli,fichier, jdc,units,include)
87 # Particularites IHM : met la fenetre a jour
89 self.initSplitterSizes()
90 if self.code == "ASTER" or self.code == "monCode" : self.afficheListesPliees =True
91 if self.code == 'PSEN_N1' : self.afficheListesPliees = False
93 #self.affiche=self.appliEficas.maConfiguration.affiche
95 if self.code in ['MAP','CARMELCND','PSEN'] : self.maConfiguration.afficheCommandesPliees=False
96 if self.code in ['MAP',]: self.fermeArbre()
97 # self.widgetTree.close()
98 # self.widgetTree=None
100 if self.maConfiguration.closeArbre: self.fermeArbre()
101 if self.maConfiguration.boutonDsMenuBar : self.appliEficas.remplitIconesCommandes()
103 self.version_code = session.d_env.cata
105 self.format = self.appliEficas.format_fichier
107 self.node_selected = []
110 self.afficheApresInsert=False
111 if self.maConfiguration.closeArbre : self.afficheApresInsert=True
112 if self.code in ['Adao','ADAO','MAP'] : self.afficheApresInsert=True
113 if self.code in ['TELEMAC',] : self.enteteQTree='premier'
114 else : self.enteteQTree='complet'
115 if self.code in ['Adao','ADAO','TELEMAC','VP'] : self.affichePlie=True
116 else : self.affichePlie=False
118 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
120 if self.appliEficas.readercata.demandeCatalogue==True :
121 nomFichierTranslation='translatorFichier'+'_'+str(self.appliEficas.readercata.versionCode)
122 if hasattr(self.appliEficas.maConfiguration,nomFichierTranslation) :
123 translatorFichier=getattr(self.appliEficas.maConfiguration,nomFichierTranslation)
124 from Extensions import localisation
125 localisation.localise(None,self.appliEficas.langue,translatorFichier=translatorFichier)
128 if self.jdc_item and self.appliEficas.ssIhm==False :
129 self.tree = browser.JDCTree( self.jdc_item, self )
130 self.appliEficas.construitMenu()
135 #-------------------------------#
136 def readFile(self, fn):
137 #--------------------------------#
139 Public slot to read the text from a file.
140 @param fn filename to read from (string or QString)
143 jdc=JDCEditorSsIhm.readFile(self, fn)
145 # Particularites IHM : met le titre de la fenetre a jour
146 # qApp.restoreOverrideCursor()
147 if self.fileInfo!= None : self.lastModified = self.fileInfo.lastModified()
148 nouveauTitre=self.titre+" "+os.path.basename(self.fichier)
149 self.appliEficas.setWindowTitle(nouveauTitre)
153 # ---------------------------------------------
154 # Methodes Inchangees
155 # ---------------------------------------------
158 # __generateTempFilename
175 # ---------------------------------------------
176 # Methodes Surchargees
177 # ---------------------------------------------
179 #-----------------------------------------------------------------------#
180 def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
181 #--------------------------------------------------------------------#
182 w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
185 #--------------------------------#
186 def informe(self,titre,txt,critique=True):
187 #--------------------------------#
189 self.afficheInfos(tr(txt),Qt.red)
190 QMessageBox.critical( self, tr(titre), tr(txt))
192 QMessageBox.warning( self, tr(titre),tr(txt))
194 #--------------------------------#
195 def ajoutCommentaire(self):
196 #--------------------------------#
197 if self.tree.selectedItems()==[] :
198 QMessageBox.warning( self, tr("Pas de noeud selectionne"),tr("Selectionnez un Noeud \nLe commentaire sera place apres le noeud selectionne"))
200 noeudAvantCommentaire=self.tree.selectedItems()[0]
201 if noeudAvantCommentaire ==self.tree.racine :
202 self.tree.racine.appendChild("COMMENTAIRE",pos=0)
204 noeudAvantCommentaire.addComment(True)
207 #----------------------------------------------#
208 def _viewTextExecute(self, txt, prefix, suffix):
209 #----------------------------------------------#
210 self.w = ViewText( self.QWParent )
211 self.w.setWindowTitle( "execution" )
212 self.monExe=QProcess(self.w)
213 pid=self.monExe.pid()
214 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
215 f=open(nomFichier,'w')
218 self.monExe.readyReadStandardOutput.connect( self.readFromStdOut)
219 self.monExe.readyReadStandardError.connect( self.readFromStdErr)
220 exe='sh ' + nomFichier
221 self.monExe.start(exe)
222 self.monExe.closeWriteChannel()
225 commande="rm "+ nomFichier
230 def readFromStdErr(self):
231 a=self.monExe.readAllStandardError()
232 self.w.view.append(str(a.data()))
234 def readFromStdOut(self) :
235 a=self.monExe.readAllStandardOutput()
236 self.w.view.append(str(a.data()))
239 #-----------------------#
240 def gestionParam(self):
241 #-----------------------#
242 w = MonWidgetCreeParam( self)
250 Public method called by the viewmanager to finally get rid of us.
252 if self.jdc: self.jdc.supprime()
255 #----------------------------------------------#
256 def afficheInfos(self,message,couleur=Qt.black):
257 #----------------------------------------------#
258 if couleur=='red' : couleur = Qt.red
260 mapalette=self.sb.palette()
261 mapalette.setColor( QPalette.WindowText, couleur )
262 self.sb.setPalette( mapalette );
263 self.sb.showMessage(message,4000)
266 #------------------------------#
267 def afficheAlerte(self,titre,message):
268 #------------------------------#
269 # appele par I_MACRO_ETAPE
270 QMessageBox.information( self, titre, message)
272 #-----------------------------------#
273 def afficheCommentaire(self,message):
274 #-----------------------------------#
275 self.labelCommentaire.setText(message)
276 QTimer.singleShot(6000, self.rendInvisible)
278 #----------------------#
279 def rendInvisible(self):
280 #----------------------#
281 self.labelCommentaire.setText("")
283 #---------------------------------------#
284 def chercheNoeudSelectionne(self,copie=1):
285 #---------------------------------------#
287 appele par Cut et Copy pour positionner self.node_selected
289 self.node_selected=[]
290 if len(self.tree.selectedItems()) == 0 : return
291 self.node_selected=self.tree.selectedItems()
294 #---------------------#
295 def handleSupprimer(self):
296 #---------------------#
297 self.chercheNoeudSelectionne()
298 if len(self.node_selected) == 0 : return
299 self.QWParent.noeud_a_editer = []
300 if self.node_selected[0]==self.tree.racine: return
301 if len(self.node_selected) == 1 : self.node_selected[0].delete()
302 else : self.node_selected[0].deleteMultiple(self.node_selected)
304 #---------------------#
305 def handleRechercher(self):
306 #---------------------#
307 from .monRecherche import DRecherche
308 monRechercheDialg=DRecherche(parent=self,fl=0)
309 monRechercheDialg.show()
312 #--------------------------------#
313 def handleRechercherDsCatalogue(self):
314 #-----------------------------#
315 from .monRechercheCatalogue import DRechercheCatalogue
316 monRechercheDialg=DRechercheCatalogue(self.QWParent,self)
317 monRechercheDialg.show()
319 #---------------------#
320 def handleDeplier(self):
321 #---------------------#
322 if self.tree == None : return
323 #self.tree.collapseAll()
326 self.tree.expandItem(self.tree.topLevelItem(0))
328 if self.fenetreCentraleAffichee != None :
329 if hasattr(self.fenetreCentraleAffichee.node,'plieToutEtReaffiche'):
330 self.fenetreCentraleAffichee.node.plieToutEtReaffiche()
333 self.tree.expandItem(self.tree.topLevelItem(0))
335 if self.fenetreCentraleAffichee != None :
336 if hasattr(self.fenetreCentraleAffichee.node,'deplieToutEtReaffiche'):
337 self.fenetreCentraleAffichee.node.deplieToutEtReaffiche()
339 #---------------------#
340 def handleEditCut(self):
341 #---------------------#
343 Stocke dans Eficas.noeud_a_editer le noeud a couper
345 #print "handleEditCut"
346 self.chercheNoeudSelectionne()
347 self.QWParent.edit="couper"
348 self.QWParent.noeud_a_editer = self.node_selected
350 #-----------------------#
351 def handleEditCopy(self):
352 #-----------------------#
354 Stocke dans Eficas.noeud_a_editer le noeud a copier
356 self.chercheNoeudSelectionne()
357 if len(self.node_selected) == 0 : return
358 if len(self.node_selected) == 1 : self.node_selected[0].updateNodeLabelInBlue()
359 else : self.node_selected[0].updatePlusieursNodeLabelInBlue(self.node_selected)
360 self.QWParent.edit="copier"
361 self.QWParent.noeud_a_editer = self.node_selected
363 #------------------------#
364 def handleEditPaste(self):
365 #------------------------#
367 Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
368 Ne permet que la copie d'objets de type Commande ou MCF
370 self.chercheNoeudSelectionne()
371 if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
372 QMessageBox.information( self,
373 tr("Copie impossible"),
374 tr("Veuillez selectionner un objet a copier"))
376 if len(self.node_selected) != 1 :
377 QMessageBox.information( self,
378 tr("Copie impossible"),
379 tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
381 noeudOuColler=self.node_selected[0]
383 if len(self.QWParent.noeud_a_editer)!=1:
384 #self.handleEditPasteMultiple()
385 QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
388 noeudACopier=self.QWParent.noeud_a_editer[0]
390 if (self.QWParent.edit != "couper"):
391 #print (noeudOuColler.item.parent.getChild(noeudOuColler.item.nom))
393 if noeudOuColler == self.tree.racine :
394 child=noeudOuColler.doPastePremier(noeudACopier)
396 child=noeudACopier.doPaste(noeudOuColler,'after')
398 if child==None or child==0:
399 QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
401 self.afficheInfos("Copie refusee",Qt.red)
402 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
404 nom=noeudACopier.item.sd.nom
405 child.item.nommeSd(nom)
412 traceback.print_exc()
413 QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
415 self.afficheInfos("Copie refusee",Qt.red)
418 # il faut declarer le JDCDisplay_courant modifie
419 # suppression eventuelle du noeud selectionne
420 # si possible on renomme l objet comme le noeud couper
422 if (self.QWParent.edit == "couper"):
423 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
424 QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
428 # indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
429 indexNoeudACopier=self.getTreeIndex(noeudACopier)
430 noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
431 noeudACopier.treeParent.buildChildren()
436 self.QWParent.noeud_a_editer=[]
438 # on rend la copie a nouveau possible en liberant le flag edit
439 self.QWParent.edit="copier"
440 noeudACopier.select()
442 #----------------------------------#
443 def handleDeplaceMultiple(self):
444 #----------------------------------#
447 #----------------------------------#
448 def handleEditPasteMultiple(self):
449 #----------------------------------#
451 # On ne garde que les niveaux "Etape"
452 # On insere dans l'ordre du JDC
453 listeNoeudsACouper=[]
457 from InterfaceQT4 import compojdc
458 noeudOuColler=self.node_selected[0]
459 if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
460 QMessageBox.information( self,
461 tr("Copie impossible a cet endroit",),
462 tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
464 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
466 for noeud in self.QWParent.noeud_a_editer :
467 if not (isinstance(noeud.treeParent, compojdc.Node)): continue
468 indexInTree=noeud.treeParent.children.index(noeud)
470 for index in listeIndex:
471 if index < indexInTree : indice = indice +1
472 listeIndex.insert(indice, indexInTree)
473 listeNoeudsACouper.insert(indice, noeud)
475 noeudJdc=noeudOuColler.treeParent
477 # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
479 for index in listeIndex:
481 if indexNoeudOuColler < index:
482 indexTravail=indexTravail+dejaCrees
483 noeudOuColler=noeudJdc.children[indexNoeudOuColler]
484 noeud=noeudJdc.children[indexTravail]
485 child=noeud.doPaste(noeudOuColler)
486 listeChild.append(child)
487 dejaCrees=dejaCrees+1
489 self.QWParent.noeud_a_editer = []
490 for i in range(len(listeIndex)):
491 noeud=noeudJdc.children[indexNoeudOuColler+1+i]
492 self.QWParent.noeud_a_editer.append(noeud)
495 if self.QWParent.edit !="couper" : return
497 for index in listeIndex:
499 if indexNoeudOuColler < index:
500 indexTravail=indexTravail+(len(listeIndex))
501 noeud=noeudJdc.children[indexTravail]
503 listeItem.append(noeud.item)
504 listeASupprimer.append(noeud)
506 for i in range(len(listeChild)):
507 self.tree.item.suppItem(listeItem[i])
508 listeChild[i].item.update(listeItem[i])
510 self.QWParent.noeud_a_editer = []
512 #----------------------------------#
513 def handleAjoutEtape(self,nomEtape):
514 #----------------------------------#
515 self.chercheNoeudSelectionne()
516 if len(self.node_selected) == 0 or self.node_selected[0] == self.tree.racine :
517 nodeOuAjouter=self.tree.racine
518 nouveau=nodeOuAjouter.appendChild(nomEtape,pos='first')
520 nodeOuAjouter=self.node_selected[0]
521 if nodeOuAjouter != self.tree.racine :
522 while nodeOuAjouter.treeParent != self.tree.racine:
523 nodeOuAjouter=nodeOuAjouter.treeParent
524 nouveau=nodeOuAjouter.appendBrother(nomEtape)
526 self.node_selected[0].setSelected(False)
528 nouveau.setSelected(True)
529 nouveau.affichePanneau()
532 #---------------------------#
533 def getFileVariable(self) :
534 #---------------------------#
535 titre = tr("Choix d'un fichier XML")
536 texte = tr("Le fichier contient une commande MODEL\n")
537 texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
538 QMessageBox.information( self, titre,tr(texte))
540 fichier = QFileDialog.getOpenFileName(self.appliEficas,
541 tr('Ouvrir Fichier'),
542 self.appliEficas.maConfiguration.savedir,
543 tr('Wrapper Files (*.xml);;''All Files (*)'))
549 fonction="run"+self.code
551 if fonction in JDCEditor.__dict__: JDCEditor.__dict__[fonction](self,)
556 fonction="saveRun"+self.code
557 if fonction in JDCEditor.__dict__: JDCEditor.__dict__[fonction](self,)
560 # ---------------------------------------------
561 # Methodes Non Crees dans ssIHM
562 # ---------------------------------------------
568 if not(self.jdc.isValid()):
569 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
571 if len(self.jdc.etapes) != 1 :
572 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
574 if self.modified or self.fichier==None :
575 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
576 texte=self.getTextJDC("MAP")
577 self.writeFile( self.fichierMapInput, txt = texte)
579 self.fichierMapInput=self.fichier
580 composant=self.jdc.etapes[0].nom.lower()[0:-5]
583 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
584 # then instantiate corresponding class and call getUseSalome() method
586 from mapengine.spec import factory
587 mapComponent = factory.new(composant)[0]
590 if mapComponent.getUseSalome():
591 command += " -r sappli"
592 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
595 self._viewTextExecute( textePython,"map_run",".sh")
597 # commande="rm "+self.fichierMapInput
598 # os.system(commande)
601 except Exception as e:
602 print((traceback.print_exc()))
604 #-------------------#
605 def runZCRACKS(self):
606 #-------------------#
607 if not(self.jdc.isValid()):
608 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
610 if self.modified or self.fichier==None :
612 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
613 texte=self.getTextJDC("ZCRACKS",pourRun=1)
614 self.writeFile( self.fichierZcracksInput, txt = texte)
616 self.fichierZcracksInput=self.fichier
618 #commande ="Zrun -zp "
620 textePython=(commande + self.fichierZcracksInput)
621 self._viewTextExecute( textePython,"run_zcracks",".sh")
622 except Exception as e:
623 print((traceback.print_exc()))
625 #-------------------#
626 def runCARMELCND(self):
627 #-------------------#
628 #if not(self.jdc.isValid()):
629 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
631 if self.modified or self.fichier==None :
632 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
634 if not hasattr(self,'generator'): texte=self.getTextJDC(self.format)
635 from PrepareRunCarmel import prepareRunCarmel
636 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
637 repMed=os.path.dirname(self.fichier)
638 repExeCarmel=self.generator.get_repExeCarmel()
639 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
640 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
641 f=open(nomFichier,'w')
644 commande="xterm -e sh "+nomFichier +"\n"
647 #-------------------#
648 def runCarmelCS(self):
649 #-------------------#
651 commande="runSession pilotyacsCS.py"
653 except Exception as e:
654 print((traceback.print_exc()))
656 #-----------------------------------------------------#
657 def determineNomFichier(self,path,extension):
658 #-----------------------------------------------------#
659 if self.appli.code in DictExtensions:
660 chaine1=DictExtensions[self.appli.code]+" (*."+DictExtensions[self.appli.code]+");;"
661 extensions= tr(chaine1+ "All Files (*)")
663 extensions= tr("JDC (*.comm);;" "All Files (*)")
665 if self.appli.code == "MAP" :
666 extensions = extensions + ";; Run (*.input);;"
668 fn = QFileDialog.getSaveFileName( self,
669 tr("sauvegarde"), path,
671 QFileDialog.DontConfirmOverwrite)
672 if fn == None : return (0, None)
674 if fn=='': return (0, None)
676 ext = QFileInfo(fn).suffix()
677 if ext == '': fn+=extension
679 if QFileInfo(fn).exists():
680 msgBox = QMessageBox(self)
681 msgBox.setWindowTitle(tr("Sauvegarde du Fichier"))
682 msgBox.setText(tr("Le fichier <b>%s</b> existe deja.", six.text_type(fn)))
683 msgBox.addButton(tr("&Ecraser"),0)
684 msgBox.addButton(tr("&Abandonner"),1)
686 if abort == 1 : return (0, "")
690 def saveRunMAP(self):
693 if not(self.jdc.isValid()):
694 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
695 tr("Un JdC valide est necessaire pour creer un .input")
699 composant=self.jdc.etapes[0].nom.lower()[0:-5]
701 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
702 tr("Choix du composant obligatoire")
705 if hasattr(self.maConfiguration, "savedir"): path=self.maConfiguration.savedir
709 if self.fichier is not None and self.fichier != "" :
710 maBase=str(QFileInfo(self.fichier).baseName())+".input"
711 monPath=str(QFileInfo(self.fichier).absolutePath())
712 monNomFichier=os.path.join(monPath,maBase)
713 elif hasattr(self,'monNomFichierInput'):
714 monNomFichier=self.monNomFichierInput
717 monDialog=QFileDialog(self.appliEficas)
718 monDialog.setDirectory (path)
719 monDialog.setWindowTitle ("Save")
721 for c in monDialog.children():
722 if isinstance(c,QDialogButtonBox):
723 for b in c.children():
724 if isinstance(b,QPushButton):
726 if avant=="&Open": b.setText("Save")
727 mesFiltres= "input Map (*.input);;All Files (*)"
728 monDialog.setNameFilters(mesFiltres)
729 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
730 BOk=monDialog.exec_()
732 fn=str(monDialog.selectedFiles()[0])
733 if fn == "" or fn == None : return
734 if not fn.endswith(".input"):
736 self.monNomFichierInput=fn
738 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
739 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
740 texte=self.getTextJDC("MAP")
741 self.writeFile( self.fichierMapInput, txt = texte)
743 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
744 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
745 (output, err) = p.communicate()
749 def saveRunPSEN(self):
751 #print ("saveRunPSEN")
756 #-----------------------------------------#
757 def handleAjoutGroup(self,listeGroup):
758 #-----------------------------------------#
761 from ajoutGroupe import handleAjoutGroupFiltre
763 handleAjoutGroupFiltre(self,listeGroup)
764 #print "apres handleAjoutGroupFiltre"
770 #-----------------------------------------------------------------#
771 def saveCompleteFile(self, path = None, saveas= 0,formatLigne="beautifie"):
772 #-----------------------------------------------------------------#
774 fn = self.fichierComplet
775 #saveas=True # Pour forcer le nom
776 self.generator=self.maConfiguration.mesGenerators.plugins[self.format]()
777 if self.fichierComplet is None or saveas:
778 if path is None: path=self.maConfiguration.savedir
779 bOK, fn=self.determineNomFichier(path,extension)
780 if bOK == 0 : return (0, None)
781 if fn == None : return (0, None)
782 if fn== '' : return (0, None)
784 ulfile = os.path.abspath(six.text_type(fn))
785 self.appliEficas.maConfiguration.savedir=os.path.split(ulfile)[0]
786 fn = six.text_type(QDir.toNativeSeparators(fn))
788 self.fichierComplet = os.path.splitext(fn)[0]+extension
790 if hasattr(self.generator, "writeComplet"):
791 self.generator.writeComplet(self.fichierComplet,self.jdc,config=self.appliEficas.maConfiguration,appli=self.appliEficas)
793 if self.salome : self.appliEficas.addJdcInSalome( self.fichierComplet)
796 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichierComplet))
797 self.appliEficas.setWindowTitle(nouveauTitre)
798 return (1, self.fichierComplet)
800 #-----------------------------------------------------------------#
801 def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"):
802 #-----------------------------------------------------------------#
804 Public slot to save the text to a file.
806 @param path directory to save the file in (string or QString)
807 @return tuple of two values (boolean, string) giving a success indicator and
808 the name of the saved file
812 if not self.modified and not saveas:
813 return (0, None) # do nothing if text wasn't changed
815 if self.appli.code in DictExtensions :
816 extension=DictExtensions[self.appli.code]
822 if self.fichier is None or saveas:
823 if path is None: path=self.maConfiguration.savedir
824 bOK, fn=self.determineNomFichier(path,extension)
825 if bOK == 0 : return (0, None)
826 if fn == None : return (0, None)
827 if fn== '' : return (0, None)
829 ulfile = os.path.abspath(six.text_type(fn))
830 self.appliEficas.maConfiguration.savedir=os.path.split(ulfile)[0]
831 fn = six.text_type(QDir.toNativeSeparators(fn))
835 if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None)
837 self.modified = False
838 if self.fileInfo is None or saveas:
839 self.fileInfo = QFileInfo(self.fichier)
840 self.fileInfo.setCaching(0)
841 self.lastModified = self.fileInfo.lastModified()
842 if newName is not None:
843 self.appliEficas.addToRecentList(newName)
844 self.tree.racine.item.getObject().nom=os.path.basename(newName)
845 self.tree.racine.updateNodeLabel()
847 #print ('sortie du XML')
850 if self.jdc.isValid() != 0 and hasattr(self.generator, "writeDefault"):
851 #if hasattr(self.generator, "writeDefault"):
852 self.generator.writeDefault(fn)
853 elif self.code=="TELEMAC" and hasattr(self.generator, "writeDefault"):
854 msgBox = QMessageBox(None)
855 msgBox.setWindowTitle(tr("Fichier .cas invalide / incomplet"))
856 msgBox.setText(tr("Le fichier .cas est invalide / incomplet"))
857 msgBox.addButton(tr("&Sauvegarder"),1)
858 msgBox.addButton(tr("&Quitter sans sauvegarder"),0)
859 msgBox.addButton(tr("&Annuler"),2)
862 self.generator.writeDefault(fn)
863 return (1, self.fichier)
864 if res == 2 : return (0, None)
865 if self.appliEficas.salome : self.appliEficas.close()
869 self.appliEficas.addJdcInSalome( self.fichier)
871 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
872 self.appliEficas.setWindowTitle(nouveauTitre)
874 return (1, self.fichier)
877 #----------------------------------------------#
878 def sauveLigneFile(self):
879 #----------------------------------------------#
881 return self.saveFile(formatLigne="Ligne")
884 #----------------------------------------------#
885 def saveFileAs(self, path = None,fileName=None):
886 #----------------------------------------------#
888 Public slot to save a file with a new name.
890 @param path directory to save the file in (string or QString)
891 @return tuple of two values (boolean, string) giving a success indicator and
892 the name of the saved file
894 if fileName != None :
895 self.fichier = fileName
896 return self.saveFile()
897 return self.saveFile(path,1,"beautifie")
901 #---------------------------------------------#
902 def getFile(self,unite=None,fic_origine = ''):
903 #---------------------------------------------#
911 titre = tr("Choix unite %d ", unite)
912 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
913 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
914 labeltexte = tr('Fichier pour unite ') + repr( unite)
916 titre = tr("Choix d'un fichier de poursuite")
917 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
918 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
920 QMessageBox.information( self, titre,texte)
921 fn = QFileDialog.getOpenFileName(self.appliEficas,
923 self.appliEficas.maConfiguration.savedir)
925 # ce retour est impose par le getFile d'I_JDC
926 if fn== '' : return None," "
927 if not fn : return (0, " ")
930 ulfile = os.path.abspath(six.text_type(fn))
931 self.appliEficas.maConfiguration.savedir=os.path.split(ulfile)[0]
933 # On utilise le convertisseur defini par format_fichier
934 source=self.getSource(ulfile)
936 # On a reussia convertir le fichier self.ulfile
939 # Une erreur a ete rencontree
941 return ulfile, jdcText
943 #-----------------------------------#
944 def updateJdc(self, etape,texte):
945 #------------------------------------#
946 # ajoute une etape de JdC a partir d un texte
947 CONTEXT.setCurrentStep(etape)
948 etape.buildIncludeEtape(texte)
949 if not (etape.text_included_converted) :
950 QMessageBox.information( self,
951 tr("Impossible d importer le texte"),
952 etape.text_included_error)
954 self.tree.racine.buildChildren()
956 #-----------------------------------#
957 def updateJdcEtape(self, itemApres,texte):
958 #------------------------------------#
959 # ajoute une etape de JdC a partir d un texte
961 etape=monItem.item.object
963 CONTEXT.setCurrentStep(etape)
965 ok=etape.buildIncludeEtape(texte)
969 QMessageBox.information( self,
971 tr("Impossible d importer le texte"))
972 self.tree.racine.buildChildren()
975 #-------------------------------------------#
976 def updateJdcAfterEtape(self, etape,texte):
977 #--------------------------------------------#
978 # ajoute une etape de JdC a partir d un texte
979 CONTEXT.setCurrentStep(etape)
981 ok=etape.buildIncludeEtape(texte,doitEtreValide=0)
985 QMessageBox.information( self,
987 tr("Impossible d importer le texte"))
988 self.tree.racine.buildChildren()
992 #-------------------------------------#
993 def deleteEtape(self,etape):
994 #-------------------------------------#
996 self.jdc.suppEntite(etape)
999 #-----------------------------------------
1000 def initSplitterSizes(self, nbWidget=3):
1001 #-----------------------------------------
1002 #print ("je passe ds initSplitterSizes", nbWidget)
1004 if self.code in [ 'Adao', 'ADAO','MAP' ] : self.splitterSizes3=[1,1550,300]
1005 #elif self.code in [ 'MAP'] : self.splitterSizes3=[700,300]
1006 else : self.splitterSizes3=[150,1000,300]
1008 if self.code in [ 'Adao', 'ADAO','MAP' ] : self.splitterSizes2=[5,1500]
1009 else : self.splitterSizes2=[300,1000]
1012 #-----------------------------------------
1013 def restoreSplitterSizes(self,nbWidget=3):
1014 #----------------------------------------
1016 #traceback.print_stack()
1017 #print ("je passe ds restoreSplitterSizes")
1018 if not(hasattr(self,'splitter')) : return
1019 if nbWidget==2 : newSizes=self.splitterSizes2
1020 if nbWidget==3 : newSizes=self.splitterSizes3
1021 #self.inhibeSplitter = 1
1022 self.splitter.setSizes(newSizes)
1023 #self.inhibeSplitter = 0
1024 QApplication.processEvents()
1025 # seule la fentetre du milieu est necessaire
1026 self.splitter.widget(1).resizeEvent=self.saveSplitterSizes
1028 #-----------------------------------------
1029 def saveSplitterSizes(self,event):
1030 #-----------------------------------------
1031 #print ("je passe ds saveSplitterSizes")
1032 if self.inhibeSplitter : return
1033 if self.widgetOptionnel == None : self.splitterSizes2 = self.splitter.sizes()[0:2]
1034 else : self.splitterSizes3 = self.splitter.sizes()[0:3]
1036 #------------------------
1037 def fermeOptionnel(self):
1038 #------------------------
1039 if self.widgetOptionnel == None : return
1041 self.inhibeSplitter=1
1042 self.widgetOptionnel.setParent(None)
1043 self.widgetOptionnel.close()
1044 self.widgetOptionnel.deleteLater()
1045 self.widgetOptionnel=None
1046 self.inhibeSplitter=0
1047 self.restoreSplitterSizes(2)
1049 #------------------------
1050 def ajoutOptionnel(self):
1051 #------------------------
1052 #if len(self.splitterSizes) == 2 : self.splitterSizes.append(self.oldSizeWidgetOptionnel)
1053 #else : self.splitterSizes[2] = self.oldSizeWidgetOptionnel # ceinture pour les close bizarres
1054 #self.splitterSizes[1] = self.splitterSizes[1] - self.splitterSizes[2]
1056 self.restoreSplitterSizes(3)
1059 #------------------------
1060 def fermeArbre(self):
1061 #------------------------
1062 #print (self.widgetTree)
1063 self.oldWidgetTree=self.widgetTree
1064 self.widgetTree.hide()
1065 #self.widgetTree=None
1067 #------------------------
1068 def ouvreArbre(self):
1069 #------------------------
1070 #print ('je passe la')
1071 #print (self.widgetTree)
1072 #self.widgetTree=self.oldWidgetTree
1073 self.widgetTree.show()
1074 #self.restoreSplitterSizes(3)
1076 #-----------------------
1077 def getEtapeCourante(self) :
1078 #-----------------------
1079 if len(self.tree.selectedItems()) != 1 : return None
1080 etape=self.tree.selectedItems()[0].item.object.getEtape()
1082 #-----------------------------
1083 def getTreeIndex(self,noeud):
1084 #----------------------------
1086 if noeud in noeud.treeParent.children :
1087 indexNoeud=noeud.treeParent.children.index(noeud)
1089 if hasattr(noeud,'vraiParent') :
1091 noeudVraiParent = noeud.vraiParent
1092 while noeudVraiParent != noeud.treeParent and hasattr(noeudVraiParent,'vraiParent') :
1093 noeudVrai = noeudVraiParent
1094 noeudVraiParent = noeudVraiParent.vraiParent
1096 if noeudVraiParent == noeud.treeParent :
1097 indexNoeud=noeud.treeParent.children.index(noeudVrai)
1103 #-------------------# Pour execution avec output et error dans le bash
1105 #-------------------#
1107 #if self.modified or self.fichier==None : self.saveFile()
1110 #lancement avec le .bat
1111 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
1112 WrapperFilePath = os.path.join(path1, 'PSSEWrapper.py')
1114 p = subprocess.Popen(['python',WrapperFilePath])
1115 (out,err)=p.communicate()
1119 #-------------------# Pour execution avec output et error dans le bash
1120 def runPSEN_N1(self):
1121 #-------------------#
1125 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','ProcessOutputs_Eficas','TreatOutputs'))
1126 sys.path.append(path1)
1128 if not(self.jdc.isValid()):
1129 QMessageBox.information( self, tr( "Unvalid JDC"),tr("incorrect keywords will be ignored"))
1130 if 'dicoImbrique' in generator.plugins:
1131 self.generator=generator.plugins['dicoImbrique']()
1132 jdc_formate=self.generator.gener(self.jdc)
1133 dico=self.generator.Dico
1136 #fileDico = r'C:\Logiciels DER\PSEN_V16\Code\ProcessOutputs_Eficas\TreatOutputs\dicoN1.py'
1137 fileDico = os.path.join(path1, 'dicoN1.py') #r'C:\Logiciels DER\PSEN_V16\Code\ProcessOutputs_Eficas\TreatOutputs\dicoN1.py'
1138 f = open( str(fileDico), 'w')
1139 f.write("Dico =" + str(dico) )
1144 print ('in runPSEN_N1', dico)
1148 #res,txt_exception=run(dico)
1149 #if res : QMessageBox.information( self, tr("fin de script run"), txt_exception)
1150 #else : QMessageBox.critical( self, tr("Erreur fatale script run"), txt_exception)
1152 #-------------------# Pour execution avec output et error dans le bash
1153 def process_N1(self):
1154 #-------------------#
1156 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','ProcessOutputs_Eficas','TreatOutputs'))
1157 sys.path.append(path1)
1160 if 'dicoImbrique' in generator.plugins:
1161 self.generator=generator.plugins['dicoImbrique']()
1162 jdc_formate=self.generator.gener(self.jdc)
1163 dico=self.getDico() #generator.Dico
1166 for k in dico['CONTINGENCY_PROCESSING']:
1168 if k[0:19] == 'Component_List_For_' or k[0:21] =='Contingency_List_For_' :
1169 newK=k.replace('__',' ')
1171 dico['CONTINGENCY_PROCESSING'][l]=dico['CONTINGENCY_PROCESSING'][k]
1172 del dico['CONTINGENCY_PROCESSING'][k]
1175 fileDico = os.path.join(path1, 'dicoN1_process.py')
1176 f = open( str(fileDico), 'w')
1177 f.write("Dico =" + str(dico) )
1182 #return self.getDico()
1184 #-------------------# Pour execution avec output et error dans le bash
1185 def process_VP(self):
1186 #-------------------#
1187 if 'dicoImbrique' in generator.plugins:
1188 self.generator=generator.plugins['dicoImbrique']()
1189 jdc_formate=self.generator.gener(self.jdc)
1190 dico=self.getDico() #generator.Dico
1193 if __name__ == "__main__":