]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
avant le renommage chgtDeNom
authorPASCALE NOYRET <pascale.noyret@edf.fr>
Wed, 17 Jan 2024 09:29:07 +0000 (10:29 +0100)
committerPASCALE NOYRET <pascale.noyret@edf.fr>
Wed, 17 Jan 2024 09:29:07 +0000 (10:29 +0100)
55 files changed:
Codes/PourADaoEtTelemac.txt [new file with mode: 0644]
Editeur/Objecttreeitem.py
Editeur/comploader.py
Editeur/eficas_go.py
Ihm/I_JDC.py
Ihm/I_MCBLOC.py
Ihm/I_MCCOMPO.py
Ihm/I_MCFACT.py
Ihm/I_MCLIST.py
Ihm/I_MCSIMP.py
Ihm/I_OBJECT.py
InterfaceGUI/QT5/editor.py
InterfaceGUI/QT5/monWidgetCB.py
InterfaceGUI/QT5/monWidgetCBIntoSug.py
InterfaceGUI/QT5/monWidgetCBSD.py
InterfaceGUI/QT5/monWidgetCommande.py
InterfaceGUI/QT5/monWidgetPlusieursASSDIntoOrdonne.py
InterfaceGUI/QT5/monWidgetPlusieursBase.py
InterfaceGUI/QT5/monWidgetPlusieursInto.py
InterfaceGUI/QT5/monWidgetPlusieursIntoOrdonne.py
InterfaceGUI/QT5/monWidgetPlusieursPlie.py
InterfaceGUI/QT5/monWidgetPlusieursTuple.py
InterfaceGUI/QT5/monWidgetRadioButton.py
InterfaceGUI/QT5/monWidgetSDCOInto.py
InterfaceGUI/QT5/monWidgetSimpBase.py
InterfaceGUI/QT5/monWidgetSimpBool.py
InterfaceGUI/QT5/monWidgetSimpComplexe.py
InterfaceGUI/QT5/monWidgetSimpDate.py
InterfaceGUI/QT5/monWidgetSimpSalome.py
InterfaceGUI/QT5/monWidgetSimpTuple.py
InterfaceGUI/QT5/monWidgetUniqueSDCO.py
InterfaceGUI/QT5/monWidgetVide.py
InterfaceGUI/QT5/politiquesValidation.py [deleted file]
InterfaceGUI/QT5/qtEficas.py
InterfaceGUI/QT5/qtSaisie.py [deleted file]
InterfaceGUI/Web/browser.py [new file with mode: 0644]
InterfaceGUI/Web/compobloc.py [new file with mode: 0644]
InterfaceGUI/Web/compofact.py [new file with mode: 0644]
InterfaceGUI/Web/compojdc.py [new file with mode: 0644]
InterfaceGUI/Web/compomclist.py [new file with mode: 0644]
InterfaceGUI/Web/compooper.py [new file with mode: 0644]
InterfaceGUI/Web/compoparam.py [new file with mode: 0644]
InterfaceGUI/Web/compoproc.py [new file with mode: 0644]
InterfaceGUI/Web/composimp.py [new file with mode: 0644]
InterfaceGUI/Web/editor.py [new file with mode: 0755]
InterfaceGUI/Web/typeNode.py [new file with mode: 0644]
InterfaceGUI/appliSsIhm.py [new file with mode: 0755]
InterfaceGUI/editorSsIhm.py
InterfaceGUI/politiquesValidation.py [new file with mode: 0644]
InterfaceGUI/qtEficasSsIhm.py [deleted file]
InterfaceGUI/traiteSaisie.py [new file with mode: 0644]
PourADaoEtTelemac.txt [deleted file]
Validation/V_JDC.py
Validation/V_MCFACT.py
Validation/V_MCSIMP.py

diff --git a/Codes/PourADaoEtTelemac.txt b/Codes/PourADaoEtTelemac.txt
new file mode 100644 (file)
index 0000000..f9fd4f3
--- /dev/null
@@ -0,0 +1,3 @@
+chgt de label_user
+label_integrateur
+chgt de editeur.ini 
index 20e4155d3ba0d995f874e64e1f1815c90aa2032f..b602b96426d7091e5ae4fb6b50f7a751c5f63568 100644 (file)
@@ -23,9 +23,10 @@ from builtins import str
 from builtins import object
 import types, os, sys
 from copy import copy, deepcopy
+from uuid import uuid1
 
 # import du chargeur de composants
-from .comploader import makeObjecttreeitem
+from Editeur.comploader import makeObjecttreeitem
 from Ihm import CONNECTOR
 from Extensions.i18n import tr
 from Extensions.eficas_exception import EficasException
@@ -162,6 +163,28 @@ class ObjectTreeItem(TreeItem, Delegate):
         self.sublist = []
         self.init()
 
+
+        # La partie suivante  ne sert que pour le Web
+        # on met le meme id au noeud et a l objet
+        # a priori inutile sauf pour les MCList
+        if hasattr(object, "idUnique"):
+            self.idUnique = object.idUnique
+        else:
+            self.idUnique = uuid1().hex
+
+        if self._object.nature == "MCList" and len(self._object.data) == 1:
+            # pour les suppressions on met le meme id a l objet et a la lis
+            self._object.data[0].idUnique = self.idUnique
+            self._object.idUnique = self._object.data[0].idUnique
+            if hasattr(self.appliEficas, "dicoIdNode"):
+                self.appliEficas.dicoIdNode[self._object.data[0].idUnique] = self
+            self.idUnique = 0
+            return
+
+        self._object.idUnique = self.idUnique
+        if hasattr(self.appliEficas, "dicoIdNode") and self.idUnique:
+            self.appliEficas.dicoIdNode[self.idUnique] = self
+
     def init(self):
         return
 
index aa4057022051abf547fe33baa0ca23de3bb48ad5..464bc6d0ac11ee3384938db66caa05e62838b8e7 100644 (file)
@@ -46,6 +46,7 @@ def chargerComposants(GUIPath):
     """
     debug = 0
     ici=os.path.dirname(os.path.abspath(__file__))
+    print (GUIPath)
     repertoire = os.path.join(ici,"..", "InterfaceGUI",GUIPath)
     if debug : print ('repertoire', repertoire)
     package = 'InterfaceGUI.'+GUIPath
index 82c832cc96bb8f464953f10f16f4d0390f1d7579..737601d6911d157a35a27cb473528e852badfe82 100755 (executable)
@@ -41,8 +41,6 @@ def lanceEficas(code=None, multi=False, langue="en", labelCode=None, GUIPath='QT
         return
 
     from Editeur import session
-    import sys
-
     options = session.parse(sys.argv)
     if options.code != None:
         code = options.code
@@ -61,23 +59,25 @@ def lanceEficas(code=None, multi=False, langue="en", labelCode=None, GUIPath='QT
 
 
 def getEficasSsIhm( code=None, multi=False, langue="en", ssCode=None, labelCode=None,
-    forceXML=False, genereXSD=False, fichierCata=None,):
+    forceXML=False, genereXSD=False, fichierCata=None,GUIPath=None, salome = False):
 # -----------------------------------------------------------------------------------
     """
     instancie l'appli EFICAS sans Ihm
     """
-    from Editeur import session
 
+    from Editeur import session
     options = session.parse(sys.argv)
     if options.code != None:
         code = options.code
-    if forceXML:
-        options.withXSD = True
+    if forceXML: options.withXSD = True
 
-    from InterfaceQT4.qtEficasSsIhm import AppliSsIhm
+    if GUIPath in ('QT5',  'cinqC', 'Web') :
+        pathAbso=os.path.abspath(os.path.join(os.path.dirname(__file__),'..','InterfaceGUI',GUIPath))
+        if pathAbso not in sys.path : sys.path.insert(0,pathAbso)
 
-    Eficas = AppliSsIhm( code=code, salome=0, multi=multi, langue=langue,
-        ssCode=ssCode, labelCode=labelCode, genereXSD=genereXSD, fichierCata=fichierCata,)
+    from InterfaceGUI.appliSsIhm import AppliSsIhm
+    Eficas = AppliSsIhm( code=code, salome=salome, multi=multi, langue=langue,
+        ssCode=ssCode, labelCode=labelCode, genereXSD=genereXSD, fichierCata=fichierCata)
     return Eficas
 
 
index f7add5d9e94c1794bcd21af68c9673787cec94e4..d37c850654c2ec72d26a2dd0166731badd64533e 100644 (file)
@@ -26,8 +26,6 @@ from Extensions.i18n import tr
 from Extensions.eficas_exception import EficasException
 
 
-import Noyau
-
 # Modules Eficas
 from . import I_OBJECT
 from Noyau.N_ASSD import ASSD
index 0a9a9fba8fb5044e7ee205a107cdc80c37123dc6..613336e56a2e89cbc6f1287993b4a01d61041146 100644 (file)
@@ -24,5 +24,21 @@ class MCBLOC(I_MCCOMPO.MCCOMPO):
     def getNomDsXML(self):
         return self.parent.getNomDsXML()
 
-    def getMCPath(self):
-        return self.parent.getMCPath()
+    def getDicoForFancy(self):
+        listeNodes = []
+        for obj in self.mcListe:
+            lesNodes = obj.getDicoForFancy()
+            if not (isinstance(lesNodes, list)):
+                listeNodes.append(lesNodes)
+            else:
+                for leNode in lesNodes:
+                    listeNodes.append(leNode)
+        return listeNodes
+
+    def getParentsJusqua(self, jusqua):
+        listeDesParents = []
+        aTraiter = self
+        while aTraiter != jusqua.getObject():
+            listeDesParents.append(aTraiter.parent)
+            aTraiter = aTraiter.parent
+        return listeDesParents
index 7ef1100cfa0ae1b2f188b966f3980388b66fd39f..3331fcb0d676e974582e0e83a6694ecabd8d72f4 100644 (file)
@@ -150,6 +150,54 @@ class MCCOMPO(I_OBJECT.OBJECT):
                     liste.remove(k)
         return liste
 
+    def calculOptionnel(self):
+        self.listeMc = []
+        self.listeMcRegle = []
+        self.dictToolTipMc = {}
+        genea = self.getGenealogie()
+        # Attention : les mots clefs listes (+sieurs fact )
+        # n ont pas toutes ces methodes. a priori pas appele mais
+        if self.nature != "MCLIST":
+            self.listeMc = self.getListeMcOrdonnee(genea, self.jdc.cata_ordonne_dico)
+            listeNomsPresents = self.dictMcPresents()
+            for regle in self.getRegles():
+                (monToolTip, regleOk) = regle.verif(listeNomsPresents)
+                if regleOk:
+                    continue
+                for mc in regle.mcs:
+                    self.listeMcRegle.append(mc)
+                    self.dictToolTipMc[mc] = monToolTip
+        return (self.listeMc, self.listeMcRegle, self.dictToolTipMc)
+
+    def calculOptionnelInclutBlocs(self):
+        debug = 0
+        if debug:
+            print("-------------- calculOptionnelInclutBlocs", self.nom)
+        self.dictMCVenantDesBlocs = {}
+        liste, listeRouge, dictToolTipMc = self.calculOptionnel()
+        dictNomsPresents = self.dictMcPresents()
+        for mc in liste:
+            self.dictMCVenantDesBlocs[mc] = self
+        for mc in self.listeMcPresents():
+            obj = dictNomsPresents[mc]
+            if obj.nature != "MCBLOC":
+                continue
+            if debug:
+                print(mc, "est present")
+            (l, lr, d) = obj.calculOptionnelInclutBlocs()
+            # print ('optionnels', l)
+            liste = liste + l
+            listeRouge = listeRouge + lr
+            for k in d:
+                dicToolTipMC[k] = d[k]
+            for k, v in obj.dictMCVenantDesBlocs.items():
+                self.dictMCVenantDesBlocs[k] = v
+
+        if debug:
+            print("ccOptio", self.nom, self.dictMCVenantDesBlocs)
+        if debug:
+            print("fin calculOPtionnel", self.nom, "_____________")
+        return (liste, listeRouge, dictToolTipMc)
     def listeMcPresents(self):
         """
         Retourne la liste des noms des mots-cles fils de self presents construite
index 53adba33eaa5fe98de91e94094bb297c84918274..7b9a6261f674ddeb60e17eed25abbccdde2834d0 100644 (file)
@@ -30,17 +30,18 @@ class MCFACT(I_MCCOMPO.MCCOMPO):
         Retourne 1 si le mot-cle facteur self peut etre repete
         Retourne 0 dans le cas contraire
         """
-        if self.definition.max > 1:
-            # marche avec '**'
+        objet = self.parent.getChild(self.nom)
+        lenDejaLa = len(objet)
+        if self.definition.max > 1 and lenDejaLa < self.definition.max:
             return 1
         else:
             return 0
 
     def isOblig(self):
-        if self.definition.statut != "o":
+        if self.definition.statut != "f":
             return 0
         objet = self.parent.getChild(self.nom)
-        if len(objet) > 1:
+        if len(objet) > self.definition.min:
             return 0
         else:
             return 1
@@ -66,6 +67,25 @@ class MCFACT(I_MCCOMPO.MCCOMPO):
         nomDsXML = self.parent.getNomDsXML() + "." + nom
         return nomDsXML
 
+    def getStatutEtRepetable(self):
+        """
+        Retourne l index du MCFACT ds la MCList
+        """
+        objet = self.parent.getChild(self.nom, restreint="oui")
+        if len(objet) > 1:
+            index = objet.getIndex(self) + 1
+        else:
+            index = 1
+        if self.definition.max > index:
+            repetable = 1
+        else:
+            repetable = 0
+        if self.definition.min < index or self.definition.statut == "f":
+            statut = "f"
+        else:
+            statut = "o"
+        return (statut, repetable)
+
     def getLabelText(self):
         """
         Retourne le label de self suivant qu'il s'agit d'un MCFACT
@@ -151,3 +171,40 @@ class MCFACT(I_MCCOMPO.MCCOMPO):
     def supprime(self):
         self.alt_parent = None
         N_MCFACT.MCFACT.supprime(self)
+
+    def getDicoForFancy(self):
+        # print ('MCFACT getDicoForFancy ')
+        monDico = {}
+        leNom = self.nom
+
+        leNom = self.getLabelText()
+        monDico["statut"] = self.definition.statut
+        monDico["nomCommande"] = self.nom
+        if self.state == "undetermined":
+            self.isValid()
+
+        monDico["title"] = leNom
+        monDico["key"] = self.idUnique
+        monDico["classeAccas"] = self.nature
+        monDico["validite"] = self.getValid()
+        if not (monDico["validite"]):
+            monDico["validite"] = 0
+
+        (statut, repetable) = self.getStatutEtRepetable()
+        monDico["statut"] = statut
+        monDico["repetable"] = repetable
+        if monDico["validite"] == 0 and monDico["statut"] == "f":
+            monDico["validite"] = 2
+
+        listeNodes = []
+        for obj in self.mcListe:
+            lesNodes = obj.getDicoForFancy()
+            if not (isinstance(lesNodes, list)):
+                listeNodes.append(lesNodes)
+            else:
+                for leNode in lesNodes:
+                    listeNodes.append(leNode)
+        monDico["children"] = listeNodes
+        if self.nature != "MCSIMP" and self.nature != "MCLIST":
+            monDico["infoOptionnels"] = self.calculOptionnelInclutBlocs()
+        return monDico
index bc1345bd488f256e132198d5ad40aff92f7eeb8a..cac5ac72b29dfbb36c9a2a3a88723404a0ad5f19 100644 (file)
@@ -63,6 +63,26 @@ class MCList:
         else:
             return 0
 
+    def getDicoObjetsCompletsPourTree(self):
+        # print ('MCList getDicoObjetsCompletsPourTree pour ', self)
+        listeDict = []
+        for i in self.data:
+            listeDict.append(i.getDicoObjetsCompletsPourTree())
+        return listeDict
+
+    def getDicoForFancy(self):
+        listeDict = []
+        nbFactDejaLa = len(self.data)
+        for i in self.data:
+            dico = i.getDicoForFancy()
+            if nbFactDejaLa > i.definition.min:
+                dico["statut"] = "f"
+            if nbFactDejaLa < i.definition.max:
+                dico["repetable"] = 1
+            else:
+                dico["repetable"] = 0
+            listeDict.append(dico)
+        return listeDict
     def isOblig(self):
         """
         Une MCList n'est jamais obligatoire (meme si le MCFACT qu'elle represente l'est
@@ -101,7 +121,7 @@ class MCList:
 
         if not self.ajoutPossible():
             self.jdc.editor.afficheAlerte(
-                tr("Erreur"), tr("L'objet %s ne peut pas etre ajoute", obj.nom)
+                tr("Erreur"), tr("L'objet {} ne peut pas etre ajoute").format(obj.nom)
             )
             return None
 
@@ -131,6 +151,9 @@ class MCList:
     def updateConcept(self, sd):
         for child in self.data:
             child.updateConcept(sd)
+    def demandeUpdateOptionnels(self):
+        for child in self.data:
+            child.demandeUpdateOptionnels()
 
     def deleteRef(self):
         for child in self.data:
index 0640b68db19f44c41a72be62885ab9d78787931c..856a61b9beb219a9e4ec1e1be8c4917fabc95f21 100644 (file)
@@ -375,6 +375,7 @@ class MCSIMP(I_OBJECT.OBJECT):
         """Met a jour les blocs conditionnels dependant du mot cle simple self"""
         if self.definition.position == "global":
             self.etape.deepUpdateConditionBloc()
+            self.etape.demandeUpdateOptionnels()
         elif self.definition.position == "reCalculeEtape":
             # print ('je passe par updateConditionBloc pour ', self.nom)
             self.etape.deepUpdateConditionBloc()
@@ -387,6 +388,8 @@ class MCSIMP(I_OBJECT.OBJECT):
         else:
             self.parent.updateConditionBloc()
 
+    def demandeUpdateOptionnels(self):
+        pass
     def setValeur(self, new_valeur, evaluation="oui"):
         self.initModif()
         self.valeur = new_valeur
@@ -474,7 +477,7 @@ class MCSIMP(I_OBJECT.OBJECT):
             return valeur
         else:
             try:
-                valeur = eval(val)
+                valeur = eval(new_valeur)
                 return valeur
             except:
                 # traceback.print_exc()
index 575450fa8bc691945bd8e93a231760b565ec1fb0..43e6f6c2c3fed5753776d75b9a4b8a64d88629dc 100644 (file)
@@ -229,13 +229,74 @@ class OBJECT:
     def supprimeUserAssd(self):
         pass
 
+    def getDicoForFancy(self):
+        # print ('OBJECT getDicoForFancy ',self, self.nature)
+        monDico = {}
+        leNom = self.nom
+
+        if self.nature == "MCFACT":
+            leNom = self.getLabelText()
+            monDico["statut"] = self.definition.statut
+            monDico["nomCommande"] = self.nom
+
+        if self.nature == "MCLIST":
+            monDico["validite"] = 0
+        elif self.nature == "MCBLOC":
+            monDico["validite"] = 0
+        else:
+            monDico["validite"] = self.getValid()
+            if monDico["validite"] == None:
+                monDico["validite"] = 0
+
+        if self.nature == "OPERATEUR" or self.nature == "PROCEDURE":
+            monDico["statut"] = "f"
+        if self.nature == "OPERATEUR":
+            if hasattr(self, "sdnom") and self.sdnom != "sansnom":
+                monDico["sdnom"] = self.sdnom
+            else:
+                monDico["sdnom"] = ""
+                if monDico["validite"] == 0:
+                    monDico["validite"] = 2
+        monDico["title"] = leNom
+        monDico["key"] = self.idUnique
+        monDico["classeAccas"] = self.nature
+
+        listeNodes = []
+        # Cas d un fichier vide
+        if not hasattr(self, "mcListe"):
+           self.mcListe = []
+        for obj in self.mcListe:
+            lesNodes = obj.getDicoForFancy()
+            if not (isinstance(lesNodes, list)):
+                listeNodes.append(lesNodes)
+            else:
+                for leNode in lesNodes:
+                    listeNodes.append(leNode)
+        monDico["children"] = listeNodes
+        print (self.nature)
+        if self.nature != "MCSIMP" and self.nature != "MCLIST" and self.nature != "JDC":
+            monDico["infoOptionnels"] = self.calculOptionnelInclutBlocs()
+        return monDico
+
+    def getNomClassWeb(self):
+        # code mort
+        laClasse = self.nature
+        if self.isValid():
+            laClasse += "Valide"
+        else:
+            laClasse += "NonValide"
+        return laClasse
+
+    def demandeUpdateOptionnels(self):
+        CONNECTOR.Emit(self, "demandeUpdateOptionnels")
+        for mc in self.mcListe:
+            mc.demandeUpdateOptionnels()
     def demandeRedessine(self):
         # print ('demandeRedessine pour', self.nom, self, tout)
         CONNECTOR.Emit(self, "redessine")
 
-    def isUQActivate(self):
-        # valide uniquement pour les MCSIMP
-        return True
+    def getIndexDsParent(self):
+        return self.parent.mcListe.index(self)
 
 
 class ErrorObj(OBJECT):
index 7648ca9dcb832d19e09a409daa38ed2e6a4201b9..356014ee2b54597d1c578ff1f649ba08dd859bca 100755 (executable)
@@ -113,6 +113,7 @@ class JDCEditor(JDCEditorSsIhm, Ui_baseWidget, QWidget):
 
         #self.commandesOrdreCatalogue = self.readercata.commandesOrdreCatalogue
 
+        #PN ??? probablement bug
         if self.appliEficas.readercata.demandeCatalogue == True:
             nomFichierTranslation = (
                 "translatorFichier" + "_" + str(self.appliEficas.readercata.labelCode)
@@ -278,8 +279,7 @@ class JDCEditor(JDCEditorSsIhm, Ui_baseWidget, QWidget):
     # ----------------------------------------------#
     def afficheInfos(self, message, couleur=Qt.black):
     # ----------------------------------------------#
-        if couleur == "red":
-            couleur = Qt.red
+        if couleur == "red": couleur = Qt.red
         if self.sb:
             mapalette = self.sb.palette()
             mapalette.setColor(QPalette.WindowText, couleur)
index c9edb4279b4aa73edd2d7f091fed2314f8e03d5c..9a103d84ed68b39b240c13eef45cdcf416c4cbb4 100644 (file)
@@ -26,7 +26,7 @@ from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetCB import Ui_WidgetCB
-from InterfaceGUI.QT5.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 
 from PyQt5.QtWidgets import QComboBox, QCompleter
index 607d8c0877772599f8a7ef41e7592caeb2a4aa30..1afaff1ea830349890d276e66a02089096002cc4 100644 (file)
@@ -26,7 +26,7 @@ import types, os
 from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
-from InterfaceGUI.QT5.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 from UiQT5.desWidgetCBIntoSug import Ui_WidgetCBIntoSug
 
index ed8d47b3b056b3e6ec25171a073d8ac014aac92b..3fb90e0382155ca84e17365f58bc48149a6958a3 100644 (file)
@@ -26,7 +26,7 @@ from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetCB import Ui_WidgetCB
-from InterfaceGUI.QT5.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 
 
index 75d0347577af7fb051760cbf6d01482383aa2485..709d5a6d12e35d8a27c6b57ea2b4b960c1117ee4 100644 (file)
@@ -239,8 +239,7 @@ class MonWidgetCommande(Ui_WidgetCommande, Groupe):
 
         # Notation scientifique
         if test:
-            from InterfaceGUI.QT5.politiquesValidation import Validation
-
+            from InterfaceGUI.politiquesValidation import Validation
             validation = Validation(self.node, self.editor)
             validation.ajoutDsDictReelEtape()
 
index 21a2d62552905d3b8c1214a0a70f300237918fee..8b36d871c1e4c48353dbcd876675ecd439c5ce94 100644 (file)
@@ -21,7 +21,7 @@
 # Modules Eficas
 from Extensions.i18n import tr
 from InterfaceGUI.QT5.monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne
-from InterfaceGUI.QT5.politiquesValidation import PolitiquePlusieurs
+from InterfaceGUI.politiquesValidation import PolitiquePlusieurs
 
 from PyQt5.QtWidgets import QScrollBar
 
index c45fa9184d6ce7b6d830d22830d2e1860a9c2f4b..03d7316ad2823bd1643ea0ecb88bda895dd2d116 100644 (file)
@@ -29,7 +29,7 @@ from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetPlusieursBase import Ui_WidgetPlusieursBase
-from InterfaceGUI.QT5.politiquesValidation import PolitiquePlusieurs
+from InterfaceGUI.politiquesValidation import PolitiquePlusieurs
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 from InterfaceGUI.QT5.gereListe import GereListe
 from InterfaceGUI.QT5.gereListe import GerePlie
index f2c4d7ba21e16545c67e85966901b048971e7999..eec1ed275830443363dcab8f235e8432dc8da188 100644 (file)
@@ -28,7 +28,7 @@ from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetPlusieursInto import Ui_WidgetPlusieursInto
-from InterfaceGUI.QT5.politiquesValidation import PolitiquePlusieurs
+from InterfaceGUI.politiquesValidation import PolitiquePlusieurs
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 from InterfaceGUI.QT5.gereListe import GerePlie
 from InterfaceGUI.QT5.gereListe import GereListe
index 6470fe13e0b6b21650daaefce79268554e2ed777..f3641fe06ee3bad71fd0641eb37953fd79d7c9f2 100644 (file)
@@ -23,7 +23,7 @@ import types, os
 # Modules Eficas
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetPlusieursIntoOrdonne import Ui_WidgetPlusieursIntoOrdonne
-from InterfaceGUI.QT5.politiquesValidation import PolitiquePlusieurs
+from InterfaceGUI.politiquesValidation import PolitiquePlusieurs
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 from InterfaceGUI.QT5.gereListe import GereListe
 from InterfaceGUI.QT5.gereListe import GerePlie
index 868044ecebeef392cbbd397224d2d38e5daed290..7709b67bf55c41da91ff11fa54f062c71cacbdb9 100644 (file)
@@ -28,7 +28,7 @@ from Extensions.i18n import tr
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetPlusieursPlie import Ui_WidgetPlusieursPlie
 
-from InterfaceGUI.QT5.politiquesValidation import PolitiquePlusieurs
+from InterfaceGUI.politiquesValidation import PolitiquePlusieurs
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 
 pattern_blanc = re.compile(r"^\s*$")
index f51f47801dbd0a0b6082a65275fd97b60a76b636..361960a937fafc3b509ef8c0998701b6ffb8f1b6 100644 (file)
@@ -26,7 +26,7 @@ from PyQt5.QtCore import QSize, Qt, QTimer
 from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
-from InterfaceGUI.QT5.politiquesValidation import PolitiquePlusieurs
+from InterfaceGUI.politiquesValidation import PolitiquePlusieurs
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 from InterfaceGUI.QT5.gereListe import GereListe
 from InterfaceGUI.QT5.gereListe import LECustom
index 621357ea60796c3ae5467e7426fa1d5991c69fb7..91dd1498814bdddb5147df2d308cda8b7b2e2f6e 100644 (file)
@@ -30,7 +30,7 @@ from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetRadioButton import Ui_WidgetRadioButton
-from InterfaceGUI.QT5.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 
 
index 00e84b9234fc2ab3316058b173ca5b57b0bd9571..03b259225421f6800cd7d925b121c983cc208653 100644 (file)
@@ -26,7 +26,7 @@ from Extensions.i18n import tr
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetSDCOInto import Ui_WidgetSDCOInto
 from InterfaceGUI.QT5.qtSaisie import SaisieSDCO
-from InterfaceGUI.QT5.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
 
 
 class MonWidgetSDCOInto(Ui_WidgetSDCOInto, Feuille, SaisieSDCO):
index c3196a359efe62786163f37b9c441150abc3c130..dfe26d5268360bf7e5bf88311674b7bfb14f4ccb 100644 (file)
@@ -25,7 +25,7 @@ from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetSimpBase import Ui_WidgetSimpBase
-from InterfaceGUI.QT5.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 
 
index c642e1869a5f0cf6f8541ae7061e395817e7e5d5..524823a4e743342428b0fcc481327a5dd92b5d54 100644 (file)
@@ -24,7 +24,7 @@ from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetSimpBool import Ui_WidgetSimpBool
-from InterfaceGUI.QT5.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 
 
index 71c912a13e3f0b8d46ce7d0d87ce07210b419f5a..da9762f2ecb9fa051655456bd70bee1de7594087 100644 (file)
@@ -29,7 +29,7 @@ from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetSimpComplexe import Ui_WidgetSimpComplexe
-from InterfaceGUI.QT5.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 
 
index 4a1641cb1df8ed7c17731fc3157ec1ab32976626..c4330aaf065ff4799fdc85a8c209a7689981d15b 100644 (file)
@@ -24,7 +24,7 @@ import types,os
 # Modules Eficas
 from PyQt5.QtCore                      import QDate
 from UiQT5.desWidgetDate               import Ui_WidgetDate
-from InterfaceGUI.QT5.politiquesValidation  import PolitiqueUnique
+from InterfaceGUI.politiquesValidation  import PolitiqueUnique
 from InterfaceGUI.QT5.feuille               import Feuille
 
 
index 7269aed9414cdf6c181923a03f94c34cc72e8812..2f73e808a1dea3e8217cf70f58ddaee3fb9100dd 100644 (file)
@@ -25,7 +25,7 @@ from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetSimpSalome import Ui_WidgetSimpSalome
-from InterfaceGUI.QT5.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 
 
index a8d0888ddc33255da81b9630cc9b482442891f7f..8317f9a3c6186a97a2abbbe72d7e8f1a4977961a 100644 (file)
@@ -24,7 +24,7 @@ from PyQt5.QtCore import Qt
 from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
-from InterfaceGUI.QT5.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
 from InterfaceGUI.QT5.qtSaisie import SaisieValeur
 
 
index 5dfc27b7b8a8ee745819c200c4b5d87a41b57dc9..9d8a26694a3103e2b684106baad8c147a09a4985 100644 (file)
@@ -25,7 +25,7 @@ from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetUniqueSDCO import Ui_WidgetUniqueSDCO
-from InterfaceGUI.QT5.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
 from InterfaceGUI.QT5.qtSaisie import SaisieSDCO
 
 
index 7887b3cefee6060d954e7399adc5cc5470016e07..fa5d67ea018a19867597c37a85f6911cafedfe0e 100644 (file)
@@ -23,7 +23,7 @@ from Extensions.i18n import tr
 
 from InterfaceGUI.QT5.feuille import Feuille
 from UiQT5.desWidgetVide import Ui_WidgetVide
-from InterfaceGUI.QT5.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
 
 
 class MonWidgetVide(Ui_WidgetVide, Feuille):
diff --git a/InterfaceGUI/QT5/politiquesValidation.py b/InterfaceGUI/QT5/politiquesValidation.py
deleted file mode 100644 (file)
index dee57ab..0000000
+++ /dev/null
@@ -1,343 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (C) 2007-2024   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
-#
-from Accas import PARAMETRE
-from Extensions.i18n import tr
-
-
-# ---------------------
-class Validation(object):
-# ---------------------
-    def __init__(self, node, parent):
-        self.node = node
-        self.parent = parent
-
-    def testeUneValeur(self, valeurentree):
-        commentaire = None
-        # import traceback
-        # traceback.print_stack()
-        valeur, validite = self.node.item.evalValeur(valeurentree)
-        if not validite:
-            commentaire = "impossible d'evaluer : %s " % repr(valeurentree)
-            return valeur, validite, commentaire
-        if self.node.item.waitTxm() and not (type(valeur) == str):
-            valeur = str(valeur)
-
-        testtype, commentaire = self.node.item.object.verifType(valeur)
-        if not testtype:
-            return valeur, 0, commentaire
-
-        valide = self.node.item.valideItem(valeur)
-        if type(valide) == tuple:
-            validite, commentaire = valide
-        else:
-            validite = valide
-            commentaire = " "
-
-        if not validite and commentaire is None:
-            commentaire = "impossible d'evaluer : %s " % repr(valeurentree)
-        # print ('ds testeUneValeur', valeur, validite, commentaire)
-        return valeur, validite, commentaire
-
-    # ----------------------------------------------------------------------------------------
-    #   Methodes utilisees pour la manipulation des items en notation scientifique
-    #   a mettre au point
-    # ----------------------------------------------------------------------------------------
-    def setValeurTexte(self, texteValeur):
-        try:
-            if "R" in self.node.item.object.definition.type:
-                if texteValeur[0] != "'":
-                    clef = eval(texteValeur)
-                    if str(clef) != str(texteValeur):
-                        self.node.item.object.initModif()
-                        clefobj = self.node.item.object.getNomConcept()
-                        if not clefobj in self.parent.appliEficas.dict_reels:
-                            self.parent.appliEficas.dict_reels[clefobj] = {}
-                        self.parent.appliEficas.dict_reels[clefobj][clef] = texteValeur
-                        self.parent.appliEficas.dict_reels[clefobj]
-                        if clefobj == "":
-                            if (
-                                not self.node.item.object.etape
-                                in self.parent.appliEficas.dict_reels
-                            ):
-                                self.parent.appliEficas.dict_reels[
-                                    self.node.item.object.etape
-                                ] = {}
-                            self.parent.appliEficas.dict_reels[
-                                self.node.item.object.etape
-                            ][clef] = texteValeur
-                        self.node.item.object.finModif()
-        except:
-            pass
-
-    def getValeurTexte(self, valeur):
-        valeurTexte = valeur
-        if valeur == None:
-            return valeur
-        from decimal import Decimal
-
-        if isinstance(valeur, Decimal):
-            if self.node.waitTxm() and not self.isParam(valeur):
-                return "'" + str(valeur) + "'"
-            else:
-                return valeur
-        if "R" in self.node.item.object.definition.type:
-            clefobj = self.node.item.object.getNomConcept()
-            if clefobj in self.parent.appliEficas.dict_reels:
-                if valeur in self.parent.appliEficas.dict_reels[clefobj]:
-                    valeurTexte = self.parent.appliEficas.dict_reels[clefobj][valeur]
-            else:
-                if (
-                    str(valeur).find(".") == -1
-                    and str(valeur).find("e") == -1
-                    and str(valeur).find("E")
-                ):
-                    # aucun '.' n'a ete trouve dans valeur --> on en rajoute un a la fin
-                    if self.isParam(valeur):
-                        return valeur
-                    else:
-                        try:
-                            val2 = eval(str(valeur) + ".")
-                        except:
-                            pass
-        return valeurTexte
-
-    def isParam(self, valeur):
-        for param in self.node.item.jdc.params:
-            if (repr(param) == repr(valeur)) or (str(param) == str(valeur)):
-                return 1
-        return 0
-
-    def ajoutDsDictReel(self, texteValeur):
-        # le try except est necessaire pour saisir les parametres
-        # on enleve l erreur de saisie 00 pour 0
-        if str(texteValeur) == "00":
-            return
-        try:
-            if "R" in self.node.item.object.definition.type:
-                if str(texteValeur)[0] != "'":
-                    clef = eval(texteValeur)
-                    if str(clef) != str(texteValeur):
-                        clefobj = self.node.item.object.getNomConcept()
-                        if not clefobj in self.parent.appliEficas:
-                            self.parent.appliEficas.dict_reels[clefobj] = {}
-                        self.parent.appliEficas.dict_reels[clefobj][clef] = texteValeur
-                        if clefobj == "":
-                            if (
-                                not self.node.item.object.etape
-                                in self.parent.appliEficas.dict_reels
-                            ):
-                                self.parent.appliEficas.dict_reels[
-                                    self.node.item.object.etape
-                                ] = {}
-                            self.parent.appliEficas.dict_reels[
-                                self.node.item.object.etape
-                            ][clef] = texteValeur
-
-        except:
-            pass
-
-    def ajoutDsDictReelEtape(self):
-        try:
-            if self.node.item.object in self.parent.appliEficas.dict_reels:
-                self.parent.appliEficas.dict_reels[
-                    self.node.item.sdnom
-                ] = self.parent.appliEficas.dict_reels[self.node.item.object]
-                del self.parent.appliEficas.dict_reels[self.node.item.object]
-        except:
-            pass
-
-
-# ------------------------------------
-class PolitiqueUnique(Validation):
-    # ------------------------------------
-    """
-    classe servant pour les entrees ne demandant qu un mot clef
-    """
-
-    def __init__(self, node, parent):
-        Validation.__init__(self, node, parent)
-
-    def recordValeur(self, valeurentree):
-        if self.parent.modified == "n":
-            self.parent.initModif()
-        ancienneVal = self.node.item.getValeur()
-        valeur, validite, commentaire = self.testeUneValeur(valeurentree)
-        if (
-            validite
-            and ("R" in self.node.item.object.definition.type)
-            and not (isinstance(valeur, PARAMETRE))
-        ):
-            s = valeurentree
-            if s.find(".") == -1 and s.find("e") == -1 and s.find("E") == -1:
-                s = s + "."
-            valeur, validite, commentaire = self.testeUneValeur(s)
-        if validite:
-            validite = self.node.item.setValeur(valeur)
-            if self.node.item.isValid():
-                commentaire = tr("Valeur du mot-cle enregistree")
-                # commentaire = "Valeur du mot-cle enregistree"
-                self.setValeurTexte(str(valeurentree))
-            else:
-                cr = self.node.item.getCr()
-                commentaire = tr("Valeur du mot-cle non autorisee ") + cr.getMessFatal()
-                self.node.item.setValeur(ancienneVal)
-        return validite, commentaire
-
-
-# --------------------------------------
-class PolitiquePlusieurs(Validation):
-    # --------------------------------------
-    """
-    classe servant pour les entrees ne demandant qu un mot clef
-    """
-
-    def __init__(self, node, parent):
-        # print "ds PolitiquePlusieurs"
-        self.node = node
-        self.parent = parent
-        # print self.node
-        # print self.parent
-
-    def ajoutValeurs(self, listevaleur, index, listecourante):
-        listeRetour = []
-        commentaire = "Nouvelle valeur acceptee"
-        commentaire2 = ""
-        valide = 1
-        if listevaleur == None:
-            return
-        if listevaleur == "":
-            return
-        if not (type(listevaleur) in (list, tuple)):
-            listevaleur = tuple(listevaleur)
-        # on verifie que la cardinalite max n a pas ete atteinte
-        min, max = self.node.item.getMinMax()
-        if len(listecourante) + len(listevaleur) > max:
-            commentaire = (
-                "La liste atteint le nombre maximum d'elements : "
-                + str(max)
-                + " ,ajout refuse"
-            )
-            return False, commentaire, commentaire2, listeRetour
-
-        for valeur in listevaleur:
-            # On teste le type de la valeur
-            valeurScientifique = valeur
-            valide = self.node.item.valideItem(valeur)
-            if not valide:
-                try:
-                    valeur, valide = self.node.item.evalValeur(valeur)
-                    valide, commentaire2 = self.node.item.object.verifType(valeur)
-                except:
-                    # return testtype,commentaire,"",listeRetour
-                    pass
-            if not valide:
-                if commentaire.find("On attend un chaine") > 1:
-                    commentaire = (
-                        "Valeur "
-                        + str(valeur)
-                        + " incorrecte : ajout a la liste refuse: On attend une chaine de caracteres < 8"
-                    )
-                else:
-                    commentaire = (
-                        "Valeur "
-                        + str(valeur)
-                        + " incorrecte : ajout a la liste refuse"
-                    )
-                if commentaire2 == "":
-                    commentaire2 = self.node.item.infoErreurItem()
-                return valide, commentaire, commentaire2, listeRetour
-
-            # On valide la liste obtenue
-            encorevalide = self.node.item.valideListePartielle(valeur, listecourante)
-            if not encorevalide:
-                commentaire2 = self.node.item.infoErreurListe()
-                # On traite le cas ou la liste n est pas valide pour un pb de cardinalite
-                min, max = self.node.item.getMinMax()
-                if len(listecourante) + 1 >= max:
-                    commentaire = (
-                        "La liste atteint le nombre maximum d'elements : "
-                        + str(max)
-                        + " ,ajout refuse"
-                    )
-                    return valide, commentaire, commentaire2, listeRetour
-                if len(listecourante) + 1 > min:
-                    commentaire = ""
-                    return valide, commentaire, commentaire2, listeRetour
-            # On ajoute la valeur testee a la liste courante et a la liste acceptee
-            self.ajoutDsDictReel(valeurScientifique)
-            listecourante.insert(index, valeur)
-            index = index + 1
-            listeRetour.append(valeur)
-
-        return valide, commentaire, commentaire2, listeRetour
-
-    def ajoutTuple(self, valeurTuple, listecourante):
-        listeRetour = []
-        commentaire = "Nouvelle valeur acceptee"
-        commentaire2 = ""
-        valide = 1
-        if valeurTuple == None:
-            return
-        if valeurTuple == [""]:
-            return
-        # On teste le type de la valeur
-        valide = self.node.item.valideItem(valeurTuple)
-        if not valide:
-            try:
-                valeur, valide = self.node.item.evalValeur(valeurTuple)
-                valide = self.node.item.valideItem(valeur)
-            except:
-                pass
-        if not valide:
-            commentaire = (
-                "Valeur " + str(valeurTuple) + " incorrecte : ajout a la liste refuse"
-            )
-            commentaire2 = self.node.item.infoErreurItem()
-            return valide, commentaire, commentaire2, listeRetour
-
-        # On valide la liste obtenue
-        encorevalide = self.node.item.valideListePartielle(valeurTuple, listecourante)
-        if not encorevalide:
-            commentaire2 = self.node.item.infoErreurListe()
-            return valide, commentaire, commentaire2, listeRetour
-        listeRetour.append(valeurTuple)
-        return valide, commentaire, commentaire2, listeRetour
-
-    def ajoutNTuple(self, liste):
-        commentaire = "Nouvelles valeurs acceptee"
-        commentaire2 = ""
-        valide = self.node.item.valideListePartielle(None, liste)
-        print("uuuuuuuuuuu", valide)
-        if not valide:
-            commentaire2 = self.node.item.infoErreurListe()
-        return valide, commentaire, commentaire2
-
-    def recordValeur(self, liste, dejaValide=True):
-        ancienneVal = self.node.item.getValeur()
-        validite = self.node.item.setValeur(liste)
-        if validite:
-            self.node.item.initModif()
-        if self.node.item.isValid():
-            commentaire = tr("Valeur du mot-cle enregistree")
-        else:
-            cr = self.node.item.getCr()
-            commentaire = tr("Valeur du mot-cle non autorisee ") + cr.getMessFatal()
-            self.node.item.setValeur(ancienneVal)
-        return validite, commentaire
index 0553afc5f2e26d6cdd26bb9d72a477090f2ef1af..fa16dfee034fb54aaf10efbcffae61c018145053 100755 (executable)
@@ -28,7 +28,7 @@ from PyQt5.QtCore import Qt, QSize
 from Editeur import session
 from UiQT5.myMain import Ui_Eficas
 from InterfaceGUI.QT5.viewManager import MyViewManager
-from InterfaceGUI.qtEficasSsIhm import AppliSsIhm
+from InterfaceGUI.appliSsIhm import AppliSsIhm
 
 from Extensions.i18n import tr
 from Extensions.eficas_exception import EficasException
diff --git a/InterfaceGUI/QT5/qtSaisie.py b/InterfaceGUI/QT5/qtSaisie.py
deleted file mode 100644 (file)
index 140dd13..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (C) 2007-2024   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 types
-from Extensions.i18n import tr
-
-from PyQt5.QtCore import Qt
-
-
-# Import des panels
-
-
-class SaisieValeur(object):
-    """
-    Classe contenant les methodes communes aux  panels
-    permettant de choisir des valeurs
-    """
-
-    def __init__(self):
-        pass
-
-    def LEvaleurPressed(self, valeur=None):
-        # print('LEvaleurPressed', valeur, type(valeur))
-        if not hasattr(self, "inSaisieValeur"):
-            self.inSaisieValeur = False
-        if self.inSaisieValeur:
-            return
-        self.inSaisieValeur = True
-
-        if valeur == None:
-            try:
-                nouvelleValeur = str(self.lineEditVal.text())
-            except UnicodeEncodeError as e:
-                self.editor.afficheInfos("pb d encoding", Qt.red)
-                validite, commentaire = self.politique.recordValeur(None)
-                self.lineEditVal.setText("")
-                self.setValide()
-                self.inSaisieValeur = False
-                return
-        else:
-            try:
-                # la 1 ligne est tres bizarre. remplacee par le 3nd le 01 10 19
-                # if hasattr(self,"lineEditVal"):self.lineEditVal.setText(tr(valeur.nom))
-                if hasattr(self, "lineEditVal"):
-                    self.lineEditVal.setText(tr(valeur))
-            except:
-                if hasattr(self, "lineEditVal"):
-                    self.lineEditVal.setText(valeur)
-            nouvelleValeur = valeur
-
-        if self.node.item.definition.validators != None:
-            if self.node.item.definition.validators.verifItem(nouvelleValeur) != 1:
-                commentaire = self.node.item.definition.validators.infoErreurItem()
-                self.editor.afficheInfos(commentaire, Qt.red)
-                self.inSaisieValeur = False
-                return
-
-        nouvelleValeurFormat = self.politique.getValeurTexte(nouvelleValeur)
-        validite, commentaire = self.politique.recordValeur(nouvelleValeurFormat)
-        if commentaire != "":
-            if validite:
-                self.editor.afficheCommentaire(commentaire)
-            else:
-                self.editor.afficheInfos(commentaire, Qt.red)
-        self.inSaisieValeur = False
-        self.setValide()
-
-    def TraiteLEValeur(self, valeurTraitee=None):
-        # lit la chaine entree dans le line edit
-        # et la tranforme en chaine de valeurs
-        # a traiter. renvoie eventuellement des complexes
-        listeValeurs = []
-        if valeurTraitee == None:
-            valeurBrute = str(self.LEValeur.text())
-        else:
-            valeurBrute = valeurTraitee
-        if valeurBrute == str(""):
-            return listeValeurs, 1
-
-        try:
-            valeur = eval(valeurBrute, {})
-        except:
-            valeur = valeurBrute
-
-        # pour traiter 11.0 - 30.0 pour le CIST
-        # if (valeurTraitee and (type(valeurTraitee) in types.StringTypes) and (self.node.item.waitTxm())) :
-        if (
-            valeurTraitee
-            and isinstance(valeurTraitee, str)
-            and (self.node.item.waitTxm())
-        ):
-            valeur = str(valeurTraitee)
-
-        if type(valeur) in (list, tuple):
-            if self.node.item.waitComplex():
-                indice = 0
-                while indice < len(valeur):
-                    v = valeur[indice]
-
-                    if v == "RI" or v == "MP":
-                        try:
-                            t = tuple([v, valeur[indice + 1], valeur[indice + 2]])
-                            listeValeurs.append(t)
-                            indice = indice + 3
-                        except:
-                            commentaire = tr(
-                                "Veuillez entrer le complexe sous forme aster ou sous forme python"
-                            )
-                            self.editor.afficheInfos(commentaire)
-                            return listeValeurs, 0
-
-                    else:  # ce n'est pas un tuple a la mode aster
-                        listeValeurs.append(v)
-                        indice = indice + 1
-
-            else:  # on n'attend pas un complexe
-                listeValeurs = valeurBrute.split(",")
-
-        elif type(valeur) == bytes:
-            listeValeurs = valeur.split(",")
-        else:
-            # listeValeurs.append(valeurBrute)
-            listeValeurs.append(valeur)
-
-        return listeValeurs, 1
-
-
-class SaisieSDCO(object):
-    def LESDCOReturnPressed(self):
-        """
-        Lit le nom donne par l'utilisateur au concept de type CO qui doit être
-        la valeur du MCS courant et stocke cette valeur
-        """
-        self.editor.initModif()
-        anc_val = self.node.item.getValeur()
-        if anc_val != None:
-            # il faut egalement propager la destruction de l'ancien concept
-            self.node.item.deleteValeurCo(valeur=anc_val)
-            # et on force le recalcul des concepts de sortie de l'etape
-            self.node.item.object.etape.getType_produit(force=1)
-            # et le recalcul du contexte
-            self.node.item.object.etape.parent.resetContext()
-        nomConcept = str(self.LESDCO.text())
-        if nomConcept == "":
-            return
-
-        test, commentaire = self.node.item.setValeurCo(nomConcept)
-        if test:
-            commentaire = tr("Valeur du mot-clef enregistree")
-            self.node.updateNodeValid()
-        else:
-            cr = self.node.item.getCr()
-            commentaire = tr("Valeur du mot-clef non autorisee :") + cr.getMessFatal()
diff --git a/InterfaceGUI/Web/browser.py b/InterfaceGUI/Web/browser.py
new file mode 100644 (file)
index 0000000..36153db
--- /dev/null
@@ -0,0 +1,429 @@
+# -*- 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
+#
+
+import re
+import types,sys,os
+import traceback
+
+from  Extensions.i18n  import tr
+
+#------------------------------------------
+class JDCTree():
+#------------------------------------------
+
+    def __init__( self, jdc_item, editor):
+    #----------------------------------------
+        #print ('__init__ JDCTree')
+        self.editor        = editor
+        self.plie          = False
+        self.item          = jdc_item
+        self.tree          = self
+        self.appliEficas   = self.editor.appliEficas
+        self.racine        = self.item.itemNode(self,self.item)
+        self.itemCourant=None
+        self.node_selected = self.racine
+        self.inhibeExpand  =  True
+        self.childrenComplete=[]
+        self.oldValidite='init'
+        #print ('fin __init__ JDCTree')
+
+    # def handleContextMenu(self,item,coord):
+    #-------------------------------------
+    # def handleCollapsedItem(self,item):
+    #----------------------------------
+    # def handleExpandedItem(self,item):
+    #----------------------------------
+    # def handleOnItem(self,item,int):
+    #----------------------------------
+    # def choisitPremier(self,name):
+    #----------------------------
+# type de noeud
+COMMENT     = "COMMENTAIRE"
+PARAMETERS  = "PARAMETRE"
+
+#---------------
+class JDCNode():
+#--------------
+    def __init__( self, treeParent, item, itemExpand=False, ancien=False ):
+    #----------------------------------------------------------------------
+        #print ("creation d'un noeud : ", item, " ",item.nom,"", treeParent, treeParent.item.nom,self)
+        self.item        = item
+        self.vraiParent  = treeParent
+        self.treeParent  = treeParent
+        self.tree        = self.treeParent.tree
+        self.editor      = self.treeParent.editor
+        self.appliEficas = treeParent.appliEficas
+        self.firstAffiche = True
+        self.childrenComplete=[]
+        self.oldValidite  = 'init'
+        self.oldRepetable = 'init'
+        self.oldStatut    = 'init'
+        self.item.fauxNoeudGraphique = self
+        if item.nom != tr(item.nom)                           : name = str(tr(item.nom)+" :")
+
+        from . import compomclist
+        from . import compobloc
+        while (isinstance(self.treeParent,compobloc.Node) or ( isinstance(self.treeParent,compomclist.Node) and self.treeParent.item.isMCList())) :
+            self.treeParent=self.treeParent.vraiParent
+
+        self.children = []
+        self.buildChildren()
+
+        self.item.connect("valid",self.onValid,())
+        self.item.connect("supp" ,self.onSupp,())
+        self.item.connect("add"  ,self.onAdd,())
+        self.item.connect("demandeUpdateOptionnels"  ,self.updateOptionnels,())
+
+
+    def onValid(self):
+    #-----------------
+        debug=0
+        validite=self.item.isValid()
+        if debug : print ('ds onValid', self.item.nom, self.oldValidite, validite)
+        if self.oldValidite==validite : return
+        if self.oldValidite=='init' : 
+           self.oldValidite=validite
+           if debug : print ('self.item.state' , self.item.state)
+           if self.item.state != 'modified' :  return
+        self.oldValidite=validite
+        self.editor.connecteur.toWebApp('propageValide',self.getIdUnique(), validite)
+        if debug : print ('appel de propageValide pour ', self.item.nom, validite,self.oldValidite)
+
+    def onAdd(self,ajout):
+    #----------------------
+        # derive pour MCList et MCBLOC
+        debug=0
+        if debug : print ('on add de browser', '________ ajout', ajout, ' dans ', self.item.nom)
+        if debug : print ('nature de  l item', self.item.nature)
+        #if self.oldValidite=='init'  : self.oldValidite='unknown'
+        self.buildChildren()
+
+        # si on a un copie multiple --> pas gere correctement 
+        # pas gere du tout
+        if len(ajout) > 1 : 
+            return
+        # test inutile
+        ouAjouter=self.getIdUnique()
+
+        mcAjoute= ajout[0]  
+        posDansSelf = 0; 
+        trouve=0
+        posDansArbre=0
+        for c in self.children :
+            if c.item._object == mcAjoute : 
+                 trouve=1
+                 break
+            posDansSelf +=1 
+            posDansArbre+=c.item.longueurDsArbreAvecConsigne()
+
+        if not trouve : print ('browser : souci au add *************************')
+        if debug : print  ('uuuu posDansSelf', posDansSelf)
+        if debug : print  ('posDansArbre', posDansArbre)
+
+        if self.children[posDansSelf].item.nature == 'MCBLOC' : laListe=self.children[posDansSelf].item.getDicoForFancy()
+        elif self.children[posDansSelf].item.nature == 'MCList' : laListe=self.children[posDansSelf].item.getDicoForFancy()
+        else : laListe=(self.children[posDansSelf].item.getDicoForFancy(),)
+
+        posOuAjouter=posDansArbre
+               
+        self.editor.connecteur.toWebApp('appendChildren',ouAjouter,laListe,posOuAjouter)
+        #print ('la pos ', posOuAjouter)
+        #print (' appel appendChild',self.item.idUnique,laListe,pos)
+
+    def onSupp(self,suppression):
+    #---------------------------
+        #if self.treeParent.oldValidite=='init'  : self.treeParent.oldValidite='unknown'
+        if len(suppression) > 1 : 
+            print ('onSupp suppression multiple non valeur')
+            return
+        mcSupprime= suppression[0]  
+        if mcSupprime.nature == 'MCBLOC' : 
+            liste=[]
+            listeMC=mcSupprime.getAllChildInBloc()
+            for mc in listeMC : liste.append(mc.idUnique)
+        elif mcSupprime.nature == 'MCList' : 
+            liste=[]
+            for mc in mcSupprime.data :
+               liste.append(mc.idUnique)
+        else :
+            liste=(mcSupprime.idUnique,)
+        self.buildChildren()
+        self.updateOptionnels()
+        self.editor.connecteur.toWebApp('deleteChildren',liste)
+        #print (' appel deleteChildren',liste)
+
+    def onRedessine(self):
+    #----------------------
+        print ('on Redessine pour ', self)
+    #---------------------
+    #    self.affichePanneau()
+
+    def getIdUnique(self):
+    #---------------------
+    # surcharge pour mcliste
+        return self.item.idUnique
+
+    def getTreeParentIdUnique(self):
+    #------------------------------
+        return self.treeParent.getIdUnique()
+
+    def buildChildren(self,posInsertion=10000):
+    #------------------------------------------
+        """ Construit la liste des enfants de self """
+        """ Se charge de remettre les noeuds Expanded dans le meme etat """
+        debug=0
+        if debug : print ("*********** buildChildren ",self,self.item, self.item.nom,self.children)
+        if debug : print ("*********** buildChildren ",self,self.item, self.item.nom)
+
+
+        self.children = []
+        self.childrenItemComplete = []
+        sublist = self.item._getSubList()
+        if debug :
+           print ('sublist : ')
+           for s in sublist : print (s.nom)
+        ind=0
+
+        # si le faux noeud graphique existe deja on ne le recree pas
+        # sinon on a trop de connect sur les items
+        for item in sublist :
+            if hasattr(item,'fauxNoeudGraphique') :
+               self.children.append(item.fauxNoeudGraphique)
+            else:
+               nouvelItem=item.itemNode(self,item)
+               item.fauxNoeudGraphique=nouvelItem
+               self.children.append(nouvelItem)
+        self.childrenItemComplete=self.construitChildrenComplete()
+
+        if debug : print ("fin *********** buildChildren ",self,self.item, self.item.nom, self.children)
+
+     
+    def construitChildrenComplete(self):
+    # PN a tester avec des blocs de blocs
+         from . import compobloc
+         liste=[]
+         for itemFils in self.item._getSubList():
+            if isinstance(itemFils,compobloc.Node):
+                for itemPetitFils in itemFils.construitChildrenComplete():
+                  liste.append(itemPetitFils)
+                  itemPetitFils.treeParent=self
+            else :
+                liste.append(itemFils)
+         return liste
+            
+
+    def getDicoObjetsPourWeb(self):
+        return self.item.getDicoObjetsPourWeb()
+
+    def getDicoObjetsCompletsPourTree(self):
+        #print ('browser getDicoObjetsCompletsPourTree', self, ' ', self.item)
+        return self.item.getDicoObjetsCompletsPourTree()
+
+    def getDicoForFancy(self):
+        return self.item.getDicoForFancy()
+
+    def appendChild(self,name,pos=None):
+    #-----------------------------------
+        """
+           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.
+           Attention a la delegation et aux dictionnaires 
+        """
+        debug=0
+        if debug : print ("************** appendChild ",self.item.getLabelText(), pos, name )
+
+        if self.item.nature != 'JDC' : dictMCVenantDesBlocs=self.item.object.dictMCVenantDesBlocs
+        else : dictMCVenantDesBlocs={}
+
+        if debug : print ("dictMCVenantDesBlocs" , dictMCVenantDesBlocs)
+        if name in dictMCVenantDesBlocs  :
+        # cas d un MC sous un bloc
+            mcPere = self.item.object.dictMCVenantDesBlocs[name]
+            try :
+                if   pos == 'first'       : index = 0
+                elif pos == 'last'        : index = len(self.children)
+                elif type(pos)   == int   : index = pos  # position fixee
+                elif type(pos)  == object : index = mcPere.getIndex(pos) +1 # pos est un item. Il faut inserer name apres pos
+                elif type(name) == object : index = mcPere.getIndexChild(name.nom)
+                elif self.item.nature != 'JDC' : index = mcPere.getIndexChild(name)
+                else : index = self.item.getIndexChild(name)
+                #else : return None
+            except :
+                txt=' Impossible d ajouter {} en position {}'.format(name, pos)
+                self.editor.afficheInfos(txt,'rouge')
+                return None
+            if debug : print ('name : ', name, ' a pour index : ', index)
+            obj = mcPere.addEntite(name,index)
+            if debug : print ('mcPere', mcPere.nom, mcPere.mcListe)
+        else : 
+            try :
+                if   pos == 'first'       : index = 0
+                elif pos == 'last'        : index = len(self.children)
+                elif type(pos)   == int   : index = pos  # position fixee
+                elif type(pos)  == object : index = self.item.getIndex(pos) +1 # pos est un item. Il faut inserer name apres pos
+                elif type(name) == object : index = self.item.getIndexChild(name.nom)
+                elif self.item.nature != 'JDC' : index = self.item.getIndexChild(name)
+                else : index = self.item.getIndexChild(name)
+                #else : return None
+            except :
+                txt=' Impossible d ajouter {} en position {}'.format(name, pos)
+                self.editor.afficheInfos(txt,'rouge')
+                return None
+            if debug : print ('name : ', name, ' a pour index : ', index)
+            obj = self.item.addEntite(name,index) # emet le signal 'add'
+        
+        if not obj : return None
+        if debug : print ('obj', obj.nom, obj.mcListe)
+        self.updateOptionnels()
+        return True
+        #return child.getIdUnique()
+
+    def delete(self):
+    #----------------
+        """
+            Methode externe pour la destruction de l'objet associe au noeud
+        """
+        #print ('browser :_appel de delete _______', self, self.vraiParent, self.item.nature)
+        
+        ret,commentaire=self.vraiParent.item.suppItem(self.item)
+        if ret!=0 : 
+           self.treeParent.buildChildren()
+           self.treeParent.updateOptionnels()
+        return (ret,commentaire) 
+
+    def updateNodeLabel(self):
+    #-------------------------
+        monDictPartiel={} 
+        label=self.item.getLabelText()[0]
+        if label[-1]==":" : label=label[0:-1]
+        monDictPartiel['title']=label
+        self.editor.connecteur.toWebApp('updateNodeInfo',self.getIdUnique(), monDictPartiel)
+
+    def updateRepetable(self,isRepetable):
+    #-------------------------------------
+        if self.oldRepetable == isRepetable : return
+        self.oldRepetable = isRepetable 
+        monDictPartiel={} 
+        monDictPartiel['repetable']=isRepetable
+        self.editor.connecteur.toWebApp('updateNodeInfo',self.getIdUnique(), monDictPartiel)
+
+    def updateStatut(self,statut):
+    #-----------------------------
+        if self.oldStatut == statut : return
+        self.oldStatut = statut 
+        monDictPartiel={} 
+        monDictPartiel['statut']=statut
+        self.editor.connecteur.toWebApp('updateNodeInfo',self.getIdUnique(), monDictPartiel)
+
+    def updateOptionnels(self):
+    #---------------------------
+        if self.item.nature == 'MCList' or self.item.nature == 'JDC' or self.item.nature=='MCSIMP' : return
+        monDictPartiel={} 
+        monDictPartiel['infoOptionnels'] = self.item.calculOptionnelInclutBlocs()
+        self.editor.connecteur.toWebApp('updateNodeInfo',self.getIdUnique(), monDictPartiel)
+
+    #def chercheNoeudCorrespondant(self,objSimp):
+    #-------------------------------------------
+    #    sublist = self.item._getSubList()
+    #    for node in self.childrenComplete:
+    #        if node.item.object==objSimp : return node
+    #    return None
+    #def afficheCeNiveau(self):
+    #-------------------------
+    #def getPanelModifie(self):
+    #-------------------------
+    #def affichePanneau(self) :
+    #-------------------------
+    #def createPopUpMenu(self):
+    #-------------------------
+    #def commentIt(self):
+    #-------------------------
+    #def unCommentIt(self):
+    #-------------------------
+    #def addComment( self, after=True ):
+    #-----------------------------------
+    #def addParameters( self, after=True ):
+    #-------------------------------------
+    #def select( self ):
+    #------------------
+    #------------------------------------------------------------------
+    # Methodes de creation et destruction de noeuds
+    #------------------------------------------------------------------
+    #def appendBrother(self,name,pos='after',plier=False):
+    #----------------------------------------------------
+    #def verifiePosition(self,name,pos,aLaRacine=False):
+    #----------------------------------------------------
+    #def deplace(self):
+    #-----------------
+    #def deleteMultiple(self,liste=()):
+    #--------------------------------
+
+    #def updateNodeValid(self):
+    #-----------------------
+        
+    #def updateNodeLabelInBlack(self):
+    #-------------------------------
+    #def updateNodeLabelInBlue(self):
+    #-------------------------------
+    #def updatePlusieursNodeLabelInBlue(self,liste):
+    #----------------------------------------------
+    #def updateNodeTexteInBlack(self):
+    #--------------------------------
+    #def updateNodeTexte(self):
+    #----------------------------
+    #def updateNodeTexteInBlue(self):
+    #--------------------------------
+    #def updateNodes(self):
+    #--------------------------------
+    #def updateValid(self) :
+    #----------------------
+    #def updateTexte(self):
+    #----------------------
+    #def forceRecalculChildren(self,niveau):
+    #--------------------------------------
+    #def doPaste(self,node_selected,pos='after'):
+    #--------------------------------------------
+    #def doPasteCommande(self,objet_a_copier,pos='after'):
+    #-----------------------------------------------------
+    #def doPastePremier(self,objet_a_copier):
+    #---------------------------------------
+    #def plieToutEtReafficheSaufItem(self, itemADeplier):
+    #---------------------------------------------------
+    #def plieToutEtReaffiche(self):
+    #-----------------------------
+    #def deplieToutEtReaffiche(self):
+    #-----------------------------
+    #def setPlie(self):
+    #-----------------
+    #def setPlieChildren(self):
+    #-----------------------------
+    #def setDeplie(self):
+    #-----------------------------
+    #def setDeplieChildren(self):
+    #-----------------------------
+    #def selectAvant(self):
+    #-----------------------------
+    #def selectApres(self):
+    #---------------------
+
diff --git a/InterfaceGUI/Web/compobloc.py b/InterfaceGUI/Web/compobloc.py
new file mode 100644 (file)
index 0000000..c292d1c
--- /dev/null
@@ -0,0 +1,92 @@
+# -*- 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
+#
+
+
+from Editeur  import Objecttreeitem
+
+from InterfaceGUI.Web import compofact
+from InterfaceGUI.Web import browser
+from InterfaceGUI.Web import typeNode
+
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
+
+
+
+    def onAdd(self,ajout):
+    #----------------------
+        debug=0
+        if debug : print ('on add de mcbloc', '________ ajout', ajout, ' dans ', self.item.nom)
+        if debug : print ('nature de  l item', self.item.nature)
+        self.buildChildren()
+
+        # si on a un copie multiple --> pas gere correctement 
+        # pas gere du tout
+        if len(ajout) > 1 : 
+            print ('ajout multiple non gere')
+            return
+        ouAjouter=self.getTreeParentIdUnique()
+
+        mcAjoute= ajout[0]  
+        posDansSelf = 0; 
+        trouve=0
+        posDansArbre=0
+
+        for c in self.children :
+            if c.item._object == mcAjoute : 
+                 trouve=1
+                 break
+            posDansSelf +=1 
+            posDansArbre+=c.item.longueurDsArbreAvecConsigne()
+        if not trouve : print ('souci au add *************************')
+        if debug : print  ('posDansSelf', posDansSelf)
+        if debug : print  ('posDansArbre', posDansSelf)
+        if self.children[posDansSelf].item.nature == 'MCBLOC' : laListe=self.children[posDansSelf].item.getDicoForFancy()
+        else : laListe=(self.children[posDansSelf].item.getDicoForFancy(),)
+
+        posOuAjouter=posDansArbre
+        mesParents=self.item.getParentsJusqua(self.treeParent.item)
+        mesParents.insert(0,self.item.getObject())
+        index=0
+        while index < len(mesParents) -1 :
+            parentTraite=mesParents[index+1]
+            jusqua=mesParents[index]
+            for c in parentTraite.mcListe:
+                if c == jusqua :  break
+                posOuAjouter += c.longueurDsArbreAvecConsigne()
+            index=index+1
+               
+
+        self.editor.connecteur.toWebApp('appendChildren',ouAjouter,laListe,posOuAjouter)
+        #print ('la pos ', posOuAjouter)
+        #print (' appel appendChild',self.item.idUnique,laListe,pos)
+
+
+class BLOCTreeItem(compofact.FACTTreeItem):
+    itemNode=Node
+
+    def isCopiable(self):
+        return 0
+
+
+import Accas
+treeitem = BLOCTreeItem
+objet = Accas.MCBLOC
diff --git a/InterfaceGUI/Web/compofact.py b/InterfaceGUI/Web/compofact.py
new file mode 100644 (file)
index 0000000..3e3490e
--- /dev/null
@@ -0,0 +1,146 @@
+# -*- 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
+#
+
+from InterfaceGUI.Web import browser
+from InterfaceGUI.Web import typeNode
+from Extensions.i18n import tr
+from Editeur     import Objecttreeitem
+
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNodePartiel):
+
+
+    def delete(self):
+    #----------------
+        """
+            Methode externe pour la destruction de l'objet associe au noeud
+        """
+        debug = 0
+        if debug : print ('******* mcfact :_appel de delete _______', self, self.vraiParent, self.item.nature)
+        if len(self.vraiParent.item._object) == 1 :
+             treeParent=self.vraiParent.treeParent
+             ret,commentaire=self.vraiParent.treeParent.item.suppItem(self.vraiParent.item)
+             if ret!=0 : treeParent.buildChildren()
+             return (ret,commentaire) 
+
+     
+        obj=self.item.getObject()
+        indexFact=self.vraiParent.item._object.index(obj)
+        ret,commentaire=self.vraiParent.item.suppItem(self.item)
+        if not ret : return (ret,commentaire) 
+        self.treeParent.buildChildren()
+        self.vraiParent.buildChildren()
+        for c in  self.vraiParent.children[indexFact:] :
+            c.updateNodeLabel()
+        self.treeParent.updateOptionnels()
+        return (ret,commentaire) 
+
+
+
+class FACTTreeItem(Objecttreeitem.ObjectTreeItem):
+    itemNode=Node
+
+    def isExpandable(self):
+    # ----------------------
+        return 1
+
+    def getText(self):
+    # ----------------
+        return  ''
+
+    def getLabelText(self):
+    # ----------------------
+        """ Retourne 3 valeurs :
+          - le texte à afficher dans le noeud representant l'item
+          - la fonte dans laquelle afficher ce texte
+          - la couleur du texte
+        """
+        # None --> fonte et couleur par defaut
+        if not(hasattr(self.object,'getLabelText')): return self.object.nom,None,None
+        return self.object.getLabelText(),None,None
+
+    def isValid(self):
+    # ----------------
+        return self.object.isValid()
+
+    def isCopiable(self):
+    # ----------------
+        return 1
+
+    def getIconName(self):
+    # ----------------
+        if self.object.isValid()  : return "ast-green-los"
+        elif self.object.isOblig(): return "ast-red-los"
+        else                      : return "ast-yel-los"
+
+
+    def getSubList(self):
+    # ----------------
+        """
+           Reactualise la liste des items fils stockes dans self.sublist
+        """
+        liste=self.object.mcListe
+        sublist=[None]*len(liste)
+        # suppression des items lies aux objets disparus
+        for item in self.sublist:
+            old_obj=item.getObject()
+            if old_obj in liste:
+                pos=liste.index(old_obj)
+                sublist[pos]=item
+            else:
+                pass # objets supprimes ignores
+        # ajout des items lies aux nouveaux objets
+        pos=0
+        for obj in liste:
+            if sublist[pos] is None:
+                # nouvel objet : on cree un nouvel item
+                def setFunction(value, object=obj):
+                    object.setval(value)
+                item = self.makeObjecttreeitem(self.appliEficas, obj.nom + " : ", obj, setFunction)
+                sublist[pos]=item
+            pos=pos+1
+
+        self.sublist=sublist
+        return self.sublist
+
+    #def addItem(self,name,pos):
+    #    objet = self.object.addEntite(name,pos)
+    #    return objet
+
+    def suppItem(self,item) :
+        """
+           Cette methode a pour fonction de supprimer l'item passee en argument
+           dans l'item FACT qui est son pere
+             - item = item du MOCLE a supprimer du MOCLE pere
+             - item.getObject() = MCSIMP ou MCBLOC
+        """
+        itemobject=item.getObject()
+        if itemobject.isOblig() :
+            return (0, tr('Impossible de supprimer un mot-cle obligatoire '))
+
+        if self.object.suppEntite(itemobject):
+            message = tr("Mot-cle %s supprime")+ itemobject.nom
+            return (1, message)
+        else:
+            return (0,tr('Pb interne : impossible de supprimer ce mot-cle'))
+
+import Accas
+objet = Accas.MCFACT
+treeitem = FACTTreeItem
diff --git a/InterfaceGUI/Web/compojdc.py b/InterfaceGUI/Web/compojdc.py
new file mode 100644 (file)
index 0000000..6dd5250
--- /dev/null
@@ -0,0 +1,126 @@
+# -*- 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
+#
+
+from Editeur import Objecttreeitem
+from InterfaceGUI.Web import browser
+from InterfaceGUI.Web import typeNode
+from Extensions.i18n import tr
+
+
+class Node(browser.JDCNode,typeNode.PopUpMenuRacine):
+
+
+    def addParameters(self,apres):
+        param=self.appendChild("PARAMETRE",pos=0)
+        return param
+
+
+class JDCTreeItem(Objecttreeitem.ObjectTreeItem):
+    itemNode=Node
+
+    def isExpandable(self):
+        return 1
+
+    def getText(self):
+        return  "    "
+
+    def getLabelText(self):
+        # None --> fonte et couleur par defaut
+        return tr(self.object.nom),None,None
+
+    def getJdc(self):
+        """
+        Retourne l'objet pointe par self
+        """
+        return self.object
+
+    def getIconName(self):
+        if self.object.isValid():
+            return "ast-green-square"
+        else:
+            return "ast-red-square"
+
+
+    #def addItem(self,name,pos):
+    #    cmd = self._object.addEntite(name,pos)
+    #    return cmd
+
+    def suppItem(self,item) :
+        # item             = item de l'ETAPE a supprimer du JDC
+        # item.getObject() = ETAPE ou COMMENTAIRE
+        # self.object      = JDC
+
+        itemobject=item.getObject()
+        if self.object.suppEntite(itemobject):
+            if itemobject.nature == "COMMENTAIRE" :
+                message = tr("Commentaire supprime")
+            else :
+                message = tr("Commande %s supprimee",itemobject.nom)
+            return 1,message
+        else:
+            message=tr("Pb interne : impossible de supprimer cet objet")
+            return 0,message
+
+    def getSubList(self):
+        """
+           Retourne la liste des items fils de l'item jdc.
+           Cette liste est conservee et mise a jour a chaque appel
+        """
+        if self.object.etapes_niveaux != []:
+            liste = self.object.etapes_niveaux
+        else:
+            liste = self.object.etapes
+        sublist=[None]*len(liste)
+        # suppression des items lies aux objets disparus
+        for item in self.sublist:
+            old_obj=item.getObject()
+            if old_obj in liste:
+                pos=liste.index(old_obj)
+                sublist[pos]=item
+            else:
+                pass # objets supprimes ignores
+        # ajout des items lies aux nouveaux objets
+        pos=0
+        for obj in liste:
+            if sublist[pos] is None:
+                # nouvel objet : on cree un nouvel item
+                item = self.makeObjecttreeitem(self.appliEficas, obj.nom + " : ", obj)
+                sublist[pos]=item
+            pos=pos+1
+
+        self.sublist=sublist
+        return self.sublist
+
+    def getLNomsEtapes(self):
+        """ Retourne la liste des noms des etapes de self.object"""
+        return self.object.getLNomsEtapes()
+
+    def getListeCmd(self):
+        listeCmd = self.object.niveau.definition.getListeCmd()
+        return listeCmd
+
+    def getValidite(self):
+        return self.object.isValid()
+
+      
+
+import Accas
+treeitem =JDCTreeItem
+objet = Accas.JDC
diff --git a/InterfaceGUI/Web/compomclist.py b/InterfaceGUI/Web/compomclist.py
new file mode 100644 (file)
index 0000000..989dd0b
--- /dev/null
@@ -0,0 +1,283 @@
+# -*- 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
+#
+
+import types
+import traceback
+
+from InterfaceGUI.Web import compofact
+from InterfaceGUI.Web import browser
+from InterfaceGUI.Web import typeNode
+from Extensions.i18n import tr
+
+from Editeur     import Objecttreeitem
+from Noyau.N_OBJECT import ErrorObj
+
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
+
+
+    def __init__( self, treeParent, item, itemExpand=False, ancien=False ):
+    #--------------------------------------------------------------------
+        browser.JDCNode.__init__(self, treeParent, item, itemExpand,ancien)
+        # depend si le comm contient deja une liste ou si elle cree a  l ihm
+        if self.item.nature == 'MCList' :
+           self.minListe   = self.item.data[0].definition.min
+           self.maxListe   = self.item.data[0].definition.max
+           self.statutListe= self.item.data[0].definition.statut
+        else:
+           self.minListe   = self.item.definition.min
+           self.maxListe   = self.item.definition.max
+           self.statutListe= self.item.definition.statut
+
+    def getIdUnique(self):
+    #---------------------
+        print ('pas d iD unique pour la MCLIST')
+       # on renvoie l'ID du 1er MCFact
+       # print (self.item._object[0].idUnique)
+        return self.item._object[0].idUnique
+
+    def onValid(self):
+    #-----------------
+       # on ne fait rien
+       pass
+
+    def onValidBad(self):
+    #-----------------
+       #print( self.item.nature)
+        if self.item.nature == 'MCFACT' : 
+            validite=self.item.isValid()
+            if self.oldValidite != validite :
+               self.editor.connecteur.toWebApp('propageValide',self.item.idUnique, validite)
+               self.oldValidite = validite
+
+        if self.item.state != 'modified' :  return
+        self.treeParent.item.state= 'modified'
+
+    def onAdd(self,ajout):
+    #----------------------
+        debug=0
+        if debug : print (' ***************** on add de compomclist', 'ajout', ajout, ' dans ', self.item.nom, self.item, self)
+        if debug : print ('on add de compomclist', '______ ajout', ajout, ' dans ', self.item.nom, self.item, self)
+        if debug : print ('nature de l ajout', ajout[0].nature)
+
+        self.buildChildren()
+
+        # si on a un copie multiple --> pas gere correctement 
+        # pas gere du tout
+        if len(ajout) > 1 : 
+            print ('add multiple non gere')
+            return
+        ouAjouter=self.getTreeParentIdUnique()
+
+        mcAjoute= ajout[0]  
+        posDansSelf = 0; 
+        trouve=0
+        # a priori on ajoute toujours le dernier FACT a la MCListe
+        # on garde quand meme la boucle si cela evolue
+        for c in self.children :
+            if c.item._object == mcAjoute :
+                 trouve=1
+                 break
+            posDansSelf +=1 
+        if not trouve : print ('souci au add *************************')
+        if debug : print  ('posDansSelf', posDansSelf)
+        if debug : print (self.children[posDansSelf].item.getDicoForFancy())
+        laListe=(self.children[posDansSelf].item.getDicoForFancy(),)
+
+
+        posDansArbre = posDansSelf; 
+        for c in self.treeParent.children : 
+            if  c == self: break
+            posDansArbre +=c.item.longueurDsArbreAvecConsigne()
+
+        if debug : print  (' posDansArbre ', posDansArbre , ' posDansSelf ', posDansSelf)
+        self.editor.connecteur.toWebApp('appendChildren',ouAjouter,laListe,posDansArbre)
+        #print ('la pos ', posOuAjouter)
+        #print (' appel appendChild',self.item.idUnique,laListe,pos)
+        self.updateChildrenProperties()
+
+
+    def onSupp(self,suppression):
+    #---------------------------
+        browser.JDCNode.onSupp(self, suppression)
+        self.updateChildrenProperties()
+
+    
+    def updateChildrenProperties(self):
+    #----------------------------------
+        if self.item.nature == 'MCFACT': 
+           children=(self.item.fauxNoeudGraphique,)
+           children[0].updateNodeLabel()
+        else :
+           if len(self.item.data) == 2 : self.children[0].updateNodeLabel()
+           children=self.children
+        for nodeChild in children : 
+           if nodeChild.item.isOblig() : newStatut ='o'
+           else : newStatut = 'f' 
+           if  newStatut != nodeChild.oldStatut : 
+               nodeChild.updateStatut(newStatut) 
+               nodeChild.oldStatut=newStatut
+           newRepetable=nodeChild.item.isRepetable()
+           if  newRepetable != nodeChild.oldRepetable : 
+               nodeChild.updateRepetable(newRepetable) 
+               nodeChild.oldRepetable=newRepetable
+           
+
+
+class MCListTreeItem(Objecttreeitem.SequenceTreeItem,compofact.FACTTreeItem):
+    """ La classe MCListTreeItem joue le role d'un adaptateur pour les objets
+        du noyau Accas instances de la classe MCLIST.
+        Elle adapte ces objets pour leur permettre d'etre integres en tant que
+        noeuds dans un arbre graphique (voir treewidget.py et ObjectTreeItem.py).
+        Cette classe delegue les appels de methode et les acces
+        aux attributs a l'objet du noyau soit manuellement soit
+        automatiquement (voir classe Delegate et attribut object).
+    """
+    itemNode=Node
+
+    def init(self):
+        # Avant Si l'objet Accas (MCList) a moins d'un mot cle facteur
+        # on utilise directement ce mot cle facteur comme delegue
+        self.updateDelegate()
+
+    def updateDelegate(self):
+        self.setDelegate(self._object)
+        return
+        if len(self._object) > 1:
+            self.setDelegate(self._object)
+        else:
+            self.setDelegate(self._object.data[0])
+
+    def isExpandable(self):
+        if len(self._object) > 1:
+            return Objecttreeitem.SequenceTreeItem.isExpandable(self)
+        else:
+            return compofact.FACTTreeItem.isExpandable(self)
+
+
+    def getSubList(self):
+        self.updateDelegate()
+        
+        #if len(self._object) <= 1:
+        #    self._object.data[0].alt_parent=self._object
+        #    return compofact.FACTTreeItem.getSubList(self)
+
+        liste=self._object.data
+        sublist=[None]*len(liste)
+
+        # suppression des items lies aux objets disparus
+        for item in self.sublist:
+            old_obj=item.getObject()
+            if old_obj in liste:
+                pos=liste.index(old_obj)
+                sublist[pos]=item
+            else:
+                pass # objets supprimes ignores
+        # ajout des items lies aux nouveaux objets
+        pos=0
+        for obj in liste:
+            if sublist[pos] is None:
+                # nouvel objet : on cree un nouvel item
+                def setFunction(value, object=obj):
+                    object=value
+                item = self.makeObjecttreeitem(self.appliEficas, obj.nom + " : ", obj, setFunction)
+                sublist[pos]=item
+                #Attention : on ajoute une information supplementaire pour l'actualisation de
+                # la validite. L'attribut parent d'un MCFACT pointe sur le parent de la MCLISTE
+                # et pas sur la MCLISTE elle meme ce qui rompt la chaine de remontee des
+                # informations de validite. alt_parent permet de remedier a ce defaut.
+                obj.alt_parent=self._object
+            pos=pos+1
+
+        self.sublist=sublist
+
+        #if len(self._object) <= 1:
+        #    self._object.data[0].alt_parent=self._object
+        #    return compofact.FACTTreeItem.getSubList(self)
+
+        return self.sublist
+
+    def getIconName(self):
+        if self._object.isValid():
+            return "ast-green-los"
+        elif self._object.isOblig():
+            return "ast-red-los"
+        else:
+            return "ast-yel-los"
+
+    def getDocu(self):
+        """ Retourne la clef de doc de l'objet pointe par self """
+        return self.object.getDocu()
+
+    def isCopiable(self):
+        if len(self._object) > 1:
+            return Objecttreeitem.SequenceTreeItem.isCopiable(self)
+        else:
+            return compofact.FACTTreeItem.isCopiable(self)
+
+    def isMCFact(self):
+        """
+        Retourne 1 si l'objet pointe par self est un MCFact, 0 sinon
+        """
+        return len(self._object) <= 1
+
+    def isMCList(self):
+        """
+        Retourne 1 si l'objet pointe par self est une MCList, 0 sinon
+        """
+        return len(self._object) > 1
+
+    def getCopieObjet(self):
+        return self._object.data[0].copy()
+
+    #def addItem(self,obj,pos):
+    #    print ("compomclist.addItem",obj,pos)
+    #    if len(self._object) <= 1:
+    #        return compofact.FACTTreeItem.addItem(self,obj,pos)
+    #    o = self.object.addEntite(obj,pos)
+    #    return o
+
+    def suppItem(self,item):
+        """
+        Retire un objet MCFACT de la MCList (self.object)
+        """
+        #print "compomclist.suppItem",item
+        obj=item.getObject()
+        if len(self._object) <= 1:
+            return compofact.FACTTreeItem.suppItem(self,item)
+
+        if self.object.suppEntite(obj):
+            if len(self._object) == 1: self.updateDelegate()
+            message = "Mot-clef " + obj.nom + " supprime"
+            return (1,message)
+        else:
+            return (0,tr('Impossible de supprimer ce mot-clef'))
+
+            
+
+import Accas
+objet = Accas.MCList
+
+def treeitem(appliEficas,labeltext,object,setFunction):
+    """ Factory qui produit un objet treeitem adapte a un objet
+        Accas.MCList (attribut objet de ce module)
+    """
+    return MCListTreeItem(appliEficas,labeltext,object,setFunction)
diff --git a/InterfaceGUI/Web/compooper.py b/InterfaceGUI/Web/compooper.py
new file mode 100644 (file)
index 0000000..af3e073
--- /dev/null
@@ -0,0 +1,270 @@
+#-*- coding: iso-8859-1 -*-
+# 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
+#
+from __future__ import absolute_import
+try :
+    from builtins import str
+except : pass
+
+import os
+
+from Extensions.i18n import tr
+from Extensions.eficas_exception import EficasException
+from Editeur     import Objecttreeitem
+from InterfaceGUI.Web import browser
+from InterfaceGUI.Web import typeNode
+
+class Node(browser.JDCNode, typeNode.PopUpMenuNode):
+
+
+    def select(self):
+        pass
+
+    def updateSDName(self,nom):
+        debug=1
+        if debug : print ('updateSDName' , self.item.nom, nom)
+        bOk,message = self.item.nommeSd(nom)
+        if debug : print ('bool', bOk,'message', message)
+        return (bOk,message)
+    #    pass
+
+    #def getPanel(self):
+    #    from .monWidgetCommande import MonWidgetCommande
+    #    return MonWidgetCommande(self,self.editor,self.item.object)
+
+    #def createPopUpMenu(self):
+    #    typeNode.PopUpMenuNode.createPopUpMenu(self)
+#
+#    def view3D(self) :
+#        from Editeur import TroisDPal
+#        troisD=TroisDPal.TroisDPilote(self.item,self.editor.appliEficas)
+#        troisD.envoievisu()
+
+
+class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
+    """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
+        Accas. Elle leur permet d'etre affichés comme des noeuds
+        d'un arbre graphique.
+        Cette classe a entre autres deux attributs importants :
+          - _object qui est un pointeur vers l'objet du noyau
+          - object qui pointe vers l'objet auquel sont délégués les
+            appels de méthode et les acces aux attributs
+        Dans le cas d'une ETAPE, _object et object pointent vers le
+        meme objet.
+    """
+    itemNode=Node
+
+    def isExpandable(self):
+        return 1
+
+    def getIconName(self):
+        """
+        Retourne le nom de l'icone a afficher dans l'arbre
+        Ce nom depend de la validite de l'objet
+        """
+        if not self.object.isActif():
+            return "ast-white-square"
+        elif self.object.isValid():
+            return "ast-green-square"
+        else:
+            valid=self.validChild()
+            valid= valid * self.validRegles("non")
+            if self.reste_val != {} : valid=0
+            if valid==0  :
+                return "ast-red-square"
+            else :
+                try :
+                # on traite ici le cas d include materiau
+                #  print self.object.definition.nom
+                    if  self.object.fichier_ini != self.object.nom_mater :
+                        return "ast-red-square"
+                except :
+                    pass
+                return "ast-yellow-square"
+
+    def getLabelText(self):
+        """ Retourne 3 valeurs :
+        - le texte a afficher dans le noeud représentant l'item
+        - la fonte dans laquelle afficher ce texte
+        - la couleur du texte
+        """
+        return self.labeltext,None,None
+        #if self.object.isActif():
+        # None --> fonte et couleur par défaut
+        #  return self.labeltext,None,None
+        #else:
+        #  return self.labeltext, None, None #CS_pbruno todo
+
+    #def get_objet(self,name) :
+    #    for v in self.object.mcListe:
+    #        if v.nom == name : return v
+    #    return None
+
+   # def getType_sd_prod(self):
+   #     """
+   #        Retourne le nom du type du concept résultat de l'étape
+   #     """
+   #     sd_prod=self.object.getType_produit()
+   #     if sd_prod:
+   #        return sd_prod.__name__
+   #     else:
+   #        return ""
+
+   # def addItem(self,name,pos):
+   #     mcent = self._object.addEntite(name,pos)
+   #     return mcent
+
+
+    def suppItem(self,item) :
+        # item : item du MOCLE de l'ETAPE a supprimer
+        # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList
+        itemobject=item.getObject()
+        if itemobject.isOblig() :
+            return (0,tr('Impossible de supprimer un mot-clef obligatoire '))
+        if self.object.suppEntite(itemobject):
+            message = tr("Mot-clef %s supprime " , itemobject.nom)
+            return (1,message)
+        else :
+            return (0,tr('Pb interne : impossible de supprimer ce mot-clef'))
+
+    def getText(self):
+        try:
+            return self.object.getSdname()
+        except:
+            return ''
+
+    # PNPN ????
+    #def keys(self):
+    #    keys=self.object.mc_dict
+    #    return keys
+
+    def getSubList(self):
+        """
+           Reactualise la liste des items fils stockes dans self.sublist
+        """
+        debug=0
+        if self.isActif(): liste=self.object.mcListe
+        else: liste=[]
+
+        
+        if debug : print ('getSubList, liste', liste)
+        if debug : print ('getSubList, sublist', self.sublist)
+        sublist=[None]*len(liste)
+        # suppression des items lies aux objets disparus
+        for item in self.sublist:
+            old_obj=item.getObject()
+            if old_obj in liste:
+                pos=liste.index(old_obj)
+                sublist[pos]=item
+            else:
+                pass # objets supprimes ignores
+
+        # ajout des items lies aux nouveaux objets
+        pos=0
+        if debug : 
+           print ('-------------------------')
+           for obj in liste : print (obj.nom)
+           print ('-------------------------')
+        for obj in liste:
+            if sublist[pos] is None:
+                # nouvel objet : on cree un nouvel item
+                def setFunction(value, object=obj):
+                    object.setval(value)
+                item = self.makeObjecttreeitem(self.appliEficas, obj.nom + " : ", obj, setFunction)
+                sublist[pos]=item
+            pos=pos+1
+
+        self.sublist=sublist
+        return self.sublist
+
+    def isValid(self):
+        return self.object.isValid()
+
+    def isCopiable(self):
+        """
+        Retourne 1 si l'objet est copiable, 0 sinon
+        """
+        return 1
+
+    def updateDeplace(self,item):
+        if item.sd and item.sd.nom:
+            self.object.sd=item.sd
+            self.object.sd.nom=item.sd.nom
+
+    def update(self,item):
+        if item.sd and item.sd.nom:
+            self.nommeSd(item.sd.nom)
+
+    def nommeSd(self,nom):
+        """ Lance la méthode de nommage de la SD """
+        oldnom=""
+        if self.object.sd != None :
+            oldnom=self.object.sd.nom
+        test,mess= self.object.nommeSd(nom)
+        if test:self.object.parent.resetContext()
+        if (test and oldnom in self.appliEficas.dict_reels ):
+            self.appliEficas.dict_reels[nom]=self.appliEficas.dict_reels[oldnom]
+        return test,mess
+
+    def isReentrant(self):
+        return self.object.isReentrant()
+
+    def getNomsSdOperReentrant(self):
+        return self.object.getNomsSdOperReentrant()
+
+    def getObjetCommentarise(self):
+        """
+            Cette méthode retourne un objet commentarisé
+            représentatif de self.object
+        """
+        # Format de fichier utilisé
+        format=self.appliEficas.formatFichierIn
+        return self.object.getObjetCommentarise(format)
+
+    def getObjetCommentarise_BAK(self):
+        """
+            Cette méthode retourne un objet commentarisé
+            représentatif de self.object
+        """
+        import generator,Accas
+        # Format de fichier utilisé
+        format=self.appliEficas.format_fichier
+        g=generator.plugins[format]()
+        texte_commande = g.gener(self.object,format='beautifie')
+        # Il faut enlever la premiere ligne vide de texte_commande que
+        # rajoute le generator
+        rebut,texte_commande = texte_commande.split('\n',1)
+        # on construit l'objet COMMANDE_COMM repésentatif de self mais non
+        # enregistré dans le jdc
+        commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
+                                               parent=self.object.parent)
+        commande_comment.niveau = self.object.niveau
+        commande_comment.jdc = commande_comment.parent = self.object.jdc
+
+        pos=self.object.parent.etapes.index(self.object)
+        parent=self.object.parent
+        self.object.parent.suppEntite(self.object)
+        parent.addEntite(commande_comment,pos)
+
+        return commande_comment
+
+
+import Accas
+treeitem = EtapeTreeItem
+objet = Accas.ETAPE
diff --git a/InterfaceGUI/Web/compoparam.py b/InterfaceGUI/Web/compoparam.py
new file mode 100644 (file)
index 0000000..ec47776
--- /dev/null
@@ -0,0 +1,140 @@
+# -*- 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 les classes permettant de definir les objets graphiques
+   representant un objet de type PARAMETRE, cad le panneau et l'item de l'arbre
+   d'EFICAS
+"""
+
+
+# import modules Python
+import  types
+from Extensions.i18n import tr
+
+# import modules EFICAS
+from Editeur  import Objecttreeitem
+from InterfaceGUI.Web import browser
+from InterfaceGUI.Web import typeNode
+
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNodePartiel):
+      pass
+
+
+
+class PARAMTreeItem(Objecttreeitem.ObjectTreeItem):
+    """
+    Classe servant a definir l'item porte par le noeud de l'arbre d'EFICAS
+    qui represente le PARAMETRE
+    """
+    itemNode=Node
+
+    def init(self):
+        self.setFunction = self.setValeur
+
+# ---------------------------------------------------------------------------
+#                   API du PARAMETRE pour l'arbre
+# ---------------------------------------------------------------------------
+
+    def getIconName(self):
+        """
+        Retourne le nom de l'icone associee au noeud qui porte self,
+        dependant de la validite de l'objet
+        NB : un PARAMETRE est toujours valide ...
+        """
+        if self.isActif():
+            if self.isValid():
+                return "ast-green-square"
+            else:
+                return "ast-red-square"
+        else:
+            return "ast-white-square"
+
+    def getLabelText(self):
+        """ Retourne 3 valeurs :
+        - le texte a afficher dans le noeud representant l'item
+        - la fonte dans laquelle afficher ce texte
+        - la couleur du texte
+        """
+        return tr('PARAMETRE'),None,None
+
+    def getText(self):
+        """
+        Retourne le texte a afficher apres le nom de la commande (ici apres 'parametre')
+        Ce texte est tronque a 25 caracteres
+        """
+        texte=self.object.nom+"="+str(self.object.valeur)
+        if type(self.object.valeur) == list :
+            texte=self.nom+' = ['
+            for l in self.object.valeur :
+                texte=texte+str(l) +","
+            texte=texte[0:-1]+']'
+        texte = texte.split('\n')[0]
+        if len(texte) < 25 :
+            return texte
+        else :
+            return texte[0:24]+'...'
+
+    def getSubList(self):
+        """
+        Retourne la liste des fils de self
+        """
+        return []
+
+# ---------------------------------------------------------------------------
+#       Methodes permettant la modification et la lecture des attributs
+#       du parametre = API graphique du PARAMETRE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+    def getValeur(self):
+        """
+        Retourne la valeur de l'objet PARAMETRE cad son texte
+        """
+        if self.object.valeur is None: return ''
+        else: return self.object.valeur
+
+    def getNom(self):
+        """
+        Retourne le nom du parametre
+        """
+        return self.object.nom
+
+    def setValeur(self,new_valeur):
+        """
+        Affecte valeur a l'objet PARAMETRE
+        """
+        self.object.setValeur(new_valeur)
+
+    def setNom(self,new_nom):
+        """
+        Renomme le parametre
+        """
+        self.object.setNom(new_nom)
+        #self.object.setAttribut('nom',new_nom)
+
+    def getFr(self):
+        """
+        Retourne le fr associe au parametre, cad la bulle d'aide pour EFICAS
+        """
+        return tr("Definition d'un parametre")
+
+import Extensions.parametre
+treeitem =PARAMTreeItem
+objet = Extensions.parametre.PARAMETRE
diff --git a/InterfaceGUI/Web/compoproc.py b/InterfaceGUI/Web/compoproc.py
new file mode 100644 (file)
index 0000000..ca12255
--- /dev/null
@@ -0,0 +1,36 @@
+# -*- 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
+#
+from Editeur     import Objecttreeitem
+from InterfaceGUI.Web import compooper
+from InterfaceGUI.Web import browser
+from InterfaceGUI.Web import typeNode
+
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNode):
+
+    pass
+
+
+class ProcEtapeTreeItem(compooper.EtapeTreeItem):
+    itemNode=Node
+
+import Accas
+treeitem = ProcEtapeTreeItem
+objet = Accas.PROC_ETAPE
diff --git a/InterfaceGUI/Web/composimp.py b/InterfaceGUI/Web/composimp.py
new file mode 100644 (file)
index 0000000..03120b1
--- /dev/null
@@ -0,0 +1,623 @@
+# -*- coding: iso-8859-1 -*-
+# 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
+#
+# Modules Python
+try :
+    from builtins import str
+except : pass
+
+import types,os
+
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur      import Objecttreeitem
+from Noyau.N_CR   import justifyText
+from Accas        import SalomeEntry
+from Accas        import ASSD
+from Accas        import UserASSD
+from Accas        import UserASSDMultiple
+from InterfaceGUI.Web import typeNode
+from InterfaceGUI.Web import browser
+from InterfaceGUI.politiquesValidation import PolitiqueUnique
+from InterfaceGUI.politiquesValidation import PolitiquePlusieurs
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
+
+    def traiteValeurSaisie(self,valeur): 
+        if self.item.get_definition().max==1 : self.politique = PolitiqueUnique (self, self.editor)
+        else  : self.politique = PolitiquePlusieurs(self, self.editor)
+        if self.item.definition.validators != None :
+            if self.item.definition.validators.verifItem(nouvelleValeur) !=1 :
+                commentaire=self.node.item.definition.validators.infoErreurItem()
+                return (self.item.idUnique, commentaire, false)
+        nouvelleValeurFormat=self.politique.getValeurTexte(valeur)
+        validite,commentaire=self.politique.recordValeur(nouvelleValeurFormat)
+        if validite : self.treeParent.updateOptionnels() 
+        return (self.item.idUnique, commentaire, validite)
+        
+
+
+class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
+    itemNode=Node
+
+    def init(self) :
+        self.expandable = 0
+
+
+    #-----------------------------------------------
+    #
+    # Methodes liees aux informations sur le Panel
+    # ou au mot-clef simple
+    #
+    #-----------------------------------------------
+    # isList
+    # hasInto
+    # getMinMax
+    # getMultiplicite
+    # getIntervalle
+    # getListeValeurs
+    # getListePossible
+
+    def isList(self):
+        """
+            Cette methode indique si le mot cle simple attend une liste (valeur de retour 1)
+            ou s'il n'en attend pas (valeur de retour 0)
+
+            Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
+            Dans le cas sans validateur, l'information est donnee par l'attribut max
+            de la definition du mot cle.
+            Dans le cas avec validateur, il faut combiner l'information precedente avec
+            celle issue de l'appel de la methode isList sur le validateur.On utilisera
+            l'operateur ET pour effectuer cette combinaison (AndVal).
+        """
+        is_a_list=0
+        min,max = self.getMinMax()
+        assert (min <= max)
+        if max > 1 :
+            is_a_list=1
+        # Dans le cas avec validateurs, pour que le mot cle soit considere
+        # comme acceptant une liste, il faut que max soit superieur a 1
+        # ET que la methode isList du validateur retourne 1. Dans les autres cas
+        # on retournera 0 (n'attend pas de liste)
+        if self.definition.validators :
+            is_a_list= self.definition.validators.isList() * is_a_list
+        return is_a_list
+
+    def isListSansOrdreNiDoublon(self):
+        if self.definition.homo=="SansOrdreNiDoublon" : return 1
+        return 0
+
+
+    def hasInto(self):
+        """
+            Cette methode indique si le mot cle simple propose un choix (valeur de retour 1)
+            ou s'il n'en propose pas (valeur de retour 0)
+
+            Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
+            Dans le cas sans validateur, l'information est donnee par l'attribut into
+            de la definition du mot cle.
+            Dans le cas avec validateurs, pour que le mot cle soit considere
+            comme proposant un choix, il faut que into soit present OU
+            que la methode hasInto du validateur retourne 1. Dans les autres cas
+            on retournera 0 (ne propose pas de choix)
+        """
+        has_an_into=0
+        if self.definition.into:
+            has_an_into=1
+        elif self.definition.validators :
+            has_an_into= self.definition.validators.hasInto()
+        return has_an_into
+
+    def hasIntoSug(self):
+        if self.definition.intoSug: return 1
+        return 0
+
+
+    def getMinMax(self):
+        """ Retourne les valeurs min et max de la definition de object """
+        return self.object.getMinMax()
+
+
+    def getIntervalle(self):
+        """
+             Retourne le domaine de valeur attendu par l'objet represente
+             par l'item.
+        """
+        return self.object.getintervalle()
+
+    def getListeValeurs(self) :
+        """ Retourne la liste des valeurs de object """
+        valeurs=self.object.getListeValeurs()
+        try :
+            if "R" in self.object.definition.type:
+                clef=self.object.getNomConcept()
+                if clef in self.appliEficas.dict_reels:
+                    if type(valeurs) == tuple:
+                        valeurs_reelles=[]
+                        for val in valeurs :
+                            if val in self.appliEficas.dict_reels[clef]:
+                                valeurs_reelles.append(self.appliEficas.dict_reels[clef][val])
+                            else :
+                                valeurs_reelles.append(val)
+                    else :
+                        if valeurs in self.appliEficas.dict_reels[clef]:
+                            valeurs_reelles=self.appliEficas.dict_reels[clef][valeurs]
+                    valeurs=valeurs_reelles
+        except :
+            pass
+        return valeurs
+
+    def getListePossible(self,listeActuelle=[]):
+        if hasattr(self.definition.validators,'into'):
+            valeurspossibles = self.definition.validators.into
+        else:
+            valeurspossibles = self.get_definition().into
+
+        if listeActuelle==[] : return valeurspossibles
+
+        #On ne garde que les items valides
+        listevalideitem=[]
+        if type(valeurspossibles) in (list,tuple) :
+            pass
+        else :
+            valeurspossibles=(valeurspossibles,)
+        for item in valeurspossibles:
+            encorevalide=self.valideItem(item)
+            if encorevalide :
+                listevalideitem.append(item)
+
+        #on ne garde que les choix possibles qui passent le test de valideListePartielle
+        listevalideliste=[]
+        for item in listevalideitem:
+            encorevalide=self.valideListePartielle(item,listeActuelle)
+            if encorevalide :
+                listevalideliste.append(item)
+        #print listevalideliste
+        return listevalideliste
+
+    def getListePossibleAvecSug(self,listeActuelle=[]):
+        if hasattr(self.definition,'intoSug'):
+            valeurspossibles = self.definition.intoSug
+        else:
+            return listeActuelle
+
+        if listeActuelle==[] :  return valeurspossibles
+        valeurspossibles = valeurspossibles+listeActuelle
+
+        #On ne garde que les items valides
+        listevalideitem=[]
+        if type(valeurspossibles) in (list,tuple) :
+            pass
+        else :
+            valeurspossibles=(valeurspossibles,)
+        for item in valeurspossibles:
+            encorevalide=self.valideItem(item)
+            if encorevalide :
+                listevalideitem.append(item)
+
+        #on ne garde que les choix possibles qui passent le test de valideListePartielle
+        listevalideliste=[]
+        for item in listevalideitem:
+            encorevalide=self.valideListePartielle(item,listeActuelle)
+            if encorevalide :
+                listevalideliste.append(item)
+        return listevalideliste
+
+    def getListeParamPossible(self):
+        liste_param=[]
+        l1,l2=self.jdc.getParametresFonctionsAvantEtape(self.getEtape())
+        for param in self.object.jdc.params:
+            if param.nom not in l1 : continue
+            encorevalide=self.valideItem(param.valeur)
+            if encorevalide:
+                type_param=param.valeur.__class__.__name__
+                for typ in self.definition.type:
+                    if typ=='R':
+                        liste_param.append(param)
+                    if typ=='I' and type_param=='int':
+                        liste_param.append(param)
+                    if typ=='TXM' and type_param=='str':
+                        liste_param.append(repr(param))
+                    if ('grma' in repr(typ)) and type_param=='str':
+                        liste_param.append(param.nom)
+        return liste_param
+
+
+    #--------------------------------------------------
+    #
+    # Methodes liees a la validite des valeurs saisies
+    #
+    #---------------------------------------------------
+    # valideItem
+    # valideListePartielle
+    # valideListeComplete
+    # infoErreurItem
+    # infoErreurListe
+    # isInIntervalle
+    # isValid
+
+    def valideItem(self,item):
+        """
+          La validation est realisee directement par l'objet
+        """
+        return self.object.valideItem(item)
+
+    def valideListePartielle(self,item,listecourante):
+        #On protege la liste en entree en la copiant
+        valeur=list(listecourante)
+        if item : valeur.append(item)
+        return self.object.validValeurPartielle(valeur)
+
+    def valideListeComplete (self,valeur):
+        return self.object.validValeur(valeur)
+
+    def infoErreurItem(self) :
+        commentaire=""
+        if self.definition.validators :
+            commentaire=self.definition.validators.infoErreurItem()
+        return commentaire
+
+    def aide(self) :
+        commentaire=""
+        if self.definition.validators :
+            commentaire=self.definition.validators.aide()
+        return commentaire
+
+    def infoErreurListe(self) :
+        commentaire=""
+        if self.definition.validators :
+            commentaire=self.definition.validators.infoErreurListe()
+        return commentaire
+
+    def isInIntervalle(self,valeur):
+        """
+            Retourne 1 si la valeur est dans l'intervalle permis par
+            l'objet represente par l'item.
+        """
+        return self.valideItem(valeur)
+
+    def isValid(self):
+        valide=self.object.isValid()
+        return valide
+
+    #--------------------------------------------------
+    #
+    # Autres ...
+    #
+    #---------------------------------------------------
+    # getIconName
+    # getText
+    # setValeurCo
+    # getSdAvantDuBonType
+
+
+    def getIconName(self):
+        if self.appliEficas.maConfiguration.differencieSiDefaut and self.isValid():
+            if self.object.definition.defaut != None :
+                if self.object.valeur == self.object.definition.defaut : return "ast-green-dark-ball"
+                if self.object.definition.max > 1 and list(self.object.valeur) == list(self.object.definition.defaut) : return "ast-green-dark-ball"
+            return "ast-green-ball"
+        elif self.isValid():
+            return "ast-green-ball"
+        elif self.object.isOblig():
+            return "ast-red-ball"
+        else:
+            return "ast-yel-ball"
+
+    def getText(self):
+        """
+        Classe SIMPTreeItem
+        Retourne le texte a afficher dans l'arbre representant la valeur de l'objet
+        pointe par self
+        """
+        if  self.waitUserAssdMultiple() or self.object.waitUserAssd() or self.object.waitAssd(): return self.object.nom
+        text = self.object.getText()
+        if text == None : text=""
+        return text
+
+
+    def setValeurCo(self,nomCo):
+        """
+        Affecte au MCS pointe par self l'objet de type CO et de nom nom_co
+        """
+        ret = self.object.setValeurCo(nomCo)
+        #print "setValeurCo",ret
+        return ret
+
+    def getSdAvantDuBonType(self):
+        """
+        Retourne la liste des noms des SD presentes avant l'etape qui contient
+        le MCS pointe par self et du type requis par ce MCS
+        """
+        # A changer pour tenir compte des UserASSDMultiple
+        # ici on passe par parent pour avoir le bon type
+        #if  self.waitUserAssdMultiple() :
+        #    l=self.object.parent.getSdCreeParObjetAvecFiltre(self.object)
+        #    return l
+        if  self.waitUserAssdMultiple() :
+            l=self.object.getUserAssdPossible()
+            return l
+        a=self.object.etape.parent.getSdAvantDuBonType(self.object.etape,self.object.definition.type)
+        if self.waitUserAssd() : l=self.jdc.getSdCreeParObjet(self.object.definition.type)
+        else :l=[]
+        return a+l
+
+    def getSdAvantDuBonTypePourTypeDeBase(self):
+        a=self.object.jdc.getSdAvantDuBonTypePourTypeDe_Base(self.object.etape,"LASSD")
+        return a
+
+    def deleteValeurCo(self,valeur=None):
+        """
+             Supprime la valeur du mot cle (de type CO)
+             il faut propager la destruction aux autres etapes
+        """
+        if not valeur : valeur=self.object.valeur
+        # XXX faut il vraiment appeler delSdprod ???
+        #self.object.etape.parent.delSdprod(valeur)
+        self.object.etape.parent.deleteConcept(valeur)
+
+    #-----------------------------------------------
+    #
+    # Methodes liees au type de l objet attendu
+    #
+    #-----------------------------------------------
+    # waitCo
+    # waitGeom
+    # waitComplex
+    # waitReel
+    # waitAssd
+    # getType
+
+    def waitCo(self):
+        """
+        Methode booleenne qui retourne 1 si l'objet pointe par self
+        attend un objet de type ASSD qui n'existe pas encore (type CO()),
+        0 sinon
+        """
+        return self.object.waitCo()
+
+    def waitFichier(self):
+        maDefinition=self.object.definition
+        try :
+            if ('Repertoire' in maDefinition.type[0]) or ('Fichier' in maDefinition.type[0]) :
+                return 1
+        except :
+            return 0
+
+    def waitGeom(self):
+        """
+        Methode booleenne qui retourne 1 si l'objet pointe par self
+        attend un objet GEOM, 0 sinon
+        """
+        return self.object.waitGeom()
+
+    def waitTxm(self):
+        return self.object.waitTxm()
+
+
+    def waitComplex(self):
+        """ Methode booleenne qui retourne 1 si l'objet pointe par self
+        attend un complexe, 0 sinon """
+        if 'C' in self.object.definition.type:
+            return 1
+        else:
+            return 0
+
+    def waitReel(self):
+        """ Methode booleenne qui retourne 1 si l'objet pointe par self
+        attend un reel, 0 sinon """
+        if 'R' in self.object.definition.type:
+            return 1
+        else:
+            return 0
+
+    def waitTuple(self) :
+        return  self.object.waitTuple()
+
+    def waitDate(self):
+        """ Methode booleenne qui retourne 1 si l'objet pointe par self
+        attend un reel, 0 sinon """
+        if 'DateHHMMAAAA' in self.object.definition.type:
+            return 1
+        else:
+            return 0
+
+    def waitHeure(self):
+        """ Methode booleenne qui retourne 1 si l'objet pointe par self
+        attend un reel, 0 sinon """
+        if 'HeureHHMMSS' in self.object.definition.type:
+            return 1
+        else:
+            return 0
+
+
+
+    def waitTuple(self):
+        """ Methode booleenne qui retourne 1 si l'objet pointe par self
+        attend un Tuple, 0 sinon """
+        for ss_type in self.object.definition.type:
+            if repr(ss_type).find('Tuple') != -1 :
+                return 1
+        return 0
+
+    def waitMatrice(self):
+        """ Methode booleenne qui retourne 1 si l'objet pointe par self
+        attend un Tuple, 0 sinon """
+        for ss_type in self.object.definition.type:
+            if repr(ss_type).find('Matrice') != -1 :
+                return 1
+        return 0
+
+    def waitAssd(self):
+        """Methode booleenne qui retourne 1 si l'objet pointe par self
+        attend un objet de type ASSD ou derive, 0 sinon """
+        return self.object.waitAssd()
+
+    def waitAssdOrTypeBase(self) :
+        boo=0
+        if len(self.object.definition.type) > 1 :
+            if self.waitReel() :
+                boo = 1
+            if 'I' in self.object.definition.type :
+                boo = 1
+        return boo
+
+    def waitSalome(self):
+        monType = self.object.definition.type[0]
+        if 'grma' in repr(monType) : return True
+        if 'grno' in repr(monType) : return True
+        try :
+            if issubclass(monType, SalomeEntry) : return True
+        except :
+            pass
+        return False
+
+    def getType(self):
+        """
+            Retourne le type de valeur attendu par l'objet represente par l'item.
+        """
+        return self.object.getType()
+
+    #-----------------------------------------------------
+    #
+    # Methodes liees  a l evaluation de la valeur saisie
+    #
+    #-----------------------------------------------------
+    # evalValeur
+    # evalValeurItem
+    # isCO
+    # traiteReel
+
+    def evalValeur(self,valeur):
+        """ Lance l'interpretation de 'valeur' (chaine de caracteres) comme valeur de self :
+               - retourne l'objet associe si on a pu interpreter (entier, reel, ASSD,...)
+               - retourne 'valeur' (chaine de caracteres) sinon
+        """
+        newvaleur=self.evalVal(valeur)
+        return newvaleur,1
+
+
+    def evalValeurItem(self,valeur):
+        """ Lance l'interpretation de 'valeur' qui doit ne pas etre un tuple
+            - va retourner la valeur de retour et la validite
+              selon le type de l objet attendu
+            - traite les reels et les parametres
+        """
+        #print "evalValeurItem",valeur
+        if valeur==None or valeur == "" :
+            return None,0
+        validite=1
+        if self.waitReel():
+            valeurinter = self.traiteReel(valeur)
+            if valeurinter != None :
+                valeurretour,validite= self.object.evalValeur(valeurinter)
+            else:
+                valeurretour,validite= self.object.evalValeur(valeur)
+        elif self.waitGeom():
+            valeurretour,validite = valeur,1
+        else :
+            valeurretour,validite= self.object.evalValeur(valeur)
+
+        if validite == 0:
+            if (type(valeur) == bytes  or type(valeur) == str )and self.object.waitTxm():
+                essai_valeur="'" + valeur + "'"
+                valeurretour,validite= self.object.evalValeur(essai_valeur)
+
+        if hasattr(valeurretour,'__class__'):
+            #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
+            if valeurretour.__class__.__name__ in ('PARAMETRE',):
+                validite=1
+
+        #if self.waitCo():
+            # CCAR : il ne faut pas essayer de creer un concept
+            # il faut simplement en chercher un existant ce qui a du etre fait par self.object.evalValeur(valeur)
+            #try:
+                #valeurretour=Accas.CO(valeur)
+            #except:
+                #valeurretour=None
+                #validite=0
+        # on est dans le cas ou on a evalue et ou on n'aurait pas du
+        if self.object.waitTxm() :
+            if type(valeurretour) != bytes:
+                valeurretour=str(valeur)
+                validite=1
+        return valeurretour,validite
+
+    def isCO(self,valeur=None):
+        """
+           Indique si valeur est un concept produit de la macro
+           Cette methode n'a de sens que pour un MCSIMP d'une MACRO
+           Si valeur vaut None on teste la valeur du mot cle
+        """
+        # Pour savoir si un concept est un nouveau concept de macro
+        # on regarde s'il est present dans l'attribut sdprods de l'etape
+        # ou si son nom de classe est CO.
+        # Il faut faire les 2 tests car une macro non valide peut etre
+        # dans un etat pas tres catholique avec des CO pas encore types
+        # et donc pas dans sdprods (resultat d'une exception dans typeSDProd)
+        if not valeur:valeur=self.object.valeur
+        if valeur in self.object.etape.sdprods:return 1
+        #if type(valeur) is not types.InstanceType:return 0
+        if type(valeur) is not object:return 0
+        if valeur.__class__.__name__ == 'CO':return 1
+        return 0
+
+    def isParam(self,valeur) :
+        for param in self.jdc.params:
+            if (repr(param) == valeur):
+                return 1
+        return 0
+
+    def traiteReel(self,valeur):
+        """
+        Cette fonction a pour but de rajouter le '.' en fin de chaine pour un reel
+        ou de detecter si on fait reference a un concept produit par DEFI_VALEUR
+        ou un EVAL ...
+        """
+        valeur = valeur.strip()
+        liste_reels = self.getSdAvantDuBonType()
+        if valeur in liste_reels:
+            return valeur
+        if len(valeur) >= 3 :
+            if valeur[0:4] == 'EVAL' :
+                # on a trouve un EVAL --> on retourne directement la valeur
+                return valeur
+        if valeur.find('.') == -1 :
+            # aucun '.' n'a ete trouve dans valeur --> on en rajoute un a la fin
+            if (self.isParam(valeur)):
+                return valeur
+            else:
+                if valeur.find('e') != -1:
+                    # Notation scientifique ?
+                    try :
+                        r=eval(valeur)
+                        return valeur
+                    except :
+                        return None
+                else :
+                    return valeur+'.'
+        else:
+            return valeur
+
+
+import Accas
+treeitem = SIMPTreeItem
+objet = Accas.MCSIMP
diff --git a/InterfaceGUI/Web/editor.py b/InterfaceGUI/Web/editor.py
new file mode 100755 (executable)
index 0000000..d4c86af
--- /dev/null
@@ -0,0 +1,99 @@
+# -*- 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
+#
+from __future__ import absolute_import
+from __future__ import print_function
+
+import types,sys,os, re
+import traceback
+
+
+# Modules Eficas
+from Extensions.i18n import tr
+
+from Editeur         import session
+from Editeur         import comploader
+from Editeur         import Objecttreeitem
+from InterfaceGUI.Web import browser
+
+debug = False
+
+from InterfaceGUI.editorSsIhm    import JDCEditorSsIhm
+
+
+class JDCWebEditor(JDCEditorSsIhm):
+# ------------------------------- #
+    """
+       Editeur de jdc
+    """
+
+    def __init__ (self,appliEficas,fichier = None, jdc= None, connecteur = None ):
+    #------------------------------------------------------------------------
+        
+        self.connecteur=connecteur
+        JDCEditorSsIhm.__init__(self,appliEficas,fichier)
+        self.dicoIdNode={}
+        comploader.chargerComposants('Web')
+        self.tree=None
+        if self.jdc:
+            self.jdc_item=Objecttreeitem.makeObjecttreeitem( self, "nom", self.jdc )
+            if self.jdc_item :
+               self.tree = browser.JDCTree( self.jdc_item,  self )
+
+
+    def getNodeById(self,nodeId ):
+    #-----------------------------
+        if nodeId in self.dicoIdNode : return self.dicoIdNode[nodeId]
+        else : return None
+
+    def reconstruitChaineDIndex(self,nodeId):
+    #---------------------------------------
+        if nodeId in self.dicoIdNode : 
+           node=self.dicoIdNode[nodeId]
+           return JDCEditorSsIhm.reconstruitChaineDIndex(self,node)
+        else : return None
+
+
+    def getDicoObjetsCompletsPourTree(self,obj) :
+    #-----------------------------------
+        #print ('editor getDicoObjetsCompletsPourTree pour ' ,self, obj)
+        if self.tree == None : return {}
+        return obj.getDicoObjetsCompletsPourTree()
+
+    def getDicoObjetsPourWeb(self,obj) :
+    #-----------------------------------
+        if self.tree == None : return {}
+        return obj.getDicoObjetsPourWeb()
+
+    def getDicoForFancy(self,obj) :
+    #-----------------------------------
+        if self.tree == None : return {}
+        return obj.getDicoForFancy()
+
+    def afficheInfos(self,txt,couleur=None):
+    #---------------------------------------
+        self.connecteur.toWebApp('afficheInfos', txt, couleur) 
+        JDCEditorSsIhm.afficheInfos(self,txt,couleur)
+
+    def afficheAlerte(self,titre,message):
+    #-------------------------------------
+        self.connecteur.toWebApp('afficheAlerte', titre ,  message) 
+        JDCEditorSsIhm.afficheAlerte(self,titre,message)
+
+
diff --git a/InterfaceGUI/Web/typeNode.py b/InterfaceGUI/Web/typeNode.py
new file mode 100644 (file)
index 0000000..52d9fe4
--- /dev/null
@@ -0,0 +1,78 @@
+# -*- 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
+#
+#---------------------------#
+class PopUpMenuRacine(object) :
+#---------------------------#
+
+    def createPopUpMenu(self):
+        print ("createPopUpMenu de MenuRacine")
+
+
+    def addParametersApres(self):
+        print ("addParametersApres de MenuRacine")
+
+#---------------------------#
+class PopUpMenuNodeMinimal(object) :
+#---------------------------#
+
+    def createPopUpMenu(self):
+        print ("createPopUpMenu de PopUpMenuNodeMinimal")
+
+    def createActions(self):
+        print ("createActions")
+
+    def supprimeNoeud(self):
+        print ("supprimeNoeud")
+
+    def viewDoc(self):
+        print ("viewDoc")
+
+    def addParametersApres(self):
+        print ("addParametersApres")
+
+    def addParametersAvant(self):
+        print ("addParametersAvant")
+
+    def addCommApres(self):
+        print ("addCommApres")
+
+    def addCommAvant(self):
+        print ("addCommAvant")
+
+    def deplieCeNiveau(self):
+        print ("deplieCeNiveau")
+
+#--------------------------------------------#
+class PopUpMenuNodePartiel (PopUpMenuNodeMinimal):
+#---------------------------------------------#
+    def createPopUpMenu(self):
+        PopUpMenuNodeMinimal.createPopUpMenu(self)
+        print ("createPopUpMenu de PopUpMenuNodePartiel")
+
+
+#-----------------------------------------#
+class PopUpMenuNode(PopUpMenuNodePartiel) :
+#-----------------------------------------#
+    def createPopUpMenu(self):
+        PopUpMenuNodePartiel.createPopUpMenu(self)
+        print ("createPopUpMenu de PopUpMenuNode")
+
+    def commenter(self):
+        print ("commenter")
diff --git a/InterfaceGUI/appliSsIhm.py b/InterfaceGUI/appliSsIhm.py
new file mode 100755 (executable)
index 0000000..a21cb45
--- /dev/null
@@ -0,0 +1,199 @@
+# -*- coding: iso-8859-1 -*-
+# Copyright (C) 2007-2024   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 os, sys
+
+from Extensions.eficas_exception import EficasException
+from InterfaceGUI.getVersion import getEficasVersion
+from InterfaceGUI.viewManagerSsIhm import MyViewManagerSsIhm
+from Editeur import session
+
+
+class AppliSsIhm:
+    """
+    Class implementing the main user interface.
+    """
+
+    def __init__( self, code=None, salome=1, parent=None, multi=False, langue="fr",
+        ssIhm=True, labelCode=None, genereXSD=False, versionCode=None, ssCode=None, fichierCata=None,
+        GUIPath=None,
+    ):
+        """
+        Constructor
+        """
+        version = getEficasVersion()
+        self.versionEficas = "Eficas QT5 Salome " + version
+        self.labelCode = labelCode
+        self.GUIPath = None
+
+        self.salome = salome
+        self.ssIhm = True
+        self.code = code
+        self.genereXSD = genereXSD
+        self.versionCode = versionCode
+        self.ssCode = ssCode
+
+        self.dict_reels = {}
+        self.fichierIn = None
+        self.fichierOut = None
+
+        self.recent = []
+        self.ficRecents = {}
+        self.mesScripts = {}
+        self.listePathAEnlever = []
+        self.repIcon = os.path.join( os.path.dirname(os.path.abspath(__file__)), "..", "Editeur", "icons")
+
+        if fichierCata == None: self.fichierCata = session.d_env.fichierCata
+        else: self.fichierCata = fichierCata
+
+        if session.d_env.labelCode: self.labelCode = session.d_env.labelCode
+        self.withXSD = session.d_env.withXSD
+
+        if self.salome:
+            try:
+                from Accas import eficasSalome
+                Accas.SalomeEntry = eficasSalome.SalomeEntry
+            except:
+                print("eficas hors salome")
+
+        self.multi = multi
+        # on peut avoir multi et sans Ihm si on est en Web
+        # if self.multi: print("pas de multi sans ihm")
+
+        if langue == "fr": self.langue = langue
+        else: self.langue = "ang"
+
+        if self.multi == False:
+            self.definitCode(code, ssCode)
+            if code == None: return
+        else : 
+            # Est-ce que configBase a un interet avec le web 
+            from InterfaceGUI.configuration import configBase
+            self.maConfiguration = configBase(self)
+
+        self.suiteTelemac = False
+        self.viewmanager = MyViewManagerSsIhm(self)
+        self.withUQ = False
+
+    def ajoutUQ(self):
+        self.withUQ = True
+        self.formatFichierIn = "pythonUQ"  # par defaut
+
+    def definitCode(self, code, ssCode):
+        # ssCode sert pour Map
+        self.code = code
+        self.ssCode = ssCode
+        if self.code == None:
+            return  # pour le cancel de la fenetre choix code
+
+        if ssCode != None:
+            self.formatFichierOut = ssCode  # par defaut
+            prefsCode.NAME_SCHEME = ssCode
+        else:
+            self.formatFichierIn = "python"  # par defaut
+            self.formatFichierOut = "python"  # par defaut
+
+        from InterfaceGUI.configuration import configBase
+        self.maConfiguration = configBase(self)
+
+        if hasattr(self, "maConfiguration") and self.maConfiguration.translatorFichier:
+            from Extensions import localisation
+            localisation.localise( None, self.langue,
+                translatorFichier=self.maConfiguration.translatorFichier,
+            )
+        if self.withXSD:
+            self.maConfiguration.withXSD = True
+
+    def getSource(self, file):
+        # appele par Editeur/session.py
+        import convert
+
+        p = convert.plugins["python"]()
+        p.readfile(file)
+        texte = p.convert("execnoparseur")
+        return texte
+
+    def initEditor(self, fichier=None, jdc=None, units=None, include=0):
+        if (hasattr(self, "editor")) and self.editor != None:
+            print("un seul editeur par application")
+            sys.exit()
+        self.editor = self.viewmanager.getNewEditorNormal()
+
+    def initEditorNormal(self, fichier=None, jdc=None, units=None, include=0):
+        if (hasattr(self, "editor")) and self.editor != None:
+            print("un seul editeur par application")
+            sys.Exit()
+        # self.editor = JDCEditorSsIhm(self,fichier, jdc, self.myQtab,units=units,include=include)
+        self.editor = self.viewmanager.getNewEditorNormal()
+
+    def fileNew(self):
+        self.editor = self.initEditor()
+
+    def getEditor(self):
+        if (hasattr(self, "editor")) and self.editor != None:
+            return self.editor
+        self.initEditor()
+        return self.editor
+
+    def fileOpen(self, fichier):
+        fichierIn = os.path.abspath(fichier)
+        try:
+            monEditor = self.viewmanager.handleOpen(fichierIn)
+        except EficasException as exc:
+            print("poum")
+            monEditor = None
+        return monEditor
+
+    def fileSave(self):
+        if self.editor == None:
+            return False
+        ok, newName = editor.saveFileAs()
+        print("ok, newName ", ok, newName)
+
+    def fileSaveAs(self, fileName):
+        if self.editor == None:
+            return False
+        ok = editor.saveFileAs()
+        print("ok ", ok)
+
+    def dumpXsd(self, avecEltAbstrait=False):
+        currentCata = CONTEXT.getCurrentCata()
+        texteXSD = currentCata.dumpXsd(avecEltAbstrait)
+        return texteXSD
+
+    def afficheMessage(self, titre, texte,critical=True):
+        print ('__________________________')
+        print (tr(titre))
+        print ('')
+        print (tr(texte))
+        print ('__________________________')
+
+
+# ,self.fileSaveAs
+# ,self.fileClose
+# ,self.fileExit
+# ,self.jdcRapport
+# ,self.jdcRegles
+# ,self.jdcFichierSource
+# ,self.visuJdcPy
+
+
+if __name__ == "__main__":
+    # Modules Eficas
+    monEficas = AppliSsIhm(code="Adao", salome=0, labelCode="V83")
index 7f78fb9bf393cd9396837929eed251eb62d9bdef..66941ef670996e8e053cfa20952edfa08f1fe3f5 100755 (executable)
@@ -86,13 +86,9 @@ class JDCEditorSsIhm:
             self.appliEficas.code = self.code
         else:
             self.readercata = self.appliEficas.readercata
-        if self.readercata.fichierCata == None:
-            return  # Sortie Salome
-        if self.readercata.cata == None:
-            return  # Sortie Salome
-        if self.readercata.cata == 0:
-            return  # Sortie Salome
-        self.titre = self.readercata.titre
+
+        if self.readercata : 
+            self.titre = self.readercata.titre
 
         self.formatFichierOut = self.appliEficas.formatFichierOut
         self.formatFichierIn = self.appliEficas.formatFichierIn
@@ -122,14 +118,10 @@ class JDCEditorSsIhm:
 
         self.maConfiguration.mesGenerators = generator
         self.maConfiguration.mesconvertisseurs = convert
-        try:
-            self.XMLGenerator = generator.plugins["xml"]()
-        except:
-            self.XMLGenerator = None
-        try:
-            self.pythonGenerator = generator.plugins["python"]()
-        except:
-            self.pythonGenerator = None
+        try: self.XMLGenerator = generator.plugins["xml"]()
+        except: self.XMLGenerator = None
+        try: self.pythonGenerator = generator.plugins["python"]()
+        except: self.pythonGenerator = None
 
         if self.formatFichierOut in generator.plugins.keys():
             self.generator = generator.plugins[self.formatFichierOut]()
@@ -142,6 +134,11 @@ class JDCEditorSsIhm:
 
         # ------- construction du jdc --------------
 
+        if self.readercata.cata == None: 
+           if self.fichier is not None: 
+              print ('fichier comm mais pas de cata')
+           return  # Sortie Salome
+
         self.nouveau = 0
         if self.fichier is not None:  #  fichier jdc fourni
             if jdc == None:
@@ -367,8 +364,23 @@ class JDCEditorSsIhm:
     # -----------------------#
         if "dico" in generator.plugins:
             self.generator = generator.plugins["dico"]()
-            texte_jdc = self.generator.gener(self.jdc)
-            return texte_jdc
+            # print (self.generator)
+            jdc_formate = self.generator.gener(self.jdc)
+            # print (jdc_formate)
+            dico = self.generator.Dico
+            # print (dico)
+            return dico
+
+    # --------------------------------#
+    def generDicoPourWeb(self, obj=None):
+        # --------------------------------#
+        if obj == None:
+            obj = self.jdc
+        if "dico" in generator.plugins:
+            self.generator = generator.plugins["dico"]()
+            jdc_formate = self.generator.gener(self.jdc)
+            dico = self.generator.Dico
+            return dico
 
     # -----------------------#
     def generDicoPython(self):
diff --git a/InterfaceGUI/politiquesValidation.py b/InterfaceGUI/politiquesValidation.py
new file mode 100644 (file)
index 0000000..cbd307a
--- /dev/null
@@ -0,0 +1,333 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2024   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
+#
+from Accas import PARAMETRE
+from Extensions.i18n import tr
+
+
+# ----------------------------
+class ValidationSaisie(object):
+# ----------------------------
+    """
+    classe mere des classes de politique de validation des CHAMPS SAISIS 
+    les valeurs saisies sont toutes des CHAINES DE CARACTERE
+    il faut transformer '5' en 5 ou en 5. selon le type de l objet attendu
+    et 'MonNomDObjet' en MonNomDObjet
+    mais garder 'voici ma chaine de caractere '...
+    """
+    def __init__(self, node, parent):
+    # -------------------------------
+        self.node = node
+        self.parent = parent
+
+    def testeUneValeur(self, valeurentree):
+    # -------------------------------------
+        commentaire = None
+        # import traceback
+        # traceback.print_stack()
+        valeur, validite = self.node.item.evalValeur(valeurentree)
+        if not validite:
+            commentaire = "impossible d'evaluer : %s " % repr(valeurentree)
+            return valeur, validite, commentaire
+        if self.node.item.waitTxm() and not (type(valeur) == str):
+            valeur = str(valeur)
+
+        testtype, commentaire = self.node.item.object.verifType(valeur)
+        if not testtype:
+            return valeur, 0, commentaire
+
+        valide = self.node.item.valideItem(valeur)
+        if type(valide) == tuple:
+            validite, commentaire = valide
+        else:
+            validite = valide
+            commentaire = " "
+
+        if not validite and commentaire is None:
+            commentaire = "impossible d'evaluer : %s " % repr(valeurentree)
+        # print ('ds testeUneValeur', valeur, validite, commentaire)
+        return valeur, validite, commentaire
+
+    # ----------------------------------------------------------------------------------------
+    #   Methodes utilisees pour la manipulation des items en notation scientifique
+    #   a mettre au point
+    # ----------------------------------------------------------------------------------------
+    def setValeurTexte(self, texteValeur):
+    # ------------------------------------
+        try:
+            if "R" in self.node.item.object.definition.type:
+                if texteValeur[0] != "'":
+                    clef = eval(texteValeur)
+                    if str(clef) != str(texteValeur):
+                        self.node.item.object.initModif()
+                        clefobj = self.node.item.object.getNomConcept()
+                        if not clefobj in self.parent.appliEficas.dict_reels:
+                            self.parent.appliEficas.dict_reels[clefobj] = {}
+                        self.parent.appliEficas.dict_reels[clefobj][clef] = texteValeur
+                        self.parent.appliEficas.dict_reels[clefobj]
+                        if clefobj == "":
+                            if ( not self.node.item.object.etape in self.parent.appliEficas.dict_reels):
+                                self.parent.appliEficas.dict_reels[ self.node.item.object.etape ] = {}
+                            self.parent.appliEficas.dict_reels[ self.node.item.object.etape ][clef] = texteValeur
+                        self.node.item.object.finModif()
+        except:
+            pass
+
+    # --------------------------------
+    def getValeurTexte(self, valeur):
+    # --------------------------------
+        valeurTexte = valeur
+        if valeur == None:
+            return valeur
+        from decimal import Decimal
+
+        if isinstance(valeur, Decimal):
+            if self.node.waitTxm() and not self.isParam(valeur):
+                return "'" + str(valeur) + "'"
+            else:
+                return valeur
+        if "R" in self.node.item.object.definition.type:
+            clefobj = self.node.item.object.getNomConcept()
+            if clefobj in self.parent.appliEficas.dict_reels:
+                if valeur in self.parent.appliEficas.dict_reels[clefobj]:
+                    valeurTexte = self.parent.appliEficas.dict_reels[clefobj][valeur]
+            else:
+                if ( str(valeur).find(".") == -1 and str(valeur).find("e") == -1 and str(valeur).find("E")):
+                # aucun '.' n'a ete trouve dans valeur --> on en rajoute un a la fin
+                    if self.isParam(valeur): return valeur
+                    
+                    #else:
+                    #    try:
+                    #        val2 = eval(str(valeur) + ".")
+                    #    except: pass
+        return valeurTexte
+
+    # --------------------------------
+    def isParam(self, valeur):
+    # --------------------------------
+        for param in self.node.item.jdc.params:
+            if (repr(param) == repr(valeur)) or (str(param) == str(valeur)):
+                return 1
+        return 0
+
+    # -------------------------------------
+    def ajoutDsDictReel(self, texteValeur):
+    # -----------------------------------
+        # le try except est necessaire pour saisir les parametres
+        # on enleve l erreur de saisie 00 pour 0
+        if str(texteValeur) == "00": return
+        try:
+            if "R" in self.node.item.object.definition.type:
+                if str(texteValeur)[0] != "'":
+                    clef = eval(texteValeur)
+                    if str(clef) != str(texteValeur):
+                        clefobj = self.node.item.object.getNomConcept()
+                        if not clefobj in self.parent.appliEficas:
+                            self.parent.appliEficas.dict_reels[clefobj] = {}
+                        self.parent.appliEficas.dict_reels[clefobj][clef] = texteValeur
+                        if clefobj == "":
+                            if ( not self.node.item.object.etape in self.parent.appliEficas.dict_reels):
+                                self.parent.appliEficas.dict_reels[ self.node.item.object.etape ] = {}
+                            self.parent.appliEficas.dict_reels[ self.node.item.object.etape ][clef] = texteValeur
+        except:
+            pass
+
+    # -----------------------------
+    def ajoutDsDictReelEtape(self):
+    # -----------------------------
+        # janvier 24. Utile pour les formules ?
+        # a reconsiderer
+        # ajout du return
+        # a tester correctement
+        return
+        try:
+            if self.node.item.object in self.parent.appliEficas.dict_reels:
+                self.parent.appliEficas.dict_reels[ self.node.item.sdnom ] = self.parent.appliEficas.dict_reels[self.node.item.object]
+                del self.parent.appliEficas.dict_reels[self.node.item.object]
+        except:
+            pass
+
+
+# --------------------------------------
+class PolitiqueUnique(ValidationSaisie):
+# ---------------------_----------------
+    """
+    classe servant pour les entrees ne demandant qu un mot clef
+    """
+    def __init__(self, node, parent):
+    #--------------------------------
+        super().__init__()
+
+
+    def recordValeur(self, valeurentree):
+    #------------------------------------
+        if self.parent.modified == "n":
+            self.parent.initModif()
+        ancienneVal = self.node.item.getValeur()
+        valeur, validite, commentaire = self.testeUneValeur(valeurentree)
+        if ( validite and ("R" in self.node.item.object.definition.type) and not (isinstance(valeur, PARAMETRE))):
+            s = valeurentree
+            if s.find(".") == -1 and s.find("e") == -1 and s.find("E") == -1: s = s + "."
+            valeur, validite, commentaire = self.testeUneValeur(s)
+        if validite:
+            validite = self.node.item.setValeur(valeur)
+            if self.node.item.isValid():
+                commentaire = tr("Valeur du mot-cle enregistree")
+                self.setValeurTexte(str(valeurentree))
+            else:
+                cr = self.node.item.getCr()
+                commentaire = tr("Valeur du mot-cle non autorisee ") + cr.getMessFatal()
+                self.node.item.setValeur(ancienneVal)
+        return validite, commentaire
+
+
+# --------------------------------------
+class PolitiquePlusieurs(ValidationSaisie):
+# --------------------------------------
+    """
+    classe servant pour les entrees ne demandant qu un mot clef
+    """
+
+    def ajoutValeurs(self, listevaleur, index, listecourante):
+    #--------------------------------------------------------
+        listeRetour = []
+        commentaire = "Nouvelle valeur acceptee"
+        commentaire2 = ""
+        valide = 1
+        if listevaleur == None:
+            return
+        if listevaleur == "":
+            return
+        if not (type(listevaleur) in (list, tuple)):
+            listevaleur = tuple(listevaleur)
+        # on verifie que la cardinalite max n a pas ete atteinte
+        min, max = self.node.item.getMinMax()
+        if len(listecourante) + len(listevaleur) > max:
+            commentaire = (
+                "La liste atteint le nombre maximum d'elements : "
+                + str(max)
+                + " ,ajout refuse"
+            )
+            return False, commentaire, commentaire2, listeRetour
+
+        for valeur in listevaleur:
+            # On teste le type de la valeur
+            valeurScientifique = valeur
+            valide = self.node.item.valideItem(valeur)
+            if not valide:
+                try:
+                    valeur, valide = self.node.item.evalValeur(valeur)
+                    valide, commentaire2 = self.node.item.object.verifType(valeur)
+                except:
+                    # return testtype,commentaire,"",listeRetour
+                    pass
+            if not valide:
+                if commentaire.find("On attend un chaine") > 1:
+                    commentaire = (
+                        "Valeur "
+                        + str(valeur)
+                        + " incorrecte : ajout a la liste refuse: On attend une chaine de caracteres < 8"
+                    )
+                else:
+                    commentaire = (
+                        "Valeur "
+                        + str(valeur)
+                        + " incorrecte : ajout a la liste refuse"
+                    )
+                if commentaire2 == "":
+                    commentaire2 = self.node.item.infoErreurItem()
+                return valide, commentaire, commentaire2, listeRetour
+
+            # On valide la liste obtenue
+            encorevalide = self.node.item.valideListePartielle(valeur, listecourante)
+            if not encorevalide:
+                commentaire2 = self.node.item.infoErreurListe()
+                # On traite le cas ou la liste n est pas valide pour un pb de cardinalite
+                min, max = self.node.item.getMinMax()
+                if len(listecourante) + 1 >= max:
+                    commentaire = (
+                        "La liste atteint le nombre maximum d'elements : "
+                        + str(max)
+                        + " ,ajout refuse"
+                    )
+                    return valide, commentaire, commentaire2, listeRetour
+                if len(listecourante) + 1 > min:
+                    commentaire = ""
+                    return valide, commentaire, commentaire2, listeRetour
+            # On ajoute la valeur testee a la liste courante et a la liste acceptee
+            self.ajoutDsDictReel(valeurScientifique)
+            listecourante.insert(index, valeur)
+            index = index + 1
+            listeRetour.append(valeur)
+
+        return valide, commentaire, commentaire2, listeRetour
+
+    def ajoutTuple(self, valeurTuple, listecourante):
+        listeRetour = []
+        commentaire = "Nouvelle valeur acceptee"
+        commentaire2 = ""
+        valide = 1
+        if valeurTuple == None:
+            return
+        if valeurTuple == [""]:
+            return
+        # On teste le type de la valeur
+        valide = self.node.item.valideItem(valeurTuple)
+        if not valide:
+            try:
+                valeur, valide = self.node.item.evalValeur(valeurTuple)
+                valide = self.node.item.valideItem(valeur)
+            except:
+                pass
+        if not valide:
+            commentaire = (
+                "Valeur " + str(valeurTuple) + " incorrecte : ajout a la liste refuse"
+            )
+            commentaire2 = self.node.item.infoErreurItem()
+            return valide, commentaire, commentaire2, listeRetour
+
+        # On valide la liste obtenue
+        encorevalide = self.node.item.valideListePartielle(valeurTuple, listecourante)
+        if not encorevalide:
+            commentaire2 = self.node.item.infoErreurListe()
+            return valide, commentaire, commentaire2, listeRetour
+        listeRetour.append(valeurTuple)
+        return valide, commentaire, commentaire2, listeRetour
+
+    def ajoutNTuple(self, liste):
+        commentaire = "Nouvelles valeurs acceptee"
+        commentaire2 = ""
+        valide = self.node.item.valideListePartielle(None, liste)
+        print("uuuuuuuuuuu", valide)
+        if not valide:
+            commentaire2 = self.node.item.infoErreurListe()
+        return valide, commentaire, commentaire2
+
+    def recordValeur(self, liste, dejaValide=True):
+        ancienneVal = self.node.item.getValeur()
+        validite = self.node.item.setValeur(liste)
+        if validite:
+            self.node.item.initModif()
+        if self.node.item.isValid():
+            commentaire = tr("Valeur du mot-cle enregistree")
+        else:
+            cr = self.node.item.getCr()
+            commentaire = tr("Valeur du mot-cle non autorisee ") + cr.getMessFatal()
+            self.node.item.setValeur(ancienneVal)
+        return validite, commentaire
diff --git a/InterfaceGUI/qtEficasSsIhm.py b/InterfaceGUI/qtEficasSsIhm.py
deleted file mode 100755 (executable)
index e3b753c..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-# -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2024   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 os, sys
-
-from Extensions.eficas_exception import EficasException
-from InterfaceGUI.getVersion import getEficasVersion
-from InterfaceGUI.viewManagerSsIhm import MyViewManagerSsIhm
-from Editeur import session
-
-
-class AppliSsIhm:
-    """
-    Class implementing the main user interface.
-    """
-
-    def __init__( self, code=None, salome=1, parent=None, multi=False, langue="fr",
-        ssIhm=True, labelCode=None, genereXSD=False, versionCode=None, ssCode=None, fichierCata=None,
-        GUIPath=None,
-    ):
-        """
-        Constructor
-        """
-        version = getEficasVersion()
-        self.versionEficas = "Eficas QT5 Salome " + version
-        self.labelCode = labelCode
-        self.GUIPath = None
-
-        self.salome = salome
-        self.ssIhm = True
-        self.code = code
-        self.genereXSD = genereXSD
-        self.versionCode = versionCode
-        self.ssCode = ssCode
-
-        self.dict_reels = {}
-        self.fichierIn = None
-        self.fichierOut = None
-
-        self.recent = []
-        self.ficRecents = {}
-        self.mesScripts = {}
-        self.listePathAEnlever = []
-        self.repIcon = os.path.join( os.path.dirname(os.path.abspath(__file__)), "..", "Editeur", "icons")
-
-        if fichierCata == None: self.fichierCata = session.d_env.fichierCata
-        else: self.fichierCata = fichierCata
-
-        if session.d_env.labelCode: self.labelCode = session.d_env.labelCode
-        self.withXSD = session.d_env.withXSD
-
-        if self.salome:
-            try:
-                from Accas import eficasSalome
-                Accas.SalomeEntry = eficasSalome.SalomeEntry
-            except:
-                print("eficas hors salome")
-
-        self.multi = multi
-        if self.multi: print("pas de multi sans ihm")
-
-        if langue == "fr": self.langue = langue
-        else: self.langue = "ang"
-
-        if self.multi == False:
-            self.definitCode(code, ssCode)
-            if code == None: return
-        else : 
-            self.maConfiguration = configBase(self)
-
-        self.suiteTelemac = False
-        self.viewmanager = MyViewManagerSsIhm(self)
-        self.withUQ = False
-
-    def ajoutUQ(self):
-        self.withUQ = True
-        self.formatFichierIn = "pythonUQ"  # par defaut
-
-    def definitCode(self, code, ssCode):
-        # ssCode sert pour Map
-        self.code = code
-        self.ssCode = ssCode
-        if self.code == None:
-            return  # pour le cancel de la fenetre choix code
-
-        if ssCode != None:
-            self.formatFichierOut = ssCode  # par defaut
-            prefsCode.NAME_SCHEME = ssCode
-        else:
-            self.formatFichierIn = "python"  # par defaut
-            self.formatFichierOut = "python"  # par defaut
-
-        from InterfaceGUI.configuration import configBase
-        self.maConfiguration = configBase(self)
-
-        if hasattr(self, "maConfiguration") and self.maConfiguration.translatorFichier:
-            from Extensions import localisation
-            localisation.localise( None, self.langue,
-                translatorFichier=self.maConfiguration.translatorFichier,
-            )
-        if self.withXSD:
-            self.maConfiguration.withXSD = True
-
-    def getSource(self, file):
-        # appele par Editeur/session.py
-        import convert
-
-        p = convert.plugins["python"]()
-        p.readfile(file)
-        texte = p.convert("execnoparseur")
-        return texte
-
-    def initEditor(self, fichier=None, jdc=None, units=None, include=0):
-        if (hasattr(self, "editor")) and self.editor != None:
-            print("un seul editeur par application")
-            sys.exit()
-        self.editor = self.viewmanager.getNewEditorNormal()
-
-    def initEditorNormal(self, fichier=None, jdc=None, units=None, include=0):
-        if (hasattr(self, "editor")) and self.editor != None:
-            print("un seul editeur par application")
-            sys.Exit()
-        # self.editor = JDCEditorSsIhm(self,fichier, jdc, self.myQtab,units=units,include=include)
-        self.editor = self.viewmanager.getNewEditorNormal()
-
-    def fileNew(self):
-        self.editor = self.initEditor()
-
-    def getEditor(self):
-        if (hasattr(self, "editor")) and self.editor != None:
-            return self.editor
-        self.initEditor()
-        return self.editor
-
-    def fileOpen(self, fichier):
-        fichierIn = os.path.abspath(fichier)
-        try:
-            monEditor = self.viewmanager.handleOpen(fichierIn)
-        except EficasException as exc:
-            print("poum")
-            monEditor = None
-        return monEditor
-
-    def fileSave(self):
-        if self.editor == None:
-            return False
-        ok, newName = editor.saveFileAs()
-        print("ok, newName ", ok, newName)
-
-    def fileSaveAs(self, fileName):
-        if self.editor == None:
-            return False
-        ok = editor.saveFileAs()
-        print("ok ", ok)
-
-    def dumpXsd(self, avecEltAbstrait=False):
-        currentCata = CONTEXT.getCurrentCata()
-        texteXSD = currentCata.dumpXsd(avecEltAbstrait)
-        return texteXSD
-
-    def afficheMessage(self, titre, texte,critical=True):
-        print ('__________________________')
-        print (tr(titre))
-        print ('')
-        print (tr(texte))
-        print ('__________________________')
-
-
-# ,self.fileSaveAs
-# ,self.fileClose
-# ,self.fileExit
-# ,self.jdcRapport
-# ,self.jdcRegles
-# ,self.jdcFichierSource
-# ,self.visuJdcPy
-
-
-if __name__ == "__main__":
-    # Modules Eficas
-    monEficas = AppliSsIhm(code="Adao", salome=0, labelCode="V83")
diff --git a/InterfaceGUI/traiteSaisie.py b/InterfaceGUI/traiteSaisie.py
new file mode 100644 (file)
index 0000000..edd6d67
--- /dev/null
@@ -0,0 +1,182 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2024   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 types
+from Extensions.i18n import tr
+
+#--------------------------
+class SaisieValeur(object):
+#--------------------------
+    """
+    Classe contenant les methodes communes aux  panels
+    permettant de choisir des valeurs
+    """
+
+    def valeurChanged(self,valeur=None):
+    #-----------------------------------
+    # pour la partie Web
+        debug=0
+        if debug :  print('valeurChanged', valeur, type(valeur))
+        nouvelleValeurFormat=self.politique.getValeurTexte(nouvelleValeur)
+        validite,commentaire=self.politique.recordValeur(nouvelleValeurFormat)
+        if commentaire != "" :
+            if validite : self.editor.afficheCommentaire(commentaire)
+            else        : self.editor.afficheInfos(commentaire,'red')
+        self.inSaisieValeur=False
+        self.setValide()
+
+
+    def LEvaleurPressed(self, valeur=None):
+    #---------------------------------------
+    # pour la partie Qt
+        debug=0
+        if debug :  print('LEvaleurPressed', valeur, type(valeur))
+        if not hasattr(self, "inSaisieValeur"): self.inSaisieValeur = False
+        if self.inSaisieValeur: return
+        self.inSaisieValeur = True
+
+        if valeur == None:
+            try:
+                nouvelleValeur = str(self.lineEditVal.text())
+            except UnicodeEncodeError as e:
+                self.editor.afficheInfos("pb d encoding", Qt.red)
+                validite, commentaire = self.politique.recordValeur(None)
+                self.lineEditVal.setText("")
+                self.setValide()
+                self.inSaisieValeur = False
+                return
+        else:
+            try:
+                # la 1 ligne est tres bizarre. remplacee par le 3nd le 01 10 19
+                # if hasattr(self,"lineEditVal"):self.lineEditVal.setText(tr(valeur.nom))
+                if hasattr(self, "lineEditVal"): self.lineEditVal.setText(tr(valeur))
+            except:
+                if hasattr(self, "lineEditVal"): self.lineEditVal.setText(valeur)
+            nouvelleValeur = valeur
+
+        if self.node.item.definition.validators != None:
+            if self.node.item.definition.validators.verifItem(nouvelleValeur) != 1:
+                commentaire = self.node.item.definition.validators.infoErreurItem()
+                self.editor.afficheInfos(commentaire, Qt.red)
+                self.inSaisieValeur = False
+                return
+
+        nouvelleValeurFormat = self.politique.getValeurTexte(nouvelleValeur)
+        validite, commentaire = self.politique.recordValeur(nouvelleValeurFormat)
+        if commentaire != "":
+            if validite: self.editor.afficheCommentaire(commentaire)
+            else: self.editor.afficheInfos(commentaire, 'red')
+        self.inSaisieValeur = False
+        self.setValide()
+
+    def TraiteLEValeur(self, valeurTraitee=None):
+    #---------------------------------------------
+        # pour Qt
+        # lit la chaine entree dans le lineedit
+        # et la tranforme en chaine de valeurs
+        # attention eventuellement aux complexes
+
+        listeValeurs = []
+        if valeurTraitee == None:
+            valeurBrute = str(self.LEValeur.text())
+        else:
+            valeurBrute = valeurTraitee
+        if valeurBrute == str(""): return listeValeurs, 1
+
+         return self.traiteValeurSaisie(valeurBrute)
+
+    def traiteValeurSaisie(self, valeurSaisie):
+    #---------------------------------------
+        # appelé directerment pour le web 
+        # ou pour QT via la fonction TraiteLEValeur 
+        listeValeurs = []
+        valeurBrute = valeurSaisie
+        try:    valeur = eval(valeurBrute, {})
+        except: valeur = valeurBrute
+
+        # pour traiter 11.0 - 30.0 pour le CIST
+        # if (valeurTraitee and (type(valeurTraitee) in types.StringTypes) and (self.node.item.waitTxm())) :
+        if (
+            valeurTraitee
+            and isinstance(valeurTraitee, str)
+            and (self.node.item.waitTxm())
+        ):
+            valeur = str(valeurTraitee)
+
+        if type(valeur) in (list, tuple):
+            if self.node.item.waitComplex():
+                indice = 0
+                while indice < len(valeur):
+                    v = valeur[indice]
+
+                    if v == "RI" or v == "MP":
+                        try:
+                            t = tuple([v, valeur[indice + 1], valeur[indice + 2]])
+                            listeValeurs.append(t)
+                            indice = indice + 3
+                        except:
+                            commentaire = tr(
+                                "Veuillez entrer le complexe sous forme aster ou sous forme python"
+                            )
+                            self.editor.afficheInfos(commentaire)
+                            return listeValeurs, 0
+
+                    else:  # ce n'est pas un tuple a la mode aster
+                        listeValeurs.append(v)
+                        indice = indice + 1
+
+            else:  # on n'attend pas un complexe
+                listeValeurs = valeurBrute.split(",")
+
+        elif type(valeur) == bytes:
+            listeValeurs = valeur.split(",")
+        else:
+            # listeValeurs.append(valeurBrute)
+            listeValeurs.append(valeur)
+
+        return listeValeurs, 1
+
+
+class SaisieSDCO(object):
+    def LESDCOReturnPressed(self):
+        """
+        Lit le nom donne par l'utilisateur au concept de type CO qui doit être
+        la valeur du MCS courant et stocke cette valeur
+        """
+        self.editor.initModif()
+        anc_val = self.node.item.getValeur()
+        if anc_val != None:
+            # il faut egalement propager la destruction de l'ancien concept
+            self.node.item.deleteValeurCo(valeur=anc_val)
+            # et on force le recalcul des concepts de sortie de l'etape
+            self.node.item.object.etape.getType_produit(force=1)
+            # et le recalcul du contexte
+            self.node.item.object.etape.parent.resetContext()
+        nomConcept = str(self.LESDCO.text())
+        if nomConcept == "":
+            return
+
+        test, commentaire = self.node.item.setValeurCo(nomConcept)
+        if test:
+            commentaire = tr("Valeur du mot-clef enregistree")
+            self.node.updateNodeValid()
+        else:
+            cr = self.node.item.getCr()
+            commentaire = tr("Valeur du mot-clef non autorisee :") + cr.getMessFatal()
diff --git a/PourADaoEtTelemac.txt b/PourADaoEtTelemac.txt
deleted file mode 100644 (file)
index f9fd4f3..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-chgt de label_user
-label_integrateur
-chgt de editeur.ini 
index 7bc231c36111eaf28f94fd52caec59abe5520959..c53b2a2da461a2f88b6f1bbef0c995ba283bfab3 100644 (file)
@@ -81,6 +81,12 @@ class JDC(V_MCCOMPO.MCCOMPO):
             self.valid = valid
             return self.valid
 
+    def getValid(self, cr="non"):
+        if self.state == "unchanged":
+            return self.valid
+        else:
+            return self.isValid()
+
     def verifRegles(self):
         """
         Effectue la verification de validite des regles du jeu de commandes
index 94b381b1be367d381ff26d274b3f776b75a9ad4d..16dc58ca8c90ad413b985782c4ebe7bde8bdf44e 100644 (file)
@@ -92,3 +92,9 @@ class MCFACT(V_MCCOMPO.MCCOMPO):
             if not old_valid or old_valid != self.valid:
                 self.initModifUp()
             return self.valid
+    def getValid(self):
+        if hasattr(self, "valid"):
+            return self.valid
+        else:
+            self.valid = None
+            return None
index 90d819a74967c22fbc1999e4991f3913429082d3..ac46fa3a813c8d33625bd03f674038848fb8f36e 100644 (file)
@@ -134,6 +134,15 @@ class MCSIMP(object):
                 typeProto = self.typeProto
                 intoProto = self.intoProto
                 cardProto = self.cardProto
+                if self.definition.filtre != None:
+                    listePossibles = self.getUserAssdPossible()
+                    self.intoProto = IntoProtocol(
+                        "into",
+                        into=listePossibles,
+                        val_min=self.definition.val_min,
+                        val_max=self.definition.val_max,
+                    )
+                    intoProto = self.intoProto
                 if cr == "oui":
                     # un cr est demande : on collecte tous les types d'erreur
                     try: