1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2015 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 *
27 from datetime import date
28 from Extensions.i18n import tr
33 import convert, generator
34 from Editeur import session
35 from Editeur import comploader
36 from Editeur import Objecttreeitem
37 from desBaseWidget import Ui_baseWidget
38 from monViewTexte import ViewText
39 from monWidgetCreeParam import MonWidgetCreeParam
43 DictExtensions= {"MAP" : ".map"}
47 class JDCEditor(Ui_baseWidget,QtGui.QWidget):
48 # ----------------------------------------- #
53 def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None):
54 #----------------------------------------------------------------------------------------------------------#
57 QtGui.QWidget.__init__(self,None)
59 self.monOptionnel=None
60 self.fenetreCentraleAffichee=None
61 self.dejaDansPlieTout=False
62 self.afficheCommandesPliees = True
63 self.appliEficas = appli
64 self.appli = appli #---- attendu par IHM
66 self.fichier = fichier
69 self.QWParent = QWParent
72 self.salome = self.appliEficas.salome
75 print "dans JDC pas d appli ????????"
77 # ces attributs sont mis a jour par definitCode appelee par newEditor
78 self.code = self.appliEficas.CONFIGURATION.code
79 self.mode_nouv_commande=self.appliEficas.CONFIGURATION.mode_nouv_commande
80 self.affiche=self.appliEficas.CONFIGURATION.affiche
81 if self.code in ['MAP','CARMELCND'] : self.afficheCommandesPliees=False
82 if self.code in ['MAP',] :
83 self.widgetTree.close()
85 self.appliEficas.resize(1440,self.appliEficas.height())
87 self.appliEficas.resize(2000,self.appliEficas.height())
89 self.version_code = session.d_env.cata
91 if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.multi==True:
92 self.readercata = readercata.READERCATA( self, self.appliEficas )
93 self.appliEficas.readercata=self.readercata
95 self.readercata=self.appliEficas.readercata
96 if self.readercata.fic_cata == None : return #Sortie Salome
97 self.titre=self.readercata.titre
98 self.Ordre_Des_Commandes=self.readercata.Ordre_Des_Commandes
100 self.format = self.appliEficas.format_fichier
103 self.liste_simp_reel=[]
106 nameConf='configuration_'+self.code
107 configuration=__import__(nameConf)
108 self.CONFIGURATION = self.appliEficas.CONFIGURATION
109 self.CONFIGStyle = self.appliEficas.CONFIGStyle
112 self.CONFIGURATION.generator_module
113 _module = __import__(self.CONFIGURATION.generator_module)
114 info = _module.entryPoint()
115 generator.plugins.addEntryPoint(info)
120 self.CONFIGURATION.convert_module
121 _module = __import__(self.CONFIGURATION.convert_module)
122 info = _module.entryPoint()
123 convert.plugins.addEntryPoint(info)
128 if hasattr(self.appliEficas,"statusBar"):
129 self.sb = self.appliEficas.statusBar()
132 self.lastModified = 0
134 self.modified = False
135 self.isReadOnly = False
136 self.node_selected = []
139 if self.code in ['Adao','MAP'] : self.afficheApresInsert=True
140 else : self.afficheApresInsert=False
141 if self.code in ['TELEMAC',] : self.enteteQTree='premier'
142 else : self.enteteQTree='complet'
143 if self.code in ['Adao','TELEMAC'] : self.affichePlie=True
144 else : self.affichePlie=False
146 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
148 #------- construction du jdc --------------
153 if self.fichier is not None: # fichier jdc fourni
154 self.fileInfo = QFileInfo(self.fichier)
155 self.fileInfo.setCaching(0)
159 self.jdc = self.readFile(self.fichier)
162 print "mauvaise lecture"
165 if self.jdc is not None and units is not None:
166 self.jdc.recorded_units=units
167 self.jdc.old_recorded_units=units
169 if not self.jdc: # nouveau jdc
171 self.jdc = self._newJDC(units=units)
173 self.jdc = self._newJDCInclude(units=units)
177 self.jdc.appli = self
178 self.jdc.lang = self.appli.langue
179 self.jdc.aReafficher=False
183 txt_exception = self.jdc.cr.get_mess_exception()
186 qApp.restoreOverrideCursor()
187 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
188 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
190 comploader.charger_composants("QT")
191 jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
192 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
193 self.viewJdcRapport()
195 # if self.code=="TELEMAC" : print "kkkkkkkk"
199 self.tree = browser.JDCTree( jdc_item, self )
200 self.appliEficas.construitMenu()
202 #--------------------------------#
203 def _newJDC( self ,units = None):
204 #--------------------------------#
206 Initialise un nouveau JDC vierge
209 CONTEXT.unset_current_step()
212 if self.code == "CARMELCND" : texte=self._newJDCCND()
213 if self.code == "ZCRACKS" : texte=self._newZCRACKS()
214 if self.code == "TELEMAC" : texte=self._newTELEMAC()
215 # texte=self.newTexteCND
217 jdc=self.readercata.cata[0].JdC( procedure =texte,
219 cata=self.readercata.cata,
220 cata_ord_dico=self.readercata.cata_ordonne_dico,
221 rep_mat=self.CONFIGURATION.rep_mat
223 jdc.lang = self.appli.langue
224 if units is not None:
225 jdc.recorded_units=units
226 jdc.old_recorded_units=units
227 ## PNPN est ce que la ligne suivante est bien utile ?
228 if texte == "" :jdc.analyse()
231 #--------------------------------#
232 def _newJDCInclude( self ,units = None):
233 #--------------------------------#
235 Initialise un nouveau JDC vierge
237 import Extensions.jdc_include
238 JdC_aux=Extensions.jdc_include.JdC_include
239 CONTEXT.unset_current_step()
241 jaux=self.readercata.cata[0].JdC( procedure="",
243 cata=self.readercata.cata,
244 cata_ord_dico=self.readercata.cata_ordonne_dico,
245 rep_mat=self.CONFIGURATION.rep_mat,
249 J=JdC_aux( procedure="",
251 cata=self.readercata.cata,
252 cata_ord_dico=self.readercata.cata_ordonne_dico,
254 rep_mat=self.CONFIGURATION.rep_mat,
257 if units is not None:
258 J.recorded_units=units
259 J.old_recorded_units=units
263 #-------------------------------#
264 def readFile(self, fn):
265 #--------------------------------#
267 Public slot to read the text from a file.
268 @param fn filename to read from (string or QString)
272 # ------------------------------------------------------------------------------------
274 # ------------------------------------------------------------------------------------
276 jdcName=os.path.basename(fn)
277 # Il faut convertir le contenu du fichier en fonction du format
278 if convert.plugins.has_key( self.appliEficas.format_fichier_in ):
279 # Le convertisseur existe on l'utilise
281 p=convert.plugins[self.appliEficas.format_fichier_in]()
283 if p.text=="" : self.nouveau=1
284 pareil,texteNew=self.verifieCHECKSUM(p.text)
286 if pareil == False and (self.appliEficas.ssIhm == False) :
287 QMessageBox.warning( self, tr("fichier modifie"),tr("Attention! fichier change hors EFICAS"))
289 memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
290 if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
292 text=p.convert('exec',self.appliEficas)
293 if not p.cr.estvide():
294 self.affiche_infos("Erreur a la conversion",Qt.red)
296 self.affiche_infos("Type de fichier non reconnu",Qt.red)
297 if self.appliEficas.ssIhm == False:
298 QMessageBox.critical( self, tr("Type de fichier non reconnu"),
299 tr("EFICAS ne sait pas ouvrir le type de fichier %s" ,self.appliEficas.format_fichier_in))
302 CONTEXT.unset_current_step()
303 jdc=self.readercata.cata[0].JdC(procedure=text,
305 cata=self.readercata.cata,
306 cata_ord_dico=self.readercata.cata_ordonne_dico,
308 rep_mat=self.CONFIGURATION.rep_mat
310 # ----------------------------------------------------
312 # ----------------------------------------------------
313 self.modified = False
315 # qApp.restoreOverrideCursor()
316 if self.fileInfo!= None :
317 self.lastModified = self.fileInfo.lastModified()
319 self.lastModified = 1
320 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
321 self.appliEficas.setWindowTitle(nouveauTitre)
325 #-----------------------#
326 def get_source(self,file):
327 #-----------------------#
329 # Il faut convertir le contenu du fichier en fonction du format
330 if convert.plugins.has_key(self.format):
331 # Le convertisseur existe on l'utilise
332 p=convert.plugins[self.format]()
334 text=p.convert('execnoparseur')
335 if not p.cr.estvide():
336 self.affiche_infos("Erreur a la conversion",Qt.red)
339 # Il n'existe pas c'est une erreur
340 self.affiche_infos("Type de fichier non reconnu",Qt.red)
341 QMessageBox.critical( self, tr("Type de fichier non reconnu"),tr("EFICAS ne sait pas ouvrir ce type de fichier"))
344 #-----------------------------------------------------------------------#
345 def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
346 #--------------------------------------------------------------------#
347 w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
351 #----------------------------------------------#
352 def __generateTempFilename(self, prefix, suffix):
353 #----------------------------------------------#
355 (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
361 #----------------------------------------------#
362 def _viewTextExecute(self, txt, prefix, suffix):
363 #----------------------------------------------#
364 self.w = ViewText( self.QWParent )
365 self.w.setWindowTitle( "execution" )
366 self.monExe=QProcess(self.w)
367 pid=self.monExe.pid()
368 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
369 f=open(nomFichier,'w')
372 self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
373 self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
374 exe='sh ' + nomFichier
375 self.monExe.start(exe)
376 self.monExe.closeWriteChannel()
379 commande="rm "+ nomFichier
385 def readFromStdErr(self):
386 a=self.monExe.readAllStandardError()
387 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
389 def readFromStdOut(self) :
390 a=self.monExe.readAllStandardOutput()
391 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
395 #-----------------------#
396 def gestionParam(self):
397 #-----------------------#
398 w = MonWidgetCreeParam( self)
401 #-----------------------#
402 def viewJdcSource(self):
403 #-----------------------#
404 f=open(self.fichier,'r')
407 self._viewText(texteSource, "JDC_SOURCE")
409 #-----------------------#
411 #-----------------------#
412 strSource = str( self.get_text_JDC(self.format) )
413 self._viewText(strSource, "JDC_RESULTAT")
415 #-----------------------#
416 def viewJdcRapport(self):
417 #-----------------------#
418 strRapport = unicode( self.jdc.report() )
419 self._viewText(strRapport, "JDC_RAPPORT")
425 Public method called by the viewmanager to finally get rid of us.
431 #----------------------------------------------#
432 def affiche_infos(self,message,couleur=Qt.black):
433 #----------------------------------------------#
435 mapalette=self.sb.palette()
436 from PyQt4.QtGui import QPalette
437 mapalette.setColor( QPalette.WindowText, couleur )
438 self.sb.setPalette( mapalette );
439 self.sb.showMessage(QString.fromUtf8(message))#,2000)
441 #------------------------------#
442 def affiche_alerte(self,titre,message):
443 #------------------------------#
444 # appele par I_MACRO_ETAPE
445 QMessageBox.information( self, titre, message)
447 #-------------------#
448 def init_modif(self):
449 #-------------------#
451 Met l'attribut modified a 'o' : utilise par Eficas pour savoir
452 si un JDC doit etre sauvegarde avant destruction ou non
456 #---------------------------------------#
457 def chercheNoeudSelectionne(self,copie=1):
458 #---------------------------------------#
460 appele par Cut et Copy pour positionner self.node_selected
462 self.node_selected=[]
463 if len(self.tree.selectedItems()) == 0 : return
464 self.node_selected=self.tree.selectedItems()
467 #---------------------#
468 def handleSupprimer(self):
469 #---------------------#
470 self.chercheNoeudSelectionne()
471 if len(self.node_selected) == 0 : return
472 self.QWParent.noeud_a_editer = []
473 if self.node_selected[0]==self.tree.racine: return
474 if len(self.node_selected) == 1 : self.node_selected[0].delete()
475 else : self.node_selected[0].deleteMultiple(self.node_selected)
477 #---------------------#
478 def handleRechercher(self):
479 #---------------------#
480 from monRecherche import DRecherche
481 monRechercheDialg=DRecherche(parent=self,fl=0)
482 monRechercheDialg.show()
484 #---------------------#
485 def handleDeplier(self):
486 #---------------------#
488 if self.tree == None : return
489 #self.tree.collapseAll()
492 self.tree.expandItem(self.tree.topLevelItem(0))
494 if self.fenetreCentraleAffichee != None :
495 if hasattr(self.fenetreCentraleAffichee.node,'plieToutEtReaffiche'):
496 self.fenetreCentraleAffichee.node.plieToutEtReaffiche()
499 self.tree.expandItem(self.tree.topLevelItem(0))
501 if self.fenetreCentraleAffichee != None :
502 if hasattr(self.fenetreCentraleAffichee.node,'deplieToutEtReaffiche'):
503 self.fenetreCentraleAffichee.node.deplieToutEtReaffiche()
505 #---------------------#
506 def handleEditCut(self):
507 #---------------------#
509 Stocke dans Eficas.noeud_a_editer le noeud a couper
511 #print "handleEditCut"
512 self.chercheNoeudSelectionne()
513 self.QWParent.edit="couper"
514 self.QWParent.noeud_a_editer = self.node_selected
516 #-----------------------#
517 def handleEditCopy(self):
518 #-----------------------#
520 Stocke dans Eficas.noeud_a_editer le noeud a copier
522 self.chercheNoeudSelectionne()
523 if len(self.node_selected) == 0 : return
524 if len(self.node_selected) == 1 : self.node_selected[0].update_node_label_in_blue()
525 else : self.node_selected[0].update_plusieurs_node_label_in_blue(self.node_selected)
526 self.QWParent.edit="copier"
527 self.QWParent.noeud_a_editer = self.node_selected
529 #------------------------#
530 def handleEditPaste(self):
531 #------------------------#
533 Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
534 Ne permet que la copie d'objets de type Commande ou MCF
536 self.chercheNoeudSelectionne()
537 if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
538 QMessageBox.information( self,
539 tr("Copie impossible"),
540 tr("Veuillez selectionner un objet a copier"))
542 if len(self.node_selected) != 1 :
543 QMessageBox.information( self,
544 tr("Copie impossible"),
545 tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
548 if len(self.QWParent.noeud_a_editer)!=1:
549 self.handleEditPasteMultiple()
552 noeudOuColler=self.node_selected[0]
554 if noeudOuColler == self.tree.racine:
558 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
561 noeudACopier=self.QWParent.noeud_a_editer[0]
562 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
564 QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
567 if (self.QWParent.edit != "couper"):
569 if noeudOuColler == self.tree.racine :
570 child=noeudOuColler.doPastePremier(noeudACopier)
572 child=noeudACopier.doPaste(noeudOuColler,pos)
573 if child==None or child==0:
574 QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
576 self.affiche_infos("Copie refusee",Qt.red)
577 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
579 nom=noeudACopier.item.sd.nom
580 child.item.nomme_sd(nom)
587 traceback.print_exc()
588 QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
590 self.affiche_infos("Copie refusee",Qt.red)
593 # il faut declarer le JDCDisplay_courant modifie
594 # suppression eventuelle du noeud selectionne
595 # si possible on renomme l objet comme le noeud couper
597 if (self.QWParent.edit == "couper"):
599 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
600 QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
604 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
605 noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
606 noeudACopier.treeParent.build_children()
611 self.QWParent.noeud_a_editer=[]
613 # on rend la copie a nouveau possible en liberant le flag edit
614 self.QWParent.edit="copier"
615 noeudACopier.select()
617 #----------------------------------#
618 def handleDeplaceMultiple(self):
619 #----------------------------------#
622 #----------------------------------#
623 def handleEditPasteMultiple(self):
624 #----------------------------------#
626 # On ne garde que les niveaux "Etape"
627 # On insere dans l'ordre du JDC
628 listeNoeudsACouper=[]
632 from InterfaceQT4 import compojdc
633 noeudOuColler=self.node_selected[0]
634 if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
635 QMessageBox.information( self,
636 tr("Copie impossible a cet endroit",),
637 tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
639 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
641 for noeud in self.QWParent.noeud_a_editer :
642 if not (isinstance(noeud.treeParent, compojdc.Node)): continue
643 indexInTree=noeud.treeParent.children.index(noeud)
645 for index in listeIndex:
646 if index < indexInTree : indice = indice +1
647 listeIndex.insert(indice, indexInTree)
648 listeNoeudsACouper.insert(indice, noeud)
650 noeudJdc=noeudOuColler.treeParent
652 # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
654 for index in listeIndex:
656 if indexNoeudOuColler < index:
657 indexTravail=indexTravail+dejaCrees
658 noeudOuColler=noeudJdc.children[indexNoeudOuColler]
659 noeud=noeudJdc.children[indexTravail]
660 child=noeud.doPaste(noeudOuColler)
661 listeChild.append(child)
662 dejaCrees=dejaCrees+1
664 self.QWParent.noeud_a_editer = []
665 for i in range(len(listeIndex)):
666 noeud=noeudJdc.children[indexNoeudOuColler+1+i]
667 self.QWParent.noeud_a_editer.append(noeud)
670 if self.QWParent.edit !="couper" : return
672 for index in listeIndex:
674 if indexNoeudOuColler < index:
675 indexTravail=indexTravail+(len(listeIndex))
676 noeud=noeudJdc.children[indexTravail]
678 listeItem.append(noeud.item)
679 listeASupprimer.append(noeud)
681 for i in range(len(listeChild)):
682 self.tree.item.suppitem(listeItem[i])
683 listeChild[i].item.update(listeItem[i])
685 self.QWParent.noeud_a_editer = []
688 #---------------------#
689 def getFileName(self):
690 #---------------------#
693 #---------------------------#
694 def get_file_variable(self) :
695 #---------------------------#
696 titre = tr("Choix d'un fichier XML")
697 texte = tr("Le fichier contient une commande MODEL\n")
698 texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
699 QMessageBox.information( self, titre,tr(texte))
701 fichier = QFileDialog.getOpenFileName(self.appliEficas,
702 tr('Ouvrir Fichier'),
703 self.appliEficas.CONFIGURATION.savedir,
704 self.appliEficas.trUtf8('Wrapper Files (*.xml);;''All Files (*)'))
707 #--------------------------------------------------#
708 def writeFile(self, fn, txt = None,formatLigne="beautifie"):
709 #--------------------------------------------------#
711 Public slot to write the text to a file.
713 @param fn filename to write to (string or QString)
714 @return flag indicating success
720 txt = self.get_text_JDC(self.format,formatLigne=formatLigne)
722 if len(txt) >= len(eol):
723 if txt[-len(eol):] != eol:
727 txt=self.ajoutVersionCataDsJDC(txt)
728 checksum=self.get_checksum(txt)
736 QMessageBox.critical(self, self.trUtf8('Save File'),
737 self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
738 .arg(unicode(fn)).arg(str(why)))
741 #-----------------------------------------------------------#
742 def get_text_JDC(self,format,pourRun=0,formatLigne="beautifie"):
743 #-----------------------------------------------------------#
744 if self.code == "MAP" and not(generator.plugins.has_key(format)): format = "MAP"
745 if generator.plugins.has_key(format):
746 # Le generateur existe on l'utilise
747 self.generator=generator.plugins[format]()
749 jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.CONFIGURATION)
750 if pourRun : jdc_formate=self.generator.textePourRun
752 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
753 if not self.generator.cr.estvide():
754 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
755 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
760 # Il n'existe pas c'est une erreur
761 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
762 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
768 fonction="run"+self.code
769 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
774 fonction="saveRun"+self.code
775 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
781 if not(self.jdc.isvalid()):
782 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
784 if len(self.jdc.etapes) != 1 :
785 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
787 if self.modified or self.fichier==None :
788 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
789 texte=self.get_text_JDC("MAP")
790 self.writeFile( self.fichierMapInput, txt = texte)
792 self.fichierMapInput=self.fichier
793 composant=self.jdc.etapes[0].nom.lower()[0:-5]
796 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
797 # then instantiate corresponding class and call getUseSalome() method
799 from mapengine.spec import factory
800 mapComponent = factory.new(composant)[0]
803 if mapComponent.getUseSalome():
804 command += " -r sappli"
805 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
808 self._viewTextExecute( textePython,"map_run",".sh")
810 commande="rm "+self.fichierMapInput
815 print traceback.print_exc()
817 #-------------------#
818 def runZCRACKS(self):
819 #-------------------#
820 if not(self.jdc.isvalid()):
821 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
823 if self.modified or self.fichier==None :
825 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
826 texte=self.get_text_JDC("ZCRACKS",pourRun=1)
827 self.writeFile( self.fichierZcracksInput, txt = texte)
829 self.fichierZcracksInput=self.fichier
831 #commande ="Zrun -zp "
833 textePython=(commande + self.fichierZcracksInput)
834 self._viewTextExecute( textePython,"run_zcracks",".sh")
836 print traceback.print_exc()
838 #-------------------#
839 def runCARMELCND(self):
840 #-------------------#
841 #if not(self.jdc.isvalid()):
842 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
844 if self.modified or self.fichier==None :
845 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
847 if not hasattr(self,'generator'): texte=self.get_text_JDC(self.format)
848 from PrepareRunCarmel import prepareRunCarmel
849 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
850 repMed=os.path.dirname(self.fichier)
851 repExeCarmel=self.generator.get_repExeCarmel()
852 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
853 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
854 f=open(nomFichier,'w')
857 commande="xterm -e sh "+nomFichier +"\n"
860 # self._viewTextExecute( textePython,"carmel_run",".sh")
861 #except Exception, e:
862 # print traceback.print_exc()
864 #-------------------#
865 def runCarmelCS(self):
866 #-------------------#
868 commande="runSession pilotyacsCS.py"
871 print traceback.print_exc()
873 #-----------------------------------------------------#
874 def determineNomFichier(self,path,extension):
875 #-----------------------------------------------------#
876 if DictExtensions.has_key(self.appli.code) :
877 chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
878 extensions= self.trUtf8(chaine1+ "All Files (*)")
880 extensions= self.trUtf8("JDC (*.comm);;" "All Files (*)")
882 if self.appli.code == "MAP" :
883 extensions = extensions + ";; Run (*.input);;"
885 fn = QFileDialog.getSaveFileName( self,
886 tr("sauvegarde"), path,
888 QFileDialog.DontConfirmOverwrite)
889 if fn.isNull(): return (0, None)
890 ext = QFileInfo(fn).suffix()
891 if ext.isEmpty(): fn.append(extension)
893 if QFileInfo(fn).exists():
894 abort = QMessageBox.warning(self,
895 tr("Sauvegarde du Fichier"),
896 tr("Le fichier <b>%s</b> existe deja.",str(fn)),
898 self.trUtf8("&Abandonner"))
899 if abort == 1 : return (0, "")
903 def saveRunMAP(self):
906 if not(self.jdc.isvalid()):
907 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
908 tr("Un JdC valide est necessaire pour creer un .input")
912 composant=self.jdc.etapes[0].nom.lower()[0:-5]
914 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
915 tr("Choix du composant obligatoire")
918 if hasattr(self.CONFIGURATION, "savedir"): path=self.CONFIGURATION.savedir
919 else : path=os.environ['HOME']
922 if self.fichier is not None and self.fichier != "" :
923 maBase=str(QFileInfo(self.fichier).baseName())+".input"
924 monPath=str(QFileInfo(self.fichier).absolutePath())
925 monNomFichier=os.path.join(monPath,maBase)
926 elif hasattr(self,'monNomFichierInput'):
927 monNomFichier=self.monNomFichierInput
930 monDialog=QFileDialog(self.appliEficas)
931 monDialog.setDirectory (path)
932 monDialog.setWindowTitle ("Save")
934 for c in monDialog.children():
935 if isinstance(c,QDialogButtonBox):
936 for b in c.children():
937 if isinstance(b,QPushButton):
939 if avant.toLatin1()=="&Open":
941 mesFiltres=QStringList()
942 mesFiltres << "input Map (*.input)" << "All Files (*)"
943 monDialog.setNameFilters(mesFiltres)
944 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
945 BOk=monDialog.exec_()
947 fn=str(monDialog.selectedFiles()[0].toLatin1())
948 if fn == "" or fn == None : return
949 if not fn.endswith(".input"):
951 self.monNomFichierInput=fn
953 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
954 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
955 texte=self.get_text_JDC("MAP")
956 self.writeFile( self.fichierMapInput, txt = texte)
958 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
959 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
960 (output, err) = p.communicate()
963 #-----------------------------------------#
964 def cherche_Groupes(self):
965 #-----------------------------------------#
966 listeMA,listeNO=self.get_text_JDC("GroupMA")
967 return listeMA,listeNO
969 #-----------------------------------------#
970 def cherche_Dico(self):
971 #-----------------------------------------#
973 format = self.appliEficas.format_fichier
974 if generator.plugins.has_key(format):
975 # Le generateur existe on l'utilise
976 self.generator=generator.plugins[format]()
977 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
978 dicoCourant=self.generator.dico
983 #-----------------------------------------#
984 def handleAjoutGroup(self,listeGroup):
985 #-----------------------------------------#
988 from ajoutGroupe import handleAjoutGroupFiltre
990 handleAjoutGroupFiltre(self,listeGroup)
991 #print "apres handleAjoutGroupFiltre"
996 #-----------------------------------------------------------------#
997 def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"):
998 #-----------------------------------------------------------------#
1000 Public slot to save the text to a file.
1002 @param path directory to save the file in (string or QString)
1003 @return tuple of two values (boolean, string) giving a success indicator and
1004 the name of the saved file
1008 if not self.modified and not saveas:
1009 return (0, None) # do nothing if text wasn't changed
1012 if DictExtensions.has_key(self.appli.code) :
1013 extension=DictExtensions[self.appli.code]
1019 if self.fichier is None or saveas:
1021 path=self.CONFIGURATION.savedir
1022 bOK, fn=self.determineNomFichier(path,extension)
1023 if bOK == 0 : return (0, None)
1024 if fn == None : return (0, None)
1025 if fn.isNull(): return (0, None)
1027 ulfile = os.path.abspath(unicode(fn))
1028 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1029 fn = unicode(QDir.convertSeparators(fn))
1032 if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None)
1034 self.modified = False
1035 if self.fileInfo is None or saveas:
1036 self.fileInfo = QFileInfo(self.fichier)
1037 self.fileInfo.setCaching(0)
1038 self.lastModified = self.fileInfo.lastModified()
1039 if newName is not None:
1040 self.appliEficas.addToRecentList(newName)
1041 self.tree.racine.item.getObject().nom=os.path.basename(newName)
1042 self.tree.racine.update_node_label()
1044 if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
1045 self.generator.writeDefault(fn)
1048 self.appliEficas.addJdcInSalome( self.fichier)
1050 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1051 self.appliEficas.setWindowTitle(nouveauTitre)
1053 return (1, self.fichier)
1056 #----------------------------------------------#
1057 def sauveLigneFile(self):
1058 #----------------------------------------------#
1060 return self.saveFile(formatLigne="Ligne")
1063 #----------------------------------------------#
1064 def saveFileAs(self, path = None,fileName=None):
1065 #----------------------------------------------#
1067 Public slot to save a file with a new name.
1069 @param path directory to save the file in (string or QString)
1070 @return tuple of two values (boolean, string) giving a success indicator and
1071 the name of the saved file
1073 if fileName != None :
1074 self.fichier = fileName
1075 return self.saveFile()
1076 return self.saveFile(path,1,"beautifie")
1080 #---------------------------------------------#
1081 def get_file(self,unite=None,fic_origine = ''):
1082 #---------------------------------------------#
1090 titre = tr("Choix unite %d ", unite)
1091 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
1092 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
1093 labeltexte = tr('Fichier pour unite ') + repr( unite)
1095 titre = tr("Choix d'un fichier de poursuite")
1096 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
1097 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
1099 QMessageBox.information( self, titre,QString.fromUtf8(texte))
1100 fn = QFileDialog.getOpenFileName(self.appliEficas,
1102 self.appliEficas.CONFIGURATION.savedir)
1105 # ce retour est impose par le get_file d'I_JDC
1108 ulfile = os.path.abspath(unicode(fn))
1109 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1111 # On utilise le convertisseur defini par format_fichier
1112 source=self.get_source(ulfile)
1114 # On a reussia convertir le fichier self.ulfile
1117 # Une erreur a ete rencontree
1119 return ulfile, jdcText
1121 #-------------------------------#
1122 def updateJdc(self, itemApres,texte):
1123 #--------------------------------#
1125 etape=monItem.item.object
1127 CONTEXT.set_current_step(etape)
1128 etape.build_includeInclude(texte)
1129 self.tree.racine.build_children()
1134 #-------------------------------------#
1135 def ajoutVersionCataDsJDC(self,txt):
1136 #-------------------------------------#
1137 if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
1138 ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata[0].VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
1139 texte=txt+ligneVersion
1142 #-------------------------------------#
1143 def verifieVersionCataDuJDC(self,text):
1144 #-------------------------------------#
1146 indexDeb=text.find("#VERSION_CATALOGUE:")
1147 indexFin=text.find(":FIN VERSION_CATALOGUE")
1149 self.versionCataDuJDC="sans"
1152 self.versionCataDuJDC=text[indexDeb+19:indexFin]
1153 textJDC=text[0:indexDeb]+text[indexFin+23:-1]
1155 self.versionCata="sans"
1156 if hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata[0].VERSION_CATALOGUE
1158 if self.versionCata==self.versionCataDuJDC : memeVersion=True
1159 return memeVersion,textJDC
1161 #-------------------------------#
1162 def traduitCatalogue(self,texte):
1163 #-------------------------------#
1164 nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
1165 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
1167 traducteur=__import__(nomTraducteur)
1168 monTraducteur=traducteur.MonTraducteur(texte)
1169 nouveauTexte=monTraducteur.traduit()
1175 #------------------------------#
1176 def verifieCHECKSUM(self,text):
1177 #------------------------------#
1178 indexDeb=text.find("#CHECKSUM:")
1181 indexFin=text.find(":FIN CHECKSUM")
1182 checkAvant=text[indexDeb:indexFin+13]
1183 textJDC=text[0:indexDeb]+text[indexFin+13:-1]
1184 checksum=self.get_checksum(textJDC)
1185 pareil=(checkAvant==checksum)
1186 return pareil, textJDC
1188 #---------------------------#
1189 def get_checksum(self,texte):
1190 #---------------------------#
1191 newtexte=texte.replace('"','\\"')
1192 commande='echo "'+newtexte+'"|md5sum'
1193 a=os.popen(commande)
1196 ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
1200 #---------------------------#
1201 def _newTELEMAC(self):
1202 #---------------------------#
1203 texte="INITIALIZATION();BOUNDARY_CONDITIONS();GENERAL_PARAMETERS();PHYSICAL_PARAMETERS();NUMERICAL_PARAMETERS();"
1207 #---------------------------#
1209 #---------------------------#
1210 def _newZCRACKS(self):
1211 #---------------------------#
1212 texte="MAILLAGES();REMESHING();"
1215 #---------------------------#
1216 def _newJDCCND(self):
1217 #---------------------------#
1218 extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
1220 #if self.salome == 0 :
1221 QMessageBox.information( self,
1223 tr("Veuillez selectionner un fichier Med"))
1224 QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
1225 caption='Fichier Med',
1227 self.fichierMED=str(QSfichier.toLatin1())
1228 from acquiertGroupes import getGroupes
1229 erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
1230 if erreur != "" : print "a traiter"
1231 texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
1237 for groupe in self.listeGroupes :
1238 if groupe[0:8]=='CURRENT_':
1239 texteSources +=groupe[8:]+"=SOURCE("
1240 texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
1241 if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n"
1242 if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n"
1243 if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n"
1244 if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n"
1245 texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
1246 self.newTexteCND=texte
1251 #---------------------------#
1252 def BoutonFileSelected(self):
1253 #---------------------------#
1255 QSfichier=self.openfile.selectedFiles()[0]
1256 self.fichierMED=str(QSfichier.toLatin1())
1257 from acquiertGroupes import getGroupes
1258 erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
1259 if erreur != "" : print "a traiter"
1261 #-----------------------------
1262 def BoutonSalomePressed(self):
1263 #----------------------------
1264 Msg,self.listeGroupes=self.appliEficas.ChercheGrpMailleInSalome()
1265 self.fichierMED="A_partir_de_SMESH"
1266 self.nomMaillage="A_partir_de_SMESH"
1267 self.openfile.close()
1270 if __name__ == "__main__":
1272 name='prefs_'+prefs.code
1273 prefsCode=__import__(name)
1276 if hasattr(prefsCode,'encoding'):
1277 # Hack pour changer le codage par defaut des strings
1280 sys.setdefaultencoding(prefs.encoding)
1281 del sys.setdefaultencoding
1286 app = QApplication(sys.argv)
1287 mw = JDCEditor(None,'azAster.comm')
1288 app.setMainWidget(mw)
1289 app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
1292 res = app.exec_loop()