From 674fe85da8226fef3d755db16d94111e2ce59581 Mon Sep 17 00:00:00 2001 From: PASCALE NOYRET Date: Fri, 20 May 2022 15:29:02 +0200 Subject: [PATCH] 1er sauvegarde UQ --- Ihm/I_ENTITE.py | 2 - Ihm/I_MCCOMPO.py | 13 ++- Ihm/I_MCSIMP.py | 13 +++ Ihm/I_OBJECT.py | 41 +++++++- InterfaceQT4/browser.py | 10 +- InterfaceQT4/composimp.py | 3 + InterfaceQT4/configuration.py | 4 +- InterfaceQT4/editor.py | 40 ++++++- InterfaceQT4/editorSsIhm.py | 16 ++- InterfaceQT4/eficas_go.py | 4 +- InterfaceQT4/feuille.py | 11 +- InterfaceQT4/monWidgetCB.py | 27 ++++- InterfaceQT4/monWidgetFact.py | 7 +- InterfaceQT4/monWidgetSimpBase.py | 9 +- InterfaceQT4/qtEficas.py | 14 ++- InterfaceQT4/readercata.py | 3 + InterfaceQT4/viewManager.py | 8 ++ InterfaceQT4/viewManagerSsIhm.py | 3 + Noyau/N_MCCOMPO.py | 2 +- Noyau/N_MCSIMP.py | 6 +- Noyau/N_SIMP.py | 2 +- generator/generator_UQ.py | 167 ++++++++++++++++++++++++++++++ generator/textePersalys.py | 60 +++++++++++ generator/wrapper_Accas.py | 2 + 24 files changed, 425 insertions(+), 42 deletions(-) create mode 100644 generator/generator_UQ.py create mode 100644 generator/textePersalys.py create mode 100644 generator/wrapper_Accas.py diff --git a/Ihm/I_ENTITE.py b/Ihm/I_ENTITE.py index 97ca3ce1..8e6e2e26 100644 --- a/Ihm/I_ENTITE.py +++ b/Ihm/I_ENTITE.py @@ -74,5 +74,3 @@ class ENTITE: return mcs # - def UQPossible(self): - return True diff --git a/Ihm/I_MCCOMPO.py b/Ihm/I_MCCOMPO.py index c7cf0d25..c322aa8c 100644 --- a/Ihm/I_MCCOMPO.py +++ b/Ihm/I_MCCOMPO.py @@ -43,7 +43,7 @@ class MCCOMPO(I_OBJECT.OBJECT): """ return tr(self.nom) - def getListeMcOrdonnee(self,liste,dico): + def getListeMcOrdonnee(self,liste,dico,avecCache=True): """ Retourne la liste ordonnee (suivant le catalogue) des mots-cles d'une entite composee dont le chemin complet est donne sous forme @@ -51,7 +51,7 @@ class MCCOMPO(I_OBJECT.OBJECT): il faut encore rearranger cette liste (certains mots-cles deja presents ne doivent plus etre proposes, regles ...) """ - return self.filtreListeMc(self.getListeMcOrdonneeBrute(liste,dico)) + return self.filtreListeMc(self.getListeMcOrdonneeBrute(liste,dico,avecCache=avecCache)) def getListeMcOrdonneeBrute(self,liste,dico): """ @@ -72,7 +72,7 @@ class MCCOMPO(I_OBJECT.OBJECT): if specifique == 1 : return l return objet_cata.ordre_mc - def filtreListeMc(self,liste_brute): + def filtreListeMc(self,liste_brute,avecCache=True): """ Cette methode est appelee par EFICAS afin de presenter a l'utilisateur la liste des enfants possibles de self actualisee @@ -80,6 +80,7 @@ class MCCOMPO(I_OBJECT.OBJECT): liste des possibles (fournie par la definition), les mots-cles exclus par les regles de self et les mots-cles ne pouvant plus etre repetes + si avecCache=False on n inclut pas les MC dont le statut = cache """ liste = copy(liste_brute) listeMcPresents = self.listeMcPresents() @@ -105,11 +106,13 @@ class MCCOMPO(I_OBJECT.OBJECT): # un mot-cle facteur ne peut pas etre repete plus de self.max fois if objet.definition.max == 1: liste.remove(k) + if not avecCache and objet.definition.statut in ('c','d','cache'): liste.remove(k) elif isinstance(objet,MCList): try : nb_occur_maxi = objet[0].definition.max if len(objet) >= nb_occur_maxi: liste.remove(k) + if not avecCache and objet[0].definition.statut=='cache': liste.remove(k) except: pass else : @@ -117,7 +120,7 @@ class MCCOMPO(I_OBJECT.OBJECT): if CONTEXT.debug : print(' ',k,' est un objet de type inconnu :',type(objet)) else : # l'objet est absent : on enleve de la liste les blocs - if self.definition.entites[k].statut=='c' : + if self.definition.entites[k].statut=='c' or self.definition.entites[k].statut=='cache' : liste.remove(k) if self.definition.entites[k].label=='BLOC': liste.remove(k) @@ -131,10 +134,12 @@ class MCCOMPO(I_OBJECT.OBJECT): # un mot-cle facteur ne peut pas etre repete plus de self.max fois if objet.definition.max > 1: liste.append(k) + if not avecCache and objet.definition.statut=='cache': liste.remove(k) elif isinstance(objet,MCList): nb_occur_maxi = objet[0].definition.max if len(objet) < nb_occur_maxi: liste.append(k) + if not avecCache and objet[0].definition.statut=='cache': liste.remove(k) return liste def listeMcPresents(self): diff --git a/Ihm/I_MCSIMP.py b/Ihm/I_MCSIMP.py index 159c8f67..6d45ce9f 100644 --- a/Ihm/I_MCSIMP.py +++ b/Ihm/I_MCSIMP.py @@ -883,3 +883,16 @@ class MCSIMP(I_OBJECT.OBJECT): leMotCle.demandeRedessine() print ('fin updateAutresMotsClefs') + + def UQPossible(self): + # Plus facile de mettre cette methode dans le SIMP, car on connait son nom + if not hasattr(self.cata,'dictUQ') : return False + if self.nom in self.cata.dictUQ.keys() : return True + return False + + def isUQActivate(self): + # valide uniquement pour les MCSIMP + # a reflechir a la relecture du .comm + return False + + diff --git a/Ihm/I_OBJECT.py b/Ihm/I_OBJECT.py index 5a2c2701..6bdf4f5a 100644 --- a/Ihm/I_OBJECT.py +++ b/Ihm/I_OBJECT.py @@ -192,9 +192,44 @@ class OBJECT: #print ('demandeRedessine pour', self.nom, self, tout) CONNECTOR.Emit(self,"redessine") - def isUQActivate(self): - # valide uniquement pour les MCSIMP - return True + def ajouteAuxIncertains(self): + + etapeIncertitude=self.jdc.getEtapesByName('ExpressionIncertitude') + if etapeIncertitude == [] : + self.jdc.editor.tree.racine.appendChild('ExpressionIncertitude', 'last') + etapeIncertitude=self.jdc.getEtapesByName('ExpressionIncertitude') + etapeIncertitude=etapeIncertitude[0] + incertitudeInput = etapeIncertitude.getChildOrChildInBloc('Input') + nodeVariableProbabiliste=incertitudeInput.node.appendChild('VariableProbabiliste', 'first') + # le buildChildren a une mcliste --> on est oblige de mettre first mais en fait c est last + if nodeVariableProbabiliste.item.object.nature=='MCFACT' : + newVariable=nodeVariableProbabiliste.item.object + else : + newVariable=nodeVariableProbabiliste.item.object[-1] + newVariable.variableDeterministe = self + + itemModelVariable=newVariable.getChild('ModelVariable') + itemModelVariable.setValeur(self.nom) + + itemConsigne=newVariable.getChild('Consigne') + itemConsigne.setValeur('la valeur entrée pour {} est {}'.format(self.nom, self.valeur)) + + itemXPath=newVariable.getChild('xPathVariable') + #itemXPath.reparent(newVariable) + itemXPath.setValeur(self.getGenealogiePrecise()) + #print (itemXPath) + + self.variableProbabiliste=nodeVariableProbabiliste.item + self.definition.siValide = self.changeValeursRefUQ + + def changeValeursRefUQ (self, motClef): + if not hasattr(motClef,'variableProbabiliste') : print ('pb ds changeValeursRefUQ'); return + itemConsigne=motClef.variableProbabiliste.getChild('Consigne') + itemConsigne.setValeur('la valeur entrée pour {} est {}'.format(motClef.nom, motClef.valeur)) + motClef.variableProbabiliste.valeurProbabiliste=motClef.valeur + + def enleveDesIncertains(self): + print ('pas encore programme') class ErrorObj(OBJECT):pass diff --git a/InterfaceQT4/browser.py b/InterfaceQT4/browser.py index 8a9721e7..edfe9c5e 100644 --- a/InterfaceQT4/browser.py +++ b/InterfaceQT4/browser.py @@ -152,7 +152,7 @@ class JDCTree( QTreeWidget,GereRegles ): def handleOnItem(self,item,int): #---------------------------------- - #print ("je passe dans handleOnItem pour ",self, item.item.nom, item, item.item, item.item.getLabelText()) + print ("je passe dans handleOnItem pour ",self, item.item.nom, item, item.item, item.item.getLabelText()) from InterfaceQT4 import composimp self.inhibeExpand = True @@ -214,6 +214,8 @@ class JDCNode(QTreeWidgetItem,GereRegles): #---------------------------------------------------------------------- #print ("creation d'un noeud : ", item, " ",item.nom,"", treeParent, self) #self.a=0 + #if item.nom == 'ExpressionIncertitude': + # print ("creation d'un noeud : ", item, " ",item.nom,"", treeParent, self) self.item = item @@ -225,6 +227,7 @@ class JDCNode(QTreeWidgetItem,GereRegles): self.JESUISOFF = 0 self.firstAffiche = True self.childrenComplete=[] + self.item._object.node = self from InterfaceQT4 import compocomm @@ -269,7 +272,7 @@ class JDCNode(QTreeWidgetItem,GereRegles): self.treeParent.childrenComplete.append(self) - if (isinstance(self,compobloc.Node) or (isinstance(self,compomclist.Node) and self.item.isMCList()) or ( hasattr(self.item.parent,'inhibeValidator') and isinstance(self,compomclist.Node) and self.item.parent.inhibeValidator)) : + if (isinstance(self,compobloc.Node) or (isinstance(self,compomclist.Node) and self.item.isMCList()) or ( hasattr(self.item.parent,'inhibeValidator') and isinstance(self,compomclist.Node) and self.item.parent.inhibeValidator) or (isinstance(self,composimp.Node) and self.item.definition.statut in ('c','d'))) : # Le dernier or ne sert que lorsqu'on est en train de creer une liste par les validator QTreeWidgetItem.__init__(self,None,mesColonnes) else : @@ -574,9 +577,6 @@ class JDCNode(QTreeWidgetItem,GereRegles): Si pos vaut None, on le place a la position du catalogue. """ #print ("************** appendChild ",self.item.getLabelText(), pos, plier) - #import traceback - #traceback.print_stack() - self.editor.initModif() if pos == 'first' : index = 0 diff --git a/InterfaceQT4/composimp.py b/InterfaceQT4/composimp.py index 79556d1e..4e5ae9e7 100644 --- a/InterfaceQT4/composimp.py +++ b/InterfaceQT4/composimp.py @@ -51,6 +51,9 @@ class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal): monObjet=self.item.object monNom=self.item.nom + # le mot clef est cache ou cache avec defaut + if maDefinition.statut in ('c','d') : return None + # label informatif if monObjet.isInformation(): from InterfaceQT4.monWidgetInfo import MonWidgetInfo diff --git a/InterfaceQT4/configuration.py b/InterfaceQT4/configuration.py index cae7add4..3b0c605d 100644 --- a/InterfaceQT4/configuration.py +++ b/InterfaceQT4/configuration.py @@ -140,8 +140,8 @@ class configBase(object): self.withXSD=False self.afficheIhm=True - self.afficheUQ=False - #self.afficheUQ=True + #self.afficheUQ=False + self.afficheUQ=True diff --git a/InterfaceQT4/editor.py b/InterfaceQT4/editor.py index cee7154e..dae0115c 100755 --- a/InterfaceQT4/editor.py +++ b/InterfaceQT4/editor.py @@ -882,7 +882,45 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget): self.appliEficas.setWindowTitle(nouveauTitre) return (1, self.fichier) -# + + #-----------------------------------------------# + def saveUQFile(self, fichier = None, path =None): + #------------------------------------------------# + if self.fichier is None : + if path is None: path=self.maConfiguration.savedir + bOK, fn=self.determineNomFichier(path,'comm') + if bOK == 0 : return (0, None) + if fn == None : return (0, None) + if fn== '' : return (0, None) + ulfile = os.path.abspath(fn) + self.appliEficas.maConfiguration.savedir=os.path.split(ulfile)[0] + fn = QDir.toNativeSeparators(fn) + else : fn = self.fichier + + if self.jdc.isValid() == 0 : + msgBox = QMessageBox(None) + msgBox.setWindowTitle(tr("Fichier invalide / incomplet")) + msgBox.setText(tr("Le fichier .comm est invalide / incomplet")) + msgBox.addButton(tr("&Sauvegarder le .comm"),0) + msgBox.addButton(tr("&Quitter sans sauvegarder"),1) + msgBox.addButton(tr("&Annuler"),2) + res=msgBox.exec_() + if res == 2 : return (0, None) + if res == 0 : + ret, fichier = JDCEditorSsIhm.saveFile (self,fn) + if ret : self.fichier = fichier + if self.salome and ret: + self.appliEficas.addJdcInSalome( self.fichier) + return (1, self.fichier) + if self.appliEficas.salome : self.appliEficas.close() + else : sys.exit(1) + + if not JDCEditorSsIhm.saveUQFile (self,fn): + msgBox = QMessageBox(None) + titre = 'Probleme de sauvegarde fichier UQ' + texte = 'Impossible de sauvegarder {}'.format(fn) + QMessageBox.information( self, titre,texte) + return (1, self.fichier) #----------------------------------------------# def sauveLigneFile(self): diff --git a/InterfaceQT4/editorSsIhm.py b/InterfaceQT4/editorSsIhm.py index 259746eb..8746dbd2 100755 --- a/InterfaceQT4/editorSsIhm.py +++ b/InterfaceQT4/editorSsIhm.py @@ -552,10 +552,24 @@ class JDCEditorSsIhm : #-----------------------------------------------------------------# fn = fichier self.generator=generator.plugins[self.format]() - print (self.generator) + #print (self.generator) if hasattr(self.generator, "writeComplet"): self.generator.writeComplet(fichier,self.jdc,config=self.appliEficas.maConfiguration,appliEficas=self.appliEficas) + #-----------------------------------# + def saveUQFile(self, fichier = None): + #------------------------------------# + if fichier == None : print ("nom de fichier obligatoire pour sauvegarde"); return + self.generator=generator.plugins['UQ']() + ret = self.generator.gener(self.jdc) + if not ret : + self.informe('Sauvegarde UQ', self.generator.commentaire) + return (ret, self.generator.commentaire) + self.fichier=fichier + ret = self.generator.writeUQ(fichier) + if not ret : self.informe('Sauvegarde UQ', self.generator.commentaire) + print ('ok') + return ret # --------------------------------------------- # Methodes Surchargees par avecIhm diff --git a/InterfaceQT4/eficas_go.py b/InterfaceQT4/eficas_go.py index 308aa513..3c82b02d 100755 --- a/InterfaceQT4/eficas_go.py +++ b/InterfaceQT4/eficas_go.py @@ -214,11 +214,11 @@ def validateDataSet(code=None): if code != None : options.code = code if options.fichierCata == None : print ('Use -c cata_name.py') - return + return 1 fichier=options.comm[0] if fichier==None : print ('comm file is needed') - return + return 1 from .editorSsIhm import JDCEditorSsIhm monEficasSsIhm = getEficasSsIhm(code=options.code) monEditeur=JDCEditorSsIhm(monEficasSsIhm,fichier) diff --git a/InterfaceQT4/feuille.py b/InterfaceQT4/feuille.py index 52a21983..85259984 100644 --- a/InterfaceQT4/feuille.py +++ b/InterfaceQT4/feuille.py @@ -81,7 +81,8 @@ class Feuille(QWidget,ContientIcones,SaisieValeur,FacultatifOuOptionnel): self.setZoneInfo() self.setUnite() #inhibition incertitude - if hasattr(self,'checkBoxUQ') : self.checkBoxUQ.close() + #if hasattr(self,'checkBoxUQ') : self.checkBoxUQ.close() + self.setUQ() def setUnite(self): @@ -95,12 +96,18 @@ class Feuille(QWidget,ContientIcones,SaisieValeur,FacultatifOuOptionnel): if not (self.editor.appliEficas.maConfiguration.afficheUQ) and hasattr(self,'checkBoxUQ') : self.checkBoxUQ.close() return - if not self.monSimpDef.UQPossible(): + if not self.objSimp.UQPossible() and hasattr(self,'checkBoxUQ'): self.checkBoxUQ.close() return + if not self.objSimp.UQPossible() : return + self.checkBoxUQ.toggled.connect(self.setEnabledUQ) if self.objSimp.isUQActivate() and hasattr(self,'checkBoxUQ') : self.checkBoxUQ.setChecked(True) + def setEnabledUQ(self) : + if self.checkBoxUQ.isChecked() : self.objSimp.ajouteAuxIncertains() + else : self.objSimp.enleveDesIncertains() + def setNom(self): self.debutToolTip="" nomTraduit=tr(self.objSimp.nom) diff --git a/InterfaceQT4/monWidgetCB.py b/InterfaceQT4/monWidgetCB.py index 410df3a1..ba0cf8e4 100644 --- a/InterfaceQT4/monWidgetCB.py +++ b/InterfaceQT4/monWidgetCB.py @@ -52,6 +52,12 @@ class MonWidgetCBCommun (Feuille): def setValeursApresBouton(self): + #print (self.objSimp.getValeur()) + if self.node.item.definition.homo== 'constant' and self.objSimp.getValeur()==None : + self.CBChoix.addItem(tr("Choisir dans la partie probabiliste")) + self.CBChoix.setCurrentIndex(self.CBChoix.findText(tr("Choisir dans la partie probabiliste"))) + self.CBChoix.setEnabled(0) + return if self.objSimp.getValeur()==None : self.CBChoix.setCurrentIndex(-1) self.CBChoix.lineEdit().setText(tr("Select")) @@ -67,10 +73,23 @@ class MonWidgetCBCommun (Feuille): if not(type(choix) == str) : choix=str(choix) listeChoix.append(choix) self.CBChoix.addItem(choix) - self.CBChoix.setEditable(True) - monCompleteur=QCompleter(listeChoix,self) - monCompleteur.setCompletionMode(QCompleter.PopupCompletion) - self.CBChoix.setCompleter(monCompleteur) + if self.node.item.definition.homo== 'constant' : + self.CBChoix.setEnabled(0) + if self.objSimp.getValeur() != None : + self.CBChoix.setStyleSheet(("\n" +"QComboBox {\n" +" border: 1px solid gray;\n" +" background: rgb(0,255,0);\n" +" color: rgb(24,24,7);\n" +" }\n" +"QComboBox::drop-down {\n" +" image: none; \n" +" }")) + else : + self.CBChoix.setEditable(True) + monCompleteur=QCompleter(listeChoix,self) + monCompleteur.setCompletionMode(QCompleter.PopupCompletion) + self.CBChoix.setCompleter(monCompleteur) def choixSaisi(self): self.CBChoix.lineEdit().setStyleSheet(("\n" diff --git a/InterfaceQT4/monWidgetFact.py b/InterfaceQT4/monWidgetFact.py index 4441c215..b1157b6c 100644 --- a/InterfaceQT4/monWidgetFact.py +++ b/InterfaceQT4/monWidgetFact.py @@ -34,7 +34,7 @@ class MonWidgetFactCommun(Groupe): """ """ def __init__(self,node,editor,parentQt,definition, obj, niveau,commande): - #print ("fact : ",node.item.nom) + #print ("fact : ",node.item.nom , node.item.object.nature) Groupe.__init__(self,node,editor,parentQt, definition,obj,niveau,commande) labeltext,fonte,couleur = self.node.item.getLabelText() self.GroupBox.setText(tr(labeltext)) @@ -42,8 +42,11 @@ class MonWidgetFactCommun(Groupe): self.parentQt.commandesLayout.insertWidget(-1,self) self.doitAfficherOptionnel=True min,max=obj.getMinMax() - if max < 2 and hasattr(self, 'RBPlus') : self.RBPlus.close() if max > 1 and hasattr(self, 'RBPlus') : self.RBPlus.clicked.connect(self.ajouteMCParPB) + if max < 2 and hasattr(self, 'RBPlus') : self.RBPlus.close() + if max > 2 and obj.alt_parent.nature == 'MCList' and len(obj.alt_parent) >= max and hasattr(self, 'RBPlus') : self.RBPlus.close() + + if max > 2 and definition.statut == 'cache' and hasattr(self, 'RBPlus') : self.RBPlus.close() def enterEvent(self,event): #print "enterEvent ", self.node.item.getLabelText()[0] diff --git a/InterfaceQT4/monWidgetSimpBase.py b/InterfaceQT4/monWidgetSimpBase.py index fae5cb3f..9f73d443 100644 --- a/InterfaceQT4/monWidgetSimpBase.py +++ b/InterfaceQT4/monWidgetSimpBase.py @@ -64,12 +64,11 @@ class MonWidgetSimpBase (Ui_WidgetSimpBase,Feuille): def setValeurs(self): - #print ("dans setValeurs") + self.oldValeurTexte='' self.politique=PolitiqueUnique(self.node,self.editor) valeur=self.node.item.getValeur() valeurTexte=self.politique.getValeurTexte(valeur) chaine="" - if valeurTexte != None : from decimal import Decimal if isinstance(valeurTexte,Decimal): @@ -77,10 +76,6 @@ class MonWidgetSimpBase (Ui_WidgetSimpBase,Feuille): elif repr(valeurTexte.__class__).find("PARAMETRE") > 0: chaine = repr(valeur) else : - #PN ???? - #try : - # chaine=QString("").setNum(valeurTexte) - #except : chaine=str(valeurTexte) self.oldValeurTexte=chaine self.lineEditVal.setText(chaine) @@ -110,6 +105,6 @@ class MonWidgetSimpBase (Ui_WidgetSimpBase,Feuille): if str(self.lineEditVal.text())=="" or str(self.lineEditVal.text())==None : return except : pass SaisieValeur.LEvaleurPressed(self) - self.parentQt.donneFocus() + #self.parentQt.donneFocus() self.setValeurs() self.reaffiche() diff --git a/InterfaceQT4/qtEficas.py b/InterfaceQT4/qtEficas.py index e92c4160..2975b309 100755 --- a/InterfaceQT4/qtEficas.py +++ b/InterfaceQT4/qtEficas.py @@ -155,8 +155,7 @@ class Appli(AppliSsIhm,Ui_Eficas,QMainWindow): #print ('attention try devient if 1') self.ouvreFichiers() except EficasException as exc: - #except: - print ("je suis dans le except") + print ("je suis dans le except", exc) if self.salome == 0 : exit() #self.adjustSize() @@ -250,6 +249,13 @@ class Appli(AppliSsIhm,Ui_Eficas,QMainWindow): self.demande=False self.fileNew() + def ajoutUQ(self): + self.menuUQ = self.menubar.addMenu(tr("Incertitude")) + self.actionUQ = QAction(self) + self.actionUQ.setText(tr("Sauve Incertitude")) + self.menuUQ.addAction(self.actionUQ) + self.actionUQ.triggered.connect(self.handleSortieUQ) + def ajoutN1(self): return self.menuN1 = self.menubar.addMenu(tr("Process Output")) @@ -427,6 +433,7 @@ class Appli(AppliSsIhm,Ui_Eficas,QMainWindow): self.connectRechercherDsCatalogue() self.ajoutSortieComplete() + def lookSuiteTelemac(self): self.enleverActionsStructures() self.enlevernewInclude() @@ -622,6 +629,9 @@ class Appli(AppliSsIhm,Ui_Eficas,QMainWindow): def handleDeplier(self): self.viewmanager.handleDeplier() + def handleSortieUQ(self): + self.viewmanager.handleSortieUQ() + def ajoutCommentaire(self): self.viewmanager.ajoutCommentaire() diff --git a/InterfaceQT4/readercata.py b/InterfaceQT4/readercata.py index 38656674..4a2a56a6 100644 --- a/InterfaceQT4/readercata.py +++ b/InterfaceQT4/readercata.py @@ -343,6 +343,9 @@ class ReaderCata (ReaderCataCommun): self.appliEficas.titre=self.titre self.QWParent.titre=self.titre + # incertitude ? + if hasattr(self.cata, 'avecIncertitude') and self.appliEficas.ssIhm == False: + self.appliEficas.ajoutUQ() def importCata(self,cata): """ diff --git a/InterfaceQT4/viewManager.py b/InterfaceQT4/viewManager.py index fffd16d8..70052ba4 100644 --- a/InterfaceQT4/viewManager.py +++ b/InterfaceQT4/viewManager.py @@ -88,6 +88,7 @@ class MyViewManager(object): if maPage : self.myQtab.setTabText(self.myQtab.indexOf(maPage),os.path.basename(fichier)) return result + def closeTab(self,indexAFermer): self.handleClose(indexAFermer = indexAFermer) @@ -254,6 +255,13 @@ class MyViewManager(object): self.myQtab.setTabText(index,fileName) return ok + def handleSortieUQ(self): + index=self.myQtab.currentIndex() + if index < 0 : return + editor=self.dictEditors[index] + ok, newName = editor.saveUQFile() + return ok + def saveCompleteCurrentEditor(self): index=self.myQtab.currentIndex() if index < 0 : return diff --git a/InterfaceQT4/viewManagerSsIhm.py b/InterfaceQT4/viewManagerSsIhm.py index 6a257201..19ee6e8c 100644 --- a/InterfaceQT4/viewManagerSsIhm.py +++ b/InterfaceQT4/viewManagerSsIhm.py @@ -72,6 +72,9 @@ class JdcSsIhmHandler(object): # ----------------------------------- return self.viewManagerSsIhm.fileLegerSaveAs(self,fileName) + def handleSortieUQ(self,fileName): +# ----------------------------------- + return self.viewManagerSsIhm.handleSortieUQ(self,fileName) #-------------------------------- diff --git a/Noyau/N_MCCOMPO.py b/Noyau/N_MCCOMPO.py index 934ba636..60914d8d 100644 --- a/Noyau/N_MCCOMPO.py +++ b/Noyau/N_MCCOMPO.py @@ -72,7 +72,7 @@ class MCCOMPO(N_OBJECT.OBJECT): for k, v in list(self.definition.entites.items()): if v.label != 'SIMP': continue - if k in args or v.statut == 'o': + if k in args or v.statut in ('o', 'd'): # # Creation par appel de la methode __call__ de la definition de la sous entite k de self # si une valeur existe dans args ou est obligatoire (generique si toutes les diff --git a/Noyau/N_MCSIMP.py b/Noyau/N_MCSIMP.py index bda0b21e..1409eab8 100644 --- a/Noyau/N_MCSIMP.py +++ b/Noyau/N_MCSIMP.py @@ -41,7 +41,7 @@ class MCSIMP(N_OBJECT.OBJECT): """ nature = 'MCSIMP' - def __init__(self, val, definition, nom, parent,objPyxbDeConstruction): + def __init__(self, val, definition, nom, parent, objPyxbDeConstruction): """ Attributs : @@ -69,8 +69,8 @@ class MCSIMP(N_OBJECT.OBJECT): self.etape = self.parent.etape else: # Le mot cle simple a été créé sans parent - # est-ce possible ? - print ('je suis dans le else sans parent du build') + # appel particulier dans getChild + #print ('je suis dans le else sans parent du build') self.jdc = None self.cata = None self.niveau = None diff --git a/Noyau/N_SIMP.py b/Noyau/N_SIMP.py index e8bc1222..fdeae65b 100644 --- a/Noyau/N_SIMP.py +++ b/Noyau/N_SIMP.py @@ -56,7 +56,7 @@ class SIMP(N_ENTITE.ENTITE): Un mot-clé simple est caractérisé par les attributs suivants : - type : cet attribut est obligatoire et indique le type de valeur attendue - fr : chaîne documentaire en français - - statut : obligatoire ou facultatif ou caché + - statut : obligatoire ou facultatif ou caché ou cache avec defaut (d) - into : valeurs autorisées - intoSug : valeurs possibles mais des valeurs autres du bon type peuvent etre entrees par l utilsateur - defaut : valeur par défaut diff --git a/generator/generator_UQ.py b/generator/generator_UQ.py new file mode 100644 index 00000000..ff2d4495 --- /dev/null +++ b/generator/generator_UQ.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2021 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 generateur de fichier au format + UQ pour EFICAS. + +""" +from __future__ import print_function +from __future__ import absolute_import +try : + from builtins import str +except : pass + +import traceback +import types,re,os +import Accas + +from .generator_python import PythonGenerator +from .textePersalys import headerScriptPersalys, fonctionScriptPersalys +from .textePersalys import leMainPersalys, inputHeaderPersalys, outputHeaderPersalys + +def entryPoint(): + """ + Retourne les informations necessaires pour le chargeur de plugins + + Ces informations sont retournees dans un dictionnaire + """ + return { + # Le nom du plugin + 'name' : 'UQ', + # La factory pour creer une instance du plugin + 'factory' : UQGenerator, + } + + +class UQGenerator(PythonGenerator): + """ + Ce generateur parcourt un objet de type JDC et produit + un texte au format eficas 'normal' + un texte au format eficas avec balise + un script python permettant de piloter Persalys + + """ + + def gener(self,jdc,format='beautifie'): + print (jdc.code) + if jdc.nature != 'JDC' : + self.commentaire= 'il faut un JDC Valide' + return 0 + self.jdc=jdc + ret, commentaire = self.analyseIncertitude() + if not ret : + self.commentaire=commentaire + return ret + self.inGenerUQ=True + self.textUQ=PythonGenerator.gener(self,jdc,format) + self.inGenerUQ=False + self.text=PythonGenerator.gener(self,jdc,format) + return self.text + + def writeUQ(self,fichier): + # il manque le checksum + fichierUQComm=fichier.split('.')[-2]+'_UQ.comm' + if not self.writeFile(fichierUQComm) : return (0, 'impossible de sauvegarder le .comm') + fichierUQ=fichier.split('.')[-2]+'_UQBalise.comm' + try : + with open(fichierUQ, "w") as fp: + fp.write(self.textUQ) + except : return (0,'impossible de sauvegarder le _UQ.py') + fichierUQExe=fichier.split('.')[-2]+'_UQ.py' + #try : + if 1 : + with open(fichierUQExe, "w") as fp: + fp.write(self.txtScriptPersalys) + #except : return (0,'impossible de sauvegarder le _UQ.py') + return (1, None) + + def generPROC_ETAPE(self,obj): + if not self.inGenerUQ : return PythonGenerator.generPROC_ETAPE(self,obj) + if obj.nom == 'ExpressionIncertitude' and self.inGenerUQ : return '' + else : return PythonGenerator.generPROC_ETAPE(self,obj) + # il faut remplacer @xxx@ + # DU coup qu est ce que xxx + + def generMCSIMP(self,obj) : + if not self.inGenerUQ : return PythonGenerator.generMCSIMP(self,obj) + if not obj in self.mcIncertains : return PythonGenerator.generMCSIMP(self,obj) + else : return '@'+obj.nom+'@' + + def analyseIncertitude(self) : + self.txtScriptPersalys = '' + etapeIncertitude=self.jdc.getEtapesByName('ExpressionIncertitude') + if etapeIncertitude == [] : return(0, 'il faut au moins un mot-clef ExpressionIncertitude') + if len(etapeIncertitude) !=1 : return(0, 'il faut au plus un mot-clef ExpressionIncertitude') + etapeIncertitude = etapeIncertitude[0] + incertitudeInput = etapeIncertitude.getChildOrChildInBloc('Input') + self.lesVariablesInput = incertitudeInput[0].getChildOrChildInBloc('VariableProbabiliste') + self.mcIncertains = [] + self.nomsDesVariablesInput = [] + self.chaineDesVariablesInput='' + for mc in self.lesVariablesInput : + self.nomsDesVariablesInput.append(mc.variableDeterministe.nom) + self.chaineDesVariablesInput+=mc.variableDeterministe.nom + ', ' + self.mcIncertains.append(mc.variableDeterministe) + sectionOutput = etapeIncertitude.getChildOrChildInBloc('Output')[0] + self.chaineDesVariablesInput=self.chaineDesVariablesInput[0:-2] + + self.lesVariablesOutput = sectionOutput.getChildOrChildInBloc('VariableDeSortie') + self.variablesOutput = {} + self.chaineDesVariablesOutput='' + listeDesVariablesOutput=[] # pour ordre en 3.5 + for mc in self.lesVariablesOutput : + nomVar = mc.getChildOrChildInBloc('NomDeLaVariable').valeur + listeDesVariablesOutput.append(nomVar) + self.chaineDesVariablesOutput+=nomVar+ ', ' + Fonctions = mc.getChildOrChildInBloc('FonctionDAggregation').valeur + self.variablesOutput [nomVar]=Fonctions + print (self.variablesOutput) + self.chaineDesVariablesOutput=self.chaineDesVariablesOutput[0:-2] + + self.creeScriptPersalys() + return (1, '') + # listeDesVariables, nomDesVariables, dicoDesVariables) + + def creeTexteInputVariables(self,indent): + texte='' + for v in self.lesVariablesInput : + loiDistribution= v.getChildOrChildInBloc('Distribution').valeur + if loiDistribution in UQGenerator.__dict__: + Appli.__dict__[self.code.upper()](self,) + + texte += (v.nom)+'\n' + return texte + + def creeScriptPersalys(self, debug=True) : + wrapperDir = os.path.abspath(os.path.dirname(__file__)) + wrapperName = "eficas_wrapper" + nomEtude = "monEtude" + if debug : print ('nomEtude : ', nomEtude, 'wrapperDir :', wrapperDir, 'wrapperName : ', wrapperName) + + self.txtScriptPersalys += headerScriptPersalys.format (wrapperDir, wrapperName ) + self.txtScriptPersalys += fonctionScriptPersalys.format ( self.chaineDesVariablesInput, self.chaineDesVariablesOutput ) + self.txtScriptPersalys += leMainPersalys.format (nomEtude,nomEtude,nomEtude,) + indent = ' ' + self.txtScriptPersalys += inputHeaderPersalys.format(indent,indent) + self.txtScriptPersalys +=self.creeTexteInputVariables(indent) + self.txtScriptPersalys += outputHeaderPersalys.format(indent,indent) + + + diff --git a/generator/textePersalys.py b/generator/textePersalys.py new file mode 100644 index 00000000..ec4aa7f1 --- /dev/null +++ b/generator/textePersalys.py @@ -0,0 +1,60 @@ +# ---------------------------------- +# headerScriptPersalys +# Parametres pour format : +# nom de l etude, nom de l etude, nom de l etude, path pour wrapper, wrapper, nom de la fonction +#sys.path[:0]=[{}] + +headerScriptPersalys = """#! /usr/bin/env python +# ---------------------------------------------- +# Script genere pour lancement Etude Probabiliste +# ---------------------------------------------- + +# Chargement du module systeme +import sys,os +# Chargement du module OpenTURNS +import openturns +import persalys +# Chargement de Eficas Wrapper +from {} import {} + +""" +# ---------------------------------- +# fonctionScriptPersalys +fonctionScriptPersalys = """def _exec({}): +# --------------------- + +# A completer + + return {} +""" + +inputHeaderPersalys = """ +{}# definition des Inputs +{}# --------------------- +""" +inputPersalysUniform='{}{} = persalys.Input({}, {})' +inputPersalys='{}{} = persalys.Input({}, {})' + +outputHeaderPersalys = """ +{}# definition des Outputs +{}# ---------------------- +""" + + +leMainPersalys=""" +# ------------------ +# definition du main +# ------------------ +if __name__ == '__main__': + {} = persalys.Study('{}') + persalys.Study.Add({}) +""" +# a = persalys.Input('a', 0, '') +# b = persalys.Input('b', 0, '') +# d = persalys.Output('d', '') +# inputs = [a, b] +# outputs = [d] + + +if __name__ == "__main__": + pass diff --git a/generator/wrapper_Accas.py b/generator/wrapper_Accas.py new file mode 100644 index 00000000..a92c37c2 --- /dev/null +++ b/generator/wrapper_Accas.py @@ -0,0 +1,2 @@ +def wrapperComm () : + pass -- 2.39.2