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 monWidgetCreeParam import MonWidgetCreeParam
44 DictExtensions= {"MAP" : ".map"}
48 class JDCEditor(Ui_baseWidget,QtGui.QWidget):
49 # ----------------------------------------- #
54 def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None):
55 #----------------------------------------------------------------------------------------------------------#
58 QtGui.QWidget.__init__(self,None)
60 self.monOptionnel=None
61 self.fenetreCentraleAffichee=None
62 self.dejaDansPlieTout=False
63 self.afficheCommandesPliees = True
64 self.appliEficas = appli
65 self.appli = appli #---- attendu par IHM
67 self.fichier = fichier
70 self.QWParent = QWParent
73 self.salome = self.appliEficas.salome
76 print "dans JDC pas d appli ????????"
78 # ces attributs sont mis a jour par definitCode appelee par newEditor
79 self.code = self.appliEficas.CONFIGURATION.code
80 self.mode_nouv_commande=self.appliEficas.CONFIGURATION.mode_nouv_commande
81 self.affiche=self.appliEficas.CONFIGURATION.affiche
82 if self.code in ['MAP','CARMELCND'] : self.afficheCommandesPliees=False
83 if self.code in ['MAP',] :
84 self.widgetTree.close()
86 self.appliEficas.resize(1440,self.appliEficas.height())
88 self.appliEficas.resize(2000,self.appliEficas.height())
90 self.version_code = session.d_env.cata
92 if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.multi==True:
93 self.readercata = readercata.READERCATA( self, self.appliEficas )
94 self.appliEficas.readercata=self.readercata
96 self.readercata=self.appliEficas.readercata
97 if self.readercata.fic_cata == None : return #Sortie Salome
98 self.titre=self.readercata.titre
99 self.Ordre_Des_Commandes=self.readercata.Ordre_Des_Commandes
100 self.Classement_Commandes_Ds_Arbre=self.readercata.Classement_Commandes_Ds_Arbre
102 self.format = self.appliEficas.format_fichier
105 self.liste_simp_reel=[]
108 nameConf='configuration_'+self.code
109 configuration=__import__(nameConf)
110 self.CONFIGURATION = self.appliEficas.CONFIGURATION
111 self.CONFIGStyle = self.appliEficas.CONFIGStyle
114 self.CONFIGURATION.generator_module
115 _module = __import__(self.CONFIGURATION.generator_module)
116 info = _module.entryPoint()
117 generator.plugins.addEntryPoint(info)
122 self.CONFIGURATION.convert_module
123 _module = __import__(self.CONFIGURATION.convert_module)
124 info = _module.entryPoint()
125 convert.plugins.addEntryPoint(info)
130 if hasattr(self.appliEficas,"statusBar"):
131 self.sb = self.appliEficas.statusBar()
134 self.lastModified = 0
136 self.modified = False
137 self.isReadOnly = False
138 self.node_selected = []
141 if self.code in ['Adao','MAP'] : self.afficheApresInsert=True
142 else : self.afficheApresInsert=False
143 if self.code in ['TELEMAC',] : self.enteteQTree='premier'
144 else : self.enteteQTree='complet'
145 if self.code in ['Adao','TELEMAC'] : self.affichePlie=True
146 else : self.affichePlie=False
148 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
150 #------- construction du jdc --------------
155 if self.fichier is not None: # fichier jdc fourni
156 self.fileInfo = QFileInfo(self.fichier)
157 self.fileInfo.setCaching(0)
161 self.jdc = self.readFile(self.fichier)
164 print "mauvaise lecture"
167 if self.jdc is not None and units is not None:
168 self.jdc.recorded_units=units
169 self.jdc.old_recorded_units=units
171 if not self.jdc: # nouveau jdc
173 self.jdc = self._newJDC(units=units)
175 self.jdc = self._newJDCInclude(units=units)
179 self.jdc.appli = self
180 self.jdc.lang = self.appli.langue
181 self.jdc.aReafficher=False
185 txt_exception = self.jdc.cr.get_mess_exception()
188 qApp.restoreOverrideCursor()
189 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
190 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
192 comploader.charger_composants("QT")
193 jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
194 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
195 self.viewJdcRapport()
197 # if self.code=="TELEMAC" : print "kkkkkkkk"
201 self.tree = browser.JDCTree( jdc_item, self )
202 self.appliEficas.construitMenu()
204 #-------------------#
206 #-------------------#
207 if self.modified or self.fichier==None :
208 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
211 #lancement avec le .bat
212 textePython="PSEN_Path='EficasV2\PSEN_Eficas\PSEN\PSSEWrapper.py'\
214 \np=subprocess.Popen(['python',PSEN_Path])\
215 \n(out,err)=p.communicate()"
217 #lancement avec qteficas_psen.py
219 #textePython='C:\Users\plscist\Desktop\Vico\sauveEficasPSEN~\EficasV1\PSEN_Eficas\PSEN\PSSEWrapper.py'
221 self._viewTextExecute( textePython,"psen_run",".py")
223 print traceback.print_exc()
226 #--------------------------------#
227 def _newJDC( self ,units = None):
228 #--------------------------------#
230 Initialise un nouveau JDC vierge
233 CONTEXT.unset_current_step()
236 if self.code == "CARMELCND" : texte=self._newJDCCND()
237 if self.code == "ZCRACKS" : texte=self._newZCRACKS()
238 if self.code == "TELEMAC" : texte=self._newTELEMAC()
239 # texte=self.newTexteCND
241 jdc=self.readercata.cata[0].JdC( procedure =texte,
243 cata=self.readercata.cata,
244 cata_ord_dico=self.readercata.cata_ordonne_dico,
245 rep_mat=self.CONFIGURATION.rep_mat
247 jdc.lang = self.appli.langue
248 if units is not None:
249 jdc.recorded_units=units
250 jdc.old_recorded_units=units
251 ## PNPN est ce que la ligne suivante est bien utile ?
252 if texte == "" :jdc.analyse()
255 #--------------------------------#
256 def _newJDCInclude( self ,units = None):
257 #--------------------------------#
259 Initialise un nouveau JDC vierge
261 import Extensions.jdc_include
262 JdC_aux=Extensions.jdc_include.JdC_include
263 CONTEXT.unset_current_step()
265 jaux=self.readercata.cata[0].JdC( procedure="",
267 cata=self.readercata.cata,
268 cata_ord_dico=self.readercata.cata_ordonne_dico,
269 rep_mat=self.CONFIGURATION.rep_mat,
273 J=JdC_aux( procedure="",
275 cata=self.readercata.cata,
276 cata_ord_dico=self.readercata.cata_ordonne_dico,
278 rep_mat=self.CONFIGURATION.rep_mat,
281 if units is not None:
282 J.recorded_units=units
283 J.old_recorded_units=units
287 #-------------------------------#
288 def readFile(self, fn):
289 #--------------------------------#
291 Public slot to read the text from a file.
292 @param fn filename to read from (string or QString)
296 # ------------------------------------------------------------------------------------
298 # ------------------------------------------------------------------------------------
300 jdcName=os.path.basename(fn)
301 # Il faut convertir le contenu du fichier en fonction du format
302 if convert.plugins.has_key( self.appliEficas.format_fichier_in ):
303 # Le convertisseur existe on l'utilise
305 p=convert.plugins[self.appliEficas.format_fichier_in]()
307 if p.text=="" : self.nouveau=1
308 pareil,texteNew=self.verifieCHECKSUM(p.text)
310 if pareil == False and (self.appliEficas.ssIhm == False) :
311 QMessageBox.warning( self, tr("fichier modifie"),tr("Attention! fichier change hors EFICAS"))
313 memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
314 if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
316 text=p.convert('exec',self.appliEficas)
317 if not p.cr.estvide():
318 self.affiche_infos("Erreur a la conversion",Qt.red)
320 self.affiche_infos("Type de fichier non reconnu",Qt.red)
321 if self.appliEficas.ssIhm == False:
322 QMessageBox.critical( self, tr("Type de fichier non reconnu"),
323 tr("EFICAS ne sait pas ouvrir le type de fichier %s" ,self.appliEficas.format_fichier_in))
326 CONTEXT.unset_current_step()
327 jdc=self.readercata.cata[0].JdC(procedure=text,
329 cata=self.readercata.cata,
330 cata_ord_dico=self.readercata.cata_ordonne_dico,
332 rep_mat=self.CONFIGURATION.rep_mat
334 # ----------------------------------------------------
336 # ----------------------------------------------------
337 self.modified = False
339 # qApp.restoreOverrideCursor()
340 if self.fileInfo!= None :
341 self.lastModified = self.fileInfo.lastModified()
343 self.lastModified = 1
344 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
345 self.appliEficas.setWindowTitle(nouveauTitre)
349 #-----------------------#
350 def get_source(self,file):
351 #-----------------------#
353 # Il faut convertir le contenu du fichier en fonction du format
354 if convert.plugins.has_key(self.format):
355 # Le convertisseur existe on l'utilise
356 p=convert.plugins[self.format]()
358 text=p.convert('execnoparseur')
359 if not p.cr.estvide():
360 self.affiche_infos("Erreur a la conversion",Qt.red)
363 # Il n'existe pas c'est une erreur
364 self.affiche_infos("Type de fichier non reconnu",Qt.red)
365 QMessageBox.critical( self, tr("Type de fichier non reconnu"),tr("EFICAS ne sait pas ouvrir ce type de fichier"))
368 #-----------------------------------------------------------------------#
369 def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
370 #--------------------------------------------------------------------#
371 w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
375 #----------------------------------------------#
376 def __generateTempFilename(self, prefix, suffix):
377 #----------------------------------------------#
379 (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
385 #----------------------------------------------#
386 def _viewTextExecute(self, txt, prefix, suffix):
387 #----------------------------------------------#
388 self.w = ViewText( self.QWParent )
389 self.w.setWindowTitle( "execution" )
390 self.monExe=QProcess(self.w)
391 pid=self.monExe.pid()
392 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
393 f=open(nomFichier,'w')
396 self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
397 self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
398 exe='sh /tmp/test.sh'
399 self.monExe.start(exe)
400 self.monExe.closeWriteChannel()
403 commande="rm "+ nomFichier
409 def readFromStdErr(self):
410 a=self.monExe.readAllStandardError()
411 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
413 def readFromStdOut(self) :
414 a=self.monExe.readAllStandardOutput()
415 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
419 #-----------------------#
420 def gestionParam(self):
421 #-----------------------#
422 w = MonWidgetCreeParam( self)
425 #-----------------------#
426 def viewJdcSource(self):
427 #-----------------------#
428 f=open(self.fichier,'r')
431 self._viewText(texteSource, "JDC_SOURCE")
433 #-----------------------#
435 #-----------------------#
436 strSource = str( self.get_text_JDC(self.format) )
437 self._viewText(strSource, "JDC_RESULTAT")
439 #-----------------------#
440 def viewJdcRapport(self):
441 #-----------------------#
442 strRapport = unicode( self.jdc.report() )
443 self._viewText(strRapport, "JDC_RAPPORT")
449 Public method called by the viewmanager to finally get rid of us.
455 #----------------------------------------------#
456 def affiche_infos(self,message,couleur=Qt.black):
457 #----------------------------------------------#
459 mapalette=self.sb.palette()
460 from PyQt4.QtGui import QPalette
461 mapalette.setColor( QPalette.WindowText, couleur )
462 self.sb.setPalette( mapalette );
463 self.sb.showMessage(QString.fromUtf8(message))#,2000)
465 #------------------------------#
466 def affiche_alerte(self,titre,message):
467 #------------------------------#
468 # appele par I_MACRO_ETAPE
469 QMessageBox.information( self, titre, message)
471 #-------------------#
472 def init_modif(self):
473 #-------------------#
475 Met l'attribut modified a 'o' : utilise par Eficas pour savoir
476 si un JDC doit etre sauvegarde avant destruction ou non
480 #---------------------------------------#
481 def chercheNoeudSelectionne(self,copie=1):
482 #---------------------------------------#
484 appele par Cut et Copy pour positionner self.node_selected
486 self.node_selected=[]
487 if len(self.tree.selectedItems()) == 0 : return
488 self.node_selected=self.tree.selectedItems()
491 #---------------------#
492 def handleSupprimer(self):
493 #---------------------#
494 self.chercheNoeudSelectionne()
495 if len(self.node_selected) == 0 : return
496 self.QWParent.noeud_a_editer = []
497 if self.node_selected[0]==self.tree.racine: return
498 if len(self.node_selected) == 1 : self.node_selected[0].delete()
499 else : self.node_selected[0].deleteMultiple(self.node_selected)
501 #---------------------#
502 def handleRechercher(self):
503 #---------------------#
504 from monRecherche import DRecherche
505 monRechercheDialg=DRecherche(parent=self,fl=0)
506 monRechercheDialg.show()
508 #---------------------#
509 def handleDeplier(self):
510 #---------------------#
512 if self.tree == None : return
513 #self.tree.collapseAll()
516 self.tree.expandItem(self.tree.topLevelItem(0))
518 if self.fenetreCentraleAffichee != None :
519 if hasattr(self.fenetreCentraleAffichee.node,'plieToutEtReaffiche'):
520 self.fenetreCentraleAffichee.node.plieToutEtReaffiche()
523 self.tree.expandItem(self.tree.topLevelItem(0))
525 if self.fenetreCentraleAffichee != None :
526 if hasattr(self.fenetreCentraleAffichee.node,'deplieToutEtReaffiche'):
527 self.fenetreCentraleAffichee.node.deplieToutEtReaffiche()
529 #---------------------#
530 def handleEditCut(self):
531 #---------------------#
533 Stocke dans Eficas.noeud_a_editer le noeud a couper
535 #print "handleEditCut"
536 self.chercheNoeudSelectionne()
537 self.QWParent.edit="couper"
538 self.QWParent.noeud_a_editer = self.node_selected
540 #-----------------------#
541 def handleEditCopy(self):
542 #-----------------------#
544 Stocke dans Eficas.noeud_a_editer le noeud a copier
546 self.chercheNoeudSelectionne()
547 if len(self.node_selected) == 0 : return
548 if len(self.node_selected) == 1 : self.node_selected[0].update_node_label_in_blue()
549 else : self.node_selected[0].update_plusieurs_node_label_in_blue(self.node_selected)
550 self.QWParent.edit="copier"
551 self.QWParent.noeud_a_editer = self.node_selected
553 #------------------------#
554 def handleEditPaste(self):
555 #------------------------#
557 Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
558 Ne permet que la copie d'objets de type Commande ou MCF
560 self.chercheNoeudSelectionne()
561 if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
562 QMessageBox.information( self,
563 tr("Copie impossible"),
564 tr("Veuillez selectionner un objet a copier"))
566 if len(self.node_selected) != 1 :
567 QMessageBox.information( self,
568 tr("Copie impossible"),
569 tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
572 if len(self.QWParent.noeud_a_editer)!=1:
573 self.handleEditPasteMultiple()
576 noeudOuColler=self.node_selected[0]
578 if noeudOuColler == self.tree.racine:
582 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
585 noeudACopier=self.QWParent.noeud_a_editer[0]
586 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
588 QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
591 if (self.QWParent.edit != "couper"):
593 if noeudOuColler == self.tree.racine :
594 child=noeudOuColler.doPastePremier(noeudACopier)
596 child=noeudACopier.doPaste(noeudOuColler,pos)
597 if child==None or child==0:
598 QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
600 self.affiche_infos("Copie refusee",Qt.red)
601 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
603 nom=noeudACopier.item.sd.nom
604 child.item.nomme_sd(nom)
611 traceback.print_exc()
612 QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
614 self.affiche_infos("Copie refusee",Qt.red)
617 # il faut declarer le JDCDisplay_courant modifie
618 # suppression eventuelle du noeud selectionne
619 # si possible on renomme l objet comme le noeud couper
621 if (self.QWParent.edit == "couper"):
623 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
624 QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
628 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
629 noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
630 noeudACopier.treeParent.build_children()
635 self.QWParent.noeud_a_editer=[]
637 # on rend la copie a nouveau possible en liberant le flag edit
638 self.QWParent.edit="copier"
639 noeudACopier.select()
641 #----------------------------------#
642 def handleDeplaceMultiple(self):
643 #----------------------------------#
646 #----------------------------------#
647 def handleEditPasteMultiple(self):
648 #----------------------------------#
650 # On ne garde que les niveaux "Etape"
651 # On insere dans l'ordre du JDC
652 listeNoeudsACouper=[]
656 from InterfaceQT4 import compojdc
657 noeudOuColler=self.node_selected[0]
658 if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
659 QMessageBox.information( self,
660 tr("Copie impossible a cet endroit",),
661 tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
663 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
665 for noeud in self.QWParent.noeud_a_editer :
666 if not (isinstance(noeud.treeParent, compojdc.Node)): continue
667 indexInTree=noeud.treeParent.children.index(noeud)
669 for index in listeIndex:
670 if index < indexInTree : indice = indice +1
671 listeIndex.insert(indice, indexInTree)
672 listeNoeudsACouper.insert(indice, noeud)
674 noeudJdc=noeudOuColler.treeParent
676 # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
678 for index in listeIndex:
680 if indexNoeudOuColler < index:
681 indexTravail=indexTravail+dejaCrees
682 noeudOuColler=noeudJdc.children[indexNoeudOuColler]
683 noeud=noeudJdc.children[indexTravail]
684 child=noeud.doPaste(noeudOuColler)
685 listeChild.append(child)
686 dejaCrees=dejaCrees+1
688 self.QWParent.noeud_a_editer = []
689 for i in range(len(listeIndex)):
690 noeud=noeudJdc.children[indexNoeudOuColler+1+i]
691 self.QWParent.noeud_a_editer.append(noeud)
694 if self.QWParent.edit !="couper" : return
696 for index in listeIndex:
698 if indexNoeudOuColler < index:
699 indexTravail=indexTravail+(len(listeIndex))
700 noeud=noeudJdc.children[indexTravail]
702 listeItem.append(noeud.item)
703 listeASupprimer.append(noeud)
705 for i in range(len(listeChild)):
706 self.tree.item.suppitem(listeItem[i])
707 listeChild[i].item.update(listeItem[i])
709 self.QWParent.noeud_a_editer = []
712 #---------------------#
713 def getFileName(self):
714 #---------------------#
717 #---------------------------#
718 def get_file_variable(self) :
719 #---------------------------#
720 titre = tr("Choix d'un fichier XML")
721 texte = tr("Le fichier contient une commande MODEL\n")
722 texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
723 QMessageBox.information( self, titre,tr(texte))
725 fichier = QFileDialog.getOpenFileName(self.appliEficas,
726 tr('Ouvrir Fichier'),
727 self.appliEficas.CONFIGURATION.savedir,
728 self.appliEficas.trUtf8('Wrapper Files (*.xml);;''All Files (*)'))
731 #--------------------------------------------------#
732 def writeFile(self, fn, txt = None,formatLigne="beautifie"):
733 #--------------------------------------------------#
735 Public slot to write the text to a file.
737 @param fn filename to write to (string or QString)
738 @return flag indicating success
744 txt = self.get_text_JDC(self.format,formatLigne=formatLigne)
746 if len(txt) >= len(eol):
747 if txt[-len(eol):] != eol:
751 txt=self.ajoutVersionCataDsJDC(txt)
752 checksum=self.get_checksum(txt)
760 QMessageBox.critical(self, self.trUtf8('Save File'),
761 self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
762 .arg(unicode(fn)).arg(str(why)))
765 #-----------------------------------------------------------#
766 def get_text_JDC(self,format,pourRun=0,formatLigne="beautifie"):
767 #-----------------------------------------------------------#
768 if self.code == "MAP" and not(generator.plugins.has_key(format)): format = "MAP"
769 if generator.plugins.has_key(format):
772 # Le generateur existe on l'utilise
773 self.generator=generator.plugins[format]()
775 jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.CONFIGURATION)
776 if pourRun : jdc_formate=self.generator.textePourRun
778 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
779 if not self.generator.cr.estvide():
780 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
781 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
786 # Il n'existe pas c'est une erreur
787 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
788 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
794 fonction="run"+self.code
795 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
800 fonction="saveRun"+self.code
801 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
807 if not(self.jdc.isvalid()):
808 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
810 if len(self.jdc.etapes) != 1 :
811 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
813 if self.modified or self.fichier==None :
814 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
815 texte=self.get_text_JDC("MAP")
816 self.writeFile( self.fichierMapInput, txt = texte)
818 self.fichierMapInput=self.fichier
819 composant=self.jdc.etapes[0].nom.lower()[0:-5]
822 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
823 # then instantiate corresponding class and call getUseSalome() method
825 from mapengine.spec import factory
826 mapComponent = factory.new(composant)[0]
829 if mapComponent.getUseSalome():
830 command += " -r sappli"
831 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
834 self._viewTextExecute( textePython,"map_run",".sh")
836 commande="rm "+self.fichierMapInput
841 print traceback.print_exc()
843 #-------------------#
844 def runZCRACKS(self):
845 #-------------------#
846 if not(self.jdc.isvalid()):
847 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
849 if self.modified or self.fichier==None :
851 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
852 texte=self.get_text_JDC("ZCRACKS",pourRun=1)
853 self.writeFile( self.fichierZcracksInput, txt = texte)
855 self.fichierZcracksInput=self.fichier
857 #commande ="Zrun -zp "
859 textePython=(commande + self.fichierZcracksInput)
860 self._viewTextExecute( textePython,"run_zcracks",".sh")
862 print traceback.print_exc()
864 #-------------------#
865 def runCARMELCND(self):
866 #-------------------#
867 #if not(self.jdc.isvalid()):
868 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
870 if self.modified or self.fichier==None :
871 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
873 if not hasattr(self,'generator'): texte=self.get_text_JDC(self.format)
874 from PrepareRunCarmel import prepareRunCarmel
875 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
876 repMed=os.path.dirname(self.fichier)
877 repExeCarmel=self.generator.get_repExeCarmel()
878 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
879 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
880 f=open(nomFichier,'w')
883 commande="xterm -e sh "+nomFichier +"\n"
886 # self._viewTextExecute( textePython,"carmel_run",".sh")
887 #except Exception, e:
888 # print traceback.print_exc()
890 #-------------------#
891 def runCarmelCS(self):
892 #-------------------#
894 commande="runSession pilotyacsCS.py"
897 print traceback.print_exc()
899 #-----------------------------------------------------#
900 def determineNomFichier(self,path,extension):
901 #-----------------------------------------------------#
902 if DictExtensions.has_key(self.appli.code) :
903 chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
904 extensions= self.trUtf8(chaine1+ "All Files (*)")
906 extensions= self.trUtf8("JDC (*.comm);;" "All Files (*)")
908 if self.appli.code == "MAP" :
909 extensions = extensions + ";; Run (*.input);;"
911 fn = QFileDialog.getSaveFileName( self,
912 tr("sauvegarde"), path,
914 QFileDialog.DontConfirmOverwrite)
915 if fn.isNull(): return (0, None)
916 ext = QFileInfo(fn).suffix()
917 if ext.isEmpty(): fn.append(extension)
919 if QFileInfo(fn).exists():
920 abort = QMessageBox.warning(self,
921 tr("Sauvegarde du Fichier"),
922 tr("Le fichier <b>%s</b> existe deja.",str(fn)),
924 self.trUtf8("&Abandonner"))
925 if abort == 1 : return (0, "")
929 def saveRunMAP(self):
932 if not(self.jdc.isvalid()):
933 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
934 tr("Un JdC valide est necessaire pour creer un .input")
938 composant=self.jdc.etapes[0].nom.lower()[0:-5]
940 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
941 tr("Choix du composant obligatoire")
944 if hasattr(self.CONFIGURATION, "savedir"): path=self.CONFIGURATION.savedir
948 if self.fichier is not None and self.fichier != "" :
949 maBase=str(QFileInfo(self.fichier).baseName())+".input"
950 monPath=str(QFileInfo(self.fichier).absolutePath())
951 monNomFichier=os.path.join(monPath,maBase)
952 elif hasattr(self,'monNomFichierInput'):
953 monNomFichier=self.monNomFichierInput
956 monDialog=QFileDialog(self.appliEficas)
957 monDialog.setDirectory (path)
958 monDialog.setWindowTitle ("Save")
960 for c in monDialog.children():
961 if isinstance(c,QDialogButtonBox):
962 for b in c.children():
963 if isinstance(b,QPushButton):
965 if avant.toLatin1()=="&Open":
967 mesFiltres=QStringList()
968 mesFiltres << "input Map (*.input)" << "All Files (*)"
969 monDialog.setNameFilters(mesFiltres)
970 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
971 BOk=monDialog.exec_()
973 fn=str(monDialog.selectedFiles()[0].toLatin1())
974 if fn == "" or fn == None : return
975 if not fn.endswith(".input"):
977 self.monNomFichierInput=fn
979 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
980 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
981 texte=self.get_text_JDC("MAP")
982 self.writeFile( self.fichierMapInput, txt = texte)
984 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
985 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
986 (output, err) = p.communicate()
990 def saveRunPSEN(self):
995 if not(self.jdc.isvalid()):
996 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
997 tr("Un JdC valide est necessaire pour creer un .input")
1001 print generator.plugins.has_key(self.format)
1002 if generator.plugins.has_key(self.format):
1003 # Le generateur existe on l'utilise
1004 self.generator=generator.plugins[self.format]()
1006 self.generator.gener(self.jdc)
1007 self.generator.writeDefault('')
1008 except ValueError,e:
1009 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
1010 if not self.generator.cr.estvide():
1011 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
1012 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
1015 # Il n'existe pas c'est une erreur
1016 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
1017 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
1024 #-----------------------------------------#
1025 def cherche_Groupes(self):
1026 #-----------------------------------------#
1027 listeMA,listeNO=self.get_text_JDC("GroupMA")
1028 return listeMA,listeNO
1030 #-----------------------------------------#
1031 def cherche_Dico(self):
1032 #-----------------------------------------#
1034 format = self.appliEficas.format_fichier
1035 if generator.plugins.has_key(format):
1036 # Le generateur existe on l'utilise
1037 self.generator=generator.plugins[format]()
1038 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
1039 dicoCourant=self.generator.dico
1044 #-----------------------------------------#
1045 def handleAjoutGroup(self,listeGroup):
1046 #-----------------------------------------#
1049 from ajoutGroupe import handleAjoutGroupFiltre
1051 handleAjoutGroupFiltre(self,listeGroup)
1052 #print "apres handleAjoutGroupFiltre"
1057 #-----------------------------------------------------------------#
1058 def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"):
1059 #-----------------------------------------------------------------#
1061 Public slot to save the text to a file.
1063 @param path directory to save the file in (string or QString)
1064 @return tuple of two values (boolean, string) giving a success indicator and
1065 the name of the saved file
1069 if not self.modified and not saveas:
1070 return (0, None) # do nothing if text wasn't changed
1073 if DictExtensions.has_key(self.appli.code) :
1074 extension=DictExtensions[self.appli.code]
1080 if self.fichier is None or saveas:
1082 path=self.CONFIGURATION.savedir
1083 bOK, fn=self.determineNomFichier(path,extension)
1084 if bOK == 0 : return (0, None)
1085 if fn == None : return (0, None)
1086 if fn.isNull(): return (0, None)
1088 ulfile = os.path.abspath(unicode(fn))
1089 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1090 fn = unicode(QDir.convertSeparators(fn))
1094 if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None)
1096 self.modified = False
1097 if self.fileInfo is None or saveas:
1098 self.fileInfo = QFileInfo(self.fichier)
1099 self.fileInfo.setCaching(0)
1100 self.lastModified = self.fileInfo.lastModified()
1101 if newName is not None:
1102 self.appliEficas.addToRecentList(newName)
1103 self.tree.racine.item.getObject().nom=os.path.basename(newName)
1104 self.tree.racine.update_node_label()
1106 if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
1107 self.generator.writeDefault(fn)
1110 self.appliEficas.addJdcInSalome( self.fichier)
1112 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1113 self.appliEficas.setWindowTitle(nouveauTitre)
1115 return (1, self.fichier)
1118 #----------------------------------------------#
1119 def sauveLigneFile(self):
1120 #----------------------------------------------#
1122 return self.saveFile(formatLigne="Ligne")
1125 #----------------------------------------------#
1126 def saveFileAs(self, path = None,fileName=None):
1127 #----------------------------------------------#
1129 Public slot to save a file with a new name.
1131 @param path directory to save the file in (string or QString)
1132 @return tuple of two values (boolean, string) giving a success indicator and
1133 the name of the saved file
1135 if fileName != None :
1136 self.fichier = fileName
1137 return self.saveFile()
1138 return self.saveFile(path,1,"beautifie")
1142 #---------------------------------------------#
1143 def get_file(self,unite=None,fic_origine = ''):
1144 #---------------------------------------------#
1152 titre = tr("Choix unite %d ", unite)
1153 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
1154 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
1155 labeltexte = tr('Fichier pour unite ') + repr( unite)
1157 titre = tr("Choix d'un fichier de poursuite")
1158 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
1159 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
1161 QMessageBox.information( self, titre,QString.fromUtf8(texte))
1162 fn = QFileDialog.getOpenFileName(self.appliEficas,
1164 self.appliEficas.CONFIGURATION.savedir)
1167 # ce retour est impose par le get_file d'I_JDC
1170 ulfile = os.path.abspath(unicode(fn))
1171 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1173 # On utilise le convertisseur defini par format_fichier
1174 source=self.get_source(ulfile)
1176 # On a reussia convertir le fichier self.ulfile
1179 # Une erreur a ete rencontree
1181 return ulfile, jdcText
1183 #-------------------------------#
1184 def updateJdc(self, itemApres,texte):
1185 #--------------------------------#
1187 etape=monItem.item.object
1189 CONTEXT.set_current_step(etape)
1190 etape.build_includeInclude(texte)
1191 self.tree.racine.build_children()
1196 #-------------------------------------#
1197 def ajoutVersionCataDsJDC(self,txt):
1198 #-------------------------------------#
1199 if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
1200 ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata[0].VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
1201 texte=txt+ligneVersion
1204 #-------------------------------------#
1205 def verifieVersionCataDuJDC(self,text):
1206 #-------------------------------------#
1208 indexDeb=text.find("#VERSION_CATALOGUE:")
1209 indexFin=text.find(":FIN VERSION_CATALOGUE")
1211 self.versionCataDuJDC="sans"
1214 self.versionCataDuJDC=text[indexDeb+19:indexFin]
1215 textJDC=text[0:indexDeb]+text[indexFin+23:-1]
1217 self.versionCata="sans"
1218 if hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata[0].VERSION_CATALOGUE
1220 if self.versionCata==self.versionCataDuJDC : memeVersion=True
1221 return memeVersion,textJDC
1223 #-------------------------------#
1224 def traduitCatalogue(self,texte):
1225 #-------------------------------#
1226 nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
1227 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
1229 traducteur=__import__(nomTraducteur)
1230 monTraducteur=traducteur.MonTraducteur(texte)
1231 nouveauTexte=monTraducteur.traduit()
1237 #------------------------------#
1238 def verifieCHECKSUM(self,text):
1239 #------------------------------#
1240 indexDeb=text.find("#CHECKSUM:")
1243 indexFin=text.find(":FIN CHECKSUM")
1244 checkAvant=text[indexDeb:indexFin+13]
1245 textJDC=text[0:indexDeb]+text[indexFin+13:-1]
1246 checksum=self.get_checksum(textJDC)
1247 pareil=(checkAvant==checksum)
1248 return pareil, textJDC
1250 #---------------------------#
1251 def get_checksum(self,texte):
1252 #---------------------------#
1253 newtexte=texte.replace('"','\\"')
1254 commande='echo "'+newtexte+'"|md5sum'
1255 a=os.popen(commande)
1258 ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
1262 #---------------------------#
1263 def _newTELEMAC(self):
1264 #---------------------------#
1265 texte="INITIALIZATION();BOUNDARY_CONDITIONS();GENERAL_PARAMETERS();PHYSICAL_PARAMETERS();NUMERICAL_PARAMETERS();"
1269 #---------------------------#
1271 #---------------------------#
1272 def _newZCRACKS(self):
1273 #---------------------------#
1274 texte="MAILLAGES();REMESHING();"
1277 #---------------------------#
1278 def _newJDCCND(self):
1279 #---------------------------#
1280 extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
1282 #if self.salome == 0 :
1283 QMessageBox.information( self,
1285 tr("Veuillez selectionner un fichier Med"))
1286 QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
1287 caption='Fichier Med',
1289 self.fichierMED=str(QSfichier.toLatin1())
1290 from acquiertGroupes import getGroupes
1291 erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
1292 if erreur != "" : print "a traiter"
1293 texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
1299 for groupe in self.listeGroupes :
1300 if groupe[0:8]=='CURRENT_':
1301 texteSources +=groupe[8:]+"=SOURCE("
1302 texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
1303 if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n"
1304 if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n"
1305 if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n"
1306 if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n"
1307 texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
1308 self.newTexteCND=texte
1313 #---------------------------#
1314 def BoutonFileSelected(self):
1315 #---------------------------#
1317 QSfichier=self.openfile.selectedFiles()[0]
1318 self.fichierMED=str(QSfichier.toLatin1())
1319 from acquiertGroupes import getGroupes
1320 erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
1321 if erreur != "" : print "a traiter"
1323 #-----------------------------
1324 def BoutonSalomePressed(self):
1325 #----------------------------
1326 Msg,self.listeGroupes=self.appliEficas.ChercheGrpMailleInSalome()
1327 self.fichierMED="A_partir_de_SMESH"
1328 self.nomMaillage="A_partir_de_SMESH"
1329 self.openfile.close()
1332 if __name__ == "__main__":
1334 name='prefs_'+prefs.code
1335 prefsCode=__import__(name)
1338 if hasattr(prefsCode,'encoding'):
1339 # Hack pour changer le codage par defaut des strings
1342 sys.setdefaultencoding(prefs.encoding)
1343 del sys.setdefaultencoding
1348 app = QApplication(sys.argv)
1349 mw = JDCEditor(None,'azAster.comm')
1350 app.setMainWidget(mw)
1351 app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
1354 res = app.exec_loop()