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 determine import monEnvQT5
26 from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog, QApplication, QSplitter
27 from PyQt5.QtGui import QPalette
28 from PyQt5.QtCore import QProcess, QFileInfo, QTimer, Qt, QDir, QSize
30 from PyQt4.QtGui import *
31 from PyQt4.QtCore import *
34 from datetime import date
35 from Extensions.i18n import tr
40 import convert, generator
41 from Editeur import session
42 from Editeur import comploader
43 from Editeur import Objecttreeitem
44 from desBaseWidget import Ui_baseWidget
45 from monViewTexte import ViewText
46 from monWidgetCreeParam import MonWidgetCreeParam
50 DictExtensions= {"MAP" : ".map"}
55 class JDCEditor(Ui_baseWidget,QWidget):
56 # ----------------------------------------- #
61 def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None):
62 #----------------------------------------------------------------------------------------------------------#
64 QWidget.__init__(self,None)
68 self.widgetOptionnel=None
69 self.fenetreCentraleAffichee=None
70 self.dejaDansPlieTout=False
71 self.afficheCommandesPliees = True
72 self.listeDesListesOuvertes=set()
73 self.appliEficas = appli
74 self.appli = appli #---- attendu par IHM
76 self.fichier = fichier
79 self.QWParent = QWParent
80 self.couleur = Qt.black
83 self.salome = self.appliEficas.salome
86 print "dans JDC pas d appli ????????"
88 # ces attributs sont mis a jour par definitCode appelee par newEditor
89 self.code = self.appliEficas.CONFIGURATION.code
90 # tres vite a cause du tag. doit etre pase dans CONFIGURATION
92 #self.afficheListesPliees=False
93 self.afficheListesPliees=True
94 if self.code == "ASTER" or self.code == "monCode" : self.afficheListesPliees =True
96 self.mode_nouv_commande=self.appliEficas.CONFIGURATION.mode_nouv_commande
97 self.affiche=self.appliEficas.CONFIGURATION.affiche
98 #if self.code in ['MAP','CARMELCND','PSEN'] : self.afficheCommandesPliees=False
99 if self.code in ['MAP','CARMELCND'] : self.afficheCommandesPliees=False
100 if self.code in ['MAP',] :
101 self.widgetTree.close()
103 self.appliEficas.resize(1440,self.appliEficas.height())
105 self.appliEficas.resize(1800,self.appliEficas.height())
107 self.version_code = session.d_env.cata
109 if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.multi==True:
110 self.readercata = readercata.READERCATA( self, self.appliEficas )
111 self.appliEficas.readercata=self.readercata
113 self.readercata=self.appliEficas.readercata
114 if self.readercata.fic_cata == None : return #Sortie Salome
115 self.titre=self.readercata.titre
116 self.Ordre_Des_Commandes=self.readercata.Ordre_Des_Commandes
117 self.Classement_Commandes_Ds_Arbre=self.readercata.Classement_Commandes_Ds_Arbre
119 self.format = self.appliEficas.format_fichier
122 self.splitterSizes = [320,1320,320]
123 self.oldSizeWidgetOptionnel = 320
124 self.liste_simp_reel=[]
127 nameConf='configuration_'+self.code
128 configuration=__import__(nameConf)
129 self.CONFIGURATION = self.appliEficas.CONFIGURATION
130 self.CONFIGStyle = self.appliEficas.CONFIGStyle
133 self.CONFIGURATION.generator_module
134 _module = __import__(self.CONFIGURATION.generator_module)
135 info = _module.entryPoint()
136 generator.plugins.addEntryPoint(info)
141 self.CONFIGURATION.convert_module
142 print self.CONFIGURATION.convert_module
143 _module = __import__(self.CONFIGURATION.convert_module)
144 info = _module.entryPoint()
145 convert.plugins.addEntryPoint(info)
150 if hasattr(self.appliEficas,"statusBar"):
151 self.sb = self.appliEficas.statusBar()
154 self.lastModified = 0
156 self.modified = False
157 self.isReadOnly = False
158 self.node_selected = []
161 if self.code in ['Adao','MAP'] : self.afficheApresInsert=True
162 else : self.afficheApresInsert=False
163 if self.code in ['TELEMAC',] : self.enteteQTree='premier'
164 else : self.enteteQTree='complet'
165 if self.code in ['Adao','TELEMAC'] : self.affichePlie=True
166 else : self.affichePlie=False
168 self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
170 #------- construction du jdc --------------
175 if self.fichier is not None: # fichier jdc fourni
176 self.fileInfo = QFileInfo(self.fichier)
177 self.fileInfo.setCaching(0)
181 self.jdc = self.readFile(self.fichier)
184 print "mauvaise lecture"
187 if self.jdc is not None and units is not None:
188 self.jdc.recorded_units=units
189 self.jdc.old_recorded_units=units
191 if not self.jdc: # nouveau jdc
193 self.jdc = self._newJDC(units=units)
195 self.jdc = self._newJDCInclude(units=units)
199 self.jdc.appli = self
200 self.jdc.lang = self.appli.langue
201 self.jdc.aReafficher=False
205 txt_exception = self.jdc.cr.get_mess_exception()
208 QApplication.restoreOverrideCursor()
209 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
210 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
212 comploader.charger_composants("QT")
213 jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
214 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
215 self.viewJdcRapport()
219 if jdc_item and self.appliEficas.ssIhm==False:
220 self.tree = browser.JDCTree( jdc_item, self )
221 self.appliEficas.construitMenu()
224 self.splitterSizes = [320,1320,320]
225 self.splitter.setSizes(self.splitterSizes)
226 self.saveSplitterSizes()
229 #-------------------# Pour execution avec output et error dans le bash
231 #-------------------#
232 if self.modified or self.fichier==None : self.saveFile()
234 #lancement avec le .bat
235 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
236 WrapperFilePath = os.path.join(path1, 'PSSEWrapper.py')
238 p = subprocess.Popen(['python',WrapperFilePath])
239 (out,err)=p.communicate()
243 #--------------------------------#
244 def _newJDC( self ,units = None):
245 #--------------------------------#
247 Initialise un nouveau JDC vierge
250 CONTEXT.unset_current_step()
253 if self.code == "CARMELCND" : texte=self._newJDCCND()
254 if self.code == "ZCRACKS" : texte=self._newZCRACKS()
255 if self.code == "TELEMAC" : texte=self._newTELEMAC()
256 if self.code == "PSEN" : texte = self._newPSEN()
257 # texte=self.newTexteCND
259 jdc=self.readercata.cata[0].JdC( procedure =texte,
261 cata=self.readercata.cata,
262 cata_ord_dico=self.readercata.cata_ordonne_dico,
263 rep_mat=self.CONFIGURATION.rep_mat
265 jdc.lang = self.appli.langue
266 if units is not None:
267 jdc.recorded_units=units
268 jdc.old_recorded_units=units
269 ## PNPN est ce que la ligne suivante est bien utile ?
270 if texte == "" :jdc.analyse()
273 #--------------------------------#
274 def _newJDCInclude( self ,units = None):
275 #--------------------------------#
277 Initialise un nouveau JDC vierge
279 import Extensions.jdc_include
280 JdC_aux=Extensions.jdc_include.JdC_include
281 CONTEXT.unset_current_step()
283 jaux=self.readercata.cata[0].JdC( procedure="",
285 cata=self.readercata.cata,
286 cata_ord_dico=self.readercata.cata_ordonne_dico,
287 rep_mat=self.CONFIGURATION.rep_mat,
291 J=JdC_aux( procedure="",
293 cata=self.readercata.cata,
294 cata_ord_dico=self.readercata.cata_ordonne_dico,
296 rep_mat=self.CONFIGURATION.rep_mat,
299 if units is not None:
300 J.recorded_units=units
301 J.old_recorded_units=units
305 #-------------------------------#
306 def readFile(self, fn):
307 #--------------------------------#
309 Public slot to read the text from a file.
310 @param fn filename to read from (string or QString)
314 # ------------------------------------------------------------------------------------
316 # ------------------------------------------------------------------------------------
318 jdcName=os.path.basename(fn)
319 # Il faut convertir le contenu du fichier en fonction du format
320 if convert.plugins.has_key( self.appliEficas.format_fichier_in ):
321 # Le convertisseur existe on l'utilise
323 p=convert.plugins[self.appliEficas.format_fichier_in]()
325 if p.text=="" : self.nouveau=1
326 pareil,texteNew=self.verifieCHECKSUM(p.text)
328 if pareil == False and (self.appliEficas.ssIhm == False) :
329 QMessageBox.warning( self, tr("fichier modifie"),tr("Attention! fichier change hors EFICAS"))
331 memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
332 if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
334 text=p.convert('exec',self.appliEficas)
335 if not p.cr.estvide():
336 self.affiche_infos("Erreur a la conversion",Qt.red)
338 self.affiche_infos("Type de fichier non reconnu",Qt.red)
339 if self.appliEficas.ssIhm == False:
340 QMessageBox.critical( self, tr("Type de fichier non reconnu"),
341 tr("EFICAS ne sait pas ouvrir le type de fichier %s" ,self.appliEficas.format_fichier_in))
344 CONTEXT.unset_current_step()
345 jdc=self.readercata.cata[0].JdC(procedure=text,
347 cata=self.readercata.cata,
348 cata_ord_dico=self.readercata.cata_ordonne_dico,
350 rep_mat=self.CONFIGURATION.rep_mat
352 # ----------------------------------------------------
354 # ----------------------------------------------------
355 self.modified = False
357 # qApp.restoreOverrideCursor()
358 if self.fileInfo!= None :
359 self.lastModified = self.fileInfo.lastModified()
361 self.lastModified = 1
362 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
363 self.appliEficas.setWindowTitle(nouveauTitre)
367 #-----------------------#
368 def get_source(self,file):
369 #-----------------------#
371 # Il faut convertir le contenu du fichier en fonction du format
372 if convert.plugins.has_key(self.format):
373 # Le convertisseur existe on l'utilise
374 p=convert.plugins[self.format]()
376 text=p.convert('execnoparseur')
377 if not p.cr.estvide():
378 self.affiche_infos("Erreur a la conversion",Qt.red)
381 # Il n'existe pas c'est une erreur
382 self.affiche_infos("Type de fichier non reconnu",Qt.red)
383 QMessageBox.critical( self, tr("Type de fichier non reconnu"),tr("EFICAS ne sait pas ouvrir ce type de fichier"))
386 #-----------------------------------------------------------------------#
387 def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
388 #--------------------------------------------------------------------#
389 w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
393 #----------------------------------------------#
394 def __generateTempFilename(self, prefix, suffix):
395 #----------------------------------------------#
397 (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
403 #----------------------------------------------#
404 def _viewTextExecute(self, txt, prefix, suffix):
405 #----------------------------------------------#
406 self.w = ViewText( self.QWParent )
407 self.w.setWindowTitle( "execution" )
408 self.monExe=QProcess(self.w)
409 pid=self.monExe.pid()
410 nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
411 f=open(nomFichier,'w')
415 self.monExe.readyReadStandardOutput.connect( self.readFromStdOut)
416 self.monExe.readyReadStandardError.connect( self.readFromStdErr)
418 self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOutQT4 )
419 self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErrQT4 )
420 exe='sh ' + nomFichier
421 self.monExe.start(exe)
422 self.monExe.closeWriteChannel()
425 commande="rm "+ nomFichier
430 def readFromStdErr(self):
431 a=self.monExe.readAllStandardError()
432 self.w.view.append(str(a.data(),len(a)))
434 def readFromStdErr(self) :
435 a=self.monExe.readAllStandardOutput()
436 self.w.view.append(str(a.data(),len(a)))
438 def readFromStdErrQT4(self):
439 a=self.monExe.readAllStandardError()
440 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
442 def readFromStdOutQT4(self) :
443 a=self.monExe.readAllStandardOutput()
444 self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
448 #-----------------------#
449 def gestionParam(self):
450 #-----------------------#
451 w = MonWidgetCreeParam( self)
454 #-----------------------#
455 def viewJdcSource(self):
456 #-----------------------#
457 f=open(self.fichier,'r')
460 self._viewText(texteSource, "JDC_SOURCE")
462 #-----------------------#
464 #-----------------------#
465 strSource = str( self.get_text_JDC(self.format) )
466 self._viewText(strSource, "JDC_RESULTAT")
468 #-----------------------#
469 def viewJdcRapport(self):
470 #-----------------------#
471 strRapport = unicode( self.jdc.report() )
472 # on ajoute les regles
474 self._viewText(strRapport, "JDC_RAPPORT")
476 #-----------------------#
477 def viewJdcRegles(self):
478 #-----------------------#
479 if self.tree :self.tree.AppelleBuildLBRegles()
486 Public method called by the viewmanager to finally get rid of us.
492 #----------------------------------------------#
493 def affiche_infos(self,message,couleur=Qt.black):
494 #----------------------------------------------#
496 mapalette=self.sb.palette()
497 mapalette.setColor( QPalette.WindowText, couleur )
498 self.sb.setPalette( mapalette );
499 self.sb.showMessage(message,4000)
502 #------------------------------#
503 def affiche_alerte(self,titre,message):
504 #------------------------------#
505 # appele par I_MACRO_ETAPE
506 QMessageBox.information( self, titre, message)
508 #-----------------------------------#
509 def affiche_commentaire(self,message):
510 #-----------------------------------#
511 self.labelCommentaire.setText(message)
512 QTimer.singleShot(6000, self.rendInvisible)
514 #----------------------#
515 def rendInvisible(self):
516 #----------------------#
517 self.labelCommentaire.setText("")
519 #-------------------#
520 def init_modif(self):
521 #-------------------#
523 Met l'attribut modified a 'o' : utilise par Eficas pour savoir
524 si un JDC doit etre sauvegarde avant destruction ou non
528 #---------------------------------------#
529 def chercheNoeudSelectionne(self,copie=1):
530 #---------------------------------------#
532 appele par Cut et Copy pour positionner self.node_selected
534 self.node_selected=[]
535 if len(self.tree.selectedItems()) == 0 : return
536 self.node_selected=self.tree.selectedItems()
539 #---------------------#
540 def handleSupprimer(self):
541 #---------------------#
542 self.chercheNoeudSelectionne()
543 if len(self.node_selected) == 0 : return
544 self.QWParent.noeud_a_editer = []
545 if self.node_selected[0]==self.tree.racine: return
546 if len(self.node_selected) == 1 : self.node_selected[0].delete()
547 else : self.node_selected[0].deleteMultiple(self.node_selected)
549 #---------------------#
550 def handleRechercher(self):
551 #---------------------#
552 from monRecherche import DRecherche
553 monRechercheDialg=DRecherche(parent=self,fl=0)
554 monRechercheDialg.show()
556 #---------------------#
557 def handleDeplier(self):
558 #---------------------#
559 if self.tree == None : return
560 #self.tree.collapseAll()
563 self.tree.expandItem(self.tree.topLevelItem(0))
565 if self.fenetreCentraleAffichee != None :
566 if hasattr(self.fenetreCentraleAffichee.node,'plieToutEtReaffiche'):
567 self.fenetreCentraleAffichee.node.plieToutEtReaffiche()
570 self.tree.expandItem(self.tree.topLevelItem(0))
572 if self.fenetreCentraleAffichee != None :
573 if hasattr(self.fenetreCentraleAffichee.node,'deplieToutEtReaffiche'):
574 self.fenetreCentraleAffichee.node.deplieToutEtReaffiche()
576 #---------------------#
577 def handleEditCut(self):
578 #---------------------#
580 Stocke dans Eficas.noeud_a_editer le noeud a couper
582 #print "handleEditCut"
583 self.chercheNoeudSelectionne()
584 self.QWParent.edit="couper"
585 self.QWParent.noeud_a_editer = self.node_selected
587 #-----------------------#
588 def handleEditCopy(self):
589 #-----------------------#
591 Stocke dans Eficas.noeud_a_editer le noeud a copier
593 self.chercheNoeudSelectionne()
594 if len(self.node_selected) == 0 : return
595 if len(self.node_selected) == 1 : self.node_selected[0].update_node_label_in_blue()
596 else : self.node_selected[0].update_plusieurs_node_label_in_blue(self.node_selected)
597 self.QWParent.edit="copier"
598 self.QWParent.noeud_a_editer = self.node_selected
600 #------------------------#
601 def handleEditPaste(self):
602 #------------------------#
604 Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
605 Ne permet que la copie d'objets de type Commande ou MCF
607 self.chercheNoeudSelectionne()
608 if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
609 QMessageBox.information( self,
610 tr("Copie impossible"),
611 tr("Veuillez selectionner un objet a copier"))
613 if len(self.node_selected) != 1 :
614 QMessageBox.information( self,
615 tr("Copie impossible"),
616 tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
619 if len(self.QWParent.noeud_a_editer)!=1:
620 self.handleEditPasteMultiple()
623 noeudOuColler=self.node_selected[0]
625 if noeudOuColler == self.tree.racine:
629 #indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
630 indexNoeudOuColler=self.getTreeIndex(noeudOuColler)
633 noeudACopier=self.QWParent.noeud_a_editer[0]
634 #indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
635 indexNoeudACopier=self.getTreeIndex(noeudACopier)
637 QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
640 if (self.QWParent.edit != "couper"):
642 if noeudOuColler == self.tree.racine :
643 child=noeudOuColler.doPastePremier(noeudACopier)
645 child=noeudACopier.doPaste(noeudOuColler,pos)
646 if child==None or child==0:
647 QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
649 self.affiche_infos("Copie refusee",Qt.red)
650 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
652 nom=noeudACopier.item.sd.nom
653 child.item.nomme_sd(nom)
660 traceback.print_exc()
661 QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
663 self.affiche_infos("Copie refusee",Qt.red)
666 # il faut declarer le JDCDisplay_courant modifie
667 # suppression eventuelle du noeud selectionne
668 # si possible on renomme l objet comme le noeud couper
670 if (self.QWParent.edit == "couper"):
672 if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
673 QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
677 # indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
678 indexNoeudACopier=self.getTreeIndex(noeudACopier)
679 noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
680 noeudACopier.treeParent.build_children()
685 self.QWParent.noeud_a_editer=[]
687 # on rend la copie a nouveau possible en liberant le flag edit
688 self.QWParent.edit="copier"
689 noeudACopier.select()
691 #----------------------------------#
692 def handleDeplaceMultiple(self):
693 #----------------------------------#
696 #----------------------------------#
697 def handleEditPasteMultiple(self):
698 #----------------------------------#
700 # On ne garde que les niveaux "Etape"
701 # On insere dans l'ordre du JDC
702 listeNoeudsACouper=[]
706 from InterfaceQT4 import compojdc
707 noeudOuColler=self.node_selected[0]
708 if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
709 QMessageBox.information( self,
710 tr("Copie impossible a cet endroit",),
711 tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
713 indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
715 for noeud in self.QWParent.noeud_a_editer :
716 if not (isinstance(noeud.treeParent, compojdc.Node)): continue
717 indexInTree=noeud.treeParent.children.index(noeud)
719 for index in listeIndex:
720 if index < indexInTree : indice = indice +1
721 listeIndex.insert(indice, indexInTree)
722 listeNoeudsACouper.insert(indice, noeud)
724 noeudJdc=noeudOuColler.treeParent
726 # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
728 for index in listeIndex:
730 if indexNoeudOuColler < index:
731 indexTravail=indexTravail+dejaCrees
732 noeudOuColler=noeudJdc.children[indexNoeudOuColler]
733 noeud=noeudJdc.children[indexTravail]
734 child=noeud.doPaste(noeudOuColler)
735 listeChild.append(child)
736 dejaCrees=dejaCrees+1
738 self.QWParent.noeud_a_editer = []
739 for i in range(len(listeIndex)):
740 noeud=noeudJdc.children[indexNoeudOuColler+1+i]
741 self.QWParent.noeud_a_editer.append(noeud)
744 if self.QWParent.edit !="couper" : return
746 for index in listeIndex:
748 if indexNoeudOuColler < index:
749 indexTravail=indexTravail+(len(listeIndex))
750 noeud=noeudJdc.children[indexTravail]
752 listeItem.append(noeud.item)
753 listeASupprimer.append(noeud)
755 for i in range(len(listeChild)):
756 self.tree.item.suppitem(listeItem[i])
757 listeChild[i].item.update(listeItem[i])
759 self.QWParent.noeud_a_editer = []
762 #---------------------#
763 def getFileName(self):
764 #---------------------#
767 #---------------------------#
768 def get_file_variable(self) :
769 #---------------------------#
770 titre = tr("Choix d'un fichier XML")
771 texte = tr("Le fichier contient une commande MODEL\n")
772 texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
773 QMessageBox.information( self, titre,tr(texte))
775 fichier = QFileDialog.getOpenFileName(self.appliEficas,
776 tr('Ouvrir Fichier'),
777 self.appliEficas.CONFIGURATION.savedir,
778 tr('Wrapper Files (*.xml);;''All Files (*)'))
781 #--------------------------------------------------#
782 def writeFile(self, fn, txt = None,formatLigne="beautifie"):
783 #--------------------------------------------------#
785 Public slot to write the text to a file.
787 @param fn filename to write to string
788 @return flag indicating success
794 txt = self.get_text_JDC(self.format,formatLigne=formatLigne)
796 if len(txt) >= len(eol):
797 if txt[-len(eol):] != eol:
801 txt=self.ajoutVersionCataDsJDC(txt)
802 checksum=self.get_checksum(txt)
810 QMessageBox.critical(self, tr('Sauvegarde du Fichier'),
811 tr('Le fichier')+str(fn) + tr('n a pas pu etre sauvegarde : ') + str(why))
814 #-----------------------------------------------------------#
815 def get_text_JDC(self,format,pourRun=0,formatLigne="beautifie"):
816 #-----------------------------------------------------------#
817 if self.code == "MAP" and not(generator.plugins.has_key(format)): format = "MAP"
818 if generator.plugins.has_key(format):
820 # Le generateur existe on l'utilise
821 self.generator=generator.plugins[format]()
823 jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.CONFIGURATION)
824 if pourRun : jdc_formate=self.generator.textePourRun
826 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
827 if not self.generator.cr.estvide():
828 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
829 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
834 # Il n'existe pas c'est une erreur
835 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
836 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
842 fonction="run"+self.code
843 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
848 fonction="saveRun"+self.code
849 if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
855 if not(self.jdc.isvalid()):
856 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
858 if len(self.jdc.etapes) != 1 :
859 QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
861 if self.modified or self.fichier==None :
862 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
863 texte=self.get_text_JDC("MAP")
864 self.writeFile( self.fichierMapInput, txt = texte)
866 self.fichierMapInput=self.fichier
867 composant=self.jdc.etapes[0].nom.lower()[0:-5]
870 # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
871 # then instantiate corresponding class and call getUseSalome() method
873 from mapengine.spec import factory
874 mapComponent = factory.new(composant)[0]
877 if mapComponent.getUseSalome():
878 command += " -r sappli"
879 textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
882 self._viewTextExecute( textePython,"map_run",".sh")
884 # commande="rm "+self.fichierMapInput
885 # os.system(commande)
889 print traceback.print_exc()
891 #-------------------#
892 def runZCRACKS(self):
893 #-------------------#
894 if not(self.jdc.isvalid()):
895 QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
897 if self.modified or self.fichier==None :
899 self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
900 texte=self.get_text_JDC("ZCRACKS",pourRun=1)
901 self.writeFile( self.fichierZcracksInput, txt = texte)
903 self.fichierZcracksInput=self.fichier
905 #commande ="Zrun -zp "
907 textePython=(commande + self.fichierZcracksInput)
908 self._viewTextExecute( textePython,"run_zcracks",".sh")
910 print traceback.print_exc()
912 #-------------------#
913 def runCARMELCND(self):
914 #-------------------#
915 #if not(self.jdc.isvalid()):
916 # QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
918 if self.modified or self.fichier==None :
919 QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
921 if not hasattr(self,'generator'): texte=self.get_text_JDC(self.format)
922 from PrepareRunCarmel import prepareRunCarmel
923 fichierGenerique=os.path.basename(self.fichier).split(".")[0]
924 repMed=os.path.dirname(self.fichier)
925 repExeCarmel=self.generator.get_repExeCarmel()
926 textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
927 nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
928 f=open(nomFichier,'w')
931 commande="xterm -e sh "+nomFichier +"\n"
934 # self._viewTextExecute( textePython,"carmel_run",".sh")
935 #except Exception, e:
936 # print traceback.print_exc()
938 #-------------------#
939 def runCarmelCS(self):
940 #-------------------#
942 commande="runSession pilotyacsCS.py"
945 print traceback.print_exc()
947 #-----------------------------------------------------#
948 def determineNomFichier(self,path,extension):
949 #-----------------------------------------------------#
950 if DictExtensions.has_key(self.appli.code) :
951 chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
952 extensions= tr(chaine1+ "All Files (*)")
954 extensions= tr("JDC (*.comm);;" "All Files (*)")
956 if self.appli.code == "MAP" :
957 extensions = extensions + ";; Run (*.input);;"
959 fn = QFileDialog.getSaveFileName( self,
960 tr("sauvegarde"), path,
962 QFileDialog.DontConfirmOverwrite)
963 if fn == None : return (0, None)
964 if monEnvQT5 : fn=fn[0]
965 if fn=='': return (0, None)
967 ext = QFileInfo(fn).suffix()
968 if ext == '': fn+=extension
970 if QFileInfo(fn).exists():
972 msgBox = QMessageBox(self)
973 msgBox.setWindowTitle(tr("Sauvegarde du Fichier"))
974 msgBox.setText(tr("Le fichier <b>%s</b> existe deja.", unicode(fn)))
975 msgBox.addButton(tr("&Ecraser"),0)
976 msgBox.addButton(tr("&Abandonner"),1)
979 abort = QMessageBox.warning(self,
980 tr("Sauvegarde du Fichier"),
981 tr("Le fichier <b>%s</b> existe deja.",str(fn)),
984 if abort == 1 : return (0, "")
988 def saveRunMAP(self):
991 if not(self.jdc.isvalid()):
992 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
993 tr("Un JdC valide est necessaire pour creer un .input")
997 composant=self.jdc.etapes[0].nom.lower()[0:-5]
999 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
1000 tr("Choix du composant obligatoire")
1003 if hasattr(self.CONFIGURATION, "savedir"): path=self.CONFIGURATION.savedir
1007 if self.fichier is not None and self.fichier != "" :
1008 maBase=str(QFileInfo(self.fichier).baseName())+".input"
1009 monPath=str(QFileInfo(self.fichier).absolutePath())
1010 monNomFichier=os.path.join(monPath,maBase)
1011 elif hasattr(self,'monNomFichierInput'):
1012 monNomFichier=self.monNomFichierInput
1015 monDialog=QFileDialog(self.appliEficas)
1016 monDialog.setDirectory (path)
1017 monDialog.setWindowTitle ("Save")
1019 for c in monDialog.children():
1020 if isinstance(c,QDialogButtonBox):
1021 for b in c.children():
1022 if isinstance(b,QPushButton):
1024 if (not monEnvQT5) and avant.toLatin1()=="&Open": b.setText("Save")
1025 if monEnvQT5 and avant=="&Open": b.setText("Save")
1027 mesFiltres= "input Map (*.input);;All Files (*)"
1029 mesFiltres=QStringList()
1030 mesFiltres << "input Map (*.input)" << "All Files (*)"
1031 monDialog.setNameFilters(mesFiltres)
1032 if monNomFichier!="" : monDialog.selectFile(monNomFichier)
1033 BOk=monDialog.exec_()
1035 if monEnvQT5 : fn=str(monDialog.selectedFiles()[0])
1036 else : fn=str(monDialog.selectedFiles()[0].toLatin1())
1037 if fn == "" or fn == None : return
1038 if not fn.endswith(".input"):
1040 self.monNomFichierInput=fn
1042 if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
1043 self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
1044 texte=self.get_text_JDC("MAP")
1045 self.writeFile( self.fichierMapInput, txt = texte)
1047 cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
1048 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
1049 (output, err) = p.communicate()
1053 def saveRunPSEN(self):
1058 if not(self.jdc.isvalid()):
1059 QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
1060 tr("Un JdC valide est necessaire pour creer un .input")
1064 print generator.plugins.has_key(self.format)
1065 if generator.plugins.has_key(self.format):
1066 # Le generateur existe on l'utilise
1067 self.generator=generator.plugins[self.format]()
1069 self.generator.gener(self.jdc)
1070 self.generator.writeDefault('')
1071 except ValueError,e:
1072 QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
1073 if not self.generator.cr.estvide():
1074 self.affiche_infos(tr("Erreur a la generation"),Qt.red)
1075 QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
1078 # Il n'existe pas c'est une erreur
1079 self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
1080 QMessageBox.critical( self, "Format non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
1087 #-----------------------------------------#
1088 def cherche_Groupes(self):
1089 #-----------------------------------------#
1090 listeMA,listeNO=self.get_text_JDC("GroupMA")
1091 return listeMA,listeNO
1093 #-----------------------------------------#
1094 def cherche_Dico(self):
1095 #-----------------------------------------#
1097 format = self.appliEficas.format_fichier
1098 if generator.plugins.has_key(format):
1099 # Le generateur existe on l'utilise
1100 self.generator=generator.plugins[format]()
1101 jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
1102 dicoCourant=self.generator.dico
1107 #-----------------------------------------#
1108 def handleAjoutGroup(self,listeGroup):
1109 #-----------------------------------------#
1112 from ajoutGroupe import handleAjoutGroupFiltre
1114 handleAjoutGroupFiltre(self,listeGroup)
1115 #print "apres handleAjoutGroupFiltre"
1120 #-----------------------------------------------------------------#
1121 def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"):
1122 #-----------------------------------------------------------------#
1124 Public slot to save the text to a file.
1126 @param path directory to save the file in (string or QString)
1127 @return tuple of two values (boolean, string) giving a success indicator and
1128 the name of the saved file
1132 if not self.modified and not saveas:
1133 return (0, None) # do nothing if text wasn't changed
1136 if DictExtensions.has_key(self.appli.code) :
1137 extension=DictExtensions[self.appli.code]
1143 if self.fichier is None or saveas:
1144 if path is None: path=self.CONFIGURATION.savedir
1145 bOK, fn=self.determineNomFichier(path,extension)
1146 if bOK == 0 : return (0, None)
1147 if fn == None : return (0, None)
1148 if fn== '' : return (0, None)
1150 ulfile = os.path.abspath(unicode(fn))
1151 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1152 fn = unicode(QDir.toNativeSeparators(fn))
1156 if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None)
1158 self.modified = False
1159 if self.fileInfo is None or saveas:
1160 self.fileInfo = QFileInfo(self.fichier)
1161 self.fileInfo.setCaching(0)
1162 self.lastModified = self.fileInfo.lastModified()
1163 if newName is not None:
1164 self.appliEficas.addToRecentList(newName)
1165 self.tree.racine.item.getObject().nom=os.path.basename(newName)
1166 self.tree.racine.update_node_label()
1168 if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
1169 self.generator.writeDefault(fn)
1170 if self.code=="TELEMAC" and hasattr(self.generator, "writeDefault"):
1171 self.generator.writeDefault(fn)
1174 self.appliEficas.addJdcInSalome( self.fichier)
1176 nouveauTitre=self.titre+" "+str(os.path.basename(self.fichier))
1177 self.appliEficas.setWindowTitle(nouveauTitre)
1179 return (1, self.fichier)
1182 #----------------------------------------------#
1183 def sauveLigneFile(self):
1184 #----------------------------------------------#
1186 return self.saveFile(formatLigne="Ligne")
1189 #----------------------------------------------#
1190 def saveFileAs(self, path = None,fileName=None):
1191 #----------------------------------------------#
1193 Public slot to save a file with a new name.
1195 @param path directory to save the file in (string or QString)
1196 @return tuple of two values (boolean, string) giving a success indicator and
1197 the name of the saved file
1199 if fileName != None :
1200 self.fichier = fileName
1201 return self.saveFile()
1202 return self.saveFile(path,1,"beautifie")
1206 #---------------------------------------------#
1207 def get_file(self,unite=None,fic_origine = ''):
1208 #---------------------------------------------#
1216 titre = tr("Choix unite %d ", unite)
1217 texte = tr("Le fichier %s contient une commande INCLUDE \n", str(fic_origine)) +"\n"
1218 texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
1219 labeltexte = tr('Fichier pour unite ') + repr( unite)
1221 titre = tr("Choix d'un fichier de poursuite")
1222 texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
1223 texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
1225 QMessageBox.information( self, titre,texte)
1226 fn = QFileDialog.getOpenFileName(self.appliEficas,
1228 self.appliEficas.CONFIGURATION.savedir)
1230 # ce retour est impose par le get_file d'I_JDC
1231 if fn== '' : return None," "
1232 if not fn : return (0, " ")
1233 if monEnvQT5 : fn=fn[0]
1235 ulfile = os.path.abspath(unicode(fn))
1236 self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1238 # On utilise le convertisseur defini par format_fichier
1239 source=self.get_source(ulfile)
1241 # On a reussia convertir le fichier self.ulfile
1244 # Une erreur a ete rencontree
1246 return ulfile, jdcText
1248 #-------------------------------#
1249 def updateJdc(self, itemApres,texte):
1250 #--------------------------------#
1252 etape=monItem.item.object
1254 CONTEXT.set_current_step(etape)
1255 etape.build_includeInclude(texte)
1256 self.tree.racine.build_children()
1261 #-------------------------------------#
1262 def ajoutVersionCataDsJDC(self,txt):
1263 #-------------------------------------#
1264 if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
1265 ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata[0].VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
1266 texte=txt+ligneVersion
1269 #-------------------------------------#
1270 def verifieVersionCataDuJDC(self,text):
1271 #-------------------------------------#
1273 indexDeb=text.find("#VERSION_CATALOGUE:")
1274 indexFin=text.find(":FIN VERSION_CATALOGUE")
1276 self.versionCataDuJDC="sans"
1279 self.versionCataDuJDC=text[indexDeb+19:indexFin]
1280 textJDC=text[0:indexDeb]+text[indexFin+23:-1]
1282 self.versionCata="sans"
1283 if hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata[0].VERSION_CATALOGUE
1285 if self.versionCata==self.versionCataDuJDC : memeVersion=True
1286 return memeVersion,textJDC
1288 #-------------------------------#
1289 def traduitCatalogue(self,texte):
1290 #-------------------------------#
1291 nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
1292 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
1294 traducteur=__import__(nomTraducteur)
1295 monTraducteur=traducteur.MonTraducteur(texte)
1296 nouveauTexte=monTraducteur.traduit()
1302 #------------------------------#
1303 def verifieCHECKSUM(self,text):
1304 #------------------------------#
1305 indexDeb=text.find("#CHECKSUM:")
1308 indexFin=text.find(":FIN CHECKSUM")
1309 checkAvant=text[indexDeb:indexFin+13]
1310 textJDC=text[0:indexDeb]+text[indexFin+13:-1]
1311 checksum=self.get_checksum(textJDC)
1312 pareil=(checkAvant==checksum)
1313 return pareil, textJDC
1315 #---------------------------#
1316 def get_checksum(self,texte):
1317 #---------------------------#
1318 newtexte=texte.replace('"','\\"')
1319 commande='echo "'+newtexte+'"|md5sum'
1320 a=os.popen(commande)
1323 ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
1327 #---------------------------#
1328 def _newTELEMAC(self):
1329 #---------------------------#
1330 texte="INITIALIZATION();BOUNDARY_CONDITIONS();GENERAL_PARAMETERS();PHYSICAL_PARAMETERS();NUMERICAL_PARAMETERS();"
1334 #---------------------------#
1336 #---------------------------#
1337 texte="DIRECTORY() ; PSSE_PARAMETERS() ; SIMULATION() ; sansnom=DISTRIBUTION() ; sansnom=DISTRIBUTION() ; CORRELATION() ;"
1341 #---------------------------#
1343 #---------------------------#
1344 def _newZCRACKS(self):
1345 #---------------------------#
1346 texte="MAILLAGES();REMESHING();"
1349 #---------------------------#
1350 def _newJDCCND(self):
1351 #---------------------------#
1352 extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
1354 #if self.salome == 0 :
1355 QMessageBox.information( self,
1357 tr("Veuillez selectionner un fichier Med"))
1358 QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
1359 caption='Fichier Med',
1361 if monEnvQT5 : QSfichier=QSfichier[0]
1362 self.fichierMED=QSfichier
1363 from acquiertGroupes import getGroupes
1364 erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
1365 if erreur != "" : print "a traiter"
1366 texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
1372 for groupe in self.listeGroupes :
1373 if groupe[0:8]=='CURRENT_':
1374 texteSources +=groupe[8:]+"=SOURCE("
1375 texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
1376 if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n"
1377 if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n"
1378 if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n"
1379 if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n"
1380 texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
1381 self.newTexteCND=texte
1386 #---------------------------#
1387 def BoutonFileSelected(self):
1388 #---------------------------#
1390 QSfichier=self.openfile.selectedFiles()[0]
1391 self.fichierMED=str(QSfichier)
1392 from acquiertGroupes import getGroupes
1393 erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
1394 if erreur != "" : print "a traiter"
1396 #-----------------------------
1397 def BoutonSalomePressed(self):
1398 #----------------------------
1399 Msg,self.listeGroupes=self.appliEficas.ChercheGrpMailleInSalome()
1400 self.fichierMED="A_partir_de_SMESH"
1401 self.nomMaillage="A_partir_de_SMESH"
1402 self.openfile.close()
1404 #-------------------------------------
1405 def saveSplitterSizes(self,event=None):
1406 #------------------------------------
1407 if self.inhibeSplitter : return
1408 if not hasattr(self,'splitter') : return
1409 if self.splitterSizes[2] != 0 : self.oldSizeWidgetOptionnel = self.splitterSizes[2]
1410 #print self.splitterSizes
1411 #print self.splitter.sizes()
1412 # PNPNPNPN parfoir self.splitter.sizes() a une longueur de 4...
1413 nbAGarder=len(self.splitter.sizes())
1414 if nbAGarder > 3 : nbAGarder=3
1415 for i in range(nbAGarder):
1416 self.splitterSizes[i] = self.splitter.sizes()[i]
1417 self.splitter.widget(i).resizeEvent=self.saveSplitterSizes
1418 #print self.splitter.sizes()
1421 #-----------------------------------------
1422 def restoreSplitterSizes(self,nbWigdet=3):
1423 #----------------------------------------
1424 self.inhibeSplitter = 1
1426 if not(hasattr(self,'splitter')) : return
1427 newSizes=self.splitterSizes[:nbWigdet]
1428 self.splitter.setSizes(newSizes)
1429 self.inhibeSplitter = 0
1431 #------------------------
1432 def fermeOptionnel(self):
1433 #------------------------
1434 if self.widgetOptionnel == None : return
1436 self.inhibeSplitter=1
1437 self.splitterSizes[1] = self.splitterSizes[1] + self.splitterSizes[2]
1438 if self.splitterSizes[2]!=0 : self.oldSizeWidgetOptionnel = self.splitterSizes[2]
1439 self.splitterSizes[2]=0
1441 self.widgetOptionnel.setParent(None)
1442 self.widgetOptionnel.close()
1443 self.widgetOptionnel.deleteLater()
1444 self.widgetOptionnel=None
1445 self.inhibeSplitter=0
1446 self.restoreSplitterSizes(2)
1448 #------------------------
1449 def ajoutOptionnel(self):
1450 #------------------------
1451 #print "ajoutOptionnel"
1452 #print self.splitterSizes
1453 self.splitterSizes[2] = self.oldSizeWidgetOptionnel
1454 self.splitterSizes[1] = self.splitterSizes[1] - self.splitterSizes[2]
1455 self.inhibeSplitter=0
1456 self.restoreSplitterSizes(3)
1459 #-----------------------------
1460 def getTreeIndex(self,noeud):
1461 #----------------------------
1463 if noeud in noeud.treeParent.children :
1464 indexNoeud=noeud.treeParent.children.index(noeud)
1466 if hasattr(noeud,'vraiParent') :
1468 noeudVraiParent = noeud.vraiParent
1469 while noeudVraiParent != noeud.treeParent and hasattr(noeudVraiParent,'vraiParent') :
1470 noeudVrai = noeudVraiParent
1471 noeudVraiParent = noeudVraiParent.vraiParent
1473 if noeudVraiParent == noeud.treeParent :
1474 indexNoeud=noeud.treeParent.children.index(noeudVrai)
1480 if __name__ == "__main__":
1482 name='prefs_'+prefs.code
1483 prefsCode=__import__(name)
1486 if hasattr(prefsCode,'encoding'):
1487 # Hack pour changer le codage par defaut des strings
1490 sys.setdefaultencoding(prefs.encoding)
1491 del sys.setdefaultencoding
1496 app = QApplication(sys.argv)
1497 mw = JDCEditor(None,'azAster.comm')
1498 app.setMainWidget(mw)
1499 app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
1502 res = app.exec_loop()