]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
1er sauvegarde UQ
authorPASCALE NOYRET <pascale.noyret@edf.fr>
Fri, 20 May 2022 13:29:02 +0000 (15:29 +0200)
committerPASCALE NOYRET <pascale.noyret@edf.fr>
Fri, 20 May 2022 13:29:02 +0000 (15:29 +0200)
24 files changed:
Ihm/I_ENTITE.py
Ihm/I_MCCOMPO.py
Ihm/I_MCSIMP.py
Ihm/I_OBJECT.py
InterfaceQT4/browser.py
InterfaceQT4/composimp.py
InterfaceQT4/configuration.py
InterfaceQT4/editor.py
InterfaceQT4/editorSsIhm.py
InterfaceQT4/eficas_go.py
InterfaceQT4/feuille.py
InterfaceQT4/monWidgetCB.py
InterfaceQT4/monWidgetFact.py
InterfaceQT4/monWidgetSimpBase.py
InterfaceQT4/qtEficas.py
InterfaceQT4/readercata.py
InterfaceQT4/viewManager.py
InterfaceQT4/viewManagerSsIhm.py
Noyau/N_MCCOMPO.py
Noyau/N_MCSIMP.py
Noyau/N_SIMP.py
generator/generator_UQ.py [new file with mode: 0644]
generator/textePersalys.py [new file with mode: 0644]
generator/wrapper_Accas.py [new file with mode: 0644]

index 97ca3ce1f64ab6bef8d8e6d7a91af5ab762be6bd..8e6e2e26f2ff7dcfe15867a0188301d4f8db3c51 100644 (file)
@@ -74,5 +74,3 @@ class ENTITE:
         return mcs
 
 #
-    def UQPossible(self):
-        return True
index c7cf0d25a102d7cc03e387e8d13b4a28303492c4..c322aa8c656cc0fc9b5975e3ad823dc1477266b5 100644 (file)
@@ -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):
index 159c8f67f3042421fc28d3dd4886b4d9890d9ab1..6d45ce9fd07d84dc71776b6623f0911aa0081aa0 100644 (file)
@@ -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
+    
+   
index 5a2c27018a9ca0f868250f466ee80bec7aea1e3e..6bdf4f5ab46c6bd504191510079d5f7862e00a8e 100644 (file)
@@ -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
index 8a9721e75c358ffa467366f8062b182c1de4bf19..edfe9c5ed6241c32493b2384ebcb32dcc5e39f2c 100644 (file)
@@ -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
index 79556d1e55441f378938b201440272cf2785096d..4e5ae9e7868840db717247d8be0ce957be78293e 100644 (file)
@@ -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
index cae7add4c84b3b6567ce090ce5fa877272078e94..3b0c605dfde721420ba00e04fa7527dc34c6c699 100644 (file)
@@ -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
 
 
 
index cee7154ef1b9ff27f409a8b6af0796ea88c8ed3e..dae0115cc6fb927e23d784527f04f1bd719b3764 100755 (executable)
@@ -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):
index 259746eb0239656d3d8e14e7edeb81734de1dc77..8746dbd2032029dbf32131d51a74afdc8b5a8df2 100755 (executable)
@@ -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
index 308aa5136362191aadb5554400771ee94c330e42..3c82b02d460c86904c941bad33fcd44551f1da2a 100755 (executable)
@@ -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)
index 52a2198366aba7db5511dee1362a1abd50f2b803..85259984cea99f9f8c070d5e1e0d48347525a064 100644 (file)
@@ -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)
index 410df3a16441784efbdede100ebae10a3665753f..ba0cf8e4f537167355ac8f8a61b49647dd0391be 100644 (file)
@@ -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"
index 4441c21565f29aaf1fe202bfebd7f6d3df1da066..b1157b6ccbc3142bf7386b5524ccaee6ca3b5858 100644 (file)
@@ -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]
index fae5cb3f383c63f132898567574bd56e95e2d7fb..9f73d443f49ac67b1b3e5b67fa6f278b53ef9d90 100644 (file)
@@ -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()
index e92c4160d6c72a38480adfb2f6daffdaca029c7a..2975b309ae6b6f982bd9fbb7ba975e78cc96ef54 100755 (executable)
@@ -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()
 
index 386566740c634ceb32d6ecc578270de2fc9a4526..4a2a56a698a1d1e8d253aba9b774a54ed2d59e10 100644 (file)
@@ -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):
         """
index fffd16d868e12f397e5268056f465a38598a1cb5..70052ba48e7958e77fb2434933f4904e74b53241 100644 (file)
@@ -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
index 6a2572019a62e4fa75773d9d9a6e04c71f826ebb..19ee6e8c0025a26afe03be3368bbbec8f5f19365 100644 (file)
@@ -72,6 +72,9 @@ class JdcSsIhmHandler(object):
 #  -----------------------------------
         return self.viewManagerSsIhm.fileLegerSaveAs(self,fileName)
 
+    def handleSortieUQ(self,fileName):
+#  -----------------------------------
+        return self.viewManagerSsIhm.handleSortieUQ(self,fileName)
 
 
 #--------------------------------
index 934ba63696a79fb50bb79d7302008fecc2d56c86..60914d8d17f8a99bba3a1d49d4cebdf614bec8ae 100644 (file)
@@ -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
index bda0b21e0fad183016eb7d3b08c3d4e35fed9eca..1409eab894cb16a76521fa3336a01531b31209a2 100644 (file)
@@ -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
index e8bc122201c6a3d54f4fc3175ef9cf8122a60ec8..fdeae65b8e7e04d63e97df6fadf8d8e7872dad5b 100644 (file)
@@ -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 (file)
index 0000000..ff2d449
--- /dev/null
@@ -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 (file)
index 0000000..ec4aa7f
--- /dev/null
@@ -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 (file)
index 0000000..a92c37c
--- /dev/null
@@ -0,0 +1,2 @@
+def wrapperComm () :
+    pass