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 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 six.moves import range
33 from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog, QApplication, QSplitter
34 from PyQt5.QtGui import QPalette
35 from PyQt5.QtCore import QProcess, QFileInfo, QTimer, Qt, QDir, QSize
38 from datetime import date
39 from Extensions.i18n import tr
45 import convert, generator
46 from Editeur import session
47 from Editeur import comploader
48 from Editeur import Objecttreeitem
49 from desBaseWidget import Ui_baseWidget
50 from InterfaceQT4.monViewTexte import ViewText
51 from monWidgetCreeParam import MonWidgetCreeParam
53 from . import readercata
55 DictExtensions= {"MAP" : ".map", "TELEMAC" : '.comm'}
60 class JDCEditor(Ui_baseWidget,QWidget):
61 # ----------------------------------------- #
66 def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None):
67 #----------------------------------------------------------------------------------------------------------#
69 QWidget.__init__(self,None)
73 self.widgetOptionnel=None
74 self.fenetreCentraleAffichee=None
75 self.dejaDansPlieTout=False
76 self.afficheCommandesPliees = True
77 self.listeDesListesOuvertes=set()
78 self.appliEficas = appli
79 self.appli = appli #---- attendu par IHM
81 self.fichier = fichier
84 self.QWParent = QWParent
85 self.couleur = Qt.black
89 self.salome = self.appliEficas.salome
92 print ("dans JDC pas d appli ????????")
94 # ces attributs sont mis a jour par definitCode appelee par newEditor
95 self.code = self.appliEficas.CONFIGURATION.code
96 self.initSplitterSizes()
98 #self.afficheListesPliees=False
99 self.afficheListesPliees=True
100 if self.code == "ASTER" or self.code == "monCode" : self.afficheListesPliees =True
101 if self.code == 'PSEN_N1' : self.afficheListesPliees = False
103 self.mode_nouv_commande=self.appliEficas.CONFIGURATION.mode_nouv_commande
104 self.closeAutreCommande=self.appliEficas.CONFIGURATION.closeAutreCommande
105 self.closeFrameRechercheCommande=self.appliEficas.CONFIGURATION.closeFrameRechercheCommande
106 self.closeArbre=self.appliEficas.CONFIGURATION.closeArbre
107 self.affiche=self.appliEficas.CONFIGURATION.affiche
108 self.nombreDeBoutonParLigne = self.appliEficas.CONFIGURATION.nombreDeBoutonParLigne
109 #self.taille = self.appliEficas.taille
111 #if self.code in ['MAP','CARMELCND','PSEN'] : self.afficheCommandesPliees=False
112 if self.code in ['MAP','CARMELCND'] : self.afficheCommandesPliees=False
113 if self.code in ['MAP',]:
114 self.widgetTree.close()
116 if self.closeArbre: self.fermeArbre()
118 self.version_code = session.d_env.cata
121 if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.multi==True:
122 self.readercata = readercata.READERCATA( self, self.appliEficas )
123 self.appliEficas.readercata=self.readercata
124 self.appliEficas.code=self.code
126 self.readercata=self.appliEficas.readercata
127 if self.readercata.fic_cata == None : return #Sortie Salome
128 self.titre=self.readercata.titre
129 self.Ordre_Des_Commandes=self.readercata.Ordre_Des_Commandes
130 self.Classement_Commandes_Ds_Arbre=self.readercata.Classement_Commandes_Ds_Arbre
132 self.format = self.appliEficas.format_fichier
135 self.liste_simp_reel=[]
137 self.dicoNouveauxMC={}
139 nameConf='configuration_'+self.code
140 configuration=__import__(nameConf)
141 self.CONFIGURATION = self.appliEficas.CONFIGURATION
142 self.CONFIGStyle = self.appliEficas.CONFIGStyle
145 self.CONFIGURATION.generator_module
146 _module = __import__(self.CONFIGURATION.generator_module)
147 info = _module.entryPoint()
148 generator.plugins.addEntryPoint(info)
153 self.CONFIGURATION.convert_module
154 #print self.CONFIGURATION.convert_module
155 _module = __import__(self.CONFIGURATION.convert_module)
156 info = _module.entryPoint()
157 convert.plugins.addEntryPoint(info)
162 if hasattr(self.appliEficas,"statusBar"):
163 self.sb = self.appliEficas.statusBar()
166 self.lastModified = 0
168 self.modified = False
169 self.isReadOnly = False
170 self.node_selected = []
173 if self.code in ['Adao','ADAO','MAP'] : self.afficheApresInsert=True
174 else : self.afficheApresInsert=False
175 if self.code in ['TELEMAC',] : self.enteteQTree='premier'
176 else : self.enteteQTree='complet'
177 if self.code in ['Adao','ADAO','TELEMAC'] : self.affichePlie=True
178 else : self.affichePlie=False
180 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
182 #------- construction du jdc --------------
187 if self.fichier is not None: # fichier jdc fourni
188 self.fileInfo = QFileInfo(self.fichier)
189 self.fileInfo.setCaching(0)
192 self.jdc = self.readFile(self.fichier)
194 # print ("mauvaise lecture")
197 if self.jdc is not None and units is not None:
198 self.jdc.recorded_units=units
199 self.jdc.old_recorded_units=units
201 if not self.jdc: # nouveau jdc
203 self.jdc = self._newJDC(units=units)
205 self.jdc = self._newJDCInclude(units=units)
209 self.jdc.appli = self # a resorber
210 self.jdc.editor = self
211 self.jdc.lang = self.appli.langue
212 self.jdc.aReafficher=False
216 txt_exception = self.jdc.cr.get_mess_exception()
219 QApplication.restoreOverrideCursor()
220 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
221 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
223 comploader.charger_composants("QT")
224 jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
225 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
226 self.viewJdcRapport()
230 if jdc_item and self.appliEficas.ssIhm==False:
231 self.tree = browser.JDCTree( jdc_item, self )
232 self.appliEficas.construitMenu()
239 #-------------------# Pour execution avec output et error dans le bash
241 #-------------------#
243 #if self.modified or self.fichier==None : self.saveFile()
246 #lancement avec le .bat
247 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
248 WrapperFilePath = os.path.join(path1, 'PSSEWrapper.py')
250 p = subprocess.Popen(['python',WrapperFilePath])
251 (out,err)=p.communicate()
255 #-------------------# Pour execution avec output et error dans le bash
256 def runPSEN_N1(self):
257 #-------------------#
261 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','ProcessOutputs_Eficas','TreatOutputs'))
262 sys.path.append(path1)
264 if not(self.jdc.isvalid()):
265 QMessageBox.information( self, tr( "Unvalid JDC"),tr("incorrect keywords will be ignored"))
266 if 'dicoImbrique' in generator.plugins:
267 self.generator=generator.plugins['dicoImbrique']()
268 jdc_formate=self.generator.gener(self.jdc)
269 dico=self.generator.Dico
272 #fileDico = r'C:\Logiciels DER\PSEN_V16\Code\ProcessOutputs_Eficas\TreatOutputs\dicoN1.py'
273 fileDico = os.path.join(path1, 'dicoN1.py') #r'C:\Logiciels DER\PSEN_V16\Code\ProcessOutputs_Eficas\TreatOutputs\dicoN1.py'
274 f = open( str(fileDico), 'w')
275 f.write("Dico =" + str(dico) )
280 #print ('in runPSEN_N1', dico)
283 #res,txt_exception=run(dico)
284 #if res : QMessageBox.information( self, tr("fin de script run"), txt_exception)
285 #else : QMessageBox.critical( self, tr("Erreur fatale script run"), txt_exception)
287 #-------------------# Pour execution avec output et error dans le bash
288 def process_N1(self):
289 #-------------------#
291 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','ProcessOutputs_Eficas','TreatOutputs'))
292 sys.path.append(path1)
295 if 'dicoImbrique' in generator.plugins:
296 self.generator=generator.plugins['dicoImbrique']()
297 jdc_formate=self.generator.gener(self.jdc)
298 dico=self.get_Dico() #generator.Dico
301 for k in dico['CONTINGENCY_PROCESSING']:
303 if k[0:19] == 'Component_List_For_' or k[0:21] =='Contingency_List_For_' :
304 newK=k.replace('___',' ')
306 dico['CONTINGENCY_PROCESSING'][l]=dico['CONTINGENCY_PROCESSING'][k]
307 del dico['CONTINGENCY_PROCESSING'][k]
310 fileDico = os.path.join(path1, 'dicoN1_process.py')
311 f = open( str(fileDico), 'w')
312 f.write("Dico =" + str(dico) )
317 #return self.get_Dico()
321 #--------------------------------#
322 def _newJDC( self ,units = None):
323 #--------------------------------#
325 Initialise un nouveau JDC vierge
328 CONTEXT.unset_current_step()
331 if self.code == "CARMELCND" : texte=self._newJDCCND()
332 if self.code == "ZCRACKS" : texte=self._newZCRACKS()
333 if self.code == "TELEMAC" : texte=self._newTELEMAC()
334 if self.code == "PSEN" : texte = self._newPSEN()
335 if self.code == "PSEN_N1" : texte = self._newPSEN_N1()
337 if hasattr(self.readercata.cata[0],'TEXTE_NEW_JDC') : texte=self.readercata.cata[0].TEXTE_NEW_JDC
339 #if self.code == "CF" : texte = self._new_CF()
340 # texte=self.newTexteCND
342 jdc=self.readercata.cata[0].JdC( procedure =texte,
344 cata=self.readercata.cata,
345 cata_ord_dico=self.readercata.cata_ordonne_dico,
346 rep_mat=self.CONFIGURATION.rep_mat
348 jdc.lang = self.appli.langue
349 if units is not None:
350 jdc.recorded_units=units
351 jdc.old_recorded_units=units
352 ## PNPN est ce que la ligne suivante est bien utile ?
353 if texte == "" :jdc.analyse()
356 #--------------------------------#
357 def _newJDCInclude( self ,units = None):
358 #--------------------------------#
360 Initialise un nouveau JDC vierge
362 import Extensions.jdc_include
363 JdC_aux=Extensions.jdc_include.JdC_include
364 CONTEXT.unset_current_step()
366 jaux=self.readercata.cata[0].JdC( procedure="",
368 cata=self.readercata.cata,
369 cata_ord_dico=self.readercata.cata_ordonne_dico,
370 rep_mat=self.CONFIGURATION.rep_mat,
374 J=JdC_aux( procedure="",
376 cata=self.readercata.cata,
377 cata_ord_dico=self.readercata.cata_ordonne_dico,
379 rep_mat=self.CONFIGURATION.rep_mat,
382 if units is not None:
383 J.recorded_units=units
384 J.old_recorded_units=units
388 #-------------------------------#
389 def readFile(self, fn):
390 #--------------------------------#
392 Public slot to read the text from a file.
393 @param fn filename to read from (string or QString)
395 fn = six.text_type(fn)
397 # ------------------------------------------------------------------------------------
399 # ------------------------------------------------------------------------------------
401 jdcName=os.path.basename(fn)
402 # Il faut convertir le contenu du fichier en fonction du format
403 if self.appliEficas.format_fichier_in in convert.plugins:
404 # Le convertisseur existe on l'utilise
406 p=convert.plugins[self.appliEficas.format_fichier_in]()
408 if p.text=="" : self.nouveau=1
409 pareil,texteNew=self.verifieCHECKSUM(p.text)
411 if pareil == False and (self.appliEficas.ssIhm == False) :
412 QMessageBox.warning( self, tr("fichier modifie"),tr("Attention! fichier change hors EFICAS"))
414 memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
415 if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
417 text=p.convert('exec',self.appliEficas)
418 if not p.cr.estvide():
419 self.affiche_infos("Erreur a la conversion",Qt.red)
421 self.affiche_infos("Type de fichier non reconnu",Qt.red)
422 if self.appliEficas.ssIhm == False:
423 QMessageBox.critical( self, tr("Type de fichier non reconnu"),
424 tr("EFICAS ne sait pas ouvrir le type de fichier %s" ,self.appliEficas.format_fichier_in))
427 CONTEXT.unset_current_step()
428 jdc=self.readercata.cata[0].JdC(procedure=text,
430 cata=self.readercata.cata,
431 cata_ord_dico=self.readercata.cata_ordonne_dico,
433 rep_mat=self.CONFIGURATION.rep_mat
435 # ----------------------------------------------------
437 # ----------------------------------------------------
438 self.modified = False
440 # qApp.restoreOverrideCursor()
441 if self.fileInfo!= None :
442 self.lastModified = self.fileInfo.lastModified()
444 self.lastModified = 1
445 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
446 self.appliEficas.setWindowTitle(nouveauTitre)
450 #-----------------------#
451 def get_source(self,file):
452 #-----------------------#
454 # Il faut convertir le contenu du fichier en fonction du format
455 if self.format in convert.plugins :
456 # Le convertisseur existe on l'utilise
457 p=convert.plugins[self.format]()
459 text=p.convert('execnoparseur')
460 if not p.cr.estvide():
461 self.affiche_infos("Erreur a la conversion",Qt.red)
464 # Il n'existe pas c'est une erreur
465 self.affiche_infos("Type de fichier non reconnu",Qt.red)
466 QMessageBox.critical( self, tr("Type de fichier non reconnu"),tr("EFICAS ne sait pas ouvrir ce type de fichier"))
469 #-----------------------------------------------------------------------#
470 def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
471 #--------------------------------------------------------------------#
472 w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
476 #----------------------------------------------#
477 def __generateTempFilename(self, prefix, suffix):
478 #----------------------------------------------#
480 (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
486 #----------------------------------------------#
487 def _viewTextExecute(self, txt, prefix, suffix):
488 #----------------------------------------------#
489 self.w = ViewText( self.QWParent )
490 self.w.setWindowTitle( "execution" )
491 self.monExe=QProcess(self.w)
492 pid=self.monExe.pid()
493 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
494 f=open(nomFichier,'w')
497 self.monExe.readyReadStandardOutput.connect( self.readFromStdOut)
498 self.monExe.readyReadStandardError.connect( self.readFromStdErr)
499 exe='sh ' + nomFichier
500 self.monExe.start(exe)
501 self.monExe.closeWriteChannel()
504 commande="rm "+ nomFichier
509 def readFromStdErr(self):
510 a=self.monExe.readAllStandardError()
511 self.w.view.append(str(a.data(),len(a)))
513 def readFromStdErr(self) :
514 a=self.monExe.readAllStandardOutput()
515 self.w.view.append(str(a.data(),len(a)))
517 def readFromStdErrQT4(self):
518 a=self.monExe.readAllStandardError()
519 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
521 def readFromStdOutQT4(self) :
522 a=self.monExe.readAllStandardOutput()
523 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
527 #-----------------------#
528 def gestionParam(self):
529 #-----------------------#
530 w = MonWidgetCreeParam( self)
533 #-----------------------#
534 def viewJdcSource(self):
535 #-----------------------#
536 if self.fichier == None : return
537 f=open(self.fichier,'r')
540 self._viewText(texteSource, "JDC_SOURCE")
542 #-----------------------#
544 #-----------------------#
545 strSource = str( self.get_text_JDC(self.format) )
546 self._viewText(strSource, "JDC_RESULTAT")
548 #-----------------------#
549 def viewJdcRapport(self):
550 #-----------------------#
551 strRapport = six.text_type( self.jdc.report() )
552 # on ajoute les regles
554 self._viewText(strRapport, "JDC_RAPPORT")
556 #-----------------------#
557 def viewJdcRegles(self):
558 #-----------------------#
559 if self.tree :self.tree.AppelleBuildLBRegles()
566 Public method called by the viewmanager to finally get rid of us.
572 #----------------------------------------------#
573 def affiche_infos(self,message,couleur=Qt.black):
574 #----------------------------------------------#
576 mapalette=self.sb.palette()
577 mapalette.setColor( QPalette.WindowText, couleur )
578 self.sb.setPalette( mapalette );
579 self.sb.showMessage(message,4000)
582 #------------------------------#
583 def affiche_alerte(self,titre,message):
584 #------------------------------#
585 # appele par I_MACRO_ETAPE
586 QMessageBox.information( self, titre, message)
588 #-----------------------------------#
589 def affiche_commentaire(self,message):
590 #-----------------------------------#
591 self.labelCommentaire.setText(message)
592 QTimer.singleShot(6000, self.rendInvisible)
594 #----------------------#
595 def rendInvisible(self):
596 #----------------------#
597 self.labelCommentaire.setText("")
599 #-------------------#
600 def init_modif(self):
601 #-------------------#
603 Met l'attribut modified a 'o' : utilise par Eficas pour savoir
604 si un JDC doit etre sauvegarde avant destruction ou non
608 #---------------------------------------#
609 def chercheNoeudSelectionne(self,copie=1):
610 #---------------------------------------#
612 appele par Cut et Copy pour positionner self.node_selected
614 self.node_selected=[]
615 if len(self.tree.selectedItems()) == 0 : return
616 self.node_selected=self.tree.selectedItems()
619 #---------------------#
620 def handleSupprimer(self):
621 #---------------------#
622 self.chercheNoeudSelectionne()
623 if len(self.node_selected) == 0 : return
624 self.QWParent.noeud_a_editer = []
625 if self.node_selected[0]==self.tree.racine: return
626 if len(self.node_selected) == 1 : self.node_selected[0].delete()
627 else : self.node_selected[0].deleteMultiple(self.node_selected)
629 #---------------------#
630 def handleRechercher(self):
631 #---------------------#
632 from .monRecherche import DRecherche
633 monRechercheDialg=DRecherche(parent=self,fl=0)
634 monRechercheDialg.show()
637 #--------------------------------#
638 def handleRechercherDsCatalogue(self):
639 #-----------------------------#
640 from .monRechercheCatalogue import DRechercheCatalogue
641 monRechercheDialg=DRechercheCatalogue(self.QWParent,self)
642 monRechercheDialg.show()
644 #---------------------#
645 def handleDeplier(self):
646 #---------------------#
647 if self.tree == None : return
648 #self.tree.collapseAll()
651 self.tree.expandItem(self.tree.topLevelItem(0))
653 if self.fenetreCentraleAffichee != None :
654 if hasattr(self.fenetreCentraleAffichee.node,'plieToutEtReaffiche'):
655 self.fenetreCentraleAffichee.node.plieToutEtReaffiche()
658 self.tree.expandItem(self.tree.topLevelItem(0))
660 if self.fenetreCentraleAffichee != None :
661 if hasattr(self.fenetreCentraleAffichee.node,'deplieToutEtReaffiche'):
662 self.fenetreCentraleAffichee.node.deplieToutEtReaffiche()
664 #---------------------#
665 def handleEditCut(self):
666 #---------------------#
668 Stocke dans Eficas.noeud_a_editer le noeud a couper
670 #print "handleEditCut"
671 self.chercheNoeudSelectionne()
672 self.QWParent.edit="couper"
673 self.QWParent.noeud_a_editer = self.node_selected
675 #-----------------------#
676 def handleEditCopy(self):
677 #-----------------------#
679 Stocke dans Eficas.noeud_a_editer le noeud a copier
681 self.chercheNoeudSelectionne()
682 if len(self.node_selected) == 0 : return
683 if len(self.node_selected) == 1 : self.node_selected[0].update_node_label_in_blue()
684 else : self.node_selected[0].update_plusieurs_node_label_in_blue(self.node_selected)
685 self.QWParent.edit="copier"
686 self.QWParent.noeud_a_editer = self.node_selected
688 #------------------------#
689 def handleEditPaste(self):
690 #------------------------#
692 Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
693 Ne permet que la copie d'objets de type Commande ou MCF
695 self.chercheNoeudSelectionne()
696 if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
697 QMessageBox.information( self,
698 tr("Copie impossible"),
699 tr("Veuillez selectionner un objet a copier"))
701 if len(self.node_selected) != 1 :
702 QMessageBox.information( self,
703 tr("Copie impossible"),
704 tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
707 if len(self.QWParent.noeud_a_editer)!=1:
708 self.handleEditPasteMultiple()
711 noeudOuColler=self.node_selected[0]
713 if noeudOuColler == self.tree.racine:
717 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
718 indexNoeudOuColler=self.getTreeIndex(noeudOuColler)
721 noeudACopier=self.QWParent.noeud_a_editer[0]
722 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
723 indexNoeudACopier=self.getTreeIndex(noeudACopier)
725 QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
728 if (self.QWParent.edit != "couper"):
730 if noeudOuColler == self.tree.racine :
731 child=noeudOuColler.doPastePremier(noeudACopier)
733 child=noeudACopier.doPaste(noeudOuColler,pos)
734 if child==None or child==0:
735 QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
737 self.affiche_infos("Copie refusee",Qt.red)
738 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
740 nom=noeudACopier.item.sd.nom
741 child.item.nomme_sd(nom)
748 traceback.print_exc()
749 QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
751 self.affiche_infos("Copie refusee",Qt.red)
754 # il faut declarer le JDCDisplay_courant modifie
755 # suppression eventuelle du noeud selectionne
756 # si possible on renomme l objet comme le noeud couper
758 if (self.QWParent.edit == "couper"):
759 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
760 QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
764 # indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
765 indexNoeudACopier=self.getTreeIndex(noeudACopier)
766 noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
767 noeudACopier.treeParent.build_children()
772 self.QWParent.noeud_a_editer=[]
774 # on rend la copie a nouveau possible en liberant le flag edit
775 self.QWParent.edit="copier"
776 noeudACopier.select()
778 #----------------------------------#
779 def handleDeplaceMultiple(self):
780 #----------------------------------#
783 #----------------------------------#
784 def handleEditPasteMultiple(self):
785 #----------------------------------#
787 # On ne garde que les niveaux "Etape"
788 # On insere dans l'ordre du JDC
789 listeNoeudsACouper=[]
793 from InterfaceQT4 import compojdc
794 noeudOuColler=self.node_selected[0]
795 if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
796 QMessageBox.information( self,
797 tr("Copie impossible a cet endroit",),
798 tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
800 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
802 for noeud in self.QWParent.noeud_a_editer :
803 if not (isinstance(noeud.treeParent, compojdc.Node)): continue
804 indexInTree=noeud.treeParent.children.index(noeud)
806 for index in listeIndex:
807 if index < indexInTree : indice = indice +1
808 listeIndex.insert(indice, indexInTree)
809 listeNoeudsACouper.insert(indice, noeud)
811 noeudJdc=noeudOuColler.treeParent
813 # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
815 for index in listeIndex:
817 if indexNoeudOuColler < index:
818 indexTravail=indexTravail+dejaCrees
819 noeudOuColler=noeudJdc.children[indexNoeudOuColler]
820 noeud=noeudJdc.children[indexTravail]
821 child=noeud.doPaste(noeudOuColler)
822 listeChild.append(child)
823 dejaCrees=dejaCrees+1
825 self.QWParent.noeud_a_editer = []
826 for i in range(len(listeIndex)):
827 noeud=noeudJdc.children[indexNoeudOuColler+1+i]
828 self.QWParent.noeud_a_editer.append(noeud)
831 if self.QWParent.edit !="couper" : return
833 for index in listeIndex:
835 if indexNoeudOuColler < index:
836 indexTravail=indexTravail+(len(listeIndex))
837 noeud=noeudJdc.children[indexTravail]
839 listeItem.append(noeud.item)
840 listeASupprimer.append(noeud)
842 for i in range(len(listeChild)):
843 self.tree.item.suppitem(listeItem[i])
844 listeChild[i].item.update(listeItem[i])
846 self.QWParent.noeud_a_editer = []
849 #---------------------#
850 def getFileName(self):
851 #---------------------#
854 #---------------------------#
855 def get_file_variable(self) :
856 #---------------------------#
857 titre = tr("Choix d'un fichier XML")
858 texte = tr("Le fichier contient une commande MODEL\n")
859 texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
860 QMessageBox.information( self, titre,tr(texte))
862 fichier = QFileDialog.getOpenFileName(self.appliEficas,
863 tr('Ouvrir Fichier'),
864 self.appliEficas.CONFIGURATION.savedir,
865 tr('Wrapper Files (*.xml);;''All Files (*)'))
868 #--------------------------------------------------#
869 def writeFile(self, fn, txt = None,formatLigne="beautifie"):
870 #--------------------------------------------------#
872 Public slot to write the text to a file.
874 @param fn filename to write to string
875 @return flag indicating success
878 fn = six.text_type(fn)
881 txt = self.get_text_JDC(self.format,formatLigne=formatLigne)
883 if len(txt) >= len(eol):
884 if txt[-len(eol):] != eol:
888 txt=self.ajoutVersionCataDsJDC(txt)
889 checksum=self.get_checksum(txt)
891 if self.code=="TELEMAC" : return 1
897 except IOError as why:
898 if (self.appliEficas.ssIhm == False):
899 QMessageBox.critical(self, tr('Sauvegarde du Fichier'),
900 tr('Le fichier')+str(fn) + tr('n a pas pu etre sauvegarde : ') + str(why))
905 #-----------------------------------------------------------#
906 def get_text_JDC(self,format,pourRun=0,formatLigne="beautifie"):
907 #-----------------------------------------------------------#
908 if self.code == "MAP" and not(format in generator.plugins): format = "MAP"
909 if format in generator.plugins:
911 # Le generateur existe on l'utilise
912 self.generator=generator.plugins[format]()
914 jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.CONFIGURATION,appli=self.appliEficas)
915 if pourRun : jdc_formate=self.generator.textePourRun
916 except ValueError as e:
917 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
920 if not self.generator.cr.estvide():
921 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
922 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
927 # Il n'existe pas c'est une erreur
928 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
929 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
932 #----------------------#
934 #---------------------#
935 if 'dicoImbrique' in generator.plugins:
936 self.generator=generator.plugins['dicoImbrique']()
937 jdc_formate=self.generator.gener(self.jdc)
938 dico=self.generator.Dico
941 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
942 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
949 fonction="run"+self.code
951 if fonction in JDCEditor.__dict__: JDCEditor.__dict__[fonction],(self,)
956 fonction="saveRun"+self.code
957 if fonction in JDCEditor.__dict__: JDCEditor.__dict__[fonction],(self,)
963 if not(self.jdc.isvalid()):
964 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
966 if len(self.jdc.etapes) != 1 :
967 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
969 if self.modified or self.fichier==None :
970 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
971 texte=self.get_text_JDC("MAP")
972 self.writeFile( self.fichierMapInput, txt = texte)
974 self.fichierMapInput=self.fichier
975 composant=self.jdc.etapes[0].nom.lower()[0:-5]
978 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
979 # then instantiate corresponding class and call getUseSalome() method
981 from mapengine.spec import factory
982 mapComponent = factory.new(composant)[0]
985 if mapComponent.getUseSalome():
986 command += " -r sappli"
987 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
990 self._viewTextExecute( textePython,"map_run",".sh")
992 # commande="rm "+self.fichierMapInput
993 # os.system(commande)
996 except Exception as e:
997 print((traceback.print_exc()))
999 #-------------------#
1000 def runZCRACKS(self):
1001 #-------------------#
1002 if not(self.jdc.isvalid()):
1003 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
1005 if self.modified or self.fichier==None :
1007 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
1008 texte=self.get_text_JDC("ZCRACKS",pourRun=1)
1009 self.writeFile( self.fichierZcracksInput, txt = texte)
1011 self.fichierZcracksInput=self.fichier
1013 #commande ="Zrun -zp "
1015 textePython=(commande + self.fichierZcracksInput)
1016 self._viewTextExecute( textePython,"run_zcracks",".sh")
1017 except Exception as e:
1018 print((traceback.print_exc()))
1020 #-------------------#
1021 def runCARMELCND(self):
1022 #-------------------#
1023 #if not(self.jdc.isvalid()):
1024 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
1026 if self.modified or self.fichier==None :
1027 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
1029 if not hasattr(self,'generator'): texte=self.get_text_JDC(self.format)
1030 from PrepareRunCarmel import prepareRunCarmel
1031 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
1032 repMed=os.path.dirname(self.fichier)
1033 repExeCarmel=self.generator.get_repExeCarmel()
1034 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
1035 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
1036 f=open(nomFichier,'w')
1037 f.write(textePython)
1039 commande="xterm -e sh "+nomFichier +"\n"
1042 #-------------------#
1043 def runCarmelCS(self):
1044 #-------------------#
1046 commande="runSession pilotyacsCS.py"
1048 except Exception as e:
1049 print((traceback.print_exc()))
1051 #-----------------------------------------------------#
1052 def determineNomFichier(self,path,extension):
1053 #-----------------------------------------------------#
1054 if self.appli.code in DictExtensions:
1055 chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
1056 extensions= tr(chaine1+ "All Files (*)")
1058 extensions= tr("JDC (*.comm);;" "All Files (*)")
1060 if self.appli.code == "MAP" :
1061 extensions = extensions + ";; Run (*.input);;"
1063 fn = QFileDialog.getSaveFileName( self,
1064 tr("sauvegarde"), path,
1066 QFileDialog.DontConfirmOverwrite)
1067 if fn == None : return (0, None)
1069 if fn=='': return (0, None)
1071 ext = QFileInfo(fn).suffix()
1072 if ext == '': fn+=extension
1074 if QFileInfo(fn).exists():
1075 msgBox = QMessageBox(self)
1076 msgBox.setWindowTitle(tr("Sauvegarde du Fichier"))
1077 msgBox.setText(tr("Le fichier <b>%s</b> existe deja.", six.text_type(fn)))
1078 msgBox.addButton(tr("&Ecraser"),0)
1079 msgBox.addButton(tr("&Abandonner"),1)
1080 abort=msgBox.exec_()
1081 if abort == 1 : return (0, "")
1085 def saveRunMAP(self):
1088 if not(self.jdc.isvalid()):
1089 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
1090 tr("Un JdC valide est necessaire pour creer un .input")
1094 composant=self.jdc.etapes[0].nom.lower()[0:-5]
1096 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
1097 tr("Choix du composant obligatoire")
1100 if hasattr(self.CONFIGURATION, "savedir"): path=self.CONFIGURATION.savedir
1104 if self.fichier is not None and self.fichier != "" :
1105 maBase=str(QFileInfo(self.fichier).baseName())+".input"
1106 monPath=str(QFileInfo(self.fichier).absolutePath())
1107 monNomFichier=os.path.join(monPath,maBase)
1108 elif hasattr(self,'monNomFichierInput'):
1109 monNomFichier=self.monNomFichierInput
1112 monDialog=QFileDialog(self.appliEficas)
1113 monDialog.setDirectory (path)
1114 monDialog.setWindowTitle ("Save")
1116 for c in monDialog.children():
1117 if isinstance(c,QDialogButtonBox):
1118 for b in c.children():
1119 if isinstance(b,QPushButton):
1121 if avant=="&Open": b.setText("Save")
1122 mesFiltres= "input Map (*.input);;All Files (*)"
1123 monDialog.setNameFilters(mesFiltres)
1124 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
1125 BOk=monDialog.exec_()
1127 fn=str(monDialog.selectedFiles()[0])
1128 if fn == "" or fn == None : return
1129 if not fn.endswith(".input"):
1131 self.monNomFichierInput=fn
1133 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
1134 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
1135 texte=self.get_text_JDC("MAP")
1136 self.writeFile( self.fichierMapInput, txt = texte)
1138 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
1139 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
1140 (output, err) = p.communicate()
1144 def saveRunPSEN(self):
1146 #print ("saveRunPSEN")
1150 #-----------------------------------------#
1151 def cherche_Groupes(self):
1152 #-----------------------------------------#
1153 listeMA,listeNO=self.get_text_JDC("GroupMA")
1154 return listeMA,listeNO
1156 #-----------------------------------------#
1157 def cherche_Dico(self):
1158 #-----------------------------------------#
1160 format = self.appliEficas.format_fichier
1161 if format in generator.plugins:
1162 # Le generateur existe on l'utilise
1163 self.generator=generator.plugins[format]()
1164 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
1165 dicoCourant=self.generator.dico
1170 #-----------------------------------------#
1171 def handleAjoutGroup(self,listeGroup):
1172 #-----------------------------------------#
1175 from ajoutGroupe import handleAjoutGroupFiltre
1177 handleAjoutGroupFiltre(self,listeGroup)
1178 #print "apres handleAjoutGroupFiltre"
1183 #-----------------------------------------------------------------#
1184 def saveFileLeger(self, path = None, saveas= 0,formatLigne="beautifie"):
1185 #-----------------------------------------------------------------#
1188 #saveas=True # Pour forcer le nom
1189 self.generator=generator.plugins[self.format]()
1190 if self.fichier is None or saveas:
1191 if path is None: path=self.CONFIGURATION.savedir
1192 bOK, fn=self.determineNomFichier(path,extension)
1193 if bOK == 0 : return (0, None)
1194 if fn == None : return (0, None)
1195 if fn== '' : return (0, None)
1197 ulfile = os.path.abspath(six.text_type(fn))
1198 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1199 fn = six.text_type(QDir.toNativeSeparators(fn))
1201 self.fichier = os.path.splitext(fn)[0]+extension
1203 if hasattr(self.generator, "writeLeger"):
1204 self.generator.writeLeger(self.fichier,self.jdc,config=self.appliEficas.CONFIGURATION,appli=self.appliEficas)
1206 if self.salome : self.appliEficas.addJdcInSalome( self.fichier)
1209 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1210 self.appliEficas.setWindowTitle(nouveauTitre)
1211 return (1, self.fichier)
1213 #-----------------------------------------------------------------#
1214 def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"):
1215 #-----------------------------------------------------------------#
1217 Public slot to save the text to a file.
1219 @param path directory to save the file in (string or QString)
1220 @return tuple of two values (boolean, string) giving a success indicator and
1221 the name of the saved file
1225 if not self.modified and not saveas:
1226 return (0, None) # do nothing if text wasn't changed
1228 if self.appli.code in DictExtensions :
1229 extension=DictExtensions[self.appli.code]
1235 if self.fichier is None or saveas:
1236 if path is None: path=self.CONFIGURATION.savedir
1237 bOK, fn=self.determineNomFichier(path,extension)
1238 if bOK == 0 : return (0, None)
1239 if fn == None : return (0, None)
1240 if fn== '' : return (0, None)
1242 ulfile = os.path.abspath(six.text_type(fn))
1243 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1244 fn = six.text_type(QDir.toNativeSeparators(fn))
1248 if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None)
1250 self.modified = False
1251 if self.fileInfo is None or saveas:
1252 self.fileInfo = QFileInfo(self.fichier)
1253 self.fileInfo.setCaching(0)
1254 self.lastModified = self.fileInfo.lastModified()
1255 if newName is not None:
1256 self.appliEficas.addToRecentList(newName)
1257 self.tree.racine.item.getObject().nom=os.path.basename(newName)
1258 self.tree.racine.update_node_label()
1260 if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
1261 self.generator.writeDefault(fn)
1262 elif self.code=="TELEMAC" and hasattr(self.generator, "writeDefault"):
1263 self.generator.writeDefault(fn)
1266 self.appliEficas.addJdcInSalome( self.fichier)
1268 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1269 self.appliEficas.setWindowTitle(nouveauTitre)
1271 return (1, self.fichier)
1274 #----------------------------------------------#
1275 def sauveLigneFile(self):
1276 #----------------------------------------------#
1278 return self.saveFile(formatLigne="Ligne")
1281 #----------------------------------------------#
1282 def saveFileAs(self, path = None,fileName=None):
1283 #----------------------------------------------#
1285 Public slot to save a file with a new name.
1287 @param path directory to save the file in (string or QString)
1288 @return tuple of two values (boolean, string) giving a success indicator and
1289 the name of the saved file
1291 if fileName != None :
1292 self.fichier = fileName
1293 return self.saveFile()
1294 return self.saveFile(path,1,"beautifie")
1298 #---------------------------------------------#
1299 def get_file(self,unite=None,fic_origine = ''):
1300 #---------------------------------------------#
1308 titre = tr("Choix unite %d ", unite)
1309 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
1310 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
1311 labeltexte = tr('Fichier pour unite ') + repr( unite)
1313 titre = tr("Choix d'un fichier de poursuite")
1314 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
1315 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
1317 QMessageBox.information( self, titre,texte)
1318 fn = QFileDialog.getOpenFileName(self.appliEficas,
1320 self.appliEficas.CONFIGURATION.savedir)
1322 # ce retour est impose par le get_file d'I_JDC
1323 if fn== '' : return None," "
1324 if not fn : return (0, " ")
1327 ulfile = os.path.abspath(six.text_type(fn))
1328 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1330 # On utilise le convertisseur defini par format_fichier
1331 source=self.get_source(ulfile)
1333 # On a reussia convertir le fichier self.ulfile
1336 # Une erreur a ete rencontree
1338 return ulfile, jdcText
1340 #-------------------------------#
1341 def updateJdc(self, itemApres,texte):
1342 #--------------------------------#
1344 etape=monItem.item.object
1346 CONTEXT.set_current_step(etape)
1347 etape.build_includeInclude(texte)
1348 self.tree.racine.build_children()
1350 #-------------------------------------#
1351 def deleteEtape(self,etape):
1352 #-------------------------------------#
1353 self.jdc.suppentite(etape)
1355 #-------------------------------------#
1356 def deleteMC(self,etape,MCFils,listeAvant=()):
1357 #-------------------------------------#
1359 for mot in listeAvant :
1360 ouChercher=ouChercher.get_child(mot,restreint="oui")
1361 monMC=ouChercher.get_child(MCFils,restreint="oui")
1362 if monMC != None : ouChercher.suppentite(monMC)
1363 ouChercher.state='changed'
1364 ouChercher.isvalid()
1366 #-------------------------------------#
1367 def ajoutMC(self,etape,MCFils,valeurs,listeAvant=()):
1368 #-------------------------------------#
1370 for mot in listeAvant :
1371 ouChercher=ouChercher.get_child(mot,restreint="oui")
1372 monMC=etape.get_child(ouChercher,restreint="oui")
1373 if monMC== None : monMC= ouChercher.addentite(MCFils)
1374 monMC.valeur=valeurs
1376 monMC.state='changed'
1379 #-----------------------------------------------------------#
1380 def changeIntoMC(self,etape,MCFils,valeurs, listeAvant=()):
1381 #-----------------------------------------------------------#
1383 for mot in listeAvant :
1384 ouChercher=ouChercher.get_child(mot,restreint="oui")
1385 if ouChercher ==None : print ('SOUCI'); return
1386 monMC=ouChercher.get_child(MCFils,restreint="oui")
1387 if monMC== None : monMC= ouChercher.addentite(MCFils)
1388 monMC.definition.into=valeurs
1389 monMC.state='changed'
1392 #-------------------------------------#
1393 def changeIntoDefMC(self,etape,listeMC,valeurs):
1394 #-------------------------------------#
1395 definitionEtape=getattr(self.jdc.cata[0],etape)
1396 ouChercher=definitionEtape
1397 if len(listeMC) > 1 :
1398 for mc in listeMC[0:-1]:
1399 mcfact=ouChercher.entites[mc]
1402 mcAccas=ouChercher.entites[listeMC[-1]]
1403 mcAccas.into=valeurs
1405 #-------------------------------------------------------------#
1406 def deleteDefinitionMC(self,etape,listeAvant,nomDuMC):
1407 #-------------------------------------------------------------#
1408 #print 'in deleteDefinitionMC', etape,listeAvant,nomDuMC
1409 definitionEtape=getattr(self.jdc.cata[0],etape)
1410 ouChercher=definitionEtape
1411 for k in listeAvant :
1412 ouChercher=ouChercher.entites[k]
1413 MCADetruire=ouChercher.entites[nomDuMC]
1414 ouChercher.ordre_mc.remove(nomDuMC)
1415 del ouChercher.entites[nomDuMC]
1416 del self.dicoNouveauxMC[nomDuMC]
1419 #-------------------------------------------------------------#
1420 def ajoutDefinitionMC(self,etape,listeAvant,nomDuMC,typ,**args):
1421 #-------------------------------------------------------------#
1422 definitionEtape=getattr(self.jdc.cata[0],etape)
1423 ouChercher=definitionEtape
1424 for k in listeAvant :
1425 ouChercher=ouChercher.entites[k]
1426 from Accas import A_SIMP
1427 Nouveau=A_SIMP.SIMP(typ,**args)
1428 Nouveau.pere=ouChercher
1431 ouChercher.entites[nomDuMC]=Nouveau
1432 ouChercher.ordre_mc.append(nomDuMC)
1433 self.dicoNouveauxMC[nomDuMC]=('ajoutDefinitionMC',etape,listeAvant,nomDuMC,typ,args)
1434 #print self.dicoNouveauxMC
1436 #----------------------------------------------------#
1437 def changeIntoMCandSet(self,etape,MCFils,into,valeurs):
1438 #----------------------------------------------------#
1439 monMC=etape.get_child(MCFils,restreint="oui")
1440 if monMC== None : monMC= etape.addentite(MCFils)
1441 monMC.definition.into=into
1442 monMC.valeur=valeurs
1444 monMC.state='changed'
1447 #-------------------------------------#
1448 def ajoutVersionCataDsJDC(self,txt):
1449 #-------------------------------------#
1450 if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
1451 ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata[0].VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
1452 texte=txt+ligneVersion
1455 #-------------------------------------#
1456 def verifieVersionCataDuJDC(self,text):
1457 #-------------------------------------#
1459 indexDeb=text.find("#VERSION_CATALOGUE:")
1460 indexFin=text.find(":FIN VERSION_CATALOGUE")
1462 self.versionCataDuJDC="sans"
1465 self.versionCataDuJDC=text[indexDeb+19:indexFin]
1466 textJDC=text[0:indexDeb]+text[indexFin+23:-1]
1468 self.versionCata="sans"
1469 if hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata[0].VERSION_CATALOGUE
1471 if self.versionCata==self.versionCataDuJDC : memeVersion=True
1472 return memeVersion,textJDC
1474 #-------------------------------#
1475 def traduitCatalogue(self,texte):
1476 #-------------------------------#
1477 nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
1478 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
1480 traducteur=__import__(nomTraducteur)
1481 monTraducteur=traducteur.MonTraducteur(texte)
1482 nouveauTexte=monTraducteur.traduit()
1488 #------------------------------#
1489 def verifieCHECKSUM(self,text):
1490 #------------------------------#
1491 indexDeb=text.find("#CHECKSUM:")
1494 indexFin=text.find(":FIN CHECKSUM")
1495 checkAvant=text[indexDeb:indexFin+13]
1496 textJDC=text[0:indexDeb]+text[indexFin+13:-1]
1497 checksum=self.get_checksum(textJDC)
1498 pareil=(checkAvant==checksum)
1499 return pareil, textJDC
1501 #---------------------------#
1502 def get_checksum(self,texte):
1503 #---------------------------#
1504 newtexte=texte.replace('"','\\"')
1505 commande='echo "'+newtexte+'"|md5sum'
1506 a=os.popen(commande)
1509 ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
1513 #---------------------------#
1515 #---------------------------#
1516 texte="CONDUITE_FORCEE();"
1520 #---------------------------#
1521 def _newTELEMAC(self):
1522 #---------------------------#
1523 #texte="INITIALIZATION();BOUNDARY_CONDITIONS();GENERAL_PARAMETERS();PHYSICAL_PARAMETERS();NUMERICAL_PARAMETERS();"
1524 texte="COMPUTATION_ENVIRONMENT();HYDRO();GENERAL_PARAMETERS();NUMERICAL_PARAMETERS()"
1528 #---------------------------#
1530 #---------------------------#
1531 texte="DIRECTORY() ; PSSE_PARAMETERS() ; SIMULATION() ; sansnom=DISTRIBUTION() ; sansnom=DISTRIBUTION() ; CORRELATION() ;"
1535 #---------------------------#
1536 def _newPSEN_N1(self):
1537 #---------------------------#
1538 texte="CASE_SELECTION();N_PROCESSING_OPTIONS();CONTINGENCY_OPTIONS();CONTINGENCY_SELECTION();\nCONTINGENCY_PROCESSING(); "
1539 texte="CONTINGENCY_SELECTION();\nCONTINGENCY_PROCESSING(); "
1542 #---------------------------#
1544 #---------------------------#
1545 def _newZCRACKS(self):
1546 #---------------------------#
1547 texte="MAILLAGES();REMESHING();"
1550 #---------------------------#
1551 def _newJDCCND(self):
1552 #---------------------------#
1553 extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
1555 #if self.salome == 0 :
1556 QMessageBox.information( self,
1558 tr("Veuillez selectionner un fichier Med"))
1559 QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
1560 caption='Fichier Med',
1562 QSfichier=QSfichier[0]
1563 self.fichierMED=QSfichier
1564 from acquiertGroupes import getGroupes
1565 erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
1566 if erreur != "" : print ("a traiter")
1567 texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
1573 for groupe in self.listeGroupes :
1574 if groupe[0:8]=='CURRENT_':
1575 texteSources +=groupe[8:]+"=SOURCE("
1576 texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
1577 if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n"
1578 if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n"
1579 if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n"
1580 if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n"
1581 texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
1582 self.newTexteCND=texte
1587 #---------------------------#
1588 def BoutonFileSelected(self):
1589 #---------------------------#
1591 QSfichier=self.openfile.selectedFiles()[0]
1592 self.fichierMED=str(QSfichier)
1593 from acquiertGroupes import getGroupes
1594 erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
1595 if erreur != "" : print ("a traiter")
1597 #-----------------------------
1598 def BoutonSalomePressed(self):
1599 #----------------------------
1600 Msg,self.listeGroupes=self.appliEficas.ChercheGrpMailleInSalome()
1601 self.fichierMED="A_partir_de_SMESH"
1602 self.nomMaillage="A_partir_de_SMESH"
1603 self.openfile.close()
1606 #-----------------------------------------
1607 def initSplitterSizes(self, nbWidget=3):
1608 #-----------------------------------------
1609 #print ("je passe ds initSplitterSizes", nbWidget)
1611 if self.code in [ 'Adao', 'ADAO', ] : self.splitterSizes3=[1,1550,150]
1612 elif self.code in [ 'MAP'] : self.splitterSizes3=[700,300]
1613 else : self.splitterSizes3=[150,1000,300]
1615 if self.code in [ 'Adao', 'ADAO', ] : self.splitterSizes2=[5,1500]
1616 else : self.splitterSizes2=[300,1000]
1620 #-----------------------------------------
1621 def restoreSplitterSizes(self,nbWidget=3):
1622 #----------------------------------------
1624 #traceback.print_stack()
1625 #print ("je passe ds restoreSplitterSizes")
1626 if not(hasattr(self,'splitter')) : return
1627 if nbWidget==2 : newSizes=self.splitterSizes2
1628 if nbWidget==3 : newSizes=self.splitterSizes3
1629 #self.inhibeSplitter = 1
1630 self.splitter.setSizes(newSizes)
1631 #self.inhibeSplitter = 0
1632 QApplication.processEvents()
1633 # seule la fentetre du milieu est necessaire
1634 self.splitter.widget(1).resizeEvent=self.saveSplitterSizes
1636 #-----------------------------------------
1637 def saveSplitterSizes(self,event):
1638 #-----------------------------------------
1639 #print ("je passe ds saveSplitterSizes")
1640 if self.inhibeSplitter : return
1641 if self.widgetOptionnel == None : self.splitterSizes2 = self.splitter.sizes()[0:2]
1642 else : self.splitterSizes3 = self.splitter.sizes()[0:3]
1644 #------------------------
1645 def fermeOptionnel(self):
1646 #------------------------
1647 if self.widgetOptionnel == None : return
1649 self.inhibeSplitter=1
1650 self.widgetOptionnel.setParent(None)
1651 self.widgetOptionnel.close()
1652 self.widgetOptionnel.deleteLater()
1653 self.widgetOptionnel=None
1654 self.inhibeSplitter=0
1655 self.restoreSplitterSizes(2)
1657 #------------------------
1658 def ajoutOptionnel(self):
1659 #------------------------
1660 #if len(self.splitterSizes) == 2 : self.splitterSizes.append(self.oldSizeWidgetOptionnel)
1661 #else : self.splitterSizes[2] = self.oldSizeWidgetOptionnel # ceinture pour les close bizarres
1662 #self.splitterSizes[1] = self.splitterSizes[1] - self.splitterSizes[2]
1664 self.restoreSplitterSizes(3)
1667 #------------------------
1668 def fermeArbre(self):
1669 #------------------------
1670 #print (self.widgetTree)
1671 self.oldWidgetTree=self.widgetTree
1672 self.widgetTree.hide()
1673 #self.widgetTree=None
1675 #------------------------
1676 def ouvreArbre(self):
1677 #------------------------
1678 #print ('je passe la')
1679 #print (self.widgetTree)
1680 #self.widgetTree=self.oldWidgetTree
1681 self.widgetTree.show()
1682 #self.restoreSplitterSizes(3)
1684 #-----------------------------
1685 def getTreeIndex(self,noeud):
1686 #----------------------------
1688 if noeud in noeud.treeParent.children :
1689 indexNoeud=noeud.treeParent.children.index(noeud)
1691 if hasattr(noeud,'vraiParent') :
1693 noeudVraiParent = noeud.vraiParent
1694 while noeudVraiParent != noeud.treeParent and hasattr(noeudVraiParent,'vraiParent') :
1695 noeudVrai = noeudVraiParent
1696 noeudVraiParent = noeudVraiParent.vraiParent
1698 if noeudVraiParent == noeud.treeParent :
1699 indexNoeud=noeud.treeParent.children.index(noeudVrai)
1705 if __name__ == "__main__":
1707 name='prefs_'+prefs.code
1708 prefsCode=__import__(name)
1711 if hasattr(prefsCode,'encoding'):
1712 # Hack pour changer le codage par defaut des strings
1715 sys.setdefaultencoding(prefs.encoding)
1716 del sys.setdefaultencoding
1721 app = QApplication(sys.argv)
1722 mw = JDCEditor(None,'azAster.comm')
1723 app.setMainWidget(mw)
1724 app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
1727 res = app.exec_loop()