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 PyQt4.QtGui import *
25 from PyQt4.QtCore import *
28 from datetime import date
29 from Extensions.i18n import tr
34 import convert, generator
35 from Editeur import session
36 from Editeur import comploader
37 from Editeur import Objecttreeitem
38 from desBaseWidget import Ui_baseWidget
39 from monViewTexte import ViewText
40 from monViewTexte import ViewText2
41 from monWidgetCreeParam import MonWidgetCreeParam
45 DictExtensions= {"MAP" : ".map"}
49 class JDCEditor(Ui_baseWidget,QtGui.QWidget):
50 # ----------------------------------------- #
55 def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None):
56 #----------------------------------------------------------------------------------------------------------#
58 QtGui.QWidget.__init__(self,None)
60 self.widgetOptionnel=None
61 self.fenetreCentraleAffichee=None
62 self.dejaDansPlieTout=False
63 self.afficheCommandesPliees = True
64 self.listeDesListesOuvertes=set()
65 self.appliEficas = appli
66 self.appli = appli #---- attendu par IHM
68 self.fichier = fichier
71 self.QWParent = QWParent
74 self.salome = self.appliEficas.salome
77 print "dans JDC pas d appli ????????"
79 # ces attributs sont mis a jour par definitCode appelee par newEditor
80 self.code = self.appliEficas.CONFIGURATION.code
81 # tres vite a cause du tag. doit etre pase dans CONFIGURATION
83 self.afficheListesPliees=False
84 if self.code == "ASTER" or self.code == "monCode" : self.afficheListesPliees =True
86 self.mode_nouv_commande=self.appliEficas.CONFIGURATION.mode_nouv_commande
87 self.affiche=self.appliEficas.CONFIGURATION.affiche
88 #if self.code in ['MAP','CARMELCND','PSEN'] : self.afficheCommandesPliees=False
89 if self.code in ['MAP','CARMELCND'] : self.afficheCommandesPliees=False
90 if self.code in ['MAP',] :
91 self.widgetTree.close()
93 self.appliEficas.resize(1440,self.appliEficas.height())
95 self.appliEficas.resize(2000,self.appliEficas.height())
97 self.version_code = session.d_env.cata
99 if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.multi==True:
100 self.readercata = readercata.READERCATA( self, self.appliEficas )
101 self.appliEficas.readercata=self.readercata
103 self.readercata=self.appliEficas.readercata
104 if self.readercata.fic_cata == None : return #Sortie Salome
105 self.titre=self.readercata.titre
106 self.Ordre_Des_Commandes=self.readercata.Ordre_Des_Commandes
107 self.Classement_Commandes_Ds_Arbre=self.readercata.Classement_Commandes_Ds_Arbre
109 self.format = self.appliEficas.format_fichier
112 self.liste_simp_reel=[]
115 nameConf='configuration_'+self.code
116 configuration=__import__(nameConf)
117 self.CONFIGURATION = self.appliEficas.CONFIGURATION
118 self.CONFIGStyle = self.appliEficas.CONFIGStyle
121 self.CONFIGURATION.generator_module
122 _module = __import__(self.CONFIGURATION.generator_module)
123 info = _module.entryPoint()
124 generator.plugins.addEntryPoint(info)
129 self.CONFIGURATION.convert_module
130 _module = __import__(self.CONFIGURATION.convert_module)
131 info = _module.entryPoint()
132 convert.plugins.addEntryPoint(info)
137 if hasattr(self.appliEficas,"statusBar"):
138 self.sb = self.appliEficas.statusBar()
141 self.lastModified = 0
143 self.modified = False
144 self.isReadOnly = False
145 self.node_selected = []
148 if self.code in ['Adao','MAP'] : self.afficheApresInsert=True
149 else : self.afficheApresInsert=False
150 if self.code in ['TELEMAC',] : self.enteteQTree='premier'
151 else : self.enteteQTree='complet'
152 if self.code in ['Adao','TELEMAC'] : self.affichePlie=True
153 else : self.affichePlie=False
155 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
157 #------- construction du jdc --------------
162 if self.fichier is not None: # fichier jdc fourni
163 self.fileInfo = QFileInfo(self.fichier)
164 self.fileInfo.setCaching(0)
168 self.jdc = self.readFile(self.fichier)
171 print "mauvaise lecture"
174 if self.jdc is not None and units is not None:
175 self.jdc.recorded_units=units
176 self.jdc.old_recorded_units=units
178 if not self.jdc: # nouveau jdc
180 self.jdc = self._newJDC(units=units)
182 self.jdc = self._newJDCInclude(units=units)
186 self.jdc.appli = self
187 self.jdc.lang = self.appli.langue
188 self.jdc.aReafficher=False
192 txt_exception = self.jdc.cr.get_mess_exception()
195 qApp.restoreOverrideCursor()
196 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
197 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
199 comploader.charger_composants("QT")
200 jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
201 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
202 self.viewJdcRapport()
207 self.tree = browser.JDCTree( jdc_item, self )
208 self.appliEficas.construitMenu()
209 self.splitterSizes = []
213 #-------------------# Pour execution avec output et error dans le bash
215 #-------------------#
216 if self.modified or self.fichier==None : self.saveFile()
218 #lancement avec le .bat
219 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
220 WrapperFilePath = os.path.join(path1, 'PSSEWrapper.py')
222 p = subprocess.Popen(['python',WrapperFilePath])
223 (out,err)=p.communicate()
227 #--------------------------------#
228 def _newJDC( self ,units = None):
229 #--------------------------------#
231 Initialise un nouveau JDC vierge
234 CONTEXT.unset_current_step()
237 if self.code == "CARMELCND" : texte=self._newJDCCND()
238 if self.code == "ZCRACKS" : texte=self._newZCRACKS()
239 if self.code == "TELEMAC" : texte=self._newTELEMAC()
240 if self.code == "PSEN" : texte = self._newPSEN()
241 # texte=self.newTexteCND
243 jdc=self.readercata.cata[0].JdC( procedure =texte,
245 cata=self.readercata.cata,
246 cata_ord_dico=self.readercata.cata_ordonne_dico,
247 rep_mat=self.CONFIGURATION.rep_mat
249 jdc.lang = self.appli.langue
250 if units is not None:
251 jdc.recorded_units=units
252 jdc.old_recorded_units=units
253 ## PNPN est ce que la ligne suivante est bien utile ?
254 if texte == "" :jdc.analyse()
257 #--------------------------------#
258 def _newJDCInclude( self ,units = None):
259 #--------------------------------#
261 Initialise un nouveau JDC vierge
263 import Extensions.jdc_include
264 JdC_aux=Extensions.jdc_include.JdC_include
265 CONTEXT.unset_current_step()
267 jaux=self.readercata.cata[0].JdC( procedure="",
269 cata=self.readercata.cata,
270 cata_ord_dico=self.readercata.cata_ordonne_dico,
271 rep_mat=self.CONFIGURATION.rep_mat,
275 J=JdC_aux( procedure="",
277 cata=self.readercata.cata,
278 cata_ord_dico=self.readercata.cata_ordonne_dico,
280 rep_mat=self.CONFIGURATION.rep_mat,
283 if units is not None:
284 J.recorded_units=units
285 J.old_recorded_units=units
289 #-------------------------------#
290 def readFile(self, fn):
291 #--------------------------------#
293 Public slot to read the text from a file.
294 @param fn filename to read from (string or QString)
298 # ------------------------------------------------------------------------------------
300 # ------------------------------------------------------------------------------------
302 jdcName=os.path.basename(fn)
303 # Il faut convertir le contenu du fichier en fonction du format
304 if convert.plugins.has_key( self.appliEficas.format_fichier_in ):
305 # Le convertisseur existe on l'utilise
307 p=convert.plugins[self.appliEficas.format_fichier_in]()
309 if p.text=="" : self.nouveau=1
310 pareil,texteNew=self.verifieCHECKSUM(p.text)
312 if pareil == False and (self.appliEficas.ssIhm == False) :
313 QMessageBox.warning( self, tr("fichier modifie"),tr("Attention! fichier change hors EFICAS"))
315 memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
316 if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
318 text=p.convert('exec',self.appliEficas)
319 if not p.cr.estvide():
320 self.affiche_infos("Erreur a la conversion",Qt.red)
322 self.affiche_infos("Type de fichier non reconnu",Qt.red)
323 if self.appliEficas.ssIhm == False:
324 QMessageBox.critical( self, tr("Type de fichier non reconnu"),
325 tr("EFICAS ne sait pas ouvrir le type de fichier %s" ,self.appliEficas.format_fichier_in))
328 CONTEXT.unset_current_step()
329 jdc=self.readercata.cata[0].JdC(procedure=text,
331 cata=self.readercata.cata,
332 cata_ord_dico=self.readercata.cata_ordonne_dico,
334 rep_mat=self.CONFIGURATION.rep_mat
336 # ----------------------------------------------------
338 # ----------------------------------------------------
339 self.modified = False
341 # qApp.restoreOverrideCursor()
342 if self.fileInfo!= None :
343 self.lastModified = self.fileInfo.lastModified()
345 self.lastModified = 1
346 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
347 self.appliEficas.setWindowTitle(nouveauTitre)
351 #-----------------------#
352 def get_source(self,file):
353 #-----------------------#
355 # Il faut convertir le contenu du fichier en fonction du format
356 if convert.plugins.has_key(self.format):
357 # Le convertisseur existe on l'utilise
358 p=convert.plugins[self.format]()
360 text=p.convert('execnoparseur')
361 if not p.cr.estvide():
362 self.affiche_infos("Erreur a la conversion",Qt.red)
365 # Il n'existe pas c'est une erreur
366 self.affiche_infos("Type de fichier non reconnu",Qt.red)
367 QMessageBox.critical( self, tr("Type de fichier non reconnu"),tr("EFICAS ne sait pas ouvrir ce type de fichier"))
370 #-----------------------------------------------------------------------#
371 def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
372 #--------------------------------------------------------------------#
373 w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
377 #----------------------------------------------#
378 def __generateTempFilename(self, prefix, suffix):
379 #----------------------------------------------#
381 (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
387 #----------------------------------------------#
388 def _viewTextExecute(self, txt, prefix, suffix):
389 #----------------------------------------------#
390 self.w = ViewText( self.QWParent )
391 self.w.setWindowTitle( "execution" )
392 self.monExe=QProcess(self.w)
393 pid=self.monExe.pid()
394 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
395 f=open(nomFichier,'w')
398 self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
399 self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
400 exe='sh ' + nomFichier
401 self.monExe.start(exe)
402 self.monExe.closeWriteChannel()
405 commande="rm "+ nomFichier
411 def readFromStdErr(self):
412 a=self.monExe.readAllStandardError()
413 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
415 def readFromStdOut(self) :
416 a=self.monExe.readAllStandardOutput()
417 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
421 #-----------------------#
422 def gestionParam(self):
423 #-----------------------#
424 w = MonWidgetCreeParam( self)
427 #-----------------------#
428 def viewJdcSource(self):
429 #-----------------------#
430 f=open(self.fichier,'r')
433 self._viewText(texteSource, "JDC_SOURCE")
435 #-----------------------#
437 #-----------------------#
438 strSource = str( self.get_text_JDC(self.format) )
439 self._viewText(strSource, "JDC_RESULTAT")
441 #-----------------------#
442 def viewJdcRapport(self):
443 #-----------------------#
444 strRapport = unicode( self.jdc.report() )
445 # on ajoute les regles
447 self._viewText(strRapport, "JDC_RAPPORT")
449 #-----------------------#
450 def viewJdcRegles(self):
451 #-----------------------#
452 if self.tree :self.tree.AppelleBuildLBRegles()
459 Public method called by the viewmanager to finally get rid of us.
465 #----------------------------------------------#
466 def affiche_infos(self,message,couleur=Qt.black):
467 #----------------------------------------------#
469 mapalette=self.sb.palette()
470 from PyQt4.QtGui import QPalette
471 mapalette.setColor( QPalette.WindowText, couleur )
472 self.sb.setPalette( mapalette );
473 self.sb.showMessage(QString.fromUtf8(message),4000)
475 #------------------------------#
476 def affiche_alerte(self,titre,message):
477 #------------------------------#
478 # appele par I_MACRO_ETAPE
479 QMessageBox.information( self, titre, message)
481 #-----------------------------------#
482 def affiche_commentaire(self,message):
483 #-----------------------------------#
484 self.labelCommentaire.setText(message)
485 QTimer.singleShot(6000, self.rendInvisible)
487 #----------------------#
488 def rendInvisible(self):
489 #----------------------#
490 self.labelCommentaire.setText("")
492 #-------------------#
493 def init_modif(self):
494 #-------------------#
496 Met l'attribut modified a 'o' : utilise par Eficas pour savoir
497 si un JDC doit etre sauvegarde avant destruction ou non
501 #---------------------------------------#
502 def chercheNoeudSelectionne(self,copie=1):
503 #---------------------------------------#
505 appele par Cut et Copy pour positionner self.node_selected
507 self.node_selected=[]
508 if len(self.tree.selectedItems()) == 0 : return
509 self.node_selected=self.tree.selectedItems()
512 #---------------------#
513 def handleSupprimer(self):
514 #---------------------#
515 self.chercheNoeudSelectionne()
516 if len(self.node_selected) == 0 : return
517 self.QWParent.noeud_a_editer = []
518 if self.node_selected[0]==self.tree.racine: return
519 if len(self.node_selected) == 1 : self.node_selected[0].delete()
520 else : self.node_selected[0].deleteMultiple(self.node_selected)
522 #---------------------#
523 def handleRechercher(self):
524 #---------------------#
525 from monRecherche import DRecherche
526 monRechercheDialg=DRecherche(parent=self,fl=0)
527 monRechercheDialg.show()
529 #---------------------#
530 def handleDeplier(self):
531 #---------------------#
532 if self.tree == None : return
533 #self.tree.collapseAll()
536 self.tree.expandItem(self.tree.topLevelItem(0))
538 if self.fenetreCentraleAffichee != None :
539 if hasattr(self.fenetreCentraleAffichee.node,'plieToutEtReaffiche'):
540 self.fenetreCentraleAffichee.node.plieToutEtReaffiche()
543 self.tree.expandItem(self.tree.topLevelItem(0))
545 if self.fenetreCentraleAffichee != None :
546 if hasattr(self.fenetreCentraleAffichee.node,'deplieToutEtReaffiche'):
547 self.fenetreCentraleAffichee.node.deplieToutEtReaffiche()
549 #---------------------#
550 def handleEditCut(self):
551 #---------------------#
553 Stocke dans Eficas.noeud_a_editer le noeud a couper
555 #print "handleEditCut"
556 self.chercheNoeudSelectionne()
557 self.QWParent.edit="couper"
558 self.QWParent.noeud_a_editer = self.node_selected
560 #-----------------------#
561 def handleEditCopy(self):
562 #-----------------------#
564 Stocke dans Eficas.noeud_a_editer le noeud a copier
566 self.chercheNoeudSelectionne()
567 if len(self.node_selected) == 0 : return
568 if len(self.node_selected) == 1 : self.node_selected[0].update_node_label_in_blue()
569 else : self.node_selected[0].update_plusieurs_node_label_in_blue(self.node_selected)
570 self.QWParent.edit="copier"
571 self.QWParent.noeud_a_editer = self.node_selected
573 #------------------------#
574 def handleEditPaste(self):
575 #------------------------#
577 Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
578 Ne permet que la copie d'objets de type Commande ou MCF
580 self.chercheNoeudSelectionne()
581 if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
582 QMessageBox.information( self,
583 tr("Copie impossible"),
584 tr("Veuillez selectionner un objet a copier"))
586 if len(self.node_selected) != 1 :
587 QMessageBox.information( self,
588 tr("Copie impossible"),
589 tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
592 if len(self.QWParent.noeud_a_editer)!=1:
593 self.handleEditPasteMultiple()
596 noeudOuColler=self.node_selected[0]
598 if noeudOuColler == self.tree.racine:
602 #indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
603 indexNoeudOuColler=self.getTreeIndex(noeudOuColler)
606 noeudACopier=self.QWParent.noeud_a_editer[0]
607 #indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
608 indexNoeudACopier=self.getTreeIndex(noeudACopier)
610 QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
613 if (self.QWParent.edit != "couper"):
615 if noeudOuColler == self.tree.racine :
617 child=noeudOuColler.doPastePremier(noeudACopier)
620 child=noeudACopier.doPaste(noeudOuColler,pos)
621 if child==None or child==0:
622 QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
624 self.affiche_infos("Copie refusee",Qt.red)
625 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
627 nom=noeudACopier.item.sd.nom
628 child.item.nomme_sd(nom)
635 traceback.print_exc()
636 QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
638 self.affiche_infos("Copie refusee",Qt.red)
641 # il faut declarer le JDCDisplay_courant modifie
642 # suppression eventuelle du noeud selectionne
643 # si possible on renomme l objet comme le noeud couper
645 if (self.QWParent.edit == "couper"):
647 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
648 QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
652 # indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
653 indexNoeudACopier=self.getTreeIndex(noeudACopier)
654 noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
655 noeudACopier.treeParent.build_children()
660 self.QWParent.noeud_a_editer=[]
662 # on rend la copie a nouveau possible en liberant le flag edit
663 self.QWParent.edit="copier"
664 noeudACopier.select()
666 #----------------------------------#
667 def handleDeplaceMultiple(self):
668 #----------------------------------#
671 #----------------------------------#
672 def handleEditPasteMultiple(self):
673 #----------------------------------#
675 # On ne garde que les niveaux "Etape"
676 # On insere dans l'ordre du JDC
677 listeNoeudsACouper=[]
681 from InterfaceQT4 import compojdc
682 noeudOuColler=self.node_selected[0]
683 if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
684 QMessageBox.information( self,
685 tr("Copie impossible a cet endroit",),
686 tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
688 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
690 for noeud in self.QWParent.noeud_a_editer :
691 if not (isinstance(noeud.treeParent, compojdc.Node)): continue
692 indexInTree=noeud.treeParent.children.index(noeud)
694 for index in listeIndex:
695 if index < indexInTree : indice = indice +1
696 listeIndex.insert(indice, indexInTree)
697 listeNoeudsACouper.insert(indice, noeud)
699 noeudJdc=noeudOuColler.treeParent
701 # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
703 for index in listeIndex:
705 if indexNoeudOuColler < index:
706 indexTravail=indexTravail+dejaCrees
707 noeudOuColler=noeudJdc.children[indexNoeudOuColler]
708 noeud=noeudJdc.children[indexTravail]
709 child=noeud.doPaste(noeudOuColler)
710 listeChild.append(child)
711 dejaCrees=dejaCrees+1
713 self.QWParent.noeud_a_editer = []
714 for i in range(len(listeIndex)):
715 noeud=noeudJdc.children[indexNoeudOuColler+1+i]
716 self.QWParent.noeud_a_editer.append(noeud)
719 if self.QWParent.edit !="couper" : return
721 for index in listeIndex:
723 if indexNoeudOuColler < index:
724 indexTravail=indexTravail+(len(listeIndex))
725 noeud=noeudJdc.children[indexTravail]
727 listeItem.append(noeud.item)
728 listeASupprimer.append(noeud)
730 for i in range(len(listeChild)):
731 self.tree.item.suppitem(listeItem[i])
732 listeChild[i].item.update(listeItem[i])
734 self.QWParent.noeud_a_editer = []
737 #---------------------#
738 def getFileName(self):
739 #---------------------#
742 #---------------------------#
743 def get_file_variable(self) :
744 #---------------------------#
745 titre = tr("Choix d'un fichier XML")
746 texte = tr("Le fichier contient une commande MODEL\n")
747 texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
748 QMessageBox.information( self, titre,tr(texte))
750 fichier = QFileDialog.getOpenFileName(self.appliEficas,
751 tr('Ouvrir Fichier'),
752 self.appliEficas.CONFIGURATION.savedir,
753 self.appliEficas.trUtf8('Wrapper Files (*.xml);;''All Files (*)'))
756 #--------------------------------------------------#
757 def writeFile(self, fn, txt = None,formatLigne="beautifie"):
758 #--------------------------------------------------#
760 Public slot to write the text to a file.
762 @param fn filename to write to (string or QString)
763 @return flag indicating success
769 txt = self.get_text_JDC(self.format,formatLigne=formatLigne)
771 if len(txt) >= len(eol):
772 if txt[-len(eol):] != eol:
776 txt=self.ajoutVersionCataDsJDC(txt)
777 checksum=self.get_checksum(txt)
785 QMessageBox.critical(self, self.trUtf8('Save File'),
786 self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
787 .arg(unicode(fn)).arg(str(why)))
790 #-----------------------------------------------------------#
791 def get_text_JDC(self,format,pourRun=0,formatLigne="beautifie"):
792 #-----------------------------------------------------------#
793 if self.code == "MAP" and not(generator.plugins.has_key(format)): format = "MAP"
794 if generator.plugins.has_key(format):
796 # Le generateur existe on l'utilise
797 self.generator=generator.plugins[format]()
799 jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.CONFIGURATION)
800 if pourRun : jdc_formate=self.generator.textePourRun
802 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
803 if not self.generator.cr.estvide():
804 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
805 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
810 # Il n'existe pas c'est une erreur
811 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
812 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
818 fonction="run"+self.code
819 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
824 fonction="saveRun"+self.code
825 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
831 if not(self.jdc.isvalid()):
832 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
834 if len(self.jdc.etapes) != 1 :
835 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
837 if self.modified or self.fichier==None :
838 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
839 texte=self.get_text_JDC("MAP")
840 self.writeFile( self.fichierMapInput, txt = texte)
842 self.fichierMapInput=self.fichier
843 composant=self.jdc.etapes[0].nom.lower()[0:-5]
846 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
847 # then instantiate corresponding class and call getUseSalome() method
849 from mapengine.spec import factory
850 mapComponent = factory.new(composant)[0]
853 if mapComponent.getUseSalome():
854 command += " -r sappli"
855 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
858 self._viewTextExecute( textePython,"map_run",".sh")
860 # commande="rm "+self.fichierMapInput
861 # os.system(commande)
865 print traceback.print_exc()
867 #-------------------#
868 def runZCRACKS(self):
869 #-------------------#
870 if not(self.jdc.isvalid()):
871 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
873 if self.modified or self.fichier==None :
875 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
876 texte=self.get_text_JDC("ZCRACKS",pourRun=1)
877 self.writeFile( self.fichierZcracksInput, txt = texte)
879 self.fichierZcracksInput=self.fichier
881 #commande ="Zrun -zp "
883 textePython=(commande + self.fichierZcracksInput)
884 self._viewTextExecute( textePython,"run_zcracks",".sh")
886 print traceback.print_exc()
888 #-------------------#
889 def runCARMELCND(self):
890 #-------------------#
891 #if not(self.jdc.isvalid()):
892 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
894 if self.modified or self.fichier==None :
895 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
897 if not hasattr(self,'generator'): texte=self.get_text_JDC(self.format)
898 from PrepareRunCarmel import prepareRunCarmel
899 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
900 repMed=os.path.dirname(self.fichier)
901 repExeCarmel=self.generator.get_repExeCarmel()
902 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
903 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
904 f=open(nomFichier,'w')
907 commande="xterm -e sh "+nomFichier +"\n"
910 # self._viewTextExecute( textePython,"carmel_run",".sh")
911 #except Exception, e:
912 # print traceback.print_exc()
914 #-------------------#
915 def runCarmelCS(self):
916 #-------------------#
918 commande="runSession pilotyacsCS.py"
921 print traceback.print_exc()
923 #-----------------------------------------------------#
924 def determineNomFichier(self,path,extension):
925 #-----------------------------------------------------#
926 if DictExtensions.has_key(self.appli.code) :
927 chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
928 extensions= self.trUtf8(chaine1+ "All Files (*)")
930 extensions= self.trUtf8("JDC (*.comm);;" "All Files (*)")
932 if self.appli.code == "MAP" :
933 extensions = extensions + ";; Run (*.input);;"
935 fn = QFileDialog.getSaveFileName( self,
936 tr("sauvegarde"), path,
938 QFileDialog.DontConfirmOverwrite)
939 if fn.isNull(): return (0, None)
940 ext = QFileInfo(fn).suffix()
941 if ext.isEmpty(): fn.append(extension)
943 if QFileInfo(fn).exists():
944 abort = QMessageBox.warning(self,
945 tr("Sauvegarde du Fichier"),
946 tr("Le fichier <b>%s</b> existe deja.",str(fn)),
948 self.trUtf8("&Abandonner"))
949 if abort == 1 : return (0, "")
953 def saveRunMAP(self):
956 if not(self.jdc.isvalid()):
957 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
958 tr("Un JdC valide est necessaire pour creer un .input")
962 composant=self.jdc.etapes[0].nom.lower()[0:-5]
964 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
965 tr("Choix du composant obligatoire")
968 if hasattr(self.CONFIGURATION, "savedir"): path=self.CONFIGURATION.savedir
972 if self.fichier is not None and self.fichier != "" :
973 maBase=str(QFileInfo(self.fichier).baseName())+".input"
974 monPath=str(QFileInfo(self.fichier).absolutePath())
975 monNomFichier=os.path.join(monPath,maBase)
976 elif hasattr(self,'monNomFichierInput'):
977 monNomFichier=self.monNomFichierInput
980 monDialog=QFileDialog(self.appliEficas)
981 monDialog.setDirectory (path)
982 monDialog.setWindowTitle ("Save")
984 for c in monDialog.children():
985 if isinstance(c,QDialogButtonBox):
986 for b in c.children():
987 if isinstance(b,QPushButton):
989 if avant.toLatin1()=="&Open":
991 mesFiltres=QStringList()
992 mesFiltres << "input Map (*.input)" << "All Files (*)"
993 monDialog.setNameFilters(mesFiltres)
994 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
995 BOk=monDialog.exec_()
997 fn=str(monDialog.selectedFiles()[0].toLatin1())
998 if fn == "" or fn == None : return
999 if not fn.endswith(".input"):
1001 self.monNomFichierInput=fn
1003 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
1004 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
1005 texte=self.get_text_JDC("MAP")
1006 self.writeFile( self.fichierMapInput, txt = texte)
1008 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
1009 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
1010 (output, err) = p.communicate()
1014 def saveRunPSEN(self):
1019 if not(self.jdc.isvalid()):
1020 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
1021 tr("Un JdC valide est necessaire pour creer un .input")
1025 print generator.plugins.has_key(self.format)
1026 if generator.plugins.has_key(self.format):
1027 # Le generateur existe on l'utilise
1028 self.generator=generator.plugins[self.format]()
1030 self.generator.gener(self.jdc)
1031 self.generator.writeDefault('')
1032 except ValueError,e:
1033 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
1034 if not self.generator.cr.estvide():
1035 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
1036 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
1039 # Il n'existe pas c'est une erreur
1040 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
1041 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
1048 #-----------------------------------------#
1049 def cherche_Groupes(self):
1050 #-----------------------------------------#
1051 listeMA,listeNO=self.get_text_JDC("GroupMA")
1052 return listeMA,listeNO
1054 #-----------------------------------------#
1055 def cherche_Dico(self):
1056 #-----------------------------------------#
1058 format = self.appliEficas.format_fichier
1059 if generator.plugins.has_key(format):
1060 # Le generateur existe on l'utilise
1061 self.generator=generator.plugins[format]()
1062 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
1063 dicoCourant=self.generator.dico
1068 #-----------------------------------------#
1069 def handleAjoutGroup(self,listeGroup):
1070 #-----------------------------------------#
1073 from ajoutGroupe import handleAjoutGroupFiltre
1075 handleAjoutGroupFiltre(self,listeGroup)
1076 #print "apres handleAjoutGroupFiltre"
1081 #-----------------------------------------------------------------#
1082 def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"):
1083 #-----------------------------------------------------------------#
1085 Public slot to save the text to a file.
1087 @param path directory to save the file in (string or QString)
1088 @return tuple of two values (boolean, string) giving a success indicator and
1089 the name of the saved file
1093 if not self.modified and not saveas:
1094 return (0, None) # do nothing if text wasn't changed
1097 if DictExtensions.has_key(self.appli.code) :
1098 extension=DictExtensions[self.appli.code]
1104 if self.fichier is None or saveas:
1106 path=self.CONFIGURATION.savedir
1107 bOK, fn=self.determineNomFichier(path,extension)
1108 if bOK == 0 : return (0, None)
1109 if fn == None : return (0, None)
1110 if fn.isNull(): return (0, None)
1112 ulfile = os.path.abspath(unicode(fn))
1113 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1114 fn = unicode(QDir.convertSeparators(fn))
1118 if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None)
1120 self.modified = False
1121 if self.fileInfo is None or saveas:
1122 self.fileInfo = QFileInfo(self.fichier)
1123 self.fileInfo.setCaching(0)
1124 self.lastModified = self.fileInfo.lastModified()
1125 if newName is not None:
1126 self.appliEficas.addToRecentList(newName)
1127 self.tree.racine.item.getObject().nom=os.path.basename(newName)
1128 self.tree.racine.update_node_label()
1130 if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
1131 self.generator.writeDefault(fn)
1134 self.appliEficas.addJdcInSalome( self.fichier)
1136 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1137 self.appliEficas.setWindowTitle(nouveauTitre)
1139 return (1, self.fichier)
1142 #----------------------------------------------#
1143 def sauveLigneFile(self):
1144 #----------------------------------------------#
1146 return self.saveFile(formatLigne="Ligne")
1149 #----------------------------------------------#
1150 def saveFileAs(self, path = None,fileName=None):
1151 #----------------------------------------------#
1153 Public slot to save a file with a new name.
1155 @param path directory to save the file in (string or QString)
1156 @return tuple of two values (boolean, string) giving a success indicator and
1157 the name of the saved file
1159 if fileName != None :
1160 self.fichier = fileName
1161 return self.saveFile()
1162 return self.saveFile(path,1,"beautifie")
1166 #---------------------------------------------#
1167 def get_file(self,unite=None,fic_origine = ''):
1168 #---------------------------------------------#
1176 titre = tr("Choix unite %d ", unite)
1177 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
1178 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
1179 labeltexte = tr('Fichier pour unite ') + repr( unite)
1181 titre = tr("Choix d'un fichier de poursuite")
1182 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
1183 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
1185 QMessageBox.information( self, titre,QString.fromUtf8(texte))
1186 fn = QFileDialog.getOpenFileName(self.appliEficas,
1188 self.appliEficas.CONFIGURATION.savedir)
1191 # ce retour est impose par le get_file d'I_JDC
1194 ulfile = os.path.abspath(unicode(fn))
1195 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1197 # On utilise le convertisseur defini par format_fichier
1198 source=self.get_source(ulfile)
1200 # On a reussia convertir le fichier self.ulfile
1203 # Une erreur a ete rencontree
1205 return ulfile, jdcText
1207 #-------------------------------#
1208 def updateJdc(self, itemApres,texte):
1209 #--------------------------------#
1211 etape=monItem.item.object
1213 CONTEXT.set_current_step(etape)
1214 etape.build_includeInclude(texte)
1215 self.tree.racine.build_children()
1220 #-------------------------------------#
1221 def ajoutVersionCataDsJDC(self,txt):
1222 #-------------------------------------#
1223 if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
1224 ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata[0].VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
1225 texte=txt+ligneVersion
1228 #-------------------------------------#
1229 def verifieVersionCataDuJDC(self,text):
1230 #-------------------------------------#
1232 indexDeb=text.find("#VERSION_CATALOGUE:")
1233 indexFin=text.find(":FIN VERSION_CATALOGUE")
1235 self.versionCataDuJDC="sans"
1238 self.versionCataDuJDC=text[indexDeb+19:indexFin]
1239 textJDC=text[0:indexDeb]+text[indexFin+23:-1]
1241 self.versionCata="sans"
1242 if hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata[0].VERSION_CATALOGUE
1244 if self.versionCata==self.versionCataDuJDC : memeVersion=True
1245 return memeVersion,textJDC
1247 #-------------------------------#
1248 def traduitCatalogue(self,texte):
1249 #-------------------------------#
1250 nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
1251 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
1253 traducteur=__import__(nomTraducteur)
1254 monTraducteur=traducteur.MonTraducteur(texte)
1255 nouveauTexte=monTraducteur.traduit()
1261 #------------------------------#
1262 def verifieCHECKSUM(self,text):
1263 #------------------------------#
1264 indexDeb=text.find("#CHECKSUM:")
1267 indexFin=text.find(":FIN CHECKSUM")
1268 checkAvant=text[indexDeb:indexFin+13]
1269 textJDC=text[0:indexDeb]+text[indexFin+13:-1]
1270 checksum=self.get_checksum(textJDC)
1271 pareil=(checkAvant==checksum)
1272 return pareil, textJDC
1274 #---------------------------#
1275 def get_checksum(self,texte):
1276 #---------------------------#
1277 newtexte=texte.replace('"','\\"')
1278 commande='echo "'+newtexte+'"|md5sum'
1279 a=os.popen(commande)
1282 ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
1286 #---------------------------#
1287 def _newTELEMAC(self):
1288 #---------------------------#
1289 texte="INITIALIZATION();BOUNDARY_CONDITIONS();GENERAL_PARAMETERS();PHYSICAL_PARAMETERS();NUMERICAL_PARAMETERS();"
1293 #---------------------------#
1295 #---------------------------#
1296 texte="DIRECTORY() ; PSSE_PARAMETERS() ; SIMULATION() ; sansnom=DISTRIBUTION() ; sansnom=DISTRIBUTION() ; CORRELATION() ;"
1300 #---------------------------#
1302 #---------------------------#
1303 def _newZCRACKS(self):
1304 #---------------------------#
1305 texte="MAILLAGES();REMESHING();"
1308 #---------------------------#
1309 def _newJDCCND(self):
1310 #---------------------------#
1311 extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
1313 #if self.salome == 0 :
1314 QMessageBox.information( self,
1316 tr("Veuillez selectionner un fichier Med"))
1317 QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
1318 caption='Fichier Med',
1320 self.fichierMED=str(QSfichier.toLatin1())
1321 from acquiertGroupes import getGroupes
1322 erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
1323 if erreur != "" : print "a traiter"
1324 texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
1330 for groupe in self.listeGroupes :
1331 if groupe[0:8]=='CURRENT_':
1332 texteSources +=groupe[8:]+"=SOURCE("
1333 texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
1334 if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n"
1335 if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n"
1336 if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n"
1337 if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n"
1338 texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
1339 self.newTexteCND=texte
1344 #---------------------------#
1345 def BoutonFileSelected(self):
1346 #---------------------------#
1348 QSfichier=self.openfile.selectedFiles()[0]
1349 self.fichierMED=str(QSfichier.toLatin1())
1350 from acquiertGroupes import getGroupes
1351 erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
1352 if erreur != "" : print "a traiter"
1354 #-----------------------------
1355 def BoutonSalomePressed(self):
1356 #----------------------------
1357 Msg,self.listeGroupes=self.appliEficas.ChercheGrpMailleInSalome()
1358 self.fichierMED="A_partir_de_SMESH"
1359 self.nomMaillage="A_partir_de_SMESH"
1360 self.openfile.close()
1362 #-----------------------------
1363 def saveSplitterSizes(self):
1364 #----------------------------
1365 if self.splitter != None :
1366 self.splitterSizes = self.splitter.sizes()
1369 #-----------------------------
1370 def restoreSplitterSizes(self):
1371 #----------------------------
1372 if hasattr(self,'splitterSizes') :
1373 lenSizes = len(self.splitterSizes)
1375 if self.splitter != None and self.splitter.count() >= lenSizes :
1376 newSizes = self.splitter.sizes()
1377 newSizes[:len(self.splitterSizes)-1] = self.splitterSizes[:len(self.splitterSizes)-1]
1378 newSizes[len(newSizes)-1] = self.splitterSizes[len(self.splitterSizes)-1]
1379 self.splitter.setSizes(newSizes)
1381 #-----------------------------
1382 def getTreeIndex(self,noeud):
1383 #----------------------------
1385 if noeud in noeud.treeParent.children :
1386 indexNoeud=noeud.treeParent.children.index(noeud)
1388 if hasattr(noeud,'vraiParent') :
1390 noeudVraiParent = noeud.vraiParent
1391 while noeudVraiParent != noeud.treeParent and hasattr(noeudVraiParent,'vraiParent') :
1392 noeudVrai = noeudVraiParent
1393 noeudVraiParent = noeudVraiParent.vraiParent
1395 if noeudVraiParent == noeud.treeParent :
1396 indexNoeud=noeud.treeParent.children.index(noeudVrai)
1402 if __name__ == "__main__":
1404 name='prefs_'+prefs.code
1405 prefsCode=__import__(name)
1408 if hasattr(prefsCode,'encoding'):
1409 # Hack pour changer le codage par defaut des strings
1412 sys.setdefaultencoding(prefs.encoding)
1413 del sys.setdefaultencoding
1418 app = QApplication(sys.argv)
1419 mw = JDCEditor(None,'azAster.comm')
1420 app.setMainWidget(mw)
1421 app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
1424 res = app.exec_loop()