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
39 from monWidgetParam import MonWidgetParam
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 #----------------------------------------------------------------------------------------------------------#
56 QtGui.QWidget.__init__(self,None)
58 self.monOptionnel=None
59 self.fenetreCentraleAffichee=None
60 self.appliEficas = appli
61 self.appli = appli #---- attendu par IHM
63 self.fichier = fichier
66 self.QWParent = QWParent
69 self.salome = self.appliEficas.salome
72 print "dans JDC pas d appli ????????"
74 # ces attributs sont mis a jour par definitCode appelee par newEditor
75 self.code = self.appliEficas.CONFIGURATION.code
77 if self.code in ['MAP','Adao'] :
78 self.widgetTree.close()
80 self.appliEficas.resize(1440,self.appliEficas.height())
82 self.appliEficas.resize(2000,self.appliEficas.height())
84 self.version_code = session.d_env.cata
86 if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.multi==True:
87 self.readercata = readercata.READERCATA( self, self.appliEficas )
88 self.appliEficas.readercata=self.readercata
90 self.readercata=self.appliEficas.readercata
91 if self.readercata.fic_cata == None : return #Sortie Salome
92 self.titre=self.readercata.titre
94 self.format = self.appliEficas.format_fichier
97 self.liste_simp_reel=[]
100 nameConf='configuration_'+self.code
101 configuration=__import__(nameConf)
102 self.CONFIGURATION = self.appliEficas.CONFIGURATION
103 self.CONFIGStyle = self.appliEficas.CONFIGStyle
106 self.CONFIGURATION.generator_module
107 _module = __import__(self.CONFIGURATION.generator_module)
108 info = _module.entryPoint()
109 generator.plugins.addEntryPoint(info)
114 self.CONFIGURATION.convert_module
115 _module = __import__(self.CONFIGURATION.convert_module)
116 info = _module.entryPoint()
117 convert.plugins.addEntryPoint(info)
122 if hasattr(self.appliEficas,"statusBar"):
123 self.sb = self.appliEficas.statusBar()
126 self.lastModified = 0
128 self.modified = False
129 self.isReadOnly = False
130 self.node_selected = []
134 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
136 #------- construction du jdc --------------
139 self.mode_nouv_commande=self.readercata.mode_nouv_commande
142 if self.fichier is not None: # fichier jdc fourni
143 self.fileInfo = QFileInfo(self.fichier)
144 self.fileInfo.setCaching(0)
147 self.jdc = self.readFile(self.fichier)
149 print "mauvaise lecture"
152 if self.jdc is not None and units is not None:
153 self.jdc.recorded_units=units
154 self.jdc.old_recorded_units=units
156 if not self.jdc: # nouveau jdc
158 self.jdc = self._newJDC(units=units)
160 self.jdc = self._newJDCInclude(units=units)
164 self.jdc.appli = self
165 self.jdc.lang = self.appli.langue
169 txt_exception = self.jdc.cr.get_mess_exception()
172 qApp.restoreOverrideCursor()
173 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
174 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
176 comploader.charger_composants("QT")
177 jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
178 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
179 self.viewJdcRapport()
182 self.tree = browser.JDCTree( jdc_item, self )
183 self.appliEficas.construitMenu()
185 #--------------------------------#
186 def _newJDC( self ,units = None):
187 #--------------------------------#
189 Initialise un nouveau JDC vierge
192 CONTEXT.unset_current_step()
195 if self.code == "CARMELCND" : texte=self._newJDCCND()
196 if self.code == "ZCRACKS" : texte=self._newZCRACKS()
197 # texte=self.newTexteCND
199 jdc=self.readercata.cata[0].JdC( procedure =texte,
201 cata=self.readercata.cata,
202 cata_ord_dico=self.readercata.cata_ordonne_dico,
203 rep_mat=self.CONFIGURATION.rep_mat
205 jdc.lang = self.appli.langue
206 if units is not None:
207 jdc.recorded_units=units
208 jdc.old_recorded_units=units
209 ## PNPN est ce que la ligne suivante est bien utile ?
210 if texte == "" :jdc.analyse()
213 #--------------------------------#
214 def _newJDCInclude( self ,units = None):
215 #--------------------------------#
217 Initialise un nouveau JDC vierge
219 import Extensions.jdc_include
220 JdC_aux=Extensions.jdc_include.JdC_include
221 CONTEXT.unset_current_step()
223 jaux=self.readercata.cata[0].JdC( procedure="",
225 cata=self.readercata.cata,
226 cata_ord_dico=self.readercata.cata_ordonne_dico,
227 rep_mat=self.CONFIGURATION.rep_mat,
231 J=JdC_aux( procedure="",
233 cata=self.readercata.cata,
234 cata_ord_dico=self.readercata.cata_ordonne_dico,
236 rep_mat=self.CONFIGURATION.rep_mat,
239 if units is not None:
240 J.recorded_units=units
241 J.old_recorded_units=units
245 #-------------------------------#
246 def readFile(self, fn):
247 #--------------------------------#
249 Public slot to read the text from a file.
250 @param fn filename to read from (string or QString)
254 # ------------------------------------------------------------------------------------
256 # ------------------------------------------------------------------------------------
258 jdcName=os.path.basename(fn)
259 # Il faut convertir le contenu du fichier en fonction du format
260 if convert.plugins.has_key( self.appliEficas.format_fichier_in ):
261 # Le convertisseur existe on l'utilise
263 p=convert.plugins[self.appliEficas.format_fichier_in]()
265 if p.text=="" : self.nouveau=1
266 pareil,texteNew=self.verifieCHECKSUM(p.text)
268 if pareil == False and (self.appliEficas.ssIhm == False) :
269 QMessageBox.warning( self, tr("fichier modifie"),tr("Attention! fichier change hors EFICAS"))
271 memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
272 if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
274 text=p.convert('exec',self.appliEficas)
275 if not p.cr.estvide():
276 self.affiche_infos("Erreur a la conversion",Qt.red)
278 self.affiche_infos("Type de fichier non reconnu",Qt.red)
279 if self.appliEficas.ssIhm == False:
280 QMessageBox.critical( self, tr("Type de fichier non reconnu"),
281 tr("EFICAS ne sait pas ouvrir le type de fichier %s" ,self.appliEficas.format_fichier_in))
284 CONTEXT.unset_current_step()
285 jdc=self.readercata.cata[0].JdC(procedure=text,
287 cata=self.readercata.cata,
288 cata_ord_dico=self.readercata.cata_ordonne_dico,
290 rep_mat=self.CONFIGURATION.rep_mat
292 # ----------------------------------------------------
294 # ----------------------------------------------------
295 self.modified = False
297 # qApp.restoreOverrideCursor()
298 if self.fileInfo!= None :
299 self.lastModified = self.fileInfo.lastModified()
301 self.lastModified = 1
302 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
303 self.appliEficas.setWindowTitle(nouveauTitre)
307 #-----------------------#
308 def get_source(self,file):
309 #-----------------------#
311 # Il faut convertir le contenu du fichier en fonction du format
312 if convert.plugins.has_key(self.format):
313 # Le convertisseur existe on l'utilise
314 p=convert.plugins[self.format]()
316 text=p.convert('execnoparseur')
317 if not p.cr.estvide():
318 self.affiche_infos("Erreur a la conversion",Qt.red)
321 # Il n'existe pas c'est une erreur
322 self.affiche_infos("Type de fichier non reconnu",Qt.red)
323 QMessageBox.critical( self, tr("Type de fichier non reconnu"),tr("EFICAS ne sait pas ouvrir ce type de fichier"))
326 #-----------------------------------------------------------------------#
327 def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
328 #--------------------------------------------------------------------#
329 w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
333 #----------------------------------------------#
334 def __generateTempFilename(self, prefix, suffix):
335 #----------------------------------------------#
337 (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
343 #----------------------------------------------#
344 def _viewTextExecute(self, txt, prefix, suffix):
345 #----------------------------------------------#
346 self.w = ViewText( self.QWParent )
347 self.w.setWindowTitle( "execution" )
348 self.monExe=QProcess(self.w)
349 pid=self.monExe.pid()
350 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
351 f=open(nomFichier,'w')
354 self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
355 self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
356 exe='sh /tmp/test.sh'
357 self.monExe.start(exe)
358 self.monExe.closeWriteChannel()
361 commande="rm "+ nomFichier
367 def readFromStdErr(self):
368 a=self.monExe.readAllStandardError()
369 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
371 def readFromStdOut(self) :
372 a=self.monExe.readAllStandardOutput()
373 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
377 #-----------------------#
378 def gestionParam(self):
379 #-----------------------#
380 w = MonWidgetParam( self)
383 #-----------------------#
384 def viewJdcSource(self):
385 #-----------------------#
386 f=open(self.fichier,'r')
389 self._viewText(texteSource, "JDC_SOURCE")
391 #-----------------------#
393 #-----------------------#
394 strSource = str( self.get_text_JDC(self.format) )
395 self._viewText(strSource, "JDC_RESULTAT")
397 #-----------------------#
398 def viewJdcRapport(self):
399 #-----------------------#
400 strRapport = unicode( self.jdc.report() )
401 self._viewText(strRapport, "JDC_RAPPORT")
407 Public method called by the viewmanager to finally get rid of us.
413 #----------------------------------------------#
414 def affiche_infos(self,message,couleur=Qt.black):
415 #----------------------------------------------#
417 mapalette=self.sb.palette()
418 from PyQt4.QtGui import QPalette
419 mapalette.setColor( QPalette.WindowText, couleur )
420 self.sb.setPalette( mapalette );
421 self.sb.showMessage(QString.fromUtf8(message))#,2000)
423 #------------------------------#
424 def affiche_alerte(self,titre,message):
425 #------------------------------#
426 # appele par I_MACRO_ETAPE
427 QMessageBox.information( self, titre, message)
429 #-------------------#
430 def init_modif(self):
431 #-------------------#
433 Met l'attribut modified a 'o' : utilise par Eficas pour savoir
434 si un JDC doit etre sauvegarde avant destruction ou non
438 #---------------------------------------#
439 def chercheNoeudSelectionne(self,copie=1):
440 #---------------------------------------#
442 appele par Cut et Copy pour positionner self.node_selected
444 self.node_selected=[]
445 if len(self.tree.selectedItems()) == 0 : return
446 self.node_selected=self.tree.selectedItems()
449 #---------------------#
450 def handleSupprimer(self):
451 #---------------------#
452 self.chercheNoeudSelectionne()
453 if len(self.node_selected) == 0 : return
454 self.QWParent.noeud_a_editer = []
455 if self.node_selected[0]==self.tree.racine: return
456 if len(self.node_selected) == 1 : self.node_selected[0].delete()
457 else : self.node_selected[0].deleteMultiple(self.node_selected)
459 #---------------------#
460 def handleRechercher(self):
461 #---------------------#
462 from monRecherche import DRecherche
463 monRechercheDialg=DRecherche(parent=self,fl=0)
464 monRechercheDialg.show()
466 #---------------------#
467 def handleDeplier(self):
468 #---------------------#
469 if self.tree == None : return
470 self.tree.collapseAll()
472 self.tree.collapseItem(self.tree.topLevelItem(0))
475 self.tree.expandItem(self.tree.topLevelItem(0))
478 #---------------------#
479 def handleEditCut(self):
480 #---------------------#
482 Stocke dans Eficas.noeud_a_editer le noeud a couper
484 #print "handleEditCut"
485 self.chercheNoeudSelectionne()
486 self.QWParent.edit="couper"
487 self.QWParent.noeud_a_editer = self.node_selected
489 #-----------------------#
490 def handleEditCopy(self):
491 #-----------------------#
493 Stocke dans Eficas.noeud_a_editer le noeud a copier
495 self.chercheNoeudSelectionne()
496 if len(self.node_selected) == 0 : return
497 if len(self.node_selected) == 1 : self.node_selected[0].update_node_label_in_blue()
498 else : self.node_selected[0].update_plusieurs_node_label_in_blue(self.node_selected)
499 self.QWParent.edit="copier"
500 self.QWParent.noeud_a_editer = self.node_selected
502 #------------------------#
503 def handleEditPaste(self):
504 #------------------------#
506 Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
507 Ne permet que la copie d'objets de type Commande ou MCF
509 self.chercheNoeudSelectionne()
510 if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
511 QMessageBox.information( self,
512 tr("Copie impossible"),
513 tr("Veuillez selectionner un objet a copier"))
515 if len(self.node_selected) != 1 :
516 QMessageBox.information( self,
517 tr("Copie impossible"),
518 tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
521 if len(self.QWParent.noeud_a_editer)!=1:
522 self.handleEditPasteMultiple()
525 noeudOuColler=self.node_selected[0]
527 if noeudOuColler == self.tree.racine:
531 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
534 noeudACopier=self.QWParent.noeud_a_editer[0]
535 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
537 QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
540 if (self.QWParent.edit != "couper"):
542 if noeudOuColler == self.tree.racine :
543 child=noeudOuColler.doPastePremier(noeudACopier)
545 child=noeudACopier.doPaste(noeudOuColler,pos)
546 if child==None or child==0:
547 QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
549 self.affiche_infos("Copie refusee",Qt.red)
550 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
552 nom=noeudACopier.item.sd.nom
553 child.item.nomme_sd(nom)
560 traceback.print_exc()
561 QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
563 self.affiche_infos("Copie refusee",Qt.red)
566 # il faut declarer le JDCDisplay_courant modifie
567 # suppression eventuelle du noeud selectionne
568 # si possible on renomme l objet comme le noeud couper
570 if (self.QWParent.edit == "couper"):
572 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
573 QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
577 indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
578 noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
579 noeudACopier.treeParent.build_children()
584 self.QWParent.noeud_a_editer=[]
586 # on rend la copie a nouveau possible en liberant le flag edit
587 self.QWParent.edit="copier"
588 noeudACopier.select()
590 #----------------------------------#
591 def handleDeplaceMultiple(self):
592 #----------------------------------#
595 #----------------------------------#
596 def handleEditPasteMultiple(self):
597 #----------------------------------#
599 # On ne garde que les niveaux "Etape"
600 # On insere dans l'ordre du JDC
601 listeNoeudsACouper=[]
605 from InterfaceQT4 import compojdc
606 noeudOuColler=self.node_selected[0]
607 if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
608 QMessageBox.information( self,
609 tr("Copie impossible a cet endroit",),
610 tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
612 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
614 for noeud in self.QWParent.noeud_a_editer :
615 if not (isinstance(noeud.treeParent, compojdc.Node)): continue
616 indexInTree=noeud.treeParent.children.index(noeud)
618 for index in listeIndex:
619 if index < indexInTree : indice = indice +1
620 listeIndex.insert(indice, indexInTree)
621 listeNoeudsACouper.insert(indice, noeud)
623 noeudJdc=noeudOuColler.treeParent
625 # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
627 for index in listeIndex:
629 if indexNoeudOuColler < index:
630 indexTravail=indexTravail+dejaCrees
631 noeudOuColler=noeudJdc.children[indexNoeudOuColler]
632 noeud=noeudJdc.children[indexTravail]
633 child=noeud.doPaste(noeudOuColler)
634 listeChild.append(child)
635 dejaCrees=dejaCrees+1
637 self.QWParent.noeud_a_editer = []
638 for i in range(len(listeIndex)):
639 noeud=noeudJdc.children[indexNoeudOuColler+1+i]
640 self.QWParent.noeud_a_editer.append(noeud)
643 if self.QWParent.edit !="couper" : return
645 for index in listeIndex:
647 if indexNoeudOuColler < index:
648 indexTravail=indexTravail+(len(listeIndex))
649 noeud=noeudJdc.children[indexTravail]
651 listeItem.append(noeud.item)
652 listeASupprimer.append(noeud)
654 for i in range(len(listeChild)):
655 self.tree.item.suppitem(listeItem[i])
656 listeChild[i].item.update(listeItem[i])
658 self.QWParent.noeud_a_editer = []
661 #---------------------#
662 def getFileName(self):
663 #---------------------#
666 #---------------------------#
667 def get_file_variable(self) :
668 #---------------------------#
669 titre = tr("Choix d'un fichier XML")
670 texte = tr("Le fichier contient une commande MODEL\n")
671 texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
672 QMessageBox.information( self, titre,tr(texte))
674 fichier = QFileDialog.getOpenFileName(self.appliEficas,
675 tr('Ouvrir Fichier'),
676 self.appliEficas.CONFIGURATION.savedir,
677 self.appliEficas.trUtf8('Wrapper Files (*.xml);;''All Files (*)'))
680 #----------------------------------#
681 def writeFile(self, fn, txt = None):
682 #----------------------------------#
684 Public slot to write the text to a file.
686 @param fn filename to write to (string or QString)
687 @return flag indicating success
693 txt = self.get_text_JDC(self.format)
695 if len(txt) >= len(eol):
696 if txt[-len(eol):] != eol:
700 txt=self.ajoutVersionCataDsJDC(txt)
701 checksum=self.get_checksum(txt)
709 QMessageBox.critical(self, self.trUtf8('Save File'),
710 self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
711 .arg(unicode(fn)).arg(str(why)))
714 #-------------------------------------#
715 def get_text_JDC(self,format,pourRun=0):
716 #-------------------------------------#
717 if self.code == "MAP" and not(generator.plugins.has_key(format)): format = "MAP"
718 if generator.plugins.has_key(format):
719 # Le generateur existe on l'utilise
720 self.generator=generator.plugins[format]()
722 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
723 if pourRun : jdc_formate=self.generator.textePourRun
725 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
726 if not self.generator.cr.estvide():
727 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
728 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
733 # Il n'existe pas c'est une erreur
734 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
735 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
741 fonction="run"+self.code
742 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
747 fonction="saveRun"+self.code
748 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
754 if not(self.jdc.isvalid()):
755 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
757 if len(self.jdc.etapes) != 1 :
758 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
760 if self.modified or self.fichier==None :
761 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
762 texte=self.get_text_JDC("MAP")
763 self.writeFile( self.fichierMapInput, txt = texte)
765 self.fichierMapInput=self.fichier
766 composant=self.jdc.etapes[0].nom.lower()[0:-5]
769 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
770 # then instantiate corresponding class and call getUseSalome() method
772 from mapengine.spec import factory
773 mapComponent = factory.new(composant)[0]
776 if mapComponent.getUseSalome():
777 command += " -r sappli"
778 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
781 self._viewTextExecute( textePython,"map_run",".sh")
783 commande="rm "+self.fichierMapInput
788 print traceback.print_exc()
790 #-------------------#
791 def runZCRACKS(self):
792 #-------------------#
793 if not(self.jdc.isvalid()):
794 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
796 if self.modified or self.fichier==None :
798 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
799 texte=self.get_text_JDC("ZCRACKS",pourRun=1)
800 self.writeFile( self.fichierZcracksInput, txt = texte)
802 self.fichierZcracksInput=self.fichier
804 #commande ="Zrun -zp "
806 textePython=(commande + self.fichierZcracksInput)
807 self._viewTextExecute( textePython,"run_zcracks",".sh")
809 print traceback.print_exc()
811 #-------------------#
812 def runCARMELCND(self):
813 #-------------------#
814 #if not(self.jdc.isvalid()):
815 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
817 if self.modified or self.fichier==None :
818 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
820 if not hasattr(self,'generator'): texte=self.get_text_JDC(self.format)
821 from PrepareRunCarmel import prepareRunCarmel
822 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
823 repMed=os.path.dirname(self.fichier)
824 repExeCarmel=self.generator.get_repExeCarmel()
825 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
826 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
827 f=open(nomFichier,'w')
830 commande="xterm -e sh "+nomFichier +"\n"
833 # self._viewTextExecute( textePython,"carmel_run",".sh")
834 #except Exception, e:
835 # print traceback.print_exc()
837 #-------------------#
838 def runCarmelCS(self):
839 #-------------------#
841 commande="runSession pilotyacsCS.py"
844 print traceback.print_exc()
846 #-----------------------------------------------------#
847 def determineNomFichier(self,path,extension):
848 #-----------------------------------------------------#
849 if DictExtensions.has_key(self.appli.code) :
850 chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
851 extensions= self.trUtf8(chaine1+ "All Files (*)")
853 extensions= self.trUtf8("JDC (*.comm);;" "All Files (*)")
855 if self.appli.code == "MAP" :
856 extensions = extensions + ";; Run (*.input);;"
858 fn = QFileDialog.getSaveFileName( self,
859 tr("sauvegarde"), path,
861 QFileDialog.DontConfirmOverwrite)
862 if fn.isNull(): return (0, None)
863 ext = QFileInfo(fn).suffix()
864 if ext.isEmpty(): fn.append(extension)
866 if QFileInfo(fn).exists():
867 abort = QMessageBox.warning(self,
868 tr("Sauvegarde du Fichier"),
869 tr("Le fichier <b>%s</b> existe deja.",str(fn)),
871 self.trUtf8("&Abandonner"))
872 if abort == 1 : return (0, "")
876 def saveRunMAP(self):
879 if not(self.jdc.isvalid()):
880 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
881 tr("Un JdC valide est necessaire pour creer un .input")
885 composant=self.jdc.etapes[0].nom.lower()[0:-5]
887 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
888 tr("Choix du composant obligatoire")
891 if hasattr(self.CONFIGURATION, "savedir"): path=self.CONFIGURATION.savedir
892 else : path=os.environ['HOME']
895 if self.fichier is not None and self.fichier != "" :
896 maBase=str(QFileInfo(self.fichier).baseName())+".input"
897 monPath=str(QFileInfo(self.fichier).absolutePath())
898 monNomFichier=os.path.join(monPath,maBase)
899 elif hasattr(self,'monNomFichierInput'):
900 monNomFichier=self.monNomFichierInput
903 monDialog=QFileDialog(self.appliEficas)
904 monDialog.setDirectory (path)
905 monDialog.setWindowTitle ("Save")
907 for c in monDialog.children():
908 if isinstance(c,QDialogButtonBox):
909 for b in c.children():
910 if isinstance(b,QPushButton):
912 if avant.toLatin1()=="&Open":
914 mesFiltres=QStringList()
915 mesFiltres << "input Map (*.input)" << "All Files (*)"
916 monDialog.setNameFilters(mesFiltres)
917 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
918 BOk=monDialog.exec_()
920 fn=str(monDialog.selectedFiles()[0].toLatin1())
921 if fn == "" or fn == None : return
922 if not fn.endswith(".input"):
924 self.monNomFichierInput=fn
926 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
927 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
928 texte=self.get_text_JDC("MAP")
929 self.writeFile( self.fichierMapInput, txt = texte)
931 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
932 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
933 (output, err) = p.communicate()
936 #-----------------------------------------#
937 def cherche_Groupes(self):
938 #-----------------------------------------#
939 listeMA,listeNO=self.get_text_JDC("GroupMA")
940 return listeMA,listeNO
942 #-----------------------------------------#
943 def cherche_Dico(self):
944 #-----------------------------------------#
946 format = self.appliEficas.format_fichier
947 if generator.plugins.has_key(format):
948 # Le generateur existe on l'utilise
949 self.generator=generator.plugins[format]()
950 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
951 dicoCourant=self.generator.dico
956 #-----------------------------------------#
957 def handleAjoutGroup(self,listeGroup):
958 #-----------------------------------------#
961 from ajoutGroupe import handleAjoutGroupFiltre
963 handleAjoutGroupFiltre(self,listeGroup)
964 #print "apres handleAjoutGroupFiltre"
969 #-----------------------------------------#
970 def saveFile(self, path = None, saveas= 0):
971 #-----------------------------------------#
973 Public slot to save the text to a file.
975 @param path directory to save the file in (string or QString)
976 @return tuple of two values (boolean, string) giving a success indicator and
977 the name of the saved file
981 if not self.modified and not saveas:
982 return (0, None) # do nothing if text wasn't changed
985 if DictExtensions.has_key(self.appli.code) :
986 extension=DictExtensions[self.appli.code]
992 if self.fichier is None or saveas:
994 path=self.CONFIGURATION.savedir
995 bOK, fn=self.determineNomFichier(path,extension)
996 if bOK == 0 : return (0, None)
997 if fn == None : return (0, None)
998 if fn.isNull(): return (0, None)
1000 ulfile = os.path.abspath(unicode(fn))
1001 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1002 fn = unicode(QDir.convertSeparators(fn))
1005 if not (self.writeFile(fn)): return (0, None)
1007 self.modified = False
1008 if self.fileInfo is None or saveas:
1009 self.fileInfo = QFileInfo(self.fichier)
1010 self.fileInfo.setCaching(0)
1011 self.lastModified = self.fileInfo.lastModified()
1012 if newName is not None:
1013 self.appliEficas.addToRecentList(newName)
1014 self.tree.racine.item.getObject().nom=os.path.basename(newName)
1015 self.tree.racine.update_node_label()
1017 if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
1018 self.generator.writeDefault(fn)
1021 self.appliEficas.addJdcInSalome( self.fichier)
1023 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1024 self.appliEficas.setWindowTitle(nouveauTitre)
1026 return (1, self.fichier)
1028 #----------------------------------------------#
1029 def saveFileAs(self, path = None,fileName=None):
1030 #----------------------------------------------#
1032 Public slot to save a file with a new name.
1034 @param path directory to save the file in (string or QString)
1035 @return tuple of two values (boolean, string) giving a success indicator and
1036 the name of the saved file
1038 if fileName != None :
1039 self.fichier = fileName
1040 return self.saveFile()
1041 return self.saveFile(path,1)
1045 #---------------------------------------------#
1046 def get_file(self,unite=None,fic_origine = ''):
1047 #---------------------------------------------#
1055 titre = tr("Choix unite %d ", unite)
1056 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
1057 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
1058 labeltexte = tr('Fichier pour unite ') + repr( unite)
1060 titre = tr("Choix d'un fichier de poursuite")
1061 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
1062 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
1064 QMessageBox.information( self, titre,QString.fromUtf8(texte))
1065 fn = QFileDialog.getOpenFileName(self.appliEficas,
1067 self.appliEficas.CONFIGURATION.savedir)
1070 # ce retour est impose par le get_file d'I_JDC
1073 ulfile = os.path.abspath(unicode(fn))
1074 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1076 # On utilise le convertisseur defini par format_fichier
1077 source=self.get_source(ulfile)
1079 # On a reussia convertir le fichier self.ulfile
1082 # Une erreur a ete rencontree
1084 return ulfile, jdcText
1086 #-------------------------------#
1087 def updateJdc(self, itemApres,texte):
1088 #--------------------------------#
1090 etape=monItem.item.object
1092 CONTEXT.set_current_step(etape)
1093 etape.build_includeInclude(texte)
1094 self.tree.racine.build_children()
1099 #-------------------------------------#
1100 def ajoutVersionCataDsJDC(self,txt):
1101 #-------------------------------------#
1102 if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
1103 ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata[0].VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
1104 texte=txt+ligneVersion
1107 #-------------------------------------#
1108 def verifieVersionCataDuJDC(self,text):
1109 #-------------------------------------#
1111 indexDeb=text.find("#VERSION_CATALOGUE:")
1112 indexFin=text.find(":FIN VERSION_CATALOGUE")
1114 self.versionCataDuJDC="sans"
1117 self.versionCataDuJDC=text[indexDeb+19:indexFin]
1118 textJDC=text[0:indexDeb]+text[indexFin+23:-1]
1120 self.versionCata="sans"
1121 if hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata[0].VERSION_CATALOGUE
1123 if self.versionCata==self.versionCataDuJDC : memeVersion=True
1124 return memeVersion,textJDC
1126 #-------------------------------#
1127 def traduitCatalogue(self,texte):
1128 #-------------------------------#
1129 nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
1130 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
1132 traducteur=__import__(nomTraducteur)
1133 monTraducteur=traducteur.MonTraducteur(texte)
1134 nouveauTexte=monTraducteur.traduit()
1140 #------------------------------#
1141 def verifieCHECKSUM(self,text):
1142 #------------------------------#
1143 indexDeb=text.find("#CHECKSUM:")
1146 indexFin=text.find(":FIN CHECKSUM")
1147 checkAvant=text[indexDeb:indexFin+13]
1148 textJDC=text[0:indexDeb]+text[indexFin+13:-1]
1149 checksum=self.get_checksum(textJDC)
1150 pareil=(checkAvant==checksum)
1151 return pareil, textJDC
1153 #---------------------------#
1154 def get_checksum(self,texte):
1155 #---------------------------#
1156 newtexte=texte.replace('"','\\"')
1157 commande='echo "'+newtexte+'"|md5sum'
1158 a=os.popen(commande)
1161 ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
1165 #---------------------------#
1166 def _newZCRACKS(self):
1167 #---------------------------#
1168 texte="MAILLAGES();REMESHING();"
1171 #---------------------------#
1172 def _newJDCCND(self):
1173 #---------------------------#
1174 extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
1176 #if self.salome == 0 :
1177 QMessageBox.information( self,
1179 tr("Veuillez selectionner un fichier Med"))
1180 QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
1181 caption='Fichier Med',
1183 self.fichierMED=str(QSfichier.toLatin1())
1184 from acquiertGroupes import getGroupes
1185 erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
1186 if erreur != "" : print "a traiter"
1187 texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
1193 for groupe in self.listeGroupes :
1194 if groupe[0:8]=='CURRENT_':
1195 texteSources +=groupe[8:]+"=SOURCE("
1196 texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
1197 if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n"
1198 if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n"
1199 if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n"
1200 if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n"
1201 texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
1202 self.newTexteCND=texte
1207 #---------------------------#
1208 def BoutonFileSelected(self):
1209 #---------------------------#
1211 QSfichier=self.openfile.selectedFiles()[0]
1212 self.fichierMED=str(QSfichier.toLatin1())
1213 from acquiertGroupes import getGroupes
1214 erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
1215 if erreur != "" : print "a traiter"
1217 #-----------------------------
1218 def BoutonSalomePressed(self):
1219 #----------------------------
1220 Msg,self.listeGroupes=self.appliEficas.ChercheGrpMailleInSalome()
1221 self.fichierMED="A_partir_de_SMESH"
1222 self.nomMaillage="A_partir_de_SMESH"
1223 self.openfile.close()
1226 if __name__ == "__main__":
1228 name='prefs_'+prefs.code
1229 prefsCode=__import__(name)
1232 if hasattr(prefsCode,'encoding'):
1233 # Hack pour changer le codage par defaut des strings
1236 sys.setdefaultencoding(prefs.encoding)
1237 del sys.setdefaultencoding
1242 app = QApplication(sys.argv)
1243 mw = JDCEditor(None,'azAster.comm')
1244 app.setMainWidget(mw)
1245 app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
1248 res = app.exec_loop()