From 1d010ff4e7d10301413f4760ae487291fcb2b2ca Mon Sep 17 00:00:00 2001 From: "pascale.noyret" Date: Thu, 19 Mar 2015 18:16:17 +0100 Subject: [PATCH] version 19 mars --- InterfaceQT4/browser.py | 254 ++++++++++++++---- InterfaceQT4/editor.py | 66 +++-- InterfaceQT4/groupe.py | 13 +- InterfaceQT4/monChoixCommande.py | 22 +- InterfaceQT4/monWidgetCommande.py | 36 +-- InterfaceQT4/monWidgetPlusieursBase.py | 4 +- InterfaceQT4/qtEficas.py | 10 + InterfaceQT4/readercata.py | 41 +++ InterfaceQT4/viewManager.py | 18 ++ Telemac/Telemac_Cata.py | 344 +++++++++++++++++++------ convert/convert_TELEMAC.py | 128 +++++++++ convert/enumTelemac.py | 11 + convert/parseur_cas.py | 342 ++++++++++++++++++++++++ generator/Formatage.py | 25 ++ 14 files changed, 1125 insertions(+), 189 deletions(-) create mode 100644 convert/convert_TELEMAC.py create mode 100644 convert/enumTelemac.py create mode 100644 convert/parseur_cas.py diff --git a/InterfaceQT4/browser.py b/InterfaceQT4/browser.py index c9abd739..e983a591 100644 --- a/InterfaceQT4/browser.py +++ b/InterfaceQT4/browser.py @@ -31,11 +31,16 @@ from monChoixCommande import MonChoixCommande class JDCTree( QTreeWidget ): def __init__( self, jdc_item, QWParent): #if hasattr(QWParent,'widgetTree') : - if QWParent.widgetTree !=None : - QTreeWidget.__init__(self, QWParent.widgetTree ) - QWParent.verticalLayout_2.addWidget(self) - self.headerItem().setText(0, "Commande ") - self.headerItem().setText(1, "Concept/Valeur") + self.editor = QWParent + self.plie=False + if self.editor.widgetTree !=None : + QTreeWidget.__init__(self, self.editor.widgetTree ) + self.editor.verticalLayout_2.addWidget(self) + if self.editor.enteteQTree=='complet': + self.headerItem().setText(0, "Commande ") + self.headerItem().setText(1, "Concept/Valeur") + else : + self.headerItem().setText(0, "Commande ") self.setColumnWidth(0,200) self.setExpandsOnDoubleClick(False) self.setSelectionMode(3) @@ -43,7 +48,6 @@ class JDCTree( QTreeWidget ): QTreeWidget.__init__(self, None ) self.item = jdc_item self.tree = self - self.editor = QWParent self.appliEficas = self.editor.appliEficas self.childrenComplete=[] self.childrenIssusDesBlocs=[] @@ -52,14 +56,18 @@ class JDCTree( QTreeWidget ): self.itemCourrant=None self.connect(self, SIGNAL("itemClicked ( QTreeWidgetItem * ,int) "), self.handleOnItem) - #self.connect(self, SIGNAL("itemDoubleClicked ( QTreeWidgetItem * ,int) "), self.handleDoubleClickedOnItem) + self.connect(self, SIGNAL("itemCollapsed ( QTreeWidgetItem *) "), self.handleCollapsedItem) + self.connect(self, SIGNAL("itemExpanded ( QTreeWidgetItem *) "), self.handleExpandedItem) #PNPNPN verifier dans quel cas on se trouve : affiche l arbre ou la commande self.node_selected=self.racine + self.inhibeExpand=True self.expandItem(self.racine) + self.inhibeExpand=False + #print "self.editor.afficheCommandesPliees", self.editor.afficheCommandesPliees if self.racine.children !=[] : - self.racine.children[0].affichePanneau() if self.editor.afficheCommandesPliees : self.racine.children[0].plieToutEtReaffiche() + else : self.racine.children[0].deplieToutEtReaffiche() else : self.racine.affichePanneau() @@ -88,10 +96,57 @@ class JDCTree( QTreeWidget ): item.menu.exec_(coord) + def handleCollapsedItem(self,item): + print "dans CollapsedItem", self.inhibeExpand + if self.inhibeExpand == True : return + #print "apres if" + #print "item = ", item, item.item.get_nom() + #itemParent=item + #while not (hasattr (itemParent,'getPanel2')) : + # print "While itemParent = ", itemParent, itemParent.item.get_nom() + # print itemParent.plie + # if itemParent.plie==True : itemParent.setPlie() + # itemParent=itemParent.treeParent + #if self.tree.node_selected != self : + # item.setExpanded(False) + # return + item.setPlie() + #print "apres 2ndif" + item.plieToutEtReaffiche() + + def handleExpandedItem(self,item): + #print "dans ExpandItem", self.inhibeExpand + if self.inhibeExpand == True : return + #print "apres if" + itemParent=item + while not (hasattr (itemParent,'getPanel2')) : + if itemParent.plie==True : itemParent.setDeplie() + itemParent=itemParent.treeParent + #print "apres if" + if self.tree.node_selected != itemParent : + item.setExpanded(True) + #print "je suis la" + return + item.deplieToutEtReaffiche() + def handleOnItem(self,item,int): - if (len(self.selectedIndexes())!=2): return + #if (len(self.selectedIndexes())!=2): return + print "je passe dans handleOnItem" + self.inhibeExpand == True self.itemCourrant=item - self.handleDoubleClickedOnItem(item,int) + itemParent=item + #print self.itemCourrant + while not (hasattr (itemParent,'getPanel2')) : + if itemParent.plie==True : itemParent.setDeplie() + itemParent=itemParent.treeParent + #print itemParent + #print itemParent.fenetre + #print self.editor.afficheCommandesPliees + if itemParent.fenetre != self.editor.fenetreCentraleAffichee : + #print self.editor.afficheCommandesPliees + if self.editor.afficheCommandesPliees : itemParent.plieToutEtReaffiche() + else : itemParent.affichePanneau() + if itemParent!=item : item.fenetre.rendVisible() #try : if 1: fr = item.item.get_fr() @@ -99,13 +154,9 @@ class JDCTree( QTreeWidget ): #except: else : pass + self.inhibeExpand == False + #print "je mets inhibeExpand a false handleOnItem" - def handleDoubleClickedOnItem(self,item,int): - itemParent=item - while not (hasattr (itemParent,'getPanel2')) : itemParent=item.treeParent - itemParent.affichePanneau() - if itemParent!=item: - item.fenetre.rendVisible() def choisitPremier(self,name): self.editor.layoutJDCCHOIX.removeWidget(self.racine.fenetre) @@ -118,7 +169,7 @@ PARAMETERS = "PARAMETRE" class JDCNode(QTreeWidgetItem): def __init__( self, treeParent, item): - #print "creation d'un noeud : ", item, " ",item.nom,"", treeParent + #print "creation d'un noeud : ", item, " ",item.nom,"", treeParent, self self.a=0 self.item = item self.vraiParent = treeParent @@ -137,7 +188,18 @@ class JDCNode(QTreeWidgetItem): value = self.appliEficas.trUtf8(str( item.GetText() ) ) mesColonnes=QStringList() - mesColonnes << name << value + if self.editor.enteteQTree=='complet': mesColonnes << name << value + else : mesColonnes << name + + if self.treeParent.plie==True : + self.plie = True + self.appartientAUnNoeudPlie=True + else : + self.plie = False + self.appartientAUnNoeudPlie = False + #print "self.plie", self.plie + #print "self.appartientAUnNoeudPlie", self.appartientAUnNoeudPlie + #print self.treeParent ajoutAuParentduNoeud=0 from InterfaceQT4 import compobloc @@ -206,7 +268,12 @@ class JDCNode(QTreeWidgetItem): nouvelItem=item.itemNode(self,item) self.children.append(nouvelItem) #print " J ajoute ", nouvelItem ,nouvelItem.item.GetLabelText(),"dans" ,self.item.GetLabelText() - if ind in listeExpanded : nouvelItem.setExpanded(1) + #if ind in listeExpanded : nouvelItem.setExpanded(1) + + #if ind in listeExpanded : print "plie=0" + #else : print "plie=1" + #if ind in listeExpanded : nouvelItem.plie=0 + #else : nouvelItem.plie=1 ind=ind+1 #print "*********** fin build_children ",self.item, self.item.GetLabelText() @@ -217,20 +284,31 @@ class JDCNode(QTreeWidgetItem): return None def affichePanneau(self) : - #print "______________________________" - #print "dans affichePanneau appel getPanel2", self.item.GetLabelText() - - if self.item.isactif(): self.fenetre=self.getPanel2() + print "dans affichePanneau appel getPanel2", self.item.GetLabelText() + if self.item.isactif(): + itemParent=self + while not (hasattr (itemParent,'getPanel2')) : + itemParent=itemParent.treeParent + if itemParent!=self : + itemParent.affichePanneau() + return + self.fenetre=self.getPanel2() else: from monInactifPanel import PanelInactif self.fenetre = PanelInactif(self,self.editor) + self.editor.widgetCentraleLayout.addWidget(self.fenetre) + print "widgetCentraleLayout = ", self.editor.widgetCentraleLayout + print "nouvelle fenetre ", self.fenetre, " associee a ", self self.editor.anciennefenetre=self.editor.fenetreCentraleAffichee + #print "ancienne fenetre ", self.editor.anciennefenetre self.editor.fenetreCentraleAffichee=self.fenetre + self.tree.node_selected= self if self.editor.anciennefenetre != None : - self.editor.anciennefenetre.close() + a=self.editor.anciennefenetre.close() + #print "je ferme ", self.editor.anciennefenetre if self.editor.widgetTree !=None : index=1 else : index=0 @@ -238,8 +316,10 @@ class JDCNode(QTreeWidgetItem): if self.editor.first : self.editor.splitter.setSizes((400,1400,400)) if not(isinstance(self.fenetre,MonChoixCommande)): self.editor.first=False + self.tree.inhibeExpand=True self.tree.expandItem(self) self.select() + self.tree.inhibeExpand=False #print "fin de affichePanneau" #print "______________________________" @@ -311,7 +391,7 @@ class JDCNode(QTreeWidgetItem): for item in self.tree.selectedItems() : item.setSelected(0) self.setSelected( True ) - self.setExpanded( True ) + #self.setExpanded( True ) self.tree.setCurrentItem( self ) self.tree.node_selected= self @@ -319,32 +399,29 @@ class JDCNode(QTreeWidgetItem): # Methodes de creation et destruction de noeuds # Certaines de ces methodes peuvent etre appelees depuis l'externe #------------------------------------------------------------------ - def append_brother(self,name,pos='after'): + def append_brother(self,name,pos='after',plier=False): """ Permet d'ajouter un objet frere a l'objet associe au noeud self par defaut on l'ajoute immediatement apres Methode externe """ - #print "*********** append_brother ", self.item.GetLabelText() self.editor.init_modif() index = self.treeParent.children.index(self) - if pos == 'before': - index = index - elif pos == 'after': - index = index +1 + if pos == 'before': index = index + elif pos == 'after': index = index +1 else: print unicode(pos), tr(" n'est pas un index valide pour append_brother") return 0 - return self.treeParent.append_child(name,pos=index) + return self.treeParent.append_child(name,pos=index,plier=plier) - def append_child(self,name,pos=None): + def append_child(self,name,pos=None,plier=False): """ Methode pour ajouter un objet fils a l'objet associe au noeud self. On peut l'ajouter en debut de liste (pos='first'), en fin (pos='last') ou en position intermediaire. Si pos vaut None, on le place a la position du catalogue. """ - print "************** append_child ",self.item.GetLabelText() + print "************** append_child ",self.item.GetLabelText(), plier self.editor.init_modif() if pos == 'first': index = 0 @@ -360,24 +437,36 @@ class JDCNode(QTreeWidgetItem): index = self.item.get_index_child(name.nom) else: index = self.item.get_index_child(name) + self.tree.inhibeExpand=True obj=self.item.additem(name,index) #CS_pbruno emet le signal 'add' if obj is None:obj=0 if obj == 0:return 0 - try : - old_obj = self.item.object.get_child(name.nom,restreint = 'oui') - child=old_obj[-1] - child.affichePanneau() - print "dans le 1er Try" + #try : + # old_obj = self.item.object.get_child(name.nom,restreint = 'oui') + # child=old_obj[-1] + # if plier : child.plieToutEtReaffiche() + # else : child.affichePanneau() + # print "dans le 1er Try" #else : - except: + #except: # Souci pour gerer les copies des AFFE d'une commande à l autre - try : - child=self.children[index] - child.affichePanneau() - print "dans le 2nd Try" - except : - child=self.children[index] - print "dans le except" + # try : + # child=self.children[index] + # if plier == True : child.setPlie() + # else : child.setDeplie() + # print "dans le 2nd Try" + # except : + # child=self.children[index] + # print "dans le except" + try : + #if 1: + child=self.children[index] + if plier == True : child.setPlie() + else : child.setDeplie() + except : + child=self.children[index] + print "dans le except" + self.tree.inhibeExpand=False return child def deplace(self): @@ -606,7 +695,9 @@ class JDCNode(QTreeWidgetItem): child = self.append_child(objet,pos='first') return child + def plieToutEtReaffiche(self): + print "je suis dans plieToutEtReaffiche", self.item.get_nom() self.editor.deplier = False for item in self.children : item.setPlie() @@ -619,22 +710,73 @@ class JDCNode(QTreeWidgetItem): self.affichePanneau() def setPlie(self): - self.plie=True + #print "je mets inhibeExpand a true dans setPlie" + print "je suis dans plieTout", self.item.get_nom() + self.tree.inhibeExpand=True + self.tree.collapseItem(self) self.setPlieChildren() + # on ne plie pas au niveau 1 + #from InterfaceQT4 import compojdc + #if not(isinstance(self.treeParent,compojdc.Node)) : + # self.plie=True + #else : + # self.plie=False + # for item in self.children : + # item.appartientAUnNoeudPlie=False + #self.tree.inhibeExpand=False + #print "je mets inhibeExpand a false dans setPlie" + def setPlieChildren(self): - self.appartientAUnNoeudPlie=True - for item in self.children : - item.setPlieChildren() + self.plie=True + for c in self.children : + c.setPlieChildren() + print "dans setPlieChildren appartientAUnNoeudPlie=True ", c, c.item.GetLabelText()[0] + c.appartientAUnNoeudPlie=True + c.plie=True + c.setExpanded(True) + def setDeplie(self): + #print "je mets inhibeExpand a true dans setDeplie" + self.tree.inhibeExpand=True self.plie=False + self.tree.expandItem(self) self.setDeplieChildren() + self.tree.inhibeExpand=False + print "je mets inhibeExpand a false dans setDePlie" def setDeplieChildren(self): - self.appartientAUnNoeudPlie=False - for item in self.children : - item.setDeplieChildren() - - + print "dans setDeplieChildren appartientAUnNoeudPlie=False ", self.item.GetLabelText() + for c in self.children : + c.setDeplieChildren() + print "dans setDeplieChildren appartientAUnNoeudPlie=False ", c.item.GetLabelText() + c.appartientAUnNoeudPlie=False + c.setExpanded(True) + c.plie=False + def selectAvant(self): + i=self.item.jdc.etapes.index(self.item.object) + try : + cherche=self.item.jdc.etapes[i-1] + except : + cherche=self.item.jdc.etapes[-1] + node=None + for i in self.tree.racine.children : + if i.item.object== cherche : + node=i + break + if node : node.affichePanneau() + + def selectApres(self): + i=self.item.jdc.etapes.index(self.item.object) + try : + cherche=self.item.jdc.etapes[i+1] + except : + cherche=self.item.jdc.etapes[0] + node=None + for i in self.tree.racine.children : + if i.item.object== cherche : + node=i + break + if node : node.affichePanneau() diff --git a/InterfaceQT4/editor.py b/InterfaceQT4/editor.py index 7347ce8a..f37b1fa2 100644 --- a/InterfaceQT4/editor.py +++ b/InterfaceQT4/editor.py @@ -53,12 +53,13 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None): #----------------------------------------------------------------------------------------------------------# + self.a=0 QtGui.QWidget.__init__(self,None) self.setupUi(self) self.monOptionnel=None self.fenetreCentraleAffichee=None self.dejaDansPlieTout=False - self.afficheCommandesPliees = False + self.afficheCommandesPliees = True self.appliEficas = appli self.appli = appli #---- attendu par IHM self.vm = vm @@ -75,6 +76,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): # ces attributs sont mis a jour par definitCode appelee par newEditor self.code = self.appliEficas.CONFIGURATION.code + if self.code in ['MAP','CARMELCND'] : self.afficheCommandesPliees=False self.affiche_alpha=1 if self.code in ['MAP',] : self.widgetTree.close() @@ -132,7 +134,13 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): self.node_selected = [] self.deplier = True self.message='' - if self.code in ['Adao',] : self.afficheCommandesPliees=True + if self.code in ['Adao','MAP'] : self.afficheApresInsert=True + else : self.afficheApresInsert=False + if self.code in ['TELEMAC',] : self.enteteQTree='premier' + else : self.enteteQTree='complet' + if self.code in ['Adao','TELEMAC'] : self.affichePlie=True + else : self.affichePlie=False + self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue #------- construction du jdc -------------- @@ -145,9 +153,11 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): self.fileInfo = QFileInfo(self.fichier) self.fileInfo.setCaching(0) if jdc==None : - try : + # try : + if 1: self.jdc = self.readFile(self.fichier) - except : + #except : + else : print "mauvaise lecture" else : self.jdc=jdc @@ -179,6 +189,9 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc ) if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False): self.viewJdcRapport() + + if self.code=="TELEMAC" : print "kkkkkkkk" + if jdc_item: self.tree = browser.JDCTree( jdc_item, self ) @@ -470,21 +483,22 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): #---------------------# def handleDeplier(self): #---------------------# + print "je passe ici" if self.tree == None : return - self.tree.collapseAll() + #self.tree.collapseAll() if self.deplier : - self.tree.collapseItem(self.tree.topLevelItem(0)) + #print "je plie" + self.tree.expandItem(self.tree.topLevelItem(0)) self.deplier = False if self.fenetreCentraleAffichee != None : if hasattr(self.fenetreCentraleAffichee.node,'plieToutEtReaffiche'): - print "plie" self.fenetreCentraleAffichee.node.plieToutEtReaffiche() else: + #print "je deplie" self.tree.expandItem(self.tree.topLevelItem(0)) self.deplier = True if self.fenetreCentraleAffichee != None : if hasattr(self.fenetreCentraleAffichee.node,'deplieToutEtReaffiche'): - print "deplie" self.fenetreCentraleAffichee.node.deplieToutEtReaffiche() #---------------------# @@ -689,9 +703,9 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): self.appliEficas.trUtf8('Wrapper Files (*.xml);;''All Files (*)')) return fichier - #----------------------------------# - def writeFile(self, fn, txt = None): - #----------------------------------# + #--------------------------------------------------# + def writeFile(self, fn, txt = None,formatLigne="beautifie"): + #--------------------------------------------------# """ Public slot to write the text to a file. @@ -700,9 +714,9 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): """ fn = unicode(fn) - + if txt == None : - txt = self.get_text_JDC(self.format) + txt = self.get_text_JDC(self.format,formatLigne=formatLigne) eol = '\n' if len(txt) >= len(eol): if txt[-len(eol):] != eol: @@ -723,15 +737,15 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): .arg(unicode(fn)).arg(str(why))) return 0 - #-------------------------------------# - def get_text_JDC(self,format,pourRun=0): - #-------------------------------------# + #-----------------------------------------------------------# + def get_text_JDC(self,format,pourRun=0,formatLigne="beautifie"): + #-----------------------------------------------------------# if self.code == "MAP" and not(generator.plugins.has_key(format)): format = "MAP" if generator.plugins.has_key(format): # Le generateur existe on l'utilise self.generator=generator.plugins[format]() try : - jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION) + jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.CONFIGURATION) if pourRun : jdc_formate=self.generator.textePourRun except ValueError,e: QMessageBox.critical(self, tr("Erreur a la generation"),str(e)) @@ -978,9 +992,9 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): #else : pass - #-----------------------------------------# - def saveFile(self, path = None, saveas= 0): - #-----------------------------------------# + #-----------------------------------------------------------------# + def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"): + #-----------------------------------------------------------------# """ Public slot to save the text to a file. @@ -1014,7 +1028,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): fn = unicode(QDir.convertSeparators(fn)) newName = fn - if not (self.writeFile(fn)): return (0, None) + if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None) self.fichier = fn self.modified = False if self.fileInfo is None or saveas: @@ -1037,6 +1051,14 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): return (1, self.fichier) # + + #----------------------------------------------# + def sauveLigneFile(self): + #----------------------------------------------# + self.modified=1 + return self.saveFile(formatLigne="Ligne") + + #----------------------------------------------# def saveFileAs(self, path = None,fileName=None): #----------------------------------------------# @@ -1050,7 +1072,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget): if fileName != None : self.fichier = fileName return self.saveFile() - return self.saveFile(path,1) + return self.saveFile(path,1,"beautifie") diff --git a/InterfaceQT4/groupe.py b/InterfaceQT4/groupe.py index bfa9ce9d..1a1725e9 100644 --- a/InterfaceQT4/groupe.py +++ b/InterfaceQT4/groupe.py @@ -73,9 +73,14 @@ class Groupe(QtGui.QWidget,FacultatifOuOptionnel): def afficheMots(self): for node in self.node.children: - if hasattr(self.node,'appartientAUnNoeudPlie') and self.node.appartientAUnNoeudPlie==True : return - #print "getPanel ds afficheMots " ,node.item.nom, node.getPanelGroupe + print "ds afficheMots ",node," " ,node.item.nom, " " + print "ds afficheMots ",node," " ,node.item.nom, " ",node.plie ," ", node.appartientAUnNoeudPlie + # return et non continue car c est vrai pour tous les noeuds frere + if node.appartientAUnNoeudPlie==True : return + print "je suis apres le if pour ",node.item.nom widget=node.getPanelGroupe(self,self.maCommande) + #print "widget pour ", node.item.nom, widget + #print "fin pour " , node.item.nom self.listeFocus.append(node.fenetre) @@ -162,13 +167,9 @@ class Groupe(QtGui.QWidget,FacultatifOuOptionnel): if firstNode==None : firstNode=nouveau if nouveau == None or nouveau == 0 : self.editor.affiche_infos(str('insertion impossible a cet endroit pour '+nom),Qt.red) - print firstNode - print firstNode.fenetre self.reaffiche(firstNode) - #def PlieTout(self): - # self.node.setPlie() def Plie(self): self.node.setPlie() diff --git a/InterfaceQT4/monChoixCommande.py b/InterfaceQT4/monChoixCommande.py index 6dd35550..af68c8af 100644 --- a/InterfaceQT4/monChoixCommande.py +++ b/InterfaceQT4/monChoixCommande.py @@ -79,12 +79,15 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget): nodeCourrant=self.node.tree.currentItem() if nodeCourrant==None: nodeCourrant=self.node.tree.racine if self.name != None : - if nodeCourrant==self.node : nouveau=self.node.append_child(self.name,'first') - else : nouveau=nodeCourrant.append_brother(self.name) - print "je suis la" - from InterfaceQT4 import compojdc - if self.editor.afficheCommandesPliees==True and isinstance(nouveau.treeParent,compojdc.Node) : - nouveau.plieToutEtReaffiche() + plier=self.editor.afficheCommandesPliees + if nodeCourrant==self.node : nouveau=self.node.append_child(self.name,'first',plier) + else : nouveau=nodeCourrant.append_brother(self.name,plier=plier) + nouveau.setDeplie() + #if self.editor.afficheApresInsert==True : nouveau.plieToutEtReaffiche() + if self.editor.afficheApresInsert == True : + if self.editor.affichePlie ==True: nouveau.plieToutEtReaffiche() + else : nouveau.deplieToutEtReaffiche() + #nouveau.deplieToutEtReaffiche() def CreeListeCommande(self,filtre): listeGroupes,dictGroupes=self.jdc.get_groups() @@ -161,13 +164,6 @@ class MonChoixCommande(Ui_ChoixCommandes,QtGui.QWidget): commentaire="" self.editor.labelCommentaire.setText(commentaire) - def bOkPressed(self): - if self.name==None : - QMessageBox.critical(None, tr("Commande non choisie "), - tr("Vous devez choisir une commande") ) - return - #new_node = self.node.append_child(self.name,'first') - self.node.tree.choisitPremier(self.name) def setValide(self): diff --git a/InterfaceQT4/monWidgetCommande.py b/InterfaceQT4/monWidgetCommande.py index 80d48330..270620fa 100644 --- a/InterfaceQT4/monWidgetCommande.py +++ b/InterfaceQT4/monWidgetCommande.py @@ -36,13 +36,15 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe): """ """ def __init__(self,node,editor,etape): - print "MonWidgetCommande ", self + #print "MonWidgetCommande ", self self.listeAffichageWidget=[] self.inhibe=0 self.ensure=0 Groupe.__init__(self,node,editor,None,etape.definition,etape,1,self) - self.labelDoc.setText(QString(etape.definition.fr)) + if node.item.get_fr() != "" : self.labelDoc.setText(QString(node.item.get_fr())) + else : self.labelDoc.close() + if (etape.get_type_produit()==None): self.LENom.close() elif (hasattr(etape, 'sdnom')) and etape.sdnom != "sansnom" and etape.sdnom != None: self.LENom.setText(etape.sdnom) else : self.LENom.setText("") @@ -58,6 +60,12 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe): if self.editor.code in ['MAP','CARMELCND'] : self.bCatalogue.close() else : self.connect(self.bCatalogue,SIGNAL("clicked()"), self.afficheCatalogue) + if self.editor.code in ['Adao','MAP'] : + self.bAvant.close() + self.bApres.close() + else : + self.connect(self.bAvant,SIGNAL("clicked()"), self.afficheAvant) + self.connect(self.bApres,SIGNAL("clicked()"), self.afficheApres) self.connect(self.LENom,SIGNAL("returnPressed()"),self.nomChange) self.racine=self.node.tree.racine if self.node.item.GetIconName() == "ast-red-square" : self.LENom.setDisabled(True) @@ -77,12 +85,12 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe): self.editor.splitter.addWidget(self.monOptionnel) #print "dans init ", self.monOptionnel self.afficheOptionnel() - print "fin init de widget Commande" + #print "fin init de widget Commande" def focusNextPrevChild(self, next): # on s assure que ce n est pas un chgt de fenetre - print "je passe dans focusNextPrevChild" + #print "je passe dans focusNextPrevChild" if self.editor.fenetreCentraleAffichee != self : return True try : i= self.listeAffichageWidget.index(self.focusWidget()) @@ -134,7 +142,7 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe): self.monOptionnel.affiche(liste) def focusInEvent(self,event): - print "je mets a jour dans focusInEvent de monWidget Commande " + #print "je mets a jour dans focusInEvent de monWidget Commande " if self.editor.code == "CARMELCND" : return #Pas de MC Optionnels pour Carmel self.afficheOptionnel() @@ -142,6 +150,7 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe): def reaffiche(self,nodeAVoir=None): self.avantH=self.editor.fenetreCentraleAffichee.scrollAreaCommandes.horizontalScrollBar().sliderPosition() self.avantV=self.editor.fenetreCentraleAffichee.scrollAreaCommandes.verticalScrollBar().sliderPosition() + self.inhibeExpand=True self.node.affichePanneau() print "dans reaffiche de monWidgetCommande", self.avantH, self.avantV QTimer.singleShot(1, self.recentre) @@ -153,6 +162,7 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe): print "dans reaffiche",self.f, nodeAVoir.item.nom if self.f != None and self.f.isVisible() : return if self.f != None : QTimer.singleShot(1, self.rendVisible) + self.inhibeExpand=False def recentre(self): @@ -177,6 +187,12 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe): if self.node : self.node.select() else : self.racine.select() + def afficheApres(self): + self.node.selectApres() + + def afficheAvant(self): + self.node.selectAvant() + def setValide(self): if not(hasattr (self,'RBValide')) : return icon = QIcon() @@ -188,14 +204,4 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe): icon=QIcon(self.repIcon+"/ast-yel-ball.png") self.RBValide.setIcon(icon) - #def plieTout(self): - # print "dans plieTout de fenetre" - # if self.editor.dejaDansPlieTout: - # print "dans le hasattr" - # self.editor.dejaDansPlieTout=False - # return - # self.editor.dejaDansPlieTout=True - # self.node.plieTout() - # print "je reaffiche" - # self.node.affichePanneau() diff --git a/InterfaceQT4/monWidgetPlusieursBase.py b/InterfaceQT4/monWidgetPlusieursBase.py index e1e6c6ec..b661744e 100644 --- a/InterfaceQT4/monWidgetPlusieursBase.py +++ b/InterfaceQT4/monWidgetPlusieursBase.py @@ -102,10 +102,10 @@ class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe): if valeur != None : nouveauLE.setText(str(valeur)) # deux lignes pour que le ensureVisible fonctionne self.estVisible=nouveauLE - QTimer.singleShot(1, self.rendVisible) + QTimer.singleShot(1, self.rendVisibleLigne) - def rendVisible(self): + def rendVisibleLigne(self): qApp.processEvents() self.estVisible.setFocus() self.scrollArea.ensureWidgetVisible(self.estVisible,0,0) diff --git a/InterfaceQT4/qtEficas.py b/InterfaceQT4/qtEficas.py index be6faaa0..3a45ac9a 100644 --- a/InterfaceQT4/qtEficas.py +++ b/InterfaceQT4/qtEficas.py @@ -215,6 +215,8 @@ class Appli(Ui_Eficas,QMainWindow): self.menuTraduction.addAction(self.actionTraduitV9V10) self.menuTraduction.setTitle(tr("Traduction")) + self.menuFichier.addAction(self.actionSauveLigne) + self.menuOptions = self.menubar.addMenu("menuOptions") self.menuOptions.addAction(self.actionParametres_Eficas) self.menuOptions.addAction(self.actionLecteur_Pdf) @@ -327,11 +329,16 @@ class Appli(Ui_Eficas,QMainWindow): self.actionTraduitV7V8.setText(tr("TraduitV7V8")) self.actionTraduitV8V9.setText(tr("TraduitV8V9")) self.actionTraduitV9V10.setText(tr("TraduitV9V10")) + self.actionSauveLigne = QAction(self) + self.actionSauveLigne.setText(tr("Sauve Format Ligne")) + self.connect(self.actionParametres_Eficas,SIGNAL("activated()"),self.optionEditeur) self.connect(self.actionLecteur_Pdf,SIGNAL("activated()"),self.optionPdf) self.connect(self.actionTraduitV7V8,SIGNAL("activated()"),self.traductionV7V8) self.connect(self.actionTraduitV8V9,SIGNAL("activated()"),self.traductionV8V9) self.connect(self.actionTraduitV9V10,SIGNAL("activated()"),self.traductionV9V10) + self.connect(self.actionSauveLigne,SIGNAL("activated()"),self.sauveLigne) + # Pour Carmel self.actionChercheGrpMaille = QAction(self) @@ -559,6 +566,9 @@ class Appli(Ui_Eficas,QMainWindow): if msg != "": QMessageBox.warning(self, tr(u"Erreur"), msg) + def sauveLigne(self): + return self.viewmanager.sauveLigneCurrentEditor() + def fileSave(self): return self.viewmanager.saveCurrentEditor() diff --git a/InterfaceQT4/readercata.py b/InterfaceQT4/readercata.py index 1f7b5910..c71bb2b6 100644 --- a/InterfaceQT4/readercata.py +++ b/InterfaceQT4/readercata.py @@ -65,6 +65,7 @@ class READERCATA: self.fic_cata=None self.OpenCata() self.cataitem=None + if self.code=="TELEMAC": self.cree_dico_inverse() def OpenCata(self): """ @@ -302,3 +303,43 @@ class READERCATA: if dict_clef_docu.has_key(oper.nom): oper.docu=dict_clef_docu[oper.nom] + + def cree_dico_inverse(self): + self.dicoInverse={} + self.dico={} + listeEtapes=self.cata[0].JdC.commandes + for e in self.cata[0].JdC.commandes: + self.traite_entite(e) + #for e in self.cata[0].JdC.commandes: + # print "___________", e. nom , '__________________' + # self.cree_rubrique(e,self.dico,0) + + + def traite_entite(self,e): + boolIn=0 + for (nomFils, fils) in e.entites.items() : + self.traite_entite(fils) + boolIn=1 + if boolIn==0 : + liste=[] + moi=e + while hasattr(moi,'pere') : + liste.append((moi.nom,moi)) + moi=moi.pere + liste.append((moi.nom,moi)) + self.dicoInverse[e.nom]=liste + + def cree_rubrique(self,e,dico, niveau): + from Accas import A_BLOC + decale=niveau*" " + if niveau != 0 : + if isinstance(e,A_BLOC.BLOC): print decale, e.condition + else : print decale, e. nom + for (nom, fils) in e.entites.items() : + if fils.entites.items() != [] : self.cree_rubrique(fils,dico,niveau+1) + else : print (niveau+1)*" ", nom + + + + + diff --git a/InterfaceQT4/viewManager.py b/InterfaceQT4/viewManager.py index 74b474bb..78972b08 100644 --- a/InterfaceQT4/viewManager.py +++ b/InterfaceQT4/viewManager.py @@ -208,6 +208,24 @@ class MyTabview: self.myQtab.setTabText(index,fileName) return ok + def sauveLigneCurrentEditor(self): + index=self.myQtab.currentIndex() + if index < 0 : return + editor=self.dict_editors[index] + if editor in self.doubles.keys() : + QMessageBox.warning( + None, + tr("Fichier Duplique"), + tr("Le fichier ne sera pas sauvegarde."), + tr("&Annuler")) + return + ok, newName = editor.sauveLigneFile() + if ok : + fileName=os.path.basename(unicode(newName)) + self.myQtab.setTabText(index,fileName) + return ok + + def saveAsCurrentEditor(self): index=self.myQtab.currentIndex() editor=self.dict_editors[index] diff --git a/Telemac/Telemac_Cata.py b/Telemac/Telemac_Cata.py index e3c46ba6..c7cc9f43 100644 --- a/Telemac/Telemac_Cata.py +++ b/Telemac/Telemac_Cata.py @@ -83,7 +83,11 @@ Where this keyword is used, these bathymetric data shall be used in the computat fr='Nom du fichier a soumettre', ang='Name of FORTRAN file to be submitted',), - Boundary_Condition_File = SIMP( statut='o', typ = ('Fichier', 'Boundary Condition (*.cli);;All Files (*)',),fr='Nom du fichier contenant les types de conditions aux limites. Ce fichier est rempli de facon automatique par le mailleur au moyen de couleurs affectees aux noeuds des frontieres du domaine de calcul.',ang='Name of the file containing the types of boundary conditions. This file is filled automatically by the mesh generator through through colours that are assigned to the boundary nodes.',), + Boundary_Conditions_File = SIMP( statut='o', typ = ('Fichier', 'Boundary Condition (*.cli);;All Files (*)',), + fr='Nom du fichier contenant les types de conditions aux limites. Ce fichier est rempli de facon automatique\n\ + par le mailleur au moyen de couleurs affectees aux noeuds des frontieres du domaine de calcul.', + ang='Name of the file containing the types of boundary conditions. This file is filled automatically\n\ + by the mesh generator through through colours that are assigned to the boundary nodes.',), Validation=FACT( statut='f', @@ -106,12 +110,6 @@ Where this keyword is used, these bathymetric data shall be used in the computat Formatted_And_Binary_Files=FACT( statut='f', - Formatted_File1 = SIMP( statut='f', typ = ('Fichier', 'formated File (*.txt);;All Files (*)',), - fr = "Fichier de donnees formate mis a la disposition de l''utilisateur. \n\ -Les donnees de ce fichier seront a lire sur le canal 26.", - ang = 'Formatted data file made available to the user.\n\ -The data in this file shall be read on channel 26.', - ), Formatted_File2 = SIMP( statut='f', typ = ('Fichier', 'formated File (*.txt);;All Files (*)',), fr = "Fichier de donnees formate mis a la disposition de l'utilisateur. \n\ Les donnees de ce fichier seront a lire sur le canal 27.", @@ -132,7 +130,7 @@ The data in this file shall be read on channel 25.', ), ), # fin Formatted_And_Binary_Files -), # Fin de InputFile + ), # Fin de InputFile Computation_Continued=FACT( statut='f', @@ -170,11 +168,11 @@ The data in this file shall be read on channel 25.', ), Computation=FACT(statut='o', - Machine=FACT( statut='o', + #Machine=FACT( statut='o', # A voir plus tar Obsolete ? - Number_of_Processors=SIMP(statut='o',typ='I',val_min=0,defaut=1), + # Parallel_Processors=SIMP(statut='o',typ='I',val_min=0,defaut=1), #Parallel_Computation=SIMP(statut='o',typ=bool,defaut=False), - ), + # ), Coupling=FACT( statut='o', Sisyphe=SIMP(statut='o',typ=bool,defaut=False), Tomawac=SIMP(statut='o',typ=bool,defaut=False), @@ -194,17 +192,32 @@ The data in this file shall be read on channel 25.', TIDE_PARAMETERS=PROC(nom="TIDE_PARAMETERS",op=None, fr="", ang="", + Inputs_Outputs_For_Tide=FACT( statut='o', + Harmonic_Constants_File = SIMP( statut='o', + typ = ('Fichier', 'All Files (*)',), + fr = 'Constantes harmoniques extraites du fichier du modele de maree', + ang= 'Harmonic constants extracted from the tidalmodel file', + ), + + Tidal_Model_File = SIMP( statut='o', + typ = ('Fichier', 'All Files (*)',), + fr = 'Fichier de geometrie du modele dont sont extraites les constantes harmoniques', + ang= 'Geometry file of the model from which harmonic constituents are extracted', + ), + + ), + Time=FACT( statut='o', - #Original_Date_of_Time=SIMP(statut='f',typ=DateJJMMAAAA,validators=VerifTypeTuple(('R','R','R'))), - #Original_Hour_of_Time=SIMP(statut='f',typ=HeureHHMMSS,validators=VerifTypeTuple(('R','R','R'))), - Original_Date_of_Time=FACT( statut='o', + #Original_Date_Of_Time=SIMP(statut='f',typ=DateJJMMAAAA,validators=VerifTypeTuple(('R','R','R'))), + #Original_Hour_Of_Time=SIMP(statut='f',typ=HeureHHMMSS,validators=VerifTypeTuple(('R','R','R'))), + Original_Date_Of_Time=FACT( statut='o', fr = "Permet de fixer la date d'origine des temps du modele lors de la prise en compte de la force generatrice de la maree.", ang ='Give the date of the time origin of the model when taking into account the tide generating force.', Year=SIMP(statut='o',typ='I',val_min=1900,defaut=1900), Month=SIMP(statut='o',typ='I',val_min=1,val_max=12,defaut=1), Day=SIMP(statut='o',typ='I',val_min=1,val_max=31,defaut=1), ), - Original_Hour_of_Time=FACT( statut='f', + Original_Hour_Of_Time=FACT( statut='f', fr = "Permet de fixer l'heure d'origine des temps du modele lors de la prise en compte de la force generatrice de la maree.", ang ='Give the time of the time origin of the model when taking into account the tide generating force.', Hour=SIMP(statut='o',typ='I',val_min=0,val_max=24,defaut=0), @@ -213,7 +226,7 @@ TIDE_PARAMETERS=PROC(nom="TIDE_PARAMETERS",op=None, ), ), Location=FACT( statut='f', - #regles=( PRESENT_PRESENT('Longitude_of_origin','Latitute_of_origin', ),), + #regles=( PRESENT_PRESENT('Longitude_Of_origin','Latitute_Of_origin', ),), #Spatial_Projection=SIMP(statut='f',typ='I',into=[1,2,3]), #Geographic_System=SIMP(statut='f',typ='I',into=[-1,0,1,2,3,4,5]), @@ -227,8 +240,8 @@ TIDE_PARAMETERS=PROC(nom="TIDE_PARAMETERS",op=None, Spatial_Projection=SIMP(statut='o',typ='TXM',into=["CARTESIAN, NOT GEOREFERENCED","MERCATOR","LATITUDE LONGITUDE"]), ang = 'Option 2 or 3 mandatory for spherical coordinates Option 3: latitude and longitude in radians!', b_lat = BLOC(condition = "Spatial_Projection == 'LATITUDE LONGITUDE' ", - Latitude_of_origin=SIMP(statut='o',typ='R',val_min=-90,val_max=90,fr="en radians", ang="in radians"), - Longitude_of_origin=SIMP(statut='o',typ='R',fr="en radians", ang="in radians"), + Latitude_Of_Origin=SIMP(statut='o',typ='R',val_min=-90,val_max=90,fr="en radians", ang="in radians"), + Longitude_Of_Origin=SIMP(statut='o',typ='R',fr="en radians", ang="in radians"), ), # fin bloc b_lat ), # fin bloc b_geo @@ -335,13 +348,16 @@ INITIAL_STATE=PROC(nom="INITIAL_STATE",op=None, ), # fin des Liquid_Boundaries - Stage_Discharge_Curves = SIMP(statut='f',typ='I', +#PNPN Attention dans le Dico STAGE-DISCHARGE CURVES + Stage_Discharge_Curves = SIMP(statut='f',typ='TXM', #into=[0,1,2], into=["no","Z(Q)","not programmed"], fr='Indique si une courbe de tarage doit etre utilisee pour une frontiere', ang='Says if a discharge-elevation curve must be used for a given boundary', ), b_discharge_curve = BLOC (condition = "Stage_Discharge_Curves == 'Z(Q)'", + +#PNPN Attention dans le Dico STAGE-DISCHARGE CURVES FILES Stage_Discharge_Curves_File = SIMP( statut='f', typ = ('Fichier', 'All Files (*)',), fr='Nom du fichier contenant les courbes de tarage', ang='Name of the file containing stage-discharge curves', @@ -358,8 +374,7 @@ if Priority to fluxes, Dirichlet prescribed values are not obeyed,but the fluxes #???? into no coherent avec dico # Ira dans la marée - Option_For_Tidal_Boundary_Conditions = SIMP( statut='f',typ='I', - #into=[1,2],sug=1), + Option_For_Tidal_Boundary_Conditions = SIMP( statut='f',typ='TXM', into=['No tide', 'Real tide (recommended methodology)', 'Astronomical tide', 'Mean spring tide', 'Mean tide',\ 'Mean neap tide', 'Astronomical neap tide', 'Real tide (methodology before 2010)'], ), @@ -371,7 +386,7 @@ if Priority to fluxes, Dirichlet prescribed values are not obeyed,but the fluxes NUMERICAL_PARAMETERS=PROC(nom="NUMERICAL_PARAMETERS",op=None, - Solver=FACT(statut='o', + Solver_Definition=FACT(statut='o', Equations=SIMP(statut='o',typ='TXM', into=['SAINT-VENANT EF','SAINT-VENANT VF','BOUSSINESQ'], @@ -381,7 +396,8 @@ NUMERICAL_PARAMETERS=PROC(nom="NUMERICAL_PARAMETERS",op=None, ), Solver=SIMP(statut='o',typ='TXM', - into = ["conjugate gradient", "conjugate residual", "minimum error", "cgstab", "gmres", "direct",], + into = ["conjugate gradient", "conjugate residual","conjugate gradient on a normal equation",\ + "minimum error", "cgstab", "gmres", "direct",], fr = 'Permet de choisir le solveur utilise pour la resolution de l''etape de propagation. \n\ Toutes les methodes proposees actuellement s''apparentent au Gradient Conjugue. Ce sont :\n\ 1 : gradient conjugue 2 : residu conjugue 3 : gradient conjugue sur equation normale \n\ @@ -401,12 +417,14 @@ All the currently available methods are variations of the Conjugate Gradient met ), ), + Initial_Guess_for_H=SIMP(statut='f',typ='TXM',into=['zero','previous','extrapolation'],defaut='previous',), + Initial_Guess_for_U=SIMP(statut='f',typ='TXM',into=['zero','previous','extrapolation'],defaut='previous',), Solver_Accuracy = SIMP(statut='o',typ='R', defaut=1e-4, fr = 'Precision demandee pour la resolution de l''etape de propagation (cf. Note de principe).', ang = 'Required accuracy for solving the propagation step (refer to Principle note).', ), - Maximum_Number_of_Iterations_For_Solver=SIMP(statut='o',typ='I', defaut=40, + Maximum_Number_Of_Iterations_For_Solver=SIMP(statut='o',typ='I', defaut=40, fr = 'Les algorithmes utilises pour la resolution de l''etape de propagation etant iteratifs, \n\ il est necessaire de limiter le nombre d''iterations autorisees.\n\ Remarque : un maximum de 40 iterations par pas de temps semble raisonnable.', @@ -417,10 +435,10 @@ Note: a maximum number of 40 iterations per time step seems to be reasonable.', ), # fin Solver Time=FACT(statut='f', - regles=(UN_PARMI('Number_of_Time_Steps','Duration'),), + regles=(UN_PARMI('Number_Of_Time_Steps','Duration'),), Time_Step=SIMP(statut='f',typ='R'), - Number_of_Time_Steps=SIMP(statut='f',typ='I', + Number_Of_Time_Steps=SIMP(statut='f',typ='I', fr='Definit le nombre de pas de temps effectues lors de l''execution du code.', ang='Specifies the number of time steps performed when running the code.'), Duration=SIMP(statut='f',typ='R'), @@ -458,9 +476,9 @@ ang = 'The program is stopped if the limits on u,v,h, or t are trespassed', ), # Fin de Time Linearity=FACT(statut='f', - Treatment_of_Fluxes_at_the_Boundaries =SIMP( statut='f',typ='I',into=[1,2],sug=1), + Treatment_Of_Fluxes_at_the_Boundaries =SIMP( statut='f',typ='I',into=[1,2],sug=1), Continuity_Correction =SIMP(typ=bool, statut='f'), - Number_of_Sub_Iterations=SIMP(statut='f',typ='I'), + Number_Of_Sub_Iterations=SIMP(statut='f',typ='I'), ), Precondionning=FACT(statut='f', @@ -488,7 +506,7 @@ ang = 'The program is stopped if the limits on u,v,h, or t are trespassed', Advection=FACT(statut='f', - Mass_Lumping_on_H =SIMP(statut='f',typ='R',defaut=0, + Mass_Lumping_On_H =SIMP(statut='f',typ='R',defaut=0, fr = 'TELEMAC offre la possibilite d''effectuer du mass-lumping sur H ou U.\n\ Ceci revient a ramener tout ou partie (suivant la valeur de ce coefficient) des matrices AM1 (h) ou AM2 (U) \n\ et AM3 (V) sur leur diagonale. Cette technique permet d''accelerer le code dans des proportions tres\n\ @@ -500,7 +518,7 @@ Thanks to that technique, the code can be speeded up to a quite significant exte more stable. The resulting solutions, however, become artificially smoothed. \n\ This parameter sets the extent of mass-lumping that is performed on h.'), - Mass_Lumping_on_Velocity =SIMP(statut='f',typ='R',defaut=0, + Mass_Lumping_On_Velocity =SIMP(statut='f',typ='R',defaut=0, fr = 'Fixe le taux de mass-lumping effectue sur la vitesse.', ang = 'Sets the amount of mass-lumping that is performed on the velocity.' ), @@ -512,20 +530,20 @@ This parameter sets the extent of mass-lumping that is performed on h.'), # Il faut recalculer des listes de 4 en sortie # Advection_Propagation=FACT(statut='f', - Advection_Of_U_and_V=SIMP(statut='o',typ=bool,defaut=False, + Advection_Of_U_And_V=SIMP(statut='o',typ=bool,defaut=False, fr = 'Prise en compte ou non de la convection de U et V.', ang= 'The advection of U and V is taken into account or ignored.' ), - b_u_v = BLOC( condition = "Advection_Of_U_and_V==True", + b_u_v = BLOC( condition = "Advection_Of_U_And_V==True", + Type_Of_Advection_U_And_V=SIMP(statut='o',typ='TXM', + into=["characteristics", "SUPG", "Conservative N-scheme", 'Conservative N-scheme',\ + 'Conservative PSI-scheme', 'Non conservative PSI scheme', 'Implicit non conservative N scheme',\ + ' Edge-based N-scheme', 'Edge-based N-scheme'], - Type_of_Advection_U_and_V=SIMP(statut='o',typ='TXM', - into=["CARACTERISTIQUES", "SUPG", "SCHEMA VOLUME FINI EXPLICIT", "SCHEMA DISTRIBUTIF N CONSERVATIF",\ - "SCHEMA PSI CONSERVATIF", "SCHEMA PSI NON CONSERVATIF", "SCHEMA N IMPLICITE NON CONSERVATIF",\ - "SCHEMA N PAR SEGMENTS SCHEMA 3", "SCHEMA N PAR SEGMENTS SCHEMA 4"], ), - b_upwind =BLOC(condition = "Type_of_Advection_U_and_V== 'SUPG'", - Upwind_Coefficients_of_U_and_V=SIMP(statut='o',typ='R',) + b_upwind =BLOC(condition = "Type_Of_Advection_U_And_V== 'SUPG'", + Upwind_Coefficients_Of_U_And_V=SIMP(statut='o',typ='R',) ), ), @@ -536,13 +554,13 @@ This parameter sets the extent of mass-lumping that is performed on h.'), b_h = BLOC( condition = "Advection_Of_H==True", - Type_of_Advection_H=SIMP(statut='o',typ='TXM', - into=["CARACTERISTIQUES", "SUPG", "SCHEMA VOLUME FINI EXPLICIT", "SCHEMA DISTRIBUTIF N CONSERVATIF",\ - "SCHEMA PSI CONSERVATIF", "SCHEMA PSI NON CONSERVATIF", "SCHEMA N IMPLICITE NON CONSERVATIF",\ - "SCHEMA N PAR SEGMENTS SCHEMA 3", "SCHEMA N PAR SEGMENTS SCHEMA 4"], + Type_Of_Advection_H=SIMP(statut='o',typ='TXM', + into=["characteristics", "SUPG", "Conservative N-scheme", 'Conservative N-scheme',\ + 'Conservative PSI-scheme', 'Non conservative PSI scheme', 'Implicit non conservative N scheme',\ + ' Edge-based N-scheme', 'Edge-based N-scheme'], ), - b_upwind_H = BLOC(condition = "Type_of_Advection_H== 'SUPG'", - Upwind_Coefficients_of_H=SIMP(statut='o',typ='R',) + b_upwind_H = BLOC(condition = "Type_Of_Advection_H== 'SUPG'", + Upwind_Coefficients_Of_H=SIMP(statut='o',typ='R',) ), ), @@ -551,33 +569,33 @@ This parameter sets the extent of mass-lumping that is performed on h.'), ang= 'The advection of Tracer is taken into account or ignored.' ), - b_tracers = BLOC( condition = "Advection_Of_Travers==True", + b_tracers = BLOC( condition = "Advection_Of_Tracers==True", - Type_of_Advection_Tracers=SIMP(statut='o',typ='TXM', - into=["CARACTERISTIQUES", "SUPG", "SCHEMA VOLUME FINI EXPLICIT", "SCHEMA DISTRIBUTIF N CONSERVATIF",\ - "SCHEMA PSI CONSERVATIF", "SCHEMA PSI NON CONSERVATIF", "SCHEMA N IMPLICITE NON CONSERVATIF",\ - "SCHEMA N PAR SEGMENTS SCHEMA 3", "SCHEMA N PAR SEGMENTS SCHEMA 4"], + Type_Of_Advection_Tracers=SIMP(statut='o',typ='TXM', + into=["characteristics", "SUPG", "Conservative N-scheme", 'Conservative N-scheme',\ + 'Conservative PSI-scheme', 'Non conservative PSI scheme', 'Implicit non conservative N scheme',\ + ' Edge-based N-scheme', 'Edge-based N-scheme'], ), - b_upwind_Tracers =BLOC(condition = "Type_of_Advection_Tracers== 'SUPG'", - Upwind_Coefficients_of_Tracers=SIMP(statut='o',typ='R',) + b_upwind_Tracers =BLOC(condition = "Type_Of_Advection_Tracers== 'SUPG'", + Upwind_Coefficients_Of_Tracers=SIMP(statut='o',typ='R',) ), ), - Advection_of_K_and_Epsilon=SIMP(statut='f',typ=bool,defaut=False, + Advection_Of_K_And_Epsilon=SIMP(statut='f',typ=bool,defaut=False, fr = 'Prise en compte ou non de la convection de Tracer.', ang= 'The advection of Tracer is taken into account or ignored.' ), - b_k = BLOC( condition = "Advection_Of_K_and_Epsilon==True", + b_k = BLOC( condition = "Advection_Of_K_And_Epsilon==True", - Type_of_Advection_K_and_Epsilon=SIMP(statut='o',typ='TXM', - into=["CARACTERISTIQUES", "SUPG", "SCHEMA VOLUME FINI EXPLICIT", "SCHEMA DISTRIBUTIF N CONSERVATIF",\ - "SCHEMA PSI CONSERVATIF", "SCHEMA PSI NON CONSERVATIF", "SCHEMA N IMPLICITE NON CONSERVATIF",\ - "SCHEMA N PAR SEGMENTS SCHEMA 3", "SCHEMA N PAR SEGMENTS SCHEMA 4"], + Type_Of_Advection_K_And_Epsilon=SIMP(statut='o',typ='TXM', + into=["characteristics", "SUPG", "Conservative N-scheme", 'Conservative N-scheme',\ + 'Conservative PSI-scheme', 'Non conservative PSI scheme', 'Implicit non conservative N scheme',\ + ' Edge-based N-scheme', 'Edge-based N-scheme'], ), - b_upwind_k =BLOC(condition = "Type_of_Advection_K_and_Epsilon== 'SUPG'", - Upwind_Coefficients_of_K_and_Epsilon=SIMP(statut='o',typ='R',) + b_upwind_k =BLOC(condition = "Type_Of_Advection_K_And_Epsilon== 'SUPG'", + Upwind_Coefficients_Of_K_And_Epsilon=SIMP(statut='o',typ='R',) ), ), @@ -591,14 +609,14 @@ This parameter sets the extent of mass-lumping that is performed on h.'), ), ), Discretisation_Implicitation=FACT(statut='f', - Discretisation_in_Space=SIMP(statut='f',typ='I',min=4,max=4,into=[11,12,13],defaut=(11,11,11),), - Implicitation_for_Diffusion_of_velocity=SIMP(statut='f',typ='R',sug=0), - Implicitation_for_Depth=SIMP(statut='f',typ='R',sug=0.55), + Discretisations_In_Space=SIMP(statut='f',typ='TXM', + into =["linear for velocity and depth", "quasi-bubble-velocity and linear depth", "quadratic velocity and linear depth"], + defaut="linear for velocity and depth",), + Implicitation_For_Diffusion_Of_velocity=SIMP(statut='f',typ='R',sug=0), + Implicitation_For_Depth=SIMP(statut='f',typ='R',sug=0.55), Implicitation_for_Velocity=SIMP(statut='f',typ='R',sug=0.55), Free_Surface_Gradient_Compatibility=SIMP(statut='f',typ='R',sug=1.), ), - Initial_Guess_for_H=SIMP(statut='f',typ='TXM',into=['zero','previous','extrapolation'],defaut='previous',), - Initial_Guess_for_U=SIMP(statut='f',typ='TXM',into=['zero','previous','extrapolation'],defaut='previous',), )# fin NUMERICAL_PARAMETERS PHYSICAL_PARAMETERS=PROC(nom="PHYSICAL_PARAMETERS",op=None, @@ -606,7 +624,7 @@ PHYSICAL_PARAMETERS=PROC(nom="PHYSICAL_PARAMETERS",op=None, Wind=SIMP(statut='f',typ=bool,sug=False), b_Wind =BLOC(condition = "Wind=='True'", regles=( PRESENT_PRESENT('Wind_Velocity_along_X','Wind_Velocity_along_Y', ),), - Coefficient_of_Wind_Influence=SIMP(statut='f',typ='R',sug=0,), + Coefficient_Of_Wind_Influence=SIMP(statut='f',typ='R',sug=0,), Wind_Velocity_along_X=SIMP(statut='f',typ='R',sug=0,), Wind_Velocity_along_Y=SIMP(statut='f',typ='R',sug=0,), Threashold_Depth_for_Wind=SIMP(statut='f',typ='R',sug=0,), @@ -617,25 +635,104 @@ PHYSICAL_PARAMETERS=PROC(nom="PHYSICAL_PARAMETERS",op=None, Rain_or_Evaporation_in_mm_perday=SIMP(statut='f',typ='I',sug=0), ), ), - Tide_Generating_Force=SIMP(statut='f',typ=bool,sug=False), - b_Tide =BLOC(condition = "Tide_Generating_Force=='True'", - Tidal_Data_Base=SIMP(statut='f',typ='I',into=[-1,1,2,3,4]), - Coefficient_To_Calibrate_Tidal_Range=SIMP(statut='f',typ='R',sug=1.), - Coefficient_To_Calibrate_Tidal_Velocity=SIMP(statut='f',typ='R',sug=999999), - Coefficient_To_Calibrate_Sea_Level=SIMP(statut='f',typ='R',sug=0.), - Binary_Database_1_for_Tide = SIMP( statut='f', typ = ('Fichier', '(All Files (*)',),), - Binary_Database_2_for_Tide = SIMP( statut='f', typ = ('Fichier', '(All Files (*)',),), - ), + + Tide_Generating_Force=SIMP(statut='o',typ=bool,defaut=False), + b_Tide = BLOC(condition = "Tide_Generating_Force==True", + Tidal_Data_Base=SIMP(statut='o',typ='I',into=[-1,1,2,3,4]), + Coefficient_To_Calibrate_Tidal_Range=SIMP(statut='o',typ='R',sug=1.), + Coefficient_To_Calibrate_Tidal_Velocity=SIMP(statut='o',typ='R',sug=999999), + Coefficient_To_Calibrate_Sea_Level=SIMP(statut='o',typ='R',sug=0.), + Binary_Database_1_for_Tide = SIMP( statut='o', typ = ('Fichier', '(All Files (*),)',),), + Binary_Database_2_for_Tide = SIMP( statut='o', typ = ('Fichier', '(All Files (*),)',),), + ), + Wave_Driver_Currents=SIMP(statut='f',typ=bool,sug=False), b_Wave =BLOC(condition = "Wave_Driver_Currents=='True'", Record_Number_in_Wave_File=SIMP(statut='f',typ='I',sug=1), ), + + Friction_Data=SIMP(statut='o',typ=bool,defaut=False), + b_Friction = BLOC(condition = "Friction_Data==True", + Friction_Data_File = SIMP( statut='o', + typ = ('Fichier', ';;All Files (*)'), + fr = 'fichier de donnees pour le frottement', + ang= 'friction data file', + ), + Depth_In_Friction_Terms = SIMP( statut='o',typ='TXM', + defaut= '1="nodal"' , + into =('1="nodal"', '2="average"'), + fr = '1 : nodale 2 : moyenne', + ang= '1: nodal 2: average', + ), + Law_Of_Bottom_Friction = SIMP( statut='o',typ='TXM', + defaut='0="NO FRICTION"' , + into =('0="NO FRICTION"', '1="HAALAND"', '2="CHEZY"', '3="STRICKLER"', '4="MANNING"', '5="NIKURADSE"','Log Law of Boundaries 6','Colebrooke_White Log 7'), + fr = 'selectionne le type de formulation utilisee pour le calcul du frottement sur le fond.', + ang= 'Selects the type of formulation used for the bottom friction.', + ), + b_Law_Friction = BLOC(condition = "Law_Of_Bottom_Friction!=0", + Friction_Coefficient = SIMP( statut='o',typ='R', + defaut=50.0 , + fr = 'Fixe la valeur du coefficient de frottement pour la formulation choisie. \ +Attention, la signification de ce chiffre varie suivant la formule choisie : \ +1 : coefficient lineaire 2 : coefficient de Chezy 3 : coefficient de Strickler \ +4 : coefficient de Manning 5 : hauteur de rugosite de Nikuradse', + ang= 'Sets the value of the friction coefficient for the selected formulation. \ +It is noteworthy that the meaning of this figure changes according to the selected formula (Chezy, Strickler, etc.) : \ +1 : linear coefficient 2 : Chezy coefficient 3 : Strickler coefficient 4 : Manning coefficient 5 : Nikuradse grain size', + ), + ), + b_Colebrooke_White = BLOC(condition =' "Law_Of_Bottom_Friction" in ("Colebrooke_White Log 7",)', + Manning_Default_Value_For_Colebrook_white_Law = SIMP( statut='o',typ='R', + defaut=0.02 , + fr = 'valeur par defaut du manning pour la loi de frottement de Colebrook-White ', + ang= 'Manning default value for the friction law of Colebrook-White ', + ), + ), + + Non_submerged_Vegetation_Friction = SIMP( statut='o',typ=bool, + defaut=False , + fr = 'calcul du frottement du a la vegetation non submergee', + ang= 'friction calculation of the non-submerged vegetation', + ), + b_Non_Sub = BLOC(condition =' Non_submerged_Vegetation_Friction == True', + Diameter_Of_Roughness_Elements = SIMP( statut='o',typ='R', + defaut=0.006 , + fr = 'diametre des elements de frottements', + ang= 'diameter of roughness element', + ), + + Spacing_Of_Roughness_Elements = SIMP( statut='o',typ='R', + defaut=0.14 , + fr = 'espacement des elements de frottement', + ang= 'spacing of rouhness element', + ), + ), + Law_Of_Friction_On_Lateral_Boundaries = SIMP( statut='o',typ='TXM', + defaut=0 , + into =('0="NO FRICTION"', '1="HAALAND"', '2="CHEZY"', '3="STRICKLER"', '4="MANNING"', '5="NIKURADSE"', '6="LOG LAW"', '7="COLEBROOK-WHITE"'), + fr = 'selectionne le type de formulation utilisee pour le calcul du frottement sur les parois laterales.', + ang= 'Selects the type of formulation used for the friction on lateral boundaries.', + ), + Roughness_Coefficient_Of_Boundaries = SIMP( statut='o',typ='R', + defaut=100.0 , + fr = 'Fixe la valeur du coefficient de frottement sur les frontieres solides avec un regime turbulent rugueux\n\ + sur les bords du domaine. meme convention que pour le coefficient de frottement', + ang= 'Sets the value of the friction coefficient of the solid boundary with the bed roughness option. Same meaning than friction coefficient', + ), + Maximum_Number_Of_Friction_Domains = SIMP( statut='o',typ='I', + defaut=10 , + fr = 'nombre maximal de zones pouvant etre definies pour le frottement. Peut etre augmente si necessaire', + ang= 'maximal number of zones defined for the friction. Could be increased if needed', + ), + + ), # Fin de Friction ) POST_PROCESSING=PROC(nom="POST_PROCESSING",op=None, Graphic_Printouts=FACT(statut='f', Graphic_Printout_Period=SIMP(statut='o', typ='I',defaut=1), - Number_of_First_TimeStep_For_Graphic_Printouts=SIMP(statut='o', typ='I',defaut=1), + Number_Of_First_TimeStep_For_Graphic_Printouts=SIMP(statut='o', typ='I',defaut=1), Variables_For_Graphic_Printouts=SIMP(statut='o',max="**", typ='TXM',into=['a','b','c'],), # ajouter le into ), @@ -665,6 +762,14 @@ POST_PROCESSING=PROC(nom="POST_PROCESSING",op=None, Variables_To_Be_Printed=SIMP(statut='o',max="**", typ='TXM',into=['a','b','c']), ),#Listing_Printouts + Formatted_Results_File = SIMP( statut='o',typ= ('Fichier','All Files (*)',), + fr = 'Fichier de resultats formate mis a la disposition de l utilisateur. \ +Les resultats a placer dans ce fichier seront a ecrire sur le canal 29.', + ang= 'Formatted file of results made available to the user. \ +The results to be entered into this file shall be written on channel 29.', + ), + + Debugger = SIMP(typ=bool, statut='o', defaut=False), Output_Of_Initial_Conditions = SIMP(typ=bool, statut='o', defaut=True, fr = 'Si Vrai, impression des conditions initiales dans les resultats', @@ -692,3 +797,92 @@ PRECONDITIONING = SIMP( statut='o',typ='I', ), ) # FIN POST-PRO + + +# Attention calculer le logique BREACH +STRUCTURES=PROC(nom="STRUCTURES",op=None, + +# Attention calculer le logique BREACH + Breaches= FACT(statut='f', + Breaches_Data_File = SIMP( statut='o',typ = ('Fichier', 'All Files (*)',), + fr = 'Fichier de description des breches', + ang= 'Description of breaches', + ), + ), + + Culverts= FACT(statut='o', + + Number_Of_Culverts = SIMP( statut='o',typ='I', + defaut=0 , + fr = 'Nombre de siphons traites comme des termes sources ou puits. Ces siphons doivent etre decrits comme des sources \ +dans le fichier cas. Leurs caracteristiques sont donnees dans le fichier de donnees des siphons (voir la documentation ecrite)', + ang= 'Number of culverts treated as source terms. They must be described as sources in the domain\ + and their features are given in the culvert data file (see written documentation)', + ), + + Culvert_Data_File = SIMP( statut='o',typ = ('Fichier', 'All Files (*)',), + fr = 'Fichier de description des siphons presents dans le modele', + ang= 'Description of culvert existing in the model', + ), + + Formatted_File1 = SIMP( statut='f', typ = ('Fichier', 'formated File (*.txt);;All Files (*)',), + fr = "Fichier de donnees formate mis a la disposition de l''utilisateur. \n\ +Les donnees de ce fichier seront a lire sur le canal 26.", + ang = 'Formatted data file made available to the user.\n\ +The data in this file shall be read on channel 26.', + ), + + + Abscissae_Of_Sources = SIMP( statut='o', + typ=Tuple(2),validators=VerifTypeTuple(('R','R')), + fr = 'Valeurs des abscisses des sources de debit et de traceur.', + ang= 'abscissae of sources of flowrate and/or tracer', + ), + + Ordinates_Of_Sources = SIMP( statut='o', + typ=Tuple(2),validators=VerifTypeTuple(('R','R')), + fr = 'Valeurs des ordonnees des sources de debit et de traceur.', + ang= 'ordinates of sources of flowrate and/or tracer', + ), + Water_Discharge_Of_Sources = SIMP( statut='o', + typ=Tuple(2),validators=VerifTypeTuple(('R','R')), + fr = 'Valeurs des debits des sources.', + ang= 'values of water discharge of sources', + ), + Velocities_Of_The_Sources_Along_X = SIMP( statut='o', + typ=Tuple(2),validators=VerifTypeTuple(('R','R')), + fr = 'Vitesses du courant a chacune des sources. Si elles ne sont pas donnees, on considere que la vitesse est celle du courant', + ang= 'Velocities at the sources. If they are not given, the velocity of the flow at this location is taken', + ), + Velocities_Of_The_Sources_Along_Y = SIMP( statut='o', + typ=Tuple(2),validators=VerifTypeTuple(('R','R')), + fr = 'Vitesses du courant a chacune des sources', + ang= 'Velocities at the sources', + ), + ), + + Tubes= FACT(statut='f', + Number_Of_Tubes = SIMP( statut='o',typ='I', + defaut=0 , + fr = 'Nombre de buses ou ponts traites comme des termes sources ou puits. Ces buses doivent etre decrits comme des sources\n\ +dans le fichier cas. Leurs caracteristiques sont donnees dans le fichier de donnees des buses (voir la documentation ecrite)', + ang= 'Number of tubes or bridges treated as source terms. They must be described as sources in the domain \n\ +and their features are given in the tubes data file (see written documentation)', + ), + + Tubes_Data_File = SIMP( statut='o', + typ = ('Fichier', 'All Files (*)',), + fr = 'Fichier de description des buses/ponts presents dans le modele', + ang= 'Description of tubes/bridges existing in the model', + ), + ), + + Weirs= FACT(statut='f', + Weirs_Data_File = SIMP( statut='o', + typ = ('Fichier', 'All Files (*)',), + fr = 'Fichier de description des seuils presents dans le modele', + ang= 'Description of weirs existing in the model', + ), + ), + +) # FIN STRUCTURES diff --git a/convert/convert_TELEMAC.py b/convert/convert_TELEMAC.py new file mode 100644 index 00000000..8b32301e --- /dev/null +++ b/convert/convert_TELEMAC.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2013 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + Ce module contient le plugin convertisseur de fichier + au format python pour EFICAS. + + Un plugin convertisseur doit fournir deux attributs de classe : + extensions et formats et deux methodes : readfile,convert. + + L'attribut de classe extensions est une liste d'extensions + de fichiers preconisees pour ce type de format. Cette information + est seulement indicative. + + L'attribut de classe formats est une liste de formats de sortie + supportes par le convertisseur. Les formats possibles sont : + eval, dict ou exec. + Le format eval est un texte source Python qui peut etre evalue. Le + resultat de l'evaluation est un objet Python quelconque. + Le format dict est un dictionnaire Python. + Le format exec est un texte source Python qui peut etre execute. + + La methode readfile a pour fonction de lire un fichier dont le + nom est passe en argument de la fonction. + - convertisseur.readfile(nom_fichier) + + La methode convert a pour fonction de convertir le fichier + prealablement lu dans un objet du format passe en argument. + - objet=convertisseur.convert(outformat) + + Ce convertisseur supporte le format de sortie exec + +""" +import sys,string,traceback + +import parseur_cas +from Noyau import N_CR +from Extensions.i18n import tr +from Extensions.eficas_exception import EficasException + +def entryPoint(): + """ + Retourne les informations necessaires pour le chargeur de plugins + Ces informations sont retournees dans un dictionnaire + """ + return { + # Le nom du plugin + 'name' : 'TELEMAC', + # La factory pour creer une instance du plugin + 'factory' : PythonParser, + } + + +class PythonParser: + """ + Ce convertisseur lit un fichier au format python avec la + methode readfile : convertisseur.readfile(nom_fichier) + et retourne le texte au format outformat avec la + methode convertisseur.convert(outformat) + + Ses caracteristiques principales sont exposees dans 2 attributs + de classe : + - extensions : qui donne une liste d'extensions de fichier preconisees + - formats : qui donne une liste de formats de sortie supportes + """ + # Les extensions de fichier preconisees + extensions=('.py',) + # Les formats de sortie supportes (eval dict ou exec) + # Le format exec est du python executable (commande exec) converti avec PARSEUR_PYTHON + # Le format execnoparseur est du python executable (commande exec) non converti + formats=('exec','execnoparseur') + + def __init__(self,cr=None): + # Si l'objet compte-rendu n'est pas fourni, on utilise le + # compte-rendu standard + self.text='' + if cr : + self.cr=cr + else: + self.cr=N_CR.CR(debut='CR convertisseur format python', + fin='fin CR format python') + + def readfile(self,filename): + self.filename=filename + try: + self.text=open(filename).read() + except: + self.cr.exception(tr("Impossible d'ouvrir le fichier %s" ,str(filename))) + self.cr.fatal(tr("Impossible d'ouvrir le fichier %s" ,str(filename))) + return + + def convert(self,outformat,appli=None): + print "je passe la" + if outformat == 'exec': + #try: + if 1: + print parseur_cas.PARSEUR_CAS + return parseur_cas.PARSEUR_CAS(self.text).get_texte(appli) + else : + #except EficasException: + # Erreur lors de la conversion + l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1], + sys.exc_info()[2]) + self.cr.exception(tr("Impossible de convertir le fichier Python qui doit contenir des erreurs.\n\ + On retourne le fichier non converti. Prevenir la maintenance.\n\n %s", string.join(l))) + # On retourne neanmoins le source initial non converti (au cas ou) + return self.text + elif outformat == 'execnoparseur': + return self.text + else: + raise EficasException(tr("Format de sortie : %s, non supporte", outformat)) + return None diff --git a/convert/enumTelemac.py b/convert/enumTelemac.py new file mode 100644 index 00000000..26a4f524 --- /dev/null +++ b/convert/enumTelemac.py @@ -0,0 +1,11 @@ +dicoEnum = { 'Type_Of_Advection' : { '1' : "'characteristics'", '2' : "'SUPG'", '3' : "'Conservative N-scheme'" ,\ + '4' : "'Conservative N-scheme'" , '5' : "'Conservative PSI-scheme'" , \ + '6' : "'Non conservative PSI scheme'" , '7' : "'Implicit non conservative N scheme'" ,\ + '13': "' Edge-based N-scheme'", '14': "'Edge-based N-scheme'"}, + 'Solver' :{ '1': "'conjugate gradient'", '2': "'conjugate residual'", '3': "'conjugate gradient on a normal equation'",\ + '4': "'minimum error'", '5' :"'conjugate gradient squared (not implemented)'",\ + '6': "'cgstab'", '7': "'gmres'" , '8': "'direct'" } , + 'Discretisations_In_Space' : { "11;11":"linear for velocity and depth", \ + "12;11" : "quasi-bubble-velocity and linear depth", \ + "13;11 ": "quadratic velocity and linear depth" }, + } diff --git a/convert/parseur_cas.py b/convert/parseur_cas.py new file mode 100644 index 00000000..56f40e74 --- /dev/null +++ b/convert/parseur_cas.py @@ -0,0 +1,342 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2013 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +import sys,string,re +import traceback +from Extensions.i18n import tr +import Accas + +# mot cles a traiter : Discretisations_In_Space +from enumTelemac import dicoEnum + +escapedQuotesRE = re.compile(r"(\\\\|\\\"|\\\')") +stringsAndCommentsRE = \ + re.compile(u"(\"\"\".*?\"\"\"|'''.*?'''|\"[^\"]*\"|\'[^\']*\'|#.*?\n)", re.DOTALL) +allchars = string.maketrans(u"", "") +allcharsExceptNewline = allchars[: allchars.index('\n')]+allchars[allchars.index('\n')+1:] +allcharsExceptNewlineTranstable = string.maketrans(allcharsExceptNewline, '*'*len(allcharsExceptNewline)) + +ordreEtapes=('INITIALIZATION', 'TIDE_PARAMETERS', 'INITIAL_STATE', 'NUMERICAL_PARAMETERS', 'PHYSICAL_PARAMETERS',) + +def maskStringsAndComments(src): + """Masque tous les caracteres de src contenus dans des commentaires ou des strings multilignes (triples + quotes et guillemets. + Le masquage est realise en remplacant les caracteres par des * + Attention : cette fonction doit etre utilisee sur un texte complet et pas ligne par ligne + """ + src = escapedQuotesRE.sub(u"**", src) + allstrings = stringsAndCommentsRE.split(src) + # every odd element is a string or comment + for i in xrange(1, len(allstrings), 2): + if allstrings[i].startswith(u"'''")or allstrings[i].startswith('"""'): + allstrings[i] = allstrings[i][:3]+ \ + allstrings[i][3:-3].translate(allcharsExceptNewlineTranstable)+ \ + allstrings[i][-3:] + else: + allstrings[i] = allstrings[i][0]+ \ + allstrings[i][1:-1].translate(allcharsExceptNewlineTranstable)+ \ + allstrings[i][-1] + + return "".join(allstrings) + + +implicitContinuationChars = (('(', ')'), ('[', ']'), ('{', '}')) +linecontinueRE = re.compile(r"\\\s*(#.*)?$") +emptyHangingBraces = [0,0,0,0,0] + +class ParserException(Exception): pass +class FatalError(Exception): pass + +# ligne commençant par / +pattern_commentaireTelemac = re.compile(r"^\s*/.*") +# ligne commençant par & +pattern_eperluetteTelemac = re.compile(r"^&.*") +#commentaire double precede d'un nombre quelconque de blancs (pas multiligne) +pattern_2comments = re.compile(r"^\s*##.*") +#commentaire standard precede d'un nombre quelconque de blancs (pas multiligne) +pattern_comment = re.compile(r"^\s*#.*") +#fin de ligne ; suivi d'un nombre quelconque de blancs (pas multiligne) +pattern_fin = re.compile(r"; *$") +#pattern pour supprimer les blancs, tabulations et fins de ligne +pattern_blancs = re.compile(r"[ \t\r\f\v]") +#pattern_blancs = re.compile(r"[\s\n]") +number_kw_pattern=re.compile(r""" +( + #groupe nombre decimal + (?: + #signe : on ignore le signe + + [-]? + #groupe (avec ?: n'apparait pas en tant que groupe dans le resultat) + (?: + #mantisse forme entiere.fractionnaire + \d+(?:\.\d*)? + | + #ou forme .fractionnaire + \.\d+ + ) + (?:[eE][+-]?\d+)? + ) + | + #argument keyword + [a-zA-Z_]\w*= +) +""",re.VERBOSE|re.MULTILINE) + +def construit_genea(texte,liste_mc): + """ + Retourne un dictionnaire dont les cles sont des reels et les valeurs sont leurs representations textuelles. + + Realise un filtrage sur les reels : + + - Ne garde que les reels pour lesquels str ne donne pas une bonne representation. + - Ne garde que les reels derriere un argument keyword dont le nom est dans liste_mc + + >>> s = '''a=+21.3e-5*85,b=-.1234,c=81.6 , d= -8 , e=_F(x=342.67,y=-1), f=+1.1, g=(1.3,-5,1.54E-3), + ... #POMPE_PRIMA._BOUCLE_N._2_ELEMENT_NUMERO:0239 + ... h=_F(x=34.6,y=-1)''' + >>> construit_genea(s,['a','x']) + {0.000213: '21.3e-5'} + """ + d={} + mot="" + #on masque les strings et commentaires pour ne pas identifier de faux reels + for m in number_kw_pattern.findall(maskStringsAndComments(texte)): + if m[-1] == '=': + #argument keyword + mot=m[:-1] + else: + if mot not in liste_mc:continue + #valeur + key=eval(m) + if str(key) != m: d[key]=m + return d + + +ListeMCAExclure=("Computation_Continued",) +DicoMCAExclureSiValeur={"Computation_Continued" : "NO"} +ListeMCARecalculer=('tt',) +DicoMCARecalculerSiValeur={"Computation_Continued" : "YES"} +DicoMCAReformater = {"Variables_For_Graphic_Printouts": "texteEnListe", \ + "Solver" : "remplaceEnum" } +DicoPlusieursMC = {"Type_Of_Advection": "decoupeAdvection" ,\ + } + +class PARSEUR_CAS: + + + pattern_ligne_vide = re.compile(r'^[\t\r\f\v\n]+') + + def __init__(self,texte): + self.texte = texte + self.l_objets=None + self.appli=None + + def get_texte(self,appli=None): + """ + Retourne le texte issu de l'analyse + """ + self.appli=appli + self.dicoInverse=self.appli.readercata.dicoInverse + + try: + self.analyse() + txt=self.texteComm + except ParserException: + #Impossible de convertir le texte, on le retourne tel que + txt=self.texte + return txt + + def analyse(self): + """ + Eclate la chaine self.texte en self.l_objets une liste lignes d'instructions + et de commentaires (parmi lesquels des instructions "commentarisées"). + """ + l_lignes = string.split(self.texte,'\n') + affectation_courante = None + self.l_objets = [] + + #Masquage des commentaires et strings multilignes + #srcMasked=maskStringsAndComments('\n'.join(l_lignes)) + #print srcMasked + #masked_lines=srcMasked.split('\n') + + lineno=0 + self.listeNomValeur=[] + for ligne in l_lignes : + #line=masked_lines[lineno] + lineno=lineno+1 + + if string.strip(ligne) == '': continue + if pattern_commentaireTelemac.match(ligne) : continue + if pattern_eperluetteTelemac.match(ligne) : continue + # On remplace les : par un = + # On s assure que les = soient entoures d espace + # On remplace les espaces successifs par un seul + # On enleve les blancs en debut et fin de ligne + # On remplace les ' ; ' par des ; + ligne=ligne.replace(':','=') + ligne=ligne.replace('=',' = ') + ligne=re.sub(r';\s*',';',ligne) + ligne=re.sub(r'\s*;',';',ligne) + ligne=re.sub(r' \s*',' ',ligne) + ligne=re.sub(r'^\s','',ligne) + ligne=re.sub(r'\s$','',ligne) + listeMot=ligne.split(" ") + while listeMot != [] : + nom,listeMot = self.construitNom(listeMot) + valeur,listeMot = self.construitValeur(listeMot) + bTraite, nom, valeur =self.verifieNom(nom,valeur) + if bTraite : self.listeNomValeur.append((nom, valeur)) + self.construitTexteFinal() + + + def construitNom(self,liste): + nomEficas='' + index=0 + for mot in liste : + index+=1 + if mot in (":","=") : break + motE=mot[0].upper()+mot[1:].lower() + nomEficas+=motE+'_' + nouveauNom=nomEficas[0:-1].replace('-','_') + nouvelleListe=liste[index:] + return nouveauNom,nouvelleListe + + def construitValeur(self,liste): + index=0 + if liste[0][0]=="'" : + valeur='' + for mot in liste : + index+=1 + valeur+=str(mot)+" " + if mot[-1]=="'": + valeur=valeur[0:-1] + break + elif liste[0].find(';') > -1 : + valeur=liste[0].split(';') + index=1 + else : + valeur=liste[0] + index=1 + nouvelleListe=liste[index:] + return valeur,nouvelleListe + + + def verifieNom(self,nom,valeur): + if nom in ListeMCAExclure : return (False, nom, valeur) + if nom in DicoMCAExclureSiValeur.keys() : + if valeur != DicoMCAExclureSiValeur[nom] : print "prevoir Traitement pour ", nom, valeur + return (False, nom, valeur) + + bTrue=True + if nom in DicoMCAReformater.keys() : + bTrue,nom,valeur=apply(PARSEUR_CAS.__dict__[DicoMCAReformater[nom]],(self,nom,valeur)) + if nom in DicoPlusieursMC.keys() : + bTrue,nom,valeur=apply(PARSEUR_CAS.__dict__[DicoPlusieursMC[nom]],(self,nom,valeur)) + return (bTrue,nom,valeur) + if nom not in self.dicoInverse.keys() : + print "******** ", nom, " non encore connu ***********" + bTrue=False + return (bTrue, nom, valeur) + + def remplaceEnum(self,nom,valeur): + newValeur=dicoEnum[nom][valeur] + return (True,nom,newValeur) + + + + def texteEnListe(self,nom,valeur): + print "je passe dans decoupeEnListe pour ", nom,valeur + v1=re.sub(r'^\'','',valeur) + v2=re.sub(r'\'$','',v1) + newValeur=v2.split(',') + return (True,nom,newValeur) + + def decoupeAdvection(self,nom,valeur): + # on met a jour la liste des valeurs ici : il y a plusieurs MC calcule + print "je passe dans decoupeAdvection pour",nom,valeur + self.listeNomValeur.append(('Advection_Of_U_And_V',True)) + v=dicoEnum['Type_Of_Advection'][valeur[0]] + self.listeNomValeur.append(('Type_Of_Advection_U_And_V',v) ) + if len(valeur)==1: return (False,nom,valeur) + + self.listeNomValeur.append(('Advection_Of_H',True)) + v=dicoEnum['Type_Of_Advection'][valeur[1]] + self.listeNomValeur.append(('Type_Of_Advection_H',v)) + if len(valeur)==2: return (False,nom,valeur) + + self.listeNomValeur.append(('Advection_Of_Tracers',True)) + v=dicoEnum['Type_Of_Advection'][valeur[2]] + self.listeNomValeur.append(('Type_Of_Advection_Tracers',v)) + if len(valeur)==3: return (False,nom,valeur) + + self.listeNomValeur.append(('Advection_Of_K_And_Epsilon',True)) + v=dicoEnum['Type_Of_Advection'][valeur[3]] + self.listeNomValeur.append(('Type_Of_Advection_K_And_Epsilon',v)) + # on retourne False, l append est deja fait + return (False,nom,valeur) + + def construitTexteFinal(self): + self.dicoTexte={} + self.dicoNature={} + print self.listeNomValeur + for nomMC,valeur in self.listeNomValeur: + mc,objmc=self.dicoInverse[nomMC][0] + if nomMC=="Solver_Option" : print self.dicoInverse[nomMC][0] + self.dicoNature[mc]=objmc + liste=self.dicoInverse[nomMC][1:] + liste.reverse() + dico=self.dicoTexte + for (nom,obj) in liste: + if isinstance(obj,Accas.A_BLOC.BLOC) : + continue + self.dicoNature[nom]=obj + if not(isinstance(obj,Accas.A_PROC.PROC)) and not(isinstance(obj,Accas.A_FACT.FACT)) : + print "******** ", nom,obj, "********" + continue + if not nom in dico.keys(): dico[nom]={} + dico=dico[nom] + dico[nomMC]=valeur + self.texteComm="" + for etape in ordreEtapes : + print etape + if etape in self.dicoTexte.keys(): + self.texteComm+=etape+"(" + self.traiteEtape(self.dicoTexte[etape]) + self.texteComm+=");\n" + print self.texteComm + + def traiteEtape(self,dico): + for mc in dico.keys() : + valeur=dico[mc] + if isinstance(self.dicoNature[mc],Accas.A_SIMP.SIMP): + if 'TXM' in self.dicoNature[mc].type and valeur[0] !="'" : valeur="'"+valeur + if 'TXM' in self.dicoNature[mc].type and valeur[-1] !="'" : valeur=valeur+"'" + if 'Fichier' in self.dicoNature[mc].type and valeur[0] !="'" : valeur="'"+valeur + if 'Fichier' in self.dicoNature[mc].type and valeur[-1] !="'" : valeur=valeur+"'" + if 'Repertoire' in self.dicoNature[mc].type and valeur[0] !="'" : valeur="'"+valeur + if 'Repertoire' in self.dicoNature[mc].type and valeur[-1] !="'" : valeur=valeur+"'" + print self.dicoNature[mc].type + #self.texteComm+=mc+" = '"+str(valeur)+"'," + #else : self.texteComm+=mc+" = "+str(valeur)+"," + self.texteComm+=mc+" = "+str(valeur)+"," + continue + self.texteComm+=mc+"=_F(" + self.traiteEtape(valeur) + self.texteComm+="),\n" diff --git a/generator/Formatage.py b/generator/Formatage.py index 431345d7..d229d7ea 100644 --- a/generator/Formatage.py +++ b/generator/Formatage.py @@ -281,3 +281,28 @@ class Formatage : s=s+'\n'+texte return s + +class FormatageLigne(Formatage) : + def __init__(self,l_jdc,code=None,mode=None,sep='=',l_max="**"): + Formatage.__init__(self,l_jdc,code=None,mode=None,sep='=',l_max="**") + + def formate_jdc(self): + texte1=Formatage.formate_jdc(self) + newText="" + lignes=texte1.split("\n") + texte="" + pattern_debut_blanc = re.compile(r"^ \s*.*") + pattern_commentaire = re.compile(r"^\s*#.*") + pattern_vide=re.compile(r"\s*^$") + for l in lignes : + if pattern_commentaire.match(l) or pattern_vide.match(l): + newText+=l+"\n" + continue + if not pattern_debut_blanc.match(l) : texte=l + else : texte+=re.sub(r'^ \s*',' ',l) + if texte[-1]==";" : + newText+=texte+"\n" + texte="" + return newText + + -- 2.39.2