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 *
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
42 DictExtensions= {"MAP" : ".map"}
46 class JDCEditor(Ui_baseWidget,QtGui.QWidget):
47 # ----------------------------------------- #
52 def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None):
53 #----------------------------------------------------------------------------------------------------------#
55 QtGui.QWidget.__init__(self,None)
57 self.monOptionnel=None
58 self.fenetreCentraleAffichee=None
59 self.appliEficas = appli
60 self.appli = appli #---- attendu par IHM
62 self.fichier = fichier
65 self.QWParent = QWParent
68 self.salome = self.appliEficas.salome
71 print "dans JDC pas d appli ????????"
73 # ces attributs sont mis a jour par definitCode appelee par newEditor
74 self.code = self.appliEficas.CONFIGURATION.code
76 if self.code in ['MAP','Adao'] :
77 self.widgetTree.close()
79 self.appliEficas.resize(1440,self.appliEficas.height())
81 self.appliEficas.resize(2000,self.appliEficas.height())
83 self.version_code = session.d_env.cata
85 if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.multi==True:
86 self.readercata = readercata.READERCATA( self, self.appliEficas )
87 self.appliEficas.readercata=self.readercata
89 self.readercata=self.appliEficas.readercata
90 if self.readercata.fic_cata == None : return #Sortie Salome
91 self.titre=self.readercata.titre
93 self.format = self.appliEficas.format_fichier
96 self.liste_simp_reel=[]
99 nameConf='configuration_'+self.code
100 configuration=__import__(nameConf)
101 self.CONFIGURATION = self.appliEficas.CONFIGURATION
102 self.CONFIGStyle = self.appliEficas.CONFIGStyle
105 self.CONFIGURATION.generator_module
106 _module = __import__(self.CONFIGURATION.generator_module)
107 info = _module.entryPoint()
108 generator.plugins.addEntryPoint(info)
113 self.CONFIGURATION.convert_module
114 _module = __import__(self.CONFIGURATION.convert_module)
115 info = _module.entryPoint()
116 convert.plugins.addEntryPoint(info)
121 if hasattr(self.appliEficas,"statusBar"):
122 self.sb = self.appliEficas.statusBar()
125 self.lastModified = 0
127 self.modified = False
128 self.isReadOnly = False
129 self.node_selected = []
133 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
135 #------- construction du jdc --------------
138 self.mode_nouv_commande=self.readercata.mode_nouv_commande
141 if self.fichier is not None: # fichier jdc fourni
142 self.fileInfo = QFileInfo(self.fichier)
143 self.fileInfo.setCaching(0)
146 self.jdc = self.readFile(self.fichier)
148 print "mauvaise lecture"
151 if self.jdc is not None and units is not None:
152 self.jdc.recorded_units=units
153 self.jdc.old_recorded_units=units
155 if not self.jdc: # nouveau jdc
157 self.jdc = self._newJDC(units=units)
159 self.jdc = self._newJDCInclude(units=units)
163 self.jdc.appli = self
164 self.jdc.lang = self.appli.langue
168 txt_exception = self.jdc.cr.get_mess_exception()
171 qApp.restoreOverrideCursor()
172 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
173 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
175 comploader.charger_composants("QT")
176 jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
177 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
178 self.viewJdcRapport()
181 self.tree = browser.JDCTree( jdc_item, self )
182 self.appliEficas.construitMenu()
184 #--------------------------------#
185 def _newJDC( self ,units = None):
186 #--------------------------------#
188 Initialise un nouveau JDC vierge
191 CONTEXT.unset_current_step()
194 if self.code == "CARMELCND" : texte=self._newJDCCND()
195 if self.code == "ZCRACKS" : texte=self._newZCRACKS()
196 # texte=self.newTexteCND
198 jdc=self.readercata.cata[0].JdC( procedure =texte,
200 cata=self.readercata.cata,
201 cata_ord_dico=self.readercata.cata_ordonne_dico,
202 rep_mat=self.CONFIGURATION.rep_mat
204 jdc.lang = self.appli.langue
205 if units is not None:
206 jdc.recorded_units=units
207 jdc.old_recorded_units=units
208 ## PNPN est ce que la ligne suivante est bien utile ?
209 if texte == "" :jdc.analyse()
212 #--------------------------------#
213 def _newJDCInclude( self ,units = None):
214 #--------------------------------#
216 Initialise un nouveau JDC vierge
218 import Extensions.jdc_include
219 JdC_aux=Extensions.jdc_include.JdC_include
220 CONTEXT.unset_current_step()
222 jaux=self.readercata.cata[0].JdC( procedure="",
224 cata=self.readercata.cata,
225 cata_ord_dico=self.readercata.cata_ordonne_dico,
226 rep_mat=self.CONFIGURATION.rep_mat,
230 J=JdC_aux( procedure="",
232 cata=self.readercata.cata,
233 cata_ord_dico=self.readercata.cata_ordonne_dico,
235 rep_mat=self.CONFIGURATION.rep_mat,
238 if units is not None:
239 J.recorded_units=units
240 J.old_recorded_units=units
244 #-------------------------------#
245 def readFile(self, fn):
246 #--------------------------------#
248 Public slot to read the text from a file.
249 @param fn filename to read from (string or QString)
253 # ------------------------------------------------------------------------------------
255 # ------------------------------------------------------------------------------------
257 jdcName=os.path.basename(fn)
258 # Il faut convertir le contenu du fichier en fonction du format
259 if convert.plugins.has_key( self.appliEficas.format_fichier_in ):
260 # Le convertisseur existe on l'utilise
262 p=convert.plugins[self.appliEficas.format_fichier_in]()
264 if p.text=="" : self.nouveau=1
265 pareil,texteNew=self.verifieCHECKSUM(p.text)
267 if pareil == False and (self.appliEficas.ssIhm == False) :
268 QMessageBox.warning( self, tr("fichier modifie"),tr("Attention! fichier change hors EFICAS"))
270 memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
271 if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
273 text=p.convert('exec',self.appliEficas)
274 if not p.cr.estvide():
275 self.affiche_infos("Erreur a la conversion",Qt.red)
277 self.affiche_infos("Type de fichier non reconnu",Qt.red)
278 if self.appliEficas.ssIhm == False:
279 QMessageBox.critical( self, tr("Type de fichier non reconnu"),
280 tr("EFICAS ne sait pas ouvrir le type de fichier %s" ,self.appliEficas.format_fichier_in))
283 CONTEXT.unset_current_step()
284 jdc=self.readercata.cata[0].JdC(procedure=text,
286 cata=self.readercata.cata,
287 cata_ord_dico=self.readercata.cata_ordonne_dico,
289 rep_mat=self.CONFIGURATION.rep_mat
291 # ----------------------------------------------------
293 # ----------------------------------------------------
294 self.modified = False
296 # qApp.restoreOverrideCursor()
297 if self.fileInfo!= None :
298 self.lastModified = self.fileInfo.lastModified()
300 self.lastModified = 1
301 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
302 self.appliEficas.setWindowTitle(nouveauTitre)
306 #-----------------------#
307 def get_source(self,file):
308 #-----------------------#
310 # Il faut convertir le contenu du fichier en fonction du format
311 if convert.plugins.has_key(self.format):
312 # Le convertisseur existe on l'utilise
313 p=convert.plugins[self.format]()
315 text=p.convert('execnoparseur')
316 if not p.cr.estvide():
317 self.affiche_infos("Erreur a la conversion",Qt.red)
320 # Il n'existe pas c'est une erreur
321 self.affiche_infos("Type de fichier non reconnu",Qt.red)
322 QMessageBox.critical( self, tr("Type de fichier non reconnu"),tr("EFICAS ne sait pas ouvrir ce type de fichier"))
325 #----------------------------------------------#
326 def _viewText(self, txt, caption = "FILE_VIEWER"):
327 #----------------------------------------------#
328 w = ViewText( self.QWParent )
329 w.setWindowTitle( caption )
334 #----------------------------------------------#
335 def __generateTempFilename(self, prefix, suffix):
336 #----------------------------------------------#
338 (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
344 #----------------------------------------------#
345 def _viewTextExecute(self, txt, prefix, suffix):
346 #----------------------------------------------#
347 self.w = ViewText( self.QWParent )
348 self.w.setWindowTitle( "execution" )
349 self.monExe=QProcess(self.w)
350 pid=self.monExe.pid()
351 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
352 f=open(nomFichier,'w')
355 self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
356 self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
357 exe='sh /tmp/test.sh'
358 self.monExe.start(exe)
359 self.monExe.closeWriteChannel()
362 commande="rm "+ nomFichier
368 def readFromStdErr(self):
369 a=self.monExe.readAllStandardError()
370 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
372 def readFromStdOut(self) :
373 a=self.monExe.readAllStandardOutput()
374 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
378 #-----------------------#
379 def viewJdcSource(self):
380 #-----------------------#
381 f=open(self.fichier,'r')
384 self._viewText(texteSource, "JDC_SOURCE")
386 #-----------------------#
388 #-----------------------#
389 strSource = str( self.get_text_JDC(self.format) )
390 self._viewText(strSource, "JDC_RESULTAT")
392 #-----------------------#
393 def viewJdcRapport(self):
394 #-----------------------#
395 strRapport = unicode( self.jdc.report() )
396 self._viewText(strRapport, "JDC_RAPPORT")
402 Public method called by the viewmanager to finally get rid of us.
408 #----------------------------------------------#
409 def affiche_infos(self,message,couleur=Qt.black):
410 #----------------------------------------------#
412 mapalette=self.sb.palette()
413 from PyQt4.QtGui import QPalette
414 mapalette.setColor( QPalette.WindowText, couleur )
415 self.sb.setPalette( mapalette );
416 self.sb.showMessage(QString.fromUtf8(message))#,2000)
418 #------------------------------#
419 def affiche_alerte(self,titre,message):
420 #------------------------------#
421 # appele par I_MACRO_ETAPE
422 QMessageBox.information( self, titre, message)
424 #-------------------#
425 def init_modif(self):
426 #-------------------#
428 Met l'attribut modified a 'o' : utilise par Eficas pour savoir
429 si un JDC doit etre sauvegarde avant destruction ou non
433 #---------------------------------------#
434 def chercheNoeudSelectionne(self,copie=1):
435 #---------------------------------------#
437 appele par Cut et Copy pour positionner self.node_selected
439 self.node_selected=[]
440 if len(self.tree.selectedItems()) == 0 : return
441 self.node_selected=self.tree.selectedItems()
444 #---------------------#
445 def handleSupprimer(self):
446 #---------------------#
447 self.chercheNoeudSelectionne()
448 if len(self.node_selected) == 0 : return
449 self.QWParent.noeud_a_editer = []
450 if self.node_selected[0]==self.tree.racine: return
451 if len(self.node_selected) == 1 : self.node_selected[0].delete()
452 else : self.node_selected[0].deleteMultiple(self.node_selected)
454 #---------------------#
455 def handleRechercher(self):
456 #---------------------#
457 from monRecherche import DRecherche
458 monRechercheDialg=DRecherche(parent=self,fl=0)
459 monRechercheDialg.show()
461 #---------------------#
462 def handleDeplier(self):
463 #---------------------#
464 if self.tree == None : return
465 self.tree.collapseAll()
467 self.tree.collapseItem(self.tree.topLevelItem(0))
470 self.tree.expandItem(self.tree.topLevelItem(0))
473 #---------------------#
474 def handleEditCut(self):
475 #---------------------#
477 Stocke dans Eficas.noeud_a_editer le noeud a couper
479 #print "handleEditCut"
480 self.chercheNoeudSelectionne()
481 self.QWParent.edit="couper"
482 self.QWParent.noeud_a_editer = self.node_selected
484 #-----------------------#
485 def handleEditCopy(self):
486 #-----------------------#
488 Stocke dans Eficas.noeud_a_editer le noeud a copier
490 self.chercheNoeudSelectionne()
491 if len(self.node_selected) == 0 : return
492 if len(self.node_selected) == 1 : self.node_selected[0].update_node_label_in_blue()
493 else : self.node_selected[0].update_plusieurs_node_label_in_blue(self.node_selected)
494 self.QWParent.edit="copier"
495 self.QWParent.noeud_a_editer = self.node_selected
497 #------------------------#
498 def handleEditPaste(self):
499 #------------------------#
501 Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
502 Ne permet que la copie d'objets de type Commande ou MCF
504 self.chercheNoeudSelectionne()
505 if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
506 QMessageBox.information( self,
507 tr("Copie impossible"),
508 tr("Veuillez selectionner un objet a copier"))
510 if len(self.node_selected) != 1 :
511 QMessageBox.information( self,
512 tr("Copie impossible"),
513 tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
516 if len(self.QWParent.noeud_a_editer)!=1:
517 self.handleEditPasteMultiple()
520 noeudOuColler=self.node_selected[0]
522 if noeudOuColler == self.tree.racine:
526 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
529 noeudACopier=self.QWParent.noeud_a_editer[0]
530 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
532 QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
535 if (self.QWParent.edit != "couper"):
537 if noeudOuColler == self.tree.racine :
538 child=noeudOuColler.doPastePremier(noeudACopier)
540 child=noeudACopier.doPaste(noeudOuColler,pos)
541 if child==None or child==0:
542 QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
544 self.affiche_infos("Copie refusee",Qt.red)
545 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
547 nom=noeudACopier.item.sd.nom
548 child.item.nomme_sd(nom)
555 traceback.print_exc()
556 QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
558 self.affiche_infos("Copie refusee",Qt.red)
561 # il faut declarer le JDCDisplay_courant modifie
562 # suppression eventuelle du noeud selectionne
563 # si possible on renomme l objet comme le noeud couper
565 if (self.QWParent.edit == "couper"):
567 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
568 QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
572 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
573 noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
574 noeudACopier.treeParent.build_children()
579 self.QWParent.noeud_a_editer=[]
581 # on rend la copie a nouveau possible en liberant le flag edit
582 self.QWParent.edit="copier"
583 noeudACopier.select()
585 #----------------------------------#
586 def handleDeplaceMultiple(self):
587 #----------------------------------#
590 #----------------------------------#
591 def handleEditPasteMultiple(self):
592 #----------------------------------#
594 # On ne garde que les niveaux "Etape"
595 # On insere dans l'ordre du JDC
596 listeNoeudsACouper=[]
600 from InterfaceQT4 import compojdc
601 noeudOuColler=self.node_selected[0]
602 if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
603 QMessageBox.information( self,
604 tr("Copie impossible a cet endroit",),
605 tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
607 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
609 for noeud in self.QWParent.noeud_a_editer :
610 if not (isinstance(noeud.treeParent, compojdc.Node)): continue
611 indexInTree=noeud.treeParent.children.index(noeud)
613 for index in listeIndex:
614 if index < indexInTree : indice = indice +1
615 listeIndex.insert(indice, indexInTree)
616 listeNoeudsACouper.insert(indice, noeud)
618 noeudJdc=noeudOuColler.treeParent
620 # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
622 for index in listeIndex:
624 if indexNoeudOuColler < index:
625 indexTravail=indexTravail+dejaCrees
626 noeudOuColler=noeudJdc.children[indexNoeudOuColler]
627 noeud=noeudJdc.children[indexTravail]
628 child=noeud.doPaste(noeudOuColler)
629 listeChild.append(child)
630 dejaCrees=dejaCrees+1
632 self.QWParent.noeud_a_editer = []
633 for i in range(len(listeIndex)):
634 noeud=noeudJdc.children[indexNoeudOuColler+1+i]
635 self.QWParent.noeud_a_editer.append(noeud)
638 if self.QWParent.edit !="couper" : return
640 for index in listeIndex:
642 if indexNoeudOuColler < index:
643 indexTravail=indexTravail+(len(listeIndex))
644 noeud=noeudJdc.children[indexTravail]
646 listeItem.append(noeud.item)
647 listeASupprimer.append(noeud)
649 for i in range(len(listeChild)):
650 self.tree.item.suppitem(listeItem[i])
651 listeChild[i].item.update(listeItem[i])
653 self.QWParent.noeud_a_editer = []
656 #---------------------#
657 def getFileName(self):
658 #---------------------#
661 #---------------------------#
662 def get_file_variable(self) :
663 #---------------------------#
664 titre = tr("Choix d'un fichier XML")
665 texte = tr("Le fichier contient une commande MODEL\n")
666 texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
667 QMessageBox.information( self, titre,tr(texte))
669 fichier = QFileDialog.getOpenFileName(self.appliEficas,
670 tr('Ouvrir Fichier'),
671 self.appliEficas.CONFIGURATION.savedir,
672 self.appliEficas.trUtf8('Wrapper Files (*.xml);;''All Files (*)'))
675 #----------------------------------#
676 def writeFile(self, fn, txt = None):
677 #----------------------------------#
679 Public slot to write the text to a file.
681 @param fn filename to write to (string or QString)
682 @return flag indicating success
688 txt = self.get_text_JDC(self.format)
690 if len(txt) >= len(eol):
691 if txt[-len(eol):] != eol:
695 txt=self.ajoutVersionCataDsJDC(txt)
696 checksum=self.get_checksum(txt)
704 QMessageBox.critical(self, self.trUtf8('Save File'),
705 self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
706 .arg(unicode(fn)).arg(str(why)))
709 #-------------------------------------#
710 def get_text_JDC(self,format,pourRun=0):
711 #-------------------------------------#
712 if self.code == "MAP" and not(generator.plugins.has_key(format)): format = "MAP"
713 if generator.plugins.has_key(format):
714 # Le generateur existe on l'utilise
715 self.generator=generator.plugins[format]()
717 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
718 if pourRun : jdc_formate=self.generator.textePourRun
720 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
721 if not self.generator.cr.estvide():
722 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
723 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
728 # Il n'existe pas c'est une erreur
729 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
730 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
736 fonction="run"+self.code
737 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
742 fonction="saveRun"+self.code
743 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
749 if not(self.jdc.isvalid()):
750 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
752 if len(self.jdc.etapes) != 1 :
753 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
755 if self.modified or self.fichier==None :
756 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
757 texte=self.get_text_JDC("MAP")
758 self.writeFile( self.fichierMapInput, txt = texte)
760 self.fichierMapInput=self.fichier
761 composant=self.jdc.etapes[0].nom.lower()[0:-5]
764 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
765 # then instantiate corresponding class and call getUseSalome() method
767 from mapengine.spec import factory
768 mapComponent = factory.new(composant)[0]
771 if mapComponent.getUseSalome():
772 command += " -r sappli"
773 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
776 self._viewTextExecute( textePython,"map_run",".sh")
778 commande="rm "+self.fichierMapInput
783 print traceback.print_exc()
785 #-------------------#
786 def runZCRACKS(self):
787 #-------------------#
788 if not(self.jdc.isvalid()):
789 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
791 if self.modified or self.fichier==None :
793 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
794 texte=self.get_text_JDC("ZCRACKS",pourRun=1)
795 self.writeFile( self.fichierZcracksInput, txt = texte)
797 self.fichierZcracksInput=self.fichier
799 #commande ="Zrun -zp "
801 textePython=(commande + self.fichierZcracksInput)
802 self._viewTextExecute( textePython,"run_zcracks",".sh")
804 print traceback.print_exc()
806 #-------------------#
807 def runCARMELCND(self):
808 #-------------------#
809 #if not(self.jdc.isvalid()):
810 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
812 if self.modified or self.fichier==None :
813 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
815 if not hasattr(self,'generator'): texte=self.get_text_JDC(self.format)
816 from PrepareRunCarmel import prepareRunCarmel
817 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
818 repMed=os.path.dirname(self.fichier)
819 repExeCarmel=self.generator.get_repExeCarmel()
820 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
821 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
822 f=open(nomFichier,'w')
825 commande="xterm -e sh "+nomFichier +"\n"
828 # self._viewTextExecute( textePython,"carmel_run",".sh")
829 #except Exception, e:
830 # print traceback.print_exc()
832 #-------------------#
833 def runCarmelCS(self):
834 #-------------------#
836 commande="runSession pilotyacsCS.py"
839 print traceback.print_exc()
841 #-----------------------------------------------------#
842 def determineNomFichier(self,path,extension):
843 #-----------------------------------------------------#
844 if DictExtensions.has_key(self.appli.code) :
845 chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
846 extensions= self.trUtf8(chaine1+ "All Files (*)")
848 extensions= self.trUtf8("JDC (*.comm);;" "All Files (*)")
850 if self.appli.code == "MAP" :
851 extensions = extensions + ";; Run (*.input);;"
853 fn = QFileDialog.getSaveFileName( self,
854 tr("sauvegarde"), path,
856 QFileDialog.DontConfirmOverwrite)
857 if fn.isNull(): return (0, None)
858 ext = QFileInfo(fn).suffix()
859 if ext.isEmpty(): fn.append(extension)
861 if QFileInfo(fn).exists():
862 abort = QMessageBox.warning(self,
863 tr("Sauvegarde du Fichier"),
864 tr("Le fichier <b>%s</b> existe deja.",str(fn)),
866 self.trUtf8("&Abandonner"))
867 if abort == 1 : return (0, "")
871 def saveRunMAP(self):
874 if not(self.jdc.isvalid()):
875 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
876 tr("Un JdC valide est necessaire pour creer un .input")
880 composant=self.jdc.etapes[0].nom.lower()[0:-5]
882 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
883 tr("Choix du composant obligatoire")
886 if hasattr(self.CONFIGURATION, "savedir"): path=self.CONFIGURATION.savedir
887 else : path=os.environ['HOME']
890 if self.fichier is not None and self.fichier != "" :
891 maBase=str(QFileInfo(self.fichier).baseName())+".input"
892 monPath=str(QFileInfo(self.fichier).absolutePath())
893 monNomFichier=os.path.join(monPath,maBase)
894 elif hasattr(self,'monNomFichierInput'):
895 monNomFichier=self.monNomFichierInput
898 monDialog=QFileDialog(self.appliEficas)
899 monDialog.setDirectory (path)
900 monDialog.setWindowTitle ("Save")
902 for c in monDialog.children():
903 if isinstance(c,QDialogButtonBox):
904 for b in c.children():
905 if isinstance(b,QPushButton):
907 if avant.toLatin1()=="&Open":
909 mesFiltres=QStringList()
910 mesFiltres << "input Map (*.input)" << "All Files (*)"
911 monDialog.setNameFilters(mesFiltres)
912 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
913 BOk=monDialog.exec_()
915 fn=str(monDialog.selectedFiles()[0].toLatin1())
916 if fn == "" or fn == None : return
917 if not fn.endswith(".input"):
919 self.monNomFichierInput=fn
921 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
922 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
923 texte=self.get_text_JDC("MAP")
924 self.writeFile( self.fichierMapInput, txt = texte)
926 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
927 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
928 (output, err) = p.communicate()
931 #-----------------------------------------#
932 def cherche_Groupes(self):
933 #-----------------------------------------#
934 listeMA,listeNO=self.get_text_JDC("GroupMA")
935 return listeMA,listeNO
937 #-----------------------------------------#
938 def cherche_Dico(self):
939 #-----------------------------------------#
941 format = self.appliEficas.format_fichier
942 if generator.plugins.has_key(format):
943 # Le generateur existe on l'utilise
944 self.generator=generator.plugins[format]()
945 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
946 dicoCourant=self.generator.dico
951 #-----------------------------------------#
952 def handleAjoutGroup(self,listeGroup):
953 #-----------------------------------------#
956 from ajoutGroupe import handleAjoutGroupFiltre
958 handleAjoutGroupFiltre(self,listeGroup)
959 #print "apres handleAjoutGroupFiltre"
964 #-----------------------------------------#
965 def saveFile(self, path = None, saveas= 0):
966 #-----------------------------------------#
968 Public slot to save the text to a file.
970 @param path directory to save the file in (string or QString)
971 @return tuple of two values (boolean, string) giving a success indicator and
972 the name of the saved file
976 if not self.modified and not saveas:
977 return (0, None) # do nothing if text wasn't changed
980 if DictExtensions.has_key(self.appli.code) :
981 extension=DictExtensions[self.appli.code]
987 if self.fichier is None or saveas:
989 path=self.CONFIGURATION.savedir
990 bOK, fn=self.determineNomFichier(path,extension)
991 if bOK == 0 : return (0, None)
992 if fn == None : return (0, None)
993 if fn.isNull(): return (0, None)
995 ulfile = os.path.abspath(unicode(fn))
996 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
997 fn = unicode(QDir.convertSeparators(fn))
1000 if not (self.writeFile(fn)): return (0, None)
1002 self.modified = False
1003 if self.fileInfo is None or saveas:
1004 self.fileInfo = QFileInfo(self.fichier)
1005 self.fileInfo.setCaching(0)
1006 self.lastModified = self.fileInfo.lastModified()
1007 if newName is not None:
1008 self.appliEficas.addToRecentList(newName)
1009 self.tree.racine.item.getObject().nom=os.path.basename(newName)
1010 self.tree.racine.update_node_label()
1012 if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
1013 self.generator.writeDefault(fn)
1016 self.appliEficas.addJdcInSalome( self.fichier)
1018 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1019 self.appliEficas.setWindowTitle(nouveauTitre)
1021 return (1, self.fichier)
1023 #----------------------------------------------#
1024 def saveFileAs(self, path = None,fileName=None):
1025 #----------------------------------------------#
1027 Public slot to save a file with a new name.
1029 @param path directory to save the file in (string or QString)
1030 @return tuple of two values (boolean, string) giving a success indicator and
1031 the name of the saved file
1033 if fileName != None :
1034 self.fichier = fileName
1035 return self.saveFile()
1036 return self.saveFile(path,1)
1040 #---------------------------------------------#
1041 def get_file(self,unite=None,fic_origine = ''):
1042 #---------------------------------------------#
1050 titre = tr("Choix unite %d ", unite)
1051 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
1052 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
1053 labeltexte = tr('Fichier pour unite ') + repr( unite)
1055 titre = tr("Choix d'un fichier de poursuite")
1056 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
1057 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
1059 QMessageBox.information( self, titre,QString.fromUtf8(texte))
1060 fn = QFileDialog.getOpenFileName(self.appliEficas,
1062 self.appliEficas.CONFIGURATION.savedir)
1065 # ce retour est impose par le get_file d'I_JDC
1068 ulfile = os.path.abspath(unicode(fn))
1069 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1071 # On utilise le convertisseur defini par format_fichier
1072 source=self.get_source(ulfile)
1074 # On a reussia convertir le fichier self.ulfile
1077 # Une erreur a ete rencontree
1079 return ulfile, jdcText
1081 #-------------------------------#
1082 def updateJdc(self, itemApres,texte):
1083 #--------------------------------#
1085 etape=monItem.item.object
1087 CONTEXT.set_current_step(etape)
1088 etape.build_includeInclude(texte)
1089 self.tree.racine.build_children()
1094 #-------------------------------------#
1095 def ajoutVersionCataDsJDC(self,txt):
1096 #-------------------------------------#
1097 if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
1098 ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata[0].VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
1099 texte=txt+ligneVersion
1102 #-------------------------------------#
1103 def verifieVersionCataDuJDC(self,text):
1104 #-------------------------------------#
1106 indexDeb=text.find("#VERSION_CATALOGUE:")
1107 indexFin=text.find(":FIN VERSION_CATALOGUE")
1109 self.versionCataDuJDC="sans"
1112 self.versionCataDuJDC=text[indexDeb+19:indexFin]
1113 textJDC=text[0:indexDeb]+text[indexFin+23:-1]
1115 self.versionCata="sans"
1116 if hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata[0].VERSION_CATALOGUE
1118 if self.versionCata==self.versionCataDuJDC : memeVersion=True
1119 return memeVersion,textJDC
1121 #-------------------------------#
1122 def traduitCatalogue(self,texte):
1123 #-------------------------------#
1124 nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
1125 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
1127 traducteur=__import__(nomTraducteur)
1128 monTraducteur=traducteur.MonTraducteur(texte)
1129 nouveauTexte=monTraducteur.traduit()
1135 #------------------------------#
1136 def verifieCHECKSUM(self,text):
1137 #------------------------------#
1138 indexDeb=text.find("#CHECKSUM:")
1141 indexFin=text.find(":FIN CHECKSUM")
1142 checkAvant=text[indexDeb:indexFin+13]
1143 textJDC=text[0:indexDeb]+text[indexFin+13:-1]
1144 checksum=self.get_checksum(textJDC)
1145 pareil=(checkAvant==checksum)
1146 return pareil, textJDC
1148 #---------------------------#
1149 def get_checksum(self,texte):
1150 #---------------------------#
1151 newtexte=texte.replace('"','\\"')
1152 commande='echo "'+newtexte+'"|md5sum'
1153 a=os.popen(commande)
1156 ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
1160 #---------------------------#
1161 def _newZCRACKS(self):
1162 #---------------------------#
1163 texte="MAILLAGES();REMESHING();"
1166 #---------------------------#
1167 def _newJDCCND(self):
1168 #---------------------------#
1169 extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
1171 #if self.salome == 0 :
1172 QMessageBox.information( self,
1174 tr("Veuillez selectionner un fichier Med"))
1175 QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
1176 caption='Fichier Med',
1178 self.fichierMED=str(QSfichier.toLatin1())
1179 from acquiertGroupes import getGroupes
1180 erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
1181 if erreur != "" : print "a traiter"
1183 # from monBoutonSalome import MonBoutonSalome
1184 # desBoutonSalome = MonBoutonSalome()
1186 # icon = QIcon(self.appli.repIcon+"/image240.png")
1187 # desBoutonSalome.pushButton.setIcon(icon)
1188 # desBoutonSalome.setMinimumSize(QtCore.QSize(453, 103))
1190 # self.openfile=QFileDialog(self.appli,caption='Fichier Med',filter=extensions)
1191 # self.openfile.layout().addWidget(desBoutonSalome)
1192 # self.connect(desBoutonSalome.pushButton,SIGNAL("clicked()"),self.BoutonSalomePressed)
1193 # self.connect(self.openfile,SIGNAL("fileSelected(QString)"),self.BoutonFileSelected)
1194 # r=self.openfile.exec_()
1195 texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
1200 for groupe in self.listeGroupes :
1201 if groupe[0:8]=='CURRENT_':
1202 texteSources +=groupe[8:]+"=SOURCE("
1203 texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
1204 if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n"
1205 if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n"
1206 if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n"
1207 texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut
1208 self.newTexteCND=texte
1213 #---------------------------#
1214 def BoutonFileSelected(self):
1215 #---------------------------#
1217 QSfichier=self.openfile.selectedFiles()[0]
1218 self.fichierMED=str(QSfichier.toLatin1())
1219 from acquiertGroupes import getGroupes
1220 erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
1221 if erreur != "" : print "a traiter"
1223 #-----------------------------
1224 def BoutonSalomePressed(self):
1225 #----------------------------
1226 Msg,self.listeGroupes=self.appliEficas.ChercheGrpMailleInSalome()
1227 self.fichierMED="A_partir_de_SMESH"
1228 self.nomMaillage="A_partir_de_SMESH"
1229 self.openfile.close()
1232 if __name__ == "__main__":
1234 name='prefs_'+prefs.code
1235 prefsCode=__import__(name)
1238 if hasattr(prefsCode,'encoding'):
1239 # Hack pour changer le codage par defaut des strings
1242 sys.setdefaultencoding(prefs.encoding)
1243 del sys.setdefaultencoding
1248 app = QApplication(sys.argv)
1249 mw = JDCEditor(None,'azAster.comm')
1250 app.setMainWidget(mw)
1251 app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
1254 res = app.exec_loop()