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 #----------------------------------------------------------------------------------------------------------#
59 QtGui.QWidget.__init__(self,None)
61 self.monOptionnel=None
62 self.fenetreCentraleAffichee=None
63 self.dejaDansPlieTout=False
64 self.afficheCommandesPliees = True
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 self.mode_nouv_commande=self.appliEficas.CONFIGURATION.mode_nouv_commande
82 self.affiche=self.appliEficas.CONFIGURATION.affiche
83 #if self.code in ['MAP','CARMELCND','PSEN'] : self.afficheCommandesPliees=False
84 if self.code in ['MAP','CARMELCND'] : self.afficheCommandesPliees=False
85 if self.code in ['MAP',] :
86 self.widgetTree.close()
88 self.appliEficas.resize(1440,self.appliEficas.height())
90 self.appliEficas.resize(2000,self.appliEficas.height())
92 self.version_code = session.d_env.cata
94 if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.multi==True:
95 self.readercata = readercata.READERCATA( self, self.appliEficas )
96 self.appliEficas.readercata=self.readercata
98 self.readercata=self.appliEficas.readercata
99 if self.readercata.fic_cata == None : return #Sortie Salome
100 self.titre=self.readercata.titre
101 self.Ordre_Des_Commandes=self.readercata.Ordre_Des_Commandes
102 self.Classement_Commandes_Ds_Arbre=self.readercata.Classement_Commandes_Ds_Arbre
104 self.format = self.appliEficas.format_fichier
107 self.liste_simp_reel=[]
110 nameConf='configuration_'+self.code
111 configuration=__import__(nameConf)
112 self.CONFIGURATION = self.appliEficas.CONFIGURATION
113 self.CONFIGStyle = self.appliEficas.CONFIGStyle
116 self.CONFIGURATION.generator_module
117 _module = __import__(self.CONFIGURATION.generator_module)
118 info = _module.entryPoint()
119 generator.plugins.addEntryPoint(info)
124 self.CONFIGURATION.convert_module
125 _module = __import__(self.CONFIGURATION.convert_module)
126 info = _module.entryPoint()
127 convert.plugins.addEntryPoint(info)
132 if hasattr(self.appliEficas,"statusBar"):
133 self.sb = self.appliEficas.statusBar()
136 self.lastModified = 0
138 self.modified = False
139 self.isReadOnly = False
140 self.node_selected = []
143 if self.code in ['Adao','MAP'] : self.afficheApresInsert=True
144 else : self.afficheApresInsert=False
145 if self.code in ['TELEMAC',] : self.enteteQTree='premier'
146 else : self.enteteQTree='complet'
147 if self.code in ['Adao','TELEMAC'] : self.affichePlie=True
148 else : self.affichePlie=False
150 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
152 #------- construction du jdc --------------
157 if self.fichier is not None: # fichier jdc fourni
158 self.fileInfo = QFileInfo(self.fichier)
159 self.fileInfo.setCaching(0)
163 self.jdc = self.readFile(self.fichier)
166 print "mauvaise lecture"
169 if self.jdc is not None and units is not None:
170 self.jdc.recorded_units=units
171 self.jdc.old_recorded_units=units
173 if not self.jdc: # nouveau jdc
175 self.jdc = self._newJDC(units=units)
177 self.jdc = self._newJDCInclude(units=units)
181 self.jdc.appli = self
182 self.jdc.lang = self.appli.langue
183 self.jdc.aReafficher=False
187 txt_exception = self.jdc.cr.get_mess_exception()
190 qApp.restoreOverrideCursor()
191 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
192 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
194 comploader.charger_composants("QT")
195 jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
196 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
197 self.viewJdcRapport()
202 self.tree = browser.JDCTree( jdc_item, self )
203 self.appliEficas.construitMenu()
205 #-------------------# Pour execution avec output sans une fenetre EFICAS. (erreurs encore dans la fenetre bash)
207 #-------------------#
208 if self.modified or self.fichier==None :
209 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
212 #monPython="/home/A96028/salome75/prerequisites/install/Python-273-tcl8513-tk8513/bin/python"
213 #monWrapper="/local00/home/A96028/GitEficasTravail/eficas/PSEN_Eficas/PSSEWrapper.py"
214 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
215 monWrapper = os.path.join(path1, 'PSSEWrapper.py')
216 cmd=['python',monWrapper]
218 w = ViewText2( self.QWParent, cmd )
219 w.setWindowTitle( "execution" )
223 #-------------------# Pour execution avec output et error dans le bash
225 #-------------------#
226 if self.modified or self.fichier==None :
227 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
230 #lancement avec le .bat
231 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
232 WrapperFilePath = os.path.join(path1, 'PSSEWrapper.py')
234 p = subprocess.Popen(['python',WrapperFilePath])
235 (out,err)=p.communicate()
239 #--------------------------------#
240 def _newJDC( self ,units = None):
241 #--------------------------------#
243 Initialise un nouveau JDC vierge
246 CONTEXT.unset_current_step()
249 if self.code == "CARMELCND" : texte=self._newJDCCND()
250 if self.code == "ZCRACKS" : texte=self._newZCRACKS()
251 if self.code == "TELEMAC" : texte=self._newTELEMAC()
252 if self.code == "PSEN" : texte = self._newPSEN()
253 # texte=self.newTexteCND
255 jdc=self.readercata.cata[0].JdC( procedure =texte,
257 cata=self.readercata.cata,
258 cata_ord_dico=self.readercata.cata_ordonne_dico,
259 rep_mat=self.CONFIGURATION.rep_mat
261 jdc.lang = self.appli.langue
262 if units is not None:
263 jdc.recorded_units=units
264 jdc.old_recorded_units=units
265 ## PNPN est ce que la ligne suivante est bien utile ?
266 if texte == "" :jdc.analyse()
269 #--------------------------------#
270 def _newJDCInclude( self ,units = None):
271 #--------------------------------#
273 Initialise un nouveau JDC vierge
275 import Extensions.jdc_include
276 JdC_aux=Extensions.jdc_include.JdC_include
277 CONTEXT.unset_current_step()
279 jaux=self.readercata.cata[0].JdC( procedure="",
281 cata=self.readercata.cata,
282 cata_ord_dico=self.readercata.cata_ordonne_dico,
283 rep_mat=self.CONFIGURATION.rep_mat,
287 J=JdC_aux( procedure="",
289 cata=self.readercata.cata,
290 cata_ord_dico=self.readercata.cata_ordonne_dico,
292 rep_mat=self.CONFIGURATION.rep_mat,
295 if units is not None:
296 J.recorded_units=units
297 J.old_recorded_units=units
301 #-------------------------------#
302 def readFile(self, fn):
303 #--------------------------------#
305 Public slot to read the text from a file.
306 @param fn filename to read from (string or QString)
310 # ------------------------------------------------------------------------------------
312 # ------------------------------------------------------------------------------------
314 jdcName=os.path.basename(fn)
315 # Il faut convertir le contenu du fichier en fonction du format
316 if convert.plugins.has_key( self.appliEficas.format_fichier_in ):
317 # Le convertisseur existe on l'utilise
319 p=convert.plugins[self.appliEficas.format_fichier_in]()
321 if p.text=="" : self.nouveau=1
322 pareil,texteNew=self.verifieCHECKSUM(p.text)
324 if pareil == False and (self.appliEficas.ssIhm == False) :
325 QMessageBox.warning( self, tr("fichier modifie"),tr("Attention! fichier change hors EFICAS"))
327 memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
328 if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
330 text=p.convert('exec',self.appliEficas)
331 if not p.cr.estvide():
332 self.affiche_infos("Erreur a la conversion",Qt.red)
334 self.affiche_infos("Type de fichier non reconnu",Qt.red)
335 if self.appliEficas.ssIhm == False:
336 QMessageBox.critical( self, tr("Type de fichier non reconnu"),
337 tr("EFICAS ne sait pas ouvrir le type de fichier %s" ,self.appliEficas.format_fichier_in))
340 CONTEXT.unset_current_step()
341 jdc=self.readercata.cata[0].JdC(procedure=text,
343 cata=self.readercata.cata,
344 cata_ord_dico=self.readercata.cata_ordonne_dico,
346 rep_mat=self.CONFIGURATION.rep_mat
348 # ----------------------------------------------------
350 # ----------------------------------------------------
351 self.modified = False
353 # qApp.restoreOverrideCursor()
354 if self.fileInfo!= None :
355 self.lastModified = self.fileInfo.lastModified()
357 self.lastModified = 1
358 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
359 self.appliEficas.setWindowTitle(nouveauTitre)
363 #-----------------------#
364 def get_source(self,file):
365 #-----------------------#
367 # Il faut convertir le contenu du fichier en fonction du format
368 if convert.plugins.has_key(self.format):
369 # Le convertisseur existe on l'utilise
370 p=convert.plugins[self.format]()
372 text=p.convert('execnoparseur')
373 if not p.cr.estvide():
374 self.affiche_infos("Erreur a la conversion",Qt.red)
377 # Il n'existe pas c'est une erreur
378 self.affiche_infos("Type de fichier non reconnu",Qt.red)
379 QMessageBox.critical( self, tr("Type de fichier non reconnu"),tr("EFICAS ne sait pas ouvrir ce type de fichier"))
382 #-----------------------------------------------------------------------#
383 def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
384 #--------------------------------------------------------------------#
385 w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
389 #----------------------------------------------#
390 def __generateTempFilename(self, prefix, suffix):
391 #----------------------------------------------#
393 (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
399 #----------------------------------------------#
400 def _viewTextExecute(self, txt, prefix, suffix):
401 #----------------------------------------------#
402 self.w = ViewText( self.QWParent )
403 self.w.setWindowTitle( "execution" )
404 self.monExe=QProcess(self.w)
405 pid=self.monExe.pid()
406 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
407 f=open(nomFichier,'w')
410 self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
411 self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
412 exe='sh ' + nomFichier
413 self.monExe.start(exe)
414 self.monExe.closeWriteChannel()
417 commande="rm "+ nomFichier
423 def readFromStdErr(self):
424 a=self.monExe.readAllStandardError()
425 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
427 def readFromStdOut(self) :
428 a=self.monExe.readAllStandardOutput()
429 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
433 #-----------------------#
434 def gestionParam(self):
435 #-----------------------#
436 w = MonWidgetCreeParam( self)
439 #-----------------------#
440 def viewJdcSource(self):
441 #-----------------------#
442 f=open(self.fichier,'r')
445 self._viewText(texteSource, "JDC_SOURCE")
447 #-----------------------#
449 #-----------------------#
450 strSource = str( self.get_text_JDC(self.format) )
451 self._viewText(strSource, "JDC_RESULTAT")
453 #-----------------------#
454 def viewJdcRapport(self):
455 #-----------------------#
456 strRapport = unicode( self.jdc.report() )
457 # on ajoute les regles
459 self._viewText(strRapport, "JDC_RAPPORT")
465 Public method called by the viewmanager to finally get rid of us.
471 #----------------------------------------------#
472 def affiche_infos(self,message,couleur=Qt.black):
473 #----------------------------------------------#
475 mapalette=self.sb.palette()
476 from PyQt4.QtGui import QPalette
477 mapalette.setColor( QPalette.WindowText, couleur )
478 self.sb.setPalette( mapalette );
479 self.sb.showMessage(QString.fromUtf8(message))#,2000)
481 #------------------------------#
482 def affiche_alerte(self,titre,message):
483 #------------------------------#
484 # appele par I_MACRO_ETAPE
485 QMessageBox.information( self, titre, message)
487 #-------------------#
488 def init_modif(self):
489 #-------------------#
491 Met l'attribut modified a 'o' : utilise par Eficas pour savoir
492 si un JDC doit etre sauvegarde avant destruction ou non
496 #---------------------------------------#
497 def chercheNoeudSelectionne(self,copie=1):
498 #---------------------------------------#
500 appele par Cut et Copy pour positionner self.node_selected
502 self.node_selected=[]
503 if len(self.tree.selectedItems()) == 0 : return
504 self.node_selected=self.tree.selectedItems()
507 #---------------------#
508 def handleSupprimer(self):
509 #---------------------#
510 self.chercheNoeudSelectionne()
511 if len(self.node_selected) == 0 : return
512 self.QWParent.noeud_a_editer = []
513 if self.node_selected[0]==self.tree.racine: return
514 if len(self.node_selected) == 1 : self.node_selected[0].delete()
515 else : self.node_selected[0].deleteMultiple(self.node_selected)
517 #---------------------#
518 def handleRechercher(self):
519 #---------------------#
520 from monRecherche import DRecherche
521 monRechercheDialg=DRecherche(parent=self,fl=0)
522 monRechercheDialg.show()
524 #---------------------#
525 def handleDeplier(self):
526 #---------------------#
528 if self.tree == None : return
529 #self.tree.collapseAll()
532 self.tree.expandItem(self.tree.topLevelItem(0))
534 if self.fenetreCentraleAffichee != None :
535 if hasattr(self.fenetreCentraleAffichee.node,'plieToutEtReaffiche'):
536 self.fenetreCentraleAffichee.node.plieToutEtReaffiche()
539 self.tree.expandItem(self.tree.topLevelItem(0))
541 if self.fenetreCentraleAffichee != None :
542 if hasattr(self.fenetreCentraleAffichee.node,'deplieToutEtReaffiche'):
543 self.fenetreCentraleAffichee.node.deplieToutEtReaffiche()
545 #---------------------#
546 def handleEditCut(self):
547 #---------------------#
549 Stocke dans Eficas.noeud_a_editer le noeud a couper
551 #print "handleEditCut"
552 self.chercheNoeudSelectionne()
553 self.QWParent.edit="couper"
554 self.QWParent.noeud_a_editer = self.node_selected
556 #-----------------------#
557 def handleEditCopy(self):
558 #-----------------------#
560 Stocke dans Eficas.noeud_a_editer le noeud a copier
562 self.chercheNoeudSelectionne()
563 if len(self.node_selected) == 0 : return
564 if len(self.node_selected) == 1 : self.node_selected[0].update_node_label_in_blue()
565 else : self.node_selected[0].update_plusieurs_node_label_in_blue(self.node_selected)
566 self.QWParent.edit="copier"
567 self.QWParent.noeud_a_editer = self.node_selected
569 #------------------------#
570 def handleEditPaste(self):
571 #------------------------#
573 Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
574 Ne permet que la copie d'objets de type Commande ou MCF
576 self.chercheNoeudSelectionne()
577 if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
578 QMessageBox.information( self,
579 tr("Copie impossible"),
580 tr("Veuillez selectionner un objet a copier"))
582 if len(self.node_selected) != 1 :
583 QMessageBox.information( self,
584 tr("Copie impossible"),
585 tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
588 if len(self.QWParent.noeud_a_editer)!=1:
589 self.handleEditPasteMultiple()
592 noeudOuColler=self.node_selected[0]
594 if noeudOuColler == self.tree.racine:
598 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
601 noeudACopier=self.QWParent.noeud_a_editer[0]
602 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
604 QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
607 if (self.QWParent.edit != "couper"):
609 if noeudOuColler == self.tree.racine :
610 child=noeudOuColler.doPastePremier(noeudACopier)
612 child=noeudACopier.doPaste(noeudOuColler,pos)
613 if child==None or child==0:
614 QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
616 self.affiche_infos("Copie refusee",Qt.red)
617 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
619 nom=noeudACopier.item.sd.nom
620 child.item.nomme_sd(nom)
627 traceback.print_exc()
628 QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
630 self.affiche_infos("Copie refusee",Qt.red)
633 # il faut declarer le JDCDisplay_courant modifie
634 # suppression eventuelle du noeud selectionne
635 # si possible on renomme l objet comme le noeud couper
637 if (self.QWParent.edit == "couper"):
639 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
640 QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
644 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
645 noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
646 noeudACopier.treeParent.build_children()
651 self.QWParent.noeud_a_editer=[]
653 # on rend la copie a nouveau possible en liberant le flag edit
654 self.QWParent.edit="copier"
655 noeudACopier.select()
657 #----------------------------------#
658 def handleDeplaceMultiple(self):
659 #----------------------------------#
662 #----------------------------------#
663 def handleEditPasteMultiple(self):
664 #----------------------------------#
666 # On ne garde que les niveaux "Etape"
667 # On insere dans l'ordre du JDC
668 listeNoeudsACouper=[]
672 from InterfaceQT4 import compojdc
673 noeudOuColler=self.node_selected[0]
674 if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
675 QMessageBox.information( self,
676 tr("Copie impossible a cet endroit",),
677 tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
679 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
681 for noeud in self.QWParent.noeud_a_editer :
682 if not (isinstance(noeud.treeParent, compojdc.Node)): continue
683 indexInTree=noeud.treeParent.children.index(noeud)
685 for index in listeIndex:
686 if index < indexInTree : indice = indice +1
687 listeIndex.insert(indice, indexInTree)
688 listeNoeudsACouper.insert(indice, noeud)
690 noeudJdc=noeudOuColler.treeParent
692 # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
694 for index in listeIndex:
696 if indexNoeudOuColler < index:
697 indexTravail=indexTravail+dejaCrees
698 noeudOuColler=noeudJdc.children[indexNoeudOuColler]
699 noeud=noeudJdc.children[indexTravail]
700 child=noeud.doPaste(noeudOuColler)
701 listeChild.append(child)
702 dejaCrees=dejaCrees+1
704 self.QWParent.noeud_a_editer = []
705 for i in range(len(listeIndex)):
706 noeud=noeudJdc.children[indexNoeudOuColler+1+i]
707 self.QWParent.noeud_a_editer.append(noeud)
710 if self.QWParent.edit !="couper" : return
712 for index in listeIndex:
714 if indexNoeudOuColler < index:
715 indexTravail=indexTravail+(len(listeIndex))
716 noeud=noeudJdc.children[indexTravail]
718 listeItem.append(noeud.item)
719 listeASupprimer.append(noeud)
721 for i in range(len(listeChild)):
722 self.tree.item.suppitem(listeItem[i])
723 listeChild[i].item.update(listeItem[i])
725 self.QWParent.noeud_a_editer = []
728 #---------------------#
729 def getFileName(self):
730 #---------------------#
733 #---------------------------#
734 def get_file_variable(self) :
735 #---------------------------#
736 titre = tr("Choix d'un fichier XML")
737 texte = tr("Le fichier contient une commande MODEL\n")
738 texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
739 QMessageBox.information( self, titre,tr(texte))
741 fichier = QFileDialog.getOpenFileName(self.appliEficas,
742 tr('Ouvrir Fichier'),
743 self.appliEficas.CONFIGURATION.savedir,
744 self.appliEficas.trUtf8('Wrapper Files (*.xml);;''All Files (*)'))
747 #--------------------------------------------------#
748 def writeFile(self, fn, txt = None,formatLigne="beautifie"):
749 #--------------------------------------------------#
751 Public slot to write the text to a file.
753 @param fn filename to write to (string or QString)
754 @return flag indicating success
760 txt = self.get_text_JDC(self.format,formatLigne=formatLigne)
762 if len(txt) >= len(eol):
763 if txt[-len(eol):] != eol:
767 txt=self.ajoutVersionCataDsJDC(txt)
768 checksum=self.get_checksum(txt)
776 QMessageBox.critical(self, self.trUtf8('Save File'),
777 self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
778 .arg(unicode(fn)).arg(str(why)))
781 #-----------------------------------------------------------#
782 def get_text_JDC(self,format,pourRun=0,formatLigne="beautifie"):
783 #-----------------------------------------------------------#
784 if self.code == "MAP" and not(generator.plugins.has_key(format)): format = "MAP"
785 if generator.plugins.has_key(format):
787 # Le generateur existe on l'utilise
788 self.generator=generator.plugins[format]()
790 jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.CONFIGURATION)
791 if pourRun : jdc_formate=self.generator.textePourRun
793 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
794 if not self.generator.cr.estvide():
795 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
796 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
801 # Il n'existe pas c'est une erreur
802 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
803 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
809 fonction="run"+self.code
810 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
815 fonction="saveRun"+self.code
816 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
822 if not(self.jdc.isvalid()):
823 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
825 if len(self.jdc.etapes) != 1 :
826 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
828 if self.modified or self.fichier==None :
829 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
830 texte=self.get_text_JDC("MAP")
831 self.writeFile( self.fichierMapInput, txt = texte)
833 self.fichierMapInput=self.fichier
834 composant=self.jdc.etapes[0].nom.lower()[0:-5]
837 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
838 # then instantiate corresponding class and call getUseSalome() method
840 from mapengine.spec import factory
841 mapComponent = factory.new(composant)[0]
844 if mapComponent.getUseSalome():
845 command += " -r sappli"
846 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
849 self._viewTextExecute( textePython,"map_run",".sh")
851 # commande="rm "+self.fichierMapInput
852 # os.system(commande)
856 print traceback.print_exc()
858 #-------------------#
859 def runZCRACKS(self):
860 #-------------------#
861 if not(self.jdc.isvalid()):
862 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
864 if self.modified or self.fichier==None :
866 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
867 texte=self.get_text_JDC("ZCRACKS",pourRun=1)
868 self.writeFile( self.fichierZcracksInput, txt = texte)
870 self.fichierZcracksInput=self.fichier
872 #commande ="Zrun -zp "
874 textePython=(commande + self.fichierZcracksInput)
875 self._viewTextExecute( textePython,"run_zcracks",".sh")
877 print traceback.print_exc()
879 #-------------------#
880 def runCARMELCND(self):
881 #-------------------#
882 #if not(self.jdc.isvalid()):
883 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
885 if self.modified or self.fichier==None :
886 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
888 if not hasattr(self,'generator'): texte=self.get_text_JDC(self.format)
889 from PrepareRunCarmel import prepareRunCarmel
890 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
891 repMed=os.path.dirname(self.fichier)
892 repExeCarmel=self.generator.get_repExeCarmel()
893 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
894 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
895 f=open(nomFichier,'w')
898 commande="xterm -e sh "+nomFichier +"\n"
901 # self._viewTextExecute( textePython,"carmel_run",".sh")
902 #except Exception, e:
903 # print traceback.print_exc()
905 #-------------------#
906 def runCarmelCS(self):
907 #-------------------#
909 commande="runSession pilotyacsCS.py"
912 print traceback.print_exc()
914 #-----------------------------------------------------#
915 def determineNomFichier(self,path,extension):
916 #-----------------------------------------------------#
917 if DictExtensions.has_key(self.appli.code) :
918 chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
919 extensions= self.trUtf8(chaine1+ "All Files (*)")
921 extensions= self.trUtf8("JDC (*.comm);;" "All Files (*)")
923 if self.appli.code == "MAP" :
924 extensions = extensions + ";; Run (*.input);;"
926 fn = QFileDialog.getSaveFileName( self,
927 tr("sauvegarde"), path,
929 QFileDialog.DontConfirmOverwrite)
930 if fn.isNull(): return (0, None)
931 ext = QFileInfo(fn).suffix()
932 if ext.isEmpty(): fn.append(extension)
934 if QFileInfo(fn).exists():
935 abort = QMessageBox.warning(self,
936 tr("Sauvegarde du Fichier"),
937 tr("Le fichier <b>%s</b> existe deja.",str(fn)),
939 self.trUtf8("&Abandonner"))
940 if abort == 1 : return (0, "")
944 def saveRunMAP(self):
947 if not(self.jdc.isvalid()):
948 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
949 tr("Un JdC valide est necessaire pour creer un .input")
953 composant=self.jdc.etapes[0].nom.lower()[0:-5]
955 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
956 tr("Choix du composant obligatoire")
959 if hasattr(self.CONFIGURATION, "savedir"): path=self.CONFIGURATION.savedir
963 if self.fichier is not None and self.fichier != "" :
964 maBase=str(QFileInfo(self.fichier).baseName())+".input"
965 monPath=str(QFileInfo(self.fichier).absolutePath())
966 monNomFichier=os.path.join(monPath,maBase)
967 elif hasattr(self,'monNomFichierInput'):
968 monNomFichier=self.monNomFichierInput
971 monDialog=QFileDialog(self.appliEficas)
972 monDialog.setDirectory (path)
973 monDialog.setWindowTitle ("Save")
975 for c in monDialog.children():
976 if isinstance(c,QDialogButtonBox):
977 for b in c.children():
978 if isinstance(b,QPushButton):
980 if avant.toLatin1()=="&Open":
982 mesFiltres=QStringList()
983 mesFiltres << "input Map (*.input)" << "All Files (*)"
984 monDialog.setNameFilters(mesFiltres)
985 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
986 BOk=monDialog.exec_()
988 fn=str(monDialog.selectedFiles()[0].toLatin1())
989 if fn == "" or fn == None : return
990 if not fn.endswith(".input"):
992 self.monNomFichierInput=fn
994 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
995 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
996 texte=self.get_text_JDC("MAP")
997 self.writeFile( self.fichierMapInput, txt = texte)
999 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
1000 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
1001 (output, err) = p.communicate()
1005 def saveRunPSEN(self):
1010 if not(self.jdc.isvalid()):
1011 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
1012 tr("Un JdC valide est necessaire pour creer un .input")
1016 print generator.plugins.has_key(self.format)
1017 if generator.plugins.has_key(self.format):
1018 # Le generateur existe on l'utilise
1019 self.generator=generator.plugins[self.format]()
1021 self.generator.gener(self.jdc)
1022 self.generator.writeDefault('')
1023 except ValueError,e:
1024 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
1025 if not self.generator.cr.estvide():
1026 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
1027 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
1030 # Il n'existe pas c'est une erreur
1031 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
1032 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
1039 #-----------------------------------------#
1040 def cherche_Groupes(self):
1041 #-----------------------------------------#
1042 listeMA,listeNO=self.get_text_JDC("GroupMA")
1043 return listeMA,listeNO
1045 #-----------------------------------------#
1046 def cherche_Dico(self):
1047 #-----------------------------------------#
1049 format = self.appliEficas.format_fichier
1050 if generator.plugins.has_key(format):
1051 # Le generateur existe on l'utilise
1052 self.generator=generator.plugins[format]()
1053 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
1054 dicoCourant=self.generator.dico
1059 #-----------------------------------------#
1060 def handleAjoutGroup(self,listeGroup):
1061 #-----------------------------------------#
1064 from ajoutGroupe import handleAjoutGroupFiltre
1066 handleAjoutGroupFiltre(self,listeGroup)
1067 #print "apres handleAjoutGroupFiltre"
1072 #-----------------------------------------------------------------#
1073 def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"):
1074 #-----------------------------------------------------------------#
1076 Public slot to save the text to a file.
1078 @param path directory to save the file in (string or QString)
1079 @return tuple of two values (boolean, string) giving a success indicator and
1080 the name of the saved file
1084 if not self.modified and not saveas:
1085 return (0, None) # do nothing if text wasn't changed
1088 if DictExtensions.has_key(self.appli.code) :
1089 extension=DictExtensions[self.appli.code]
1095 if self.fichier is None or saveas:
1097 path=self.CONFIGURATION.savedir
1098 bOK, fn=self.determineNomFichier(path,extension)
1099 if bOK == 0 : return (0, None)
1100 if fn == None : return (0, None)
1101 if fn.isNull(): return (0, None)
1103 ulfile = os.path.abspath(unicode(fn))
1104 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1105 fn = unicode(QDir.convertSeparators(fn))
1109 if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None)
1111 self.modified = False
1112 if self.fileInfo is None or saveas:
1113 self.fileInfo = QFileInfo(self.fichier)
1114 self.fileInfo.setCaching(0)
1115 self.lastModified = self.fileInfo.lastModified()
1116 if newName is not None:
1117 self.appliEficas.addToRecentList(newName)
1118 self.tree.racine.item.getObject().nom=os.path.basename(newName)
1119 self.tree.racine.update_node_label()
1121 if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
1122 self.generator.writeDefault(fn)
1125 self.appliEficas.addJdcInSalome( self.fichier)
1127 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1128 self.appliEficas.setWindowTitle(nouveauTitre)
1130 return (1, self.fichier)
1133 #----------------------------------------------#
1134 def sauveLigneFile(self):
1135 #----------------------------------------------#
1137 return self.saveFile(formatLigne="Ligne")
1140 #----------------------------------------------#
1141 def saveFileAs(self, path = None,fileName=None):
1142 #----------------------------------------------#
1144 Public slot to save a file with a new name.
1146 @param path directory to save the file in (string or QString)
1147 @return tuple of two values (boolean, string) giving a success indicator and
1148 the name of the saved file
1150 if fileName != None :
1151 self.fichier = fileName
1152 return self.saveFile()
1153 return self.saveFile(path,1,"beautifie")
1157 #---------------------------------------------#
1158 def get_file(self,unite=None,fic_origine = ''):
1159 #---------------------------------------------#
1167 titre = tr("Choix unite %d ", unite)
1168 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
1169 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
1170 labeltexte = tr('Fichier pour unite ') + repr( unite)
1172 titre = tr("Choix d'un fichier de poursuite")
1173 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
1174 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
1176 QMessageBox.information( self, titre,QString.fromUtf8(texte))
1177 fn = QFileDialog.getOpenFileName(self.appliEficas,
1179 self.appliEficas.CONFIGURATION.savedir)
1182 # ce retour est impose par le get_file d'I_JDC
1185 ulfile = os.path.abspath(unicode(fn))
1186 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1188 # On utilise le convertisseur defini par format_fichier
1189 source=self.get_source(ulfile)
1191 # On a reussia convertir le fichier self.ulfile
1194 # Une erreur a ete rencontree
1196 return ulfile, jdcText
1198 #-------------------------------#
1199 def updateJdc(self, itemApres,texte):
1200 #--------------------------------#
1202 etape=monItem.item.object
1204 CONTEXT.set_current_step(etape)
1205 etape.build_includeInclude(texte)
1206 self.tree.racine.build_children()
1211 #-------------------------------------#
1212 def ajoutVersionCataDsJDC(self,txt):
1213 #-------------------------------------#
1214 if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
1215 ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata[0].VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
1216 texte=txt+ligneVersion
1219 #-------------------------------------#
1220 def verifieVersionCataDuJDC(self,text):
1221 #-------------------------------------#
1223 indexDeb=text.find("#VERSION_CATALOGUE:")
1224 indexFin=text.find(":FIN VERSION_CATALOGUE")
1226 self.versionCataDuJDC="sans"
1229 self.versionCataDuJDC=text[indexDeb+19:indexFin]
1230 textJDC=text[0:indexDeb]+text[indexFin+23:-1]
1232 self.versionCata="sans"
1233 if hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata[0].VERSION_CATALOGUE
1235 if self.versionCata==self.versionCataDuJDC : memeVersion=True
1236 return memeVersion,textJDC
1238 #-------------------------------#
1239 def traduitCatalogue(self,texte):
1240 #-------------------------------#
1241 nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
1242 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
1244 traducteur=__import__(nomTraducteur)
1245 monTraducteur=traducteur.MonTraducteur(texte)
1246 nouveauTexte=monTraducteur.traduit()
1252 #------------------------------#
1253 def verifieCHECKSUM(self,text):
1254 #------------------------------#
1255 indexDeb=text.find("#CHECKSUM:")
1258 indexFin=text.find(":FIN CHECKSUM")
1259 checkAvant=text[indexDeb:indexFin+13]
1260 textJDC=text[0:indexDeb]+text[indexFin+13:-1]
1261 checksum=self.get_checksum(textJDC)
1262 pareil=(checkAvant==checksum)
1263 return pareil, textJDC
1265 #---------------------------#
1266 def get_checksum(self,texte):
1267 #---------------------------#
1268 newtexte=texte.replace('"','\\"')
1269 commande='echo "'+newtexte+'"|md5sum'
1270 a=os.popen(commande)
1273 ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
1277 #---------------------------#
1278 def _newTELEMAC(self):
1279 #---------------------------#
1280 texte="INITIALIZATION();BOUNDARY_CONDITIONS();GENERAL_PARAMETERS();PHYSICAL_PARAMETERS();NUMERICAL_PARAMETERS();"
1284 #---------------------------#
1286 #---------------------------#
1287 texte="DIRECTORY() ; PSSE_PARAMETERS() ; SIMULATION() ; sansnom=DISTRIBUTION() ; sansnom=DISTRIBUTION() ; CORRELATION() ;"
1291 #---------------------------#
1293 #---------------------------#
1294 def _newZCRACKS(self):
1295 #---------------------------#
1296 texte="MAILLAGES();REMESHING();"
1299 #---------------------------#
1300 def _newJDCCND(self):
1301 #---------------------------#
1302 extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
1304 #if self.salome == 0 :
1305 QMessageBox.information( self,
1307 tr("Veuillez selectionner un fichier Med"))
1308 QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
1309 caption='Fichier Med',
1311 self.fichierMED=str(QSfichier.toLatin1())
1312 from acquiertGroupes import getGroupes
1313 erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
1314 if erreur != "" : print "a traiter"
1315 texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
1321 for groupe in self.listeGroupes :
1322 if groupe[0:8]=='CURRENT_':
1323 texteSources +=groupe[8:]+"=SOURCE("
1324 texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
1325 if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n"
1326 if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n"
1327 if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n"
1328 if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n"
1329 texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
1330 self.newTexteCND=texte
1335 #---------------------------#
1336 def BoutonFileSelected(self):
1337 #---------------------------#
1339 QSfichier=self.openfile.selectedFiles()[0]
1340 self.fichierMED=str(QSfichier.toLatin1())
1341 from acquiertGroupes import getGroupes
1342 erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
1343 if erreur != "" : print "a traiter"
1345 #-----------------------------
1346 def BoutonSalomePressed(self):
1347 #----------------------------
1348 Msg,self.listeGroupes=self.appliEficas.ChercheGrpMailleInSalome()
1349 self.fichierMED="A_partir_de_SMESH"
1350 self.nomMaillage="A_partir_de_SMESH"
1351 self.openfile.close()
1354 if __name__ == "__main__":
1356 name='prefs_'+prefs.code
1357 prefsCode=__import__(name)
1360 if hasattr(prefsCode,'encoding'):
1361 # Hack pour changer le codage par defaut des strings
1364 sys.setdefaultencoding(prefs.encoding)
1365 del sys.setdefaultencoding
1370 app = QApplication(sys.argv)
1371 mw = JDCEditor(None,'azAster.comm')
1372 app.setMainWidget(mw)
1373 app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
1376 res = app.exec_loop()