1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 import types,sys,os, re
24 from determine import monEnvQT5
26 from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog, QApplication, QSplitter
27 from PyQt5.QtGui import QPalette
28 from PyQt5.QtCore import QProcess, QFileInfo, QTimer, Qt, QDir, QSize
30 from PyQt4.QtGui import *
31 from PyQt4.QtCore import *
34 from datetime import date
35 from Extensions.i18n import tr
40 import convert, generator
41 from Editeur import session
42 from Editeur import comploader
43 from Editeur import Objecttreeitem
44 from desBaseWidget import Ui_baseWidget
45 from monViewTexte import ViewText
46 from monWidgetCreeParam import MonWidgetCreeParam
50 DictExtensions= {"MAP" : ".map", "TELEMAC" : '.comm'}
55 class JDCEditor(Ui_baseWidget,QWidget):
56 # ----------------------------------------- #
61 def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None):
62 #----------------------------------------------------------------------------------------------------------#
64 QWidget.__init__(self,None)
68 self.widgetOptionnel=None
69 self.fenetreCentraleAffichee=None
70 self.dejaDansPlieTout=False
71 self.afficheCommandesPliees = True
72 self.listeDesListesOuvertes=set()
73 self.appliEficas = appli
74 self.appli = appli #---- attendu par IHM
76 self.fichier = fichier
79 self.QWParent = QWParent
80 self.couleur = Qt.black
83 self.salome = self.appliEficas.salome
86 print "dans JDC pas d appli ????????"
88 # ces attributs sont mis a jour par definitCode appelee par newEditor
89 self.code = self.appliEficas.CONFIGURATION.code
91 #self.afficheListesPliees=False
92 self.afficheListesPliees=True
93 if self.code == "ASTER" or self.code == "monCode" : self.afficheListesPliees =True
94 if self.code == 'PSEN_N1' : self.afficheListesPliees = False
96 self.mode_nouv_commande=self.appliEficas.CONFIGURATION.mode_nouv_commande
97 self.closeAutreCommande=self.appliEficas.CONFIGURATION.closeAutreCommande
98 self.closeFrameRechercheCommande=self.appliEficas.CONFIGURATION.closeFrameRechercheCommande
99 self.closeArbre=self.appliEficas.CONFIGURATION.closeArbre
100 self.affiche=self.appliEficas.CONFIGURATION.affiche
101 #self.taille = self.appliEficas.taille
103 #if self.code in ['MAP','CARMELCND','PSEN'] : self.afficheCommandesPliees=False
104 if self.code in ['MAP','CARMELCND'] : self.afficheCommandesPliees=False
105 if self.code in ['MAP',]:
106 self.widgetTree.close()
109 self.widgetTree.close()
114 self.version_code = session.d_env.cata
116 if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.multi==True:
117 self.readercata = readercata.READERCATA( self, self.appliEficas )
118 self.appliEficas.readercata=self.readercata
119 self.appliEficas.code=self.code
121 self.readercata=self.appliEficas.readercata
122 if self.readercata.fic_cata == None : return #Sortie Salome
123 self.titre=self.readercata.titre
124 self.Ordre_Des_Commandes=self.readercata.Ordre_Des_Commandes
125 self.Classement_Commandes_Ds_Arbre=self.readercata.Classement_Commandes_Ds_Arbre
127 self.format = self.appliEficas.format_fichier
130 self.liste_simp_reel=[]
132 self.dicoNouveauxMC={}
134 nameConf='configuration_'+self.code
135 configuration=__import__(nameConf)
136 self.CONFIGURATION = self.appliEficas.CONFIGURATION
137 self.CONFIGStyle = self.appliEficas.CONFIGStyle
140 self.CONFIGURATION.generator_module
141 _module = __import__(self.CONFIGURATION.generator_module)
142 info = _module.entryPoint()
143 generator.plugins.addEntryPoint(info)
148 self.CONFIGURATION.convert_module
149 #print self.CONFIGURATION.convert_module
150 _module = __import__(self.CONFIGURATION.convert_module)
151 info = _module.entryPoint()
152 convert.plugins.addEntryPoint(info)
157 if hasattr(self.appliEficas,"statusBar"):
158 self.sb = self.appliEficas.statusBar()
161 self.lastModified = 0
163 self.modified = False
164 self.isReadOnly = False
165 self.node_selected = []
168 if self.code in ['Adao','ADAO','MAP'] : self.afficheApresInsert=True
169 else : self.afficheApresInsert=False
170 if self.code in ['TELEMAC',] : self.enteteQTree='premier'
171 else : self.enteteQTree='complet'
172 if self.code in ['Adao','ADAO','TELEMAC'] : self.affichePlie=True
173 else : self.affichePlie=False
175 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
177 #------- construction du jdc --------------
182 if self.fichier is not None: # fichier jdc fourni
183 self.fileInfo = QFileInfo(self.fichier)
184 self.fileInfo.setCaching(0)
188 self.jdc = self.readFile(self.fichier)
191 print "mauvaise lecture"
194 if self.jdc is not None and units is not None:
195 self.jdc.recorded_units=units
196 self.jdc.old_recorded_units=units
198 if not self.jdc: # nouveau jdc
200 self.jdc = self._newJDC(units=units)
202 self.jdc = self._newJDCInclude(units=units)
206 self.jdc.appli = self # a resorber
207 self.jdc.editor = self
208 self.jdc.lang = self.appli.langue
209 self.jdc.aReafficher=False
213 txt_exception = self.jdc.cr.get_mess_exception()
216 QApplication.restoreOverrideCursor()
217 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
218 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
220 comploader.charger_composants("QT")
221 jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
222 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
223 self.viewJdcRapport()
227 if jdc_item and self.appliEficas.ssIhm==False:
228 self.tree = browser.JDCTree( jdc_item, self )
229 self.appliEficas.construitMenu()
236 #-------------------# Pour execution avec output et error dans le bash
238 #-------------------#
239 #if self.modified or self.fichier==None : self.saveFile()
242 #lancement avec le .bat
243 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
244 WrapperFilePath = os.path.join(path1, 'PSSEWrapper.py')
246 p = subprocess.Popen(['python',WrapperFilePath])
247 (out,err)=p.communicate()
251 #-------------------# Pour execution avec output et error dans le bash
252 def runPSEN_N1(self):
253 #-------------------#
257 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','ProcessOutputs_Eficas','TreatOutputs'))
258 sys.path.append(path1)
260 if not(self.jdc.isvalid()):
261 QMessageBox.information( self, tr( "Unvalid JDC"),tr("incorrect keywords will be ignored"))
262 if generator.plugins.has_key('dicoImbrique'):
263 self.generator=generator.plugins['dicoImbrique']()
264 jdc_formate=self.generator.gener(self.jdc)
265 dico=self.generator.Dico
268 #fileDico = r'C:\Logiciels DER\PSEN_V16\Code\ProcessOutputs_Eficas\TreatOutputs\dicoN1.py'
269 fileDico = os.path.join(path1, 'dicoN1.py') #r'C:\Logiciels DER\PSEN_V16\Code\ProcessOutputs_Eficas\TreatOutputs\dicoN1.py'
270 f = open( str(fileDico), 'wb')
271 f.write("Dico =" + str(dico) )
276 print 'in runPSEN_N1', dico
279 #res,txt_exception=run(dico)
280 #if res : QMessageBox.information( self, tr("fin de script run"), txt_exception)
281 #else : QMessageBox.critical( self, tr("Erreur fatale script run"), txt_exception)
283 #-------------------# Pour execution avec output et error dans le bash
284 def process_N1(self):
285 #-------------------#
287 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','ProcessOutputs_Eficas','TreatOutputs'))
288 sys.path.append(path1)
291 if generator.plugins.has_key('dicoImbrique'):
292 self.generator=generator.plugins['dicoImbrique']()
293 jdc_formate=self.generator.gener(self.jdc)
294 dico=self.get_Dico() #generator.Dico
297 for k in dico['CONTINGENCY_PROCESSING'].keys():
300 if k[0:19] == 'Component_List_For_' or k[0:21] =='Contingency_List_For_' :
301 newK=k.replace('___',' ')
303 dico['CONTINGENCY_PROCESSING'][l]=dico['CONTINGENCY_PROCESSING'][k]
304 del dico['CONTINGENCY_PROCESSING'][k]
307 fileDico = os.path.join(path1, 'dicoN1_process.py')
308 f = open( str(fileDico), 'wb')
309 f.write("Dico =" + str(dico) )
314 #return self.get_Dico()
318 #--------------------------------#
319 def _newJDC( self ,units = None):
320 #--------------------------------#
322 Initialise un nouveau JDC vierge
325 CONTEXT.unset_current_step()
328 if self.code == "CARMELCND" : texte=self._newJDCCND()
329 if self.code == "ZCRACKS" : texte=self._newZCRACKS()
330 if self.code == "TELEMAC" : texte=self._newTELEMAC()
331 if self.code == "PSEN" : texte = self._newPSEN()
332 if self.code == "PSEN_N1" : texte = self._newPSEN_N1()
334 if hasattr(self.readercata.cata[0],'TEXTE_NEW_JDC') : texte=self.readercata.cata[0].TEXTE_NEW_JDC
336 #if self.code == "CF" : texte = self._new_CF()
337 # texte=self.newTexteCND
339 jdc=self.readercata.cata[0].JdC( procedure =texte,
341 cata=self.readercata.cata,
342 cata_ord_dico=self.readercata.cata_ordonne_dico,
343 rep_mat=self.CONFIGURATION.rep_mat
345 jdc.lang = self.appli.langue
346 if units is not None:
347 jdc.recorded_units=units
348 jdc.old_recorded_units=units
349 ## PNPN est ce que la ligne suivante est bien utile ?
350 if texte == "" :jdc.analyse()
353 #--------------------------------#
354 def _newJDCInclude( self ,units = None):
355 #--------------------------------#
357 Initialise un nouveau JDC vierge
359 import Extensions.jdc_include
360 JdC_aux=Extensions.jdc_include.JdC_include
361 CONTEXT.unset_current_step()
363 jaux=self.readercata.cata[0].JdC( procedure="",
365 cata=self.readercata.cata,
366 cata_ord_dico=self.readercata.cata_ordonne_dico,
367 rep_mat=self.CONFIGURATION.rep_mat,
371 J=JdC_aux( procedure="",
373 cata=self.readercata.cata,
374 cata_ord_dico=self.readercata.cata_ordonne_dico,
376 rep_mat=self.CONFIGURATION.rep_mat,
379 if units is not None:
380 J.recorded_units=units
381 J.old_recorded_units=units
385 #-------------------------------#
386 def readFile(self, fn):
387 #--------------------------------#
389 Public slot to read the text from a file.
390 @param fn filename to read from (string or QString)
394 # ------------------------------------------------------------------------------------
396 # ------------------------------------------------------------------------------------
398 jdcName=os.path.basename(fn)
399 # Il faut convertir le contenu du fichier en fonction du format
400 if convert.plugins.has_key( self.appliEficas.format_fichier_in ):
401 # Le convertisseur existe on l'utilise
403 p=convert.plugins[self.appliEficas.format_fichier_in]()
405 if p.text=="" : self.nouveau=1
406 pareil,texteNew=self.verifieCHECKSUM(p.text)
408 if pareil == False and (self.appliEficas.ssIhm == False) :
409 QMessageBox.warning( self, tr("fichier modifie"),tr("Attention! fichier change hors EFICAS"))
411 memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
412 if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
414 text=p.convert('exec',self.appliEficas)
415 if not p.cr.estvide():
416 self.affiche_infos("Erreur a la conversion",Qt.red)
418 self.affiche_infos("Type de fichier non reconnu",Qt.red)
419 if self.appliEficas.ssIhm == False:
420 QMessageBox.critical( self, tr("Type de fichier non reconnu"),
421 tr("EFICAS ne sait pas ouvrir le type de fichier %s" ,self.appliEficas.format_fichier_in))
424 CONTEXT.unset_current_step()
425 jdc=self.readercata.cata[0].JdC(procedure=text,
427 cata=self.readercata.cata,
428 cata_ord_dico=self.readercata.cata_ordonne_dico,
430 rep_mat=self.CONFIGURATION.rep_mat
432 # ----------------------------------------------------
434 # ----------------------------------------------------
435 self.modified = False
437 # qApp.restoreOverrideCursor()
438 if self.fileInfo!= None :
439 self.lastModified = self.fileInfo.lastModified()
441 self.lastModified = 1
442 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
443 self.appliEficas.setWindowTitle(nouveauTitre)
447 #-----------------------#
448 def get_source(self,file):
449 #-----------------------#
451 # Il faut convertir le contenu du fichier en fonction du format
452 if convert.plugins.has_key(self.format):
453 # Le convertisseur existe on l'utilise
454 p=convert.plugins[self.format]()
456 text=p.convert('execnoparseur')
457 if not p.cr.estvide():
458 self.affiche_infos("Erreur a la conversion",Qt.red)
461 # Il n'existe pas c'est une erreur
462 self.affiche_infos("Type de fichier non reconnu",Qt.red)
463 QMessageBox.critical( self, tr("Type de fichier non reconnu"),tr("EFICAS ne sait pas ouvrir ce type de fichier"))
466 #-----------------------------------------------------------------------#
467 def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
468 #--------------------------------------------------------------------#
469 w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
473 #----------------------------------------------#
474 def __generateTempFilename(self, prefix, suffix):
475 #----------------------------------------------#
477 (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
483 #----------------------------------------------#
484 def _viewTextExecute(self, txt, prefix, suffix):
485 #----------------------------------------------#
486 self.w = ViewText( self.QWParent )
487 self.w.setWindowTitle( "execution" )
488 self.monExe=QProcess(self.w)
489 pid=self.monExe.pid()
490 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
491 f=open(nomFichier,'w')
495 self.monExe.readyReadStandardOutput.connect( self.readFromStdOut)
496 self.monExe.readyReadStandardError.connect( self.readFromStdErr)
498 self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOutQT4 )
499 self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErrQT4 )
500 exe='sh ' + nomFichier
501 self.monExe.start(exe)
502 self.monExe.closeWriteChannel()
505 commande="rm "+ nomFichier
510 def readFromStdErr(self):
511 a=self.monExe.readAllStandardError()
512 self.w.view.append(str(a.data(),len(a)))
514 def readFromStdErr(self) :
515 a=self.monExe.readAllStandardOutput()
516 self.w.view.append(str(a.data(),len(a)))
518 def readFromStdErrQT4(self):
519 a=self.monExe.readAllStandardError()
520 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
522 def readFromStdOutQT4(self) :
523 a=self.monExe.readAllStandardOutput()
524 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
528 #-----------------------#
529 def gestionParam(self):
530 #-----------------------#
531 w = MonWidgetCreeParam( self)
534 #-----------------------#
535 def viewJdcSource(self):
536 #-----------------------#
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 = unicode( 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
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
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(generator.plugins.has_key(format)): format = "MAP"
909 if generator.plugins.has_key(format):
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
917 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
918 if not self.generator.cr.estvide():
919 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
920 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
925 # Il n'existe pas c'est une erreur
926 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
927 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
930 #----------------------#
932 #---------------------#
933 if generator.plugins.has_key('dicoImbrique'):
934 self.generator=generator.plugins['dicoImbrique']()
935 jdc_formate=self.generator.gener(self.jdc)
936 dico=self.generator.Dico
939 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
940 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
947 fonction="run"+self.code
949 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
954 fonction="saveRun"+self.code
955 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
961 if not(self.jdc.isvalid()):
962 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
964 if len(self.jdc.etapes) != 1 :
965 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
967 if self.modified or self.fichier==None :
968 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
969 texte=self.get_text_JDC("MAP")
970 self.writeFile( self.fichierMapInput, txt = texte)
972 self.fichierMapInput=self.fichier
973 composant=self.jdc.etapes[0].nom.lower()[0:-5]
976 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
977 # then instantiate corresponding class and call getUseSalome() method
979 from mapengine.spec import factory
980 mapComponent = factory.new(composant)[0]
983 if mapComponent.getUseSalome():
984 command += " -r sappli"
985 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
988 self._viewTextExecute( textePython,"map_run",".sh")
990 # commande="rm "+self.fichierMapInput
991 # os.system(commande)
995 print traceback.print_exc()
997 #-------------------#
998 def runZCRACKS(self):
999 #-------------------#
1000 if not(self.jdc.isvalid()):
1001 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
1003 if self.modified or self.fichier==None :
1005 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
1006 texte=self.get_text_JDC("ZCRACKS",pourRun=1)
1007 self.writeFile( self.fichierZcracksInput, txt = texte)
1009 self.fichierZcracksInput=self.fichier
1011 #commande ="Zrun -zp "
1013 textePython=(commande + self.fichierZcracksInput)
1014 self._viewTextExecute( textePython,"run_zcracks",".sh")
1015 except Exception, e:
1016 print traceback.print_exc()
1018 #-------------------#
1019 def runCARMELCND(self):
1020 #-------------------#
1021 #if not(self.jdc.isvalid()):
1022 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
1024 if self.modified or self.fichier==None :
1025 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
1027 if not hasattr(self,'generator'): texte=self.get_text_JDC(self.format)
1028 from PrepareRunCarmel import prepareRunCarmel
1029 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
1030 repMed=os.path.dirname(self.fichier)
1031 repExeCarmel=self.generator.get_repExeCarmel()
1032 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
1033 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
1034 f=open(nomFichier,'w')
1035 f.write(textePython)
1037 commande="xterm -e sh "+nomFichier +"\n"
1040 # self._viewTextExecute( textePython,"carmel_run",".sh")
1041 #except Exception, e:
1042 # print traceback.print_exc()
1044 #-------------------#
1045 def runCarmelCS(self):
1046 #-------------------#
1048 commande="runSession pilotyacsCS.py"
1050 except Exception, e:
1051 print traceback.print_exc()
1053 #-----------------------------------------------------#
1054 def determineNomFichier(self,path,extension):
1055 #-----------------------------------------------------#
1056 if DictExtensions.has_key(self.appli.code) :
1057 chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
1058 extensions= tr(chaine1+ "All Files (*)")
1060 extensions= tr("JDC (*.comm);;" "All Files (*)")
1062 if self.appli.code == "MAP" :
1063 extensions = extensions + ";; Run (*.input);;"
1065 fn = QFileDialog.getSaveFileName( self,
1066 tr("sauvegarde"), path,
1068 QFileDialog.DontConfirmOverwrite)
1069 if fn == None : return (0, None)
1070 if monEnvQT5 : fn=fn[0]
1071 if fn=='': return (0, None)
1073 ext = QFileInfo(fn).suffix()
1074 if ext == '': fn+=extension
1076 if QFileInfo(fn).exists():
1078 msgBox = QMessageBox(self)
1079 msgBox.setWindowTitle(tr("Sauvegarde du Fichier"))
1080 msgBox.setText(tr("Le fichier <b>%s</b> existe deja.", unicode(fn)))
1081 msgBox.addButton(tr("&Ecraser"),0)
1082 msgBox.addButton(tr("&Abandonner"),1)
1083 abort=msgBox.exec_()
1085 abort = QMessageBox.warning(self,
1086 tr("Sauvegarde du Fichier"),
1087 tr("Le fichier <b>%s</b> existe deja.",str(fn)),
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 (not monEnvQT5) and avant.toLatin1()=="&Open": b.setText("Save")
1131 if monEnvQT5 and avant=="&Open": b.setText("Save")
1133 mesFiltres= "input Map (*.input);;All Files (*)"
1135 mesFiltres=QStringList()
1136 mesFiltres << "input Map (*.input)" << "All Files (*)"
1137 monDialog.setNameFilters(mesFiltres)
1138 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
1139 BOk=monDialog.exec_()
1141 if monEnvQT5 : fn=str(monDialog.selectedFiles()[0])
1142 else : fn=str(monDialog.selectedFiles()[0].toLatin1())
1143 if fn == "" or fn == None : return
1144 if not fn.endswith(".input"):
1146 self.monNomFichierInput=fn
1148 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
1149 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
1150 texte=self.get_text_JDC("MAP")
1151 self.writeFile( self.fichierMapInput, txt = texte)
1153 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
1154 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
1155 (output, err) = p.communicate()
1159 def saveRunPSEN(self):
1164 if not(self.jdc.isvalid()):
1165 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
1166 tr("Un JdC valide est necessaire pour creer un .input")
1170 #print generator.plugins.has_key(self.format)
1171 if generator.plugins.has_key(self.format):
1172 # Le generateur existe on l'utilise
1173 self.generator=generator.plugins[self.format]()
1175 self.generator.gener(self.jdc)
1176 self.generator.writeDefault('')
1177 except ValueError,e:
1178 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
1179 if not self.generator.cr.estvide():
1180 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
1181 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
1184 # Il n'existe pas c'est une erreur
1185 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
1186 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
1193 #-----------------------------------------#
1194 def cherche_Groupes(self):
1195 #-----------------------------------------#
1196 listeMA,listeNO=self.get_text_JDC("GroupMA")
1197 return listeMA,listeNO
1199 #-----------------------------------------#
1200 def cherche_Dico(self):
1201 #-----------------------------------------#
1203 format = self.appliEficas.format_fichier
1204 if generator.plugins.has_key(format):
1205 # Le generateur existe on l'utilise
1206 self.generator=generator.plugins[format]()
1207 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
1208 dicoCourant=self.generator.dico
1213 #-----------------------------------------#
1214 def handleAjoutGroup(self,listeGroup):
1215 #-----------------------------------------#
1218 from ajoutGroupe import handleAjoutGroupFiltre
1220 handleAjoutGroupFiltre(self,listeGroup)
1221 #print "apres handleAjoutGroupFiltre"
1226 #-----------------------------------------------------------------#
1227 def saveFileLeger(self, path = None, saveas= 0,formatLigne="beautifie"):
1228 #-----------------------------------------------------------------#
1231 #saveas=True # Pour forcer le nom
1232 self.generator=generator.plugins[self.format]()
1233 if self.fichier is None or saveas:
1234 if path is None: path=self.CONFIGURATION.savedir
1235 bOK, fn=self.determineNomFichier(path,extension)
1236 if bOK == 0 : return (0, None)
1237 if fn == None : return (0, None)
1238 if fn== '' : return (0, None)
1240 ulfile = os.path.abspath(unicode(fn))
1241 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1242 fn = unicode(QDir.toNativeSeparators(fn))
1244 self.fichier = os.path.splitext(fn)[0]+extension
1247 if hasattr(self.generator, "writeLeger"):
1248 self.generator.writeLeger(self.fichier,self.jdc,config=self.appliEficas.CONFIGURATION,appli=self.appliEficas)
1250 if self.salome : self.appliEficas.addJdcInSalome( self.fichier)
1253 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1254 self.appliEficas.setWindowTitle(nouveauTitre)
1255 return (1, self.fichier)
1257 #-----------------------------------------------------------------#
1258 def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"):
1259 #-----------------------------------------------------------------#
1261 Public slot to save the text to a file.
1263 @param path directory to save the file in (string or QString)
1264 @return tuple of two values (boolean, string) giving a success indicator and
1265 the name of the saved file
1269 if not self.modified and not saveas:
1270 return (0, None) # do nothing if text wasn't changed
1272 if DictExtensions.has_key(self.appli.code) :
1273 extension=DictExtensions[self.appli.code]
1279 if self.fichier is None or saveas:
1280 if path is None: path=self.CONFIGURATION.savedir
1281 bOK, fn=self.determineNomFichier(path,extension)
1282 if bOK == 0 : return (0, None)
1283 if fn == None : return (0, None)
1284 if fn== '' : return (0, None)
1286 ulfile = os.path.abspath(unicode(fn))
1287 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1288 fn = unicode(QDir.toNativeSeparators(fn))
1292 if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None)
1294 self.modified = False
1295 if self.fileInfo is None or saveas:
1296 self.fileInfo = QFileInfo(self.fichier)
1297 self.fileInfo.setCaching(0)
1298 self.lastModified = self.fileInfo.lastModified()
1299 if newName is not None:
1300 self.appliEficas.addToRecentList(newName)
1301 self.tree.racine.item.getObject().nom=os.path.basename(newName)
1302 self.tree.racine.update_node_label()
1304 if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
1305 self.generator.writeDefault(fn)
1306 elif self.code=="TELEMAC" and hasattr(self.generator, "writeDefault"):
1307 self.generator.writeDefault(fn)
1310 self.appliEficas.addJdcInSalome( self.fichier)
1312 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1313 self.appliEficas.setWindowTitle(nouveauTitre)
1315 return (1, self.fichier)
1318 #----------------------------------------------#
1319 def sauveLigneFile(self):
1320 #----------------------------------------------#
1322 return self.saveFile(formatLigne="Ligne")
1325 #----------------------------------------------#
1326 def saveFileAs(self, path = None,fileName=None):
1327 #----------------------------------------------#
1329 Public slot to save a file with a new name.
1331 @param path directory to save the file in (string or QString)
1332 @return tuple of two values (boolean, string) giving a success indicator and
1333 the name of the saved file
1335 if fileName != None :
1336 self.fichier = fileName
1337 return self.saveFile()
1338 return self.saveFile(path,1,"beautifie")
1342 #---------------------------------------------#
1343 def get_file(self,unite=None,fic_origine = ''):
1344 #---------------------------------------------#
1352 titre = tr("Choix unite %d ", unite)
1353 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
1354 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
1355 labeltexte = tr('Fichier pour unite ') + repr( unite)
1357 titre = tr("Choix d'un fichier de poursuite")
1358 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
1359 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
1361 QMessageBox.information( self, titre,texte)
1362 fn = QFileDialog.getOpenFileName(self.appliEficas,
1364 self.appliEficas.CONFIGURATION.savedir)
1366 # ce retour est impose par le get_file d'I_JDC
1367 if fn== '' : return None," "
1368 if not fn : return (0, " ")
1369 if monEnvQT5 : fn=fn[0]
1371 ulfile = os.path.abspath(unicode(fn))
1372 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1374 # On utilise le convertisseur defini par format_fichier
1375 source=self.get_source(ulfile)
1377 # On a reussia convertir le fichier self.ulfile
1380 # Une erreur a ete rencontree
1382 return ulfile, jdcText
1384 #-------------------------------#
1385 def updateJdc(self, itemApres,texte):
1386 #--------------------------------#
1388 etape=monItem.item.object
1390 CONTEXT.set_current_step(etape)
1391 etape.build_includeInclude(texte)
1392 self.tree.racine.build_children()
1394 #-------------------------------------#
1395 def deleteEtape(self,etape):
1396 #-------------------------------------#
1397 self.jdc.suppentite(etape)
1399 #-------------------------------------#
1400 def deleteMC(self,etape,MCFils,listeAvant=()):
1401 #-------------------------------------#
1403 for mot in listeAvant :
1404 ouChercher=ouChercher.get_child(mot,restreint="oui")
1405 monMC=ouChercher.get_child(MCFils,restreint="oui")
1406 if monMC != None : ouChercher.suppentite(monMC)
1407 ouChercher.state='changed'
1408 ouChercher.isvalid()
1410 #-------------------------------------#
1411 def ajoutMC(self,etape,MCFils,valeurs,listeAvant=()):
1412 #-------------------------------------#
1414 for mot in listeAvant :
1415 ouChercher=ouChercher.get_child(mot,restreint="oui")
1416 monMC=etape.get_child(ouChercher,restreint="oui")
1417 if monMC== None : monMC= ouChercher.addentite(MCFils)
1418 monMC.valeur=valeurs
1420 monMC.state='changed'
1423 #-----------------------------------------------------------#
1424 def changeIntoMC(self,etape,MCFils,valeurs, listeAvant=()):
1425 #-----------------------------------------------------------#
1427 for mot in listeAvant :
1428 ouChercher=ouChercher.get_child(mot,restreint="oui")
1429 if ouChercher ==None : print 'SOUCI'; return
1430 monMC=ouChercher.get_child(MCFils,restreint="oui")
1431 if monMC== None : monMC= ouChercher.addentite(MCFils)
1432 monMC.definition.into=valeurs
1433 monMC.state='changed'
1436 #-------------------------------------#
1437 def changeIntoDefMC(self,etape,listeMC,valeurs):
1438 #-------------------------------------#
1439 definitionEtape=getattr(self.jdc.cata[0],etape)
1440 ouChercher=definitionEtape
1441 if len(listeMC) > 1 :
1442 for mc in listeMC[0:-1]:
1443 mcfact=ouChercher.entites[mc]
1446 mcAccas=ouChercher.entites[listeMC[-1]]
1447 mcAccas.into=valeurs
1449 #-------------------------------------------------------------#
1450 def deleteDefinitionMC(self,etape,listeAvant,nomDuMC):
1451 #-------------------------------------------------------------#
1452 #print 'in deleteDefinitionMC', etape,listeAvant,nomDuMC
1453 definitionEtape=getattr(self.jdc.cata[0],etape)
1454 ouChercher=definitionEtape
1455 for k in listeAvant :
1456 ouChercher=ouChercher.entites[k]
1457 MCADetruire=ouChercher.entites[nomDuMC]
1458 ouChercher.ordre_mc.remove(nomDuMC)
1459 del ouChercher.entites[nomDuMC]
1460 del self.dicoNouveauxMC[nomDuMC]
1463 #-------------------------------------------------------------#
1464 def ajoutDefinitionMC(self,etape,listeAvant,nomDuMC,typ,**args):
1465 #-------------------------------------------------------------#
1466 definitionEtape=getattr(self.jdc.cata[0],etape)
1467 ouChercher=definitionEtape
1468 for k in listeAvant :
1469 ouChercher=ouChercher.entites[k]
1470 from Accas import A_SIMP
1471 Nouveau=A_SIMP.SIMP(typ,**args)
1472 Nouveau.pere=ouChercher
1475 ouChercher.entites[nomDuMC]=Nouveau
1476 ouChercher.ordre_mc.append(nomDuMC)
1477 self.dicoNouveauxMC[nomDuMC]=('ajoutDefinitionMC',etape,listeAvant,nomDuMC,typ,args)
1478 #print self.dicoNouveauxMC
1480 #----------------------------------------------------#
1481 def changeIntoMCandSet(self,etape,MCFils,into,valeurs):
1482 #----------------------------------------------------#
1483 monMC=etape.get_child(MCFils,restreint="oui")
1484 if monMC== None : monMC= etape.addentite(MCFils)
1485 monMC.definition.into=into
1486 monMC.valeur=valeurs
1488 monMC.state='changed'
1491 #-------------------------------------#
1492 def ajoutVersionCataDsJDC(self,txt):
1493 #-------------------------------------#
1494 if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
1495 ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata[0].VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
1496 texte=txt+ligneVersion
1499 #-------------------------------------#
1500 def verifieVersionCataDuJDC(self,text):
1501 #-------------------------------------#
1503 indexDeb=text.find("#VERSION_CATALOGUE:")
1504 indexFin=text.find(":FIN VERSION_CATALOGUE")
1506 self.versionCataDuJDC="sans"
1509 self.versionCataDuJDC=text[indexDeb+19:indexFin]
1510 textJDC=text[0:indexDeb]+text[indexFin+23:-1]
1512 self.versionCata="sans"
1513 if hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata[0].VERSION_CATALOGUE
1515 if self.versionCata==self.versionCataDuJDC : memeVersion=True
1516 return memeVersion,textJDC
1518 #-------------------------------#
1519 def traduitCatalogue(self,texte):
1520 #-------------------------------#
1521 nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
1522 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
1524 traducteur=__import__(nomTraducteur)
1525 monTraducteur=traducteur.MonTraducteur(texte)
1526 nouveauTexte=monTraducteur.traduit()
1532 #------------------------------#
1533 def verifieCHECKSUM(self,text):
1534 #------------------------------#
1535 indexDeb=text.find("#CHECKSUM:")
1538 indexFin=text.find(":FIN CHECKSUM")
1539 checkAvant=text[indexDeb:indexFin+13]
1540 textJDC=text[0:indexDeb]+text[indexFin+13:-1]
1541 checksum=self.get_checksum(textJDC)
1542 pareil=(checkAvant==checksum)
1543 return pareil, textJDC
1545 #---------------------------#
1546 def get_checksum(self,texte):
1547 #---------------------------#
1548 newtexte=texte.replace('"','\\"')
1549 commande='echo "'+newtexte+'"|md5sum'
1550 a=os.popen(commande)
1553 ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
1557 #---------------------------#
1559 #---------------------------#
1560 texte="CONDUITE_FORCEE();"
1564 #---------------------------#
1565 def _newTELEMAC(self):
1566 #---------------------------#
1567 #texte="INITIALIZATION();BOUNDARY_CONDITIONS();GENERAL_PARAMETERS();PHYSICAL_PARAMETERS();NUMERICAL_PARAMETERS();"
1568 texte="COMPUTATION_ENVIRONMENT();HYDRO();GENERAL_PARAMETERS();NUMERICAL_PARAMETERS()"
1572 #---------------------------#
1574 #---------------------------#
1575 texte="DIRECTORY() ; PSSE_PARAMETERS() ; SIMULATION() ; sansnom=DISTRIBUTION() ; sansnom=DISTRIBUTION() ; CORRELATION() ;"
1579 #---------------------------#
1580 def _newPSEN_N1(self):
1581 #---------------------------#
1582 texte="CASE_SELECTION();N_PROCESSING_OPTIONS();CONTINGENCY_OPTIONS();CONTINGENCY_SELECTION();\nCONTINGENCY_PROCESSING(); "
1583 texte="CONTINGENCY_SELECTION();\nCONTINGENCY_PROCESSING(); "
1586 #---------------------------#
1588 #---------------------------#
1589 def _newZCRACKS(self):
1590 #---------------------------#
1591 texte="MAILLAGES();REMESHING();"
1594 #---------------------------#
1595 def _newJDCCND(self):
1596 #---------------------------#
1597 extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
1599 #if self.salome == 0 :
1600 QMessageBox.information( self,
1602 tr("Veuillez selectionner un fichier Med"))
1603 QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
1604 caption='Fichier Med',
1606 if monEnvQT5 : QSfichier=QSfichier[0]
1607 self.fichierMED=QSfichier
1608 from acquiertGroupes import getGroupes
1609 erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
1610 if erreur != "" : print "a traiter"
1611 texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
1617 for groupe in self.listeGroupes :
1618 if groupe[0:8]=='CURRENT_':
1619 texteSources +=groupe[8:]+"=SOURCE("
1620 texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
1621 if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n"
1622 if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n"
1623 if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n"
1624 if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n"
1625 texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
1626 self.newTexteCND=texte
1631 #---------------------------#
1632 def BoutonFileSelected(self):
1633 #---------------------------#
1635 QSfichier=self.openfile.selectedFiles()[0]
1636 self.fichierMED=str(QSfichier)
1637 from acquiertGroupes import getGroupes
1638 erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
1639 if erreur != "" : print "a traiter"
1641 #-----------------------------
1642 def BoutonSalomePressed(self):
1643 #----------------------------
1644 Msg,self.listeGroupes=self.appliEficas.ChercheGrpMailleInSalome()
1645 self.fichierMED="A_partir_de_SMESH"
1646 self.nomMaillage="A_partir_de_SMESH"
1647 self.openfile.close()
1650 #-----------------------------------------
1651 def initSplitterSizes(self, nbWidget=3):
1652 #-----------------------------------------
1653 #print "je passe ds initSplitterSizes"
1655 if self.code in [ 'Adao', 'ADAO', ] : self.splitterSizes=[1,1550,150]
1656 elif self.code in [ 'MAP'] : self.splitterSizes=[700,300]
1657 else : self.splitterSizes=[150,800,500]
1658 self.oldSizeWidgetOptionnel = 30
1660 if self.code in [ 'Adao', 'ADAO', ] : self.splitterSizes=[5,1500]
1661 else : self.splitterSizes=[300,1000]
1662 self.oldSizeWidgetOptionnel = 30
1663 self.splitter.setSizes(self.splitterSizes)
1666 #-----------------------------------------
1667 def restoreSplitterSizes(self,nbWidget=3):
1668 #----------------------------------------
1669 #self.inhibeSplitter = 1
1671 #print 'ds restoreSplitterSizes'
1672 #print self.splitterSizes
1673 if not(hasattr(self,'splitter')) : return
1674 if nbWidget==2 and len(self.splitterSizes) == 3 :
1675 self.splitterSizes[1]+=self.splitterSizes[2]
1676 newSizes=self.splitterSizes[:nbWidget]
1677 self.splitter.setSizes(newSizes)
1678 QApplication.processEvents()
1679 # seule la fentetre du milieu est necessaire
1680 self.splitter.widget(1).resizeEvent=self.saveSplitterSizes
1682 def saveSplitterSizes(self,event):
1683 self.splitterSizes= self.splitter.sizes()
1685 #------------------------
1686 def fermeOptionnel(self):
1687 #------------------------
1688 if self.widgetOptionnel == None : return
1690 self.inhibeSplitter=1
1691 self.splitterSizes[1] = self.splitterSizes[1] + self.splitterSizes[2]
1692 if self.splitterSizes[2]!=0 : self.oldSizeWidgetOptionnel = self.splitterSizes[2]
1693 self.splitterSizes[2]=0
1695 self.widgetOptionnel.setParent(None)
1696 self.widgetOptionnel.close()
1697 self.widgetOptionnel.deleteLater()
1698 self.widgetOptionnel=None
1699 self.inhibeSplitter=0
1700 self.restoreSplitterSizes(2)
1702 #------------------------
1703 def ajoutOptionnel(self):
1704 #------------------------
1705 if len(self.splitterSizes) == 2 : self.splitterSizes.append(self.oldSizeWidgetOptionnel)
1706 else : self.splitterSizes[2] = self.oldSizeWidgetOptionnel # ceinture pour les close bizarres
1707 #self.splitterSizes[1] = self.splitterSizes[1] - self.splitterSizes[2]
1709 self.restoreSplitterSizes(3)
1712 #-----------------------------
1713 def getTreeIndex(self,noeud):
1714 #----------------------------
1716 if noeud in noeud.treeParent.children :
1717 indexNoeud=noeud.treeParent.children.index(noeud)
1719 if hasattr(noeud,'vraiParent') :
1721 noeudVraiParent = noeud.vraiParent
1722 while noeudVraiParent != noeud.treeParent and hasattr(noeudVraiParent,'vraiParent') :
1723 noeudVrai = noeudVraiParent
1724 noeudVraiParent = noeudVraiParent.vraiParent
1726 if noeudVraiParent == noeud.treeParent :
1727 indexNoeud=noeud.treeParent.children.index(noeudVrai)
1733 if __name__ == "__main__":
1735 name='prefs_'+prefs.code
1736 prefsCode=__import__(name)
1739 if hasattr(prefsCode,'encoding'):
1740 # Hack pour changer le codage par defaut des strings
1743 sys.setdefaultencoding(prefs.encoding)
1744 del sys.setdefaultencoding
1749 app = QApplication(sys.argv)
1750 mw = JDCEditor(None,'azAster.comm')
1751 app.setMainWidget(mw)
1752 app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
1755 res = app.exec_loop()