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)
QTreeWidget.__init__(self, None )
self.item = jdc_item
self.tree = self
- self.editor = QWParent
self.appliEficas = self.editor.appliEficas
self.childrenComplete=[]
self.childrenIssusDesBlocs=[]
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()
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()
#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)
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
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
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()
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
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 "______________________________"
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
# 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
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):
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()
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()
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
# 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()
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 --------------
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
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 )
#---------------------#
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()
#---------------------#
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.
"""
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:
.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))
#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.
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:
return (1, self.fichier)
#
+
+ #----------------------------------------------#
+ def sauveLigneFile(self):
+ #----------------------------------------------#
+ self.modified=1
+ return self.saveFile(formatLigne="Ligne")
+
+
#----------------------------------------------#
def saveFileAs(self, path = None,fileName=None):
#----------------------------------------------#
if fileName != None :
self.fichier = fileName
return self.saveFile()
- return self.saveFile(path,1)
+ return self.saveFile(path,1,"beautifie")
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)
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()
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()
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):
"""
"""
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("")
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)
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())
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()
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)
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):
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()
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()
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)
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)
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)
if msg != "":
QMessageBox.warning(self, tr(u"Erreur"), msg)
+ def sauveLigne(self):
+ return self.viewmanager.sauveLigneCurrentEditor()
+
def fileSave(self):
return self.viewmanager.saveCurrentEditor()
self.fic_cata=None
self.OpenCata()
self.cataitem=None
+ if self.code=="TELEMAC": self.cree_dico_inverse()
def OpenCata(self):
"""
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
+
+
+
+
+
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]
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',
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.",
),
), # fin Formatted_And_Binary_Files
-), # Fin de InputFile
+ ), # Fin de InputFile
Computation_Continued=FACT( statut='f',
),
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),
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),
),
),
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]),
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
), # 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',
#???? 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)'],
),
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'],
),
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\
),
),
+ 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.',
), # 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'),
), # 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',
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\
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.'
),
# 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',)
),
),
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',)
),
),
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',)
),
),
),
),
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,
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,),
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
),
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',
),
) # 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
--- /dev/null
+# -*- 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
--- /dev/null
+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" },
+ }
--- /dev/null
+# -*- 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"
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
+
+