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.dicoImages = self.appliEficas.CONFIGURATION.dicoImages
110 self.simpleClic = self.appliEficas.CONFIGURATION.simpleClic
111 #self.taille = self.appliEficas.taille
113 #if self.code in ['MAP','CARMELCND','PSEN'] : self.afficheCommandesPliees=False
114 if self.code in ['MAP','CARMELCND'] : self.afficheCommandesPliees=False
115 if self.code in ['MAP',]:
116 self.widgetTree.close()
118 if self.closeArbre: self.fermeArbre()
120 self.version_code = session.d_env.cata
123 if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.multi==True:
124 self.readercata = readercata.READERCATA( self, self.appliEficas )
125 self.appliEficas.readercata=self.readercata
126 self.appliEficas.code=self.code
128 self.readercata=self.appliEficas.readercata
129 if self.readercata.fic_cata == None : return #Sortie Salome
130 self.titre=self.readercata.titre
131 self.Ordre_Des_Commandes=self.readercata.Ordre_Des_Commandes
132 self.Classement_Commandes_Ds_Arbre=self.readercata.Classement_Commandes_Ds_Arbre
134 self.format = self.appliEficas.format_fichier
137 self.liste_simp_reel=[]
139 self.dicoNouveauxMC={}
141 nameConf='configuration_'+self.code
142 configuration=__import__(nameConf)
143 self.CONFIGURATION = self.appliEficas.CONFIGURATION
144 self.CONFIGStyle = self.appliEficas.CONFIGStyle
147 self.CONFIGURATION.generator_module
148 _module = __import__(self.CONFIGURATION.generator_module)
149 info = _module.entryPoint()
150 generator.plugins.addEntryPoint(info)
155 self.CONFIGURATION.convert_module
156 #print self.CONFIGURATION.convert_module
157 _module = __import__(self.CONFIGURATION.convert_module)
158 info = _module.entryPoint()
159 convert.plugins.addEntryPoint(info)
164 if hasattr(self.appliEficas,"statusBar"):
165 self.sb = self.appliEficas.statusBar()
168 self.lastModified = 0
170 self.modified = False
171 self.isReadOnly = False
172 self.node_selected = []
175 if self.code in ['Adao','ADAO','MAP'] : self.afficheApresInsert=True
176 else : self.afficheApresInsert=False
177 if self.code in ['TELEMAC',] : self.enteteQTree='premier'
178 else : self.enteteQTree='complet'
179 if self.code in ['Adao','ADAO','TELEMAC'] : self.affichePlie=True
180 else : self.affichePlie=False
182 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
184 #------- construction du jdc --------------
189 if self.fichier is not None: # fichier jdc fourni
190 self.fileInfo = QFileInfo(self.fichier)
191 self.fileInfo.setCaching(0)
194 self.jdc = self.readFile(self.fichier)
196 # print ("mauvaise lecture")
199 if self.jdc is not None and units is not None:
200 self.jdc.recorded_units=units
201 self.jdc.old_recorded_units=units
203 if not self.jdc: # nouveau jdc
205 self.jdc = self._newJDC(units=units)
207 self.jdc = self._newJDCInclude(units=units)
211 self.jdc.appli = self # a resorber
212 self.jdc.editor = self
213 self.jdc.lang = self.appli.langue
214 self.jdc.aReafficher=False
218 txt_exception = self.jdc.cr.get_mess_exception()
221 QApplication.restoreOverrideCursor()
222 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
223 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
225 comploader.charger_composants("QT")
226 jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
227 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
228 self.viewJdcRapport()
232 if jdc_item and self.appliEficas.ssIhm==False:
233 self.tree = browser.JDCTree( jdc_item, self )
234 self.appliEficas.construitMenu()
241 #-------------------# Pour execution avec output et error dans le bash
243 #-------------------#
245 #if self.modified or self.fichier==None : self.saveFile()
248 #lancement avec le .bat
249 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
250 WrapperFilePath = os.path.join(path1, 'PSSEWrapper.py')
252 p = subprocess.Popen(['python',WrapperFilePath])
253 (out,err)=p.communicate()
257 #-------------------# Pour execution avec output et error dans le bash
258 def runPSEN_N1(self):
259 #-------------------#
263 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','ProcessOutputs_Eficas','TreatOutputs'))
264 sys.path.append(path1)
266 if not(self.jdc.isvalid()):
267 QMessageBox.information( self, tr( "Unvalid JDC"),tr("incorrect keywords will be ignored"))
268 if 'dicoImbrique' in generator.plugins:
269 self.generator=generator.plugins['dicoImbrique']()
270 jdc_formate=self.generator.gener(self.jdc)
271 dico=self.generator.Dico
274 #fileDico = r'C:\Logiciels DER\PSEN_V16\Code\ProcessOutputs_Eficas\TreatOutputs\dicoN1.py'
275 fileDico = os.path.join(path1, 'dicoN1.py') #r'C:\Logiciels DER\PSEN_V16\Code\ProcessOutputs_Eficas\TreatOutputs\dicoN1.py'
276 f = open( str(fileDico), 'w')
277 f.write("Dico =" + str(dico) )
282 #print ('in runPSEN_N1', dico)
285 #res,txt_exception=run(dico)
286 #if res : QMessageBox.information( self, tr("fin de script run"), txt_exception)
287 #else : QMessageBox.critical( self, tr("Erreur fatale script run"), txt_exception)
289 #-------------------# Pour execution avec output et error dans le bash
290 def process_N1(self):
291 #-------------------#
293 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','ProcessOutputs_Eficas','TreatOutputs'))
294 sys.path.append(path1)
297 if 'dicoImbrique' in generator.plugins:
298 self.generator=generator.plugins['dicoImbrique']()
299 jdc_formate=self.generator.gener(self.jdc)
300 dico=self.get_Dico() #generator.Dico
303 for k in dico['CONTINGENCY_PROCESSING']:
305 if k[0:19] == 'Component_List_For_' or k[0:21] =='Contingency_List_For_' :
306 newK=k.replace('___',' ')
308 dico['CONTINGENCY_PROCESSING'][l]=dico['CONTINGENCY_PROCESSING'][k]
309 del dico['CONTINGENCY_PROCESSING'][k]
312 fileDico = os.path.join(path1, 'dicoN1_process.py')
313 f = open( str(fileDico), 'w')
314 f.write("Dico =" + str(dico) )
319 #return self.get_Dico()
323 #--------------------------------#
324 def _newJDC( self ,units = None):
325 #--------------------------------#
327 Initialise un nouveau JDC vierge
330 CONTEXT.unset_current_step()
333 if self.code == "CARMELCND" : texte=self._newJDCCND()
334 if self.code == "ZCRACKS" : texte=self._newZCRACKS()
335 if self.code == "TELEMAC" : texte=self._newTELEMAC()
336 if self.code == "PSEN" : texte = self._newPSEN()
337 if self.code == "PSEN_N1" : texte = self._newPSEN_N1()
339 if hasattr(self.readercata.cata[0],'TEXTE_NEW_JDC') : texte=self.readercata.cata[0].TEXTE_NEW_JDC
341 #if self.code == "CF" : texte = self._new_CF()
342 # texte=self.newTexteCND
344 jdc=self.readercata.cata[0].JdC( procedure =texte,
346 cata=self.readercata.cata,
347 cata_ord_dico=self.readercata.cata_ordonne_dico,
348 rep_mat=self.CONFIGURATION.rep_mat
350 jdc.lang = self.appli.langue
351 if units is not None:
352 jdc.recorded_units=units
353 jdc.old_recorded_units=units
354 ## PNPN est ce que la ligne suivante est bien utile ?
355 if texte == "" :jdc.analyse()
358 #--------------------------------#
359 def _newJDCInclude( self ,units = None):
360 #--------------------------------#
362 Initialise un nouveau JDC vierge
364 import Extensions.jdc_include
365 JdC_aux=Extensions.jdc_include.JdC_include
366 CONTEXT.unset_current_step()
368 jaux=self.readercata.cata[0].JdC( procedure="",
370 cata=self.readercata.cata,
371 cata_ord_dico=self.readercata.cata_ordonne_dico,
372 rep_mat=self.CONFIGURATION.rep_mat,
376 J=JdC_aux( procedure="",
378 cata=self.readercata.cata,
379 cata_ord_dico=self.readercata.cata_ordonne_dico,
381 rep_mat=self.CONFIGURATION.rep_mat,
384 if units is not None:
385 J.recorded_units=units
386 J.old_recorded_units=units
390 #-------------------------------#
391 def readFile(self, fn):
392 #--------------------------------#
394 Public slot to read the text from a file.
395 @param fn filename to read from (string or QString)
397 fn = six.text_type(fn)
399 # ------------------------------------------------------------------------------------
401 # ------------------------------------------------------------------------------------
403 jdcName=os.path.basename(fn)
404 # Il faut convertir le contenu du fichier en fonction du format
405 if self.appliEficas.format_fichier_in in convert.plugins:
406 # Le convertisseur existe on l'utilise
408 p=convert.plugins[self.appliEficas.format_fichier_in]()
410 if p.text=="" : self.nouveau=1
411 pareil,texteNew=self.verifieCHECKSUM(p.text)
413 if pareil == False and (self.appliEficas.ssIhm == False) :
414 QMessageBox.warning( self, tr("fichier modifie"),tr("Attention! fichier change hors EFICAS"))
416 memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
417 if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
419 text=p.convert('exec',self.appliEficas)
420 if not p.cr.estvide():
421 self.affiche_infos("Erreur a la conversion",Qt.red)
423 self.affiche_infos("Type de fichier non reconnu",Qt.red)
424 if self.appliEficas.ssIhm == False:
425 QMessageBox.critical( self, tr("Type de fichier non reconnu"),
426 tr("EFICAS ne sait pas ouvrir le type de fichier %s" ,self.appliEficas.format_fichier_in))
429 CONTEXT.unset_current_step()
430 jdc=self.readercata.cata[0].JdC(procedure=text,
432 cata=self.readercata.cata,
433 cata_ord_dico=self.readercata.cata_ordonne_dico,
435 rep_mat=self.CONFIGURATION.rep_mat
437 # ----------------------------------------------------
439 # ----------------------------------------------------
440 self.modified = False
442 # qApp.restoreOverrideCursor()
443 if self.fileInfo!= None :
444 self.lastModified = self.fileInfo.lastModified()
446 self.lastModified = 1
447 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
448 self.appliEficas.setWindowTitle(nouveauTitre)
452 #-----------------------#
453 def get_source(self,file):
454 #-----------------------#
456 # Il faut convertir le contenu du fichier en fonction du format
457 if self.format in convert.plugins :
458 # Le convertisseur existe on l'utilise
459 p=convert.plugins[self.format]()
461 text=p.convert('execnoparseur')
462 if not p.cr.estvide():
463 self.affiche_infos("Erreur a la conversion",Qt.red)
466 # Il n'existe pas c'est une erreur
467 self.affiche_infos("Type de fichier non reconnu",Qt.red)
468 QMessageBox.critical( self, tr("Type de fichier non reconnu"),tr("EFICAS ne sait pas ouvrir ce type de fichier"))
471 #-----------------------------------------------------------------------#
472 def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
473 #--------------------------------------------------------------------#
474 w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
478 #----------------------------------------------#
479 def __generateTempFilename(self, prefix, suffix):
480 #----------------------------------------------#
482 (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
488 #----------------------------------------------#
489 def _viewTextExecute(self, txt, prefix, suffix):
490 #----------------------------------------------#
491 self.w = ViewText( self.QWParent )
492 self.w.setWindowTitle( "execution" )
493 self.monExe=QProcess(self.w)
494 pid=self.monExe.pid()
495 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
496 f=open(nomFichier,'w')
499 self.monExe.readyReadStandardOutput.connect( self.readFromStdOut)
500 self.monExe.readyReadStandardError.connect( self.readFromStdErr)
501 exe='sh ' + nomFichier
502 self.monExe.start(exe)
503 self.monExe.closeWriteChannel()
506 commande="rm "+ nomFichier
511 def readFromStdErr(self):
512 a=self.monExe.readAllStandardError()
513 self.w.view.append(str(a.data()))
515 def readFromStdOut(self) :
516 a=self.monExe.readAllStandardOutput()
517 self.w.view.append(str(a.data()))
519 def readFromStdErrQT4(self):
520 a=self.monExe.readAllStandardError()
521 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
523 def readFromStdOutQT4(self) :
524 a=self.monExe.readAllStandardOutput()
525 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
527 #-----------------------#
529 #-----------------------#
530 if 'dico' in generator.plugins:
531 self.generator=generator.plugins['dico']()
532 jdc_formate=self.generator.gener(self.jdc)
533 dico=self.generator.Dico
536 #-----------------------#
537 def gestionParam(self):
538 #-----------------------#
539 w = MonWidgetCreeParam( self)
542 #-----------------------#
543 def viewJdcSource(self):
544 #-----------------------#
545 if self.fichier == None : return
546 f=open(self.fichier,'r')
549 self._viewText(texteSource, "JDC_SOURCE")
551 #-----------------------#
553 #-----------------------#
554 strSource = str( self.get_text_JDC(self.format) )
555 self._viewText(strSource, "JDC_RESULTAT")
557 #-----------------------#
558 def viewJdcRapport(self):
559 #-----------------------#
560 strRapport = six.text_type( self.jdc.report() )
561 # on ajoute les regles
563 self._viewText(strRapport, "JDC_RAPPORT")
565 #-----------------------#
566 def viewJdcRegles(self):
567 #-----------------------#
568 if self.tree :self.tree.AppelleBuildLBRegles()
575 Public method called by the viewmanager to finally get rid of us.
581 #----------------------------------------------#
582 def affiche_infos(self,message,couleur=Qt.black):
583 #----------------------------------------------#
585 mapalette=self.sb.palette()
586 mapalette.setColor( QPalette.WindowText, couleur )
587 self.sb.setPalette( mapalette );
588 self.sb.showMessage(message,4000)
591 #------------------------------#
592 def affiche_alerte(self,titre,message):
593 #------------------------------#
594 # appele par I_MACRO_ETAPE
595 QMessageBox.information( self, titre, message)
597 #-----------------------------------#
598 def affiche_commentaire(self,message):
599 #-----------------------------------#
600 self.labelCommentaire.setText(message)
601 QTimer.singleShot(6000, self.rendInvisible)
603 #----------------------#
604 def rendInvisible(self):
605 #----------------------#
606 self.labelCommentaire.setText("")
608 #-------------------#
609 def init_modif(self):
610 #-------------------#
612 Met l'attribut modified a 'o' : utilise par Eficas pour savoir
613 si un JDC doit etre sauvegarde avant destruction ou non
617 #---------------------------------------#
618 def chercheNoeudSelectionne(self,copie=1):
619 #---------------------------------------#
621 appele par Cut et Copy pour positionner self.node_selected
623 self.node_selected=[]
624 if len(self.tree.selectedItems()) == 0 : return
625 self.node_selected=self.tree.selectedItems()
628 #---------------------#
629 def handleSupprimer(self):
630 #---------------------#
631 self.chercheNoeudSelectionne()
632 if len(self.node_selected) == 0 : return
633 self.QWParent.noeud_a_editer = []
634 if self.node_selected[0]==self.tree.racine: return
635 if len(self.node_selected) == 1 : self.node_selected[0].delete()
636 else : self.node_selected[0].deleteMultiple(self.node_selected)
638 #---------------------#
639 def handleRechercher(self):
640 #---------------------#
641 from .monRecherche import DRecherche
642 monRechercheDialg=DRecherche(parent=self,fl=0)
643 monRechercheDialg.show()
646 #--------------------------------#
647 def handleRechercherDsCatalogue(self):
648 #-----------------------------#
649 from .monRechercheCatalogue import DRechercheCatalogue
650 monRechercheDialg=DRechercheCatalogue(self.QWParent,self)
651 monRechercheDialg.show()
653 #---------------------#
654 def handleDeplier(self):
655 #---------------------#
656 if self.tree == None : return
657 #self.tree.collapseAll()
660 self.tree.expandItem(self.tree.topLevelItem(0))
662 if self.fenetreCentraleAffichee != None :
663 if hasattr(self.fenetreCentraleAffichee.node,'plieToutEtReaffiche'):
664 self.fenetreCentraleAffichee.node.plieToutEtReaffiche()
667 self.tree.expandItem(self.tree.topLevelItem(0))
669 if self.fenetreCentraleAffichee != None :
670 if hasattr(self.fenetreCentraleAffichee.node,'deplieToutEtReaffiche'):
671 self.fenetreCentraleAffichee.node.deplieToutEtReaffiche()
673 #---------------------#
674 def handleEditCut(self):
675 #---------------------#
677 Stocke dans Eficas.noeud_a_editer le noeud a couper
679 #print "handleEditCut"
680 self.chercheNoeudSelectionne()
681 self.QWParent.edit="couper"
682 self.QWParent.noeud_a_editer = self.node_selected
684 #-----------------------#
685 def handleEditCopy(self):
686 #-----------------------#
688 Stocke dans Eficas.noeud_a_editer le noeud a copier
690 self.chercheNoeudSelectionne()
691 if len(self.node_selected) == 0 : return
692 if len(self.node_selected) == 1 : self.node_selected[0].update_node_label_in_blue()
693 else : self.node_selected[0].update_plusieurs_node_label_in_blue(self.node_selected)
694 self.QWParent.edit="copier"
695 self.QWParent.noeud_a_editer = self.node_selected
697 #------------------------#
698 def handleEditPaste(self):
699 #------------------------#
701 Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
702 Ne permet que la copie d'objets de type Commande ou MCF
704 self.chercheNoeudSelectionne()
705 if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
706 QMessageBox.information( self,
707 tr("Copie impossible"),
708 tr("Veuillez selectionner un objet a copier"))
710 if len(self.node_selected) != 1 :
711 QMessageBox.information( self,
712 tr("Copie impossible"),
713 tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
716 if len(self.QWParent.noeud_a_editer)!=1:
717 self.handleEditPasteMultiple()
720 noeudOuColler=self.node_selected[0]
722 if noeudOuColler == self.tree.racine:
726 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
727 indexNoeudOuColler=self.getTreeIndex(noeudOuColler)
730 noeudACopier=self.QWParent.noeud_a_editer[0]
731 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
732 indexNoeudACopier=self.getTreeIndex(noeudACopier)
734 QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
737 if (self.QWParent.edit != "couper"):
739 if noeudOuColler == self.tree.racine :
740 child=noeudOuColler.doPastePremier(noeudACopier)
742 child=noeudACopier.doPaste(noeudOuColler,pos)
743 if child==None or child==0:
744 QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
746 self.affiche_infos("Copie refusee",Qt.red)
747 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
749 nom=noeudACopier.item.sd.nom
750 child.item.nomme_sd(nom)
757 traceback.print_exc()
758 QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
760 self.affiche_infos("Copie refusee",Qt.red)
763 # il faut declarer le JDCDisplay_courant modifie
764 # suppression eventuelle du noeud selectionne
765 # si possible on renomme l objet comme le noeud couper
767 if (self.QWParent.edit == "couper"):
768 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
769 QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
773 # indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
774 indexNoeudACopier=self.getTreeIndex(noeudACopier)
775 noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
776 noeudACopier.treeParent.build_children()
781 self.QWParent.noeud_a_editer=[]
783 # on rend la copie a nouveau possible en liberant le flag edit
784 self.QWParent.edit="copier"
785 noeudACopier.select()
787 #----------------------------------#
788 def handleDeplaceMultiple(self):
789 #----------------------------------#
792 #----------------------------------#
793 def handleEditPasteMultiple(self):
794 #----------------------------------#
796 # On ne garde que les niveaux "Etape"
797 # On insere dans l'ordre du JDC
798 listeNoeudsACouper=[]
802 from InterfaceQT4 import compojdc
803 noeudOuColler=self.node_selected[0]
804 if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
805 QMessageBox.information( self,
806 tr("Copie impossible a cet endroit",),
807 tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
809 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
811 for noeud in self.QWParent.noeud_a_editer :
812 if not (isinstance(noeud.treeParent, compojdc.Node)): continue
813 indexInTree=noeud.treeParent.children.index(noeud)
815 for index in listeIndex:
816 if index < indexInTree : indice = indice +1
817 listeIndex.insert(indice, indexInTree)
818 listeNoeudsACouper.insert(indice, noeud)
820 noeudJdc=noeudOuColler.treeParent
822 # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
824 for index in listeIndex:
826 if indexNoeudOuColler < index:
827 indexTravail=indexTravail+dejaCrees
828 noeudOuColler=noeudJdc.children[indexNoeudOuColler]
829 noeud=noeudJdc.children[indexTravail]
830 child=noeud.doPaste(noeudOuColler)
831 listeChild.append(child)
832 dejaCrees=dejaCrees+1
834 self.QWParent.noeud_a_editer = []
835 for i in range(len(listeIndex)):
836 noeud=noeudJdc.children[indexNoeudOuColler+1+i]
837 self.QWParent.noeud_a_editer.append(noeud)
840 if self.QWParent.edit !="couper" : return
842 for index in listeIndex:
844 if indexNoeudOuColler < index:
845 indexTravail=indexTravail+(len(listeIndex))
846 noeud=noeudJdc.children[indexTravail]
848 listeItem.append(noeud.item)
849 listeASupprimer.append(noeud)
851 for i in range(len(listeChild)):
852 self.tree.item.suppitem(listeItem[i])
853 listeChild[i].item.update(listeItem[i])
855 self.QWParent.noeud_a_editer = []
858 #---------------------#
859 def getFileName(self):
860 #---------------------#
863 #---------------------------#
864 def get_file_variable(self) :
865 #---------------------------#
866 titre = tr("Choix d'un fichier XML")
867 texte = tr("Le fichier contient une commande MODEL\n")
868 texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
869 QMessageBox.information( self, titre,tr(texte))
871 fichier = QFileDialog.getOpenFileName(self.appliEficas,
872 tr('Ouvrir Fichier'),
873 self.appliEficas.CONFIGURATION.savedir,
874 tr('Wrapper Files (*.xml);;''All Files (*)'))
877 #--------------------------------------------------#
878 def writeFile(self, fn, txt = None,formatLigne="beautifie"):
879 #--------------------------------------------------#
881 Public slot to write the text to a file.
883 @param fn filename to write to string
884 @return flag indicating success
887 fn = six.text_type(fn)
890 txt = self.get_text_JDC(self.format,formatLigne=formatLigne)
892 if len(txt) >= len(eol):
893 if txt[-len(eol):] != eol:
897 txt=self.ajoutVersionCataDsJDC(txt)
898 checksum=self.get_checksum(txt)
900 if self.code=="TELEMAC" : return 1
906 except IOError as why:
907 if (self.appliEficas.ssIhm == False):
908 QMessageBox.critical(self, tr('Sauvegarde du Fichier'),
909 tr('Le fichier')+str(fn) + tr('n a pas pu etre sauvegarde : ') + str(why))
914 #-----------------------------------------------------------#
915 def get_text_JDC(self,format,pourRun=0,formatLigne="beautifie"):
916 #-----------------------------------------------------------#
917 if self.code == "MAP" and not(format in generator.plugins): format = "MAP"
918 if format in generator.plugins:
920 # Le generateur existe on l'utilise
921 self.generator=generator.plugins[format]()
923 jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.CONFIGURATION,appli=self.appliEficas)
924 if pourRun : jdc_formate=self.generator.textePourRun
925 except ValueError as e:
926 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
929 if not self.generator.cr.estvide():
930 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
931 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
936 # Il n'existe pas c'est une erreur
937 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
938 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
941 #----------------------#
943 #---------------------#
944 if 'dicoImbrique' in generator.plugins:
945 self.generator=generator.plugins['dicoImbrique']()
946 jdc_formate=self.generator.gener(self.jdc)
947 dico=self.generator.Dico
950 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
951 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
958 fonction="run"+self.code
960 if fonction in JDCEditor.__dict__: JDCEditor.__dict__[fonction],(self,)
965 fonction="saveRun"+self.code
966 if fonction in JDCEditor.__dict__: JDCEditor.__dict__[fonction],(self,)
972 if not(self.jdc.isvalid()):
973 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
975 if len(self.jdc.etapes) != 1 :
976 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
978 if self.modified or self.fichier==None :
979 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
980 texte=self.get_text_JDC("MAP")
981 self.writeFile( self.fichierMapInput, txt = texte)
983 self.fichierMapInput=self.fichier
984 composant=self.jdc.etapes[0].nom.lower()[0:-5]
987 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
988 # then instantiate corresponding class and call getUseSalome() method
990 from mapengine.spec import factory
991 mapComponent = factory.new(composant)[0]
994 if mapComponent.getUseSalome():
995 command += " -r sappli"
996 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
999 self._viewTextExecute( textePython,"map_run",".sh")
1001 # commande="rm "+self.fichierMapInput
1002 # os.system(commande)
1005 except Exception as e:
1006 print((traceback.print_exc()))
1008 #-------------------#
1009 def runZCRACKS(self):
1010 #-------------------#
1011 if not(self.jdc.isvalid()):
1012 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
1014 if self.modified or self.fichier==None :
1016 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
1017 texte=self.get_text_JDC("ZCRACKS",pourRun=1)
1018 self.writeFile( self.fichierZcracksInput, txt = texte)
1020 self.fichierZcracksInput=self.fichier
1022 #commande ="Zrun -zp "
1024 textePython=(commande + self.fichierZcracksInput)
1025 self._viewTextExecute( textePython,"run_zcracks",".sh")
1026 except Exception as e:
1027 print((traceback.print_exc()))
1029 #-------------------#
1030 def runCARMELCND(self):
1031 #-------------------#
1032 #if not(self.jdc.isvalid()):
1033 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
1035 if self.modified or self.fichier==None :
1036 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
1038 if not hasattr(self,'generator'): texte=self.get_text_JDC(self.format)
1039 from PrepareRunCarmel import prepareRunCarmel
1040 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
1041 repMed=os.path.dirname(self.fichier)
1042 repExeCarmel=self.generator.get_repExeCarmel()
1043 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
1044 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
1045 f=open(nomFichier,'w')
1046 f.write(textePython)
1048 commande="xterm -e sh "+nomFichier +"\n"
1051 #-------------------#
1052 def runCarmelCS(self):
1053 #-------------------#
1055 commande="runSession pilotyacsCS.py"
1057 except Exception as e:
1058 print((traceback.print_exc()))
1060 #-----------------------------------------------------#
1061 def determineNomFichier(self,path,extension):
1062 #-----------------------------------------------------#
1063 if self.appli.code in DictExtensions:
1064 chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
1065 extensions= tr(chaine1+ "All Files (*)")
1067 extensions= tr("JDC (*.comm);;" "All Files (*)")
1069 if self.appli.code == "MAP" :
1070 extensions = extensions + ";; Run (*.input);;"
1072 fn = QFileDialog.getSaveFileName( self,
1073 tr("sauvegarde"), path,
1075 QFileDialog.DontConfirmOverwrite)
1076 if fn == None : return (0, None)
1078 if fn=='': return (0, None)
1080 ext = QFileInfo(fn).suffix()
1081 if ext == '': fn+=extension
1083 if QFileInfo(fn).exists():
1084 msgBox = QMessageBox(self)
1085 msgBox.setWindowTitle(tr("Sauvegarde du Fichier"))
1086 msgBox.setText(tr("Le fichier <b>%s</b> existe deja.", six.text_type(fn)))
1087 msgBox.addButton(tr("&Ecraser"),0)
1088 msgBox.addButton(tr("&Abandonner"),1)
1089 abort=msgBox.exec_()
1090 if abort == 1 : return (0, "")
1094 def saveRunMAP(self):
1097 if not(self.jdc.isvalid()):
1098 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
1099 tr("Un JdC valide est necessaire pour creer un .input")
1103 composant=self.jdc.etapes[0].nom.lower()[0:-5]
1105 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
1106 tr("Choix du composant obligatoire")
1109 if hasattr(self.CONFIGURATION, "savedir"): path=self.CONFIGURATION.savedir
1113 if self.fichier is not None and self.fichier != "" :
1114 maBase=str(QFileInfo(self.fichier).baseName())+".input"
1115 monPath=str(QFileInfo(self.fichier).absolutePath())
1116 monNomFichier=os.path.join(monPath,maBase)
1117 elif hasattr(self,'monNomFichierInput'):
1118 monNomFichier=self.monNomFichierInput
1121 monDialog=QFileDialog(self.appliEficas)
1122 monDialog.setDirectory (path)
1123 monDialog.setWindowTitle ("Save")
1125 for c in monDialog.children():
1126 if isinstance(c,QDialogButtonBox):
1127 for b in c.children():
1128 if isinstance(b,QPushButton):
1130 if avant=="&Open": b.setText("Save")
1131 mesFiltres= "input Map (*.input);;All Files (*)"
1132 monDialog.setNameFilters(mesFiltres)
1133 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
1134 BOk=monDialog.exec_()
1136 fn=str(monDialog.selectedFiles()[0])
1137 if fn == "" or fn == None : return
1138 if not fn.endswith(".input"):
1140 self.monNomFichierInput=fn
1142 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
1143 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
1144 texte=self.get_text_JDC("MAP")
1145 self.writeFile( self.fichierMapInput, txt = texte)
1147 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
1148 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
1149 (output, err) = p.communicate()
1153 def saveRunPSEN(self):
1155 #print ("saveRunPSEN")
1159 #-----------------------------------------#
1160 def cherche_Groupes(self):
1161 #-----------------------------------------#
1162 listeMA,listeNO=self.get_text_JDC("GroupMA")
1163 return listeMA,listeNO
1165 #-----------------------------------------#
1166 def cherche_Dico(self):
1167 #-----------------------------------------#
1169 format = self.appliEficas.format_fichier
1170 if format in generator.plugins:
1171 # Le generateur existe on l'utilise
1172 self.generator=generator.plugins[format]()
1173 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
1174 dicoCourant=self.generator.dico
1179 #-----------------------------------------#
1180 def handleAjoutGroup(self,listeGroup):
1181 #-----------------------------------------#
1184 from ajoutGroupe import handleAjoutGroupFiltre
1186 handleAjoutGroupFiltre(self,listeGroup)
1187 #print "apres handleAjoutGroupFiltre"
1192 #-----------------------------------------------------------------#
1193 def saveFileLeger(self, path = None, saveas= 0,formatLigne="beautifie"):
1194 #-----------------------------------------------------------------#
1197 #saveas=True # Pour forcer le nom
1198 self.generator=generator.plugins[self.format]()
1199 if self.fichier is None or saveas:
1200 if path is None: path=self.CONFIGURATION.savedir
1201 bOK, fn=self.determineNomFichier(path,extension)
1202 if bOK == 0 : return (0, None)
1203 if fn == None : return (0, None)
1204 if fn== '' : return (0, None)
1206 ulfile = os.path.abspath(six.text_type(fn))
1207 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1208 fn = six.text_type(QDir.toNativeSeparators(fn))
1210 self.fichier = os.path.splitext(fn)[0]+extension
1212 if hasattr(self.generator, "writeLeger"):
1213 self.generator.writeLeger(self.fichier,self.jdc,config=self.appliEficas.CONFIGURATION,appli=self.appliEficas)
1215 if self.salome : self.appliEficas.addJdcInSalome( self.fichier)
1218 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1219 self.appliEficas.setWindowTitle(nouveauTitre)
1220 return (1, self.fichier)
1222 #-----------------------------------------------------------------#
1223 def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"):
1224 #-----------------------------------------------------------------#
1226 Public slot to save the text to a file.
1228 @param path directory to save the file in (string or QString)
1229 @return tuple of two values (boolean, string) giving a success indicator and
1230 the name of the saved file
1233 print (self.generDico())
1235 if not self.modified and not saveas:
1236 return (0, None) # do nothing if text wasn't changed
1238 if self.appli.code in DictExtensions :
1239 extension=DictExtensions[self.appli.code]
1245 if self.fichier is None or saveas:
1246 if path is None: path=self.CONFIGURATION.savedir
1247 bOK, fn=self.determineNomFichier(path,extension)
1248 if bOK == 0 : return (0, None)
1249 if fn == None : return (0, None)
1250 if fn== '' : return (0, None)
1252 ulfile = os.path.abspath(six.text_type(fn))
1253 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1254 fn = six.text_type(QDir.toNativeSeparators(fn))
1258 if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None)
1260 self.modified = False
1261 if self.fileInfo is None or saveas:
1262 self.fileInfo = QFileInfo(self.fichier)
1263 self.fileInfo.setCaching(0)
1264 self.lastModified = self.fileInfo.lastModified()
1265 if newName is not None:
1266 self.appliEficas.addToRecentList(newName)
1267 self.tree.racine.item.getObject().nom=os.path.basename(newName)
1268 self.tree.racine.update_node_label()
1270 if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
1271 self.generator.writeDefault(fn)
1272 elif self.code=="TELEMAC" and hasattr(self.generator, "writeDefault"):
1273 self.generator.writeDefault(fn)
1276 self.appliEficas.addJdcInSalome( self.fichier)
1278 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1279 self.appliEficas.setWindowTitle(nouveauTitre)
1281 return (1, self.fichier)
1284 #----------------------------------------------#
1285 def sauveLigneFile(self):
1286 #----------------------------------------------#
1288 return self.saveFile(formatLigne="Ligne")
1291 #----------------------------------------------#
1292 def saveFileAs(self, path = None,fileName=None):
1293 #----------------------------------------------#
1295 Public slot to save a file with a new name.
1297 @param path directory to save the file in (string or QString)
1298 @return tuple of two values (boolean, string) giving a success indicator and
1299 the name of the saved file
1301 if fileName != None :
1302 self.fichier = fileName
1303 return self.saveFile()
1304 return self.saveFile(path,1,"beautifie")
1308 #---------------------------------------------#
1309 def get_file(self,unite=None,fic_origine = ''):
1310 #---------------------------------------------#
1318 titre = tr("Choix unite %d ", unite)
1319 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
1320 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
1321 labeltexte = tr('Fichier pour unite ') + repr( unite)
1323 titre = tr("Choix d'un fichier de poursuite")
1324 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
1325 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
1327 QMessageBox.information( self, titre,texte)
1328 fn = QFileDialog.getOpenFileName(self.appliEficas,
1330 self.appliEficas.CONFIGURATION.savedir)
1332 # ce retour est impose par le get_file d'I_JDC
1333 if fn== '' : return None," "
1334 if not fn : return (0, " ")
1337 ulfile = os.path.abspath(six.text_type(fn))
1338 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1340 # On utilise le convertisseur defini par format_fichier
1341 source=self.get_source(ulfile)
1343 # On a reussia convertir le fichier self.ulfile
1346 # Une erreur a ete rencontree
1348 return ulfile, jdcText
1350 #-------------------------------#
1351 def updateJdc(self, itemApres,texte):
1352 #--------------------------------#
1354 etape=monItem.item.object
1356 CONTEXT.set_current_step(etape)
1357 etape.build_includeInclude(texte)
1358 self.tree.racine.build_children()
1360 #-------------------------------------#
1361 def deleteEtape(self,etape):
1362 #-------------------------------------#
1363 self.jdc.suppentite(etape)
1365 #-------------------------------------#
1366 def deleteMC(self,etape,MCFils,listeAvant=()):
1367 #-------------------------------------#
1369 for mot in listeAvant :
1370 ouChercher=ouChercher.get_child(mot,restreint="oui")
1371 monMC=ouChercher.get_child(MCFils,restreint="oui")
1372 if monMC != None : ouChercher.suppentite(monMC)
1373 ouChercher.state='changed'
1374 ouChercher.isvalid()
1376 #-------------------------------------#
1377 def ajoutMC(self,etape,MCFils,valeurs,listeAvant=()):
1378 #-------------------------------------#
1380 for mot in listeAvant :
1381 ouChercher=ouChercher.get_child(mot,restreint="oui")
1382 monMC=etape.get_child(ouChercher,restreint="oui")
1383 if monMC== None : monMC= ouChercher.addentite(MCFils)
1384 monMC.valeur=valeurs
1386 monMC.state='changed'
1389 #-----------------------------------------------------------#
1390 def changeIntoMC(self,etape,MCFils,valeurs, listeAvant=()):
1391 #-----------------------------------------------------------#
1393 for mot in listeAvant :
1394 ouChercher=ouChercher.get_child(mot,restreint="oui")
1395 if ouChercher ==None : print ('SOUCI'); return
1396 monMC=ouChercher.get_child(MCFils,restreint="oui")
1397 if monMC== None : monMC= ouChercher.addentite(MCFils)
1398 monMC.definition.into=valeurs
1399 monMC.state='changed'
1402 #-------------------------------------#
1403 def changeIntoDefMC(self,etape,listeMC,valeurs):
1404 #-------------------------------------#
1405 definitionEtape=getattr(self.jdc.cata[0],etape)
1406 ouChercher=definitionEtape
1407 if len(listeMC) > 1 :
1408 for mc in listeMC[0:-1]:
1409 mcfact=ouChercher.entites[mc]
1412 mcAccas=ouChercher.entites[listeMC[-1]]
1413 mcAccas.into=valeurs
1415 #-------------------------------------------------------------#
1416 def deleteDefinitionMC(self,etape,listeAvant,nomDuMC):
1417 #-------------------------------------------------------------#
1418 #print 'in deleteDefinitionMC', etape,listeAvant,nomDuMC
1419 definitionEtape=getattr(self.jdc.cata[0],etape)
1420 ouChercher=definitionEtape
1421 for k in listeAvant :
1422 ouChercher=ouChercher.entites[k]
1423 MCADetruire=ouChercher.entites[nomDuMC]
1424 ouChercher.ordre_mc.remove(nomDuMC)
1425 del ouChercher.entites[nomDuMC]
1426 del self.dicoNouveauxMC[nomDuMC]
1429 #-------------------------------------------------------------#
1430 def ajoutDefinitionMC(self,etape,listeAvant,nomDuMC,typ,**args):
1431 #-------------------------------------------------------------#
1432 definitionEtape=getattr(self.jdc.cata[0],etape)
1433 ouChercher=definitionEtape
1434 for k in listeAvant :
1435 ouChercher=ouChercher.entites[k]
1436 from Accas import A_SIMP
1437 Nouveau=A_SIMP.SIMP(typ,**args)
1438 Nouveau.pere=ouChercher
1441 ouChercher.entites[nomDuMC]=Nouveau
1442 ouChercher.ordre_mc.append(nomDuMC)
1443 self.dicoNouveauxMC[nomDuMC]=('ajoutDefinitionMC',etape,listeAvant,nomDuMC,typ,args)
1444 #print self.dicoNouveauxMC
1446 #----------------------------------------------------#
1447 def changeIntoMCandSet(self,etape,MCFils,into,valeurs):
1448 #----------------------------------------------------#
1449 monMC=etape.get_child(MCFils,restreint="oui")
1450 if monMC== None : monMC= etape.addentite(MCFils)
1451 monMC.definition.into=into
1452 monMC.valeur=valeurs
1454 monMC.state='changed'
1457 #-------------------------------------#
1458 def ajoutVersionCataDsJDC(self,txt):
1459 #-------------------------------------#
1460 if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
1461 ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata[0].VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
1462 texte=txt+ligneVersion
1465 #-------------------------------------#
1466 def verifieVersionCataDuJDC(self,text):
1467 #-------------------------------------#
1469 indexDeb=text.find("#VERSION_CATALOGUE:")
1470 indexFin=text.find(":FIN VERSION_CATALOGUE")
1472 self.versionCataDuJDC="sans"
1475 self.versionCataDuJDC=text[indexDeb+19:indexFin]
1476 textJDC=text[0:indexDeb]+text[indexFin+23:-1]
1478 self.versionCata="sans"
1479 if hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata[0].VERSION_CATALOGUE
1481 if self.versionCata==self.versionCataDuJDC : memeVersion=True
1482 return memeVersion,textJDC
1484 #-------------------------------#
1485 def traduitCatalogue(self,texte):
1486 #-------------------------------#
1487 nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
1488 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
1490 traducteur=__import__(nomTraducteur)
1491 monTraducteur=traducteur.MonTraducteur(texte)
1492 nouveauTexte=monTraducteur.traduit()
1498 #------------------------------#
1499 def verifieCHECKSUM(self,text):
1500 #------------------------------#
1501 indexDeb=text.find("#CHECKSUM:")
1504 indexFin=text.find(":FIN CHECKSUM")
1505 checkAvant=text[indexDeb:indexFin+13]
1506 textJDC=text[0:indexDeb]+text[indexFin+13:-1]
1507 checksum=self.get_checksum(textJDC)
1508 pareil=(checkAvant==checksum)
1509 return pareil, textJDC
1511 #---------------------------#
1512 def get_checksum(self,texte):
1513 #---------------------------#
1514 newtexte=texte.replace('"','\\"')
1515 commande='echo "'+newtexte+'"|md5sum'
1516 a=os.popen(commande)
1519 ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
1523 #---------------------------#
1525 #---------------------------#
1526 texte="CONDUITE_FORCEE();"
1530 #---------------------------#
1531 def _newTELEMAC(self):
1532 #---------------------------#
1533 #texte="INITIALIZATION();BOUNDARY_CONDITIONS();GENERAL_PARAMETERS();PHYSICAL_PARAMETERS();NUMERICAL_PARAMETERS();"
1534 texte="COMPUTATION_ENVIRONMENT();HYDRO();GENERAL_PARAMETERS();NUMERICAL_PARAMETERS()"
1538 #---------------------------#
1540 #---------------------------#
1541 texte="DIRECTORY() ; PSSE_PARAMETERS() ; SIMULATION() ; sansnom=DISTRIBUTION() ; sansnom=DISTRIBUTION() ; CORRELATION() ;"
1545 #---------------------------#
1546 def _newPSEN_N1(self):
1547 #---------------------------#
1548 texte="CASE_SELECTION();N_PROCESSING_OPTIONS();CONTINGENCY_OPTIONS();CONTINGENCY_SELECTION();\nCONTINGENCY_PROCESSING(); "
1549 texte="CONTINGENCY_SELECTION();\nCONTINGENCY_PROCESSING(); "
1552 #---------------------------#
1554 #---------------------------#
1555 def _newZCRACKS(self):
1556 #---------------------------#
1557 texte="MAILLAGES();REMESHING();"
1560 #---------------------------#
1561 def _newJDCCND(self):
1562 #---------------------------#
1563 extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
1565 #if self.salome == 0 :
1566 QMessageBox.information( self,
1568 tr("Veuillez selectionner un fichier Med"))
1569 QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
1570 caption='Fichier Med',
1572 QSfichier=QSfichier[0]
1573 self.fichierMED=QSfichier
1574 from acquiertGroupes import getGroupes
1575 erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
1576 if erreur != "" : print ("a traiter")
1577 texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
1583 for groupe in self.listeGroupes :
1584 if groupe[0:8]=='CURRENT_':
1585 texteSources +=groupe[8:]+"=SOURCE("
1586 texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
1587 if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n"
1588 if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n"
1589 if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n"
1590 if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n"
1591 texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
1592 self.newTexteCND=texte
1597 #---------------------------#
1598 def BoutonFileSelected(self):
1599 #---------------------------#
1601 QSfichier=self.openfile.selectedFiles()[0]
1602 self.fichierMED=str(QSfichier)
1603 from acquiertGroupes import getGroupes
1604 erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
1605 if erreur != "" : print ("a traiter")
1607 #-----------------------------
1608 def BoutonSalomePressed(self):
1609 #----------------------------
1610 Msg,self.listeGroupes=self.appliEficas.ChercheGrpMailleInSalome()
1611 self.fichierMED="A_partir_de_SMESH"
1612 self.nomMaillage="A_partir_de_SMESH"
1613 self.openfile.close()
1616 #-----------------------------------------
1617 def initSplitterSizes(self, nbWidget=3):
1618 #-----------------------------------------
1619 #print ("je passe ds initSplitterSizes", nbWidget)
1621 if self.code in [ 'Adao', 'ADAO', ] : self.splitterSizes3=[1,1550,150]
1622 elif self.code in [ 'MAP'] : self.splitterSizes3=[700,300]
1623 else : self.splitterSizes3=[150,1000,300]
1625 if self.code in [ 'Adao', 'ADAO', ] : self.splitterSizes2=[5,1500]
1626 else : self.splitterSizes2=[300,1000]
1630 #-----------------------------------------
1631 def restoreSplitterSizes(self,nbWidget=3):
1632 #----------------------------------------
1634 #traceback.print_stack()
1635 #print ("je passe ds restoreSplitterSizes")
1636 if not(hasattr(self,'splitter')) : return
1637 if nbWidget==2 : newSizes=self.splitterSizes2
1638 if nbWidget==3 : newSizes=self.splitterSizes3
1639 #self.inhibeSplitter = 1
1640 self.splitter.setSizes(newSizes)
1641 #self.inhibeSplitter = 0
1642 QApplication.processEvents()
1643 # seule la fentetre du milieu est necessaire
1644 self.splitter.widget(1).resizeEvent=self.saveSplitterSizes
1646 #-----------------------------------------
1647 def saveSplitterSizes(self,event):
1648 #-----------------------------------------
1649 #print ("je passe ds saveSplitterSizes")
1650 if self.inhibeSplitter : return
1651 if self.widgetOptionnel == None : self.splitterSizes2 = self.splitter.sizes()[0:2]
1652 else : self.splitterSizes3 = self.splitter.sizes()[0:3]
1654 #------------------------
1655 def fermeOptionnel(self):
1656 #------------------------
1657 if self.widgetOptionnel == None : return
1659 self.inhibeSplitter=1
1660 self.widgetOptionnel.setParent(None)
1661 self.widgetOptionnel.close()
1662 self.widgetOptionnel.deleteLater()
1663 self.widgetOptionnel=None
1664 self.inhibeSplitter=0
1665 self.restoreSplitterSizes(2)
1667 #------------------------
1668 def ajoutOptionnel(self):
1669 #------------------------
1670 #if len(self.splitterSizes) == 2 : self.splitterSizes.append(self.oldSizeWidgetOptionnel)
1671 #else : self.splitterSizes[2] = self.oldSizeWidgetOptionnel # ceinture pour les close bizarres
1672 #self.splitterSizes[1] = self.splitterSizes[1] - self.splitterSizes[2]
1674 self.restoreSplitterSizes(3)
1677 #------------------------
1678 def fermeArbre(self):
1679 #------------------------
1680 #print (self.widgetTree)
1681 self.oldWidgetTree=self.widgetTree
1682 self.widgetTree.hide()
1683 #self.widgetTree=None
1685 #------------------------
1686 def ouvreArbre(self):
1687 #------------------------
1688 #print ('je passe la')
1689 #print (self.widgetTree)
1690 #self.widgetTree=self.oldWidgetTree
1691 self.widgetTree.show()
1692 #self.restoreSplitterSizes(3)
1694 #-----------------------------
1695 def getTreeIndex(self,noeud):
1696 #----------------------------
1698 if noeud in noeud.treeParent.children :
1699 indexNoeud=noeud.treeParent.children.index(noeud)
1701 if hasattr(noeud,'vraiParent') :
1703 noeudVraiParent = noeud.vraiParent
1704 while noeudVraiParent != noeud.treeParent and hasattr(noeudVraiParent,'vraiParent') :
1705 noeudVrai = noeudVraiParent
1706 noeudVraiParent = noeudVraiParent.vraiParent
1708 if noeudVraiParent == noeud.treeParent :
1709 indexNoeud=noeud.treeParent.children.index(noeudVrai)
1715 if __name__ == "__main__":
1717 name='prefs_'+prefs.code
1718 prefsCode=__import__(name)
1721 if hasattr(prefsCode,'encoding'):
1722 # Hack pour changer le codage par defaut des strings
1725 sys.setdefaultencoding(prefs.encoding)
1726 del sys.setdefaultencoding
1731 app = QApplication(sys.argv)
1732 mw = JDCEditor(None,'azAster.comm')
1733 app.setMainWidget(mw)
1734 app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
1737 res = app.exec_loop()