]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
report modif variees + patch CEA
authorpascale.noyret <pascale.noyret@edf.fr>
Wed, 30 Sep 2020 08:48:51 +0000 (10:48 +0200)
committerpascale.noyret <pascale.noyret@edf.fr>
Wed, 30 Sep 2020 08:48:51 +0000 (10:48 +0200)
168 files changed:
Accas/A_ASSD.py
Accas/A_ETAPE.py
Accas/A_JDC.py
Accas/A_MACRO_ETAPE.py
Accas/A_MCBLOC.py
Accas/A_MCFACT.py
Accas/A_MCLIST.py
Accas/A_MCSIMP.py
Accas/A_PROC_ETAPE.py
Accas/A_TUPLE.py [new file with mode: 0644]
Accas/__init__.py
Adao/configuration_Adao.py
Editeur/Eficas_utils.py
Editeur/Objecttreeitem.py
Editeur/TroisDPal.py
Editeur/__init__.py
Editeur/analyse_catalogue.py
Editeur/catadesc.py
Editeur/comploader.py
Editeur/icons/ast-green-dark-ball.png [new file with mode: 0644]
Editeur/listePatrons.py
Editeur/session.py
Efi2Xsd/AccasXsd.py
Efi2Xsd/MCAccasXML.py [new file with mode: 0755]
Efi2Xsd/balisesXSD.py [new file with mode: 0644]
Efi2Xsd/mapDesTypes.py
Extensions/jdc_include.py
Extensions/localisation.py
Extensions/mcnuplet.py
Extensions/nuplet.py
Extensions/param2.py
Extensions/parametre.py
Extensions/translationQT5.py
Ihm/I_ASSD.py
Ihm/I_A_CLASSER.py
Ihm/I_ENTITE.py
Ihm/I_ETAPE.py
Ihm/I_FICHIER.py
Ihm/I_JDC.py
Ihm/I_MACRO_ETAPE.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
Ihm/I_REGLE.py
InterfaceQT4/browser.py
InterfaceQT4/compobloc.py
InterfaceQT4/compocomm.py
InterfaceQT4/compofact.py
InterfaceQT4/compojdc.py
InterfaceQT4/compomacro.py
InterfaceQT4/compomclist.py
InterfaceQT4/compooper.py
InterfaceQT4/composimp.py
InterfaceQT4/configuration.py
InterfaceQT4/editor.py
InterfaceQT4/editorSsIhm.py [changed mode: 0644->0755]
InterfaceQT4/eficas_go.py
InterfaceQT4/feuille.py
InterfaceQT4/gereIcones.py
InterfaceQT4/groupe.py
InterfaceQT4/monBoutonValide.py
InterfaceQT4/monChoixCode.py
InterfaceQT4/monChoixCommande.py
InterfaceQT4/monChoixLangue.py
InterfaceQT4/monFonctionPanel.py
InterfaceQT4/monViewTexte.py
InterfaceQT4/monWidgetBloc.py
InterfaceQT4/monWidgetCB.py
InterfaceQT4/monWidgetCBIntoSug.py
InterfaceQT4/monWidgetCommande.py
InterfaceQT4/monWidgetCreeParam.py
InterfaceQT4/monWidgetCreeUserAssd.py [new file with mode: 0644]
InterfaceQT4/monWidgetFact.py
InterfaceQT4/monWidgetFactPlie.py
InterfaceQT4/monWidgetInactif.py
InterfaceQT4/monWidgetIntoSug.py
InterfaceQT4/monWidgetMatrice.py
InterfaceQT4/monWidgetNiveauFact.py
InterfaceQT4/monWidgetOptionnel.py
InterfaceQT4/monWidgetParam.py
InterfaceQT4/monWidgetPlusieursASSDIntoOrdonne.py
InterfaceQT4/monWidgetPlusieursBase.py
InterfaceQT4/monWidgetPlusieursInto.py
InterfaceQT4/monWidgetPlusieursIntoOrdonne.py
InterfaceQT4/monWidgetRadioButton.py
InterfaceQT4/monWidgetSimpBase.py
InterfaceQT4/monWidgetSimpBool.py
InterfaceQT4/monWidgetSimpTuple.py
InterfaceQT4/monWidgetTableau.py
InterfaceQT4/politiquesValidation.py
InterfaceQT4/qtEficas.py
InterfaceQT4/qtEficasSsIhm.py
InterfaceQT4/qtSaisie.py
InterfaceQT4/readercata.py
InterfaceQT4/readercataXML.py
Noyau/N_ASSD.py
Noyau/N_BLOC.py
Noyau/N_CO.py
Noyau/N_CONVERT.py
Noyau/N_ENTITE.py
Noyau/N_ETAPE.py
Noyau/N_FACT.py
Noyau/N_GEOM.py
Noyau/N_JDC.py
Noyau/N_JDC_CATA.py
Noyau/N_MACRO.py
Noyau/N_MACRO_ETAPE.py
Noyau/N_MCCOMPO.py
Noyau/N_MCFACT.py
Noyau/N_MCSIMP.py
Noyau/N_OBJECT.py
Noyau/N_OPER.py
Noyau/N_SIMP.py
Noyau/N_UserASSD.py [new file with mode: 0644]
Noyau/N_VALIDATOR.py
Noyau/N_utils.py
Noyau/context.py
Noyau/nommage.py
UiQT5/desChoixCode.ui
UiQT5/desGroupeOptionnel.ui
UiQT5/desPBOptionnelMT.ui
UiQT5/desVisu.ui
UiQT5/desWidgetBloc.ui
UiQT5/desWidgetCommande.ui
UiQT5/desWidgetFact.ui
UiQT5/desWidgetFactPlie.ui
UiQT5/desWidgetPlusieursInto.ui
UiQT5/desWidgetTableau.ui
UiQT5/eficas_en.qm [new file with mode: 0644]
UiQT5/eficas_en.ts
UiQT5/eficas_fr.qm [new file with mode: 0644]
convert/autre_parseur.py
convert/convert_TELEMAC.py
convert/convert_XML.py
convert/convert_dico.py
convert/convert_pyth.py
convert/convert_python.py
convert/old/convert_openturns_study.py
convert/old/convert_openturns_wrapper.py
convert/parseur_python.py
generator/Formatage.py
generator/generator_PSEN.py
generator/generator_ProcessOutputs.py
generator/generator_TELEMAC.py
generator/generator_XML.py
generator/generator_aplat.py
generator/generator_dico.py
generator/generator_dicoImbrique.py
generator/generator_map.py
generator/generator_mapVP.py [new file with mode: 0644]
generator/generator_python.py
generator/generator_vers3DSalome.py
generator/oldCodes/OpenturnsSTD.py
generator/oldCodes/generator_CARMEL3D.py
generator/oldCodes/generator_CARMEL3D_temporel.py
generator/oldCodes/generator_CARMELCND.py
generator/oldCodes/generator_CARMELCS.py
generator/oldCodes/generator_SEP.py
generator/oldCodes/generator_ZCracks.py
generator/oldCodes/generator_asterv5.py
generator/oldCodes/generator_cuve2dg.py
generator/oldCodes/generator_file_from_template.py
generator/oldCodes/generator_ini.py
generator/oldCodes/generator_openturns_wrapper.py
generator/oldCodes/generator_python6.py

index afa935faf020da288c1673854e9d7322030125f4..22c98794c6a0ea28a22379535861f67b41065a15 100644 (file)
@@ -26,6 +26,7 @@ from Noyau import N_ASSD
 from Noyau import N_GEOM 
 from Noyau import N_FONCTION 
 from Noyau import N_CO 
+from Noyau import N_UserASSD 
 
 # On ajoute la classe ASSD dans l'heritage multiple pour recreer 
 # une hierarchie d'heritage identique a celle de Noyau
@@ -35,6 +36,7 @@ from Noyau import N_CO
 class ASSD(I_ASSD.ASSD,N_ASSD.ASSD):pass
 #class LASSD(I_LASSD.LASSD,N_LASSD.LASSD):pass
 class LASSD(I_LASSD.LASSD):pass
+class UserASSD(N_UserASSD.UserASSD,ASSD): pass
 
 class assd(N_ASSD.assd,I_ASSD.assd,ASSD):pass
 
@@ -60,3 +62,5 @@ class fonction(N_FONCTION.formule,I_FONCTION.fonction,ASSD):
 class GEOM(N_GEOM.GEOM,I_ASSD.GEOM,ASSD):pass
 class geom(N_GEOM.geom,I_ASSD.geom,ASSD):pass
 class CO(N_CO.CO,I_ASSD.CO,ASSD):pass
+
+
index a3dbd595012dee672488731dc876c4b558bbfe24..11dc12de15a15ffdf85fbe2dedb8f47df2566cf0 100644 (file)
@@ -21,10 +21,9 @@ from __future__ import absolute_import
 from Noyau import N_ETAPE
 from Validation import V_ETAPE
 from Ihm import I_ETAPE
-from Efi2Xsd.MCAccasXsd  import X_MCCOMPO
+from Efi2Xsd.MCAccasXML  import X_ETAPE
 
-class ETAPE(I_ETAPE.ETAPE,V_ETAPE.ETAPE,X_MCCOMPO,N_ETAPE.ETAPE):
+class ETAPE(I_ETAPE.ETAPE,V_ETAPE.ETAPE,X_ETAPE,N_ETAPE.ETAPE):
    def __init__(self,oper=None,reuse=None,args={}):
-      print ('------------- ETAPE accas', oper.nom, args)
       N_ETAPE.ETAPE.__init__(self,oper,reuse,args)
       V_ETAPE.ETAPE.__init__(self)
index d17bd2343340876411b1d27b653f0281aae9522b..3748913da4c21ff99d01dd6be1792f223ac60c2f 100644 (file)
@@ -22,7 +22,7 @@ from Noyau import N_JDC
 from Validation import V_JDC
 from Extensions import jdc
 from Ihm import I_JDC
-from Efi2Xsd.MCAccasXsd  import X_JDC
+from Efi2Xsd.MCAccasXML  import X_JDC
 
 class JDC(jdc.JDC,I_JDC.JDC,X_JDC,V_JDC.JDC,N_JDC.JDC):
    from .A_ASSD import CO,assd
index 2bba807e646337db45ac04c2e9aa95f8a7ad55f8..28a3ce744c12a16de027212c0927cf34079e5e92 100644 (file)
@@ -22,7 +22,7 @@ from Noyau import N_MACRO_ETAPE
 from Validation import V_MACRO_ETAPE
 from Ihm import I_MACRO_ETAPE
 from .A_ASSD import CO
-from Efi2Xsd.MCAccasXsd  import X_MCCOMPO
+from Efi2Xsd.MCAccasXML  import X_MCCOMPO
 
 class MACRO_ETAPE(I_MACRO_ETAPE.MACRO_ETAPE,
                   X_MCCOMPO,
index df125d12fa0cfc2d981c8aa823f0fa743fa08704..5bd5cebdd8019b7547f0a6e9a0e1133941f7d512 100644 (file)
@@ -21,7 +21,7 @@ from __future__ import absolute_import
 from Noyau import N_MCBLOC
 from Validation import V_MCBLOC
 from Ihm import I_MCBLOC
-from Efi2Xsd.MCAccasXsd  import X_MCBLOC
+from Efi2Xsd.MCAccasXML  import X_MCBLOC
 
 
 class MCBLOC(I_MCBLOC.MCBLOC,N_MCBLOC.MCBLOC,X_MCBLOC,V_MCBLOC.MCBLOC):
index 50fd1a8da1d801faa27ba0ccd221aa123b9c9bda..769dcd2803a493a9d064c0c3bd510a75df49ad12 100644 (file)
@@ -21,7 +21,7 @@ from __future__ import absolute_import
 from Noyau import N_MCFACT
 from Validation import V_MCFACT
 from Ihm import I_MCFACT
-from Efi2Xsd.MCAccasXsd  import X_MCFACT
+from Efi2Xsd.MCAccasXML  import X_MCFACT
 
 class MCFACT(I_MCFACT.MCFACT,N_MCFACT.MCFACT,X_MCFACT,V_MCFACT.MCFACT):
    def __init__(self,val,definition,nom,parent,dicoPyxbDeConstruction=None):
index 5554f5ecc330f28d94446ca248d8f972a9e43f3f..922abb897d4e4d77ee16c4f6a4db6fb28bfde032 100644 (file)
@@ -21,7 +21,7 @@ from __future__ import absolute_import
 from Noyau import N_MCLIST
 from Validation import V_MCLIST
 from Ihm import I_MCLIST
-from Efi2Xsd.MCAccasXsd  import X_MCLIST
+from Efi2Xsd.MCAccasXML  import X_MCLIST
 
 
 class MCList(I_MCLIST.MCList,N_MCLIST.MCList,X_MCLIST,V_MCLIST.MCList):
index a3c63cb607c053260164227daaf4060dee33ba23..7c7ecbcaeb65f10a1073fb49eb25e3599a4f800c 100644 (file)
@@ -21,7 +21,7 @@ from __future__ import absolute_import
 from Noyau import N_MCSIMP
 from Validation import V_MCSIMP
 from Ihm import I_MCSIMP
-from Efi2Xsd.MCAccasXsd  import X_MCSIMP
+from Efi2Xsd.MCAccasXML  import X_MCSIMP
 
 class MCSIMP(I_MCSIMP.MCSIMP,N_MCSIMP.MCSIMP,X_MCSIMP,V_MCSIMP.MCSIMP):
    def __init__(self,val,definition,nom,parent,objPyxbDeConstruction=None):
index 7db1db8bf055e7f4ac034b11cf2961ad56ec4629..6fdd83611f592536cd01b97a68d861b1b6784770 100644 (file)
@@ -21,7 +21,7 @@ from __future__ import absolute_import
 from Noyau import N_PROC_ETAPE
 from Validation import V_PROC_ETAPE
 from Ihm import I_PROC_ETAPE
-from Efi2Xsd.MCAccasXsd  import X_MCCOMPO
+from Efi2Xsd.MCAccasXML  import X_MCCOMPO
 
 class PROC_ETAPE(I_PROC_ETAPE.PROC_ETAPE,
                  V_PROC_ETAPE.PROC_ETAPE,
diff --git a/Accas/A_TUPLE.py b/Accas/A_TUPLE.py
new file mode 100644 (file)
index 0000000..4cbd14e
--- /dev/null
@@ -0,0 +1,16 @@
+import types
+class Tuple:
+  def __init__(self,ntuple):
+    self.ntuple=ntuple
+
+  def __convert__(self,valeur):
+    try:
+       if isinstance(valeur, basestring) : return None
+    except NameError:
+       if isinstance(valeur, str): return None
+    if len(valeur) != self.ntuple: return None
+    return valeur
+
+  def info(self):
+    return "Tuple de %s elements" % self.ntuple
+
index eadd2bb2fe3dac6c4e34342fe57a8a439a68a708..52682045dc9f379bf3a2e9536e5945ce0607c481 100644 (file)
@@ -1,5 +1,5 @@
 # -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2017   EDF R&D
+# Copyright (C) 2007-2019   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
@@ -41,10 +41,14 @@ from .A_PROC import PROC
 from .A_MACRO import MACRO
 from .A_FORM import FORM
 from .A_BLOC import BLOC
+#from .A_BLOC import BLOC_EXCLUS_ABC
+#from .A_BLOC import BLOC_FICHIER
 from .A_FACT import FACT
 from .A_SIMP import SIMP
 from .A_EVAL import EVAL
 from .A_NUPLET import NUPL
+from .A_TUPLE import Tuple
+
 
 from .A_JDC import JDC
 from .A_ETAPE import ETAPE
@@ -68,7 +72,7 @@ from .A_ENSEMBLE import ENSEMBLE
 from .A_A_CLASSER import A_CLASSER
 from .A_AVANT import AVANT
 
-from .A_ASSD import ASSD,assd
+from .A_ASSD import ASSD,assd, UserASSD
 from .A_ASSD import GEOM,geom
 # Pour le moment on laisse fonction (ceinture et bretelles)
 from .A_ASSD import FONCTION, fonction
index 02bd53905b940ff425788f6349565b694df1668b..735905fb54fbbfb573b5efd62b443a73239662da 100644 (file)
@@ -43,7 +43,8 @@ class CONFIG(configuration.configBase):
     self.labels_eficas=['lang','rep_cata','catalogues','closeAutreCommande','closeFrameRechercheCommande','closeEntete','taille']
     configuration.configBase.__init__(self,appli,repIni)
 
-    self.rep_user = os.environ["HOME"]
+    #self.rep_user = os.environ["HOME"]
+    self.rep_user = os.path.expanduser("~")
     self.appli   = appli
     self.code    = appli.code
     # self.lang    = "fr"
index 89c601c594f53c4c63503bc5600d697cbb07f369..80951e03fb337837910d31b21a63450b786c01a0 100644 (file)
@@ -44,7 +44,8 @@ def getRepUser(dir):
       le repertoire de l'utilisateur /$home/Eficas_install
   """
 
-  rep_user_eficas= os.path.join(os.environ['HOME'],dir)
+  #rep_user_eficas= os.path.join(os.environ['HOME'],dir)
+  rep_user_eficas= os.path.join(os.path.expanduser("~"),dir)
   if os.path.exists(rep_user_eficas):
     if os.path.isfile(rep_user_eficas) :
       print (tr("Un fichier de nom %s existe deja : impossible de creer un repertoire de meme nom", rep_user_eficas))
index 7d419ca959eda4a91a329c93c8b6eaa073e471e1..b0b6641a6357a9070fe02e71f3e3551c82a97b02 100644 (file)
@@ -24,12 +24,10 @@ from __future__ import absolute_import
 from __future__ import print_function
 try :
    from builtins import str
-   from builtins import range
    from builtins import object
 except :
    pass
 import types,os,glob,imp,sys
-from six.moves.reprlib import Repr
 from copy import copy,deepcopy
 
 # import du chargeur de composants
@@ -37,8 +35,11 @@ from .comploader import makeObjecttreeitem
 from Ihm import CONNECTOR
 from Extensions.i18n import tr
 from Extensions.eficas_exception import EficasException
-from six.moves import range
 
+try :
+   from repr import Repr
+except :
+   from reprlib import Repr
 myrepr = Repr()
 myrepr.maxstring = 100
 myrepr.maxother = 100
@@ -143,9 +144,9 @@ class Delegate(object):
 
 
 class ObjectTreeItem(TreeItem,Delegate):
-    def __init__(self, appli, labeltext, object, setFunction=None):
+    def __init__(self, appliEficas, labeltext, object, setFunction=None):
         self.labeltext = labeltext
-        self.appli = appli
+        self.appliEficas = appliEficas
         # L'objet delegue est stocke dans l'attribut object
         # L'objet associe a l'item est stocke dans l'attribut _object
         # Il peut etre obtenu par appel a la methode getObject
@@ -180,10 +181,10 @@ class ObjectTreeItem(TreeItem,Delegate):
         Cree un item copie de self
         """
         object = self._object.copy()
-        appli = copy(self.appli)
+        appliEficas = copy(self.appliEficas)
         labeltext = copy(self.labeltext)
         fonction = deepcopy(self.setFunction)
-        item = makeObjecttreeitem(appli,labeltext,object,fonction)
+        item = makeObjecttreeitem(appliEficas,labeltext,object,fonction)
         return item
     
     def isActif(self):
@@ -403,10 +404,6 @@ class ObjectTreeItem(TreeItem,Delegate):
             self.setFunction(value)
         except:
             pass
-# Modif de ma part CCar : je ne comprend pas a quoi ca sert
-# ca parait meme incorrect
-      #  else:
-      #      self.object = value
 
     def isExpandable(self):
         return 1
@@ -420,7 +417,7 @@ class ObjectTreeItem(TreeItem,Delegate):
             except AttributeError:
                 continue
             item = makeObjecttreeitem(
-                self.appli,
+                self.appliEficas,
                 str(key) + " =",
                 value,
                 lambda value, key=key, object=self.object:
@@ -434,12 +431,12 @@ class ObjectTreeItem(TreeItem,Delegate):
         (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
     #    return self.object.definition.fichier_ini
 
-    def makeObjecttreeitem(self,appli,labeltext, object, setFunction=None):
+    def makeObjecttreeitem(self,appliEficas,labeltext, object, setFunction=None):
         """
            Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
            de type item associe a l'object passe en argument.
         """
-        return makeObjecttreeitem(appli,labeltext,object,setFunction)
+        return makeObjecttreeitem(appliEficas,labeltext,object,setFunction)
 
     #def __del__(self):
     #    print "__del__",self
@@ -478,7 +475,7 @@ class SequenceTreeItem(ObjectTreeItem):
 
     def addItem(self,obj,pos):
         self._object.insert(pos,obj)
-        item = self.makeObjecttreeitem(self.appli, obj.nom + ":", obj)
+        item = self.makeObjecttreeitem(self.appliEficas, obj.nom + ":", obj)
         return item
 
     def suppItem(self,item):
@@ -486,7 +483,7 @@ class SequenceTreeItem(ObjectTreeItem):
             self._object.remove(item.getObject())
             # la liste peut etre retournee vide !
             message = "Mot-clef " + item.getObject().nom + " supprime"
-            self.appli.afficheInfos(message)
+            self.appliEficas.afficheInfos(message)
             return 1
         except:
             return 0
@@ -508,7 +505,7 @@ class SequenceTreeItem(ObjectTreeItem):
               # nouvel objet : on cree un nouvel item
               def setFunction(value, object=obj):
                   object=value
-              it = self.makeObjecttreeitem(self.appli, obj.nom + " : ", obj, setFunction)
+              it = self.makeObjecttreeitem(self.appliEficas, obj.nom + " : ", obj, setFunction)
               self.sublist.append(it)
            if old_obj is None and obj is None:break
            if old_obj is obj: self.sublist.append(item)
index 6d42efa04bf8f98753dfc6cc717a0a3abfa2ee93..5fc0d0853ad452258291c2431d96636d15a7298e 100644 (file)
@@ -32,9 +32,9 @@ from Extensions.i18n import tr
 
 class TroisDPilote(object):
 
-   def __init__(self,node,appli):
+   def __init__(self,node,appliEficas):
       self.node=node
-      self.appli=appli
+      self.appliEficas=appliEficas
 
    def envoievisu(self):
       """ 
@@ -51,6 +51,6 @@ class TroisDPilote(object):
          return ""
       from Extensions.param2 import originalMath
       originalMath.toOriginal()
-      self.appli.envoievisu(texte)
+      self.appliEficas.envoievisu(texte)
       originalMath.toSurcharge()
   
index b32d290b3bb3395cb8bcd3672d793a1e732e7709..266bf4530a16fbacb4905e2749b3904a7efb5684 100644 (file)
@@ -18,6 +18,4 @@
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
 """
-    Ce package contient les fonctionnalites COMMUNES necessaires
-    aux deux editeurs graphiques QT et TK
 """
index c99742828a92bdb088b33db2e92171c68cf544f2..51f1cf849cc4cb6a136e332ee49d969a48d8a900 100644 (file)
@@ -21,7 +21,6 @@ from __future__ import absolute_import
 from __future__ import print_function
 try : 
    from builtins import str
-   from builtins import range
    from builtins import object
 except :
    pass
@@ -31,7 +30,6 @@ import re,six.moves.cPickle,os
 from Extensions.i18n import tr
 from Noyau.N_CR import CR
 
-from six.moves import range
 
 #
 __Id__="$Id: analyseCatalogue.py,v 1.9.8.1.2.1.2.6 2014-01-23 09:14:44 pnoyret Exp $"
@@ -296,15 +294,15 @@ def analyseCatalogueCommande(parent,nom_cata):
         return cata
 
 
-def makeCataPickle(fic_cata):
+def makeCataPickle(ficCata):
         """
         Lance l'analyse de l'ordre des mots-cles dans le catalogue dont le nom
         est passe en argument et sauvegarde ces infos dans le fichier pickle relu
         par Eficas
         """
-        fic_cata_p = os.path.splitext(fic_cata)[0]+'_pickled.py'
-        cata_ordonne = analyseCatalogue(None,fic_cata)
-        f = open(fic_cata_p,'w+')
+        ficCata_p = os.path.splitext(ficCata)[0]+'_pickled.py'
+        cata_ordonne = analyseCatalogue(None,ficCata)
+        f = open(ficCata_p,'w+')
         p = six.moves.cPickle.Pickler(f)
         p.dump(cata_ordonne.entites)
         f.close()
index 89b7059934e27aeb3c6f56168703879056464c7d..7f3ffeaef835c9268864ac6cbce2c28c2a656e96 100644 (file)
@@ -23,67 +23,72 @@ except : pass
 
 class CatalogDescription(object):
     
-    def __init__(self, identifier, cata_file_path, file_format = "python",
-                 default = False, code = None,ss_code=None, user_name = None,
-                 selectable = True, file_format_in = "python"):
+    def __init__(self, labelCode, fichierCata, formatFichierOut = "python", formatFichierIn='python',
+                 default = False, code = None,ss_code=None,):
         """
         This class can be used to describe an Eficas catalog.
 
-        :type  identifier: string
-        :param identifier: unique identifier for the catalog
+        :type  labelCode: string
+        :param labelCode: unique labelCode for the catalog
                 
-        :type  cata_file_path: string
-        :param cata_file_path: path of the file containing the catalog itself
+        :type  fichierCata: string
+        :param fichierCata: path of the file containing the catalog itself
                 
-        :type  file_format: string
-        :param file_format: format of the files generated when using this
-                            catalog
+        :type  fileFormatOut: string
+        :param fileFormatOut: format of the files generated when using this catalog
                 
         :type  default: boolean
-        :param default: indicate if this catalog is the default one (appear on
-                        the top of the catalogs list)
+        :param default: indicate if this catalog is the default one (appear on the top of the catalogs list)
                 
         :type  code: string
-        :param code: Deprecated. Used to indicate the code associated to this
-                     catalog
+        :param code: Used to indicate the code associated to this catalog
                 
         :type  ss_code: string
         :param ss_code: scheme associated to this catalog (Map only)
 
-        :type  user_name: string
-        :param user_name: name of the catalog as it will appear in the list
-                
-        :type  selectable: boolean
-        :param selectable: indicate if this catalog appears in the list.
-                           Setting this parameter to False is useful to keep
-                           old catalogs to edit existing files but to forbid
-                           to use them to create new files.
                 
         """
-        self.identifier = identifier
-        self.cata_file_path = cata_file_path
-        self.file_format = file_format
+
+        self.labelCode = labelCode
+        self.fichierCata = fichierCata
+        self.formatFichierOut = formatFichierOut
+        self.formatFichierIn = formatFichierIn 
         self.default = default
         self.code = code
-        if user_name is None:
-            self.user_name = identifier
-        else:
-            self.user_name = user_name
-        self.selectable = selectable
-        self.file_format_in = file_format_in
 
     @staticmethod
-    def create_from_tuple(cata_tuple):
+    def createFromTuple(cataTuple):
         #print "Warning: Describing a catalog with a tuple is deprecated. " \
         #      "Please create a CatalogDescription instance directly."
-        desc = CatalogDescription(code = cata_tuple[0],
-                                  identifier = cata_tuple[1],
-                                  cata_file_path = cata_tuple[2],
-                                  file_format = cata_tuple[3])
+        if cataTuple[0] == 'MAP' :
+           desc = CatalogDescription(code = cataTuple[0],
+                                  labelCode = cataTuple[1],
+                                  fichierCata = cataTuple[2],
+                                  ssCode      = cataTuple[3],
+                                  formatFichierOut = 'MAP',
+                                  formatFichierIn  = 'MAP')
+        elif len(cataTuple) == 4:
+           desc = CatalogDescription(code = cataTuple[0],
+                                  labelCode = cataTuple[1],
+                                  fichierCata = cataTuple[2],
+                                  formatFichierOut = cataTuple[3],
+                                  formatFichierIn  = 'python')
+        elif len(cataTuple) == 5 : 
+           desc = CatalogDescription(code = cataTuple[0],
+                                  labelCode = cataTuple[1],
+                                  fichierCata = cataTuple[2],
+                                  formatFichierOut = cataTuple[3],
+                                  formatFichierIn  = cataTuple[4])
+        elif len(cataTuple) == 6 : 
+           desc = CatalogDescription(code = cataTuple[0],
+                                  labelCode = cataTuple[1],
+                                  fichierCata = cataTuple[2],
+                                  formatFichierOut = cataTuple[3],
+                                  formatFichierIn  = cataTuple[4],
+                                  defaut=cataTuple[5])
+        else : 
+           print ('pb a la description du catalogue avec les donnees')
+           print (cataTuple)
+           desc=None
         
-        if len(cata_tuple) == 5:
-            if cata_tuple[4] == "defaut":
-                desc.default = True
-            else:
-                desc.file_format_in = cata_tuple[4]
         return desc
index 40ba093fb3492e7997b7729d45248ce05586e0bb..5f240ae0e6c40104230cd122bd33d69c2ffdb2f4 100644 (file)
@@ -27,7 +27,7 @@
        le dictionnaire composants.
      - gettreeitem(object) -> type d'item : fonction qui retourne un type
        d'item correspondant au type de l'objet noyau fourni.
-     - makeObjecttreeitem(appli,labeltext, object, setFunction=None) -> item : fonction qui retourne un item
+     - makeObjecttreeitem(appliEficas,labeltext, object, setFunction=None) -> item : fonction qui retourne un item
        correspondant a l'objet noyau fourni.
 """
 # import generaux
@@ -85,11 +85,11 @@ def gettreeitem(object):
     itemtype=composants[None]
     return itemtype
 
-def makeObjecttreeitem(appli,labeltext, object, setFunction=None):
+def makeObjecttreeitem(appliEficas,labeltext, object, setFunction=None):
     """
        Cette fonction permet de construire et de retourner un objet
        de type item associe a l'object passe en argument.
     """
     c = gettreeitem(object)
-    return c(appli,labeltext, object, setFunction)
+    return c(appliEficas,labeltext, object, setFunction)
 
diff --git a/Editeur/icons/ast-green-dark-ball.png b/Editeur/icons/ast-green-dark-ball.png
new file mode 100644 (file)
index 0000000..6fc9d5b
Binary files /dev/null and b/Editeur/icons/ast-green-dark-ball.png differ
index f1cf08b4f056cdf77c3f1cefce0c50cf86381934..2a3057369164c4cd0516a18cc320476655230c13 100644 (file)
 #
 from __future__ import absolute_import
 try :
-   from builtins import range
    from builtins import object
 except : pass
 import os
 import re
-from six.moves import range
 
 sous_menus={
 #          "OPENTURNS_STUDY" : {0:{"Essai":"Std.comm"}},
index ebbf40a90af40519782c008a60fb6631cbecadb9..0fcad7803d36c4859bc6be2caf0102456a642abc 100644 (file)
 Ce module centralise les informations issues de la ligne de commande.
 
 La ligne de commande est parsee avec l'aide du module python optparse.
-Les options possibles sont : -c, -j, -p, -d, -i, -f comme definies ci-dessous.
+Les options possibles sont : -l, -j, -p, -d, -i, -f comme definies ci-dessous.
 
 Un exemple typique d'utilisation est :
->>> ./appli.py -c V7.3 -d 1 -j aa -i 11 iii -p ppp -i 22 ii -j bb -f ff
+>>> ./appli.py -v V7.3 -d 1 -j aa -i 11 iii -p ppp -i 22 ii -j bb -f ff
 
 qui demande a l'application d'ouvrir trois jeux de commandes.
 
@@ -198,7 +198,13 @@ def checkFich(option, opt_str, fich, parser):
     if not hasattr(parser.values,"studies"):
        parser.values.studies=[]
        parser.values.comm=[]
-    config = six.moves.configparser.configparser()
+   # Python 2 to 3
+    try :
+     import ConfigParser
+     config=ConfigParser.ConfigParser()
+    except :
+     import configparser
+     config=configparser.configparser()
     config.read([fich])
     if not config.has_option(u"jdc","jdc"):
        raise OptionValueError(tr(" jdc %s manque option jdc dans section jdc", str(fich)))
@@ -237,7 +243,7 @@ def printDEnv():
 def createparser():
     # creation du parser des options de la ligne de commande
     #import prefs
-    parser=optparse.OptionParser(usage=tr("utilisation : %prog [options]"), version="%prog 1.13")
+    parser=optparse.OptionParser(usage=tr("utilisation : %prog [options]"), version="%prog 9.5")
 
     parser.add_option(u"-j","--jdc",dest="comm",type='string',
                     action="callback",callback=checkComm,
@@ -251,14 +257,14 @@ def createparser():
                   action="callback", callback=checkInclude,
                   nargs=2, help=tr("numero d'unite suivi du nom du fichier include"))
 
-    parser.add_option(u"-f","--fich", type="string",dest="fich",
-                  action="callback", callback=checkFich,
-                  help=tr("fichier decrivant une etude"))
+    #parser.add_option(u"-f","--fich", type="string",dest="fich",
+    #              action="callback", callback=checkFich,
+    #              help=tr("fichier decrivant une etude"))
 
-    parser.add_option(u"-c","--cata", action="store", type="string",dest="cata",
-                  help=tr("version de catalogue a utiliser"))
+    parser.add_option(u"-c","--cata", action="store", type="string",dest="fichierCata",
+                  help=tr("catalogue a utiliser"))
 
-    parser.add_option(u"-v","--version_cata", action="store", type="string",dest="version_cata",
+    parser.add_option(u"-v","--label", action="store", type="string",dest="labelCode",
                   help=tr("version de catalogue a utiliser"))
 
 
@@ -268,11 +274,19 @@ def createparser():
     parser.add_option(u"-d","--debug", action="store", type="int",dest="debug",
                   help=tr("niveau de debug"))
 
+    parser.add_option(u"-x","--withXSD", action="store_true", dest="withXSD",
+                  default=False,
+                  help=tr("construit le .xml en meme temps que le .comm"))
+
+    parser.add_option(u"-a","--withEltAbstrait", action="store_true", dest="avecEltAbstrait",
+                  default=False,
+                  help=tr("construit des elements abstraits dans le XSD pour gerer le cascading"))
+
     parser.add_option(u"-s","--schema", action="store", type="string",dest="ssCode",
                   help=tr("schema"))
     # To handle locale information
-    parser.add_option("-l", "--locale", action="store", type="string", dest="locale",
-                  help=tr("localisation de l'application, pour la traduction"))
+    #parser.add_option("-l", "--locale", action="store", type="string", dest="locale",
+    #              help=tr("localisation de l'application, pour la traduction"))
 
 
     return parser
@@ -283,6 +297,11 @@ def parse(args):
     if not hasattr(options,"studies"):
        options.studies=[]
        options.comm=[]
+    if not hasattr(options,"fichierCata"): options.fichierCata=None
+    if not hasattr(options,"labelCode"): options.labelCode=None
+    if options.withXSD :
+       try : import pyxb
+       except : print ('Please, source pyxb environment'); exit()
     try:
        del parser.values.current
     except:
@@ -292,7 +311,7 @@ def parse(args):
             options.comm.append(file)
             options.studies.append({"comm":file})
             #print options.studies
-         elif len(args)==1 and (re.search('.comm',file) or re.search('.map',file) or re.search('.cas',file)):
+         elif len(args)==1 and (re.search('.comm',file) or re.search('.map',file) or re.search('.cas',file) or re.search('.xml',file)):
             try :
                 f=open(file,'w')
                 f.close()
@@ -308,9 +327,10 @@ def parse(args):
     global d_env
     d_env=options
     #printDEnv()
+    #print (options)
     return options
 
-def getUnit(d_study,appli):
+def getUnit(d_study,appliEficas):
     """
        Fonction : construit et retourne un dictionnaire contenant les informations
        sur les fichiers poursuite et includes sous la forme adaptee
@@ -321,22 +341,22 @@ def getUnit(d_study,appli):
                     ...] 
 
        d_study : dictionnaire de l'etude
-       appli : objet application EFICAS (permet d'acceder aux services comme getSource)
+       appliEficas : objet application EFICAS (permet d'acceder aux services comme getSource)
     """
-    return getDunit(d_study,appli)
+    return getDunit(d_study,appliEficas)
 
-def getDunit(d_unit,appli):
+def getDunit(d_unit,appliEficas):
     d={}
     if 'pours' in d_unit:
        # on a une poursuite
        comm=d_unit["pours"]["comm"]
-       g=getDunit(d_unit["pours"],appli)
-       text=appli.getSource(comm)
+       g=getDunit(d_unit["pours"],appliEficas)
+       text=appliEficas.getSource(comm)
        d[None]=comm,text,g
 
     for k,v in list(d_unit.items()):
        if k in (u"pours","comm"): continue
-       text=appli.getSource(v)
+       text=appliEficas.getSource(v)
        d[k]=v,text,d
 
     return d
index a9d7e576ada32a5df320c0c3f063b363936f2366..7954f4d02325531ea8462c7e7735ea4dd7f36076 100755 (executable)
@@ -1,7 +1,15 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
+# cette version ne fonctionne pas bien
+
+
 import sys,os
 import types
+import Accas
+import imp
+from copy import deepcopy, copy
+import traceback
+
 
 # CONTEXT est accessible (__init__.py de Noyau)
 
@@ -20,77 +28,443 @@ from .mapDesTypes import listeParamDeTypeTypeAttendu, listeParamDeTypeStr, dictP
 from .mapDesTypes import listeParamTjsSequence, listeParamSelonType
 from .mapDesTypes import Tuple
 
+PourTraduction = False
 
-from .balises import *
-
+from .balisesXSD import *
 # -----------------
 class X_definition:
 # -----------------
 
-   def getCode(self):
-       if hasattr(self,'code') : return
+   def adjoint(self, liste1, liste2):
+       #print ('adjoint', liste1, liste2)
+       l=[]
+       for elt1 in liste1:
+           for elt2 in liste2:
+               newListe=deepcopy(elt1)
+               if  elt2 != []: newListe.append(elt2)
+               l.append(newListe)
+       return l
+
+   def adjointUnMot(self, liste1, mot):
+       l=[]
+       for elt1 in liste1:
+           newListe=deepcopy(elt1)
+           newListe.append(mot)
+           l.append(newListe)
+       return l
+
+   def remplaceListeParContenuEtVide(self, liste1, liste2):
+       listeFinale=[]
+       for elt1 in liste1 :
+         for eltListe in liste2:
+              newListe=deepcopy(elt1)
+              if eltListe!=[] :newListe+=eltListe
+              if newListe not in listeFinale : listeFinale.append(newListe)
+       return listeFinale
+
+   #def remplaceNomListeParContenu(self, liste1, liste2):
+       #print ('remplaceNomListeParContenu', liste1, liste2)
+   #    listeFinale=[]
+   #    for elt1 in liste1 :
+   #      for eltListe in liste2:
+   #           if eltListe == [] : continue
+   #           newListe=deepcopy(elt1)
+   #           if eltListe!=[] :newListe+=eltListe
+   #           listeFinale.append(newListe)
+       #print ('listeFinale', listeFinale)
+   #    return listeFinale
+
+   def fusionne2Listes(self, liste1, liste2):
+       #print ('fusionne2Liste', liste1, liste2)
+       listeFinale=[]
+       for elt1 in liste1 :
+         for eltListe in liste2:
+              newListe=deepcopy(elt1)
+              if eltListe!=[] :newListe.append(eltListe)
+              listeFinale.append(newListe)
+       #print (listeFinale)
+       return listeFinale
+
+   def getNomDuCodeDumpe(self):
+       if hasattr(self,'nomDuCodeDumpe') : return
        obj=self
-       while ( not hasattr(obj,'code') ): obj=obj.pere
-       self.code = obj.code
-
-   #def genealogie(self,n):
-   #    texte=self.nom
-   #    obj=self
-   #    j=1
-   #    while ( hasattr(obj,'pere') ):
-   #        texte=obj.pere.nom+'_'+texte
-   #        obj=obj.pere
-   #        j=j+1
-   #        if j > n : return (True, 'T_'+texte)
-   #    return (False, 'T_'+texte)
-
-   def definitNomDuTypePyxb(self):
+       while ( not hasattr(obj,'nomDuCodeDumpe') ): obj=obj.pere
+       self.nomDuCodeDumpe = obj.nomDuCodeDumpe
+       self.code=obj.code
+       
+   def getXPathComplet(self):
+       obj=self
+       textePath='/'+self.code+":"+self.nom
+       while ( hasattr(obj,'pere') ):
+           obj=obj.pere
+           if isinstance(obj, X_BLOC) : continue 
+           textePath= '/'+ self.code + ":" + obj.nom + textePath
+       textePath='.' + textePath
+       return textePath
+
+   def getXPathSansSelf(self):
+       obj=self
+       textePath=''
+       while ( hasattr(obj,'pere') ):
+           obj=obj.pere
+           if isinstance(obj, X_BLOC) : continue 
+           textePath=  self.code + ":" + obj.nom + '/' + textePath
+       textePath='./'+ self.code + ":" + textePath
+       return textePath
+
+   def getNomCompletAvecBloc(self):
+       obj=self
+       texteNom=self.nom
+       while ( hasattr(obj,'pere') ):
+           texteNom=obj.pere.nom+'_'+texteNom
+           obj=obj.pere
+       return texteNom
+       
+
+   def definitNomDuTypePyxb(self,forceACreer=False):
+       if hasattr(self,'nomDuTypePyxb') : 
+          self.aCreer = False
+          return self.nomDuTypePyxb
        self.aCreer = True
        cata = CONTEXT.getCurrentCata() 
        nom='T_'+self.nom
+       if (hasattr (self, 'nomXML')) and self.nomXML != None : nom='T_'+self.nomXML
        if not (nom in cata.dictTypesXSD.keys()) :
           cata.dictTypesXSD[nom] = [self,]
+          self.nomDuTypePyxb=nom
           return nom
        self.aCreer = False
        if nom == 'T_Consigne' : return nom
+       
        listePossible=cata.dictTypesXSD[nom]
        indice=0
        while (indice < len(listePossible)) :
           objAComparer=listePossible[indice]
-          if self.compare(objAComparer) : return objAComparer.nomDuTypePyxb
+          if self.compare(objAComparer) : 
+             self.nomDuTypePyxb=objAComparer.nomDuTypePyxb
+             return objAComparer.nomDuTypePyxb
           indice += 1
        self.aCreer = True
        cata.dictTypesXSD[nom].append(self)
        nomAlter='T_'+self.nom+'_'+str(indice)
+       if (hasattr (self, 'nomXML')) and self.nomXML != None : 
+           nomAlter='T_'+self.nomXML+'_'+str(indice)
+       self.nomDuTypePyxb=nomAlter
+       #traceback.print_stack()
        return nomAlter
 
-  # def existeDeja(self,nom):
-  #     if nom in cata.dictTypesXSD.keys() :
-  #         self.aCreer = False
-  #         return cata.dictTypesXSD[nom]
-  #     else :
-  #         cata.dictTypesXSD[nom] = self
-  #         return None
 
 # ----------------------------------------
-class X_definitionComposee (X_definition):
+class X_compoFactoriseAmbigu(X_definition):
+# ----------------------------------------
+
+   def __init__(self,nom,listeDeCreation,pere):
+       #print ('__ X_compoFactoriseAmbigu', listeDeCreation)
+       #for (i,index) in listeDeCreation : print i.nom
+       self.label = 'compoAmbigu'
+       self.nom=nom
+       self.pere=pere
+       self.statut='f'
+       self.entites={}
+       self.mcXSD=[]
+       self.ordre_mc=[]
+       self.mcDejaDumpe=set()
+       #print (listeDeCreation)
+       for (mc, index) in listeDeCreation : 
+           self.mcXSD.append(mc)
+           self.ordre_mc.append(mc.nom)
+       #self.mcXSD=list(deepcopy(self.ordre_mc))
+       #for i in self.entites : print (i,self.entites[i])
+       #print ('creation de X_compoFactoriseAmbigu', self.nom, self.mcXSD)
+       self.construitEntites(self.mcXSD)
+       self.constructionArbrePossibles()
+       lesPossibles=deepcopy(self.arbrePossibles)
+      
+       self.getNomDuCodeDumpe()
+       self.nomDuTypePyxb = self.definitNomDuTypePyxb()
+       self.texteSimple = ''
+       self.texteComplexeVenantDesFils = ''
+       self.texteComplexe = debutTypeSubstDsBlocFactorise.format(self.nomDuTypePyxb)
+       # on enleve [] des possibles puisque l elt sera optionnel
+       lesPossibles.remove([])
+       #print ('________________ init de compoAmbigu',self.nom, lesPossibles)
+       #print ('self.entites', self.entites)
+       self.mcXSD=self.factoriseEtCreeDump(lesPossibles,nomAppel='Root')
+       #print ('self.mcXSD',self.mcXSD)
+       self.texteComplexe += finTypeSubstDsBlocFactorise
+       self.texteComplexe +=self.texteComplexeVenantDesFils
+       # PN ?? 12 mai self.texteComplexe=self.texteComplexe+self.texteComplexeVenantDesFils
+       self.label='BlocAmbigu'
+       #print ('fin pour prepareDumpXSD pour', self.nom)
+
+   def compare(self,autreMC):
+       if self.label != autreMC.label : return False
+       if self.arbrePossibles== autreMC.arbrePossible : return True
+       return False
+
+   def construitEntites(self, laListe):
+       for mc in laListe :
+           if mc.nom in self.entites.keys() : self.entites[mc.nom].append(mc)
+           else : self.entites[mc.nom] = [mc,]
+           if mc.label == 'BLOC' or  mc.label == 'BlocAmbigu':
+              self.ajouteLesMCFilsAEntite(mc)
+           
+
+   def ajouteLesMCFilsAEntite(self,blocMc):
+       for mcFilsNom in blocMc.entites.keys():
+         if mcFilsNom not in self.entites.keys(): self.entites[mcFilsNom]=[] 
+         if blocMc.label == 'BlocAmbigu' : 
+           for mc in blocMc.entites[mcFilsNom] : 
+             self.entites[mcFilsNom].append(mc) 
+             if mc.label == 'BLOC' or  mc.label == 'BlocAmbigu':
+                self.ajouteLesMCFilsAEntite(mc)
+         else :
+           self.entites[mcFilsNom].append(blocMc.entites[mcFilsNom])
+           if blocMc.entites[mcFilsNom].label == 'BLOC' or  blocMc.entites[mcFilsNom].label == 'BlocAmbigu':
+                self.ajouteLesMCFilsAEntite(blocMc.entites[mcFilsNom])
+           
+
+           
+
+   def constructionArbrePossibles(self):
+       #print ('construction pour FACT ambigu _______________', self.nom)
+       toutesLesLignes=[[]]
+       for child in self.mcXSD :
+          if not hasattr(child, 'arbrePossibles') : child.construitArbrePossibles()
+          if child.label != 'BLOC' :
+              toutesLesLignes = deepcopy(self.fusionne2Listes(toutesLesLignes, child.arbrePossibles))
+          else :
+              toutesLesLignes = deepcopy(self.fusionne2Listes(toutesLesLignes, [child.nom, []]))
+
+       lignesAGarder=[]
+       for ligne in toutesLesLignes:
+           blocContenus=[]
+           aAjouter=True
+           for mc in ligne : 
+               objMC=self.entites[mc][0]
+               if objMC.label == 'BLOC' : 
+                  blocContenus.append(objMC)
+           for b in blocContenus :
+               for frere in blocContenus[blocContenus.index(b)+1:]:
+                   if b.isDisjoint(frere) : continue
+                   aAjouter=False
+                   break
+               if not aAjouter : break
+           if  aAjouter and ligne not in lignesAGarder : 
+               lignesAGarder.append(ligne)
+
+       #print ("______________________________________")
+       #for l in lignesAGarder : print (l)
+       #print (len(lignesAGarder))
+       #print ("______________________________________")
+       self.arbrePossibles=[]
+       for ligne in lignesAGarder :
+           #print ('lignesAGarder', ligne)
+           for newLigne in self.deploye(ligne): 
+               #print (newLigne)
+               if newLigne not in self.arbrePossibles : self.arbrePossibles.append(newLigne)
+       #for l in self.arbrePossibles : print (l)
+       #print ("______________________________________")
+       
+         
+   def deploye (self, ligne):
+       toutesLesLignes=[[]]
+       for mc in ligne :
+           #print ( 'mc in deploye', mc)
+           objMC=self.entites[mc][0]
+           #print ( 'nom', objMC.nom, objMC.label)
+           if objMC.label == 'BLOC' or objMC.label == 'BlocAmbigu': 
+              toutesLesLignes = deepcopy(self.remplaceListeParContenuEtVide(toutesLesLignes, objMC.arbrePossibles))
+           else :
+              toutesLesLignes = deepcopy(self.adjointUnMot(toutesLesLignes,mc ))
+       return toutesLesLignes
+
+   def construitArbrePossibles(self):
+   # inutile car on a deja l arbre mais appele parfois
+       #print ('dans X_factCompoAmbigue ne fait rien', self.nom, self.arbrePossibles)
+       pass
+
+   def dumpXsd(self, dansFactorisation=False, multiple = False, first=False):
+       # on ne fait rien, tout a ete fait dans le init
+       self.texteElt=substDsSequence.format(self.code,self.nomDuTypePyxb,0,1)
+
+   def nomComplet(self) :
+       print ('dans nomComplet pourquoi ?',self, self.nom)
+
+       
+   def factoriseEtCreeDump(self, laListe, indent=2 ,nomAppel=None):
+       #print ('_______________________________ factoriseEtCreeDump')
+       #print(self.nom, laListe, indent, nomAppel)
+       maListeRetour=[]
+       aReduire={}
+
+       if [] in laListe : 
+          declencheChoiceAvecSeqVid=True
+          while [] in laListe : laListe.remove([])
+          #min=0
+       else :
+          declencheChoiceAvecSeqVid=False
+          #min=1
+
+
+       for ligne in laListe :
+          if ligne[0] in aReduire.keys(): 
+             if len(ligne) == 1 :aReduire[ligne[0]].append([])
+             else : aReduire[ligne[0]].append(ligne[1:])
+          else : 
+             if len(ligne) == 1 : aReduire[ligne[0]]=[[]]
+             else : aReduire[ligne[0]]=[ligne[1:],]
+
+       
+       if len(aReduire.keys()) == 1 :
+          if declencheChoiceAvecSeqVid == False : 
+             creeChoice=False
+             creeSequence=True
+             self.texteComplexe += '\t'*(indent) +  debSequenceDsBloc; indent=indent+1
+          else :
+             creeChoice=True
+             creeSequence=False
+             # pour regler le souci du 1er Niveau
+             self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
+             #if min == 1 : self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
+             #else        : self.texteComplexe += '\t'*indent + debutChoiceDsBlocAvecMin.format(min); indent=indent+1
+       else :                         
+          #self.texteComplexe += '\t'*indent + debutChoiceDsBlocAvecMin.format(min); indent=indent+1
+          self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
+          creeChoice=True
+          creeSequence=False
+
+       for nomMC in aReduire.keys():
+           listeSuivante=aReduire[nomMC]
+           if creeChoice and  listeSuivante != [[]] :
+              self.texteComplexe += '\t'*(indent) +  debSequenceDsBloc; indent=indent+1
+           self.ajouteAuxTextes(nomMC,indent)
+           if listeSuivante == [[]] : continue # Est-ce toujours vrai ? 
+           if len(listeSuivante) == 1 : self.ajouteAuxTextes(listeSuivante[0],indent)
+           else : self.factoriseEtCreeDump(listeSuivante, indent+int(creeSequence),nomMC)
+           if creeChoice   : indent=indent -1 ; self.texteComplexe += '\t'*(indent) + finSequenceDsBloc
+
+       if declencheChoiceAvecSeqVid : 
+          self.texteComplexe +=  '\t'*indent +  debSequenceDsBloc
+          self.texteComplexe +=  '\t'*indent + finSequenceDsBloc
+       if creeChoice   : indent=indent -1 ; self.texteComplexe += '\t'*indent + finChoiceDsBloc
+       if creeSequence : indent=indent -1 ; self.texteComplexe += '\t'*(indent) + finSequenceDsBloc
+
+       #if doitFermerSequence : indent=indent-1;self.texteComplexe += '\t'*(indent) + finSequenceDsBloc
+       #print (self.texteSimple)
+       #print ('______',' self.texteComplexe')
+       #print (self.texteComplexe)
+       #print ('_____', 'self.texteComplexeVenantDesFils')
+       #print (self.texteComplexeVenantDesFils)
+       print ('fin pour _______________________________', self.nom)
+       return (maListeRetour)
+       
+       
+   def ajouteAuxTextes(self,nomMC,indent) :
+       #print ('ajouteAuxTextes', nomMC, self.nom, self.entites)
+       #print ('ajouteAuxTextes', nomMC)
+       #for i in self.entites.keys() : print (self.entites[i][0].nom)
+       if (indent  > 3) : indent = indent - 3
+       else : indent = 0
+       if len(self.entites[nomMC]) == 1:
+           mc=self.entites[nomMC][0]
+           mc.dumpXsd(dansFactorisation=True)
+           self.texteComplexe += '\t'*(indent) + mc.texteElt
+           if mc.nomDuTypePyxb not in self.mcDejaDumpe :
+              self.texteComplexeVenantDesFils += mc.texteComplexe
+              self.texteSimple   += mc.texteSimple
+              self.mcDejaDumpe.add(mc.nomDuTypePyxb)
+           return
+
+       leType=type(self.entites[nomMC][0])
+       for e in (self.entites[nomMC][1:]) : 
+          if type(e) != leType:
+             print ('Projection XSD impossible, changez un des ', nomMC)
+             exit()
+
+       
+       # cette boucle ne fonctionne que pour des SIMP
+       resteATraiter=copy(self.entites[nomMC])
+       #print ('________resteATraiter', resteATraiter)
+       listePourUnion=[]
+       first=1
+       while resteATraiter != [] :
+          nvlListeATraiter=[]
+          mc=resteATraiter[0]
+          listePourUnion.append(mc)
+          for autre in resteATraiter[1:]:
+             if not (mc.compare(autre)) :  nvlListeATraiter.append(autre)
+          resteATraiter=copy(nvlListeATraiter)
+
+       if len(listePourUnion) == 1:
+           mc=listePourUnion[0]
+           mc.dumpXsd(dansFactorisation=True,multiple=False,first=first)
+           self.texteComplexe += '\t'*(indent) + mc.texteElt
+           if mc.nomDuTypePyxb not in self.mcDejaDumpe :
+              self.texteComplexeVenantDesFils += mc.texteComplexe
+              self.texteSimple   += mc.texteSimple
+              self.mcDejaDumpe.add(mc.nomDuTypePyxb)
+           return
+             
+       # on ajoute le nom de l element
+       self.entites[nomMC][0].dumpXsd(dansFactorisation=True,multiple=True,first=first)
+       self.texteComplexe += '\t'*(indent) + self.entites[nomMC][0].texteElt
+       texteSimpleUnion=debutSimpleType.format(self.entites[nomMC][0].nomDuTypePyxb)
+       texteSimpleUnion+=debutUnion
+       if len(listePourUnion) == 1 :
+           mc=self.entites[nomMC][0]
+           mc.dumpXsd(dansFactorisation=True,multiple=True,first=first)
+           if mc.nomDuTypePyxb not in self.mcDejaDumpe :
+              self.texteComplexeVenantDesFils += mc.texteComplexe
+              self.texteSimple   += mc.texteSimple
+              self.mcDejaDumpe.add(mc.nomDuTypePyxb)
+       else :
+           for e in listePourUnion :
+               e.dumpXsd(dansFactorisation=True,multiple=True,first=first)
+               if first and (e.nomDuTypePyxb not in self.mcDejaDumpe) :
+                  self.texteComplexeVenantDesFils += e.texteComplexe
+                  self.mcDejaDumpe.add(e.nomDuTypePyxb)
+                  texteSimpleUnion += '\t'*(indent)+e.texteSimple
+                  first=first * 0
+           texteSimpleUnion += finUnion
+       texteSimpleUnion+=fermeSimpleType
+       self.texteSimple   += texteSimpleUnion
+   
+
+
 # ----------------------------------------
+class X_definitionComposee (X_definition):
+# ------------------------------------------
    
-   def CreeTexteComplexeVenantDesFils(self):
+   def CreeTexteComplexeVenantDesFils(self,dansFactorisation=False):
        texteComplexeVenantDesFils=""
-       for nom in self.ordre_mc:
-          mcFils = self.entites[nom]
-          mcFils.dumpXsd()
-          self.texteComplexe += mcFils.texteElt
-          self.texteSimple   += mcFils.texteSimple 
-          texteComplexeVenantDesFils += mcFils.texteComplexe
+       blocsDejaDumpes=set()
+       #for nom in self.ordre_mc:
+       #  mcFils = self.entites[nom]
+       #print (self.nom)
+       for mcFils in self.mcXSD :
+          if not (isinstance(mcFils, Accas.BLOC)) :
+             mcFils.dumpXsd(dansFactorisation)
+             self.texteComplexe += mcFils.texteElt
+             self.texteSimple   += mcFils.texteSimple 
+             texteComplexeVenantDesFils += mcFils.texteComplexe
+             continue
+          else   :
+             #print (mcFils.nom)
+             if hasattr(mcFils,'nomXML')  and mcFils.nomXML in blocsDejaDumpes and mcFils.nomXML != None : continue 
+             if hasattr(mcFils,'nomXML')  and mcFils.nomXML != None: blocsDejaDumpes.add(mcFils.nomXML)
+             mcFils.dumpXsd(dansFactorisation)
+             self.texteComplexe += mcFils.texteElt
+             self.texteSimple   += mcFils.texteSimple 
+             texteComplexeVenantDesFils += mcFils.texteComplexe
        return texteComplexeVenantDesFils
 
-   def dumpXsd(self):
-       #print ('------------------------------------------------')
-       #print ('dumpXsd de ' , self.nom)
+   def dumpXsd(self, dansFactorisation=False, multiple = False, first=False):
+       #print ('_________ dumpXsd___________', self.nom)
+       if PourTraduction  : print (self.nom)
+       self.prepareDumpXSD()
  
-       self.getCode()
+       self.getNomDuCodeDumpe()
        self.nomDuTypePyxb  = self.definitNomDuTypePyxb()
        self.texteSimple    = "" # on n ajoute pas de type simple
 
@@ -98,31 +472,32 @@ class X_definitionComposee (X_definition):
        # pour accepter les PROC et ...
        # 
        if self.aCreer :
-          self.texteComplexe = debutTypeCompo.format(self.nomDuTypePyxb,self.minOccurs,self.maxOccurs)
-          texteComplexeVenantDesFils=self.CreeTexteComplexeVenantDesFils()
+          self.texteComplexe = debutTypeCompo.format(self.nomDuTypePyxb)
+          if isinstance(self,X_OPER) or isinstance(self,X_PROC) : 
+            self.texteComplexe += debutTypeCompoEtape.format(self.code)
+          self.texteComplexe += debutTypeCompoSeq
+          texteComplexeVenantDesFils=self.CreeTexteComplexeVenantDesFils(dansFactorisation)
           self.texteComplexe  = texteComplexeVenantDesFils + self.texteComplexe
-          self.texteComplexe += finTypeCompo
+          # la fin de l oper est traitee dans le dumpXSD de X_OPER
+          if not isinstance(self,X_OPER ) : self.texteComplexe += finTypeCompoSeq
+          if isinstance(self,X_PROC)      : self.texteComplexe += finTypeCompoEtape
+          if not isinstance(self,X_OPER ) : self.texteComplexe += finTypeCompo
        else :
           self.texteComplexe = ""
 
-       minDsSequence=0
-       if hasattr(self, 'statut') and self.statut=='f'  : minDsSequence=0
-       maxDsSequence=1
-       if self.label in ('BLOC', 'FACT'):
-          self.texteElt=eltCompoDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minDsSequence,maxDsSequence)
-       else :
-          self.texteElt=eltCompoDsSequenceSiProc.format(self.nom,self.code,self.nomDuTypePyxb)
+       self.texteElt=eltCompoDsSequence.format(self.nom,self.nomDuCodeDumpe,self.nomDuTypePyxb,self.minOccurs,self.maxOccurs)
        #print (self.texteComplexe)
-       #print ('------------------------------------------------')
+       #print ('------------------------------------------------',self.nom)
 
    def traduitMinMax(self):
-   # ____________________
-   # valable pour bloc, proc et oper
+   # ______________________
+   # valable pour PROC et OPER
       self.minOccurs = 0
-      self.maxOccurs = 1
+      self.maxOccurs = 1 
 
    def compare(self,autreMC):
        if self.label != autreMC.label : return False
+       if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None : return True
        for attr in (  'regles', 'fr',  'defaut', 'min' ,'max', 'position' , 'docu' ) :
            val1=getattr(self,attr)
            val2=getattr(autreMC,attr)
@@ -132,19 +507,164 @@ class X_definitionComposee (X_definition):
            if not self.entites[defFille].compare(autreMC.entites[defFille]) : return False
        return True
 
+   def prepareDumpXSD(self):
+       #print (' ************************ prepareDumpXSD pour', self.nom)
+       self.inUnion=False
+       self.tousLesFils=[]
+       self.mcXSD=[]
+       for nomMC in self.ordre_mc:
+           mc=self.entites[nomMC]
+           self.mcXSD.append(mc)
+           mc.prepareDumpXSD()
+       self.chercheListesDeBlocsNonDisjointsAvecIndex()
+       for l in list(self.listeDesBlocsNonDisjointsAvecIndex) :
+           #print ('je traite ', l, self.besoinDeFactoriserTrivial(l))
+           if not(self.besoinDeFactoriserTrivial(l)) : self.listeDesBlocsNonDisjointsAvecIndex.remove(l)
+           else : self.factorise(l)
+              #print (self.aUnPremierCommunDansLesPossibles(l))
+           #if self.aUnPremierCommunDansLesPossibles(l) :
+           #     print ('aUnCommunDansLesPossibles --> Factorisation')
+           #else : self.listeDesBlocsNonDisjointsAvecIndex.remove(l)
+           # trouver un cas test
+
+   def chercheListesDeBlocsNonDisjointsAvecIndex(self):
+       self.listeDesBlocsNonDisjointsAvecIndex=[]
+       index=-1
+       for nomChild in self.ordre_mc :
+         child=self.entites[nomChild]
+         index=index+1
+         if child.label != 'BLOC' : continue
+         if self.listeDesBlocsNonDisjointsAvecIndex == [] :
+             self.listeDesBlocsNonDisjointsAvecIndex.append([(child,index),])
+             continue
+         vraimentIndependant=True
+         for liste in list(self.listeDesBlocsNonDisjointsAvecIndex):
+             independant=True
+             for (bloc,indInListe) in liste :
+                 if bloc.isDisjoint(child) : continue
+                 if bloc.estLeMemeQue(child) : continue
+                 independant=False
+                 vraimentIndependant=False
+             if not (independant) :
+                 liste.append((child, index))
+         if vraimentIndependant:
+             self.listeDesBlocsNonDisjointsAvecIndex.append([(child,index),])
+       # on nettoye la liste des blocs tous seuls
+       for l in list(self.listeDesBlocsNonDisjointsAvecIndex) :
+           if len(l) ==1 : self.listeDesBlocsNonDisjointsAvecIndex.remove(l)
+
+   def estLeMemeQue(self,autreMC):
+       if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None: return True
+       return False
+
+   def aUnPremierCommunDansLesPossibles(self, laListe) :
+    # fonctionne avec liste de mc ou une liste(mc,index) 
+       import types
+       mesPremiers=set()
+       for elt,index in laListe :
+           if not type(e) == types.ListType :
+              if elt.nom in mesPremiers : return True
+              mesPremiers.add(elt.nom)
+           else :
+              if elt[0].nom in mesPremiers : return True
+              mesPremiers.add(elt[0].nom)
+       return False
+
+   def besoinDeFactoriserTrivial(self,laListe):
+       besoin=False
+       lesPremiers=set()
+       for mcBloc,indice in laListe  :
+          mc=mcBloc.mcXSD[0]
+          if mc.label == 'BLOC': return True
+          if not(mc.statut=='o') : return True
+          if mc.nom in lesPremiers  : return True
+          lesPremiers.add(mc.nom)
+       return False
+
+   def factorise(self,liste):
+       self.listeConstruction=liste
+       indexDebut=liste[0][1]
+       nomDebut=liste[0][0].nom
+       indexFin=liste[-1][1]+1
+       nomFin=liste[-1][0].nom
+       nom=nomDebut+'_'+nomFin
+       listeAFactoriser=[]
+       for  i in range(indexDebut, indexFin) :
+          listeAFactoriser.append((self.mcXSD[i],i))
+
+       newListe=self.mcXSD[0:indexDebut]
+       #print (newListe, newListe.__class__)
+       #print ('je factorise dans -->', self.nom)
+       monEltFacteur=X_compoFactoriseAmbigu(nom,listeAFactoriser,self)
+       newListe.append(monEltFacteur)
+       newListe=newListe+self.mcXSD[indexFin:]
+       self.mcXSD=newListe
+       #print (self.mcXSD)
+       #for i in self.mcXSD : print (i.nom)
+
+   def construitTousLesFils(self):
+       for nomChild in self.ordre_mc :
+         child=self.entites[nomChild]
+         if child.label != 'BLOC' :
+            self.tousLesFils.append(child.nom)
+         else:
+            if child.tousLesFils == [] : child.construitTousLesFils()
+            for nomPetitFils in child.tousLesFils : self.tousLesFils.append(nomPetitFils)
+       #print ('construitArbreEntier pour ', self.nom, self.tousLesFils)
+
+
+   def isDisjoint(self, mc1) :
+       if self.tousLesFils == [] : self.construitTousLesFils()
+       if not (hasattr(mc1, 'tousLesFils')) : mc1.tousLesFils  = []
+       if mc1.tousLesFils  == []  : mc1.construitTousLesFils()
+       for fils in mc1.tousLesFils :
+           if fils in  self.tousLesFils : return False
+       return True
+
+
+
+
 # ---------------------------------
 class X_FACT (X_definitionComposee):
 #--------- ------------------------
+#Un FACT avec max=** doit se projeter en XSD sous forme d'une sequence a cardinalite 1 et
+# l'element qui porte la repetition du FACT  
    def traduitMinMax(self):
        if self.max     == '**' or self.max  == float('inf') : self.maxOccurs="unbounded"
        else :                                                 self.maxOccurs = self.max
        self.minOccurs = self.min
        if self.statut =='f' : self.minOccurs=0
 
+   def construitArbrePossibles(self):
+       if self.statut   ==  'f' :
+          self.arbrePossibles = (self.nom,[])
+          self.arbreMCPossibles = (self,None)
+       else :
+          self.arbrePossibles = (self.nom,)
+          self.arbreMCPossibles = (self,)
+       #print ('XFACT arbre des possibles de ' ,self.nom, self.arbrePossibles)
+
+
+
 # ---------------------------------
 class X_OPER (X_definitionComposee):
 # ---------------------------------
-    pass
+   def dumpXsd(self, dansFactorisation=False, multiple = False, first=False):
+       X_definitionComposee.dumpXsd(self,dansFactorisation)
+       self.texteComplexe += finTypeCompoSeq
+       self.texteComplexe += operAttributeName
+       self.texteComplexe += attributeTypeForASSD
+       self.texteComplexe += attributeTypeUtilisateurName.format(self.sd_prod.__name__)
+       self.texteComplexe += finTypeCompoEtape
+       self.texteComplexe += finTypeCompo
+
+
+       cata = CONTEXT.getCurrentCata() 
+       if self.sd_prod.__name__ not in list(cata.dictTypesASSDorUserASSDCrees) :
+          cata.dictTypesASSDorUserASSDCrees[self.sd_prod.__name__]=[self,]
+       else :
+          cata.dictTypesASSDorUserASSDCrees[self.sd_prod.__name__].append(self)
+
 
 # ----------------------------------
 class X_PROC (X_definitionComposee):
@@ -154,18 +674,20 @@ class X_PROC (X_definitionComposee):
 #-----------------------------------
 class X_BLOC (X_definitionComposee):
 #-----------------------------------
-   def dumpXsd(self):
-       #print ('------------------------------------------------')
-       #print ('dumpXsd de ' , self.nom)
-       self.getCode()
+   def dumpXsd(self, dansFactorisation=False, multiple = False, first=False):
+       self.tousLesFils=[]
+       
+       self.getNomDuCodeDumpe()
+       # dans ce cas les blocs successifs sont identiques et on ne dumpe que le 1er 
+
        self.nomDuTypePyxb  = self.definitNomDuTypePyxb()
        self.texteSimple    = "" # on n ajoute pas de type simple
 
        # Pour les blocs le minOccurs vaut 0 et le max 1
+       #print ('dumpXsd Bloc', self.nom, self.aCreer)
        if self.aCreer :
           self.texteComplexe = debutTypeSubst.format(self.nomDuTypePyxb)
-          texteComplexeVenantDesFils=self.CreeTexteComplexeVenantDesFils()
+          texteComplexeVenantDesFils=self.CreeTexteComplexeVenantDesFils(dansFactorisation)
           self.texteComplexe  = texteComplexeVenantDesFils + self.texteComplexe
           self.texteComplexe += finTypeSubst
        else :
@@ -177,6 +699,8 @@ class X_BLOC (X_definitionComposee):
 
    def compare(self,autreMC):
        if self.label != autreMC.label : return False
+       if self.inUnion == True or autreMC.inUnion == True : return False
+       if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None : return True
        for attr in ( 'condition', 'regles', ):
            val1=getattr(self,attr)
            val2=getattr(autreMC,attr)
@@ -186,53 +710,168 @@ class X_BLOC (X_definitionComposee):
            if not self.entites[defFille].compare(autreMC.entites[defFille]) : return False
        return True
 
+   def construitArbrePossibles(self):
+       self.arbrePossibles=[[],]
+       #print ('X_BLOC je construis l arbre des possibles pour ', self.nom)
+       for child in self.mcXSD :
+          if not hasattr(child, 'arbrePossibles') : child.construitArbrePossibles()
+          #print (child.nom, child.label, child.arbrePossibles)
+          if child.label == 'BLOC' : 
+              self.arbrePossibles = deepcopy(self.remplaceListeParContenuEtVide(self.arbrePossibles, child.arbrePossibles))
+          elif child.label == 'BlocAmbigu':
+              #print ("je passe par la pour", self.nom, child.nom, self.arbrePossibles, child.arbrePossibles)
+              self.arbrePossibles = deepcopy(self.remplaceListeParContenuEtVide(self.arbrePossibles, child.arbrePossibles))
+              #print ('resultat', self.arbrePossibles)
+          else :
+              self.arbrePossibles = deepcopy(self.adjoint(self.arbrePossibles, child.arbrePossibles))
+       self.arbrePossibles.append([]) # un bloc n est pas obligatoire
+       #print ('arbre des possibles de ' ,self.nom, self.arbrePossibles)
+
 
 #--------------------------------
 class X_SIMP (X_definition):
 #--------------------------------
-   def dumpXsd(self):
+   def dumpXsd(self, dansFactorisation=False, multiple = False, first=False):
+       #print ('_______________' , '*******************', 'je passe la dans dumpXsd SIMP', self.nom, multiple, first)
+       if PourTraduction  : print (self.nom)
+       self.prepareDumpXSD()
+       if multiple : self.inUnion=True
        #print ('exploreObjet SIMP')
-       self.getCode()
+       self.getNomDuCodeDumpe()
        self.aCreer = True
+       self.texteComplexe = ""
+       self.texteSimple   = ""
+       self.texteElt      = ""
+       if self.nom =='Consigne' : return
 
-       #  --> homonymie on peut utiliser genealogie
-       #self.traduitMinMax()
-       #self.traduitValMinValMax()
+       #  --> homonymie on peut utiliser genealogie ?
        self.nomDuTypeDeBase = self.traduitType()
-       self.nomDuTypePyxb   = self.definitNomDuTypePyxb()
-       if self.aCreer == True :
-         if self.into != None:
-           self.texteSimple   =  debutTypeSimpleWithInto.format (self.nomDuTypePyxb, self.nomDuTypeDeBase)
-           for val in self.into :
-               self.texteSimple += typeSimpleWithInto.format(val)
-           self.texteSimple  += finTypeSimpleWithInto
-         else :
-           self.texteSimple     = typeSimple.format(self.nomDuTypePyxb, self.nomDuTypeDeBase)
-       else :
-         # le type existe deja
-         self.texteSimple=""
-       self.texteComplexe   = ""
+       if not multiple : 
+          self.nomDuTypePyxb   = self.definitNomDuTypePyxb()
+          if first : self.aCreer = True
+       elif first :
+          self.nomDuTypePyxb   = self.definitNomDuTypePyxb(forceACreer=1)
+          self.aCreer = True
+       #else : print ('multiple and not first', self.aCreer)
 
-       # on se sert des listes si maxOccurs est > 0
-       # a gerer dans le dump
+    
+       
+       # on se sert des listes ou non pour  la gestion des minOccurs /maxOccurs est > 0
        if self.statut =='f' : minOccurs = 0
-       else :                minOccurs = 1
-       self.texteElt = eltDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1)
+       else                 : minOccurs = 1
+       if dansFactorisation : minOccurs = 1
+
+       #print ('minOccurs',minOccurs)
+       # le defaut est dans l elt Name -> tester la coherence d existence avec Accas
+       # regles Accas
+       if (hasattr (self, 'nomXML')) and self.nomXML != None : nomUtil=self.nomXML
+       else : nomUtil = self.nom
+
+       # pas d elt si on est dans multiple
+       # sauf si on est le '1er'  dans un element ambigu 
+       if not multiple : 
+          #print ('je passe la pas multiple')
+          if self.defaut : 
+             if self.max > 1 or self.max == '**' or self.max ==  float('inf') : 
+                # a revoir pour les tuples avec defaut
+                txtDefaut=""
+                for val in self.defaut : txtDefaut+=str(val) +" "
+                self.texteElt = eltWithDefautDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
+             else :
+                if str(self.defaut) == 'True' : txtDefaut = 'true'
+                else : txtDefaut = str(self.defaut)
+                self.texteElt = eltWithDefautDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
+          else : self.texteElt = eltDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1)
+       elif first: 
+          self.texteElt = eltDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,1,1)
+    
+       # self.aCreer est mis a jour ds definitNomDuTypePyxb
+       # ou si elt est le 1er d une liste identique
+       if not self.aCreer : return
  
+       if not multiple : self.texteSimple  += debutSimpleType.format(self.nomDuTypePyxb)
+       else : self.texteSimple  += debutSimpleTypeSsNom
+       # On est dans une liste
+       if self.max > 1 or self.max == '**' or self.max ==  float('inf') or  hasattr(self.type[0], 'ntuple') : 
+          self.texteSimple  += debutTypeSimpleListe
+          self.texteSimple  += "\t\t\t\t"+debutRestrictionBase.format(self.nomDuTypeDeBase)
+          if self.val_min != float('-inf')  : self.texteSimple += "\t\t\t\t"+minInclusiveBorne.format(self.val_min)
+          if self.val_max != float('inf') and self.val_max != '**' : self.texteSimple +="\t\t\t\t"+ maxInclusiveBorne.format(self.val_max) 
+          if self.into != None:
+             # PN --> traduction des into 
+             into=self.into
+             if self.intoXML != None : into = self.intoXML
+             for val in into : self.texteSimple += "\t\t\t\t"+enumeration.format(val)
+             if PourTraduction  : 
+                for val in into : print (str(val))
+          self.texteSimple  += fermeBalisesMileu
+          if  self.max !=1 and self.max != '**' and self.max !=  float('inf') : self.texteSimple  += maxLengthTypeSimple.format(self.max)
+          if  self.min !=1 and self.min !=  float('-inf') : self.texteSimple  += minLengthTypeSimple.format(self.min) 
+          self.texteSimple  += fermeRestrictionBase
+       else :
+       # ou pas
+         self.texteSimple  += debutRestrictionBase.format(self.nomDuTypeDeBase)
+         if self.val_min != float('-inf')  : self.texteSimple += minInclusiveBorne.format(self.val_min)
+         if self.val_max != float('inf') and self.val_max != '**' : self.texteSimple += maxInclusiveBorne.format(self.val_max) 
+         if self.into != None:
+            into=self.into
+            if self.intoXML != None : into = self.intoXML
+            for val in into : self.texteSimple += enumeration.format(val)
+            if PourTraduction  : 
+                for val in into : print (str(val))
+         self.texteSimple  += fermeRestrictionBase
+       self.texteSimple  += fermeSimpleType
+
+
+   def prepareDumpXSD(self):
+       self.inUnion=False
+       if self.statut   ==  'f' :
+          self.arbrePossibles = (self.nom,[])
+       else :
+          self.arbrePossibles = (self.nom,)
+       self.mcXSD=[]
+
+
 
    def traduitType(self):
        # il faut traduire le min et le max
        # il faut ajouter les regles
        # il faut gerer les types tuple et fichier
+       if hasattr(self.type[0], 'ntuple') : 
+          try :
+             leType=self.validators.typeDesTuples[0]
+             for i in range(self.type[0].ntuple):
+                 if self.validators.typeDesTuples[i] != leType : return ('XXXXXXXX')
+             typeATraduire=leType
+          except : 
+             return ('XXXXXXXX')
+       else : 
+             typeATraduire=self.type[0]
+       if not (typeATraduire in list(dictNomsDesTypes.keys())) :
+          if (isinstance(typeATraduire, Accas.ASSD) or issubclass(typeATraduire, Accas.ASSD)) : 
+             # cas d une creation
+             cata = CONTEXT.getCurrentCata() 
+             if len(self.type) == 2 and self.type[1]=='createObject' : 
+                if typeATraduire.__name__ not in list(cata.dictTypesASSDorUserASSDCrees) :
+                    cata.dictTypesASSDorUserASSDCrees[typeATraduire.__name__]=[self,]
+                else :
+                    cata.dictTypesASSDorUserASSDCrees[typeATraduire.__name__].append(self)
+                return 'xs:string'
 
-       if hasattr(self.type[0], 'label') and self.type[0].label == "Tuple"  : return ('XXXXXXXX')
-       return dictNomsDesTypes[self.type[0]]
+             # cas d une consommation
+             if typeATraduire not in list(cata.dictTypesASSDorUserASSDUtilises) :
+                cata.dictTypesASSDorUserASSDUtilises[typeATraduire]=[self,]
+             else :
+                cata.dictTypesASSDorUserASSDUtilises[typeATraduire].append(self,)
+             return 'xs:string'
+          else : return ('YYYYY')
+       return dictNomsDesTypes[typeATraduire]
   
    def traduitValMinValMax(self):
        self.maxInclusive=self.val_max
        self.minInclusive=self.val_min
        if self.val_min == float('-inf') and val_max== float('inf') : return
-       print ('il faut affiner le type du SIMP ', self.nom)
+       #print ('il faut affiner le type du SIMP ', self.nom)
        if self.val_max == '**' or self.val_max == float('inf') : self.maxInclusive=None
        else : self.maxInclusive = self.val_max
        if self.val_min == '**' or self.val_max == float('-inf') : self.maxInclusive=None
@@ -240,42 +879,226 @@ class X_SIMP (X_definition):
        
    def traduitMinMax(self):
        if self.min == 1 and self.max == 1 :  return
-       print ('il faut creer une liste ' , self.nom)
+       #print ('il faut creer une liste ' , self.nom)
  
    def compare(self,autreMC):
        if self.label != autreMC.label : return False
-       for attr in ( 'type', 'ang', 'fr', 'into', 'intoSug' , 'siValide', 'defaut', 'min' ,'max' ,'homo' ,'position' ,'val_min' , 'val_max' , 'docu' , 'validators' , 'sug' ) :
+       if self.inUnion == True or autreMC.inUnion == True : return False
+       listeAComparer = [ 'type', 'defaut', 'min' ,'max' ,'val_min' , 'val_max' ]
+       if self.intoXML != None : listeAComparer.append('intoXML')
+       else : listeAComparer.append('into')
+       if (hasattr (self, 'nomXML')) and self.nomXML != None : nomUtil=self.nomXML
+       for attr in listeAComparer :
            val1=getattr(self,attr)
            val2=getattr(autreMC,attr)
            if val1 != val2 : return False
        return True
 
+   def construitArbrePossibles(self):
+       if self.statut   ==  'f' :
+          self.arbrePossibles = (self.nom,[])
+       else :
+          self.arbrePossibles = (self.nom,)
+       #print ('SIMP arbre des possibles de ' ,self.nom, self.arbrePossibles)
+
+
 #-----------------
 class X_JDC_CATA :
 #-----------------
 
-    def dumpXsd(self):
-       
+    def dumpXsd(self, avecEltAbstrait,  debug = True):
+        cata = CONTEXT.getCurrentCata() 
+        if debug : print ('avecEltAbstrait   -------------------', avecEltAbstrait)
+
+        if debug : print ('self.importedBy -------------------', self.importedBy)
+        if debug : print ('self.code       -------------------', self.code)
+
         self.texteSimple   = ""
         self.texteComplexe = ""
-        self.nomDuTypePyxb='T_'+self.code
-        self.texteCata = debutTypeCata.format(self.nomDuTypePyxb)
-        for commande in  self.commandes :
-            commande.code=self.code
-            commande.dumpXsd()
-            self.texteSimple += commande.texteSimple
-            self.texteSimple += commande.texteComplexe
-            self.texteCata   += commande.texteElt
-        self.texteCata += finTypeCata
-        self.texteElt=eltCata.format(self.code,self.code, self.nomDuTypePyxb)
-
-        self.texteXSD  = texteDebut.format(self.code,self.code,self.code)
+        self.texteCata     = ""  
+        self.texteDeclaration  = ""
+        self.texteInclusion    = ""
+        self.texteElt          = ""
+        self.texteTypeAbstrait = ""
+
+        if self.implement == "" :
+           self.nomDuCodeDumpe = self.code
+           self.implement      = self.code
+           self.nomDuXsdPere   = self.code
+        else :
+           self.implement,self.nomDuXsdPere=self.implement.split(':')
+           self.nomDuCodeDumpe = self.implement
+
+        if debug : print ('self.implement       -------------------', self.implement)
+        if debug : print ('self.nomDuCodeDumpe   -------------------', self.nomDuCodeDumpe)
+        if debug : print ('self.nomDuXsdPere  -------------------', self.nomDuXsdPere)
+
+        self.nomDuTypePyxb    = 'T_'+self.nomDuCodeDumpe
+        self.dumpLesCommandes()
+
+        if self.implement == self.code :
+           self.texteCata += eltAbstraitCataPPal.format(self.code)
+           self.texteCata += eltCataPPal.format(self.code,self.code,self.code)
+        else :
+           self.texteCata += eltAbstraitCataFils.format(self.implement,self.nomDuXsdPere,self.nomDuXsdPere)
+           self.texteCata += eltCataFils.format(self.implement,self.nomDuXsdPere,self.nomDuXsdPere,self.nomDuXsdPere)
+           self.texteInclusion += includeCata.format(self.nomDuXsdPere)
+
+        self.texteCata += eltCata.format(self.implement,self.implement,self.implement,self.implement,self.nomDuXsdPere)
+        #if self.implement == self.code :
+        #   self.texteCata      += debutTypeCata.format(self.nomDuCodeDumpe)
+        #else :
+        #   self.texteCata      += debutTypeCataExtension.format(self.nomDuCodeDumpe)
+        #   self.texteCata      += debutExtension.format(self.code,self.nomDuCodeDumpe)
+        #   self.texteInclusion += includeCata.format(self.nomDuXsdPere)
+
+
+
+        #for codeHeritant in self.importedBy: 
+        #    self.texteCata += eltCodeSpecDsCata.format(codeHeritant)
+        #    self.texteTypeAbstrait += eltAbstrait.format(codeHeritant,codeHeritant,self.code,codeHeritant)
+
+        #if self.implement != "" : self.texteCata = self.texteCata + finExtension + finTypeCompo
+        #else : self.texteCata  += finTypeCata
+
+        #if self.implement != "" :
+        #   self.texteElt=implementeAbstrait.format(self.nomDuCodeDumpe,self.code,self.nomDuTypePyxb,self.code,self.nomDuCodeDumpe)
+        #else :
+        #   self.texteElt  = eltCata.format(self.nomDuCodeDumpe,self.code, self.nomDuTypePyxb)
+
+        if self.implement == self.code :
+           self.texteXSD  = texteDebut.format(self.code,self.code,self.code,self.code,self.code,self.code)
+        elif self.nomDuXsdPere ==  self.code :
+           self.texteXSD  = texteDebutNiveau2.format(self.code,self.implement,self.code,self.code,self.code, self.code,self.code,self.code,self.code,self.code)
+        else : 
+           self.texteXSD  = texteDebutNiveau3.format(self.code,self.implement,self.code,self.nomDuXsdPere,self.code,self.code,self.code, self.code,self.code,self.code,self.code,self.code)
+
+        if self.texteInclusion != ""   : self.texteXSD += self.texteInclusion
         self.texteXSD += self.texteSimple
+        self.texteXSD += self.texteComplexe
+
+        #if self.texteTypeAbstrait != "" : self.texteXSD += self.texteTypeAbstrait
         self.texteXSD += self.texteCata
-        self.texteXSD += self.texteElt
+        #self.texteXSD += self.texteElt
+       
+        toutesLesKeys=set()
+        texteKeyRef = ""
+        # Pour le nom des key_ref en creation : le type ( une seule key-ref par type. facile a retrouver) 
+        for clef in self.dictTypesASSDorUserASSDCrees:
+            existeASSD=0
+            texteDesFields=""
+            for unOper in self.dictTypesASSDorUserASSDCrees[clef]: 
+                if  not(isinstance(unOper, Accas.OPER)) : continue
+                existeASSD=1
+                texteDesFields+=texteFieldUnitaire.format(self.code, unOper.nom)
+            if existeASSD : texteDesFields=texteDesFields[0:-2]
+            texteDesUserASSD=''
+            existeunUserASSD=0
+            for unSimp in self.dictTypesASSDorUserASSDCrees[clef]: 
+                if not (isinstance(unSimp, Accas.SIMP)) : continue
+                texteDesUserASSD += unSimp.getXPathSansSelf() + " | "
+                #print (unSimp.getXPathSansSelf())
+                #texteFieldUnitaire='/'+self.code+":"+unSimp.nom
+                existeunUserASSD=1
+            if existeunUserASSD:
+               if existeASSD : texteDesFields = texteDesFields + texteDesUserASSD[0:-2] +"/>\n\t\t"
+               else: texteDesFields = texteDesUserASSD[0:-2]
+            print (texteDesUserASSD)
+            print (texteDesFields)
+            if texteDesFields != "" :
+               texteKeyRef  += producingASSDkeyRefDeclaration.format( clef ,texteDesFields) 
+
+
+        # Pour le nom des key-ref en utilisation : la genealogie complete  ( une  key-ref par utilisation et on retrouve facilement la ) 
+        for clef in self.dictTypesASSDorUserASSDUtilises:
+            for unSimp in self.dictTypesASSDorUserASSDUtilises[clef]: 
+               # il faut la genealogie
+               texteKeyRef  += UsingASSDkeyRefDeclaration.format(unSimp.getNomCompletAvecBloc(), unSimp.type[0].__name__,self.code, unSimp.type[0].__name__,unSimp.getXPathComplet() ) 
+
+        #PNPN on debranche les keyref le temps de bien reflechir a leur forme
+        #if texteKeyRef != '' : 
+        #   self.texteXSD = self.texteXSD[0:-3]+'>\n'
+        #   self.texteXSD += texteKeyRef
+        #   self.texteXSD += fermeEltCata 
+
         self.texteXSD += texteFin
-        #print (self.texteSimple)
-        #print (self.texteCata)
-        #print (self.texteElt)
+
+
+
+        #if not PourTraduction : print (self.texteXSD)
+        dico = {}
+        for  k in list(cata.dictTypesXSD.keys()):
+             if len(cata.dictTypesXSD[k]) > 1:
+                index=0
+                dico[k]={}
+                for definition in cata.dictTypesXSD[k] : 
+                    nom=definition.nomComplet()
+                    if index == 0 : dico[k][nom]=k+str(index)
+                    else :          dico[k][nom]=k+str(index)
+                    index=index+1
+  
+        #import pprint
+        #if (not PourTraduction) and  (dico != {}) : pprint.pprint(dico)
+        print ('__________________________ decommenter pour le texteXSD________________________')
         print (self.texteXSD)
+        return self.texteXSD
+
    
+    def dumpLesCommandes(self):
+        cata = CONTEXT.getCurrentCata() 
+        fichierCataSourceExt=os.path.basename(cata.cata.__file__)
+        fichierCataSource, extension=os.path.splitext(fichierCataSourceExt)
+        importCataSource=__import__(fichierCataSource,{},{})
+
+        texte=""
+        for m in sys.modules:
+           monModule=sys.modules[m]
+           try :
+              if m in ('os', 'sys', 'inspect', 'six', 'pickle', 'codecs')      : continue
+              if m in ('cPickle', 'pprint', 'dis', '_sre', 'encodings.aliases'): continue
+              if m in ('numbers', 'optparse', 'binascii', 'posixpath')         : continue
+              if m in ('_locale', '_sysconfigdata_nd', 'gc', 'functools')      : continue
+              if m in ('posixpath', 'types', 'posix', 'prefs')                 : continue
+              if m in ('warnings', 'types', 'posix', 'prefs')                  : continue
+              if monModule.__name__[0:15] == '_sysconfigdata_' : continue
+              if monModule.__name__ == '__future__' :  continue
+              if monModule.__name__[0:3] == 'Ihm'   :  continue
+              if monModule.__name__[0:5] == 'numpy' :  continue
+              if monModule.__name__[0:5] == 'Noyau' :  continue
+              if monModule.__name__[0:5] == 'Accas' :  continue
+              if monModule.__name__[0:7] == 'convert'       :  continue
+              if monModule.__name__[0:7] == 'Efi2Xsd'       :  continue
+              if monModule.__name__[0:7] == 'Editeur'       :  continue
+              if monModule.__name__[0:9] == 'generator'     :  continue
+              if monModule.__name__[0:10] == 'Validation'   :  continue
+              if monModule.__name__[0:10] == 'Extensions'   :  continue
+              if monModule.__name__[0:12] == 'InterfaceQT4' :  continue
+              if monModule.__name__ == fichierCataSource    :  continue
+              texte= texte + "try : import "+ monModule.__name__ + " \n"
+              texte= texte + "except : pass \n"
+              texte= texte + "try : from  "+ monModule.__name__ + ' import * \n'
+              texte= texte + "except : pass \n"
+           except :
+              pass
+
+        newModule=imp.new_module('__main__')
+        exec (texte, newModule.__dict__)
+        allClassToDump=[]
+        for i in dir(importCataSource):
+             if i not in dir(newModule):
+                allClassToDump.append(importCataSource.__dict__[i])
+         
+
+        self.texteSimple = ''
+        self.texteComplexe = ''
+        for c in allClassToDump :
+            if not(isinstance(c, Accas.OPER)) and not(isinstance(c, Accas.PROC))  : continue
+            c.nomDuCodeDumpe=self.nomDuCodeDumpe
+            c.code=self.implement
+            c.dumpXsd()
+            
+            self.texteSimple   += c.texteSimple
+            self.texteComplexe += c.texteComplexe
+            #c.texteElt=eltCompoDsSequenceInExtension.format(c.nom,self.code,c.nomDuTypePyxb)
+            c.texteElt=eltEtape.format(c.nom,self.implement,c.nomDuTypePyxb,self.implement)
+            self.texteCata   += c.texteElt
diff --git a/Efi2Xsd/MCAccasXML.py b/Efi2Xsd/MCAccasXML.py
new file mode 100755 (executable)
index 0000000..9921c1d
--- /dev/null
@@ -0,0 +1,533 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+import sys,os
+import inspect
+import traceback
+def trace():
+  traceback.print_stack()
+#import raw.efficas as efficas
+import types
+
+sys.path.insert(0,os.path.abspath(os.path.join(os.getcwd(),'..')))
+
+try :
+  import pyxb
+  import pyxb.binding
+  import pyxb.binding.basis
+  #import pyxb.utils.utility
+  #import pyxb.utils.domutils
+except : pass
+
+from Accas import A_ASSD
+
+class X_OBJECT:
+# -------------
+
+  def delObjPyxb(self, debug=True):
+      if not self.cata or not self.cata.modeleMetier : return
+      if self.nom == 'Consigne' : return None
+      trouve = False
+      
+      if debug : print ('in delObjPyxb')
+      if debug : print (self.perePyxb.objPyxb.orderedContent())
+      if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
+      
+      elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
+      if debug : print ('element moi = ', elt, 'id de moi = ', id(self.objPyxb), self.objPyxb)
+      if (elt.elementDeclaration.isPlural()):
+        if debug : print ('je suis Plural')
+      #   monIndexInOrderedContent=0
+      #   for c in self.perePyxb.objPyxb.orderedContent(): 
+      #     if isinstance(c._Content__value,list) and  isinstance(c._Content__value[0], type(self.objPyxb)): monIndexInOrderedContent += 1
+      #   listeObjetsAccas=self.parent.getChild(self.nom,restreint='oui')
+      #   if len(listeObjetsAccas) == 1 : monIndex=0
+      #   else : monIndex=listeObjetsAccas.index(self)
+      #   listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
+      #   listeObjetsPyxb.pop(monIndex)
+      #   self.perePyxb.objPyxb.orderedContent().pop(monIndexInOrderedContent)
+        for c in self.perePyxb.objPyxb.orderedContent(): 
+           trouve=False
+           if isinstance(c._Content__value,list) and  isinstance(c._Content__value[0],type(self.objPyxb)):
+              monIndex=c.value.index(self.objPyxb)
+              trouve = True
+           if trouve : break
+        if not trouve : print ("************ pas trouve au delete"); return
+        listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
+        listeObjetsPyxb.pop(monIndex)
+        # si dernier ?
+      else :
+        newOrderedContent = []
+        for i in self.perePyxb.objPyxb.orderedContent(): 
+            if id(self.objPyxb) == id(i._Content__value) : trouve = True ;continue
+            newOrderedContent.append(i)
+        if not trouve : print ('elt a supprimer ', self.nom, 'non trouve')
+        for i in range(len(newOrderedContent)):
+          self.perePyxb.objPyxb.orderedContent()[i]=newOrderedContent[i]
+        self.perePyxb.objPyxb.orderedContent().pop(len(newOrderedContent))
+
+        setattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key,None)
+        if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
+
+      
+
+  def addObjPyxb(self,indiceDsLeContenu,debug=False):
+      if not self.cata or not self.cata.modeleMetier : return
+      if debug :print ('_____________ addObjPyxb ds X_OBJECT', self.nom, indiceDsLeContenu)
+      # adherence Accas sur le parent
+      parent=self.parent
+      while (parent.isBLOC()): 
+           if parent != self.parent : indiceDsLeContenu += parent.rangDsPyxb()
+           parent=parent.parent
+      self.perePyxb=parent
+
+      if debug :print ('indiceDsLeConten',indiceDsLeContenu) 
+      if debug :print (pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
+
+      #if self.objPyxb ! = None : self.objPyxb.objAccas=self
+      elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
+      self.perePyxb.objPyxb.orderedContent().insert(indiceDsLeContenu,elt)
+      if (elt.elementDeclaration.isPlural()):
+      # je suis donc un MCList
+         listeObjetsAccas=self.parent.getChild(self.nom,restreint='oui')
+         if len(listeObjetsAccas) == 1 : monIndex=1
+         else : monIndex=listeObjetsAccas.index(self)
+         listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
+         listeObjetsPyxb.insert(monIndex,self.objPyxb)
+      else :
+         setattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key,self.objPyxb)
+      if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
+      print ('fin _____________ addObjPyxb ds X_OBJECT', self.nom, indiceDsLeContenu)
+
+  def rangDsPyxb(self):
+      monRangEnAccas=self.parent.mcListe.index(self)
+      rangEnPyxb=0
+      for frere in self.parent.mcListe[0: monRangEnAccas] :
+          rangEnPyxb += frere.longueurDsArbre()
+      return rangEnPyxb
+      
+
+class X_MCSIMP(X_OBJECT):
+# -----------------------
+      
+   def buildObjPyxb(self, debug=False) :
+      if not self.cata or not self.cata.modeleMetier : return
+      if self.nom == 'Consigne' : return None
+      if debug : print ('X_MCSIMP buildObjPyxb', self.nom, self,self.valeur)
+      if debug and self.objPyxbDeConstruction == None : print (self.nom, ' pas de pyxb')
+      elif debug : print ('objPyxbDeConstruction', self.objPyxbDeConstruction)
+
+      if self.objPyxbDeConstruction != None :
+        self.objPyxb = self.objPyxbDeConstruction
+        #self.objPyxb.objAccas=self
+        self.maClasseModeleMetier =type(self.objPyxb)
+        self.objPyxbDeConstruction = None
+        if issubclass(self.maClasseModeleMetier, self.cata.modeleMetier.pyxb.binding.basis.STD_union): 
+              self.needFactory=True
+              self.maClasseModeleMetierFactory=getattr(self.maClasseModeleMetier,'Factory')
+        else : self.needFactory=False
+      else :
+        self.monNomClasseModeleMetier='T_'+self.nom
+        if self.nom in list(self.cata.DicoNomTypeDifferentNomElt.keys()) : 
+           self.monNomClasseModeleMetier=self.cata.DicoNomTypeDifferentNomElt[self.nom][self.nomComplet()]
+        self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
+        if issubclass(self.maClasseModeleMetier, self.cata.modeleMetier.pyxb.binding.basis.STD_union): 
+              if debug : print ('needFactory')
+              self.needFactory=True
+              self.maClasseModeleMetierFactory=getattr(self.maClasseModeleMetier,'Factory')
+        else : self.needFactory=False
+           
+        if self.valeur != None : 
+           if self.needFactory :  self.objPyxb=self.maClasseModeleMetierFactory(self.valeur)
+           else                :  self.objPyxb=self.maClasseModeleMetier(self.valeur)
+        else                   :  
+           if self.needFactory : self.objPyxb=None
+           else                : self.objPyxb=self.maClasseModeleMetier(_validate_constraints=False)
+
+
+        # c est la que le bat blesse
+        #if self.objPyxb !=None : self.objPyxb.objAccas=self
+      #if debug : print ('X_MCSIMP', self.nom, self.objPyxb, )
+      if debug : print ('fin X_MCSIMP', self.objPyxb, self.nom, self, self.maClasseModeleMetier,self.valeur)
+
+
+   def setValeurObjPyxb(self,newVal, debug=True):
+       if not self.cata or not self.cata.modeleMetier : return
+       if debug : print (' ___________________________ dans setValeurObjPyxb MCSIMP ', self.nom, newVal)
+       if debug : print (' self.perePyxb = ', self.perePyxb.nom)
+       if inspect.isclass(newVal) and issubclass(newVal,A_ASSD)  : newVal = newVal.nom
+       if debug : print (self.nom , ' a pour pere', self.perePyxb, self.perePyxb.nom, self.perePyxb.objPyxb)
+       
+       #if newVal != None : nvlObj=self.maClasseModeleMetier(newVal)
+       if newVal != None : 
+           if self.needFactory : nvlObj=self.maClasseModeleMetierFactory(newVal)
+           else                : nvlObj=self.maClasseModeleMetier(newVal)
+       else                   : 
+           if self.needFactory : nvlObj =None
+           else                : nvlObj=self.maClasseModeleMetier(_validate_constraints=False)
+       self.val=newVal
+
+       setattr(self.perePyxb.objPyxb,self.nom,nvlObj)
+       trouve=False
+       indice=0
+       for i in self.perePyxb.objPyxb.orderedContent(): 
+           if isinstance(i._Content__value, self.maClasseModeleMetier) : 
+              self.perePyxb.objPyxb.orderedContent()[indice]=self.perePyxb.objPyxb.orderedContent()[-1]
+              del(self.perePyxb.objPyxb.orderedContent()[-1])
+              trouve=True
+              break
+           indice+=1
+       if not trouve : print ('Attention souci au changement de valeur de ', self.nom)
+       self.objPyxb=nvlObj
+       #self.objPyxb.objAccas=self
+       if debug : print ('fin du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
+
+        
+      
+
+class X_MCCOMPO(X_OBJECT) :
+# -------------------------
+# 
+   def buildObjPyxb(self,mc_list, debug=True) :
+      if not self.cata or not self.cata.modeleMetier : return
+      print ('X_MCCOMPO', self.nom)
+      self.listArg=[]
+      self.dicoArg={}
+      for objAccas in mc_list :
+        if objAccas.nature == 'MCBLOC' :
+           self.exploreBLOC(objAccas)
+        elif objAccas.nature == 'MCList' :
+           if objAccas[0].definition.max > 1 :
+              self.listArg.append(objAccas) # les MCList n ont pas objPyxb
+              self.dicoArg[objAccas.nom]=[]
+              for fils in objAccas : 
+                  fils.perePyxb=self
+                  self.dicoArg[objAccas.nom].append(fils.objPyxb)
+           else : 
+               objAccas[0].perePyxb=self
+               self.dicoArg[objAccas.nom]=objAccas[0].objPyxb
+               self.listArg.append(objAccas[0].objPyxb)
+        else :
+           if objAccas.nom == 'Consigne'     : continue 
+           self.listArg.append(objAccas.objPyxb)
+           self.dicoArg[objAccas.nom]=objAccas.objPyxb
+           objAccas.perePyxb=self
+
+      if debug : print('X_MCCOMPO -- listArg ---',self.nom,self.listArg)
+      if debug : print('X_MCCOMPO -- dicoArg ---',self.nom,self.dicoArg)
+        
+      self.monNomClasseModeleMetier='T_'+self.nom
+      if self.nom in list(self.cata.DicoNomTypeDifferentNomElt.keys()) : 
+         self.monNomClasseModeleMetier=self.cata.DicoNomTypeDifferentNomElt[self.nom][self.nomComplet()]
+      self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
+      
+      # PN : Ne doit-on pas tester avant
+      if self.objPyxbDeConstruction != None :
+        self.objPyxb = self.objPyxbDeConstruction
+        self.objPyxbDeConstruction = None
+        if debug : print ('je passe dans le if pour ', self.nom, self.objPyxb, self)
+        if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb,self.listArg,self.objPyxb.orderedContent())
+      else :
+        if debug : print (self.nom)
+        if debug : print (self.listArg)
+        # self.objPyxb=self.maClasseModeleMetier(*self.listArg)
+        self.objPyxb=self.maClasseModeleMetier(**self.dicoArg)
+        newOrderedContent=[]
+        for obj in self.listArg:
+           # on teste le caractere pluriel
+           if (hasattr(obj, 'nature')) : # attention on a un object Accas et non un pyxb car les MCList n ont pas de objPyxb
+               max=obj[0].definition.max 
+           else : max = 1
+           if  max == 1 :
+            if not(issubclass(type(obj), pyxb.binding.basis.enumeration_mixin) ):
+               newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:id(o.value), self.objPyxb.orderedContent())).index(id(obj))] )
+            else :
+               newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:type(o.value), self.objPyxb.orderedContent())).index(type(obj))] )
+           else  : # element Pural
+            for c in self.objPyxb.orderedContent() :
+               if isinstance(c._Content__value,list) and  isinstance(c._Content__value[0], type(obj[0].objPyxb)): newOrderedContent.append(c)
+
+        for i in range(len(self.listArg)):
+          self.objPyxb.orderedContent()[i]=newOrderedContent[i]
+        if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb,self.listArg,newOrderedContent,self.objPyxb.orderedContent())
+      #self.objPyxb.objAccas=self
+      if debug : print ('fin buildObjetPyxb _______________________________________')
+      # assert(self.objPyxb.validateBinding())
+
+
+   def exploreBLOC(self,objAccas):
+      print (' ds exploreBLOC', objAccas .nom)
+      laListeSsLesBlocs=[]
+      for fils in objAccas.mcListe:
+        if fils.nature == 'MCBLOC' :
+           self.exploreBLOC(fils)
+        elif fils.nature == 'MCList' :
+           #print ('exploreBLOC des MCList', fils.nom)
+           self.dicoArg[fils.nom]=[]
+           if fils[0].definition.max > 1 :
+              #print ('ajout de ', fils)
+              self.listArg.append(fils) # les MCList n ont pas objPyxb
+              for objFils in fils : 
+                  objFils.perePyxb=self
+                  self.dicoArg[fils.nom].append(objFils.objPyxb)
+           else:
+             fils[0].perePyxb=self
+             self.dicoArg[fils.nom]=fils[0].objPyxb
+             self.listArg.append(fils[0].objPyxb)
+        else :
+           if fils.nom == "Consigne" : continue
+           #print ('ajout de 2', fils.objPyxb)
+           self.listArg.append(fils.objPyxb)
+           self.dicoArg[fils.nom]=fils.objPyxb
+           fils.perePyxb=self
+           print (fils.nom ,' est un SIMP a pour pere Pyxb', self, self.nom)
+          
+   
+
+  
+class X_MCBLOC (X_MCCOMPO):
+# --------------------------
+   def buildObjPyxb(self,mc_list,debug=False):
+      if not self.cata or not self.cata.modeleMetier : return
+      if debug : print ('X_MCBLOC buildObjPyxb', self.nom, self, mc_list, 'ne fait rien')
+      self.perePyxb=None
+      self.objPyxb=None
+        
+   def addObjPyxb(self, indiceDsLeContenu, debug=False):
+      if not self.cata or not self.cata.modeleMetier : return
+      if debug : print ('X_MCBLOC addObjPyxb', self.nom, self, self.mcListe, indiceDsLeContenu)
+      rangDeLObjet=indiceDsLeContenu
+      for obj in self.mcListe:
+          obj.addObjPyxb( rangDeLObjet)
+          rangDeLObjet=rangDeLObjet+obj.longueurDsArbre()
+       
+   def delObjPyxb(self, debug=False):
+      if not self.cata or not self.cata.modeleMetier : return
+      if debug : print ('X_MCBLOC delObjPyxb', self.nom, ' --------------------------')
+      for obj in self.mcListe:
+          obj.delObjPyxb()
+      if debug : print ('fin X_MCBLOC delObjPyxb --------------------------')
+
+class X_MCLIST (X_MCCOMPO):
+# --------------------------
+  def buildObjPyxb(self,mc_list, debug=False):
+      if debug : print ('X_MCLIST buildObjPyxb ne fait rien', self.nom, self, mc_list)
+      pass
+    
+  def addObjPyxb(self,indiceDsLeContenu, debug=False):
+      if debug : print ('X_MCLIST addObjPyxb', self.nom, indiceDsLeContenu)
+      rangDeLObjet=indiceDsLeContenu
+      for objFils in self :
+          objFils.addObjPyxb(rangDeLObjet)
+          rangDeLObjet= rangDeLObjet + 1
+
+  def delObjPyxb(self, debug=False):
+      if not self.cata or not self.cata.modeleMetier : return
+      if debug : print ('X_MCLIST delObjPyxb', self.nom, ' --------------------------')
+      for obj in self:
+          obj.delObjPyxb()
+      if debug : print ('fin X_MCLIST delObjPyxb --------------------------')
+
+
+class X_MCFACT (X_MCCOMPO):
+# -------------------------
+  pass
+
+class X_ETAPE(X_MCCOMPO) :
+# -------------------------
+
+   def metAJourNomASSD(self, nom,debug=False):
+      if not self.cata or not self.cata.modeleMetier : return
+      if debug : print ('X_ETAPE metAJourLesAttributs', self.nom, nom,' --------------------------')
+      self.objPyxb.name=nom
+
+class X_JDC (X_MCCOMPO):
+# ---------------------
+   def  __init__(self):
+      self.perePyxb=None
+      if not self.cata or not self.cata.modeleMetier : return
+      #if hasattr(self.cata,'DicoNomTypeDifferentNomElt') : print ('jkllllllllllllllll')
+      if not(hasattr(self.cata,'DicoNomTypeDifferentNomElt')) : self.cata.DicoNomTypeDifferentNomElt={}
+      self.monNomClasseModeleMetier=self.code
+      self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
+      self.objPyxb=self.maClasseModeleMetier()
+      #self.objPyxb.objAccas=self
+      pyxb.GlobalValidationConfig._setContentInfluencesGeneration(pyxb.GlobalValidationConfig.NEVER)
+      pyxb.GlobalValidationConfig._setInvalidElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION)
+      pyxb.GlobalValidationConfig._setOrphanElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION)
+      
+      
+
+   def enregistreEtapePyxb(self,etape,indice=0):
+     # ne fonctionne pas : a reecrire avec les fonctions addObjPyxb et ReconstruitPerePyxb
+     # ne contient pas indice pour l insant
+      #print ( 'hhhhhhhhhhhhhhh enregistreEtapePyxb hhhhhhhhhhhhhhhhhhhhhhhhh')
+      #print ('enregistre ds ',self, etape.nom, 'indice = ', indice)
+      if not self.cata.modeleMetier : return
+      self.objPyxb.append(etape.objPyxb)
+      etape.perePyxb = self
+
+      #print (self.objPyxb.orderedContent())
+      #if indice   != (len(self.objPyxb.orderedContent()) ) : 
+      #  tampon=self.objPyxb.orderedContent()[-1]
+      #  for i in reversed(range(len(self.objPyxb.orderedContent()))):
+      #    self.objPyxb.orderedContent()[i]=self.objPyxb.orderedContent()[i-1]
+      #    if i == indice + 1 : break
+      #  self.objPyxb.orderedContent()[indice]=tampon
+
+      #print (self.objPyxb.orderedContent())
+      #try:
+      #   self.objPyxb.validateBinding()
+      #except pyxb.ValidationError as e:
+      #   print(e.details())
+
+   def toXml(self,fichier=None):
+      print ('ds to XML')
+      if not self.cata or not self.cata.modeleMetier : return
+      print (' to xml ***************',self.objPyxb,'***************',)
+      print (' to xml ***************',self,'***************',)
+      print (' to xml ***************',self.objPyxb.orderedContent(),'***************',)
+      print(self.objPyxb.toDOM().toprettyxml())
+      print(self.objPyxb.toxml())
+      return (self.objPyxb.toDOM().toprettyxml())
+        
+
+   def analyseFromXML(self):
+      print ("je suis ds analyseFromXML -- > appel ds analyseXML de I_JDC.py")
+      print (self.procedure)
+      if self.procedure == "" : return
+      self.objPyxb=self.cata.modeleMetier.CreateFromDocument(self.procedure)
+      for contentObjEtape in self.objPyxb.orderedContent():
+          objEtape=contentObjEtape.value
+          objEtape.dictArgs=(self.pyxbToDict(objEtape))
+          objEtape.monNomClasseAccas=objEtape._ExpandedName.localName()
+          objEtape.monNomClasseAccas=objEtape.monNomClasseAccas[2:]
+          # doute sur les 2 lignes suivantes : objEtape peut etre contentObjEtape 2juin20
+          objEtape.dictPyxb['objEnPyxb']=objEtape
+          objEtape.dictArgs['dicoPyxbDeConstruction']=objEtape.dictPyxb
+          print ('dicoPyxbDeConstruction', objEtape.dictArgs['dicoPyxbDeConstruction'])
+          maClasseAccas=getattr(self.cata,objEtape.monNomClasseAccas)
+          print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
+          print (maClasseAccas)
+          print (objEtape , type(objEtape))
+          print (objEtape.dictPyxb)
+          print (objEtape.monNomClasseAccas, type(objEtape.monNomClasseAccas))
+          print (objEtape._ExpandedName, type(objEtape._ExpandedName))
+          print ('dictArgs',objEtape.dictArgs)
+          print ('dictPyxb',objEtape.dictPyxb)
+          objAccasEtape=maClasseAccas(**(objEtape.dictArgs))
+          print (objAccasEtape)
+          print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
+          print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
+          print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
+          print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
+      
+
+   def pyxbToDict(self,objAAnalyser):
+    # la transformation de l objAAnalyser en type lu par eficas ne fonctionne pas pour tout
+    # faudrait - il travailler sur les types des objets ?
+    # c est a revoir -> fonction cast a prevoir ds les 2 sens
+    if objAAnalyser is None: return
+    print ('debut pour_____________________________ ',objAAnalyser)
+    dictArgs = {}
+    # traitement SIMP
+    # ---------------
+    if isinstance(objAAnalyser, pyxb.binding.basis.simpleTypeDefinition): 
+       #print ('je suis un MCSimple')
+    # il faut traiter les UserASSD
+       # traitement scalaire
+       objAAnalyser.dictPyxb=objAAnalyser
+       if not (isinstance(objAAnalyser,pyxb.binding.basis.STD_list)):
+          #print ('je suis un scalaire')
+          #try :  # python 3
+          if isinstance(objAAnalyser, str)  : return str(objAAnalyser)
+          if isinstance(objAAnalyser, int)  : return int(objAAnalyser)
+          if isinstance(objAAnalyser, float): return float(objAAnalyser)
+          if isinstance(objAAnalyser, pyxb.binding.basis.enumeration_mixin):    return str(objAAnalyser)
+          #except : # python 2
+          #if isinstance(objAAnalyser, types.StringTypes):  return str(objAAnalyser)
+          #if isinstance(objAAnalyser, types.FloatType):  return float(objAAnalyser)
+          #if isinstance(objAAnalyser, (types.IntType, types.LongType)):  return int(objAAnalyser)
+          #print ('________ fin pour ', objAAnalyser, 'retour', repr(objAAnalyser))
+          return objAAnalyser
+       else :
+          #print ('je suis une liste')
+          laListe=[]
+          for obj in objAAnalyser :
+              if isinstance(obj, str): laListe.append (str(obj))
+              elif isinstance(obj, int): laListe.append (int(obj))
+              elif isinstance(obj, float): laListe.append (float(obj))
+              elif isinstance(obj, pyxb.binding.basis.enumeration_mixin): laListe.append(str(obj))
+              else :  laListe.append(obj)
+          return (laListe)
+       #  if debug : print ('je suis Plural')
+       # ou ? return objAAnalyser
+       #if isinstance(objAAnalyser, types.StringTypes): return pyxb.utils.utility.QuotedEscaped(objAAnalyser,)
+       #pour une enum getattr(value dans le type)
+       # return pythonLiteral(ReferenceFacet(facet=value, **kw))
+    #print ('je suis un mot complexe')
+    # traitement FACT ou BLOC
+    # ------------------------
+    # il faut traiter les fact multiples
+    objAAnalyser.dictPyxb = {} 
+    objAAnalyser.dictPyxb['objEnPyxb']=objAAnalyser
+    #for expandedName, elementDeclaration in objAAnalyser._ElementMap.items():
+    #    objPyxbName  = expandedName.localName()
+    #    objPyxbValue = getattr(objAAnalyser, objPyxbName)
+    for objEltContentFils in objAAnalyser.orderedContent():
+        objPyxbValue = objEltContentFils.value
+        objPyxbName  = objEltContentFils.elementDeclaration.id()
+        elementDeclaration = objEltContentFils.elementDeclaration
+        #if objPyxbValue == None or objPyxbValue == [] : continue
+        if elementDeclaration.isPlural():
+            if objPyxbName not in list(dictArgs.keys()) : dictArgs[objPyxbName]=[] 
+            if objPyxbName not in list(objAAnalyser.dictPyxb.keys()) : objAAnalyser.dictPyxb[objPyxbName]=[] 
+            dictArgs[objPyxbName].append(self.pyxbToDict(objPyxbValue))
+            objAAnalyser.dictPyxb[objPyxbName].append(objPyxbValue.dictPyxb)
+        else:
+             dictArgs[objPyxbName] = self.pyxbToDict(getattr(objAAnalyser, objPyxbName))
+             objAAnalyser.dictPyxb[objPyxbName] = objPyxbValue.dictPyxb
+            # print ('ajout dans dictPyxb', objPyxbName, objPyxbValue.dictPyxb)
+            #print ('avec la valeur', 'de',  objAAnalyser.dictPyxb[objPyxbName])
+       
+    #print ("***********************************")
+    #print ('pyxbToDict  fin pour ********** ', objAAnalyser)
+    #print ('pyxbToDict ', objAAnalyser, objAAnalyser.dictPyxb)
+    #print ('pyxbToDict  fin pour ********** ', objAAnalyser)
+    #print ("***********************************")
+    #print (dictArgs)
+    #print (dictPyxb)
+    #for i in dictArgs.keys(): print (i, " ", dictArgs[i], " ", type(dictArgs[i]))
+    #print ('fin pour ',objAAnalyser)
+    return dictArgs
+
+   
+#   def analyseContent(self,objAAnalyser):
+#       objAAnalyser.dictArgs={}
+#       for objContenu in objAAnalyser.content():
+#          #print ('j analyse ', objContenu)
+#          objContenu.monNomClasseModeleMetier=str(objContenu.__class__).split('.')[-1]
+#          objContenu.monNomClasseAccas=objContenu.monNomClasseModeleMetier[2:-2]
+#          #maClasseAccas=classeAccasPere.entites[objContenu.monNomClasseAccas]
+#          if objContenu._IsSimpleTypeContent():
+#             print (objContenu.monNomClasseAccas,objContenu.pythonLiteral())
+#             print (objContenu.monNomClasseAccas,objContenu.xsdLiteral())
+#             #chaine=objContenu.pythonLiteral().split('(')[1].split(')')[0]
+#             print (dir(objContenu))
+#             objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=None
+#             #objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=objContenu.pythonLiteral()
+#          else :
+#             self.analyseContent(objContenu)
+#             objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=objContenu.dictArgs
+       #print ( '________________')
+       #print (objAAnalyser.monNomClasseAccas)
+       #for i in objAAnalyser.dictArgs : print (i, objAAnalyser.dictArgs[i])
+       #print ( '________________')
+        
+  
+
+if __name__ == "__main__":
+   print ('a faire')
diff --git a/Efi2Xsd/balisesXSD.py b/Efi2Xsd/balisesXSD.py
new file mode 100644 (file)
index 0000000..ffff487
--- /dev/null
@@ -0,0 +1,100 @@
+texteDebut='<?xml version="1.0" encoding="UTF-8"?>\n<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"\nxmlns="http://chercheurs.edf.com/logiciels/{}"\nxmlns:{}="http://chercheurs.edf.com/logiciels/{}"\ntargetNamespace="http://chercheurs.edf.com/logiciels/{}"\nelementFormDefault="qualified" attributeFormDefault="unqualified" version="0">\n'
+texteDebutNiveau2='<?xml version="1.0" encoding="UTF-8"?>\n<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"\nxmlns="http://chercheurs.edf.com/logiciels/{}"\nxmlns:{}="http://chercheurs.edf.com/logiciels/{}"\nxmlns:{}="http://chercheurs.edf.com/logiciels/{}"\ntargetNamespace="http://chercheurs.edf.com/logiciels/{}"\nelementFormDefault="qualified" attributeFormDefault="unqualified" version="0">\n'
+texteDebutNiveau3='<?xml version="1.0" encoding="UTF-8"?>\n<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"\nxmlns="http://chercheurs.edf.com/logiciels/{}"\nxmlns:{}="http://chercheurs.edf.com/logiciels/{}"\nxmlns:{}="http://chercheurs.edf.com/logiciels/{}"\nxmlns:{}="http://chercheurs.edf.com/logiciels/{}"\ntargetNamespace="http://chercheurs.edf.com/logiciels/{}"\nelementFormDefault="qualified" attributeFormDefault="unqualified" version="0">\n'
+texteFin='</xs:schema>'
+
+# SIMP
+debutSimpleType      = '\t<xs:simpleType name="{}">\n'
+debutSimpleTypeSsNom = '\t<xs:simpleType>\n'
+fermeSimpleType      = '\t</xs:simpleType>\n'
+debutRestrictionBase = '\t\t<xs:restriction base="{}">\n'
+fermeRestrictionBase = '\t\t</xs:restriction>\n'
+enumeration          = '\t\t\t<xs:enumeration value="{}"/>\n'
+maxInclusiveBorne    = '\t\t\t<xs:maxInclusive value = "{}"/>\n'
+minInclusiveBorne    = '\t\t\t<xs:minInclusive value = "{}"/>\n'
+
+debutTypeSimpleListe = '\t\t<xs:restriction>\n\t\t\t<xs:simpleType>\n\t\t\t\t<xs:list>\n\t\t\t\t\t<xs:simpleType>\n'
+finTypeSimpleListe   = '\t\t</xs:restriction>\n\t\t\t</xs:simpleType>\n\t\t\t\t</xs:list>\n\t\t\t\t\t</xs:simpleType>\n'
+fermeBalisesMileu   = '\t\t\t\t\t\t</xs:restriction>\n\t\t\t\t\t</xs:simpleType>\n\t\t\t\t</xs:list>\n\t\t\t </xs:simpleType>\n'
+
+maxLengthTypeSimple = '\t\t\t<xs:maxLength value = "{}"/>\n'
+minLengthTypeSimple = '\t\t\t<xs:minLength value = "{}"/>\n'
+eltDsSequence       = '\t\t\t<xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}"/>\n'
+eltWithDefautDsSequence    = '\t\t\t<xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}" default="{}"/>\n'
+UsingASSDkeyRefDeclaration = '\n\t<xs:keyref name="{}_Name_ref_a{}" refer="{}:Key_Name_For_{}"> \n\t\t<xs:selector xpath="{}"/>\n\t\t<xs:field xpath="."/>\n\t</xs:keyref>\n'
+#    <xs:key name="Key_Name_For_ElementarySurface">
+#            <xs:selector xpath="./Vimmp:CDM/Vimmp:Geometric_Domain/Vimmp:Surface"/>
+#            <xs:field    xpath="./Vimmp:SurfaceName"/>
+#        </xs:key>
+
+     #<xs:keyref name="MyField_Ref_A_CreateMesh" refer="Test1:Key_Name_In_ReadMesh_CreateMesh">
+     #<xs:selector xpath="./Test1:MyField/Test1:onMesh"/>
+
+
+
+
+# COMPO
+debutTypeCompo      = '\t<xs:complexType name="{}" >\n'
+debutTypeCompoEtape = '\t <xs:complexContent>\n\t  <xs:extension base="T_step_{}">\n'
+finTypeCompoEtape   = '\t  </xs:extension>\n\t </xs:complexContent>\n'
+debutTypeCompoSeq   = '\t\t<xs:sequence>\n'
+finTypeCompoSeq     = '\t\t</xs:sequence>\n'
+finTypeCompo        = '\t</xs:complexType>\n'
+eltCompoDsSequence  = '\t\t\t<xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}"/>\n'
+#eltCompoDsSequenceInExtension = '\t\t\t<xs:element name="{}" type="{}:{}"/>\n'
+
+# ETAPE 
+eltEtape = '\t<xs:element name="{}" type="{}:{}" substitutionGroup="step_{}"/>\n'
+
+# BLOC
+debutTypeSubst    = '\t<xs:group name="{}">   \n\t\t<xs:sequence>\n'
+finTypeSubst      = '\t\t</xs:sequence>\n\t</xs:group>\n'
+substDsSequence   = '\t\t\t<xs:group ref="{}:{}"  minOccurs="{}" maxOccurs="{}"/>\n'
+#choiceDsBloc     = '\t\t\t<xs:choice minOccurs={}>\n'
+debutChoiceDsBloc = '<xs:choice>\n'
+debutChoiceDsBlocAvecMin = '<xs:choice minOccurs="{}">\n'
+finChoiceDsBloc   = '</xs:choice>\n'
+debSequenceDsBloc = '<xs:sequence>\n'
+finSequenceDsBloc = '</xs:sequence>\n'
+debutTypeSubstDsBlocFactorise = '\t<xs:group name="{}">\n'
+finTypeSubstDsBlocFactorise   = '\t</xs:group>\n'
+debutUnion        = '\t\t\t<xs:union>\n'
+finUnion          = '\t\t\t</xs:union>\n'
+
+
+
+# User OR ASSD
+operAttributeName    = '\t\t<xs:attribute name="name" type="xs:string"/>\n'
+attributeTypeForASSD = '\t\t<xs:attribute name="accasType" type="xs:string" fixed="ASSD"/>\n'
+attributeTypeUtilisateurName = '\t\t<xs:attribute name="typeUtilisateur" type="xs:string" fixed="{}"/>\n'
+producingASSDkeyRefDeclaration='\t<xs:key name="Key_Name_For_{}">\n\t\t<xs:selector xpath="."/>\n\t\t<xs:field xpath="{}"/>\n\t</xs:key>\n'
+texteFieldUnitaire="./{}:{}/@name |"
+
+# CATA
+debutTypeCata     = '\t<xs:complexType name="T_{}">\n\t\t<xs:choice minOccurs="0" maxOccurs="unbounded">\n'
+debutTypeCataExtension = '\t<xs:complexType name="T_{}">\n'
+finTypeCata       = '\t\t</xs:choice>\n\t</xs:complexType>\n'
+finSchema         = '</xs:schema>'
+#eltCata           = '\t<xs:element name="{}" type="{}:{}"/>\n'
+#eltCodeSpecDsCata = '\t\t\t<xs:element ref="{}_Abstract" minOccurs="0" maxOccurs="1"/>\n'
+#fermeEltCata      = '\t</xs:element>\n'
+includeCata       = '<xs:include schemaLocation="cata_{}.xsd" />\n\n'
+
+
+# EXTENSION
+debutExtension = '\t\t<xs:complexContent>\n\t\t<xs:extension base="{}:T_{}_Abstract">\n\t\t<xs:choice minOccurs="0" maxOccurs="unbounded">\n'
+finExtension  = '\t\t</xs:choice>\n\t\t</xs:extension>\n\t\t</xs:complexContent>\n'
+
+# TYPE ABSTRAIT
+eltAbstraitCataPPal  = '\t<xs:complexType name="T_step_{}" abstract="true"/>\n'
+eltAbstraitCataFils  = '\t<xs:complexType name="T_step_{}" abstract="true">\n\t\t<xs:complexContent>\n\t\t\t<xs:extension base="{}:T_step_{}"/>\n\t\t</xs:complexContent>\n\t</xs:complexType>\n'
+eltCataPPal = '\t<xs:element name="step_{}" type="{}:T_step_{}"/>\n'
+eltCataFils = '\t<xs:element name="step_{}" type="{}:T_step_{}" substitutionGroup="step_{}"/>\n'
+eltCata = '\t<xs:element name="{}" type="{}:T_{}"/>\n\t\t<xs:complexType name="T_{}">\n\t\t  <xs:choice minOccurs="0" maxOccurs="unbounded">\n\t\t\t<xs:element ref="step_{}" minOccurs="0" maxOccurs="1"/>\n\t\t  </xs:choice>\n\t\t</xs:complexType>\n'
+
+#\n\t<xs:element name="{}_Abstract" type="{}:T_{}_Abstract"/>\n'
+#implementeAbstrait  = '\t<xs:element name="{}" type="{}:{}" substitutionGroup="{}:{}_Abstract"/>\n'
+
+if __name__ == '__main__' :
+    print ('ne fait rien')
+
index d90cbc128a658588a9551e494f315c07662ea126..4667b08bf1b4445014e8905cc96941d7d1b5f773 100755 (executable)
@@ -77,11 +77,6 @@ dictPROCEficasXML =  { 'nom'        : 'nom',
                        'fr'         : ('doc','fr',),
                        'docu'       : ('doc','docu'),
                       }
-     #                  'UIinfo' : 'UIinfo'
-     #                  'reentrant'
-     #                  'repetable'
-     #                  'op_init'
-     #                  'fenetreIhm' : 'fenetreIhm'
 
 dictPROCXMLEficas = inverseDico(dictPROCEficasXML)
 
@@ -89,7 +84,7 @@ dictOPEREficasXML = dictPROCEficasXML
 dictOPERXMLEficas = dictPROCXMLEficas
 
 dictPourCast                = { 'I' : int, 'R' : float, 'bool' : bool ,   }
-dictNomsDesTypes = { 'I' : 'int', 'R' : 'float', bool : 'boolean' , 'TXM' : 'string', 'Fichier' : 'string', 'Repertoire':'string', 'FichierNoAbs' : 'string', 'FichierOuRepertoire':'string'   }
+dictNomsDesTypes = { 'I' : 'xs:int', 'R' : 'xs:float', bool : 'xs:boolean' , 'TXM' : 'xs:string', 'Fichier' : 'xs:string', 'Repertoire':'xs:string', 'FichierNoAbs' : 'xs:string', 'FichierOuRepertoire':'xs:string'   }
 
 listeParamDeTypeTypeAttendu = ( 'defaut', 'sug', 'val_min', 'val_max', 'into', 'intoSug')
 listeParamDeTypeStr         = ('fr', 'docu', 'ang', 'nom' )
index b6fe4fe24cd0ec3fcc026cd81ff55346164f6ca7..98467da904a974de3f2b52cb88c2a33557b5cd5a 100644 (file)
@@ -57,7 +57,7 @@ class JDC_POURSUITE(JDC):
    def o_register(self,sd):
       return self.jdc_pere.o_register(sd)
 
-   def NommerSdprod(self,sd,sdnom,restrict='non'):
+   def nommerSDProd(self,sd,sdnom,restrict='non'):
       """
           Nomme la SD apres avoir verifie que le nommage est possible : nom
           non utilise
@@ -65,7 +65,7 @@ class JDC_POURSUITE(JDC):
           Si le nom est deja utilise, leve une exception
           Met le concept cree dans le contexe global g_context
       """
-      #print "NommerSdprod",sd,sdnom,restrict
+      #print "nommerSDProd",sd,sdnom,restrict
       if self.prefix_include:
           if sdnom != self.prefix_include:sdnom=self.prefix_include+sdnom
 
@@ -90,7 +90,7 @@ class JDC_POURSUITE(JDC):
           sdnom=sd.id[2:]
           pass
 
-      o=self.sds_dict.get(sdnom,None)
+      o=self.sdsDict.get(sdnom,None)
       if isinstance(o,ASSD):
          raise AsException(tr("Nom de concept deja defini : %s" ,sdnom))
 
@@ -104,7 +104,7 @@ class JDC_POURSUITE(JDC):
 
       # ATTENTION : Il ne faut pas ajouter sd dans sds car il s y trouve deja.
       # Ajoute a la creation (appel de regSD).
-      self.sds_dict[sdnom]=sd
+      self.sdsDict[sdnom]=sd
       sd.nom=sdnom
 
       # En plus si restrict vaut 'non', on insere le concept dans le contexte du JDC
index 24757be53fb3cfa9812aff1aa20400914e5ccec0..1cee811eb1fa2ebea8167d01fb1cab8515558b43 100644 (file)
@@ -22,14 +22,23 @@ from __future__ import absolute_import
 from __future__ import print_function
 import os
 
-from PyQt5.QtCore import QTranslator
+try :
+  from PyQt5.QtCore import QTranslator
+  code_translator = QTranslator()
+  eficas_translator = QTranslator()
+except :
+  code_translator = None
+  eficas_translator = None
+  print ('pas d import de qt, pas de traduction')
+  
 
-code_translator = QTranslator()
-eficas_translator = QTranslator()
 
 def localise(application, locale=None,file=None,translatorFichier=None, debug=False ):
     """
     """
+    if code_translator == None : 
+       print ('qt not avalaible, no translation')
+       return
     from PyQt5.QtCore import QLibraryInfo
     from PyQt5.QtCore import QLocale
     from PyQt5.QtWidgets import QApplication
@@ -38,7 +47,6 @@ def localise(application, locale=None,file=None,translatorFichier=None, debug=Fa
     sys_locale = QLocale.system().name()
 
     if locale is None: locale="fr"
-
     if locale=="ang" : locale="en"
 
     if file != None and debug :
@@ -50,7 +58,6 @@ def localise(application, locale=None,file=None,translatorFichier=None, debug=Fa
     elif debug:
        print ("Unable to load Eficas translator!")
 
-    global code_translator
     if debug : print  ('translatorFichier :' ,translatorFichier)
     if translatorFichier != None :
        if (code_translator.load(translatorFichier)) and debug:
index 81e623d3af8a246e6bfbaa5f0037881f9bef9603..1078fb27455197b59455e6d20e8d57c044eac2b1 100644 (file)
@@ -44,8 +44,8 @@ class MCNUPLET(V_MCCOMPO.MCCOMPO,N_MCCOMPO.MCCOMPO):
       self.definition=definition
       self.nom=nom
       self.parent = parent
-      # GETVAL affecte la valeur par defaut si necessaire
-      self.valeur=self.GETVAL(self.val)
+      # getValeurEffective affecte la valeur par defaut si necessaire
+      self.valeur=self.getValeurEffective(self.val)
       if parent :
          self.jdc = self.parent.jdc
          self.niveau = self.parent.niveau
index fad34c6d4174efe1568309c20771900ef9cf1c7c..465c6f01c34099cf1e9c3e6c7aff1751d9c3b994 100644 (file)
@@ -75,11 +75,11 @@ class NUPL(N_ENTITE.ENTITE,I_ENTITE.ENTITE):
           self.cr.fatal(tr("L'attribut 'max' doit etre un entier : ")+str(self.max))
       if self.min > self.max :
          self.cr.fatal(tr("Nombres d'occurrence min et max invalides :") +str(self.min)+","+str(self.max))
-      if type(self.fr) != bytes and type(self.fr) != str :
+      if type(self.fr) != bytes and type(self.fr) != str  :
         self.cr.fatal(tr("L'attribut 'fr' doit etre une chaine de caracteres"))
       if self.statut not in ['o','f','c','d']:
         self.cr.fatal(tr("L'attribut 'statut' doit valoir 'o','f','c' ou 'd'"))
-      if type(self.docu) != bytes and type(self.docu) != str  :
+      if type(self.docu) != bytes and type(self.docu) != str   :
         self.cr.fatal(tr("L'attribut 'docu' doit etre une chaine de caracteres"))
       self.verifCataRegles()
 
index fa5ea0dba39741721b97e6255c015f3de5a3c8c1..cc1987097431abc0937b26bcf0b891e025ae9462 100644 (file)
@@ -25,6 +25,7 @@ try :
 except : pass
 import math
 import types
+# PNPN a resorber
 import six
 
 try:
index 5ab01bab1f703b1a590b033b1ce45cb4bad17c6c..9f5bb93d948ffb1b4b19d31e98ad29fa5bc721af 100644 (file)
@@ -30,7 +30,6 @@ from __future__ import absolute_import
 from __future__ import print_function
 try :
    from builtins import str
-   from builtins import range
    from builtins import object
 except : pass
 
@@ -40,12 +39,13 @@ import traceback
 
 # import de modules Eficas
 from Noyau.N_CR import CR
+from Noyau.N_UserASSD import UserASSD
 from Noyau import N_OBJECT
 from Ihm import I_OBJECT
 from .param2 import *
 from Ihm import CONNECTOR
 from Extensions.i18n import tr
-from six.moves import range
+
 
 class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
   """
@@ -58,7 +58,20 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
   nature = 'PARAMETRE'
   idracine = 'param'
 
+  def __new__(cls,nom,valeur=None):
+    # on est en relecture du .comm: l objet a ete detecte comme parametre par le parsing
+    # mais il  s agit d une reference, une UserASDD
+     if (issubclass(valeur.__class__, UserASSD)):
+        valeur.initialiseNom(nom)
+        return valeur
+     try :
+        return super(PARAMETRE, cls).__new__(cls,*args,**kwargs)
+     except : 
+        return super(PARAMETRE, cls).__new__(cls)
+
+
   def __init__(self,nom,valeur=None):
+    #print ('__init__ de parametre pour', nom,valeur)
     self.nom = nom
     # La classe PARAMETRE n'a pas de definition : on utilise self pour
     # completude
index e8116f5f4ed2707f2abef6fbeb6f8896626d53b8..cc763f928c035d0723f7c6a71dbbc8ef1f37a9ad 100644 (file)
@@ -20,7 +20,6 @@ mechanism, in the ``Eficas`` application of EDF. Handles unformatted and
 formatted strings, according to all formatting schemes: via dictionaries,
 tuples, or atoms.
 
-``PyQt4`` is currently supported.
 """
 from __future__ import absolute_import
 try : 
@@ -30,13 +29,14 @@ try :
 except : 
   pass
 from .eficas_exception import EficasException
-#from Extensions.eficas_exception import EficasException
+
 import re
-from six.moves import map
+regex=re.compile(r"% *[0-9]+")
+
 import six
+from six.moves import map
 from six.moves import range
 from six.moves import zip
-regex=re.compile(r"% *[0-9]+")
 
 
 
@@ -246,7 +246,11 @@ def tr(string, *args):
        string or Unicode object with formatting specifications, and, 
        optionally, an iterable or an int or float.
        Lets Python do the string formatting."""
-    from PyQt5.QtWidgets import QApplication
+    try :
+      from PyQt5.QtWidgets import QApplication
+    except :
+      return string
+
     string = _preprocess_atom(string)
     if len(args) == 0:
         r = six.text_type(QApplication.translate("@default", string))
index ba384b0ec569bd17fad618da33d87500457e405b..a3359c53d1b8447d61adeceb618fd98a8496f77d 100644 (file)
@@ -27,15 +27,11 @@ from Noyau.N_VALIDATOR import ValError
 
 class ASSD:
    def __repr__(self):
-      return tr("concept %(inst_name)s de type %(class_name)s", \
-                       {'inst_name': self.getName(), \
-                        'class_name': self.__class__.__name__})
+      return "concept " + self.getName() + " type " + self.__class__.__name__
 
    def __str__(self):
       return self.getName() or "<None>"
 
-   #def __del__(self):
-   #   print "__del__",self
 
 class assd(ASSD):
    def __convert__(cls,valeur):
@@ -45,7 +41,7 @@ class assd(ASSD):
 class GEOM(ASSD):
    def __convert__(cls,valeur):
       return valeur
-   __convert__=classmethod(__convert__)
+   __convert__= classmethod(__convert__)
 
 class geom(GEOM):
    pass
index aa46e11716d2921264baf71b3ca1d48a0b644f74..389869c44850ab63f9f29860631b7953a02f340e 100644 (file)
@@ -23,7 +23,6 @@
 from __future__ import absolute_import
 
 from . import I_REGLE
-import six
 
 class A_CLASSER(I_REGLE.REGLE):
   def getText(self):
@@ -36,5 +35,5 @@ class A_CLASSER(I_REGLE.REGLE):
     for arg in self.args1:
       t=t+arg.strip()+' ou '
     text = text + t[0:-4] +'\n'
-    return six.text_type(text)
+    return text
 
index 922f87966457d1f9cb4d1e3630efdd729b257a39..f29bda01d77836de95c300b1c1b6dfc3f6751a24 100644 (file)
@@ -18,7 +18,6 @@
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
 from __future__ import absolute_import
-import six
 _no=0
 
 import Accas
@@ -81,159 +80,159 @@ class ENTITE:
             #   % (parent, tuple(mcs.intersection(mcbloc)))
       return mcs
 
-  def enregistreXML(self,root,catalogueXml):
-      import xml.etree.ElementTree as ET
-      import types
-      moi=ET.SubElement(root,str(self.__class__))
-      nom=ET.SubElement(moi,'nom')
-      nom.text=self.nom
-
-      if hasattr(self,'validators') and (self.validators != () and self.validators != None):
-         valid=ET.SubElement(moi,'validators')
-         valid.text= str(self.validators.__class__)
-         catalogueXml.validatorsUtilises.append(self.validators)
-
-      if hasattr(self,'regles') and (self.regles !=() and self.regles != None):
-         for regle in self.regles:
-             regle.enregistreXML(moi,catalogueXml)
-         catalogueXml.reglesUtilisees.append(self.regles)
-
-      if ((self.getDocu() !="" and self.getDocu() !=None) or  \
-          (self.fr != "" and self.fr != None) or \
-          (self.ang != "" and self.ang != None) ):
-                dico={}
-                if self.getDocu() !=None : dico["docu"]=self.getDocu()
-                if self.fr != None        : dico["fr"]=six.text_type(self.fr,"iso-8859-1")
-                if self.ang != None       : dico["ang"]=self.ang
-                doc=ET.SubElement(moi,'doc')
-                doc.attrib=dico
-
-      if ((self.getSug() !=None) or  \
-          (hasattr(self,'defaut') and (self.defaut != None) and (self.defaut != 'None'))) :
-                # il faut ajouter des sug dans le catalogue
-                # les attributs sont  toujours du texte 
-                dico={}
-                if (self.defaut != None) and (self.defaut != 'None') :
-                    if isinstance(self.defaut,str ) : dico["defaut"]=six.text_type(self.defaut,"iso-8859-1")
-                    else :dico["defaut"]=str(self.defaut)
-                if self.getSug() !=None:
-                    if isinstance(self.getSug(),str ) : dico["sug"]=six.text_type(self.getSug(),"iso-8859-1")
-                    else :dico["sug"]=str(self.getSug())
-                
-                doc=ET.SubElement(moi,'ValeurDef')
-                doc.attrib=dico
-
-      dico={}
-      if hasattr(self,'into') and self.into!=None: dico['into']=str(self.into)
-      if hasattr(self,'val_max') and self.val_max != "**" : dico['max']=str(self.val_max)
-      if hasattr(self,'val_min') and self.val_min != "**" : dico['min']=str(self.val_min)
-      if dico != {} :
-           PV=ET.SubElement(moi,'PlageValeur')
-           PV.attrib=dico
-
-      dico={}
-      if hasattr(self,'max')  and self.max != 1 : dico['max']=str(self.max)
-      if hasattr(self,'min')  and self.min != 1 : dico['max']=str(self.min)
-      if dico != {} :
-           Card=ET.SubElement(moi,'Cardinalite')
-           Card.attrib=dico
-
-      dico={}
-      if hasattr(self,'reentrant') and self.reentrant not in ('f','n') : dico['reentrant']=str(self.reentrant)
-      if hasattr(self,'position') and self.position != "local": dico['position']=str(self.position)
-      if hasattr(self,'homo') and self.homo != 1 : dico['homogene']=str(self.homo)
-      if hasattr(self,'statut') : dico['statut']=str(self.statut)
-      if hasattr(self,'repetable') : dico['repetable']=str(self.repetable)
-      if dico != {} :
-           pos=ET.SubElement(moi,'situation')
-           pos.attrib=dico
-
-      if hasattr(self,'type') and self.type != ():
-         typeAttendu=ET.SubElement(moi,'typeAttendu')
-         l=[]
-         for t in self.type:
-             if type(t) == type : l.append(t.__name__)
-             else : l.append(t)
-         typeAttendu.text=str(l)
-
-      if hasattr(self,'sd_prod') and self.sd_prod != () and self.sd_prod !=None:
-         typeCree=ET.SubElement(moi,'typeCree')
-         typeCree.text=str(self.sd_prod.__name__) 
-      if hasattr(self,'op') and self.op !=None  : 
-         subRoutine=ET.SubElement(moi,'subRoutine')
-         subRoutine.text=str(self.op)
-
-      if hasattr(self,'proc') and self.proc != None : 
-         construction=ET.SubElement(moi,'Construction')
-         construction.text=self.proc.uri
-
-      for nomFils, fils in self.entites.items() :
-          fils.enregistreXML(moi,catalogueXml)
-      
-  def enregistreXMLStructure(self,root,catalogueXml):
-      import xml.etree.ElementTree as ET
-      import types
-      moi=ET.SubElement(root,str(self.__class__))
-
-      if hasattr(self,'into') and self.into!=None: 
-          INTO=ET.SubElement(moi,'into')
-          INTO.text='into'
-
-      dico={}
-      if hasattr(self,'val_max') and self.val_max != "**" : dico['max']=str(self.val_max)
-      if hasattr(self,'val_min') and self.val_min != "**" : dico['min']=str(self.val_min)
-      if dico != {} :
-           PV=ET.SubElement(moi,'maxOrMin')
-           PV.text='maxOrMin'
-
-      dico={}
-      if hasattr(self,'max')  and self.max != 1 : dico['max']=str(self.max)
-      if hasattr(self,'min')  and self.min != 1 : dico['max']=str(self.min)
-      if dico != {} :
-           Card=ET.SubElement(moi,'liste')
-           Card.text="liste"
-
-      dico={}
-      if hasattr(self,'statut') and self.statut=="f" :
-         statut=ET.SubElement(moi,'facultatif')
-         statut.text='facultatif'
-      if hasattr(self,'statut') and self.statut !="f" :
-         statut=ET.SubElement(moi,'obligatoire')
-         statut.text='obligatoire'
-
-      if hasattr(self,'type') and self.type != ():
-        try :
-           if 'Fichier' in self.type : ty=ET.SubElement(moi,'Fichier')
-           ty.text='type'
-        except :
-           try :
-             if 'Repertoire' in self.type : ty=ET.SubElement(moi,'Repertoire')
-             ty.text='type'
-           except :
-              for t in self.type:
-                if t == "I" : ty=ET.SubElement(moi,'typeEntier')
-                elif t == "R" : ty=ET.SubElement(moi,'typeReel')
-                elif t == "TXM" : ty=ET.SubElement(moi,'typeTXM')
-                else :
-                  try :
-                    ty=ET.SubElement(moi,t.__name__) 
-                  except :
-                    ty=ET.SubElement(moi,'autre') 
-                ty.text='type'
-
-      if hasattr(self,'sd_prod') and self.sd_prod != () and self.sd_prod !=None:
-         typeCree=ET.SubElement(moi,'typeCree')
-         typeCree.text='sd_prod'
-      if hasattr(self,'op') and self.op !=None  : 
-         subRoutine=ET.SubElement(moi,'subRoutine')
-         subRoutine.text='op'
-
-      if hasattr(self,'proc') and self.proc != None : 
-         construction=ET.SubElement(moi,'Construction')
-         construction.text='proc'
-
-      for nomFils, fils in self.entites.items() :
-          fils.enregistreXMLStructure(moi,catalogueXml)
-      
+#  def enregistreXML(self,root,catalogueXml):
+#      import xml.etree.ElementTree as ET
+#      import types
+#      moi=ET.SubElement(root,str(self.__class__))
+#      nom=ET.SubElement(moi,'nom')
+#      nom.text=self.nom
+#
+#      if hasattr(self,'validators') and (self.validators != () and self.validators != None):
+#         valid=ET.SubElement(moi,'validators')
+#         valid.text= str(self.validators.__class__)
+#         catalogueXml.validatorsUtilises.append(self.validators)
+#
+#      if hasattr(self,'regles') and (self.regles !=() and self.regles != None):
+#         for regle in self.regles:
+#             regle.enregistreXML(moi,catalogueXml)
+#         catalogueXml.reglesUtilisees.append(self.regles)
+#
+#      if ((self.getDocu() !="" and self.getDocu() !=None) or  \
+#          (self.fr != "" and self.fr != None) or \
+#          (self.ang != "" and self.ang != None) ):
+#                dico={}
+#                if self.getDocu() !=None : dico["docu"]=self.getDocu()
+#                if self.fr != None        : dico["fr"]=six.text_type(self.fr,"iso-8859-1")
+#                if self.ang != None       : dico["ang"]=self.ang
+#                doc=ET.SubElement(moi,'doc')
+#                doc.attrib=dico
+#
+#      if ((self.getSug() !=None) or  \
+#          (hasattr(self,'defaut') and (self.defaut != None) and (self.defaut != 'None'))) :
+#                # il faut ajouter des sug dans le catalogue
+#                # les attributs sont  toujours du texte 
+#                dico={}
+#                if (self.defaut != None) and (self.defaut != 'None') :
+#                    if isinstance(self.defaut,str ) : dico["defaut"]=six.text_type(self.defaut,"iso-8859-1")
+#                    else :dico["defaut"]=str(self.defaut)
+#                if self.getSug() !=None:
+#                    if isinstance(self.getSug(),str ) : dico["sug"]=six.text_type(self.getSug(),"iso-8859-1")
+#                    else :dico["sug"]=str(self.getSug())
+#                
+#                doc=ET.SubElement(moi,'ValeurDef')
+#                doc.attrib=dico
+#
+#      dico={}
+#      if hasattr(self,'into') and self.into!=None: dico['into']=str(self.into)
+#      if hasattr(self,'val_max') and self.val_max != "**" : dico['max']=str(self.val_max)
+#      if hasattr(self,'val_min') and self.val_min != "**" : dico['min']=str(self.val_min)
+#      if dico != {} :
+#           PV=ET.SubElement(moi,'PlageValeur')
+#           PV.attrib=dico
+#
+#      dico={}
+#      if hasattr(self,'max')  and self.max != 1 : dico['max']=str(self.max)
+#      if hasattr(self,'min')  and self.min != 1 : dico['max']=str(self.min)
+#      if dico != {} :
+#           Card=ET.SubElement(moi,'Cardinalite')
+#           Card.attrib=dico
+#
+#      dico={}
+#      if hasattr(self,'reentrant') and self.reentrant not in ('f','n') : dico['reentrant']=str(self.reentrant)
+#      if hasattr(self,'position') and self.position != "local": dico['position']=str(self.position)
+#      if hasattr(self,'homo') and self.homo != 1 : dico['homogene']=str(self.homo)
+#      if hasattr(self,'statut') : dico['statut']=str(self.statut)
+#      if hasattr(self,'repetable') : dico['repetable']=str(self.repetable)
+#      if dico != {} :
+#           pos=ET.SubElement(moi,'situation')
+#           pos.attrib=dico
+#
+#      if hasattr(self,'type') and self.type != ():
+#         typeAttendu=ET.SubElement(moi,'typeAttendu')
+#         l=[]
+#         for t in self.type:
+#             if type(t) == type : l.append(t.__name__)
+#             else : l.append(t)
+#         typeAttendu.text=str(l)
+#
+#      if hasattr(self,'sd_prod') and self.sd_prod != () and self.sd_prod !=None:
+#         typeCree=ET.SubElement(moi,'typeCree')
+#         typeCree.text=str(self.sd_prod.__name__) 
+# 
+#      if hasattr(self,'op') and self.op !=None  : 
+#         subRoutine=ET.SubElement(moi,'subRoutine')
+#         subRoutine.text=str(self.op)
+#
+#      if hasattr(self,'proc') and self.proc != None : 
+#         construction=ET.SubElement(moi,'Construction')
+#         construction.text=self.proc.uri
+#
+#      for nomFils, fils in self.entites.items() :
+#          fils.enregistreXML(moi,catalogueXml)
+#      
+#  def enregistreXMLStructure(self,root,catalogueXml):
+#      import xml.etree.ElementTree as ET
+#      import types
+#      moi=ET.SubElement(root,str(self.__class__))
+#
+#      if hasattr(self,'into') and self.into!=None: 
+#          INTO=ET.SubElement(moi,'into')
+#          INTO.text='into'
+#
+#      dico={}
+#      if hasattr(self,'val_max') and self.val_max != "**" : dico['max']=str(self.val_max)
+#      if hasattr(self,'val_min') and self.val_min != "**" : dico['min']=str(self.val_min)
+#      if dico != {} :
+#           PV=ET.SubElement(moi,'maxOrMin')
+#           PV.text='maxOrMin'
+#
+#      dico={}
+#      if hasattr(self,'max')  and self.max != 1 : dico['max']=str(self.max)
+#      if hasattr(self,'min')  and self.min != 1 : dico['max']=str(self.min)
+#      if dico != {} :
+#           Card=ET.SubElement(moi,'liste')
+#           Card.text="liste"
+#
+#      dico={}
+#      if hasattr(self,'statut') and self.statut=="f" :
+#         statut=ET.SubElement(moi,'facultatif')
+#         statut.text='facultatif'
+#      if hasattr(self,'statut') and self.statut !="f" :
+#         statut=ET.SubElement(moi,'obligatoire')
+#         statut.text='obligatoire'
+#
+#      if hasattr(self,'type') and self.type != ():
+#        try :
+#           if 'Fichier' in self.type : ty=ET.SubElement(moi,'Fichier')
+#           ty.text='type'
+#        except :
+#           try :
+#             if 'Repertoire' in self.type : ty=ET.SubElement(moi,'Repertoire')
+#             ty.text='type'
+#           except :
+#              for t in self.type:
+#                if t == "I" : ty=ET.SubElement(moi,'typeEntier')
+#                elif t == "R" : ty=ET.SubElement(moi,'typeReel')
+#                elif t == "TXM" : ty=ET.SubElement(moi,'typeTXM')
+#                else :
+#                  try :
+#                    ty=ET.SubElement(moi,t.__name__) 
+#                  except :
+#                    ty=ET.SubElement(moi,'autre') 
+#                ty.text='type'
+#
+#      if hasattr(self,'sd_prod') and self.sd_prod != () and self.sd_prod !=None:
+#         typeCree=ET.SubElement(moi,'typeCree')
+#         typeCree.text='sd_prod'
+# 
+#      if hasattr(self,'op') and self.op !=None  : 
+#         subRoutine=ET.SubElement(moi,'subRoutine')
+#         subRoutine.text='op'
+#
+#      if hasattr(self,'proc') and self.proc != None : 
+#         construction=ET.SubElement(moi,'Construction')
+#         construction.text='proc'
+#
+#      for nomFils, fils in self.entites.items() :
+#          fils.enregistreXMLStructure(moi,catalogueXml)
+#      
index 43bbbb8f2b9cd954f3a61c072c86abf782a083d6..06fc893552ca09368c7d9275cf7cebf8aee73e0f 100644 (file)
@@ -30,7 +30,7 @@ from Extensions.i18n import tr
 from Extensions.eficas_exception import EficasException
 
 # Objet re pour controler les identificateurs Python
-concept_re=re.compile(r'[a-zA-Z_]\w*$')
+conceptRE=re.compile(r'[a-zA-Z_]\w*$')
 
 # import rajoute suite a l'ajout de buildSd --> a resorber
 import traceback
@@ -105,8 +105,8 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
             - 0 si le nommage n'a pas pu etre menea son terme,
             - 1 dans le cas contraire
       """
-      # Le nom d'un concept doit etre un identificateur Python (toujours vrai ?)
-      if not concept_re.match(nom):
+      # Le nom d'un concept doit etre un identificateur Python (toujours vrai ou insuffisant?)
+      if not conceptRE.match(nom):
          return 0, tr("Un nom de concept doit etre un identificateur Python")
 
       # pour eviter que le nom du concept soit le nom de la classe --> souci pour utiliser le concept
@@ -123,6 +123,7 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
       if not self.isValid(sd='non') : return 0,"Nommage du concept refuse : l'operateur n'est pas valide"
       #
       # Cas particulier des operateurs obligatoirement reentrants
+      # plus de concept reentrant (pour Aster)
       #
       if self.definition.reentrant == 'o':
         self.sd = self.reuse = self.jdc.getSdAvantEtape(nom,self)
@@ -175,6 +176,7 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
                # Renommage du concept : Il suffit de changer son attribut nom pour le nommer
                self.sd.nom = nom
                self.sdnom=nom
+               self.parent.sdsDict[nom]=self.sd
                self.parent.updateConceptAfterEtape(self,self.sd)
                self.finModif()
                return 1, tr("Nommage du concept effectue")
@@ -258,7 +260,7 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
           deja definis dans le contexte
           Si c'est le cas, les concepts produits doivent etre supprimes
       """
-      #print "controlSdprods",d.keys(),self.sd and self.sd.nom,self.nom
+      print ("controlSdprods etape",d.keys(),self.sd and self.sd.nom,self.nom)
       if self.sd:
         if self.sd.nom in d :
            # Le concept est deja defini
@@ -296,6 +298,7 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
             Une procedure n'en a aucun
             Une macro en a en general plus d'un
       """
+      self.deleteRef()
       #print "supprimeSdProds",self
       if self.reuse is self.sd :return
       # l'etape n'est pas reentrante
@@ -371,6 +374,16 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
    def getGenealogiePrecise(self):
       return [self.nom]
 
+   def getNomDsXML(self):
+     # en xml on a un choice 
+     index=0
+     for e in self.parent.etapes :
+         if e == self : break
+         if e.nom == self.nom : index+=1
+     nomDsXML = self.nom + "[" + str(index) + "]"
+     return nomDsXML
+
+
    def getGenealogie(self):
       """ 
           Retourne la liste des noms des ascendants de l'objet self
@@ -490,7 +503,6 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
      #rafraichisst de la validite de l'etape (probleme avec l'ordre dans les macros : etape puis mots cles)
      self.isValid()
      if not self.isValid() and self.nom == "INCLUDE" :
-        self.cr.fatal(('Etape : %s ligne : %r  %s'),
-        self.nom, self.appel[0],  tr("\n   Include Invalide. \n  ne sera pas pris en compte"))
+        self.cr.fatal('Etape : {} ligne : {}  {}'.format(self.nom, self.appel[0],  tr("\n   Include Invalide. \n  ne sera pas pris en compte")))
      return cr
 
index 31b12caeb576dfc19ae32be6b9f53f64e35f6282..9447817844f52e34e80f3302ad417101a66a4e0b 100644 (file)
@@ -29,7 +29,6 @@ class Fichier:
 
    def __convert__(self,valeur):
     # Attention ne verifie pas grand chose
-    # cela vaut-il la peine de refaire ce que Qt fait tres bien 
     if type(valeur) != bytes  and type(valeur) != str:
       return None
     return valeur
index 4cd44491f002cf38d124dd17665d955d1e8a4cb8..c0db82618085aa056b1bbeb66c56de7ab8943311 100644 (file)
@@ -73,7 +73,6 @@ class JDC(I_OBJECT.OBJECT):
       """
       d=self.getContexteAvant(etape)
       
-      
       l=[]
       for k,v in d.items():
         #if type(v) != types.InstanceType and not isinstance(v,object): continue
@@ -86,6 +85,14 @@ class JDC(I_OBJECT.OBJECT):
       l.sort()
       return l
 
+   def getSdCreeParObjet(self,classeAChercher):
+       l=[]
+       for v in list(self.sdsDict.keys()):
+          if (isinstance(self.sdsDict[v], classeAChercher)) : 
+             l.append(self.sdsDict[v])
+       return l
+      
+
    def getVariables(self,etape):
       etapeStop=etape
       l=[]
@@ -138,28 +145,42 @@ class JDC(I_OBJECT.OBJECT):
                   Correlation.isValid()
              etapeTraitee.isValid()
 
-   def recalculeValiditeApresChangementGlobalJdc(self):
-        #print "je passe dans recalculeValiditeApresChangementGlobalJdc"
+   def recalculeValiditeApresChangementGlobalJdc(self, motClef):
+        print ("je passe dans recalculeValiditeApresChangementGlobalJdc")
         try :
-          liste=self.getJdcRoot().cata.liste_condition
+          liste=self.getJdcRoot().cata.dict_condition[motClef.nom]
         except :
           liste=()
         for etapeTraitee in self.etapes :
            if etapeTraitee.nom not in liste: continue
-           self.forceRecalculBloc(etapeTraitee)
+           #self.forceRecalculBloc(etapeTraitee)
            etapeTraitee.state='arecalculer'
+           etapeTraitee.deepUpdateConditionBloc()
            etapeTraitee.isValid()
 
+   def activeBlocsGlobaux(self):
+       for nomMotClef in self.mc_globaux : 
+           motClef=self.mc_globaux[nomMotClef]
+           if nomMotClef in list(self.cata.dict_condition.keys()):
+              liste=self.cata.dict_condition[nomMotClef]
+           else : liste=()
+           for etapeTraitee in self.etapes :
+               if etapeTraitee.nom not in liste: continue
+               etapeTraitee.state='arecalculer'
+               etapeTraitee.deepUpdateConditionBlocApresCreation()
+               etapeTraitee.isValid()
+        
+      
         
-   def forceRecalculBloc(self,objet):
+   #def forceRecalculBloc(self,objet):
        # Attention : certains objets deviennent None quand on recalcule 
        # les conditions d existence des blocs
-       if objet != None:  objet.state='arecalculer'
-       if hasattr(objet,'listeMcPresents'):
-          for childNom in objet.listeMcPresents():
-              child=objet.getChild(childNom)
-              if hasattr(objet,'_updateConditionBloc'):objet._updateConditionBloc()
-              self.forceRecalculBloc(child)
+   #    if objet != None:  objet.state='arecalculer'
+   #    if hasattr(objet,'listeMcPresents'):
+   #       for childNom in objet.listeMcPresents():
+   #           child=objet.getChild(childNom)
+   #           if hasattr(objet,'_updateConditionBloc'):objet._updateConditionBloc()
+   #           self.forceRecalculBloc(child)
        
    
    def getSdAvantDuBonTypePourTypeDeBase(self,etape,type):
@@ -309,6 +330,8 @@ class JDC(I_OBJECT.OBJECT):
           self.resetContext()
           self.editmode=0
           self.activeEtapes()
+          self.enregistreEtapePyxb(e,pos)
+          # PN fait ds self.activeEtapes
           CONNECTOR.Emit(self,"add",e)
           self.finModif()
           return e
@@ -406,7 +429,12 @@ class JDC(I_OBJECT.OBJECT):
       """
       sd=self.getSdAvantEtape(nom_sd,etape)
       if sd:return sd
-      return self.getSdApresEtape(nom_sd,etape,avec)
+      sd=self.getSdApresEtape(nom_sd,etape,avec)
+      if sd:return sd
+      # Pour tenir compte des UserASSD
+      if nom_sd in self.sdsDict.keys() : 
+         sd=self.sdsDict[nom_sd]
+         return sd
 
    def getContexte_apres(self,etape):
       """
@@ -424,26 +452,9 @@ class JDC(I_OBJECT.OBJECT):
 
    def activeEtapes(self):
       """
-          Cette methode a pour fonction de desactiver les etapes qui doivent
-          l'etre cad, dans le cas d'ASTER, les etapes qui ne sont pas 
-          comprises entre le premier DEBUT/POURSUITE et le premier FIN 
-          et rendre actives les autres
-      """
-      #if self.definition.code == 'ASTER' :
-         # Seulement pour ASTER :
-         # Avant DEBUT actif vaut 0
-         # Apres DEBUT et avant le 1er FIN actif vaut 1
-         # Apres le 1er FIN actif vaut -1
-      #   actif=0
-      #actif=1
+      """
       for etape in self.etapes:
-        #if actif == 0 and etape.nom in ['DEBUT','POURSUITE']:actif=1
-        #if actif == 1:
            etape.active()
-           #self.enregistreEtapePyxb(etape)
-        #else:
-        #   etape.inactive()
-        #if etape.nom == 'FIN':actif=-1
 
    def deplaceEntite(self,indexNoeudACopier,indexNoeudOuColler,pos):
       """
@@ -479,12 +490,13 @@ class JDC(I_OBJECT.OBJECT):
           Retourne 0 dans le cas contraire
       """
       #PN correction de bugs 
+      print ('suppEntite', etape.nom)
       if etape not in self.etapes: return 0
 
       self.initModif()
       index_etape=self.etapes.index(etape)
 
-      #etape.deletePyxbObject()
+      #etape.delObjPyxb()
       self.etapes.remove(etape)
 
       if etape.niveau is not self:
@@ -520,7 +532,7 @@ class JDC(I_OBJECT.OBJECT):
          Effectue les verifications sur les etapes du jdc mais aussi sur les
          jdc parents s'ils existent.
       """
-      #print "controlContextApres",self,etape
+      print ("controlContextApres",self,etape)
       #Regularise les etapes du jdc apres l'etape etape
       self.controlJdcContextApres(etape)
 
@@ -529,7 +541,7 @@ class JDC(I_OBJECT.OBJECT):
           Methode semblable a controlContextApres mais ne travaille
           que sur les etapes et sous etapes du jdc
       """
-      #print "controlJdcContextApres",self,etape
+      print ("controlJdcContextApres",self,etape)
       if etape is None:
          # on demarre de la premiere etape
          index_etape=0
@@ -543,29 +555,22 @@ class JDC(I_OBJECT.OBJECT):
          return
 
       context=self.getContexteAvant(etape)
-
       for e in self.etapes[index_etape:]:
           e.controlSdprods(context)
           e.updateContext(context)
 
    def analyse(self):
-      try :
-       if self.editor.format == 'xml' :
-         # il ne faut pas le faire quand le jeu de donnees est vide
-         self.setCurrentContext()
-         self.analyseFromXML()
-         #print ('stop demande'); exit()
-         #self.execCompileFromXML()
-       else :    
-         self.compile()
-         self.execCompile()
-         if not self.cr.estvide():return
-         self.activeEtapes()
-      except:
          self.compile()
          self.execCompile()
          if not self.cr.estvide():return
          self.activeEtapes()
+         if self.mc_globaux != {} : self.activeBlocsGlobaux()
+
+   def analyseXML(self):
+         print ('analyseXML')
+         print (self.procedure)
+         self.setCurrentContext()
+         self.analyseFromXML()
 
    def registerParametre(self,param):
       """
@@ -644,9 +649,9 @@ class JDC(I_OBJECT.OBJECT):
       self.isValid()
       pass
 
-   def deepUpdateConditionBloc(self):
+   def deepUpdateConditionBloc(self,motClef=None):
       # pour le moment, on ne fait rien
-      self.getJdcRoot().recalculeValiditeApresChangementGlobalJdc()
+      self.getJdcRoot().recalculeValiditeApresChangementGlobalJdc(motClef)
       #raise EficasException(tr("Pas implemente"))
 
    def updateConditionBloc(self):
@@ -702,7 +707,7 @@ class JDC(I_OBJECT.OBJECT):
           de commandes, nommage de concepts, etc.
       """
       #print "resetContext",self,self.nom
-      self.current_context={}
+      self.currentContext={}
       self.index_etape_courante=0
       ind={}
       for i,etape in enumerate(self.etapes):
@@ -719,10 +724,10 @@ class JDC(I_OBJECT.OBJECT):
       #print "delSdprod",self,sd
       #print "delSdprod",self.sds
       #print "delSdprod",self.g_context
-      #print "delSdprod",self.sds_dict
+      #print "delSdprod",self.sdsDict
       #if sd in self.sds : self.sds.remove(sd)
       if sd.nom in self.g_context : del self.g_context[sd.nom]
-      if sd.nom in self.sds_dict : del self.sds_dict[sd.nom]
+      if sd.nom in self.sdsDict : del self.sdsDict[sd.nom]
 
    def delParam(self,param):
       """
@@ -746,11 +751,10 @@ class JDC(I_OBJECT.OBJECT):
           meme nom n'existe pas deja
       """
       if sd == None or sd.nom == None:return
-
-      o=self.sds_dict.get(sd.nom,None)
+      o=self.sdsDict.get(sd.nom,None)
       if isinstance(o,ASSD):
          raise AsException(tr("Nom de concept deja defini "+ sd.nom))
-      self.sds_dict[sd.nom]=sd
+      self.sdsDict[sd.nom]=sd
       self.g_context[sd.nom] = sd
       #if sd not in self.sds : self.sds.append(sd)
 
@@ -860,12 +864,12 @@ class JDC(I_OBJECT.OBJECT):
       Noyau.N_JDC.JDC.supprime(self)
       for etape in self.etapes:
          etape.supprime()
-      self.appli=None
+      self.appliEficas=None
       self.g_context={}
       self.const_context={}
-      self.sds_dict={}
+      self.sdsDict={}
       self.mc_globaux={}
-      self.current_context={}
+      self.currentContext={}
       self.condition_context={}
       self.etapes_niveaux=[]
       self.niveau=None
@@ -892,6 +896,8 @@ class JDC(I_OBJECT.OBJECT):
                 (dans ce cas l'ordre des etapes est bien l'ordre chronologique
                 de leur creation   )
       """
+      #import traceback
+      #traceback.print_stack()
       if not self.editmode:
          self.etapes.append(etape)
          self.index_etapes[etape] = len(self.etapes) - 1
@@ -900,7 +906,7 @@ class JDC(I_OBJECT.OBJECT):
       return self.gRegister(etape)
 
 #ATTENTION SURCHARGE : cette methode doit etre gardee en synchronisation avec celle de Noyau
-   def NommerSdprod(self,sd,sdnom,restrict='non'):
+   def nommerSDProd(self,sd,sdnom,restrict='non'):
       """
           Nomme la SD apres avoir verifie que le nommage est possible :
           nom non utilise
@@ -915,19 +921,20 @@ class JDC(I_OBJECT.OBJECT):
       # Cette etape est indiquee par l'attribut _etape_context qui a ete
       # positionne prealablement par un appel a setEtapeContext
 
-      if CONTEXT.debug : print(("JDC.NommerSdprod ",sd,sdnom))
+      if CONTEXT.debug : print(("JDC.nommerSDProd ",sd,sdnom))
 
       if self._etape_context:
          o=self.getContexteAvant(self._etape_context).get(sdnom,None)
       else:
-         o=self.sds_dict.get(sdnom,None)
+         o=self.sdsDict.get(sdnom,None)
 
       if isinstance(o,ASSD):
-         raise AsException(tr(" Nom de concept deja  defini : "+ sdnom))
+         raise AsException(tr(" Nom de concept deja defini : "+ sdnom))
 
       # ATTENTION : Il ne faut pas ajouter sd dans sds car il s y trouve deja.
       # Ajoute a la creation (appel de regSD).
-      self.sds_dict[sdnom]=sd
+      #print (' je pass ici, pour ', sdnom, self.sdsDict)
+      self.sdsDict[sdnom]=sd
       sd.nom=sdnom
 
       # En plus si restrict vaut 'non', on insere le concept dans le contexte du JDC
@@ -957,9 +964,9 @@ class JDC(I_OBJECT.OBJECT):
           Retourne le nom du fichier correspondant a un numero d'unite
           logique (entier) ainsi que le source contenu dans le fichier
       """
-      if self.appli is not None:
-         # Si le JDC est relie a une application maitre, on delegue la recherche
-         file,text= self.appli.getFile(unite,fic_origine)
+      if self.appliEficas is not None:
+         # Si le JDC est relie a une appliEficascation maitre, on delegue la recherche
+         file,text= self.appliEficas.getFile(unite,fic_origine)
       else:
          file = None
          if unite != None:
index 1503f3d45aba0b16b5f9092b8edcab5e361c13ae..2f4771f1aeaeed7dc8ccd9ab5371041fa1b29de6 100644 (file)
@@ -42,8 +42,6 @@ import Noyau, Validation.V_MACRO_ETAPE
 from Noyau import N_Exception
 from Noyau.N_Exception import AsException
 import Accas # attention aux imports circulaires
-import six
-from six.moves import range
 # fin import a resorber
 
 class MACRO_ETAPE(I_ETAPE.ETAPE):
@@ -79,12 +77,12 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
          ou leve une exception
          --> utilisee par ops.POURSUITE et INCLUDE
     """
-    #print ("getContexteJdc",self,self.nom, text)
+    print ("getContexteJdc",self,self.nom, text)
     # On recupere l'etape courante
     step=CONTEXT.getCurrentStep()
     self.text_included_converted=0
-    #try:
-    if 1 :
+    try:
+    #if 1 :
        # on essaie de creer un objet JDC auxiliaire avec un contexte initial
        # Attention getContexteAvant retourne un dictionnaire qui contient
        # le contexte courant. Ce dictionnaire est reactualise regulierement.
@@ -116,7 +114,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
        self.text_converted=0
        self.text_error=""
        if self.nom != "INCLUDE_MATERIAU":
-          format=self.parent.appli.appliEficas.format_fichier
+          format=self.jdc.appliEficas.format_fichier
           #on force a python pour Carmel
           if format=="CARMEL3D" : format="python"
           import convert
@@ -124,7 +122,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
               # Le convertisseur existe on l'utilise
               p=convert.plugins[format]()
               p.text=text
-              text=p.convert('exec',self.jdc.appli)
+              text=p.convert('exec',self.jdc.appliEficas)
               #Si le fichier ne peut pas etre converti, le cr n'est pas vide
               #et le texte est retourne tel que
               if not p.cr.estvide(): 
@@ -136,15 +134,14 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
 
        if hasattr(self,'sd') and self.sd != None : context_ini[self.sd.nom]=self.sd
        j=self.JdC_aux( procedure=text, nom=fichier,
-                                appli=self.jdc.appli,
+                                appliEficas=self.jdc.appliEficas,
                                 cata=self.jdc.cata,
                                 cata_ord_dico=self.jdc.cata_ordonne_dico,
                                 context_ini = context_ini,
                                 jdc_pere=self.jdc,etape_include=self,
                                 prefix_include=prefix_include,
                                 recorded_units=self.recorded_units,
-                                old_recorded_units=old_recorded_units)
-                                #old_recorded_units=old_recorded_units,**args)
+                                old_recorded_units=old_recorded_units,**args)
 
        j.analyse()
        if not j.cr.estvide(): self.text_included_converted=0
@@ -155,8 +152,8 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
        self.jdc_aux=j
        self.jdc.jdcDict=self.jdc_aux
 
-    #except:
-    else :
+    except:
+    #else :
        traceback.print_exc()
        # On retablit l'etape courante step
        CONTEXT.unsetCurrentStep()
@@ -172,7 +169,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
        #print ("valid ",j.isValid())
        CONTEXT.unsetCurrentStep()
        CONTEXT.setCurrentStep(step)
-       raise EficasException(tr("Impossible de relire le fichier %s \n ")+ six.text_type(j.cr))
+       raise EficasException(tr("Impossible de relire le fichier %s \n ")+ str(j.cr))
 
 
     if not j.isValid() and doitEtreValide:
@@ -205,14 +202,14 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
 
     # On remplit le dictionnaire des concepts produits inclus
     # en retirant les concepts presents dans le  contexte initial
-    # On ajoute egalement le concept produit dans le sds_dict du parent
+    # On ajoute egalement le concept produit dans le sdsDict du parent
     # sans verification car on est sur (verification integree) que 
     # le nommage est possible
     self.g_context.clear()
     for k,v in j_context.items():
        if (not k in context_ini) or (context_ini[k] != v):
            self.g_context[k]=v
-           self.parent.sds_dict[k]=v
+           self.parent.sdsDict[k]=v
 
     #Ce traitement n'est realise que dans les cas suivants:
     #     - si convert n'a pas pu convertir le jeu de commandes
@@ -229,15 +226,24 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
             if callable(v):continue
             self.g_context[k]=param2.Variable(k,v)
 
+    print (j)
+    print (dir(j))
+    print (j.currentContext)
     # On recupere le contexte courant
-    self.current_context=j.current_context
+    self.currentContext=j.currentContext
+    print ('kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmmmmmmmmmmmmmmmmmmmm')
     self.index_etape_courante=j.index_etape_courante
+    print ('kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmmmmmmmmmmmmmmmmmmmm')
     self.jdc_aux=j
+    print ('kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmmmmmmmmmmmmmmmmmmmm')
 
     # On retablit l'etape courante step
     CONTEXT.unsetCurrentStep()
+    print ('kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmmmmmmmmmmmmmmmmmmmm')
     CONTEXT.setCurrentStep(step)
+    print ('kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmmmmmmmmmmmmmmmmmmmm')
 
+    print ('kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkmmmmmmmmmmmmmmmmmmmmmm')
     return j_context
 
   def reevalueSdJdc(self):
@@ -324,6 +330,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
       """
          Supprime le concept produit sd s'il est produit par l'etape
       """
+      print ('supprimeSdprod de MACRO_ETAPE')
       if sd in self.sdprods:
          self.initModif()
          self.parent.delSdprod(sd)
@@ -477,7 +484,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
     self.jdc_aux.cr=self.jdc_aux.CR()
     # On remplit le dictionnaire des concepts produits inclus
     # en retirant les concepts presents dans le  contexte initial
-    # On ajoute egalement le concept produit dans le sds_dict du parent
+    # On ajoute egalement le concept produit dans le sdsDict du parent
     # sans verification car on est sur (verification integree) que
     # le nommage est possible
     j_context=self.jdc_aux.getContexteAvant(None)
@@ -486,9 +493,9 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
     for k,v in j_context.items():
        if not k in context_ini or context_ini[k] != v:
            self.g_context[k]=v
-           self.parent.sds_dict[k]=v
+           self.parent.sdsDict[k]=v
     # On recupere le contexte courant
-    self.current_context=self.jdc_aux.current_context
+    self.currentContext=self.jdc_aux.currentContext
     self.index_etape_courante=self.jdc_aux.index_etape_courante
     self.contexte_fichier_init = j_context
     self.fichier_err = None
@@ -602,8 +609,8 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
     except:
        # Impossible de construire le jdc auxiliaire (sortie par exception)
        l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
-       if self.jdc.appli is not None:
-          self.jdc.appli.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
+       if self.jdc.editor is not None:
+          self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
                                        message= tr("Ce fichier ne sera pas pris en compte\n %s",''.join(l)))
 
        self.g_context={}
@@ -619,9 +626,10 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
     """
         Cette methode sert a craer un contexte en interpratant un texte source Python.
     """
-    #print ("makeContexteInclude",fichier)
+    print ("makeContexteInclude",fichier)
     # on recupere le contexte d'un nouveau jdc dans lequel on interprete text
     contexte = self.getContexteJdc(fichier,text)
+    print (contexte)
     if contexte == None :
       raise EficasException("Impossible de construire le jeu de commandes correspondant au fichier")
     else:
@@ -633,7 +641,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
       # g_context est utilise pour avoir les concepts produits par la macro
       # contexte_fichier_init est utilise pour avoir les concepts supprimes par la macro
       self.contexte_fichier_init = contexte
-    #print ("fin makeContexteInclude",fichier)
+    print ("fin makeContexteInclude",fichier)
 
   def reevalueFichierInitObsolete(self):
       """Recalcule les concepts produits par le fichier enregistre"""
@@ -768,8 +776,8 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
          f,text=None,None
 
       self.recorded_units=units
-      if f is None and self.jdc.appli:
-         self.jdc.appli.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
+      if f is None and self.jdc.editor:
+         self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
                message= tr("Ce fichier ne sera pas pris en compte\nLe fichier associe n'est pas defini"))
       return f,text
 
@@ -785,7 +793,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
             # car il appelle directement ou indirectement updateContext
             # equivalent a resetContext. Evite les recursions
             self.jdc_aux.context_ini=d.copy()
-            self.jdc_aux.current_context={}
+            self.jdc_aux.currentContext={}
             self.jdc_aux.index_etape_courante=0
             #ATTENTION: il ne faut pas utiliser self.jdc_aux.getContexteAvant
             #car cet appel conduit a des remontees multiples incoherentes dans le
@@ -798,6 +806,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
             return
 
       if type(self.definition.op_init) == types.FunctionType:
+        print ('mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm dans updateContext')
         self.definition.op_init(*(self,d))
       if self.sd != None :d[self.sd.nom]=self.sd
       for co in self.sdprods:
@@ -871,7 +880,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
          for concept in self.old_context_fichier_init.values():
              self.jdc.deleteConcept(concept)
       if fichier == None :
-         fichier=str(self.jdc.appli.getFile_dictDonnees())
+         fichier=str(self.jdc.appliEficas.getFile_dictDonnees())
          if fichier  == str("") : 
            self.fichier_ini="badfile"
            self.fichier_text=""
@@ -936,7 +945,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
              self.jdc.deleteConcept(concept)
 
       if fichier == None :
-         fichier=str(self.jdc.appli.getFileVariable())
+         fichier=str(self.jdc.appliEficas.getFileVariable())
          if fichier  == str("") : 
            self.fichier_ini="badfile"
            self.fichier_text=""
@@ -1024,14 +1033,14 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
 
   def makeIncl2Except(self,mess=None):
          l=traceback.format_exception_only(tr("Fichier invalide"),sys.exc_info()[1])
-         if self.jdc.appli is not None:
+         if self.jdc.editor is not None:
              if mess == None :
-                     self.jdc.appli.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
+                     self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
                      message= tr("Le contenu de ce fichier ne sera pas pris en compte\n %s",\
                                                                    ''.join(l)))
 
              else :
-                     self.jdc.appli.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
+                     self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
                                             message=tr(mess))
          #self.parent.recordUnit(unite,self)
          self.g_context={}
@@ -1047,6 +1056,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
 
 
 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
+  #def makeInclude(self, unite=None, fname=None):
   def makeInclude(self, unite=None, fname=None):
       """
           Inclut un fichier dont l'unite logique est unite
@@ -1055,12 +1065,16 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
           Sinon on retourne None. Les concepts produits par l'INCLUDE sont
           pris en compte par le JDC parent lors du calcul du contexte (appel de ???)
       """
-      #print "makeInclude",unite
+      print ("makeInclude",fname)
       # On supprime l'attribut unite qui bloque l'evaluation du source de l'INCLUDE
       # car on ne s'appuie pas sur lui dans EFICAS mais sur l'attribut fichier_ini
       # Si unite n'a pas de valeur, l'etape est forcement invalide. On peut retourner None
-      if not unite and not fname:
-          return
+      #if not unite and not fname:
+      #    return
+      # 2020 on supprime unite
+      #      attention cependant c est utilise pour poursuite
+      #      PNPN a revoir
+      if not fname : return 
 
       if not hasattr(self,'fichier_ini') : 
          # Si le fichier n'est pas defini on le demande
@@ -1085,12 +1099,15 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
              raise EficasException(self.fichier_err)
 
          try:
+           print ('iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii')
            self.makeContexteInclude(self.fichier_ini ,self.fichier_text)
+           print ('iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii')
            self.parent.recordUnit(unite,self)
+           print ('iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii')
          except:
            l=traceback.format_exception_only(tr("Fichier invalide %s",sys.exc_info()[1]))
-           if self.jdc.appli:
-              self.jdc.appli.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
+           if self.jdc.editor:
+              self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
                                             message=tr("Le contenu de ce fichier ne sera pas pris en compte\n"+''.join(l)))
            self.parent.recordUnit(unite,self)
            self.g_context={}
@@ -1106,6 +1123,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
          self.updateFichierInit(unite)
          self.fichier_unite=unite
          if self.fichier_err is not None: raise EficasException(self.fichier_err)
+      print ('self.g_context', self.g_context)
         
 
 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
@@ -1227,8 +1245,8 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
            self.parent.recordUnit(None,self)
          except:
            l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
-           if self.jdc.appli:
-              self.jdc.appli.afficheAlerte(tr("Erreur lors de l'evaluation du fichier poursuite"),
+           if self.jdc.editor:
+              self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier poursuite"),
                                             message=tr("Ce fichier ne sera pas pris en compte\n %s",''.join(l)))
            self.parent.recordUnit(None,self)
            self.g_context={}
index 46f535025803cecedde344756133e23a96791d9a..19a2690eff0d8b414889174459a779ddaa6d11c7 100644 (file)
@@ -19,5 +19,9 @@
 #
 from __future__ import absolute_import
 from . import I_MCCOMPO
-class MCBLOC(I_MCCOMPO.MCCOMPO):pass
+class MCBLOC(I_MCCOMPO.MCCOMPO):
+
+   def getNomDsXML(self):
+     return self.parent.getNomDsXML()
+
 
index cf92a936cc3fb4e46aa3901dd9c53a78674e6da3..f856657d38fa9d29945da60e72d6ef7eb2b6e139 100644 (file)
@@ -163,15 +163,30 @@ class MCCOMPO(I_OBJECT.OBJECT):
           index=index+1
       return index
           
-  def findRangObjetDsArbre(self,objet) :
+  def chercheIndiceDsLeContenu(self,objet) :
   # uniquement pour Pyxb
-  # parcourt les Blocs
+  # ajoute la taille des les Blocs
+  # faut -il chercher plus loin ds les petits-enfants ?
+      if objet.nature == 'MCList' : objet=objet[0]
       leRang=0
-      pos=self.mcListe.index(objet)
+      positionDsLaListe=0
+      try :
+        positionDsLaListe=self.mcListe.index(objet)
+        positionDsLaListeDeFactSiFact =0
+      except :
+        for mc in self.mcListe:
+           if mc.nature == 'MCList':
+              try :
+                positionDsLaListeDeFactSiFact=mc.index(objet)
+                break
+              except :
+                positionDsLaListe=positionDsLaListe+1
+           else : positionDsLaListe=positionDsLaListe+1
       i=0
-      while (i+1) < pos :
+      while i < positionDsLaListe :
         leRang= leRang + self.mcListe[i].longueurDsArbre()
         i=i+1
+      leRang=leRang+positionDsLaListeDeFactSiFact
       return leRang
  
 
@@ -203,7 +218,11 @@ class MCCOMPO(I_OBJECT.OBJECT):
        return 0
 
     self.initModif()
-    #objet.deletePyxbObject()
+    objet.delObjPyxb()
+# PNPNPN a corriger
+    try :
+      objet.deleteRef()
+    except : pass
     self.mcListe.remove(objet)
     CONNECTOR.Emit(self,"supp",objet)
     objet.deleteMcGlobal()
@@ -221,6 +240,7 @@ class MCCOMPO(I_OBJECT.OBJECT):
           Ajoute le mot-cle name a la liste des mots-cles de
           l'objet MCCOMPOSE
       """
+      #print ('addEntite', name, pos)
       self.initModif()
       if type(name)==bytes or type(name) == str :
         # on est en mode creation d'un motcle 
@@ -228,15 +248,15 @@ class MCCOMPO(I_OBJECT.OBJECT):
         objet=self.definition.entites[name](val=None,nom=name,parent=self)
       else :
         # dans ce cas on est en mode copie d'un motcle
+        objet = name
         # Appel de la methode qui fait le menage dans les references
         # sur les concepts produits (verification que les concepts existent
         # dans le contexte de la commande courante).
-        objet = name
         objet.verifExistenceSd()
 
       # On verifie que l'ajout d'objet est autorise
       if self.ispermis(objet) == 0:
-        self.jdc.appli.afficheAlerte(tr("Erreur"),
+        self.jdc.editor.afficheAlerte(tr("Erreur"),
                                       tr("L'objet %(v_1)s ne peut  etre un fils de %(v_2)s",\
                                       {'v_1': objet.nom, 'v_2': self.nom}))
         self.finModif()
@@ -255,7 +275,9 @@ class MCCOMPO(I_OBJECT.OBJECT):
            self.mcListe.insert(pos,objet)
          # Il ne faut pas oublier de reaffecter le parent d'obj (si copie)
          objet.reparent(self)
-         #objet.addPyxbObject(self.findRangObjetDsArbre(objet))
+         if  self.cata.modeleMetier :
+             if isinstance(objet,MCList): objet[0].addObjPyxb(self.chercheIndiceDsLeContenu(objet))
+             else : objet.addObjPyxb(self.chercheIndiceDsLeContenu(objet))
          CONNECTOR.Emit(self,"add",objet)
          objet.updateMcGlobal()
          objet.updateConditionBloc()
@@ -266,12 +288,15 @@ class MCCOMPO(I_OBJECT.OBJECT):
          # on cree une liste d'objets. Dans le cas contraire,
          # on emet un message d'erreur.
          if not old_obj.isRepetable():
-            self.jdc.appli.afficheAlerte(tr("Erreur"),tr("L'objet %s ne peut pas etre repete", objet.nom))
+            self.jdc.editor.afficheAlerte(tr("Erreur"),tr("L'objet %s ne peut pas etre repete", objet.nom))
             self.finModif()
             return 0
          else:
             # une liste d'objets de meme type existe deja
             old_obj.addEntite(objet)
+            if  self.cata.modeleMetier :
+             if isinstance(objet,MCList): objet[0].addObjPyxb(self.chercheIndiceDsLeContenu(objet))
+             else : objet.addObjPyxb(self.chercheIndiceDsLeContenu(objet))
             self.finModif()
             return old_obj
 
@@ -281,7 +306,7 @@ class MCCOMPO(I_OBJECT.OBJECT):
         est bien permis, cad peut bien etre un fils de self, 
         Retourne 0 sinon 
     """
-    if type(fils) == bytes or type(fils) == str :
+    if type(fils) == bytes or type(fils) == str  :
       # on veut juste savoir si self peut avoir un fils de nom 'fils'
       if fils in self.definition.entites:
         return 1
@@ -347,6 +372,18 @@ class MCCOMPO(I_OBJECT.OBJECT):
            l_mc.append(l)
      return l_mc
 
+  def deepUpdateConditionBlocApresCreation(self):
+     # idem deepUpdateConditionBloc sauf qu on cherche les MC qui
+     # avait ete laisse de cote par la construction
+     #print ('Ihm deepUpdateConditionBloc', self.nom, self.reste_val)
+     if self.reste_val != {} : self.buildMcApresGlobal()
+     for mcobj in self.mcListe:
+        if mcobj.nature=="MCList" :
+           for obj in mcobj : obj.deepUpdateConditionBlocApresCreation() 
+        elif hasattr(mcobj,"deepUpdateConditionBlocApresCreation"):
+           mcobj.deepUpdateConditionBlocApresCreation()
+     
+
   def deepUpdateConditionBloc(self):
      """
         Parcourt l'arborescence des mcobject et realise l'update 
@@ -370,6 +407,7 @@ class MCCOMPO(I_OBJECT.OBJECT):
         Realise l'update des blocs conditionnels fils de self
      """
      dict = self.creeDictCondition(self.mcListe,condition=1)
+     #print ('_updateConditionBloc', dict)
      for k,v in self.definition.entites.items():
         if v.label != 'BLOC' :continue
         globs= self.jdc and self.jdc.condition_context or {}
@@ -443,3 +481,4 @@ class MCCOMPO(I_OBJECT.OBJECT):
     Validation.V_MCCOMPO.MCCOMPO.initModifUp(self)
     CONNECTOR.Emit(self,"valid")
 
+
index b0d49fe901db817bc875fb7026c98b4ec6b67c68..a95eba455ac37e65466f2bb6ef6057a726f60237 100644 (file)
@@ -48,6 +48,19 @@ class MCFACT(I_MCCOMPO.MCCOMPO):
      """
      return self.definition.min,self.definition.max
 
+  def getNomDsXML(self):
+     # en xml on a une sequence si max est superieur a 1
+     # sinon non
+     objet = self.parent.getChild(self.nom, restreint='oui')
+     if len(objet) > 1 :
+        index = objet.getIndex(self) 
+        nom = self.nom + "[" + str(index) + "]"
+     else :
+        if self.definition.max == 1 : nom = self.nom
+        else :  nom = self.nom+"[0]"
+     nomDsXML=self.parent.getNomDsXML()+"."+nom
+     return nomDsXML
+
 
   def getLabelText(self):
     """
index 84792a8db199d347c7d07ce845a5fe81db39f1c8..17f5da40532977ce50e684a5bc1a05f8b70e42bc 100644 (file)
@@ -80,7 +80,7 @@ class MCList:
       self.remove(obj)
       CONNECTOR.Emit(self,"supp",obj)
       self.updateConditionBloc()
-      #obj.deletePyxbObject()
+      obj.delObjPyxb()
       obj.supprime()
       self.etape.modified()
       self.finModif()
@@ -91,12 +91,12 @@ class MCList:
         Ajoute le mot cle facteur obj a la MCLIST a la position pos
         Retourne None si l'ajout est impossible
       """
-      if type(obj)==bytes or type(obj) == str :
+      if type(obj)==bytes or type(obj) == str  :
          # on est en mode creation d'un motcle
                   raise EficasException(tr("traitement non-prevu"))
 
       if not self.ajoutPossible():
-         self.jdc.appli.afficheAlerte(tr("Erreur"),
+         self.jdc.editor.afficheAlerte(tr("Erreur"),
                                        tr("L'objet %s ne peut pas etre ajoute", obj.nom))
          return None
 
@@ -287,5 +287,6 @@ class MCList:
      for motcle in self.data :
          motcle.deleteMcGlobal()
 
+
   #def __del__(self):
   #   print "__del__",self
index 15462a1d31720e2a07034350879ae0d446da1996..eef48d84390ee3db07d4ebd3803cb7f6c994b89c 100644 (file)
@@ -21,13 +21,8 @@ from __future__ import absolute_import
 import types
 import traceback
 from copy import copy
-from six.moves.reprlib import Repr
 from Extensions.i18n import tr
 from Extensions.eficas_exception import EficasException
-from six.moves import range
-myrepr = Repr()
-myrepr.maxstring = 100
-myrepr.maxother = 100
 
 from Noyau.N_utils import repr_float
 import Validation
@@ -45,6 +40,7 @@ from . import CONNECTOR
 from Noyau.N_ASSD import ASSD,assd
 from Noyau.N_GEOM import GEOM,geom
 from Noyau.N_CO import CO
+from Accas.A_ASSD import UserASSD
 import Accas
 # fin attention
 
@@ -65,10 +61,12 @@ class MCSIMP(I_OBJECT.OBJECT):
              self.monType=type_permis
              return self.valideMatrice(cr=cr)
       validite=Validation.V_MCSIMP.MCSIMP.isValid(self,cr=cr)
+
       if self.definition.siValide != None and validite:
             self.definition.siValide(self)
       return validite 
 
+
   def getNomConcept(self):
       p=self
       while p.parent :
@@ -96,9 +94,9 @@ class MCSIMP(I_OBJECT.OBJECT):
       # traitement d'un flottant isole
       txt = str(self.valeur)
       clefobj=self.getNomConcept()
-      if clefobj in self.jdc.appli.appliEficas.dict_reels :
-        if self.valeur in self.jdc.appli.appliEficas.dict_reels[clefobj]:
-           txt=self.jdc.appli.appliEficas.dict_reels[clefobj][self.valeur]
+      if clefobj in self.jdc.appliEficas.dict_reels :
+        if self.valeur in self.jdc.appliEficas.dict_reels[clefobj]:
+           txt=self.jdc.appliEficas.dict_reels[clefobj][self.valeur]
     elif type(self.valeur) in (list,tuple) :
       if self.valeur==[] or self.valeur == (): return str(self.valeur)
       # traitement des listes
@@ -107,9 +105,9 @@ class MCSIMP(I_OBJECT.OBJECT):
       for val in self.valeur:
         if type(val) == float : 
            clefobj=self.getNomConcept()
-           if clefobj in self.jdc.appli.appliEficas.dict_reels:
-              if val in self.jdc.appli.appliEficas.dict_reels[clefobj]:
-                 txt=txt + sep +self.jdc.appli.appliEficas.dict_reels[clefobj][val]
+           if clefobj in self.jdc.appliEficas.dict_reels:
+              if val in self.jdc.appliEficas.dict_reels[clefobj]:
+                 txt=txt + sep +self.jdc.appliEficas.dict_reels[clefobj][val]
               else :
                  txt=txt + sep + str(val)
            else :
@@ -152,9 +150,9 @@ class MCSIMP(I_OBJECT.OBJECT):
     val=self.valeur
     if type(val) == float : 
       clefobj=self.getNomConcept()
-      if clefobj in self.jdc.appli.appliEficas.dict_reels :
-        if val in self.jdc.appli.appliEficas.appliEficas.dict_reels[clefobj] :
-           return self.jdc.appli.appliEficas.dict_reels[clefobj][val]
+      if clefobj in self.jdc.appliEficas.dict_reels :
+        if val in self.jdc.appliEficas.appliEficas.dict_reels[clefobj] :
+           return self.jdc.appliEficas.dict_reels[clefobj][val]
     if type(val) != tuple :
       try:
         return val.getName()
@@ -191,16 +189,34 @@ class MCSIMP(I_OBJECT.OBJECT):
     return 0
 
   def waitAssd(self):
+    """ 
+        Methode booleenne qui retourne 1 si le MCS attend un objet de type ASSD ou UserASSD
+        ou derive, 0 sinon
+    """
+    for typ in self.definition.type:
+      if type(typ) == type or isinstance(typ,type):
+        if issubclass(typ,ASSD) and not issubclass(typ,GEOM) :
+          return 1
+    return 0
+
+  def waitUserAssd(self):
     """ 
         Methode booleenne qui retourne 1 si le MCS attend un objet de type ASSD 
         ou derive, 0 sinon
     """
     for typ in self.definition.type:
       if type(typ) == type or isinstance(typ,type):
-        if issubclass(typ,ASSD) and not issubclass(typ,GEOM):
+        if issubclass(typ,UserASSD) :
+          return 1
+    return 0
+
+  def waitUserAssdEnCreation(self):
+    for typ in self.definition.type:
+      if typ == 'createObject' :
           return 1
     return 0
 
+
   def waitAssdOrGeom(self):
     """ 
          Retourne 1 si le mot-cle simple attend un objet de type
@@ -318,16 +334,19 @@ class MCSIMP(I_OBJECT.OBJECT):
       if self.definition.position == 'global' : 
          self.etape.deepUpdateConditionBloc()
       elif self.definition.position == 'global_jdc' :
-         self.jdc.deepUpdateConditionBloc()
+         self.jdc.deepUpdateConditionBloc(self)
       else:
          self.parent.updateConditionBloc()
 
   def setValeur(self,new_valeur,evaluation='oui'):
-        #print ("setValeur Ihm/IMCSIMP ",new_valeur)
         self.initModif()
         self.valeur = new_valeur
         self.val = new_valeur
-        #self.setValeurObjPyxb(new_valeur)
+        if self.valeur and self.waitUserAssd() and not(self.waitUserAssdEnCreation()) : 
+           if type(self.valeur)  in (list,tuple):
+              for v in self.valeur : v.ajoutUtilisePar(self)
+           else : self.valeur.ajoutUtilisePar(self)
+        if self.isValid():self.setValeurObjPyxb(new_valeur)
         self.updateConditionBloc()
         self.etape.modified()
         self.finModif()
@@ -340,7 +359,6 @@ class MCSIMP(I_OBJECT.OBJECT):
     """
     sd = self.jdc.getSdAvantEtape(new_valeur,self.etape)
     #sd = self.jdc.getContexteAvant(self.etape).get(new_valeur,None)
-    #print sd
     if sd is not None:
       return sd,1
     lsd = self.jdc.chercheListAvant(self.etape,new_valeur) 
@@ -385,11 +403,14 @@ class MCSIMP(I_OBJECT.OBJECT):
 
   def evalValItem(self,new_valeur):
     """
-       Tente d'evaluer new_valeur comme un concept, un parametre, un objet Python
+       Tente d'evaluer new_valeur comme un concept, un parametre, un objet Python ou un UserASSD
        Si c'est impossible retourne new_valeur inchange
        argument new_valeur : string (nom de concept, de parametre, expression ou simple chaine)
     """
-    if self.etape and self.etape.parent:
+    if new_valeur in list(self.jdc.sdsDict.keys()) and self.waitUserAssd():
+       valeur=self.jdc.sdsDict[new_valeur]
+       return valeur
+    elif self.etape and self.etape.parent:
        valeur=self.etape.parent.evalInContext(new_valeur,self.etape)
        return valeur
     else:
@@ -417,10 +438,15 @@ class MCSIMP(I_OBJECT.OBJECT):
   def updateConcept(self,sd):
     if type(self.valeur) in (list,tuple) :
        if sd in self.valeur:
+         if self.objPyxb : 
+            newVal=[]
+            for v in self.valeur : newVal.append(v.nom)
+            self.setValeurObjPyxb(newVal)
          self.initModif()
          self.finModif()
     else:
        if sd == self.valeur:
+         if self.objPyxb :  self.setValeurObjPyxb(sd.nom)
          self.initModif()
          self.finModif()
 
@@ -433,22 +459,29 @@ class MCSIMP(I_OBJECT.OBJECT):
         du concept sd
         Attention aux matrices
     """
+##PNPNPN a tester
     if type(self.valeur) == tuple :
       if sd in self.valeur:
         self.initModif()
         self.valeur=list(self.valeur)
-        self.valeur.remove(sd)
+        while sd in self.valeur : self.valeur.remove(sd)
+        if self.objPyxb : 
+           newVal=[]
+           for v in self.valeur : newVal.append(v.nom)
+           if newVal == [] : self.delObjPyxb()
+           else : self.setValeurObjPyxb(sd.nom) 
         self.finModif()
     elif type(self.valeur) == list:
       if sd in self.valeur:
         self.initModif()
-        self.valeur.remove(sd)
+        while sd in self.valeur : self.valeur.remove(sd)
         self.finModif()
     else:
       if self.valeur == sd:
         self.initModif()
         self.valeur=None
         self.val=None
+        if self.objPyxb : self.setValeurObjPyxb()
         self.finModif()
     # Glut Horrible pour les matrices ???
     if sd.__class__.__name__== "variable":
@@ -469,7 +502,7 @@ class MCSIMP(I_OBJECT.OBJECT):
         Met a jour la valeur du mot cle simple suite au remplacement 
         du concept old_sd
     """
-    #print "replaceConcept",old_sd,sd
+    print ("replaceConcept",old_sd,sd)
     if type(self.valeur) == tuple :
       if old_sd in self.valeur:
         self.initModif()
@@ -490,18 +523,17 @@ class MCSIMP(I_OBJECT.OBJECT):
         self.val=sd
         self.finModif()
 
-  def setValeurCo(self,nom_co):
+  def setValeurCo(self,nomCO):
       """
-          Affecte a self l'objet de type CO et de nom nom_co
+          Affecte a self l'objet de type CO et de nom nomCO
       """
-      #print "setValeurCo",nom_co
       step=self.etape.parent
-      if nom_co == None or nom_co == '':
+      if nomCO == None or nomCO == '':
          new_objet=None
       else:
          # Avant de creer un concept il faut s'assurer du contexte : step 
          # courant
-         sd= step.getSdAutourEtape(nom_co,self.etape,avec='oui')
+         sd= step.getSdAutourEtape(nomCO,self.etape,avec='oui')
          if sd:
             # Si un concept du meme nom existe deja dans la portee de l'etape
             # on ne cree pas le concept
@@ -510,12 +542,12 @@ class MCSIMP(I_OBJECT.OBJECT):
          # Il faut neanmoins que la methode NommerSdProd de step gere les 
          # contextes en mode editeur
          # Normalement la methode  du Noyau doit etre surchargee
-         # On declare l'etape du mot cle comme etape courante pour NommerSdprod
+         # On declare l'etape du mot cle comme etape courante pour nommerSDProd
          cs= CONTEXT.getCurrentStep()
          CONTEXT.unsetCurrentStep()
          CONTEXT.setCurrentStep(step)
          step.setEtapeContext(self.etape)
-         new_objet = Accas.CO(nom_co)
+         new_objet = Accas.CO(nomCO)
          CONTEXT.unsetCurrentStep()
          CONTEXT.setCurrentStep(cs)
       self.initModif()
@@ -558,6 +590,20 @@ class MCSIMP(I_OBJECT.OBJECT):
              self.valeur = None
              self.finModif()
  
+  def renommeSdCree(self,nouveauNom):
+      print ( 'dans renommeSdCree', self.jdc.sdsDict, self.valeur)
+      if nouveauNom in self.jdc.sdsDict : return (0, 'concept deja existant')
+      if self.valeur == None : return (0, 'pb sur la valeur')
+      else :   self.valeur.renomme(nouveauNom)
+      return (1, 'concept renomme')
+      
+  def renommeSdCreeDsListe(self,objASSD, nouveauNom):
+      if nouveauNom in self.jdc.sdsDict : return (0, 'concept deja existant')
+      objASSD.renomme(nouveauNom)
+      return (1, 'concept renomme')
+      
+
+
   def getMinMax(self):
      """
      Retourne les valeurs min et max admissibles pour la valeur de self
@@ -579,7 +625,11 @@ class MCSIMP(I_OBJECT.OBJECT):
          if etape :
             del etape.mc_globaux[self.nom]
       elif self.definition.position == 'global_jdc' :
-         del self.jdc.mc_globaux[self.nom]
+# PNPNPN a debuger
+         print (self.nom)
+         try :
+           del self.jdc.mc_globaux[self.nom]
+         except : pass
 
   def updateMcGlobal(self):
      """
@@ -681,15 +731,14 @@ class MCSIMP(I_OBJECT.OBJECT):
       self.valeur=a
 
 
-  def nNbDeDistributions(self):
+  def nbDeDistributions(self):
        listeVariables=self.jdc.getDistributions(self.etape)
        self.monType.nbLigs=len(listeVariables)
        self.monType.nbCols=len(listeVariables)
       
-#--------------------------------------------------------------------------------
-#ATTENTION SURCHARGE : toutes les methodes ci apres sont des surcharges du Noyau et de Validation
-# Elles doivent etre reintegrees des que possible
+  def getNomDsXML(self):
+      nomDsXML=self.parent.getNomDsXML()+"."+self.nom
+      return nomDsXML
 
 
   def verifTypeIhm(self,val,cr='non'):
@@ -710,3 +759,14 @@ class MCSIMP(I_OBJECT.OBJECT):
   def initModifUp(self):
     Validation.V_MCSIMP.MCSIMP.initModifUp(self)
     CONNECTOR.Emit(self,"valid")
+
+  def deleteRef(self):
+    print ('je suis dans deleteRef', self.nom)
+    if self.definition.creeDesObjets :
+       if self.valeur : 
+          self.valeur.deleteReference() 
+       
+       for MC in self.valeur.utilisePar:
+           MC.state='changed' 
+           CONNECTOR.Emit(MC,"valid")
+
index 1013aaf3c39b7d1eba1474fd79a51b57f8704b42..56b08c19d914cac556558e5584d8b9e8a677618b 100644 (file)
@@ -23,6 +23,8 @@ from __future__ import absolute_import
 import Noyau
 
 from . import CONNECTOR
+import re
+conceptRE=re.compile(r'[a-zA-Z_]\w*$')
 
 class OBJECT:
   from Noyau.N_CO import CO
@@ -115,6 +117,7 @@ class OBJECT:
     else:
        return [self.nom.strip()]
 
+
   def getGenealogie(self):
     """ 
         Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC
@@ -163,5 +166,27 @@ class OBJECT:
   #def __del__(self):
   #   print "__del__",self
 
+  def nommeSd(self):
+  # surcharge dans I_ETAPE.py
+      if ( nom in dir(self.jdc.cata)) : return (0, nom + tr("mot reserve"))
+      if not conceptRE.match(nom):
+         return 0, tr("Un nom de concept doit etre un identificateur Python")
+      self.initModif()
+      #self.getSdProd()
+      #self.sd.nom = nom
+      #self.sdnom=nom
+      #self.parent.updateConceptAfterEtape(self,self.sd)
+      #self.finModif()
+      #return 1, tr("Nommage du concept effectue")
+
+  def deleteRef(self):
+  # doit etre surcharge dans MC_COMPO et MC_SIMP 
+      pass
+
+  def demandeRedessine(self):
+      CONNECTOR.Emit(self,"redessine")
+
+
+
 class ErrorObj(OBJECT):pass
 
index 56e1febfd2c9bc2b327495e1f89a4e333e209fdc..b0f19adc175a66ee8bb44d60fac31be591800e09 100644 (file)
@@ -47,12 +47,12 @@ class REGLE:
     return []
 
 
-  def enregistreXML(self,root,catalogueXml):
-      import xml.etree.ElementTree as ET
-      regleXml=ET.SubElement(root,'regles')
-      txt=""
-      for mot in self.getText().split('\n'):
-          mot.replace(' ','') 
-          txt=txt + mot + " "
-      regleXml.text= txt
+#  def enregistreXML(self,root,catalogueXml):
+#      import xml.etree.ElementTree as ET
+#      regleXml=ET.SubElement(root,'regles')
+#      txt=""
+#      for mot in self.getText().split('\n'):
+#          mot.replace(' ','') 
+#          txt=txt + mot + " "
+#      regleXml.text= txt
 
index 76230250d1c4dd48d9b8f12c0932efeef3672873..64ee7d2d9d19636dfab69963dcceb6782d5f9483 100644 (file)
@@ -30,14 +30,13 @@ import types,sys,os
 import traceback
 from . import typeNode
 
-import six
-from six.moves import range
 
 from PyQt5.QtWidgets import QTreeWidget , QTreeWidgetItem, QApplication, QMessageBox
-from PyQt5.QtGui import QIcon
-from PyQt5.QtCore  import Qt
-from Extensions.i18n import tr
-from .gereRegles import GereRegles
+from PyQt5.QtGui     import QIcon
+from PyQt5.QtCore    import Qt
+
+from  Extensions.i18n  import tr
+from .gereRegles       import GereRegles
 from .monChoixCommande import MonChoixCommande
 
 #------------------------------------------
@@ -45,17 +44,17 @@ class JDCTree( QTreeWidget,GereRegles ):
 #------------------------------------------
 
     def __init__( self, jdc_item, QWParent):        
-        #if hasattr(QWParent,'widgetTree') : 
-        self.editor       = QWParent
+    #----------------------------------------
+        self.editor      = QWParent
         self.plie=False
         if self.editor.widgetTree !=None  :
            QTreeWidget.__init__(self, self.editor.widgetTree ) 
            self.editor.verticalLayout_2.addWidget(self)
            if self.editor.enteteQTree=='complet':
-                 self.headerItem().setText(0,  "Commande   ")
+                 self.headerItem().setText(0, "Commande   ")
                  self.headerItem().setText(1, "Concept/Valeur")
            else :
-                 self.headerItem().setText(0,  "Commande   ")
+                 self.headerItem().setText(0, "Commande   ")
            self.setColumnWidth(0,200)
            self.setExpandsOnDoubleClick(False)
            self.setSelectionMode(3)
@@ -73,31 +72,25 @@ class JDCTree( QTreeWidget,GereRegles ):
         self.itemCollapsed.connect(self.handleCollapsedItem)
         self.itemExpanded.connect(self.handleExpandedItem)
 
-        #PNPNPN verifier dans quel cas on se trouve : affiche l arbre ou la commande
-        self.node_selected=self.racine
-        self.inhibeExpand=True
+        self.node_selected = self.racine
+        self.inhibeExpand  =  True
         self.expandItem(self.racine)
-        self.inhibeExpand=False
-        #print ("self.editor.maConfiguration.afficheCommandesPliees", self.editor.maConfiguration.afficheCommandesPliees)
+        self.inhibeExpand = False
         if self.racine.children !=[] :  
-           #self.editor.initSplitterSizes(3)
            if self.editor.maConfiguration.afficheCommandesPliees : self.racine.children[0].plieToutEtReaffiche()
-           else : self.racine.children[0].deplieToutEtReaffiche()
+           else                                                  : self.racine.children[0].deplieToutEtReaffiche()
            self.racine.children[0].fenetre.donnePremier()
         else : 
-          #self.editor.initSplitterSizes(2)
           self.racine.affichePanneau()
-          #print self.editor.splitter.sizes()
-        #PNPNPN
-        #pdb.set_trace()
 
     def contextMenuEvent(self,event) :
-        #print "contextMenuEvent"
-        coord=event.globalPos()
-        item= self.currentItem()
+    #---------------------------------
+        coord = event.globalPos()
+        item  = self.currentItem()
         self.handleContextMenu(item,coord)
 
     def handleContextMenu(self,item,coord):
+    #-------------------------------------
         """
         Private slot to show the context menu of the listview.
         
@@ -105,12 +98,14 @@ class JDCTree( QTreeWidget,GereRegles ):
         @param coord the position of the mouse pointer (QPoint)
         Attention : existeMenu permet de savoir si un menu est associe a cet item
         """
-        #print "handleContextMenu"
+        #print ("handleContextMenu")
         if item == None : return
-        self.itemCourant=item
+        self.itemCourant = item
         if item.existeMenu == 0 : return
+
         if item.menu == None:
            item.createPopUpMenu()
+        # PNPN reflechir a qqchose de generique pour remplacer cette fonctionnalite
         if item.menu != None:
            if item.item.getNom() == "DISTRIBUTION" and item.item.isValid() :
               item.Graphe.setEnabled(1)
@@ -118,30 +113,32 @@ class JDCTree( QTreeWidget,GereRegles ):
             
 
     def handleCollapsedItem(self,item):
-        #print "dans CollapsedItem", self.inhibeExpand  
+    #----------------------------------
+        #print ("dans CollapsedItem", self.inhibeExpand  )
         if self.inhibeExpand == True : return
-        self.itemCourant=item
+
         # On traite le cas de l item non selectionne
-        itemParent=item
-        while not (hasattr (itemParent,'getPanel')) : 
-           itemParent=itemParent.treeParent 
+        self.itemCourant = item
+        itemParent = item
+        while not (hasattr (itemParent,'getPanel')) : itemParent=itemParent.treeParent 
         if self.tree.node_selected != itemParent : 
              item.setExpanded(False)
              return
 
-        itemParent=item
         item.setPlie()
         item.plieToutEtReaffiche()
         item.select()
 
     def handleExpandedItem(self,item):
+    #----------------------------------
         #print ("handleExpandedItem pour ", item.item.nom, self.inhibeExpand)
         #import traceback
         #traceback.print_stack()
         if self.inhibeExpand == True : return
-        self.itemCourant=item
+
+        self.itemCourant  = item
         self.inhibeExpand = True 
-        itemParent=item
+        itemParent = item
         while not (hasattr (itemParent,'getPanel')) : 
            if itemParent.plie==True : itemParent.setDeplie()
            itemParent=itemParent.treeParent 
@@ -154,54 +151,57 @@ class JDCTree( QTreeWidget,GereRegles ):
 
 
     def handleOnItem(self,item,int):
+    #----------------------------------
         #print ("je passe dans handleOnItem pour ",self, item.item.nom, item, item.item, item.item.getLabelText())
         
         from InterfaceQT4 import composimp
         self.inhibeExpand = True 
-        self.itemCourant=item
-        itemParent=item
-        itemAvant=item
+        self.itemCourant  = item
+        itemParent        = item
+        itemAvant         = item
 
         while not (hasattr (itemParent,'getPanel')) : 
            if itemParent.plie==True : itemParent.setDeplie()
            itemAvant=itemParent
            itemParent=itemParent.treeParent 
 
-    
         if itemParent.fenetre != self.editor.fenetreCentraleAffichee : 
             estUneFeuille=(isinstance(item,composimp.Node))
+            # il faut afficher le parent
+            # Attention - Specification particuliere pour MT qui permet de nn afficher qu 1 niveau
+            # le catalogue contient cette indication dans fenetreIhm
+            #if estUneFeuille and itemParent.fenetreIhm=='deplie1Niveau' : 
+            #   itemAvant.afficheCeNiveau()
+            #   return
+            #if estUneFeuille                        : itemParent.affichePanneau()
             if itemParent.fenetreIhm == 'deplie1Niveau' :
                if item == itemParent : itemParent.affichePanneau()
                else                  : itemAvant.afficheCeNiveau()
             elif estUneFeuille       : itemParent.affichePanneau()
             elif self.editor.maConfiguration.afficheCommandesPliees : itemParent.plieToutEtReafficheSaufItem(item)
-            else                     :  itemParent.affichePanneau()
+            else                     : itemParent.affichePanneau()
 
 
         elif (isinstance(item,composimp.Node)) and item.fenetre : item.fenetre.rendVisible()
-        elif itemParent!=item:
-             self.tree.handleExpandedItem(item)
-             #item.fenetre.donnePremier()
-             #item.fenetre.rendActif()
-             #print 'il faut afficher le 1er'
+        elif itemParent!=item: self.tree.handleExpandedItem(item)
 
+        # aide
         try :
            fr = item.item.getFr()
            chaineDecoupee= fr.split('\n')
            if len(chaineDecoupee) > 3 :
               txt='\n'.join(chaineDecoupee[0:2])+'...\nfull help : double clicked on validity chip of '+ str(item.item.nom)+ ' in central widget'
            else : txt=fr
-
-           if self.editor: 
-              self.editor.afficheCommentaire(six.text_type(txt))
+           if self.editor: self.editor.afficheCommentaire(str(txt))
         except:
             pass
+
         item.select()
         self.inhibeExpand = False 
-        #print "je mets inhibeExpand a false handleOnItem"
 
 
     def choisitPremier(self,name):
+    #----------------------------
         self.editor.layoutJDCCHOIX.removeWidget(self.racine.fenetre)
         self.racine.fenetre.close()
         new_node=self.racine.appendBrother(name,'after')
@@ -214,6 +214,7 @@ PARAMETERS  = "PARAMETRE"
 class JDCNode(QTreeWidgetItem,GereRegles):
 #------------------------------------------
     def __init__( self, treeParent, item, itemExpand=False, ancien=False ):
+    #----------------------------------------------------------------------
         #print ("creation d'un noeud : ", item, " ",item.nom,"", treeParent, self)
         #self.a=0
 
@@ -222,21 +223,21 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         self.vraiParent  = treeParent
         self.treeParent  = treeParent
         self.tree        = self.treeParent.tree
-        self.editor     = self.treeParent.editor
+        self.editor      = self.treeParent.editor
         self.appliEficas = treeParent.appliEficas
-        self.JESUISOFF=0
+        self.JESUISOFF   = 0
+        self.firstAffiche = True
         self.childrenComplete=[]
 
                         
         from InterfaceQT4 import compocomm
         from InterfaceQT4 import compoparam
         from InterfaceQT4 import composimp
-        if   (isinstance(self.item,compocomm.COMMTreeItem)) : name=tr("Commentaire")
-        elif (isinstance(self.item,compoparam.PARAMTreeItem)) : name=tr(str(item.getLabelText()[0]))
-        #else:   name  = tr(str(tr(item.getLabelText()[0]))+" :")
-        else:   name  = tr(item.getLabelText()[0])
-        if item.nom != tr(item.nom) : name = str(tr(item.nom)+" :")
-        value = tr(str( item.getText() ) )
+        if   (isinstance(self.item,compocomm.COMMTreeItem))   : name = tr("Commentaire")
+        elif (isinstance(self.item,compoparam.PARAMTreeItem)) : name = tr(str(item.getLabelText()[0]))
+        else                                                  : name = tr(item.getLabelText()[0])
+        if item.nom != tr(item.nom)                           : name = str(tr(item.nom)+" :")
+        value = tr(str(item.getText() ) )
        
         # si specialisation de la fenetre
         if self.item.object.definition == None : self.fenetreIhm = None
@@ -247,11 +248,11 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         else : mesColonnes=(name,)
 
         if self.treeParent.plie==True :
-            self.plie        = True
-            self.appartientAUnNoeudPlie=True
+            self.plie                   = True
+            self.appartientAUnNoeudPlie = True
             if self.treeParent.item.isMCList() : self.appartientAUnNoeudPlie =  self.treeParent.appartientAUnNoeudPlie
         else :
-            self.plie        = False
+            self.plie                   = False
             self.appartientAUnNoeudPlie = False
 
         #if item.nom == "POUTRE" :print "creation d'un noeud : ", item, " ",item.nom,"", self.treeParent, self.appartientAUnNoeudPlie , self.plie
@@ -294,6 +295,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         self.item.connect("valid",self.onValid,())
         self.item.connect("supp" ,self.onSupp,())
         self.item.connect("add"  ,self.onAdd,())
+        self.item.connect("redessine"  ,self.onRedessine,())
 
         self.state=""
         self.fenetre=None
@@ -306,6 +308,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
 
 
     def buildChildren(self,posInsertion=10000):
+    #------------------------------------------
         """ Construit la liste des enfants de self """
         """ Se charge de remettre les noeuds Expanded dans le meme etat """
         #print ("*********** buildChildren ",self,self.item, self.item.nom)
@@ -319,7 +322,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
             else : self.listeItemExpanded.append(enfant.item)
 
         for enfant in self.childrenComplete :
-            parent=enfant.treeParent
+            parent = enfant.treeParent
             parent.removeChild(enfant)
             enfant.JESUISOFF=1
          
@@ -341,6 +344,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
 
         
     def chercheNoeudCorrespondant(self,objSimp):
+    #-------------------------------------------
         sublist = self.item._getSubList()
         for node in self.childrenComplete:
             if node.item.object==objSimp : return node
@@ -348,6 +352,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
 
 
     def afficheCeNiveau(self):
+    #-------------------------
         #print ('afficheCeNiveau pour ', self.item.nom, self.item.getLabelText())
         for indiceWidget in range(self.editor.widgetCentraleLayout.count()):
             widget=self.editor.widgetCentraleLayout.itemAt(indiceWidget)
@@ -359,12 +364,12 @@ class JDCNode(QTreeWidgetItem,GereRegles):
             self.editor.fenetreCentraleAffichee.deleteLater()
 
         from monWidgetNiveauFact import MonWidgetNiveauFact, MonWidgetNiveauFactTableau
-        maDefinition=self.item.get_definition()
-        monObjet=self.item.object
+        maDefinition = self.item.get_definition()
+        monObjet     = self.item.object
         if maDefinition.fenetreIhm=='Tableau' : self.maFenetreCadre=MonWidgetNiveauFactTableau(self,self.editor,maDefinition,monObjet)
         else : self.maFenetreCadre=MonWidgetNiveauFact(self,self.editor,maDefinition,monObjet)
         
-        self.fenetre=self.maFenetreCadre
+        self.fenetre = self.maFenetreCadre
         self.editor.widgetCentraleLayout.addWidget(self.maFenetreCadre)
         self.editor.fenetreCentraleAffichee=self.maFenetreCadre
         self.select()
@@ -372,45 +377,49 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         
    
     def getPanelModifie(self):
+    #-------------------------
        
         if self.fenetreIhm == None : return None
-        if self.fenetreIhm=='deplie1Niveau':
+        if self.fenetreIhm =='deplie1Niveau':
            from InterfaceQT4.monWidgetCommandeDeplie1Niveau import MonWidgetCommandeDeplie1Niveau
            return MonWidgetCommandeDeplie1Niveau (self,self.editor ,self.item.object)
         return None
         
 
     def affichePanneau(self) :
-        #if self.editor.code == 'ASTER' and not(self.item.isActif()) : 
-        # posera des pb si un code decide d appeler FIN un mot clef
-        # on resoudera a ce moment la
-        # pour l pas de poussiere sous le tapis
+    #-------------------------
         #print ('_________________ds affichePanneau pour', self.item.nom)
+        # pour l instant pas d inactif
         if  not(self.item.isActif()) : 
             from .monWidgetInactif import MonWidgetInactif
             self.fenetre = MonWidgetInactif(self,self.editor)
         else:
            itemParent=self
            while not (hasattr (itemParent,'getPanel')) : itemParent=itemParent.treeParent 
-           if itemParent!=self : 
+           if itemParent != self : 
               #print ('j appelle affichePanneau pour ', itemParent.item.nom , 'par', self.item.nom)
               itemParent.affichePanneau()
               #print ('fin _________________ds affichePanneau pour', self.item.nom)
               return
-           self.fenetre=self.getPanelModifie()
+
+           self.fenetre = self.getPanelModifie()
            if self.fenetre == None : self.fenetre=self.getPanel()
            self.editor.restoreSplitterSizes()
          
         for indiceWidget in range(self.editor.widgetCentraleLayout.count()):
-            widget=self.editor.widgetCentraleLayout.itemAt(indiceWidget)
+            widget = self.editor.widgetCentraleLayout.itemAt(indiceWidget)
             self.editor.widgetCentraleLayout.removeItem(widget)
+
         # ceinture et bretelle
         #print 'old fenetre = ',self.editor.fenetreCentraleAffichee
         if self.editor.fenetreCentraleAffichee != None : 
-            self.editor.widgetCentraleLayout.removeWidget(self.editor.fenetreCentraleAffichee)
-            self.editor.fenetreCentraleAffichee.setParent(None)
-            self.editor.fenetreCentraleAffichee.close()
-            self.editor.fenetreCentraleAffichee.deleteLater()
+            try :
+              self.editor.widgetCentraleLayout.removeWidget(self.editor.fenetreCentraleAffichee)
+              self.editor.fenetreCentraleAffichee.setParent(None)
+              self.editor.fenetreCentraleAffichee.close()
+              self.editor.fenetreCentraleAffichee.deleteLater()
+            except :
+              pass
 
         self.editor.widgetCentraleLayout.addWidget(self.fenetre)
         #print ("j ajoute ", self.fenetre, self.fenetre.node.item.nom)
@@ -426,10 +435,12 @@ class JDCNode(QTreeWidgetItem,GereRegles):
           
 
     def createPopUpMenu(self):
+    #-------------------------
         #implemente dans les noeuds derives si necessaire
         self.existeMenu = 0
 
     def commentIt(self):
+    #-------------------------
         """
         Cette methode a pour but de commentariser la commande pointee par self
         """
@@ -448,6 +459,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
             QMessageBox.critical( self.editor, "TOO BAD",str(e))
         
     def unCommentIt(self):
+    #-------------------------
         """
         Realise la decommentarisation de self
         """
@@ -462,6 +474,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
             QMessageBox.critical( self.editor, "Erreur !",str(e))
         
     def addComment( self, after=True ):
+    #-----------------------------------
         """
         Ajoute un commentaire a l'interieur du JDC :
         """
@@ -473,6 +486,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         return self.appendBrother( COMMENT, pos )
                 
     def addParameters( self, after=True ):
+    #-------------------------------------
         """
         Ajoute un parametre a l'interieur du JDC :
         """
@@ -484,6 +498,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
     
     
     def select( self ):
+    #------------------
         """
         Rend le noeud courant (self) selectionne et deselectionne
         tous les autres
@@ -495,9 +510,10 @@ class JDCNode(QTreeWidgetItem,GereRegles):
                                
     #------------------------------------------------------------------
     # Methodes de creation et destruction de noeuds
-    # Certaines de ces methodes peuvent etre appelees depuis l'externe
     #------------------------------------------------------------------
+
     def appendBrother(self,name,pos='after',plier=False):
+    #----------------------------------------------------
         """
         Permet d'ajouter un objet frere a l'objet associe au noeud self
         par defaut on l'ajoute immediatement apres 
@@ -510,19 +526,20 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         
         if self.treeParent != self.vraiParent :
           index = self.vraiParent.children.index(self)
-          if   pos == 'before': index = index
-          elif pos == 'after': index = index +1
+          if   pos == 'before' : index = index
+          elif pos == 'after'  : index = index +1
           return self.vraiParent.appendChild(name,pos=index,plier=plier)
         else :
           index = self.treeParent.children.index(self)
           if   pos == 'before': index = index
-          elif pos == 'after': index = index +1
+          elif pos == 'after' : index = index +1
           else:
-              print(six.text_type(pos), tr("  n'est pas un index valide pour appendBrother"))
+              print(pos, tr("  n'est pas un index valide pour appendBrother"))
               return 0
           return self.treeParent.appendChild(name,pos=index,plier=plier)
 
     def verifiePosition(self,name,pos,aLaRacine=False):
+    #----------------------------------------------------
         if name not in self.editor.readercata.Classement_Commandes_Ds_Arbre : return True
         indexName=self.editor.readercata.Classement_Commandes_Ds_Arbre.index(name)
 
@@ -552,6 +569,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         return True
 
     def appendChild(self,name,pos=None,plier=False):
+    #------------------------------------------------
         """
            Methode pour ajouter un objet fils a l'objet associe au noeud self.
            On peut l'ajouter en debut de liste (pos='first'), en fin (pos='last')
@@ -564,71 +582,67 @@ class JDCNode(QTreeWidgetItem,GereRegles):
 
          
         self.editor.initModif()
-        if pos == 'first':
-            index = 0
-        elif pos == 'last':
-            index = len(self.children)
-        elif type(pos) == int :
-            # position fixee
-            index = pos
-        elif type(pos) == object:
-        #elif type(pos) == types.InstanceType:
-            # pos est un item. Il faut inserer name apres pos
-            index = self.item.getIndex(pos) +1
-        #elif type(name) == types.InstanceType:
-        elif type(name) == object:
-            index = self.item.getIndexChild(name.nom)
-        else:
-            index = self.item.getIndexChild(name)
+        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)
+        else                      : index = self.item.getIndexChild(name)
 
         # si on essaye d inserer a la racine
         if (isinstance(self.treeParent,JDCTree) and index==0) :
            verifiePosition=self.verifiePosition(name,'first',aLaRacine=True)
            if not verifiePosition : return 0
 
-        self.tree.inhibeExpand=True
-        obj=self.item.addItem(name,index) # emet le signal 'add'
-        if obj is None:obj=0
-        if obj == 0:return 0
+        self.tree.inhibeExpand = True
+        obj = self.item.addItem(name,index) # emet le signal 'add'
+        if obj is None : obj=0
+        if obj == 0    :return 0
+
         try :
         #if 1 :
-           child=self.children[index]
+           child = self.children[index]
            if plier == True : child.setPlie()
            else             : child.setDeplie() 
         except :
            child=self.children[index]
+
         try : 
            if len(obj) > 1 : self.buildChildren()
         except : pass
+
         self.tree.inhibeExpand=False
         #print (" fin append child")
         return child
 
     def deplace(self):
+    #-----------------
         self.editor.initModif()
         index = self.treeParent.children.index(self) - 1 
         if index < 0 : index =0
         ret=self.treeParent.item.deplaceEntite(self.item.getObject())
 
     def delete(self):
+    #----------------
         """ 
             Methode externe pour la destruction de l'objet associe au noeud
         """
         self.editor.initModif()
         index = self.vraiParent.children.index(self) - 1 
         if index < 0 : index =0
+
         recalcule=0
         if self.item.nom == "VARIABLE" :
            recalcule=1
            jdc=self.item.jdc
+
         ret,commentaire=self.vraiParent.item.suppItem(self.item)
-        if ret==0 :
-          self.editor.afficheInfos(commentaire,Qt.red)
-        else :
-          self.editor.afficheInfos(commentaire)
+        if ret==0 : self.editor.afficheInfos(commentaire,Qt.red)
+        else      : self.editor.afficheInfos(commentaire)
         self.treeParent.buildChildren()
         if self.treeParent.childrenComplete : toselect=self.treeParent.childrenComplete[index]
-        else: toselect=self.treeParent
+        else                                : toselect=self.treeParent
+
         if recalcule : jdc.recalculeEtatCorrelation()
         if ret==0 :
             if self.treeParent.childrenComplete :
@@ -636,6 +650,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
                 notdeleted.select()
         else :
             toselect.select()
+
         from InterfaceQT4 import compojdc
         # cas ou on detruit dans l arbre sans affichage
         if isinstance(self.treeParent,compojdc.Node) : 
@@ -646,6 +661,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
            self.treeParent.fenetre.reaffiche(toselect)
 
     def deleteMultiple(self,liste=()):
+    #--------------------------------
         """ 
             Methode externe pour la destruction d une liste de noeud
         """
@@ -680,71 +696,82 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         toselect.select()
         toselect.affichePanneau()
 #        
-#    #------------------------------------------------------------------
-    def onValid(self):        
+#    ------------------------------------------------------------------
 
+    def onValid(self):        
+    #-----------------
         #print ("onValid pour ", self.item.nom)
         if self.JESUISOFF==1 : return
+
         if hasattr(self,'fenetre') and self.fenetre: 
-           try :
-             self.fenetre.setValide()
-           except :
-            # print "onValid pour ", self.item.nom, self,'pb'
-            pass
+           try : self.fenetre.setValide()
+           except : pass
 
+        # PNPN  lignes suivantes a repenser
         if (self.item.nom == "VARIABLE" or self.item.nom == "DISTRIBUTION") and self.item.isValid():
-           self.item.jdc.recalculeEtatCorrelation()
-        if hasattr(self.item,'forceRecalcul'):
-           self.forceRecalculChildren(self.item.forceRecalcul)
+            self.item.jdc.recalculeEtatCorrelation()
+        if hasattr(self.item,'forceRecalcul') : self.forceRecalculChildren(self.item.forceRecalcul)
         self.editor.initModif()
         
         self.updateNodeValid()
         self.updateNodeLabel()
         self.updateNodeTexte()
 
+
     def onAdd(self,object):
-        if self.JESUISOFF==1 : return
+    #----------------------
         #print ("onAdd pour ", self.item.nom, object)
+        if self.JESUISOFF == 1 : return
         self.editor.initModif()
         self.updateNodes()
-        # PN -- non necessaire si item=jdc
         if hasattr(self.item,'jdc'): self.item.jdc.aReafficher=True
  
     def onSupp(self,object):
+    #-----------------------
+        #print ("onSup pour ", self.item.nom, object)
+        #import traceback
+        #traceback.print_stack()
         if self.JESUISOFF==1 : return
-        #print "onSup pour ", self.item.nom, object
         self.editor.initModif()
         self.updateNodes()
-        # PN -- non necessaire si item=jdc
         if hasattr(self.item,'jdc'): self.item.jdc.aReafficher=True
          
-
+    def onRedessine(self):
+    #---------------------
+        print ('dans redessine pour', self)
+        self.updateNodeTexte()
+        #if not(self.fenetre): return
+        # a priori l objet C++ n est plus la si la fenetre n est pas visible
 
     def updateNodeValid(self):
+    #-----------------------
         """Cette methode remet a jour la validite du noeud (icone)
            Elle appelle isValid
         """
-        repIcon=self.appliEficas.repIcon
-        couleur=self.item.getIconName()
+        repIcon  = self.appliEficas.repIcon
+        couleur  = self.item.getIconName()
         monIcone = QIcon(repIcon+"/" + couleur + ".png")
         self.setIcon(0,monIcone)
 
 
 
     def updateNodeLabel(self):
+    #-------------------------
         """ Met a jour le label du noeud """
-        #print "NODE updateNodeLabel", self.item.getLabelText()
+        #print ("NODE updateNodeLabel", self.item.getLabelText())
         labeltext,fonte,couleur = self.item.getLabelText()
         # PNPN a reflechir
         if self.item.nom != tr(self.item.nom) : labeltext = str(tr(self.item.nom)+" :")
         self.setText(0, tr(labeltext))
     
     def updateNodeLabelInBlack(self):
+    #-------------------------------
         if hasattr(self.appliEficas,'noeudColore'): 
             self.appliEficas.noeudColore.setForeground(0,Qt.black)
             self.appliEficas.noeudColore.updateNodeLabel
     
     def updateNodeLabelInBlue(self):
+    #-------------------------------
         if hasattr(self.appliEficas,'noeudColore'): self.appliEficas.noeudColore.setForeground(0,Qt.black)
         self.setForeground(0,Qt.blue)
         labeltext,fonte,couleur = self.item.getLabelText()
@@ -753,6 +780,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         self.appliEficas.noeudColore=self
 
     def updatePlusieursNodeLabelInBlue(self,liste):
+    #----------------------------------------------
         if hasattr(self.appliEficas,'listeNoeudsColores'):
            for noeud in self.appliEficas.listeNoeudsColores:
                noeud.setTextColor( 0,Qt.black)
@@ -760,55 +788,60 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         self.appliEficas.listeNoeudsColores=[]
         for noeud in liste :
             noeud.setTextColor( 0,Qt.blue )
-            labeltext,fonte,couleur = noeud.item.getLabelText()
             if item.nom != tr(item.nom) : labeltext = str(tr(item.nom)+" :")
+            labeltext,fonte,couleur = noeud.item.getLabelText()
             noeud.setText(0, labeltext)        
             self.appliEficas.listeNoeudsColores.append(noeud)
 
     def updateNodeTexteInBlack(self):
+    #--------------------------------
         """ Met a jour les noms des SD et valeurs des mots-cles """
         self.setTextColor( 1,Qt.black )
         value = self.item.getText()
         self.setText(1, value)
 
     def updateNodeTexte(self):
+    #----------------------------
         """ Met a jour les noms des SD et valeurs des mots-cles """
         value = self.item.getText()
         self.setText(1, value)
         
 
     def updateNodeTexteInBlue(self):
+    #--------------------------------
         self.setTextColor( 1,Qt.blue )
         value = self.item.getText()
         self.setText(1, value)
 
     def updateNodes(self):
+    #--------------------------------
         #print 'NODE updateNodes', self.item.getLabelText()
         self.buildChildren()
 
     def updateValid(self) :
+    #----------------------
         """Cette methode a pour but de mettre a jour la validite du noeud
            et de propager la demande de mise a jour a son parent
         """
         #print "NODE updateValid", self.item.getLabelText()
         self.updateNodeValid()
-        try :
-          self.treeParent.updateValid()
-        except:
-          pass
+        try   : self.treeParent.updateValid()
+        except: pass
             
     def updateTexte(self):
+    #----------------------
         """ Met a jour les noms des SD et valeurs des mots-cles """
         #print "NODE updateTexte", self.item.getLabelText()
-        self.updateNodeVexte()
+        self.updateNodeTexte()
         if self.isExpanded() :
             for child in self.children:
                 if child.isHidden() == false : child.updateTexte()
 
 
     def forceRecalculChildren(self,niveau):
-        if self.state=='recalcule' : 
-           self.state=""
+    #--------------------------------------
+        if self.state == 'recalcule' : 
+           self.state = ""
            return
         self.state='recalcule'
         if hasattr(self.item,'object'):
@@ -819,6 +852,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         
 
     def doPaste(self,node_selected,pos='after'):
+    #--------------------------------------------
         """
             Declenche la copie de l'objet item avec pour cible
             l'objet passe en argument : node_selected
@@ -830,6 +864,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         return child
 
     def doPasteCommande(self,objet_a_copier,pos='after'):
+    #-----------------------------------------------------
         """
           Realise la copie de l'objet passe en argument qui est necessairement
           un onjet
@@ -843,6 +878,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         return child
 
     def doPastePremier(self,objet_a_copier):
+    #---------------------------------------
         """
            Realise la copie de l'objet passe en argument (objet_a_copier)
         """
@@ -851,6 +887,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         return child
 
     def plieToutEtReafficheSaufItem(self, itemADeplier):
+    #---------------------------------------------------
         self.inhibeExpand=True
         from InterfaceQT4 import compojdc
         if (isinstance(self, compojdc.Node)) :
@@ -869,6 +906,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         self.inhibeExpand=False
 
     def plieToutEtReaffiche(self):
+    #-----------------------------
         #print ('plieToutEtReaffiche', self.item.getNom())
         from InterfaceQT4 import compojdc
         if (isinstance(self, compojdc.Node)) : self.affichePanneau(); return 
@@ -883,12 +921,14 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         #print ("fin plieToutEtReaffiche", self.item.getNom())
 
     def deplieToutEtReaffiche(self):
+    #-----------------------------
         self.editor.deplier = True
         for item in self.children :
             item.setDeplie()
         self.affichePanneau()
 
     def setPlie(self):
+    #-----------------
         #print "je mets inhibeExpand a true dans setPlie"
         #print ("je suis dans plieTout", self.item.getNom())
         from . import compojdc
@@ -907,6 +947,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         #       item.appartientAUnNoeudPlie=False
 
     def setPlieChildren(self):
+    #-----------------------------
         self.plie=True
         from InterfaceQT4 import composimp
         if isinstance(self,composimp.Node) : return
@@ -934,6 +975,9 @@ class JDCNode(QTreeWidgetItem,GereRegles):
 
 
     def setDeplie(self):
+    #-----------------------------
+        #print "dans setPlieChildren pour", self.item.nom
+        #print "je mets inhibeExpand a true dans setDeplie"
         self.tree.inhibeExpand=True
         self.plie=False
         self.tree.expandItem(self)
@@ -942,6 +986,7 @@ class JDCNode(QTreeWidgetItem,GereRegles):
         #print "je mets inhibeExpand a false dans setDePlie"
 
     def setDeplieChildren(self):
+    #-----------------------------
         #print "dans setDeplieChildren appartientAUnNoeudPlie=False ", self.item.getLabelText()
         for c in self.children :
             c.setDeplieChildren()
@@ -951,11 +996,10 @@ class JDCNode(QTreeWidgetItem,GereRegles):
             c.plie=False
        
     def selectAvant(self):
+    #-----------------------------
         i=self.item.jdc.etapes.index(self.item.object)
-        try :
-           cherche=self.item.jdc.etapes[i-1]
-        except :
-           cherche=self.item.jdc.etapes[-1]
+        try    : cherche=self.item.jdc.etapes[i-1]
+        except : cherche=self.item.jdc.etapes[-1]
         node=None
         for i in self.tree.racine.children :
             if i.item.object== cherche  : 
@@ -966,11 +1010,10 @@ class JDCNode(QTreeWidgetItem,GereRegles):
           node.select()
 
     def selectApres(self):
+    #---------------------
         i=self.item.jdc.etapes.index(self.item.object)
-        try :
-           cherche=self.item.jdc.etapes[i+1]
-        except :
-           cherche=self.item.jdc.etapes[0]
+        try    : cherche=self.item.jdc.etapes[i+1]
+        except : cherche=self.item.jdc.etapes[0]
         node=None
         for i in self.tree.racine.children :
             if i.item.object== cherche  : 
@@ -980,12 +1023,3 @@ class JDCNode(QTreeWidgetItem,GereRegles):
            node.affichePanneau()
            node.select()
 
-    def ouvreLesNoeudsDsLArbre(self):
-        return
-        self.inhibeExpand = True 
-        for i in range(self.childCount()):
-            self.child(i).inhibeExpand=True
-            self.child(i).setExpanded(True)
-            self.child(i).ouvreLesNoeudsDsLArbre()
-            self.child(i).inhibeExpand=False
-        self.inhibeExpand = False 
index f41f7c073485cc0cf69ddee4b41c49e4e75fe277..a05c21e8293a1e61719d0feeb138efb8625b55e1 100644 (file)
@@ -48,11 +48,6 @@ class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
 class BLOCTreeItem(compofact.FACTTreeItem):
   itemNode=Node
 
-  #def get_objet(self,name) :
-  #    for v in self.object.mcListe:
-  #        if v.nom == name : return v
-  #    return None
-    
   def isCopiable(self):
     return 0
 
index 8a83ce8ffddefaf09d60257d16ef90c4a0349a23..8c501b79784fb8ba6f5198e3a0b733397cff8c6f 100644 (file)
@@ -20,7 +20,6 @@
 
 from __future__ import absolute_import
 
-from PyQt5.QtWidgets import QAction
 
 from Editeur     import Objecttreeitem
 from . import browser
@@ -38,6 +37,7 @@ class Node(browser.JDCNode,typeNode.PopUpMenuNodePartiel):
 
     def createPopUpMenu(self):
         typeNode.PopUpMenuNodePartiel.createPopUpMenu(self)
+        from PyQt5.QtWidgets import QAction
         self.Decommente = QAction(tr("decommenter"),self.tree)
         self.Decommente.triggered.connect(self.decommenter)
         self.Decommente.setStatusTip(tr("Decommente la commande "))
@@ -55,7 +55,6 @@ class Node(browser.JDCNode,typeNode.PopUpMenuNodePartiel):
         debComm=self.item.getText()
         self.setText(1,tr(debComm))
 
-
     
 class COMMTreeItem(Objecttreeitem.ObjectTreeItem):
     itemNode=Node    
index 8a9d66fbb5ca01237a6d6650abb814060fa72c63..57dd1df848df934f1c75f876fe9cf5743c877867 100644 (file)
@@ -25,34 +25,35 @@ from Extensions.i18n import tr
 
 
 from Editeur import Objecttreeitem
-import six
 import traceback
 
 
 class Node(browser.JDCNode,typeNode.PopUpMenuNodePartiel):
 
-    def getPanelGroupe(self,parentQt,commande,insertIn=-1):
+    def getPanelGroupe(self,parentQt,commande):
+    # ----------------------------------------
         maDefinition=self.item.get_definition()
         monObjet=self.item.object
         monNom=self.item.nom
         maCommande=commande
         if hasattr(parentQt,'niveau'): self.niveau=parentQt.niveau+1
         else : self.niveau=1
-        #if  hasattr(self,'plie') :print self.item.nom, self.plie
-        #if maDefinition.fenetreIhm == 'Tableau':
-        #   from InterfaceQt4.monWidgetFact import MonWidgetFactTableau
-        #   widget=MonWidgetFactTableau(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande)
-        #elif  hasattr(self,'plie') and self.plie==True : 
         if  hasattr(self,'plie') and self.plie==True : 
            from InterfaceQT4.monWidgetFactPlie import MonWidgetFactPlie
-           widget=MonWidgetFactPlie(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande,insertIn)
+           widget=MonWidgetFactPlie(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande)
+        elif self.editor.maConfiguration.afficheFirstPlies and self.firstAffiche: 
+           self.firstAffiche = False
+           self.setPlie()
+           from InterfaceQT4.monWidgetFactPlie import MonWidgetFactPlie
+           widget=MonWidgetFactPlie(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande)
         else:
            from InterfaceQT4.monWidgetFact import MonWidgetFact
-           widget=MonWidgetFact(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande,insertIn)
+           widget=MonWidgetFact(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande)
         return widget
 
 
     def createPopUpMenu(self):
+    # ------------------------
         typeNode.PopUpMenuNodeMinimal.createPopUpMenu(self)
 
 
@@ -60,12 +61,15 @@ 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
@@ -76,18 +80,18 @@ class FACTTreeItem(Objecttreeitem.ObjectTreeItem):
       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"
+  # ----------------
+    if self.object.isValid()  : return "ast-green-los"
+    elif self.object.isOblig(): return "ast-red-los"
+    else                      : return "ast-yel-los"
 
   #PNPN ????
   #def keys(self):
@@ -95,6 +99,7 @@ class FACTTreeItem(Objecttreeitem.ObjectTreeItem):
   #  return keys
 
   def getSubList(self):
+  # ----------------
       """
          Reactualise la liste des items fils stockes dans self.sublist
       """
@@ -115,7 +120,7 @@ class FACTTreeItem(Objecttreeitem.ObjectTreeItem):
             # nouvel objet : on cree un nouvel item
             def setFunction(value, object=obj):
                 object.setval(value)
-            item = self.makeObjecttreeitem(self.appli, obj.nom + " : ", obj, setFunction)
+            item = self.makeObjecttreeitem(self.appliEficas, obj.nom + " : ", obj, setFunction)
             sublist[pos]=item
          pos=pos+1
 
@@ -138,7 +143,7 @@ class FACTTreeItem(Objecttreeitem.ObjectTreeItem):
          return (0, tr('Impossible de supprimer un mot-cle obligatoire '))
 
       if self.object.suppEntite(itemobject):
-         message = tr("Mot-cle %s supprime")+ six.text_type(itemobject.nom)
+         message = tr("Mot-cle %s supprime")+ itemobject.nom
          return (1, message)
       else:
          return (0,tr('Pb interne : impossible de supprimer ce mot-cle'))
index 111a4e982f71bbf3ff0899e82775de9e052f69d7..87121de436b0d467bbd08715c118c28487d30d86 100644 (file)
@@ -115,7 +115,7 @@ class JDCTreeItem(Objecttreeitem.ObjectTreeItem):
     for obj in liste:
        if sublist[pos] is None:
           # nouvel objet : on cree un nouvel item
-          item = self.makeObjecttreeitem(self.appli, obj.nom + " : ", obj)
+          item = self.makeObjecttreeitem(self.appliEficas, obj.nom + " : ", obj)
           sublist[pos]=item
        pos=pos+1
 
index 64a9d63ff240800dad49e09ed5c33a0ce5e6a42c..9a1fcbb2098bbae26f28a8ae2b9cfbf5c6e277fe 100644 (file)
@@ -30,9 +30,6 @@ from Extensions.i18n import tr
 from InterfaceQT4 import compooper
 from InterfaceQT4 import browser
 from InterfaceQT4 import typeNode
-from PyQt5.QtWidgets import QAction
-from PyQt5.QtCore import Qt
-
 
 
 class MACRONode(browser.JDCNode,typeNode.PopUpMenuNode):         
@@ -44,20 +41,11 @@ class MACRONode(browser.JDCNode,typeNode.PopUpMenuNode):
 
     def createPopUpMenu(self):
       typeNode.PopUpMenuNode.createPopUpMenu(self)
-      if ("AFFE_CARA_ELEM" in self.item.getGenealogie()) and self.editor.salome:
-           self.ViewElt = QAction(tr('View3D'),self.tree)
-           self.ViewElt.triggered.connect(self.view3D)
-           self.ViewElt.setStatusTip(tr("affiche dans Geom les elements de structure"))
-           self.menu.addAction(self.ViewElt)
-           if self.item.isValid() :
-              self.ViewElt.setEnabled(1)
-           else:
-              self.ViewElt.setEnabled(0)
-
-    def view3D(self) :
-        from Editeur import TroisDPal
-        troisD=TroisDPal.TroisDPilote(self.item,self.editor.appliEficas)
-        troisD.envoievisu()
+
+#    def view3D(self) :
+#        from Editeur import TroisDPal
+#        troisD=TroisDPal.TroisDPilote(self.item,self.editor.appliEficas)
+#        troisD.envoievisu()
 
         
     
@@ -73,8 +61,8 @@ class MACROTreeItem(compooper.EtapeTreeItem):
 
 class INCLUDETreeItemBase(MACROTreeItem):
 
-    def __init__(self,appli, labeltext, object, setFunction):    
-       MACROTreeItem.__init__(self,appli, labeltext, object, setFunction)
+    def __init__(self,appliEficas, labeltext, object, setFunction):    
+       MACROTreeItem.__init__(self,appliEficas, labeltext, object, setFunction)
 
     def isCopiable(self):
        return 0
@@ -89,7 +77,7 @@ class INCLUDENode(browser.JDCNode,typeNode.PopUpMenuNode):
     def createPopUpMenu(self):
       typeNode.PopUpMenuNode.createPopUpMenu(self)
       
-    def makeEdit(self):    #,appli,node
+    def makeEdit(self):    #,appliEficas,node
         if self.item.object.text_converted == 0:
                 # Le texte du fichier inclus n'a pas pu etre converti par le module convert
                 msg=tr("Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n")
@@ -121,7 +109,7 @@ class POURSUITENode(browser.JDCNode, typeNode.PopUpMenuNode):
     def createPopUpMenu(self):
       typeNode.PopUpMenuNode.createPopUpMenu(self)
 
-    def makeEdit(self):    #,appli,node
+    def makeEdit(self):    #,appliEficas,node
         if self.item.object.text_converted == 0:
                 msg=tr("Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n")
                 msg=msg+self.item.object.text_error
@@ -174,18 +162,18 @@ class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
 # ------------------------------------
     
 
-def treeitem(appli, labeltext, object, setFunction=None):
+def treeitem(appliEficas, labeltext, object, setFunction=None):
    """ Factory qui retourne l'item adapte au type de macro : 
        INCLUDE, POURSUITE, MACRO
    """
    if object.nom == "INCLUDE_MATERIAU":
-      return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setFunction)
+      return INCLUDE_MATERIAUTreeItem(appliEficas, labeltext, object, setFunction)
    elif object.nom == "INCLUDE" or object.nom== "DICTDATA":
-      return INCLUDETreeItem(appli, labeltext, object, setFunction)
+      return INCLUDETreeItem(appliEficas, labeltext, object, setFunction)
    elif object.nom == "POURSUITE":
-      return POURSUITETreeItem(appli, labeltext, object, setFunction)
+      return POURSUITETreeItem(appliEficas, labeltext, object, setFunction)
    else:
-      return MACROTreeItem(appli, labeltext, object, setFunction)
+      return MACROTreeItem(appliEficas, labeltext, object, setFunction)
 
 import Accas
 objet=Accas.MACRO_ETAPE
index 7035e14b9374596f6a4af444ffdfaf085ad2f1f6..c37efb07adec7c42de3f4764bf1c8cd807aa8af6 100644 (file)
@@ -36,7 +36,7 @@ class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
     def createPopUpMenu(self):
         typeNode.PopUpMenuNodeMinimal.createPopUpMenu(self)
 
-    def getPanelGroupe(self,parentQt,commande,insertIn=-1):
+    def getPanelGroupe(self,parentQt,commande):
         maDefinition=self.item.get_definition()
         monObjet=self.item.object
         monNom=self.item.nom
@@ -47,10 +47,15 @@ class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
         if not (monObjet.isMCList()) :
            if  hasattr(self,'plie') and self.plie==True : 
                from InterfaceQT4.monWidgetFactPlie import MonWidgetFactPlie
-               widget=MonWidgetFactPlie(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande,insertIn)
+               widget=MonWidgetFactPlie(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande)
+           elif self.editor.maConfiguration.afficheFirstPlies and self.firstAffiche:
+               self.firstAffiche = False
+               self.setPlie()
+               from InterfaceQT4.monWidgetFactPlie import MonWidgetFactPlie
+               widget=MonWidgetFactPlie(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande)
            else:
                from InterfaceQT4.monWidgetFact import MonWidgetFact
-               widget=MonWidgetFact(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande,insertIn)
+               widget=MonWidgetFact(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande)
         else :
            from InterfaceQT4.monWidgetBloc import MonWidgetBloc
            widget=MonWidgetBloc(self,self.editor,parentQt,maDefinition,monObjet,self.niveau,maCommande)
@@ -133,7 +138,7 @@ class MCListTreeItem(Objecttreeitem.SequenceTreeItem,compofact.FACTTreeItem):
               # nouvel objet : on cree un nouvel item
               def setFunction(value, object=obj):
                   object=value
-              item = self.makeObjecttreeitem(self.appli, obj.nom + " : ", obj, setFunction)
+              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
@@ -206,8 +211,8 @@ class MCListTreeItem(Objecttreeitem.SequenceTreeItem,compofact.FACTTreeItem):
 import Accas
 objet = Accas.MCList    
 
-def treeitem(appli,labeltext,object,setFunction):
+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(appli,labeltext,object,setFunction)
+  return MCListTreeItem(appliEficas,labeltext,object,setFunction)
index c03704bf25e9ac9ef7650c9438abbce2d94538a3..b8f4aafe6b31c5cd8b34b9d36f2989ac527578b4 100644 (file)
@@ -24,9 +24,6 @@ except : pass
 
 import os
 import tempfile
-from PyQt5.QtWidgets import QMessageBox, QAction, QApplication
-from PyQt5.QtGui  import QCursor
-from PyQt5.QtCore import Qt
 
 from Extensions.i18n import tr
 from Extensions.eficas_exception import EficasException
@@ -51,7 +48,7 @@ class Node(browser.JDCNode, typeNode.PopUpMenuNode):
         self.editor.initModif()
         test,mess = self.item.nommeSd(nom)
         if (test== 0):
-           self.editor.afficheInfos(mess,Qt.red)
+           self.editor.afficheInfos(mess,'red')
            old=self.item.getText()
            self.monWidgetNom.setText(old)
         else :
@@ -69,59 +66,12 @@ class Node(browser.JDCNode, typeNode.PopUpMenuNode):
 
     def createPopUpMenu(self):
         typeNode.PopUpMenuNode.createPopUpMenu(self)
-        if ("AFFE_CARA_ELEM" in self.item.getGenealogie()) and self.editor.salome: 
-           self.ViewElt = QAction(tr('View3D'),self.tree)
-           self.tree.connect(self.ViewElt,SIGNAL("triggered()"),self.view3D)
-           self.ViewElt.setStatusTip(tr("affiche dans Geom les elements de structure"))
-           self.menu.addAction(self.ViewElt)
-           if self.item.isValid() :
-              self.ViewElt.setEnabled(1)
-           else:
-              self.ViewElt.setEnabled(0)
-        if  self.item.getNom() == "DISTRIBUTION" :
-           self.Graphe = QAction(tr('Graphique'),self.tree)
-           self.Graphe.triggered.connect(self.viewPng)
-           self.Graphe.setStatusTip(tr("affiche la distribution "))
-           self.menu.addAction(self.Graphe)
-           if self.item.isValid() :
-              self.Graphe.setEnabled(1)
-           else:
-              self.Graphe.setEnabled(0)
-
-    def view3D(self) :
-        from Editeur import TroisDPal
-        troisD=TroisDPal.TroisDPilote(self.item,self.editor.appliEficas)
-        troisD.envoievisu()
-
-    def viewPng(self) :
-        from monPixmap import MonLabelPixmap
-        import generator
-        try:
-            QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
-            g = generator.plugins[self.appliEficas.format_fichier]()
-            g.gener(self.item.object, format='beautifie')
-            stdGener = g.getGenerateur()
-            loi = list(g.dictMCLois.keys())[0]
-            nomLoi = loi.getName()
-            (fd, fichier) = tempfile.mkstemp(prefix = "openturns_graph_", suffix = ".png")
-            os.close(fd)
-            chemin = os.path.dirname(fichier)
-            base = os.path.splitext(os.path.basename(fichier))[0]
-            script = stdGener.GraphiquePDF(loi, chemin, base)
-            #print script
-            d = {}
-            exec(script, d)
-            widgetPng=MonLabelPixmap(self.appliEficas,fichier,nomLoi)
-            os.remove(fichier)
-            QApplication.restoreOverrideCursor()
-            widgetPng.show()
-        except:
-            QApplication.restoreOverrideCursor()
-            QMessageBox.warning(
-                self.appliEficas,
-                tr("Erreur interne"),
-                tr("La PDF de la loi ne peut pas etre affichee."),
-                tr("&Annuler"))
+
+#    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
@@ -247,7 +197,7 @@ class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
             # nouvel objet : on cree un nouvel item
             def setFunction(value, object=obj):
                 object.setval(value)
-            item = self.makeObjecttreeitem(self.appli, obj.nom + " : ", obj, setFunction)
+            item = self.makeObjecttreeitem(self.appliEficas, obj.nom + " : ", obj, setFunction)
             sublist[pos]=item
          pos=pos+1
 
@@ -279,8 +229,8 @@ class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
          oldnom=self.object.sd.nom
       test,mess= self.object.nommeSd(nom)
       if test:self.object.parent.resetContext()
-      if (test and oldnom in self.appli.dict_reels ):
-              self.appli.dict_reels[nom]=self.appli.dict_reels[oldnom]
+      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):
@@ -295,7 +245,7 @@ class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
           représentatif de self.object
       """
       # Format de fichier utilisé
-      format=self.appli.appliEficas.format_fichier
+      format=self.appliEficas.formatFichierIn
       return self.object.getObjetCommentarise(format)
 
   def getObjetCommentarise_BAK(self):
@@ -305,7 +255,7 @@ class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
       """
       import generator,Accas
       # Format de fichier utilisé
-      format=self.appli.appliEficas.format_fichier
+      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 
index cf26ced0a88ea44a49f8d04ae4b9a1af2c0bbf30..c550b15e27294fded11a2aa457502aecd39795eb 100644 (file)
@@ -35,6 +35,7 @@ from Editeur      import Objecttreeitem
 from InterfaceQT4 import browser
 from Noyau.N_CR   import justifyText
 from Accas        import SalomeEntry
+from Accas        import UserASSD
     
 class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):    
 
@@ -43,6 +44,7 @@ class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
 
 
     def getPanelGroupe(self,parentQt,maCommande):
+        #print (self,self.item.nom, )
         maDefinition=self.item.get_definition()
         monObjet=self.item.object
         monNom=self.item.nom
@@ -134,13 +136,22 @@ class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
                from InterfaceQT4.monWidgetSDCOInto import MonWidgetSDCOInto
                widget=MonWidgetSDCOInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
           elif self.item.waitAssd():
-            if len(self.item.getSdAvantDuBonType()) == 0 :
+            
+            # PN - pour ne pas appeller trop souvent self.item.getSdAvantDuBonType()
+            if not (self.item.waitUserAssdEnCreation()) : maListe=self.item.getSdAvantDuBonType()
+            if self.item.waitUserAssdEnCreation() : 
+               from InterfaceQT4.monWidgetCreeUserAssd import MonWidgetCreeUserAssd
+               widget=MonWidgetCreeUserAssd(self,maDefinition,monNom,monObjet,parentQt,maCommande)
+            #elif len(self.item.getSdAvantDuBonType()) == 0 :
+            elif len(maListe) == 0 :
                from InterfaceQT4.monWidgetVide import MonWidgetVide
                widget=MonWidgetVide(self,maDefinition,monNom,monObjet,parentQt,maCommande)
-            elif len(self.item.getSdAvantDuBonType()) < 4 :
+            #elif len(self.item.getSdAvantDuBonType()) < 4 :
+            elif len(maListe) < 4 :
               from InterfaceQT4.monWidgetRadioButton import MonWidgetRadioButtonSD
               widget=MonWidgetRadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
-            elif len(self.item.getSdAvantDuBonType()) < 7 :
+            #elif len(self.item.getSdAvantDuBonType()) < 7 :
+            elif len(maListe) < 7 :
               from InterfaceQT4.monWidget4a6RadioButton import MonWidget4a6RadioButtonSD
               widget=MonWidget4a6RadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
             else :
@@ -177,8 +188,9 @@ class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
                else :
                  from InterfaceQT4.monWidgetPlusieursInto import MonWidgetPlusieursInto
                  widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
-          elif self.item.waitAssd() :
+          elif self.item.waitAssd()  and not self.item.waitUserAssdEnCreation() :
                listeAAfficher = self.item.getSdAvantDuBonType()
+               #if not (self.item.waitUserAssdEnCreation()) : maListe=self.item.getSdAvantDuBonType()
                mctype=maDefinition.type[0]
                enable_salome_selection = self.editor.salome and \
                       (('grma' in repr(mctype)) or ('grno' in repr(mctype)) or ('SalomeEntry' in repr(mctype)) or \
@@ -229,7 +241,10 @@ class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
                   from InterfaceQT4.monWidgetPlusieursPlie import MonWidgetPlusieursPlie
                   widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
           else :
-            if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees)  : 
+            if self.item.waitUserAssdEnCreation() : 
+               from InterfaceQT4.monWidgetCreeUserAssd import MonWidgetCreeListeUserAssd
+               widget=MonWidgetCreeListeUserAssd(self,maDefinition,monNom,monObjet,parentQt,maCommande)
+            elif self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees)  : 
                from InterfaceQT4.monWidgetPlusieursBase import MonWidgetPlusieursBase
                widget=MonWidgetPlusieursBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
             else :
@@ -340,17 +355,17 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
       try :
         if "R" in self.object.definition.type:
            clef=self.object.getNomConcept()
-           if clef in self.appli.dict_reels:
+           if clef in self.appliEficas.dict_reels:
               if type(valeurs) == tuple:
                  valeurs_reelles=[]
                  for val in valeurs :
-                    if val in self.appli.dict_reels[clef]:
-                       valeurs_reelles.append(self.appli.dict_reels[clef][val])
+                    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.appli.dict_reels[clef]:
-                    valeurs_reelles=self.appli.dict_reels[clef][valeurs]
+                 if valeurs in self.appliEficas.dict_reels[clef]:
+                    valeurs_reelles=self.appliEficas.dict_reels[clef][valeurs]
               valeurs=valeurs_reelles
       except :
         pass
@@ -500,7 +515,7 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
 
 
   def getIconName(self):
-    if self.appli.maConfiguration.differencieSiDefaut and self.isValid():
+    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"
@@ -523,21 +538,23 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
     return text
     
 
-  def setValeurCo(self,nom_co):
+  def setValeurCo(self,nomCo):
       """
-      Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
+      Affecte au MCS pointe par self l'objet de type CO et de nom nom_co
       """
-      ret = self.object.setValeurCo(nom_co)
+      ret = self.object.setValeurCo(nomCo)
       #print "setValeurCo",ret
       return ret
       
   def getSdAvantDuBonType(self):
       """
-      Retourne la liste des noms des SD présentes avant l'étape qui contient
-      le MCS pointé par self et du type requis par ce MCS
+      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=self.object.etape.parent.getSdAvantDuBonType(self.object.etape,self.object.definition.type)
-      return a
+      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")
@@ -569,7 +586,7 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
 
   def waitCo(self):
       """
-      Méthode booléenne qui retourne 1 si l'objet pointé par 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
       """
@@ -585,7 +602,7 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
 
   def waitGeom(self):
       """
-      Méthode booléenne qui retourne 1 si l'objet pointé par self
+      Methode booleenne qui retourne 1 si l'objet pointe par self
       attend un objet GEOM, 0 sinon
       """
       return self.object.waitGeom()
@@ -595,7 +612,7 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
 
     
   def waitComplex(self):
-      """ Méthode booléenne qui retourne 1 si l'objet pointé par 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
@@ -603,8 +620,8 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
           return 0
 
   def waitReel(self):
-      """ Méthode booléenne qui retourne 1 si l'objet pointé par self
-      attend un réel, 0 sinon """
+      """ 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:
@@ -614,16 +631,16 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
       return  self.object.waitTuple()
 
   def waitDate(self):
-      """ Méthode booléenne qui retourne 1 si l'objet pointé par self
-      attend un réel, 0 sinon """
+      """ 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):
-      """ Méthode booléenne qui retourne 1 si l'objet pointé par self
-      attend un réel, 0 sinon """
+      """ 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:
@@ -632,7 +649,7 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
         
         
   def waitTuple(self):
-      """ Méthode booléenne qui retourne 1 si l'objet pointé par 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 :
@@ -640,7 +657,7 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
       return 0
 
   def waitMatrice(self):
-      """ Méthode booléenne qui retourne 1 si l'objet pointé par 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 :
@@ -648,8 +665,8 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
       return 0
 
   def waitAssd(self):
-      """Méthode booléenne qui retourne 1 si l'objet pointé par self
-      attend un objet de type ASSD ou dérivé, 0 sinon """
+      """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) :
@@ -673,7 +690,7 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
    
   def getType(self):
       """ 
-          Retourne le type de valeur attendu par l'objet représenté par l'item.
+          Retourne le type de valeur attendu par l'objet represente par l'item.
       """
       return self.object.getType()
 
@@ -697,7 +714,7 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
 
 
   def evalValeurItem(self,valeur):
-      """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple 
+      """ 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 
@@ -716,7 +733,6 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
              valeurretour,validite = valeur,1
       else :
              valeurretour,validite= self.object.evalValeur(valeur)
-      #print "evalValeurItem",valeurretour,validite
 
       if validite == 0:
          if (type(valeur) == bytes  or type(valeur) == str )and self.object.waitTxm():
@@ -736,7 +752,7 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
          #except:
             #valeurretour=None
             #validite=0
-      # on est dans le cas ou on a évalué et ou on n'aurait pas du
+      # 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)
@@ -746,11 +762,11 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
   def isCO(self,valeur=None):
       """
          Indique si valeur est un concept produit de la macro
-         Cette méthode n'a de sens que pour un MCSIMP d'une 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 présent dans l'attribut sdprods de l'étape
+      # 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
@@ -770,8 +786,8 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
 
   def traiteReel(self,valeur):
       """
-      Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
-      ou de détecter si on fait référence a un concept produit par DEFI_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()
@@ -780,10 +796,10 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
           return valeur
       if len(valeur) >= 3 :
           if valeur[0:4] == 'EVAL' :
-              # on a trouvé un EVAL --> on retourne directement la valeur
+              # on a trouve un EVAL --> on retourne directement la valeur
               return valeur
       if valeur.find('.') == -1 :
-          # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
+          # aucun '.' n'a ete trouve dans valeur --> on en rajoute un a la fin
           if (self.isParam(valeur)):
               return valeur
           else:
index d8eefdc872237db48ab74dcafc9e41c310e0ba40..6b4aab4815f433f2890e560a8ee3ad8c4e190a08 100644 (file)
@@ -30,7 +30,6 @@ except : pass
 
 import os, sys,  types, re
 import traceback
-from PyQt5.QtWidgets import QMessageBox
 from  Editeur.Eficas_utils import read_file
 from Extensions.i18n import tr
 
@@ -38,7 +37,7 @@ from Extensions.i18n import tr
 class configBase(object):
 
   #-------------------------------
-  def __init__(self,appli,repIni):
+  def __init__(self,appliEficas,repIni):
   #-------------------------------
 
   # Classe de base permettant de lire, afficher
@@ -53,9 +52,9 @@ class configBase(object):
   # le fichier de catalogue va etre lu dans la directory de l utilisateur s il exite
   # dans le fichier general sinon
 
-      self.appli   = appli  
-      self.code    = appli.code
-      self.salome  = appli.salome
+      self.appliEficas   = appliEficas  
+      self.code    = appliEficas.code
+      self.salome  = appliEficas.salome
       if self.salome : self.name="editeur_salome.ini"
       else           : self.name="editeur.ini"
       self.rep_mat = None
@@ -63,7 +62,8 @@ class configBase(object):
      
       if self.code == None : self.code=''
       if sys.platform[0:5]=="linux" :
-              self.rep_user   = os.path.join(os.environ['HOME'],'.config/Eficas',self.code)
+              #self.rep_user   = os.path.join(os.environ['HOME'],'.config/Eficas',self.code)
+              self.rep_user   = os.path.join(os.path.expanduser("~"),'.config/Eficas',self.code)
       else :
               self.rep_user   = os.path.join('C:/','.config/Eficas',self.code)
 
@@ -82,12 +82,13 @@ class configBase(object):
       #Particularite des schemas MAP
       if hasattr(self,'make_ssCode'): self.make_ssCode(self.ssCode)
 
-      #if self.appli: self.parent=appli.top
+      #if self.appliEficas: self.parent=appliEficas.top
       #else:        self.parent=None
 
       if not os.path.isdir(self.savedir) :
         if sys.platform[0:5]=="linux" :
-          self.savedir=os.environ['HOME']
+          #self.savedir=os.environ['HOME']
+          self.savedir=os.path.expanduser("~")
         else:
           self.savedir='C:/'
       
@@ -102,23 +103,26 @@ class configBase(object):
       self.exec_acrobat = 'acroread'
       nomDir="Eficas_"+self.code
       if sys.platform[0:5]=="linux" :
-        self.savedir   = os.path.abspath(os.path.join(os.environ['HOME'],nomDir))
+        #self.savedir   = os.path.abspath(os.path.join(os.environ['HOME'],nomDir))
+        rep=os.path.join(os.path.expanduser("~"),'.config/Eficas',self.code)
       else:
         self.savedir = os.path.abspath('C:/')
       self.modeNouvCommande='initial'
       self.affiche="alpha"
       self.closeAutreCommande = False
       self.closeFrameRechercheCommande = False
+      self.closeFrameRechercheCommandeSurPageDesCommandes = False
       self.closeEntete = False
       self.closeArbre = False
-      self.force_langue=False
+      self.demandeLangue=False
       self.suiteTelemac=False
       self.nombreDeBoutonParLigne=0
       self.translatorFichier=None
       self.dicoImages= {}
       self.dicoIcones= {}
       self.afficheCommandesPliees = True
-      self.simpleClic= False
+      self.afficheFirstPlies =  False
+      self.simpleClic = False
       self.afficheOptionnelVide=False
       self.afficheListesPliees=True
       self.boutonDsMenuBar=False
@@ -126,16 +130,21 @@ class configBase(object):
       self.repIcones=None
       self.differencieSiDefaut=False
       self.typeDeCata='Python'
-      self.dumpXSD=False
-      self.withXSD=False
-      self.afficheIhm=True
       self.closeParenthese=False
+      self.closeOptionnel=False
+      self.afficheFactOptionnel=False
       self.enleverActionStructures=False
+      self.enleverPoubellePourCommande=False
       self.enleverParametres=False
       self.enleverSupprimer=False
       self.ajoutExecution=False
-      self.utilParExtensions=False
+      self.utilParExtensions=[]
       self.rendVisiblesLesCaches=False
+      self.pasDeMCOptionnels=False
+
+      self.dumpXSD=False
+      self.withXSD=False
+      self.afficheIhm=True
 
 
 
@@ -144,8 +153,13 @@ class configBase(object):
   def lectureFichierIniStandard(self):
   #--------------------------------------
 
-      name='prefs_'+self.appli.code
-      prefsCode=__import__(name)
+      name='prefs_'+self.appliEficas.code
+      try :
+        prefsCode=__import__(name)
+      except :
+        self.catalogues=[]
+        print ('pas de fichier de prefs')
+        return
       for k in dir(prefsCode):
           if (k[0:1] != "__" and k[-1:-2] !='__'):
              valeur=getattr(prefsCode,k)
@@ -171,8 +185,12 @@ class configBase(object):
       try:
          exec(txt, d)
       except :
-         QMessageBox.critical( None, tr("Import du fichier de Configuration"), 
+         try :
+           from PyQt5.QtWidgets import QMessageBox
+           QMessageBox.critical( None, tr("Import du fichier de Configuration"), 
                        tr("Erreur a la lecture du fichier de configuration %s " , str(fic_ini_integrateur)))
+         except : 
+           print("Erreur a la lecture du fichier de configuration %s " , str(fic_ini_integrateur))
          return
       self.labels_eficas.append('rep_aide')
       for k in self.labels_eficas :
@@ -200,8 +218,12 @@ class configBase(object):
          exec(txt, d)
       except :
          l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
-         QMessageBox.critical( None, tr("Import du fichier de Configuration"), 
+         try :
+           from PyQt5.QtWidgets import QMessageBox
+           QMessageBox.critical( None, tr("Import du fichier de Configuration"), 
                        tr("Erreur a la lecture du fichier de configuration %s " , str(fic_ini_integrateur)))
+         except :
+            print ("Erreur a la lecture du fichier de configuration %s " , str(fic_ini_integrateur))
       for k in self.labels_user :
          try :
             setattr(self,k,d[k])
@@ -235,3 +257,5 @@ class configBase(object):
 #
 
 
+def makeConfig(appliEficas,rep):
+    return configBase(appliEficas,rep)
index 8db32eb972ffe74279d10db93a511fddaaa7ad19..e9ab3864f9d4754a3d7e64fa826aaff162ce6b05 100755 (executable)
@@ -27,7 +27,6 @@ except : pass
 import types,sys,os, re
 import  subprocess
 import traceback
-import six
 
 
 from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog, QApplication, QSplitter, QLabel
@@ -65,8 +64,8 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
 # Methodes faisant appel a ssIhm
 # ----------------------------------------
 
-    def __init__ (self,appli,fichier = None, jdc=None, QWParent=None, units = None, include=0):
-    #------------------------------------------------------------------------------------------
+    def __init__ (self,appliEficas,fichier = None, jdc=None, QWParent=None, units = None, include=0):
+    #------------------------------------------------------------------------------------------------
 
 
         QWidget.__init__(self,None)
@@ -77,32 +76,35 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
         self.fenetreCentraleAffichee=None
         self.dejaDansPlieTout=False
         self.listeDesListesOuvertes=set()
-        self.afficheListesPliees=True
-        if appli!=None and hasattr(appli,"statusBar"): self.sb = appli.statusBar()
+        if appliEficas!=None and hasattr(appliEficas,"statusBar"): self.sb = appliEficas.statusBar()
         else : self.sb = None
         self.QWParent=QWParent
 
-        JDCEditorSsIhm. __init__ (self,appli,fichier, jdc,units,include)
+        JDCEditorSsIhm. __init__ (self,appliEficas,fichier, jdc,units,include)
+        if self.jdc:
+             comploader.chargerComposants()
+             self.jdc_item=Objecttreeitem.makeObjecttreeitem( self, "nom", self.jdc )
+
 
         # Particularites IHM : met la fenetre a jour
 
         self.initSplitterSizes()
-        if self.code == "ASTER" or self.code == "monCode" : self.afficheListesPliees =True
-        if self.code == 'PSEN_N1' : self.afficheListesPliees = False
 
         #self.affiche=self.appliEficas.maConfiguration.affiche
 
+        self.afficheListesPliees=self.maConfiguration.afficheListesPliees
         if self.code in ['MAP','CARMELCND','PSEN'] : self.maConfiguration.afficheCommandesPliees=False
         if self.code in ['MAP',]: self.fermeArbre()
         #   self.widgetTree.close()
         #   self.widgetTree=None
 
-        if self.maConfiguration.closeArbre: self.fermeArbre()
+        if self.maConfiguration.closeArbre      : self.fermeArbre()
+        if self.maConfiguration.closeOptionnel  : self.fermeOptionnel()
         if self.maConfiguration.boutonDsMenuBar : self.appliEficas.remplitIconesCommandes()
 
-        self.version_code = session.d_env.cata
      
-        self.format =  self.appliEficas.format_fichier
+        self.formatFichierOut =  self.appliEficas.formatFichierOut
+        self.formatFichierIn  =  self.appliEficas.formatFichierIn
 
         self.node_selected = []
         self.deplier = True
@@ -118,7 +120,7 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
         self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
 
         if self.appliEficas.readercata.demandeCatalogue==True  :
-           nomFichierTranslation='translatorFichier'+'_'+str(self.appliEficas.readercata.versionCode)
+           nomFichierTranslation='translatorFichier'+'_'+str(self.appliEficas.readercata.labelCode)
            if hasattr(self.appliEficas.maConfiguration,nomFichierTranslation) :
               translatorFichier=getattr(self.appliEficas.maConfiguration,nomFichierTranslation)
               from Extensions import localisation
@@ -547,7 +549,6 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
     def run(self):
     #------------#
       fonction="run"+self.code
-      #print fonction
       if fonction in JDCEditor.__dict__: JDCEditor.__dict__[fonction](self,)
 
     #------------#
@@ -560,6 +561,11 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
 # ---------------------------------------------
 # Methodes Non Crees dans ssIHM 
 # ---------------------------------------------
+    #---------------#
+    def runVP(self):
+    #---------------#
+      texte=self.getTextJDC("MAPVp",pourRun=1)
+      print (texte)
 
     #---------------#
     def runMAP(self):
@@ -631,7 +637,7 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
       if self.modified or self.fichier==None  :
          QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
          return
-      if not hasattr(self,'generator'): texte=self.getTextJDC(self.format)
+      if not hasattr(self,'generator'): texte=self.getTextJDC(self.formatFichierOut)
       from PrepareRunCarmel import prepareRunCarmel
       fichierGenerique=os.path.basename(self.fichier).split(".")[0]
       repMed=os.path.dirname(self.fichier)
@@ -656,13 +662,13 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
     #-----------------------------------------------------#
     def determineNomFichier(self,path,extension):
     #-----------------------------------------------------#
-      if self.appli.code in DictExtensions:
-         chaine1=DictExtensions[self.appli.code]+" (*."+DictExtensions[self.appli.code]+");;"
+      if self.appliEficas.code in DictExtensions:
+         chaine1=DictExtensions[self.appliEficas.code]+" (*."+DictExtensions[self.appliEficas.code]+");;"
          extensions= tr(chaine1+ "All Files (*)")
       else :
          extensions= tr("JDC (*.comm);;" "All Files (*)")
 
-      if self.appli.code == "MAP" :
+      if self.appliEficas.code == "MAP" :
          extensions = extensions + ";; Run (*.input);;"
 
       fn = QFileDialog.getSaveFileName( self,
@@ -679,7 +685,7 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
       if QFileInfo(fn).exists():
            msgBox = QMessageBox(self)
            msgBox.setWindowTitle(tr("Sauvegarde du Fichier"))
-           msgBox.setText(tr("Le fichier <b>%s</b> existe deja.", six.text_type(fn)))
+           msgBox.setText(tr("Le fichier")+ "  "+str(fn)+ "  " +tr("existe deja"))
            msgBox.addButton(tr("&Ecraser"),0)
            msgBox.addButton(tr("&Abandonner"),1)
            abort=msgBox.exec_()
@@ -773,7 +779,7 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
         extension='.casR'
         fn = self.fichierComplet
         #saveas=True # Pour forcer le nom
-        self.generator=self.maConfiguration.mesGenerators.plugins[self.format]()
+        self.generator=self.maConfiguration.mesGenerators.plugins[self.formatFichierOut]()
         if self.fichierComplet is None or saveas:
           if path is None: path=self.maConfiguration.savedir
           bOK, fn=self.determineNomFichier(path,extension)
@@ -781,14 +787,14 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
           if fn == None : return (0, None)
           if fn== '' : return (0, None)
 
-          ulfile = os.path.abspath(six.text_type(fn))
+          ulfile = os.path.abspath(fn)
           self.appliEficas.maConfiguration.savedir=os.path.split(ulfile)[0]
-          fn = six.text_type(QDir.toNativeSeparators(fn))
+          fn = QDir.toNativeSeparators(fn)
 
         self.fichierComplet = os.path.splitext(fn)[0]+extension
 
         if hasattr(self.generator, "writeComplet"):
-            self.generator.writeComplet(self.fichierComplet,self.jdc,config=self.appliEficas.maConfiguration,appli=self.appliEficas)
+            self.generator.writeComplet(self.fichierComplet,self.jdc,config=self.appliEficas.maConfiguration,appliEficas=self.appliEficas)
 
         if self.salome : self.appliEficas.addJdcInSalome( self.fichierComplet)
 
@@ -812,8 +818,8 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
         if not self.modified and not saveas:
             return (0, None)      # do nothing if text wasn't changed
 
-        if self.appli.code in DictExtensions :
-           extension=DictExtensions[self.appli.code]
+        if self.appliEficas.code in DictExtensions :
+           extension=DictExtensions[self.appliEficas.code]
         else :
            extension='.comm'
 
@@ -826,9 +832,9 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
           if fn == None : return (0, None)
           if fn== '' : return (0, None)
 
-          ulfile = os.path.abspath(six.text_type(fn))
+          ulfile = os.path.abspath(fn)
           self.appliEficas.maConfiguration.savedir=os.path.split(ulfile)[0]
-          fn = six.text_type(QDir.toNativeSeparators(fn))
+          fn = QDir.toNativeSeparators(fn)
           newName = fn
 
 
@@ -844,8 +850,12 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
            self.tree.racine.item.getObject().nom=os.path.basename(newName)
            self.tree.racine.updateNodeLabel()
 
-        #print ('sortie du XML')
-        #self.jdc.toXml()
+        if  self.jdc.cata.modeleMetier:self.jdc.toXml(self.fichier)
+        if  self.jdc.cata.modeleMetier and self.jdc.isValid():
+            if self.generator != self.XMLgenerator :
+               self.XMLgenerator.gener(self.jdc)
+               self.XMLgenerator.writeDefault(fn)
 
         if self.jdc.isValid() != 0 and hasattr(self.generator, "writeDefault"):
         #if hasattr(self.generator, "writeDefault"):
@@ -927,10 +937,10 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
         if not fn : return (0, " ")
         fn=fn[0]
 
-        ulfile = os.path.abspath(six.text_type(fn))
+        ulfile = os.path.abspath(fn)
         self.appliEficas.maConfiguration.savedir=os.path.split(ulfile)[0]
 
-        # On utilise le convertisseur defini par format_fichier
+        # On utilise le convertisseur defini par formatFichierIn
         source=self.getSource(ulfile)
         if source:
             # On a reussia convertir le fichier self.ulfile
@@ -1019,6 +1029,7 @@ class JDCEditor(JDCEditorSsIhm,Ui_baseWidget,QWidget):
       if nbWidget==2  : newSizes=self.splitterSizes2
       if nbWidget==3  : newSizes=self.splitterSizes3
       #self.inhibeSplitter = 1
+      #print (newSizes)
       self.splitter.setSizes(newSizes)
       #self.inhibeSplitter = 0
       QApplication.processEvents()
old mode 100644 (file)
new mode 100755 (executable)
index d6b507c..d6f8b9d
@@ -28,8 +28,6 @@ import types,sys,os, re
 import  subprocess
 import traceback
 
-import six
-from six.moves import range
 
 import traceback
 
@@ -55,15 +53,16 @@ class JDCEditorSsIhm :
 # Methodes Communes ou appelees depuis avec Ihm
 # ---------------------------------------------
 
-    def __init__ (self,appli,fichier = None, jdc = None,  units = None, include=0 ):
-    #------------------------------------------------------------------------------#
+    def __init__ (self,appliEficas,fichier = None, jdc = None,  units = None, include=0 ):
+    #-----------------------------------------------------------------------------------#
     # paticularisee avec Ihm
 
         if debug : print ('dans le init de JDCEditorSsIhm')
-        self.appliEficas = appli
-        self.appli       = appli
+        self.appliEficas = appliEficas
         self.fichier     = fichier
-        self.fichierComplet  = fichier
+        self.fichierComplet   = fichier
+        if fichier != None : self.extensionFichier = os.path.splitext(fichier)[1]
+        else : self.extensionFichier = None
         self.jdc         = jdc
         self.first      = True
         self.jdc_item    = None
@@ -72,15 +71,13 @@ class JDCEditorSsIhm :
         self.dict_reels       = {}
         self.liste_simp_reel  = []
 
-        if appli != None : self.salome =  self.appliEficas.salome
+        if self.appliEficas != None : self.salome =  self.appliEficas.salome
         else             : self.salome =  0
 
         # ces attributs sont mis a jour par definitCode appelee par newEditor
         self.code              = self.appliEficas.maConfiguration.code
         self.maConfiguration   = self.appliEficas.maConfiguration
 
-        self.version_code = session.d_env.cata
-
 
         if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.readercata.demandeCatalogue==True or self.appliEficas.multi==True:
            if self.maConfiguration.typeDeCata == 'XML' :
@@ -92,10 +89,11 @@ class JDCEditorSsIhm :
            self.appliEficas.code=self.code
         else :
            self.readercata=self.appliEficas.readercata
-        if self.readercata.fic_cata == None : return    #Sortie Salome
+        if self.readercata.fichierCata == None : return    #Sortie Salome
         self.titre=self.readercata.titre
 
-        self.format =  self.appliEficas.format_fichier
+        self.formatFichierOut =  self.appliEficas.formatFichierOut
+        self.formatFichierIn  =  self.appliEficas.formatFichierIn
 
         if self.appliEficas.maConfiguration.dumpXSD==True : self.appliEficas.dumpXsd()
         self.dict_reels={}
@@ -123,6 +121,13 @@ class JDCEditorSsIhm :
 
         self.maConfiguration.mesGenerators     = generator
         self.maConfiguration.mesconvertisseurs = convert
+        try    : self.XMLgenerator=generator.plugins['xml']()
+        except : self.XMLgenerator=None
+        
+
+        if self.formatFichierOut in generator.plugins.keys():
+           self.generator = generator.plugins[self.formatFichierOut]()
+
 
         self.fileInfo       = None
         self.lastModified   = 0
@@ -143,10 +148,8 @@ class JDCEditorSsIhm :
                except :
                    print ("mauvaise lecture du fichier")
                if self.salome :
-                  try :
-                     self.appliEficas.addJdcInSalome( self.fichier)
-                  except :
-                     print ("mauvais enregistrement dans Salome")
+                  try    : self.appliEficas.addJdcInSalome( self.fichier)
+                  except : print ("mauvais enregistrement dans Salome")
             else :
                self.jdc=jdc
 
@@ -156,27 +159,27 @@ class JDCEditorSsIhm :
 
         else:
             if not self.jdc:                   #  nouveau jdc
-                if not include :
-                   self.jdc = self._newJDC(units=units)
-                else :
-                   self.jdc = self._newJDCInclude(units=units)
+                if not include : self.jdc = self._newJDC(units=units)
+                else : self.jdc = self._newJDCInclude(units=units)
                 self.nouveau=1
 
         if self.jdc:
-            self.jdc.appli = self # a resorber
             self.jdc.editor = self
-            self.jdc.lang    = self.appli.langue
+            self.jdc.lang    = self.appliEficas.langue
             self.jdc.aReafficher=False
             txt_exception  = None
-            if not jdc:
-                self.jdc.analyse()
+            if not jdc:            
+                if self.extensionFichier == '.xml' :
+                   if self.appliEficas.maConfiguration.withXSD: self.jdc.analyseXML()
+                   else : print ('run MDM with -x option  (MDM for XML)'); exit()
+                else : self.jdc.analyse()
                 txt_exception = self.jdc.cr.getMessException()
             if txt_exception :
                 self.jdc = None
                 self.informe('pb chargement jdc',txt_exception)
-            else:
-                comploader.chargerComposants()
-                self.jdc_item=Objecttreeitem.makeObjecttreeitem( self, "nom", self.jdc )
+            #else:
+                #comploader.chargerComposants()
+                #self.jdc_item=Objecttreeitem.makeObjecttreeitem( self, "nom", self.jdc )
 
     #-------------------------------#
     def readFile(self, fn):
@@ -189,42 +192,42 @@ class JDCEditorSsIhm :
         # charge un JDC
         # paticularisee avec Ihm
 
-        fn = six.text_type(fn)
+        fn = str(fn)
         jdcName=os.path.basename(fn)
 
         # Il faut convertir le contenu du fichier en fonction du format
-        if self.appliEficas.format_fichier_in in convert.plugins:
+        formatIn=self.appliEficas.formatFichierIn
+        if self.extensionFichier == '.xml' and self.appliEficas.maConfiguration.withXSD: formatIn='xml'
+        if formatIn in convert.plugins:
              # Le convertisseur existe on l'utilise
-
-             p=convert.plugins[self.appliEficas.format_fichier_in]()
+             p=convert.plugins[formatIn]()
              p.readfile(fn)
 
              if p.text=="" : self.nouveau=1
              #print ('PNPN --> CIST a faire')
 
-             pareil,texteNew=self.verifieChecksum(p.text)
-             if  not pareil :
-                self.informe(("fichier modifie"),("Attention! fichier change hors EFICAS"),False)
-
-             p.text=texteNew
-             memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
-             if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
-             p.text=texteNew
-
-             text=p.convert('exec',self.appliEficas)
-
-             if not p.cr.estvide(): self.afficheInfos("Erreur a la conversion",'red')
+             if formatIn != 'xml':
+                pareil,texteNew=self.verifieChecksum(p.text)
+                if  not pareil : self.informe(("fichier modifie"),("Attention! fichier change hors EFICAS"),False)
+                p.text=texteNew
+                memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
+                if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
+                p.text=texteNew
+                text=p.convert('exec',self.appliEficas)
+                if not p.cr.estvide(): self.afficheInfos("Erreur a la conversion",'red')
+             else:
+                text=p.text
         else :
             self.afficheInfos("Type de fichier non reconnu",'red')
             self.informe( "Type de fichier non reconnu",
-                    "EFICAS ne sait pas ouvrir le type de fichier " + self.appliEficas.format_fichier_in)
+                    "EFICAS ne sait pas ouvrir le type de fichier " + self.appliEficas.formatFichierIn)
             return None
 
         CONTEXT.unsetCurrentStep()
 
         #jdc=self.readercata.cata[0].JdC(procedure=text,
         jdc=self.readercata.cata.JdC(procedure=text,
-                                    appli=self,
+                                    appliEficas=self.appliEficas,
                                     cata=self.readercata.cata,
                                     cata_ord_dico=self.readercata.cata_ordonne_dico,
                                     nom=jdcName,
@@ -249,30 +252,24 @@ class JDCEditorSsIhm :
         if self.code == "PSEN"    : texte = self._newPSEN()
         if self.code == "PSEN_N1" : texte = self._newPSEN_N1()
 
-        #if hasattr(self.readercata.cata[0],'TEXTE_NEW_JDC') : texte=self.readercata.cata[0].TEXTE_NEW_JDC
         if hasattr(self.readercata.cata,'TEXTE_NEW_JDC') : texte=self.readercata.cata.TEXTE_NEW_JDC
 
 
-        #jdc=self.readercata.cata[0].JdC( procedure =texte,
-        #print (self.readercata.cata)
         jdc=self.readercata.cata.JdC( procedure =texte,
-                                         appli=self,
+                                         appliEficas=self.appliEficas,
                                          cata=self.readercata.cata,
                                          cata_ord_dico=self.readercata.cata_ordonne_dico,
                                          rep_mat=self.maConfiguration.rep_mat
                                         )
 
-        jdc.lang    = self.appli.langue
+        jdc.lang    = self.appliEficas.langue
         if units is not None:
            jdc.recorded_units=units
            jdc.old_recorded_units=units
-        ## PNPN est ce que la ligne suivante est bien utile ?
-        # elle positionne le contexte
+        # chgt le 15/10/19 
+        # Attention positionne  contexte ?
         # est ce qu on ne doit pas changer le format en Accas si on vient d accas ?
-        if self.format == 'xml' : return jdc
-        if texte == "" :
-           jdc.editor=self
-           jdc.analyse()
+        jdc.editor=self
         return jdc
 
    #--------------------------------#
@@ -287,20 +284,22 @@ class JDCEditorSsIhm :
 
         #jaux=self.readercata.cata[0].JdC( procedure="",
         jaux=self.readercata.cata.JdC( procedure="",
-                               appli=self,
+                               appliEficas=self.appliEficas,
                                cata=self.readercata.cata,
                                cata_ord_dico=self.readercata.cata_ordonne_dico,
                                rep_mat=self.maConfiguration.rep_mat,
                               )
+        jaux.editor=self
         jaux.analyse()
 
         J=JdC_aux( procedure="",
-                   appli=self,
+                   appliEficas=self.appliEficas,
                    cata=self.readercata.cata,
                    cata_ord_dico=self.readercata.cata_ordonne_dico,
                    jdc_pere=jaux,
                    rep_mat=self.maConfiguration.rep_mat,
                    )
+        J.editor=self
         J.analyse()
         if units is not None:
            J.recorded_units=units
@@ -314,9 +313,9 @@ class JDCEditorSsIhm :
     #-----------------------#
 
         # Il faut convertir le contenu du fichier en fonction du format
-        if self.format in convert.plugins :
+        if self.formatFichierIn in convert.plugins :
             # Le convertisseur existe on l'utilise
-            p=convert.plugins[self.format]()
+            p=convert.plugins[self.formatFichierIn]()
             p.readfile(file)
             text=p.convert('execnoparseur')
             if not p.cr.estvide():
@@ -326,7 +325,7 @@ class JDCEditorSsIhm :
             # Il n'existe pas c'est une erreur
             self.afficheInfos("Type de fichier non reconnu",'red')
             self.informe( "Type de fichier non reconnu",
-                    "EFICAS ne sait pas ouvrir le type de fichier " + self.appliEficas.format_fichier_in)
+                    "EFICAS ne sait pas ouvrir le type de fichier " + self.appliEficas.formatFichierIn)
             return None
 
     #----------------------------------------------#
@@ -353,22 +352,26 @@ class JDCEditorSsIhm :
     def viewJdcSource(self):
     #-----------------------#
         if self.fichier == None : return
-        f=open(self.fichier,'r')
-        texteSource=f.read()
-        f.close()
-        self._viewText(texteSource, "JDC_SOURCE")
+        if os.path.isfile(self.fichier):
+           f=open(self.fichier,'r')
+           texteSource=f.read()
+           f.close()
+           self._viewText(texteSource, "JDC_SOURCE")
+        else :
+           self._viewText("file doesn't exist", "JDC_SOURCE")
+
 
     #-----------------------#
     def viewJdcPy(self):
     #-----------------------#
-        strSource = str( self.getTextJDC(self.format) )
+        strSource = str( self.getTextJDC(self.formatFichierOut) )
         self._viewText(strSource, "JDC_RESULTAT")
 
     #-----------------------#
     def viewJdcRapport(self):
     #-----------------------#
         # on ajoute les regles
-        strRapport = six.text_type( self.jdc.report() )
+        strRapport = str( self.jdc.report() )
         self._viewText(strRapport, "JDC_RAPPORT")
 
     #-----------------------#
@@ -382,7 +385,7 @@ class JDCEditorSsIhm :
     def getJdcRapport(self):
     #-----------------------#
         # on ajoute les regles
-        strRapport = six.text_type( self.jdc.report() )
+        strRapport = str( self.jdc.report() )
         return strRapport
 
     #---------------------#
@@ -410,10 +413,10 @@ class JDCEditorSsIhm :
         @return flag indicating success
         """
 
-        fn = six.text_type(fn)
+        fn = str(fn)
 
         if txt == None :
-            txt = self.getTextJDC(self.format,formatLigne=formatLigne)
+            txt = self.getTextJDC(self.formatFichierOut,formatLigne=formatLigne)
             eol = '\n'
             if len(txt) >= len(eol):
                if txt[-len(eol):] != eol:
@@ -431,19 +434,22 @@ class JDCEditorSsIhm :
             f.close()
             return 1
         except IOError as why:
-            self.afficheInfos('Sauvegarde du Fichier', 'Le fichier'+str(fn) + 'n a pas pu etre sauvegarde :'  + str(why))
+            print('Sauvegarde du Fichier', 'Le fichier'+str(fn) + 'n a pas pu etre sauvegarde :'  , str(why))
+            self.afficheInfos('Le fichier'+str(fn) + 'n a pas pu etre sauvegarde '  , 'red')
             return 0
+           
 
     #-----------------------------------------------------------#
-    def getTextJDC(self,format,pourRun=0,formatLigne="beautifie"):
+    def getTextJDC(self,format = None,pourRun=0,formatLigne="beautifie"):
     #-----------------------------------------------------------#
       if self.code == "MAP" and not(format in generator.plugins): format = "MAP"
+      if format == None : format = self.formatFichierOut
       if format in generator.plugins:
 
          # Le generateur existe on l'utilise
          self.generator=generator.plugins[format]()
          try :
-            jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.maConfiguration,appli=self.appliEficas)
+            jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.maConfiguration,appliEficas=self.appliEficas)
             if pourRun : jdc_formate=self.generator.textePourRun
             if self.code == 'TELEMAC' : jdc_formate=self.generator.texteDico
          except ValueError as e:
@@ -486,7 +492,7 @@ class JDCEditorSsIhm :
            hash_checksum = hashlib.md5()
            hash_checksum.update(newtexte.encode('utf-8'))
            checksum = hash_checksum.hexdigest()
-           ligne = "#CHECKSUM:"+checksum+":FIN CHECKSUM"
+           ligne = ligne="#CHECKSUM:"+checksum+":FIN CHECKSUM"
         except : 
            try :
               newtexte=texte.replace('"','\\"')
@@ -509,7 +515,7 @@ class JDCEditorSsIhm :
          dico=self.generator.Dico
          return dico
       else :
-         self.afficheInfos(tr("Format %s non reconnu" , self.format),Qt.red)
+         self.afficheInfos(tr("Format %s non reconnu" , 'Dictionnaire Imbrique' ),'red')
          return ""
 
    #-----------------------------------------#
@@ -522,7 +528,7 @@ class JDCEditorSsIhm :
     def chercheDico(self):
     #-----------------------------------------#
         dicoCourant={}
-        format =  self.appliEficas.format_fichier
+        format =  self.appliEficas.formatFichierOut
         if format in generator.plugins:
            # Le generateur existe on l'utilise
            self.generator=generator.plugins[format]()
@@ -545,7 +551,7 @@ class JDCEditorSsIhm :
         self.generator=generator.plugins[self.format]()
         print (self.generator)
         if hasattr(self.generator, "writeComplet"):
-            self.generator.writeComplet(fichier,self.jdc,config=self.appliEficas.maConfiguration,appli=self.appliEficas)
+            self.generator.writeComplet(fichier,self.jdc,config=self.appliEficas.maConfiguration,appliEficas=self.appliEficas)
 
 
 # ---------------------------------------------
@@ -594,16 +600,18 @@ class JDCEditorSsIhm :
         """
 
 
-        if not (self.writeFile(fichier,formatLigne=formatLigne)): return (0, None)
         self.fichierOut = fichier
-
-        if self.jdc.isValid() != 0 and hasattr(self.generator, "writeDefault"):
+        if not (self.writeFile(fichier,formatLigne=formatLigne)): return (0, None)
+        if  self.jdc.cata.modeleMetier and self.jdc.isValid():
+            if self.generator != self.XMLgenerator :
+               self.XMLgenerator.gener(self.jdc)
+               self.XMLgenerator.writeDefault(fichier)
+               return(1,self.fichier)
+        if self.jdc.isValid() and hasattr(self.generator, "writeDefault"):
             self.generator.writeDefault(fichier)
         elif self.code=="TELEMAC" and hasattr(self.generator, "writeDefault"):
             self.generator.writeDefault(fichier)
-
         self.modified = 0
-
         return (1, self.fichier)
 #
 
@@ -671,7 +679,7 @@ class JDCEditorSsIhm :
         ouChercher=etape
         if debug : print (ouChercher)
         for mot in listeAvant :
-           ouChercher=ouChercher.getChild(mot,restreint="oui", debug=1)
+           ouChercher=ouChercher.getChild(mot,restreint="oui")
         monMC=ouChercher.getChild(MCFils,restreint="oui")
         if monMC == None : monMC = ouChercher.addEntite(MCFils)
         monMC.valeur=valeurs
@@ -690,7 +698,7 @@ class JDCEditorSsIhm :
         ouChercher=etape
         if debug : print (ouChercher)
         for mot in listeAvant :
-           ouChercher=ouChercher.getChild(mot,restreint="oui", debug=1)
+           ouChercher=ouChercher.getChild(mot,restreint="oui")
         # Attention si +sieursMCFACT
         ouChercher=ouChercher[0]
         if debug : print (ouChercher)
index 0bd3abfb2e8c86200caea792b3d673b2eb5964dd..763af0115e56804a0f812fd4d7f7861fd53602b5 100755 (executable)
@@ -28,29 +28,21 @@ except : pass
 
 
 import sys,os
-repIni=os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),".."))
-ihmQTDir=os.path.join(repIni,"UiQT5")
-editeurDir=os.path.join(repIni,"Editeur")
-ihmDir=os.path.join(repIni,"InterfaceQT4")
+repIni     = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),".."))
+ihmQTDir   = os.path.join(repIni,"UiQT5")
+editeurDir = os.path.join(repIni,"Editeur")
+ihmDir     = os.path.join(repIni,"InterfaceQT4")
 
-if ihmDir not in sys.path : sys.path.append(ihmDir)
-if ihmQTDir not in sys.path : sys.path.append(ihmQTDir)
-if editeurDir not in sys.path :sys.path.append(editeurDir)
-
-def getEficasSsIhm(code=None,fichier=None,ssCode=None,multi=False,langue='en',versionCode=None):
-    #print (versionCode)
-    from InterfaceQT4.qtEficasSsIhm import AppliSsIhm
-    Eficas=AppliSsIhm(code=code,salome=0,ssCode=ssCode,multi=multi,langue=langue,versionCode=versionCode)
-    from Editeur  import session
-    options=session.parse(['ssIhm','-k',code,'-v',versionCode])
-    return Eficas
+if ihmDir     not in sys.path : sys.path.append(ihmDir)
+if ihmQTDir   not in sys.path : sys.path.append(ihmQTDir)
+if editeurDir not in sys.path : sys.path.append(editeurDir)
 
 
-def lanceEficas(code=None,fichier=None,ssCode=None,multi=False,langue='en'):
+def lanceEficas(code=None, multi=False, langue='en', labelCode=None):
+#-------------------------------------------------------------------
     """
-        Lance l'appli EFICAS
+        Lance l'appli EFICAS avec Ihm
     """
-    # Analyse des arguments de la ligne de commande
     try :
       from PyQt5.QtWidgets import QApplication
     except :
@@ -58,41 +50,151 @@ def lanceEficas(code=None,fichier=None,ssCode=None,multi=False,langue='en'):
       return
 
     from Editeur  import session
-    options=session.parse(sys.argv)
-    if options.code!= None : code=options.code
-    if options.ssCode!= None : ssCode=options.ssCode
+    options = session.parse(sys.argv)
+    if options.code          != None : code=options.code
 
     from InterfaceQT4.qtEficas import Appli
     app = QApplication(sys.argv)
 
-    #import cProfile, pstats, StringIO
-    #pr = cProfile.Profile()
-    #pr.enable()
-
-    Eficas=Appli(code=code,salome=0,ssCode=ssCode,multi=multi,langue=langue)
-    #pr.disable()
-    #s = StringIO.StringIO()
-    #sortby = 'cumulative'
-    #ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
-    #ps.print_stats()
-    #print (s.getValue())
-
+    Eficas=Appli(code=code,salome=0,multi=multi,langue=langue,labelCode=labelCode)
     Eficas.show()
 
     res=app.exec_()
     sys.exit(res)
 
+def getEficasSsIhm(code=None, multi=False, langue='en', labelCode=None,forceXML=False, genereXSD=False):
+#------------------------------------------------------------------------------------------------------
+    """
+        Lance l'appli EFICAS sans Ihm
+    """
+    from Editeur  import session
+    options = session.parse(sys.argv)
+    if options.code   != None : code=options.code
+    if forceXML : options.withXSD=True
+
+    from InterfaceQT4.qtEficasSsIhm import AppliSsIhm
+    Eficas=AppliSsIhm(code=code, salome=0, multi=multi, langue=langue, labelCode=labelCode, genereXSD=genereXSD)
+    return Eficas
+
 
+
+def genereXSD(code=None):
+#------------------------
+    from Editeur  import session
+    options = session.parse(sys.argv)
+    if code != None : options.code = code
+    if options.fichierCata == None : 
+       print ('Use -c cata_name.py')
+       return
+
+    monEficasSsIhm = getEficasSsIhm(code=options.code,genereXSD=True)
+    monEditor=monEficasSsIhm.getEditor()
+    texteXSD=monEficasSsIhm.dumpXsd(avecEltAbstrait=options.avecEltAbstrait)
+
+    fichierCataTrunc=os.path.splitext(os.path.basename(options.fichierCata))[0]
+    #if fichierCataTrunc[0:4] in ('cata','Cata'): fichierCataTrunc=fichierCataTrunc[4:]
+    #if fichierCataTrunc[0] in ('_','-') : fichierCataTrunc=fichierCataTrunc[1:]
+    fileXSD = fichierCataTrunc + '.xsd'
+
+    f = open( str(fileXSD), 'w')
+    f.write(str(texteXSD))
+
+def genereXML(code=None):
+#-----------------------
+    from Editeur  import session
+    options=session.parse(sys.argv)
+    if code != None : options.code = code
+    if options.fichierCata == None : 
+       print ('Use -c cata_name.py')
+       return
+    fichier=options.comm[0]
+    if fichier==None : 
+       print ('comm file is needed')
+       return
+    
+    monEficasSsIhm = getEficasSsIhm(code=options.code, forceXML=True)
+
+    from .editorSsIhm import JDCEditorSsIhm
+    monEditeur=JDCEditorSsIhm(monEficasSsIhm,fichier)
+    fichierXML=fichier[:fichier.rfind(".")]+'.xml'
+    monEditeur.XMLgenerator.gener(monEditeur.jdc)
+    monEditeur.XMLgenerator.writeDefault(fichierXML)
+
+def validateDataSet(code=None):
+#------------------------------
+    from Editeur  import session
+    options=session.parse(sys.argv)
+    if code != None : options.code = code
+    if options.fichierCata == None : 
+       print ('Use -c cata_name.py')
+       return
+    fichier=options.comm[0]
+    if fichier==None : 
+       print ('comm file is needed')
+       return
+    from .editorSsIhm import JDCEditorSsIhm
+    monEficasSsIhm = getEficasSsIhm(code=options.code)
+    monEditeur=JDCEditorSsIhm(monEficasSsIhm,fichier)
+    if not (monEditeur.jdc.isValid()) : print (monEditeur.getJdcRapport())
+    else : print ('Jdc is valid')
+    return monEditeur.jdc.isValid()
+
+def validateFonction(laFonction, debug=True):
+#-------------------------------
+    # ici un singleton pour avoir l editor, le catalogue et...
+    monEficasSsIhm = getEficasSsIhm(code='Essai')
+    monEditor=monEficasSsIhm.getEditor()
+    print ('_______ validateFonction', laFonction,  laFonction.__name__)
+    from functools  import wraps
+    from collections  import OrderedDict
+    from inspect  import getargspec
+    @wraps(laFonction)
+    def fonctionValidee(*args, **kwargs):
+        laFonctionName = laFonction.__name__
+        if debug : print('Appel {} avec args={} et kwargs={}'.format( laFonction.__name__, args, kwargs))
+        listArgsNames   = list(OrderedDict.fromkeys(getargspec(laFonction)[0]))
+        listKwargsNames = list(kwargs.keys())
+        if debug : print (listArgsNames)
+        if debug : print (listKwargsNames)
+        #listTousNames = listArgsNames+listKwargsNames
+        #if debug : print (listTousNames)
+        #args_dict = OrderedDict(list(zip(args_name, args)) + list(kwargs.iteritems()))
+        #print (args_dict)
+
+        #laDefDeLaFonctionDansAccas = getattr(monEditor.readercata.cata,laFonctionName)
+        #print (laDefDeLaFonctionDansAccas)
+        #print (laDefDeLaFonctionDansAccas.entites)
+        #print (dir(laDefDeLaFonctionDansAccas))
+        #print (args)
+        #dict1={'monArgument1' : 'a', 'monArgument2' : 'uuu'}
+        
+        #objConstruit = laDefDeLaFonctionDansAccas.makeObjetPourVerifSignature(**dict1)
+        #print (objConstruit)
+        #print (objConstruit.isValid())
+        ret = laFonction(*args, **kwargs)
+        return ret
+    return fonctionValidee
+
+        #maClasseAccas=getattr(self.cata,objEtape.monNomClasseAccas)
+    return fonctionValidee
+
+    
+    return laFonction
+   
+
+
+# --------------------------- toutes les fonctions après sont obseletes
 def lanceEficas_ssIhm(code=None,fichier=None,ssCode=None,version=None,debug=False,langue='en'):
     """
-        Lance l'appli EFICAS pour trouver les noms des groupes
+        Lance l'appli EFICAS SsIhm 
     """
     # Analyse des arguments de la ligne de commande
+    print ('deprecated')
     from Editeur  import session
     options=session.parse(sys.argv)
-    if version!=None and options.cata==None : options.cata=version
-    if fichier==None : fichier=options.comm[0]
-    if code == None : code=options.code
+    if version!=None and options.version == None : options.version=version
+    if fichier == None : fichier=options.comm[0]
+    if code    == None : code=options.code
 
     from .qtEficas import Appli
     Eficas=Appli(code=code,salome=0,ssCode=ssCode,ssIhm=True,langue=langue)
@@ -110,14 +212,17 @@ def lanceEficas_ssIhm(code=None,fichier=None,ssCode=None,version=None,debug=Fals
     return monEditeur
 
 def lanceEficas_ssIhm_chercheGroupes(code=None,fichier=None,ssCode=None,version=None):
+    print ('deprecated')
     monEditeur=lanceEficas_ssIhm(code,fichier,ssCode,version)
     print((monEditeur.chercheGroupes()))
 
 def lanceEficas_ssIhm_cherche_cr(code=None,fichier=None,ssCode=None,version=None):
+    print ('deprecated')
     monEditeur=lanceEficas_ssIhm(code,fichier,ssCode,version)
     print((monEditeur.jdc.cr))
 
 def lanceEficas_ssIhm_reecrit(code=None,fichier=None,ssCode=None,version=None,ou=None,cr=False,debug=False,leger=False,langue='ang'):
+    print ('deprecated')
     #print 'lanceEficas_ssIhm_reecrit', fichier
     monEditeur=lanceEficas_ssIhm(code,fichier,ssCode,version,langue=langue)
     if ou == None : 
@@ -154,13 +259,12 @@ def lanceEficas_param(code='Adao',fichier=None,version='V0',macro='ASSIMILATION_
     """
         Lance l'appli EFICAS pour trouver les noms des groupes
     """
+    print ('deprecated')
     # Analyse des arguments de la ligne de commande
     from Editeur  import session
     options=session.parse(sys.argv)
 
     from .qtEficas import Appli
-    #app = QApplication(sys.argv)
-    #Eficas=Appli(code=code,ssCode=None,salome=0)
 
     from .ssIhm  import QWParentSSIhm
     Eficas=QWParentSSIhm(code,version)
@@ -176,10 +280,6 @@ def lanceEficas_param(code='Adao',fichier=None,version='V0',macro='ASSIMILATION_
     parameters=getJdcParameters(texte,macro)
     return parameters
 
-#def getEficasSsIhm(code='Adao',versionCode='V0'):
-#    from .qtEficasSsIhm import AppliSsIhm
-#    Eficas=AppliSsIhm(code=code,ssCode=None,salome=0)
-#    return Eficas
 
 def getJdcParameters(jdc,macro):
     """
@@ -187,6 +287,7 @@ def getJdcParameters(jdc,macro):
     specified jdc text to a python dictionnary whose keys are the
     names of the data of the macro.
     """
+    print ('deprecated')
     context = {}
     source = "def args_to_dict(**kwargs): return kwargs \n"
     source+= "%s = _F = args_to_dict          \n"%macro
@@ -202,6 +303,7 @@ def loadJDC(filename):
     This function loads the text from the specified JdC file. A JdC
     file is the persistence file of Eficas (*.comm).
     """
+    print ('deprecated')
     fcomm=open(filename,'r')
     jdc = ""
     for line in fcomm.readlines():
@@ -215,6 +317,6 @@ def loadJDC(filename):
 if __name__ == "__main__":
     import sys
     sys.path.insert(0,os.path.abspath(os.path.join(os.getcwd(),'..')))
-    lanceEficas(code=None,fichier=None,ssCode=None,multi=True)
+    lanceEficas(code=None,multi=True)
     
 
index bd1c1d689a1f0c1ac210edba81b52c0f750060a8..41dc13fa5576e19e13ac83a651027ad3bf7daa89 100644 (file)
@@ -174,12 +174,12 @@ class Feuille(QWidget,ContientIcones,SaisieValeur,FacultatifOuOptionnel):
             #c=str('<html><head/><body><p><span style=" font-size:8pt; ">')+c+"</span></p></body></html>"
             c=str('<html><head/><body><p>')+c+"</p></body></html>"
             self.label.setToolTip(c)
+
       if self.editor.maConfiguration.differencieSiDefaut :
             self.label.setToolTip('defaut : ' + tr(str(self.node.item.object.definition.defaut)))
 
 
 
-
    def showEvent(self, event):
       if self.prendLeFocus==1 :
          self.activateWindow()
index 13b31b09a9d7be29acb054295725b40dcfe195b6..26ba38f4d2493f5c77176b207d461ee0f40c6c13 100644 (file)
@@ -27,7 +27,6 @@ except : pass
 
 import types,os,re,sys
 import traceback
-import six
 import inspect
 
 from PyQt5.QtWidgets import QMessageBox, QFileDialog , QMenu, QPushButton, QTreeView ,QListView, QAbstractItemView
@@ -281,7 +280,7 @@ class ContientIcones(object):
 
       fichier=fichier[0]
       if not(fichier == ""):
-         ulfile = os.path.abspath(six.text_type(fichier))
+         ulfile = os.path.abspath(fichier)
          self.appliEficas.maConfiguration.savedir=os.path.split(ulfile)[0]
          self.lineEditVal.setText(fichier)
          self.editor.afficheCommentaire(tr("Fichier selectionne"))
@@ -350,7 +349,7 @@ class ContientIcones(object):
             options = QFileDialog.ShowDirsOnly)
 
       if not (directory == "") :
-         absdir = os.path.abspath(six.text_type(directory))
+         absdir = os.path.abspath(directory)
          self.appliEficas.maConfiguration.savedir = os.path.dirname(absdir)
          self.lineEditVal.setText(directory)
          self.LEvaleurPressed()
index 55b66eec524f72b5dc1975e17fcd09baea749805..e7d20873495a100cced161f43994dea91a9ab5d2 100644 (file)
@@ -62,10 +62,12 @@ class Groupe(QWidget,FacultatifOuOptionnel):
       self.dictMCVenantDesBlocs={}
       if hasattr(self,'RBDeplie')  : self.RBDeplie.clicked.connect(self.setDeplie)
       if hasattr(self,'RBPlie')    : self.RBPlie.clicked.connect( self.setPlie)
+
       self.setAcceptDrops(True)
-      if hasattr (self, 'commandesLayout'): 
-         spacerItem = QSpacerItem(20, 5, QSizePolicy.Minimum, QSizePolicy.Expanding)
-         self.commandesLayout.addItem(spacerItem)
+      #if hasattr (self, 'commandesLayout'): 
+      #   print (' j ajoute un spacer dans ', self.node.item.nom)
+      #   spacerItem = QSpacerItem(20, 5, QSizePolicy.Minimum, QSizePolicy.Expanding)
+      #   self.commandesLayout.addItem(spacerItem)
      
   def donneFocus(self):
       for fenetre in self.listeFocus:
@@ -81,7 +83,6 @@ class Groupe(QWidget,FacultatifOuOptionnel):
       for node in self.node.children:
            # non return mais  continue car il faut tenir compte des blocs
            if node.appartientAUnNoeudPlie==True : continue
-           #print "je suis apres le if pour ",node.item.nom
            widget=node.getPanelGroupe(self,self.maCommande)
            #print ("widget pour ", node.item.nom, widget)
            self.listeFocus.append(node.fenetre)
@@ -111,10 +112,10 @@ class Groupe(QWidget,FacultatifOuOptionnel):
            return
         
   def afficheOptionnel(self):
+        if self.editor.maConfiguration.closeOptionnel : return
         liste,liste_rouge=self.ajouteMCOptionnelDesBlocs()
         self.monOptionnel=self.editor.widgetOptionnel
         self.monOptionnel.afficheOptionnel(liste,liste_rouge,self)
-        #self.monOptionnel.affiche(liste)
            
 
   def ajouteMCOptionnelDesBlocs(self):
@@ -195,7 +196,8 @@ class Groupe(QWidget,FacultatifOuOptionnel):
       self.reaffiche(self.node) 
 
   def setDeplie(self):
-      #print ('je passe ds setDeplie de groupe')
+      #print ('je passe ds setDeplie de groupe', self.obj.nom)
+      self.node.firstDeplie = False
       self.node.setDeplie()
       self.reaffiche(self.node) 
     
@@ -203,3 +205,7 @@ class Groupe(QWidget,FacultatifOuOptionnel):
   def traiteClicSurLabel(self,texte):
       if self.editor.code != "CARMELCND" : self.afficheOptionnel()
 
+
+  def propageChange(self,leType):
+      self.parentQt.propageChange(leType)
+
index 335d164453743f3294e8b4fc936b87d62775db18..788647072e6e09b2284e10b4b6bc5570287b93ac 100644 (file)
@@ -21,8 +21,6 @@
 
 from __future__ import absolute_import
 import re
-import six
-
 import os
 
 
@@ -42,7 +40,7 @@ class MonBoutonValide(QToolButton) :
         strAide=self.parent.node.item.object.getFr()
         if hasattr(self.parent.node.item.object.definition, 'defaut') :
                 strAide+='\ndefaut : \n'+str(self.parent.node.item.object.definition.defaut)
-        strRapport=six.text_type(self.parent.node.item.object.report())
+        strRapport=str(self.parent.node.item.object.report())
         self.parent.editor._viewText(strAide+"\n"+strRapport, "JDC_RAPPORT")
 
      def mousePressEvent(self, event):
@@ -57,7 +55,7 @@ class MonBoutonValide(QToolButton) :
           QToolTip.showText(event.globalPos(),myToolTip )
        else :
           t=""
-          texte=six.text_type(self.parent.node.item.object.report())
+          texte=self.parent.node.item.object.report().report()
           deb=1
           for l in texte.split('\n')[2:-2]:
               if re.match('^[\t !]*$',l) : continue
index 59fc60989b8901d425890895690d0e1cfaa2cfb6..a5a2ddcca28d8379b8407b06205b245d9adfb4b7 100644 (file)
@@ -40,11 +40,11 @@ class MonChoixCode(Ui_ChoixCode,QDialog):
   a l'utilisateur de choisir une seule valeur parmi une liste de valeurs
   discretes
   """
-  def __init__(self,  parentAppli=None):
-      QDialog.__init__(self,parent=parentAppli,flags=Qt.Window)
+  def __init__(self,  appliEficas=None):
+      QDialog.__init__(self,parent=appliEficas,flags=Qt.Window)
       self.setModal(True)
       self.setupUi(self)
-      self.parentAppli=parentAppli
+      self.appliEficas=appliEficas
       self.verifieInstall()
       self.code=None
       self.buttonBox.accepted.disconnect(self.accept)
@@ -93,14 +93,14 @@ class MonChoixCode(Ui_ChoixCode,QDialog):
               self.groupCodes.addButton(bouton)
           except :
               pass
-      self.parentAppli.listeCode=self.parentAppli.listeCode+listeCodesIntegrateur
+      self.appliEficas.listeCode=self.appliEficas.listeCode+listeCodesIntegrateur
 
   def choisitCode(self):
       bouton=self.groupCodes.checkedButton()
       if bouton==None : return
       code=str(bouton.text())
       codeUpper=code.upper()
-      self.parentAppli.code=codeUpper
+      self.appliEficas.code=codeUpper
       try :
           dirCode=os.path.abspath(os.path.join(os.path.abspath(__file__),'../..',code))
           l=os.listdir(dirCode)
index 7d41beec1757c2bececdfb99b7843b87acfc7567..990fc1c0407c21e5d44977cb3861d9780a504030 100644 (file)
@@ -101,7 +101,7 @@ class MonChoixCommande(Ui_ChoixCommandes,QWidget):
          self.boolOrdre==1;  
          self.RBOrdre.setChecked(True);  
          self.afficheOrdre()
-      if self.editor.maConfiguration.closeFrameRechercheCommande == True : self.frameAffichage.close()
+      if self.editor.maConfiguration.closeFrameRechercheCommandeSurPageDesCommandes == True : self.frameAffichage.close()
 
       if self.editor.widgetTree != None : self.editor.restoreSplitterSizes(2) 
       else: self.editor.restoreSplitterSizes(3)
index ed44719f869a83b41e4c2c460eed7acbb17a4b3b..decc00bec370fe8b38978c9224417ae5875b9473 100644 (file)
@@ -37,22 +37,22 @@ class MonChoixLangue(Ui_ChoixLangue,QDialog):
   a l'utilisateur de choisir une seule valeur parmi une liste de valeurs
   discretes
   """
-  def __init__(self,  parentAppli=None):
-      QDialog.__init__(self,parentAppli)
+  def __init__(self,  appliEficas=None):
+      QDialog.__init__(self,appliEficas)
       self.setModal(True)
       self.setupUi(self)
-      self.parentAppli=parentAppli
+      self.appliEficas=appliEficas
       self.installLangue()
       self.code=None
       self.pB_OK.clicked.connect(self.choisitLangue)
 
 
   def installLangue(self):
-      if self.parentAppli.langue == 'fr' : self.rbFrancais.setChecked(True)
+      if self.appliEficas.langue == 'fr' : self.rbFrancais.setChecked(True)
       else : self.rbEnglish.setChecked(True)
 
   def choisitLangue(self):
-      if self.rbFrancais.isChecked() : self.parentAppli.langue='fr'
-      else                           : self.parentAppli.langue ='ang'
+      if self.rbFrancais.isChecked() : self.appliEficas.langue='fr'
+      else                           : self.appliEficas.langue ='ang'
       self.close()
 
index 31cc2245d3f91cc9032b173b6ee965476a612b7f..93dd41026fa4f2d2b45843a2d33c93794fc8b8ce 100644 (file)
@@ -25,7 +25,6 @@ try :
 except : pass
 
 import types,os
-from six.moves import range
 from PyQt5.QtCore import  Qt
 
 
index 0c167c9b377901c640281ee4431c61098522cd9c..c57813abea19d6d3ec09a31907f647abba6bfd51 100644 (file)
@@ -27,7 +27,6 @@ import types,os
 import traceback
 
 from Extensions.i18n import tr
-import six
 
 from PyQt5.QtWidgets import QDialog, QMessageBox, QFileDialog
 from PyQt5.QtCore import QSize
@@ -68,7 +67,7 @@ class ViewText(Ui_dView,QDialog):
         if fn == ""  : return
         if fn == None : return (0, None)
 
-        ulfile = os.path.abspath(six.text_type(fn))
+        ulfile = os.path.abspath(fn)
         if self.editor != None :
            self.editor.appliEficas.maConfiguration.savedir=os.path.split(ulfile)[0]
         try:
index 1dc335269dba42b337554d9357b6d4bc3e002a80..1f656d4f2381b5f4ba1e7b3456c9f3de159d61cb 100644 (file)
@@ -31,6 +31,9 @@ class MonWidgetBloc(Ui_WidgetBloc,Groupe):
   def __init__(self,node,editor,parentQt,definition, obj, niveau,commande):
       #print ("bloc : ",node.item.nom)
       Groupe.__init__(self,node,editor,parentQt, definition,obj,niveau,commande)
+      #if self.editor.maConfiguration.afficheCommandesPliees ==True:  self.node.plieToutEtReaffiche()
       self.parentQt.commandesLayout.insertWidget(-1,self,1)
 
 
+  def afficheOptionnel(self):
+      return
index a23b51fc6c20955aaeb1169becddd9b945c99750..3e12bb6b8a8b0502afc3ba248a91ec0fd609258c 100644 (file)
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Copyright (C) 2007-2017   EDF R&D
+# Copyright (C) 2007-2020   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
@@ -34,7 +34,7 @@ from InterfaceQT4.politiquesValidation  import PolitiqueUnique
 from InterfaceQT4.qtSaisie              import SaisieValeur
 
 from PyQt5.QtWidgets import QComboBox, QCompleter
-from PyQt5.QtCore import Qt
+from PyQt5.QtCore import Qt, QEvent
 
 
 class MonWidgetCBCommun (Feuille):
@@ -45,7 +45,7 @@ class MonWidgetCBCommun (Feuille):
         self.determineChoix()
         self.setValeursApresBouton()
         self.CBChoix.currentIndexChanged.connect(self.choixSaisi)
-        #self.CBChoix.lineEdit().setText(tr("Select"))
+        self.CBChoix.wheelEvent=self.wheelEvent
         self.parentQt.commandesLayout.insertWidget(-1,self)
         self.maCommande.listeAffichageWidget.append(self.CBChoix)
         self.AAfficher=self.CBChoix
@@ -54,7 +54,6 @@ class MonWidgetCBCommun (Feuille):
   def setValeursApresBouton(self):
       if self.objSimp.getValeur()==None : 
          self.CBChoix.setCurrentIndex(-1)
-         #self.CBChoix.lineEdit().setStyleSheet(("QLineEdit {" " background:yellow;\n" "font: italic ;\n" " }\n" " "))
          self.CBChoix.lineEdit().setText(tr("Select"))
          return
       valeur=self.objSimp.getValeur()
@@ -83,14 +82,20 @@ class MonWidgetCBCommun (Feuille):
       SaisieValeur.LEvaleurPressed(self,valeur)
       self.reaffiche()
 
+  def wheelEvent(self,  event):
+  # Sinon poum sur les fenetres trop longues
+  # lorsque la widget attrape le wheelevent
+    event.ignore()
+
+
 class MonWidgetCB (Ui_WidgetCB, MonWidgetCBCommun):
 
   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
-      self.maListeDeValeur=monSimpDef.into
+      self.maListeDeValeur = monSimpDef.into
       MonWidgetCBCommun. __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
 
 class MonWidgetCBSD (Ui_WidgetCB,MonWidgetCBCommun):
 
   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
-      self.maListeDeValeur=node.item.getSdAvantDuBonType()
+      self.maListeDeValeur = node.item.getSdAvantDuBonType()
       MonWidgetCBCommun.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
index c2e71c7ab63e882e5586188bae55f3a053c677b5..8075451d98d7167521225fd1b686c5d06167797a 100644 (file)
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Copyright (C) 2007-2017   EDF R&D
+# Copyright (C) 2007-2020   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
@@ -43,16 +43,16 @@ from monWidgetIntoSug       import GereAjoutDsPossible
 class MonWidgetCBIntoSug (MonWidgetCBCommun, Ui_WidgetCBIntoSug,GereAjoutDsPossible):
   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
       self.maListeDeValeur=monSimpDef.into
-      if node.item.hasIntoSug() : self.maListeDeValeur=node.item.getListePossibleAvecSug([])
-      if hasattr(node.item,'suggestion') : self.maListeDeValeur+=  node.item.suggestion
+      if node.item.hasIntoSug()          : self.maListeDeValeur  = node.item.getListePossibleAvecSug([])
+      if hasattr(node.item,'suggestion') : self.maListeDeValeur +=  node.item.suggestion
       MonWidgetCBCommun. __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
       self.lineEditVal.returnPressed.connect(self.LEValeurAjouteDsPossible)
 
   def ajouteValeurPossible(self,valeur):
       self.CBChoix.addItem(valeur)
       # on ne sait pas si on a deja ajouté une valeur
-      try : self.node.item.suggestion.append(valeur)
-      except : self.node.item.suggestion=(valeur,)
+      try    : self.node.item.suggestion.append(valeur)
+      except : self.node.item.suggestion = (valeur,)
       self.lineEditVal.setText('')
       self.CBChoix.setCurrentIndex(self.CBChoix.findText(valeur));
       
index 9c381ab8c29c51c76b1bd2c5b12ea23b3e8f620b..54ab0e555788e1616311ef4e929c679a6172b6c5 100644 (file)
@@ -47,84 +47,75 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe):
   """
   """
   def __init__(self,node,editor,etape):
+
       self.listeAffichageWidget=[]
       self.inhibe=0
       self.ensure=0
       editor.inhibeSplitter=1
       Groupe.__init__(self,node,editor,None,etape.definition,etape,1,self)
+      spacerItem = QSpacerItem(21, 500, QSizePolicy.Expanding, QSizePolicy.Expanding)
+      self.verticalLayoutCommande.addItem(spacerItem)
       editor.inhibeSplitter=0
 
-      resize=0
-      if node.item.getFr() != "" : 
-         self.labelDoc.setText(node.item.getFr())
-         resize=1
-      else : self.labelDoc.close()
-      
-      if not(hasattr(etape.definition,'sd_prod')) or (etape.definition.sd_prod==None): self.LENom.close()
+      # Gestion du nom de L OPER si il est nomme 
+      if   not(hasattr(etape.definition,'sd_prod')) or (etape.definition.sd_prod==None): self.LENom.close()
       elif (hasattr(etape.definition,'sd_prod') and type(etape.definition.sd_prod)== types.FunctionType):self.LENom.close()
       elif (hasattr(etape, 'sdnom')) and etape.sdnom != "sansnom" and etape.sdnom != None: 
-           self.LENom.setText(etape.sdnom)
-           resize=resize*1
+         self.LENom.setText(etape.sdnom)
       else : 
-           self.LENom.setText("")
-           resize=resize*1
-      if resize :
+         self.LENom.setText("")
+      if hasattr(self,'LENom'): self.LENom.returnPressed.connect(self.nomChange)
+      self.racine=self.node.tree.racine
+      if self.node.item.getIconName() == "ast-red-square" : self.LENom.setDisabled(True)
+
+      # Gestion de la doc de l objet
+      if node.item.getFr() != "" : 
+         self.labelDoc.setText(node.item.getFr())
          nouvelleSize=self.frameAffichage.height()+60
          self.frameAffichage.setMinimumHeight(nouvelleSize)
          self.frameAffichage.resize(self.frameAffichage.width(),nouvelleSize)
+      else : self.labelDoc.close()
       
-
-
+   
+      # Gestion du nom de l etape
       maPolice= QFont("Times", 10,)
       self.setFont(maPolice)
       self.labelNomCommande.setText(tr(self.obj.nom))
 
 
+      # Gestion du Frame d affichage des autres commandes
       if self.editor.maConfiguration.closeAutreCommande == True  : self.closeAutreCommande()
       else :
-        try :
-           self.bCatalogue.clicked.connect(self.afficheCatalogue)
-           self.bAvant.clicked.connect(self.afficheAvant)
-           self.bApres.clicked.connect(self.afficheApres)
-        except :
-           pass
+         self.bCatalogue.clicked.connect(self.afficheCatalogue)
+         self.bAvant.clicked.connect(self.afficheAvant)
+         self.bApres.clicked.connect(self.afficheApres)
        
-      if hasattr(self,'LENom'): self.LENom.returnPressed.connect(self.nomChange)
-   
-      if self.editor.code in ['Adao','ADAO'] and self.editor.maConfiguration.closeFrameRechercheCommande==True  : 
-                      self.frameAffichage.close()
       if self.editor.maConfiguration.closeFrameRechercheCommande==True  : 
+         self.frameAffichage.close()
          self.closeAutreCommande()
 
-      if self.editor.code in ['CARMELCND',] : self.closeAutreCommande()
-      self.racine=self.node.tree.racine
-      if self.node.item.getIconName() == "ast-red-square" : self.LENom.setDisabled(True)
 
       self.setAcceptDrops(True)
       self.etablitOrdre()
 
-      if self.editor.code == "CARMELCND" : 
+      if self.editor.maConfiguration.enleverPoubellePourCommande  : 
          self.RBPoubelle.close() # JDC Fige
+
+      if self.editor.maConfiguration.pasDeMCOptionnels  : 
          return                  # Pas de MC Optionnels pour Carmel
 
       from .monWidgetOptionnel import MonWidgetOptionnel
       if self.editor.widgetOptionnel!= None : 
-        self.monOptionnel=self.editor.widgetOptionnel
+         self.monOptionnel=self.editor.widgetOptionnel
       else :
-        self.editor.inhibeSplitter=1
-        self.monOptionnel=MonWidgetOptionnel(self.editor)
-        self.editor.widgetOptionnel=self.monOptionnel
-        self.editor.splitter.addWidget(self.monOptionnel)
-        self.editor.ajoutOptionnel()
-        self.editor.inhibeSplitter=0
-        self.monOptionnel=self.editor.widgetOptionnel
+         self.editor.inhibeSplitter=1
+         self.monOptionnel=MonWidgetOptionnel(self.editor)
+         self.editor.widgetOptionnel=self.monOptionnel
+         self.editor.splitter.addWidget(self.monOptionnel)
+         self.editor.ajoutOptionnel()
+         self.editor.inhibeSplitter=0
+         self.monOptionnel=self.editor.widgetOptionnel
       self.afficheOptionnel()
-      spacerItem = QSpacerItem(21, 500, QSizePolicy.Expanding, QSizePolicy.Expanding)
-      #spacerItem = QSpacerItem(21, 20, QSizePolicy.Preferred, QSizePolicy.Preferred)
-      #self.commandesLayout.addItem(spacerItem)
-      self.verticalLayoutCommande.addItem(spacerItem)
-
-      #self.editor.restoreSplitterSizes()
 
       #print "fin init de widget Commande"
       
@@ -147,12 +138,12 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe):
       # on s assure que ce n est pas un chgt de fenetre
       #print "je passe dans focusNextPrevChild"
       if self.editor.fenetreCentraleAffichee != self : return True
-      f=self.focusWidget()
+      f = self.focusWidget()
       if f not in self.listeAffichageWidget :
          i=0
          while not hasattr (f,'AAfficher') :
            if f==None :i=-1; break
-           f=f.parentWidget()
+           f = f.parentWidget()
          if hasattr(f,'AAfficher') : f=f.AAfficher
          if i != -1 : i=self.listeAffichageWidget.index(f)
       else :i=self.listeAffichageWidget.index(f) 
@@ -197,10 +188,6 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe):
          i=i+1
       # si on boucle on perd l'ordre
  
-  def  afficheNieme(self,n):
-      #print ('ds afficheNieme')
-      self.listeAffichageWidget[n].setFocus(7)
-
   def  afficheSuivant(self,f):
       #print ('ds afficheSuivant')
       try :
@@ -231,6 +218,7 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe):
 
   def afficheOptionnel(self):
       # N a pas de parentQt. doit donc etre redefini
+      if self.editor.maConfiguration.closeOptionnel : self.editor.fermeOptionnel()
       liste,liste_rouge=self.ajouteMCOptionnelDesBlocs()
       #print "dans afficheOptionnel", self.monOptionnel
       # dans le cas ou l insertion n a pas eu leiu (souci d ordre par exemple)
@@ -242,7 +230,6 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe):
 
   def focusInEvent(self,event):
       #print "je mets a jour dans focusInEvent de monWidget Commande "
-      if self.editor.code == "CARMELCND" : return #Pas de MC Optionnels pour Carmel
       self.afficheOptionnel()
 
 
@@ -264,17 +251,6 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe):
       else : self.recentre()
       self.inhibeExpand=False
 
-  def reafficheSeulement(self,nodeAReafficher,index):
-      #print ('ds reafficheSeulement', nodeAReafficher)
-      parentNodeAReafficher=nodeAReafficher.parentQt
-      index=parentNodeAReafficher.commandesLayout.indexOf(nodeAReafficher)
-      oldFenetre=nodeAReafficher.node.fenetre
-      newWidget=nodeAReafficher.node.getPanelGroupe(parentNodeAReafficher,self,index)
-      nodeAReafficher.node.fenetre=newWidget
-      oldFenetre.setParent(None)
-      oldFenetre.close()
-      oldFenetre.deleteLater()
-      #print ("fin pour " , self.node.item.nom)
 
 
   def recentre(self):
@@ -283,13 +259,7 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe):
       s.horizontalScrollBar().setSliderPosition(self.avantH)
       s.verticalScrollBar().setSliderPosition(self.avantV)
 
-  def rendVisibleNoeud(self,node):
-      self.f=node.fenetre
-      #print "dans rendVisibleNoeud",self.f
-      QTimer.singleShot(1, self.rendVisible)
-     
   def rendVisible(self):
-      #print "dans rendVisible",self.f
       QApplication.processEvents()
       self.f.setFocus(7)
       self.editor.fenetreCentraleAffichee.scrollAreaCommandes.ensureWidgetVisible(self.f)
@@ -310,12 +280,27 @@ class MonWidgetCommande(Ui_WidgetCommande,Groupe):
       if not(hasattr (self,'RBValide')) : return
       icon = QIcon()
       if self.node.item.object.isValid() : icon=QIcon(self.repIcon+"/ast-green-ball.png")
-      else : icon=QIcon(self.repIcon+"/ast-red-ball.png")
+      else :                               icon=QIcon(self.repIcon+"/ast-red-ball.png")
       nomIcone = self.node.item.getIconName()
       if nomIcone == "ast-yellow-square" : icon=QIcon(self.repIcon+"/ast-yel-ball.png")
-      if nomIcone == "ast-red-square" : self.LENom.setDisabled(True)
+      if nomIcone == "ast-red-square"    : self.LENom.setDisabled(True)
 
       self.LENom.setDisabled(False)
       self.RBValide.setIcon(icon)
 
 
+  def propageChange(self,typeChange):
+      aReecrire=self.propageChangeEnfant(self.node.item.object,typeChange)
+      if aReecrire : self.node.affichePanneau()
+
+  def propageChangeEnfant(self,mc, typeChange):
+      for enfant in mc.mcListe:
+          if enfant.nature == 'MCSIMP' :
+             if enfant.waitUserAssd():
+                if enfant.definition.type[0] == typeChange: return True
+          else :
+            if enfant.nature == 'MCList' : enfant=enfant[0]
+            if self.propageChangeEnfant(enfant, typeChange) : return True
+      return False
+             
+             
index a46ebddc6e5b1f4dfe592acefcf69c522562fedb..d53025c1ce3e8f0f8f357a947fed3f713a6e0da4 100644 (file)
@@ -24,7 +24,6 @@ try :
 except : pass
 
 import types,os,re
-from six.moves import range
 pattern_name       = re.compile(r'^[^\d\W]\w*\Z')
 
 # Modules Eficas
diff --git a/InterfaceQT4/monWidgetCreeUserAssd.py b/InterfaceQT4/monWidgetCreeUserAssd.py
new file mode 100644 (file)
index 0000000..ba6cd4b
--- /dev/null
@@ -0,0 +1,184 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2020   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
+from __future__ import absolute_import
+import types,os
+
+
+# Modules Eficas
+from Extensions.i18n import tr
+from .monWidgetSimpTxt  import MonWidgetSimpTxt
+from .monWidgetPlusieursBase import MonWidgetPlusieursBase
+from copy import copy,deepcopy
+from PyQt5.QtCore import Qt
+
+
+      
+class MonWidgetCreeUserAssd ( MonWidgetSimpTxt):
+  def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
+      MonWidgetSimpTxt. __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
+      #self.lineEditVal.returnPressed.connect(self.LEValeurAjouteDsPossible)
+
+  def LEvaleurPressed(self):
+      try :
+        if str(self.lineEditVal.text())=="" or str(self.lineEditVal.text())==None : return
+      except : pass
+      valeurEntree = str(self.lineEditVal.text())
+      if valeurEntree == self.oldValeurTexte : return
+      if self.oldValeurTexte == ""  : enCreation = True
+      else                          : enCreation = False
+      if enCreation : validite,commentaire=self.objSimp.creeUserASSDetSetValeur(valeurEntree)
+      else          : validite,commentaire=self.objSimp.renommeSdCree(valeurEntree)
+      if not enCreation : self.node.updateNodeTexte()
+      #PNPNPN -- signal update sur les fils ou ?
+      if commentaire != "" :
+         if validite : 
+            self.editor.afficheCommentaire(commentaire)
+            self.oldValeurTexte = self.lineEditVal.text()
+         else  : 
+            self.editor.afficheInfos(commentaire,Qt.red)
+            self.lineEditVal.setText("")
+            self.oldValeurTexte=""
+      self.parentQt.propageChange(self.objSimp.definition.type[0])
+      
+       
+class MonWidgetCreeListeUserAssd ( MonWidgetPlusieursBase):
+  def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
+      MonWidgetPlusieursBase. __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
+      
+  def ajout1Valeur(self,valeur=None):
+      if not valeur in list(self.dictValeurs.keys()):
+         validite,commentaire=self.objSimp.creeUserASSDetSetValeur(valeur)
+         MonWidgetPlusieursBase.ajout1Valeur(self,valeur)
+
+  def changeValeur(self,changeDePlace=False,oblige=False,numero=None):
+      #print ('dans changeValeur du CreeUserAssd', changeDePlace,numero)
+      self.changeUnLineEdit=False
+      if numero==None : 
+           self.echangeDeuxValeurs()
+           return
+      valeur = self.lineEditEnEdition.text()
+      #print (valeur)
+      if numero in list(self.dictLE.keys()) :
+         oldValeurUserAssd = self.dictLE[numero] 
+         if oldValeurUserAssd == None or oldValeurUserAssd == "" : enCreation = True
+         else : enCreation = False
+      else                         : 
+         enCreation     = True
+         oldValeurUserAssd =  ""
+      #print ('je traite')
+      if enCreation : validite, objASSD, commentaire=self.objSimp.creeUserASSD(valeur)
+      elif oldValeurUserAssd.nom == valeur : return
+      else :  
+         validite, commentaire=self.node.item.renommeSdCreeDsListe(oldValeurUserAssd,valeur)
+         nomDernierLineEdit="lineEditVal"+str(numero+1)
+         dernier=getattr(self,nomDernierLineEdit)
+         dernier.setFocus()
+         return
+  
+      if commentaire != "" and not validite:
+            self.editor.afficheInfos(commentaire,Qt.red)
+            self.lineEditEnEdition.setText("")
+            return
+      # on relit tout pour tenir compte des lignes blanches 
+      liste=[]
+      for i in range (1, self.indexDernierLabel+1):
+          if i == numero : liste.append(objASSD)
+          if i in list(self.dictLE.keys()) :
+             if self.dictLE[i] != None and self.dictLE[i] != "" : liste.append(self.dictLE[i])
+      self.node.item.object.state='changed'
+      validite=self.node.item.setValeur(liste)
+      self.setValide()
+      validite=self.node.item.isValid()
+      if validite : 
+         self.dictLE[numero] = objASSD
+         self.node.item.rattacheUserASSD(objASSD)
+         if self.indexDernierLabel < len(liste)  : self.ajoutLineEdit()
+         nomDernierLineEdit="lineEditVal"+str(numero+1)
+         self.listeValeursCourantes=liste
+         dernier=getattr(self,nomDernierLineEdit)
+         dernier.setFocus()
+      else : 
+         self.editor.afficheInfos('ajout impossible' ,Qt.red)
+         if objASSD : objASSD.supprime()
+         self.lineEditEnEdition.setText("")
+      self.parentQt.propageChange(self.objSimp.definition.type[0])
+
+
+  def leaveEventScrollArea(self,event):
+      pass
+
+  def echangeDeuxValeurs(self):
+      self.changeUnLineEdit=False
+      obj1=self.dictLE[self.num1] 
+      obj2=self.dictLE[self.num2] 
+      self.dictLE[self.num1]=obj2
+      self.dictLE[self.num2]=obj1
+      nomLineEdit=self.nomLine+str(self.num1)
+      courant=getattr(self,nomLineEdit)
+      if self.dictLE[self.num1] != None : courant.setText(self.dictLE[self.num1].nom)
+      else : courant.setText("")
+      nomLineEdit=self.nomLine+str(self.num2)
+      courant=getattr(self,nomLineEdit)
+      if self.dictLE[self.num2] != None : courant.setText(self.dictLE[self.num2].nom)
+      else : courant.setText("")
+      liste=[]
+      for i in list(self.dictLE.keys()): 
+             if self.dictLE[i] != None and self.dictLE[i] != "" : liste.append(self.dictLE[i])
+      validite=self.node.item.setValeur(liste)
+      courant.setFocus(True)
+
+  def descendLesLignes(self):
+      self.changeUnLineEdit=False
+      if self.numlineEditEnCours==self.indexDernierLabel : return
+      nouvelleValeur=None
+      for i in range (self.numlineEditEnCours+1, self.indexDernierLabel):
+             valeurAGarder=self.dictLE[i]
+             self.dictLE[i]=nouvelleValeur
+             nomLineEdit=self.nomLine+str(i)
+             courant=getattr(self,nomLineEdit)
+             if nouvelleValeur != None : courant.setText(nouvelleValeur.nom)
+             else : courant.setText("")
+             nouvelleValeur=valeurAGarder
+      
+
+  def moinsPushed(self):
+     if self.numlineEditEnCours == 0 : return
+     if self.indexDernierLabel == 0 : return
+     objASSD=self.dictLE[self.numlineEditEnCours]
+     if objASSD : objASSD.supprime()
+     self.lineEditEnEdition.setText("")
+
+     #self.dictLE.pop(self.numlineEditEnCours)
+     for i in range (self.numlineEditEnCours, self.indexDernierLabel-1):
+             self.dictLE[i]= self.dictLE[i+1]
+             nomLineEdit=self.nomLine+str(i)
+             courant=getattr(self,nomLineEdit)
+             if self.dictLE[i] != None : courant.setText(self.dictLE[i].nom)
+             else : courant.setText("")
+     nomLineEdit=self.nomLine+str(self.indexDernierLabel)
+     courant=getattr(self,nomLineEdit)
+     courant.setText("")
+     self.dictLE[self.indexDernierLabel]=None
+     liste=[]
+     for i in list(self.dictLE.keys()): 
+          if self.dictLE[i] != None and self.dictLE[i] != "" : liste.append(self.dictLE[i])
+     validite=self.node.item.setValeur(liste)
+
index d756cb28cdf3539963f5c0d390cd99a8c882e3be..c6758b396e6f22b7584f39a0f2296373e232c9ac 100644 (file)
@@ -30,17 +30,18 @@ from desWidgetFactTableau import Ui_WidgetFactTableau
 from Extensions.i18n import tr
 # Import des panels
 
+# PN 18 mai 2020 : affiche systematique des optionnels
 class MonWidgetFactCommun(Groupe):
   """
   """
-  def __init__(self,node,editor,parentQt,definition, obj, niveau,commande,insertIn=-1):
+  def __init__(self,node,editor,parentQt,definition, obj, niveau,commande):
       #print "fact : ",node.item.nom
       Groupe.__init__(self,node,editor,parentQt, definition,obj,niveau,commande)
       labeltext,fonte,couleur = self.node.item.getLabelText()
       self.GroupBox.setText(tr(labeltext))
       self.GroupBox.setTextInteractionFlags(Qt.TextSelectableByMouse)
-      self.parentQt.commandesLayout.insertWidget(insertIn,self)
-      self.doitAfficherOptionnel=False
+      self.parentQt.commandesLayout.insertWidget(-1,self)
+      self.doitAfficherOptionnel=True
       min,max=obj.getMinMax()
       if max < 2 and  hasattr(self, 'RBPlus') : self.RBPlus.close() 
       if max > 1 and  hasattr(self, 'RBPlus') : self.RBPlus.clicked.connect(self.ajouteMCParPB)
@@ -53,7 +54,7 @@ class MonWidgetFactCommun(Groupe):
 
   def leaveEvent(self,event):
       #print "leaveEvent", self.node.item.getLabelText()[0]
-      self.doitAfficherOptionnel=False
+      #self.doitAfficherOptionnel=False
       QWidget.leaveEvent(self,event)
 
   def delayAffiche(self):
@@ -69,13 +70,24 @@ class MonWidgetFactCommun(Groupe):
       parentOuAjouter.ajoutMC(texteListeNom)
 
 
+#  def reaffiche(self, nodeAVoir=None):
+#      print ('ds reaffiche : ', self.obj.nom, self.node.firstDeplie) 
+#      if self.node.editor.maConfiguration.afficheFirstPlies and self.node.firstDeplie:
+#         self.node.firstDeplie =False
+#         self.node.setPlie()
+#      Groupe.reaffiche(self,nodeAVoir)
+
+
+
 class MonWidgetFact(Ui_WidgetFact,MonWidgetFactCommun):
-  def __init__(self,node,editor,parentQt,definition, obj, niveau,commande,insertIn=1):
-      MonWidgetFactCommun.__init__(self,node,editor,parentQt, definition,obj,niveau,commande,insertIn)
+  #def __init__(self,node,editor,parentQt,definition, obj, niveau,commande,insertIn=1):
+  #    MonWidgetFactCommun.__init__(self,node,editor,parentQt, definition,obj,niveau,commande,insertIn)
+  def __init__(self,node,editor,parentQt,definition, obj, niveau,commande):
+      MonWidgetFactCommun.__init__(self,node,editor,parentQt, definition,obj,niveau,commande)
 
-#class MonWidgetFactTableau(Ui_WidgetFactTableau,MonWidgetFactCommun):
 class MonWidgetFactTableau(Ui_WidgetFact,MonWidgetFactCommun):
-  def __init__(self,node,editor,parentQt,definition, obj, niveau,commande,insertIn=1):
-      MonWidgetFactCommun.__init__(self,node,editor,parentQt, definition,obj,niveau,commande,insertIn)
-      #print ('je passe dans FactTableau')
+  #def __init__(self,node,editor,parentQt,definition, obj, niveau,commande,insertIn=1):
+  #    MonWidgetFactCommun.__init__(self,node,editor,parentQt, definition,obj,niveau,commande,insertIn)
+  def __init__(self,node,editor,parentQt,definition, obj, niveau,commande):
+      MonWidgetFactCommun.__init__(self,node,editor,parentQt, definition,obj,niveau,commande)
       MonWidgetFactTableau.__init__(self,node,editor,parentQt, definition,obj,niveau,commande)
index 17d79b58b44f2fd587d1b2a5334dae81e06f0c84..e479f312c6c80632b141963e3c605db51e638d49 100644 (file)
@@ -28,12 +28,13 @@ from Extensions.i18n import tr
 class MonWidgetFactPlie(Ui_WidgetFactPlie,Groupe):
   """
   """
-  def __init__(self,node,editor,parentQt,definition, obj, niveau,commande,insertIn=-1):
+  #def __init__(self,node,editor,parentQt,definition, obj, niveau,commande,insertIn=-1):
+  def __init__(self,node,editor,parentQt,definition, obj, niveau,commande):
       #print "fact plie : ",node.item.nom
       node.fenetreAAfficher=self
       Groupe.__init__(self,node,editor,parentQt, definition,obj,niveau,commande)
       self.groupBox.setText(self.node.item.getLabelText()[0])
-      self.parentQt.commandesLayout.insertWidget(insertIn,self)
+      self.parentQt.commandesLayout.insertWidget(-1,self)
 
   def traiteClicSurLabel(self,texte):
       return
index ba8696db5441ef25e5e9b5f831485208bf816275..db3657af399c3a777d4e6f20aa3880d859baf673 100644 (file)
@@ -64,6 +64,7 @@ class MonWidgetInactif(QWidget,Ui_WidgetInactif):
 
   def afficheOptionnel(self):
       # N a pas de parentQt. doit donc etre redefini
+      if self.editor.maConfiguration.closeOptionnel : return
       liste=[]
       #print "dans afficheOptionnel", self.monOptionnel
       # dans le cas ou l insertion n a pas eu leiu (souci d ordre par exemple)
index afb8f74a3c39acf757fe4e799ef46a110869b0fa..42c72358985bf4e4b6f38285cb896ebc3381ec83 100644 (file)
@@ -27,7 +27,6 @@ except : pass
 import types,os
 
 # Modules Eficas
-from six.moves import range
 from PyQt5.QtWidgets  import QCheckBox, QScrollBar, QFrame, QApplication, QLabel
 from PyQt5.QtWidgets  import QSizePolicy,QSpacerItem
 from PyQt5.QtGui  import QPalette, QFont
index 0acfb20951765fdc59b242ff31f829e23eb15401..843da9aa270787e01f9e2ec02b411e9c56f771bf 100644 (file)
@@ -34,7 +34,6 @@ from .feuille         import Feuille
 
 from desWidgetMatrice  import Ui_desWidgetMatrice 
 
-from six.moves import range
 from PyQt5.QtCore import QSize, Qt
 from PyQt5.QtWidgets import QTableWidgetItem
 from PyQt5.QtGui import QIcon
@@ -152,7 +151,7 @@ class MonWidgetMatrice (Ui_desWidgetMatrice,Feuille):
        self.nbLigs=len(self.listeVariables)
        self.nbCols=len(self.listeVariables)
 
-  def  nNbDeDistributions(self):
+  def  nbDeDistributions(self):
        jdc=self.node.item.object.jdc
        etape=self.node.item.object.etape
        self.listeVariables=jdc.getDistributions(etape)
index 236ab67748536f14ad72861229df20816ec63107..b3a7f27f720b175ecac29e50ca0393698f50ce73 100644 (file)
@@ -149,6 +149,7 @@ class MonWidgetNiveauFact(Ui_WidgetNiveauFact,Groupe):
   def afficheOptionnel(self):
       # N a pas de parentQt. doit donc etre redefini
       #print ('ds afficheOptionnel')
+      if self.editor.maConfiguration.closeOptionnel : return
       if self.editor.widgetOptionnel!= None :
         self.monOptionnel=self.editor.widgetOptionnel
       else :
index 904e5841a9f19c780a0f37d74406aeca9ad9923f..c698206a046770d34fc3295cc299df9d1c11656a 100644 (file)
@@ -38,7 +38,7 @@ class  MonWidgetOptionnel (QWidget,Ui_WidgetOptionnel):
      self.parentQt=parentQt
 
   def afficheOptionnel(self,liste,liste_rouge,MC):
-     #print ('afficheOptionnel MonWidgetOptionnel', self,liste,MC)
+     #print ('afficheOptionnel MonWidgetOptionnel',self, liste,MC.node.item.nom)
      self.vireLesAutres(MC)
    
      if MC.node.item.nom in self.dicoMCWidgetOptionnel :
@@ -77,7 +77,7 @@ class  MonWidgetOptionnel (QWidget,Ui_WidgetOptionnel):
             del self.dicoMCWidgetOptionnel[k]
 
   def titre(self,MC):
-     if self.parentCommande.node.editor.code in ['Adao','ADAO'] and self.parentCommande.node.editor.maConfiguration.closeFrameRechercheCommande==True :
+     if self.parentCommande.node.editor.maConfiguration.closeFrameRechercheCommande==True :
         self.frameLabelCommande.close()
         return
      labeltext,fonte,couleur = self.parentCommande.node.item.getLabelText()
index 287e5ee15ce308e624465d07ab29c3e2b9209a1f..cb799fe523fed98204dbeba028891909257ebffc 100644 (file)
@@ -26,7 +26,6 @@ except : pass
 
 from desWidgetParam import Ui_WidgetParam
 from InterfaceQT4.gereIcones import FacultatifOuOptionnel
-import six
 from PyQt5.QtWidgets import QWidget, QMessageBox
 from PyQt5.QtGui import QIcon
 
@@ -131,7 +130,7 @@ class MonWidgetParam(QWidget,Ui_WidgetParam,FacultatifOuOptionnel):
         try :
           exec(monTexte, contexte)
         except (ValueError,TypeError, NameError,RuntimeError,ZeroDivisionError) as  exc:
-          self.LECommentaire.setText(tr("Valeur incorrecte: ")+six.text_type (exc))
+          self.LECommentaire.setText(tr("Valeur incorrecte: ")+str(exc))
           return False
         except :
           self.LECommentaire.setText(tr("Valeur incorrecte "))
index 3498fe85e0a3856f36c7d83f002d9adbf244612a..172a5cf64b677bf6de4f9020b1e60c97129e3da4 100644 (file)
@@ -31,7 +31,6 @@ from Extensions.i18n import tr
 from .monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne 
 from .politiquesValidation          import PolitiquePlusieurs
 
-from six.moves import range
 from PyQt5.QtWidgets  import  QScrollBar
 
 
@@ -53,10 +52,14 @@ class MonWidgetPlusieursASSDIntoOrdonne (MonWidgetPlusieursIntoOrdonne):
        if len(self.listeAAfficher) == 0 :
           self.ajoutLE(0)
           return
-           
          
-       if len(self.listeAAfficher)*20 > 400 : self.setMinimumHeight(400)
-       else : self.setMinimumHeight(len(self.listeAAfficher)*30)
+       if len(self.listeAAfficher)*30 > 400 : self.setMinimumHeight(400)
+       else :
+         if self.monSimpDef.min > len(self.listeAAfficher)   : self.setMinimumHeight(self.monSimpDef.min*30+30)
+         if self.monSimpDef.max > len(self.listeAAfficher)   : self.setMinimumHeight(180)
+         else :  self.setMinimumHeight(len(self.listeAAfficher)*30+30)
+       self.adjustSize()
+
        self.politique=PolitiquePlusieurs(self.node,self.editor)
        for i in range(1,len(self.listeAAfficher)+1): self.ajoutLE(i)
        for i in range(len(self.listeAAfficher)):
index 486ae7d5204d42a80c5e503bae7772d1c14d7cab..3fd6d90c7d05dd76c368fb1d6722e087a2bfc530 100644 (file)
@@ -27,7 +27,6 @@ except : pass
 
 import types,os,sys
 
-from six.moves import range
 from PyQt5.QtGui     import QIcon 
 from PyQt5.QtWidgets import QApplication, QMessageBox, QScrollArea
 from PyQt5.QtCore    import QTimer, QSize, Qt
@@ -43,98 +42,101 @@ from InterfaceQT4.gereListe              import GereListe
 from InterfaceQT4.gereListe              import GerePlie
 from InterfaceQT4.gereListe              import LECustom
 
-dicoLongueur={2:95,3:125,4:154,5:183,6:210,float('inf'):210}
-hauteurMax=253
+dicoLongueur = {2:90,3:100,4:123,5:145,6:160,float('inf'):200}
+hauteurMaxFenetre = 200
+nbMinimumDeQLineEdit=7
 
 class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie):
 
   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
-        #print "MonWidgetPlusieursBase", nom
-        self.inFocusOutEvent=False
-        self.nomLine="lineEditVal"
-        self.inInit=True
-        self.indexDernierLabel=0
-        self.numLineEditEnCours=0
-        self.listeAffichageWidget=[]
+        #print ('MonWidgetPlusieursBase', nom)
+        self.inFocusOutEvent      = False
+        self.changeUnLineEdit     = False
+        self.nomLine              = "lineEditVal"
+        self.inInit               = True # pour l affichage quand on cree le lineEdit
+        self.indexDernierLabel    = 0
+        self.numLineEditEnCours   = 0
+        self.changeUnLineEdit     = None
+        self.listeAffichageWidget = []
+        self.dictLE               = {}
+        self.politique  = PolitiquePlusieurs(node,parentQt)
         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
         GereListe.__init__(self)
         self.gereIconePlier()
         self.BSelectFichier.clicked.connect(self.selectInFile)
 
         if sys.platform[0:5]!="linux":
-          repIcon=self.node.editor.appliEficas.repIcon
-          fichier=os.path.join(repIcon, 'arrow_up.png')
-          icon = QIcon(fichier)
-          self.RBHaut.setIcon(icon)
+          repIcon   = self.node.editor.appliEficas.repIcon
+          fichierUp = os.path.join(repIcon, 'arrow_up.png')
+          iconUp    = QIcon(fichierUp)
+          self.RBHaut.setIcon(iconUp)
           self.RBHaut.setIconSize(QSize(32, 32))
-          fichier2=os.path.join(repIcon, 'arrow_down.png')
-          icon2 = QIcon(fichier2)
-          self.RBBas.setIcon(icon2)
-          fichier3=os.path.join(repIcon, 'file-explorer.png')
-          icon3 = QIcon(fichier2)
-          self.BSelectFichier.setIcon(icon3)
+          fichierDown = os.path.join(repIcon, 'arrow_down.png')
+          iconDown    = QIcon(fichierDown)
+          self.RBBas.setIcon(iconArrowDown)
+          fichierExp = os.path.join(repIcon, 'file-explorer.png')
+          iconExp    = QIcon(fichierExp)
+          self.BSelectFichier.setIcon(iconExp)
           self.BSelectFichier.setIconSize(QSize(32, 32))
-        icon=QIcon(self.repIcon+"/MoinsBleu.png")
-        self.RBMoins.setIcon(icon)
-        icon=QIcon(self.repIcon+"/PlusBleu.png")
-        self.RBPlus.setIcon(icon)
-        icon=QIcon(self.repIcon+"/verre-loupe-icone-6087-64.png")
-        self.RBVoisListe.setIcon(icon)
 
-
-        self.listeValeursCourantes=self.node.item.getListeValeurs()
-        if self.monSimpDef.max != "**"  and self.monSimpDef.max < 7: 
-           hauteurMax=dicoLongueur[self.monSimpDef.max]
-        else :
-           hauteurMax=220
-        #   if self.monSimpDef.max == self.monSimpDef.min : self.setMaximumHeight(hauteur)
-        self.resize(self.width(),hauteurMax)
+        iconMoins = QIcon (self.repIcon+"/MoinsBleu.png")
+        self.RBMoins.setIcon(iconMoins)
+        iconPlus = QIcon(self.repIcon+"/PlusBleu.png")
+        self.RBPlus.setIcon(iconPlus)
+        iconLoupe =QIcon(self.repIcon+"/verre-loupe-icone-6087-64.png")
+        self.RBVoisListe.setIcon(iconLoupe)
+
+
+        self.vScrollBar = self.scrollArea.verticalScrollBar()
+
+        if self.monSimpDef.max < 7 : 
+            hauteurMax = dicoLongueur[self.monSimpDef.max]
+            self.RBVoisListe.close()
+            self.RBMoins.close()
+            self.RBPlus.close()
+            aConstruire = self.monSimpDef.max
+        else : 
+            hauteurMax  = hauteurMaxFenetre
+            aConstruire = nbMinimumDeQLineEdit
         self.setMinimumHeight(hauteurMax)
-        self.finCommentaireListe()
+
+        for i in range(1,aConstruire): self.ajoutLineEdit()
         self.parentQt.commandesLayout.insertWidget(-1,self)
+
         self.maCommande.listeAffichageWidget.append(self.lineEditVal1)
-        self.AAfficher=self.lineEditVal1
-        self.inInit=False
+        self.AAfficher = self.lineEditVal1
+        self.inInit    = False
         # PNPN a completer __ si tuple le type des tuples sinon le tuple
+        self.finCommentaireListe()
         self.monCommentaireLabel.setText(self.finCommentaireListe())
         self.scrollArea.leaveEvent = self.leaveEventScrollArea
 
 
+
   def setValeurs(self):
-       self.vScrollBar = self.scrollArea.verticalScrollBar()
-       self.politique=PolitiquePlusieurs(self.node,self.editor)
-       # construction du min de valeur a entrer
-       if self.monSimpDef.max == "**"  : aConstruire=7
-       elif self.monSimpDef.max == float('inf'): aConstruire=7
-       else                            : aConstruire=self.monSimpDef.max
-
-       for i in range(1,aConstruire):
-           self.ajoutLineEdit()
-       QApplication.processEvents()
-       self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
+  # uniquement appele a l initialisation.
+  # les lineEdit ont deja ete crees
        self.listeValeursCourantes=self.node.item.getListeValeurs()
        index=1
        for valeur in self.listeValeursCourantes :
-           val=self.politique.getValeurTexte(valeur)
-           nomLineEdit="lineEditVal"+str(index)
+           val = self.politique.getValeurTexte(valeur)
+           nomLineEdit = "lineEditVal"+str(index)
            if hasattr(self,nomLineEdit) : 
-              courant=getattr(self,nomLineEdit)
+              courant = getattr(self,nomLineEdit)
               if 'R' in self.objSimp.definition.type and str(val) != repr(val) :  courant.setText(repr(val))
-              else                     :  courant.setText(str(val))
+              else    :  courant.setText(str(val))
            else :
               self.ajoutLineEdit(val)
            index=index+1
-       # ajout d'une ligne vide ou affichage commentaire
        if self.indexDernierLabel < self.monSimpDef.max  : self.ajoutLineEdit()
-       else : self.scrollArea.setToolTip('nb max de valeurs atteint')
-       #self.adjustSize()
-       #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
        
 
   def ajoutLineEdit(self,valeur=None,):
+      #print ('ajoutLineEdit, monWidgetPlusieursBase', self.indexDernierLabel)
       self.indexDernierLabel=self.indexDernierLabel+1
       nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
       if hasattr(self,nomLineEdit) : 
+         #print ('ajoutLineEdit, monWidgetPlusieursBase', self.indexDernierLabel)
          self.indexDernierLabel=self.indexDernierLabel-1
          return
       nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
@@ -143,15 +145,21 @@ class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie)
       if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
       else :                              nouveauLE.setStyleSheet("background:rgb(235,235,235)")
       nouveauLE.setFrame(False)
-      nouveauLE.returnPressed.connect(self.changeValeur)
+      # fait dans le init pour pouvoir passer le numero du LE mai 20
+      #nouveauLE.returnPressed.connect(self.changeValeur)
 
       setattr(self,nomLineEdit,nouveauLE)
       self.listeAffichageWidget.append(nouveauLE)
       self.etablitOrdre()
-      if valeur != None : nouveauLE.setText(str(valeur))
+      if valeur != None : 
+         nouveauLE.setText(str(valeur))
+         self.dictLE[self.indexDernierLabel] = valeur
+      else : 
+         self.dictLE[self.indexDernierLabel] = None
       # deux lignes pour que le ensureVisible fonctionne
       self.estVisible=nouveauLE
       if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
+      #print ('ajoutLineEdit, monWidgetPlusieursBase', self.indexDernierLabel)
 
   def etablitOrdre(self):
       i=0
@@ -162,6 +170,7 @@ class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie)
       # si on boucle on perd l'ordre
 
 
+  
   def rendVisibleLigne(self):
       QApplication.processEvents()
       self.estVisible.setFocus()
@@ -172,6 +181,8 @@ class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie)
       return self.finCommentaireListe()
 
   def ajout1Valeur(self,valeur=None):
+        #import traceback
+        #traceback.print_stack()
         if valeur == None : return
         liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
         if validite == 0 : return
@@ -197,30 +208,26 @@ class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie)
   def ajoutNValeur(self,liste):
   #----------------------------
   # attention quand on charge par un fichier, on ne peut pas se contenter d ajouter N fois 1 valeur
-  # car alors le temps de verification devient prohibitif  reconstructu=ion et verification a 
+  # car alors le temps de verification devient prohibitif  reconstructution et verification a 
   # chaque valeur. d ou l ajout de ajoutNTuple a politique plusieurs
 
            
         listeFormatee=list(liste)
 
         min,max=self.node.item.getMinMax()
-        if self.objSimp.valeur == None : listeComplete=listeFormatee
-        else : listeComplete =self.objSimp.valeur + listeFormatee
+        if self.objSimp.valeur == None : listeComplete = listeFormatee
+        else                           : listeComplete = self.objSimp.valeur + listeFormatee
 
         if len(listeComplete) > max : 
            texte=tr("Nombre maximum de valeurs ")+str(max)+tr(" atteint")
            self.editor.afficheInfos(texte,Qt.red)
            return
 
-        validite,comm,comm2,listeRetour= self.politique.ajoutNTuple(listeComplete)
+        validite,comm,comm2 = self.politique.ajoutNTuple(listeComplete)
         if not validite : 
-           self.editor.affiche_infos(texte,Qt.red)
+           self.editor.afficheInfos(comm2,Qt.red)
            return
 
-        # on calcule le dernier lineedit rempli avant de changer la valeur
-        if self.objSimp.valeur != None : indexDernierRempli=len(self.objSimp.valeur)
-        else : indexDernierRempli=0
-
         self.politique.recordValeur(listeComplete)
 
         indexDernierRempli=0
@@ -235,35 +242,22 @@ class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie)
          indexDernierRempli = indexDernierRempli + 1
         
 
-  def changeValeur(self,changeDePlace=True,oblige=False):
+  def changeValeur(self,changeDePlace=True,oblige=False,numero=None):
+      #print ('monWidgetPlusieursBase changeValeur')
+      self.changeUnLineEdit = False
       donneFocus=None
       derniereValeur=None
       self.listeValeursCourantes = []
       fin=self.indexDernierLabel
-      for i in range (1, fin):
-          nomLineEdit="lineEditVal"+str(i)
-          courant=getattr(self,nomLineEdit)
-          valeur=courant.text()
-          lval=valeur.split(',')
-          if len (lval) > 1 : 
-             msgBox=QMessageBox()
-             msgBox.setText("separator ',' ")
-             msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
-             msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
-             msgBox.setDefaultButton(QMessageBox.Ok)
-             ret = msgBox.exec_()
-             if ret != 1024 : 
-                courant.setText("") 
-                return
-             courant.setText(lval[0])
-             self.ajoutNValeur(lval[1:])
-             self.listeValeursCourantes = []
 
       for i in range (1, self.indexDernierLabel+1):
           nomLineEdit="lineEditVal"+str(i)
           courant=getattr(self,nomLineEdit)
           valeur=courant.text()
           if valeur != None and valeur != "" : 
+             # c est ce qui est long mais permet d avoir 
+             # une bonne connaissance des erreurs
+             # et de traiter le changede place
              commentaire=self.ajout1Valeur(valeur)
              if (commentaire != None ):
                  self.editor.afficheInfos(commentaire,Qt.red)
@@ -290,14 +284,19 @@ class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie)
         self.editor.afficheInfos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
       if len(self.listeValeursCourantes) < min and oblige==True: return
       if len(self.listeValeursCourantes) > max : return
-      retour=self.node.item.setValeur(self.listeValeursCourantes)
+      self.node.item.setValeur(self.listeValeursCourantes)
+      #print (self.listeValeursCourantes)
       if len(self.listeValeursCourantes) == self.monSimpDef.max  :
         self.editor.afficheInfos(tr('nb max de valeurs atteint'))
       self.setValide()
       self.reaffiche()
 
+          
   def leaveEventScrollArea(self,event):
-       self.changeValeur(changeDePlace=False)
-       QScrollArea.leaveEvent(self.scrollArea,event)
+      #print ('monWidgetPlusBase leaveEventScrollArea', self.changeUnLineEdit)
+      if self.changeUnLineEdit : self.changeValeur(changeDePlace=False)
+      QScrollArea.leaveEvent(self.scrollArea,event)
+
+
+
 
-# Avertissement quand on quitte le widget
index 16c3fbdd949b44f8e06b0a72ab102af69a84ccaf..f54ec53d3c37f7982bbfb97f332a3606c91efd48 100644 (file)
@@ -27,7 +27,6 @@ except : pass
 import types,os
 
 # Modules Eficas
-from six.moves import range
 from PyQt5.QtWidgets  import QCheckBox, QScrollBar, QFrame, QApplication, QLabel
 from PyQt5.QtWidgets  import QSizePolicy,QSpacerItem
 from PyQt5.QtGui  import QPalette, QFont
@@ -176,7 +175,7 @@ class MonWidgetPlusieursInto (Ui_WidgetPlusieursInto,Feuille,GerePlie,GereListe)
       self.listeCB.append(nouveauCB)
       nouveauCB.setText("")
       if index % 2 == 1 : nouveauCB.setStyleSheet("background:rgb(210,210,210)")
-      else :                       nouveauCB.setStyleSheet("background:rgb(240,240,240)")
+      else :              nouveauCB.setStyleSheet("background:rgb(240,240,240)")
       self.vScrollBar.triggerAction(QScrollBar.SliderToMaximum)
       nouveauCB.setFocus()
       setattr(self,nomCB,nouveauCB)
@@ -201,7 +200,7 @@ class MonWidgetPlusieursInto (Ui_WidgetPlusieursInto,Feuille,GerePlie,GereListe)
 
 
 
-  def changeValeur(self):
+  def changeValeur(self,changeDePlace=False,oblige=True, numero=None):
       #print ('changeValeur')
       if self.inhibe == True: return
       if hasattr(self,'LEFiltre') :self.noircirResultatFiltre()
index d7f78f30e7e8e06e75e9109b39b659b717678103..06bc57531c2c7a99cd6318ffa182edee43413ee2 100644 (file)
@@ -37,7 +37,6 @@ from .gereListe              import LECustom
 from .gereListe              import MonLabelListeClic
 from Extensions.i18n import tr
 
-from six.moves import range
 from PyQt5.QtWidgets  import   QFrame, QApplication, QScrollBar
 from PyQt5.QtCore import QTimer, QSize, Qt
 from PyQt5.QtGui  import QIcon, QPalette
@@ -49,7 +48,7 @@ class MonWidgetPlusieursIntoOrdonne (Ui_WidgetPlusieursIntoOrdonne, Feuille,Gere
         self.nomLine="LEResultat"
         self.listeLE=[]
         self.ouAjouter=0
-        self.NumLineEditEnCours=0
+        self.numLineEditEnCours=0
         self.alpha=0
         self.filtre=""
         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parent,commande)
@@ -65,7 +64,6 @@ class MonWidgetPlusieursIntoOrdonne (Ui_WidgetPlusieursIntoOrdonne, Feuille,Gere
         self.prepareListeResultat()
         if len(self.listeAAfficher) < 20 : self.frameRecherche2.close()
         if len(self.listeAAfficher) < 20 : self.frameRecherche.close()
-        self.adjustSize()
         if sys.platform[0:5]!="linux":
           repIcon=self.node.editor.appliEficas.repIcon
           fichier=os.path.join(repIcon, 'arrow_up.png')
@@ -109,8 +107,12 @@ class MonWidgetPlusieursIntoOrdonne (Ui_WidgetPlusieursIntoOrdonne, Feuille,Gere
           self.ajoutLE(0)
           return
        self.filtreListe()
-       if len(self.listeAAfficher)*20 > 400 : self.setMinimumHeight(400)
-       else : self.setMinimumHeight(len(self.listeAAfficher)*30)
+       if len(self.listeAAfficher)*30 > 400 : self.setMinimumHeight(400)
+       else : 
+         if self.monSimpDef.min > len(self.listeAAfficher) : self.setMinimumHeight(self.monSimpDef.min*30+30)
+         if self.monSimpDef.max > len(self.listeAAfficher) : self.setMinimumHeight(180)
+         else :  self.setMinimumHeight(len(self.listeAAfficher)*30+30)
+       self.adjustSize()
 
        self.politique=PolitiquePlusieurs(self.node,self.editor)
        for i in range(1,len(self.listeAAfficher)+1): self.ajoutLE(i)
@@ -217,7 +219,7 @@ class MonWidgetPlusieursIntoOrdonne (Ui_WidgetPlusieursIntoOrdonne, Feuille,Gere
       setattr(self,nomLE,nouveauLE)
       
   def ajoutLineEdit(self):
-      print ('ajoutLineEdit')
+      #print ('ajoutLineEdit')
       self.indexDernierLabel=self.indexDernierLabel+1
       self.ajoutLEResultat (self.indexDernierLabel)
 
@@ -257,7 +259,7 @@ class MonWidgetPlusieursIntoOrdonne (Ui_WidgetPlusieursIntoOrdonne, Feuille,Gere
         self.changeValeur()
         self.setValeurs(first=False)
 
-  def changeValeur(self,changeDePlace=False,oblige=False):
+  def changeValeur(self,changeDePlace=False,oblige=False, numero=None):
 #PN les 2 arg sont pour que la signature de ma fonction soit identique a monWidgetPlusieursBase
         listeVal=[]
         for i in range(1,self.indexDernierLabel+1):
index 129046be58d590d7262148b4142db5f957f57035..569e56be69d165ef05201ad35c21d6233ba8728b 100644 (file)
@@ -89,7 +89,6 @@ class MonWidgetRadioButtonCommun (Feuille):
   def boutonclic(self):
       for valeur in self.dict_bouton:
           if self.dict_bouton[valeur].isChecked():
-             #print "dans boutonclic is checked", valeur, type(valeur)
              SaisieValeur.LEvaleurPressed(self,valeur)
       self.reaffiche()
 
index ef4c5cea810fda7efdd2b1d661fd0a85da1b12ea..d1252feb5a02807b1a65ff748590e0182a7ebd74 100644 (file)
@@ -42,7 +42,9 @@ class MonWidgetSimpBase (Ui_WidgetSimpBase,Feuille):
         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
         self.parentQt.commandesLayout.insertWidget(-1,self,1)
         self.setFocusPolicy(Qt.StrongFocus)
-        self.lineEditVal.returnPressed.connect(self.LEvaleurPressed)
+        if monSimpDef.homo == 'constant' : self.lineEditVal.setReadOnly(True)
+        if monSimpDef.homo == 'constant' : self.lineEditVal.setStyleSheet("background:rgb(210,235,235);\n" "border:0px;")
+        else : self.lineEditVal.returnPressed.connect(self.LEvaleurPressed)
         self.AAfficher=self.lineEditVal
         self.maCommande.listeAffichageWidget.append(self.lineEditVal)
         self.lineEditVal.focusInEvent=self.monFocusInEvent
@@ -59,12 +61,6 @@ class MonWidgetSimpBase (Ui_WidgetSimpBase,Feuille):
          self.LEvaleurPressed()
       QLineEdit.focusOutEvent(self.lineEditVal,event)
 
-  #def showEvent(self, event):
-  #    if self.prendLeFocus==1 :
-  #       self.activateWindow()
-  #       self.lineEditVal.setFocus()
-  #       self.prendLeFocus=0
-  #    QWidget.showEvent(self,event)
 
   def setValeurs(self):
        #print ("dans setValeurs")
@@ -117,8 +113,4 @@ class MonWidgetSimpBase (Ui_WidgetSimpBase,Feuille):
       self.setValeurs()
       self.reaffiche()
       
-      #if self.objSimp.parent.nom == "MODEL" :
-      #   if self.objSimp.isValid():
-      #      self.objSimp.parent.change_fichier="1"
-            #self.node.item.parent.buildInclude(None,"")
 
index 5b12888f90063d617a4a30e3a75548c238761f5c..53a60983b8d201cefb3937ea4740a55201eb992b 100644 (file)
@@ -47,7 +47,9 @@ class MonWidgetSimpBool (Ui_WidgetSimpBool,Feuille):
        if valeur == None  : return
        if valeur == True  : self.RBTrue.setChecked(True)
        if valeur == False : self.RBFalse.setChecked(True)
-
+       if self.monSimpDef.homo == 'constant' :
+          if valeur == True  : self.RBFalse.setDisabled(True)
+          else :               self.RBTrue.setDisabled(True)
 
   def boutonTrueClic(self):
       SaisieValeur.LEvaleurPressed(self,True)
index b75a5676b74c1061f9a9c60fcb03d168e15bf5ec..792df7d93a198e9a60f63786771b45502a05a036 100644 (file)
@@ -26,7 +26,6 @@ except : pass
 
 import types,os
 
-from six.moves import range
 from PyQt5.QtCore import Qt
 
 # Modules Eficas
index dc99029292c48ae28fb1ccf06a32b61115cc763d..5a0bc061397352eb34c048ebbabe353a63ef5ddf 100644 (file)
@@ -53,6 +53,17 @@ class MonWidgetTableau (Ui_WidgetTableau,MonWidgetPlusieursTuple):
             setattr(self,nomCol,objCol)
             spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
             self.LATitre.addItem(spacerItem)
+
+
+
+#            monObjTitreCol=getattr(self,nomCol)
+#            monObjTitreCol.setText(monSimpDef.homo[i])
+            
+#        for i in range(maxLen-len(monSimpDef.homo)):
+#            index=i+len(monSimpDef.homo)+1
+#            nomCol='LECol'+str(index)
+#            monObjTitreCol=getattr(self,nomCol)
+#            monObjTitreCol.close()
             
         self.resize(self.width(),1800)
 
index a93175d7cad09f856c55b47dbc83dd323a34fffc..83c2dab70473c5565cb1c22bddd96b612f6e16cb 100644 (file)
@@ -34,9 +34,12 @@ 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)
@@ -270,14 +273,13 @@ class PolitiquePlusieurs(Validation):
          return valide,commentaire,commentaire2,listeRetour
 
   def ajoutNTuple(self,liste):
-         listeRetour=[]
          commentaire="Nouvelles valeurs acceptee"
          commentaire2=""
-         print (self.node.item.valideListePartielle)
          valide=self.node.item.valideListePartielle(None,liste)
+         print ('uuuuuuuuuuu',valide)
          if not valide :
             commentaire2=self.node.item.infoErreurListe()
-         return valide,commentaire,commentaire2,listeRetour
+         return valide,commentaire,commentaire2
 
   def recordValeur(self,liste,dejaValide=True):
          ancienneVal = self.node.item.getValeur()
index f8f580ce1e96f6f804100087f4b242e65c06bbe3..779a9bb5d5f30b9e6ba0c06ce2945e663d8d5a29 100755 (executable)
@@ -1,5 +1,4 @@
-#!/usr/bin/env python
-# -*- coding: iso-8859-1 -*-
+# -*- coding: utf-8 -*-
 # Copyright (C) 2007-2017   EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
 
-from __future__ import absolute_import
-from __future__ import print_function
-try :
-   from builtins import str
-except : pass
-
-import os, sys
-import six
-
-
-from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QBoxLayout, QMenu, QAction, QMessageBox
-from PyQt5.QtGui import QIcon
-from PyQt5.QtCore import Qt, QSize
-
-
-from Editeur import session
-from myMain import Ui_Eficas
-from InterfaceQT4.viewManager import MyViewManager
-from InterfaceQT4.qtEficasSsIhm import AppliSsIhm
-
-from Extensions.i18n import tr
-from Extensions.eficas_exception import EficasException
-from Extensions import param2
-
-
-class Appli(AppliSsIhm,Ui_Eficas,QMainWindow):
-    """
-    Class implementing the main user interface.
-    """
-    def __init__(self,code=None,salome=1,parent=None,ssCode=None,multi=False,langue='fr',ssIhm=False,versionCode=None):
-        """
-        Constructor
-        """
-        if ssIhm == True : 
-           print ('mauvaise utilisation de la classe Appli. Utiliser AppliSsIm SVP')
-           exit()
-
-        AppliSsIhm.__init__(self,code,salome,parent,ssCode,multi,langue,ssIhm=True,versionCode=None)
-        QMainWindow.__init__(self,parent)
-        Ui_Eficas.__init__(self)
-
-        self.ssIhm=False
-        self.multi=multi
-        self.demande=multi # voir PSEN
-
-        if self.multi == False :
-             self.definitCode(code,ssCode)
-             if code==None: return
-        else :
-             print ('a programmer')
-
-        self.suiteTelemac=False
-        if hasattr (self, 'maConfiguration') :
-           if self.maConfiguration.force_langue :
-              from InterfaceQT4.monChoixLangue import MonChoixLangue
-              widgetLangue = MonChoixLangue(self)
-              ret=widgetLangue.exec_()
-           self.suiteTelemac=self.maConfiguration.suiteTelemac
-
-
-        if not self.salome and hasattr (self, 'maConfiguration') and hasattr(self.maConfiguration,'lang') : self.langue=self.maConfiguration.lang
-        from Extensions import localisation
-        app=QApplication
-        if hasattr (self, 'maConfiguration') : localisation.localise(None,self.langue,translatorFichier=self.maConfiguration.translatorFichier)
-        self.setupUi(self)
-
-        #if parent != None : self.parentCentralWidget = parent.centralWidget()
-        #else              : self.parentCentralWidget = None
-
-        if not self.salome :
-           if  hasattr (self, 'maConfiguration') and hasattr(self.maConfiguration,'taille') : self.taille=self.maConfiguration.taille
-           else : self.taille=1700
-
-           #if self.code in ['MAP',] : self.resize(1440,self.height())
-           #else : self.resize(self.taille,self.height())
-           self.resize(self.taille,self.height())
-
-
-        icon = QIcon(self.repIcon+"/parametres.png")
-        self.actionParametres.setIcon(icon)
-        if  hasattr (self, 'maConfiguration') and self.maConfiguration.boutonDsMenuBar  : 
-           self.frameEntete.setMaximumSize(QSize(16777215,100))
-           self.frameEntete.setMinimumSize(QSize(0,100))
-        if  hasattr (self, 'maConfiguration') and self.maConfiguration.enleverActionStructures  : 
-            self.enleverActionsStructures()
-        if  hasattr (self, 'maConfiguration') and self.maConfiguration.enleverParametres  : 
-            self.enleverParametres()
-        if  hasattr (self, 'maConfiguration') and self.maConfiguration.enleverSupprimer : 
-            self.enleverSupprimer()
-
-
-        self.myQtab.removeTab(0)
-        self.blEnteteGlob = QBoxLayout(2,self.frameEntete)
-        self.blEnteteGlob.setSpacing(0)
-        self.blEnteteGlob.setContentsMargins(0,0,0,0)
-
-        self.blEntete = QBoxLayout(0)
-        self.blEntete.insertWidget(0,self.toolBar)
-        self.blEntete.insertWidget(0,self.menubar)
-        self.blEnteteGlob.insertLayout(0,self.blEntete)
-
-
-        
-        if  hasattr (self, 'maConfiguration') and self.maConfiguration.boutonDsMenuBar  : 
-            self.blEnteteCommmande = QBoxLayout(0)
-            self.blEnteteCommmande.insertWidget(0,self.toolBarCommande)
-            self.toolBarCommande.setIconSize(QSize(96,96))
-            self.blEnteteGlob.insertLayout(-1,self.blEnteteCommmande)
-        else :
-            self.toolBarCommande.close()
-         
-
-        if hasattr (self, 'maConfiguration') and self.maConfiguration.closeEntete==True and self.salome: self.closeEntete()
-
-        eficas_root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-
-        self.viewmanager = MyViewManager(self)
-        self.recentMenu=QMenu(tr('&Recents'))
-        #self.menuFichier.insertMenu(self.actionOuvrir,self.recentMenu)
-
-        # actionARemplacer ne sert que pour l insert Menu
-        self.menuFichier.insertMenu(self.actionARemplacer ,self.recentMenu)
-        self.menuFichier.removeAction(self.actionARemplacer)
-        self.connecterSignaux()
-        self.toolBar.addSeparator()
-
-        if self.code != None : self.construitMenu()
-
-        self.setWindowTitle(self.VERSION_EFICAS)
-        try :
-        #if 1 :
-         # print ('attention try devient if 1')
-          self.ouvreFichiers()
-        except EficasException as exc:
-        #except:
-        #  print "je suis dans le except"
-          if self.salome == 0 : exit()
-
-        #self.adjustSize()
-
-    def closeEntete(self):
-        self.menuBar().close()
-        self.toolBar.close()
-        self.frameEntete.close()
-
-    def definitCode(self,code,ssCode) :
-        self.code=code
-        self.ssCode=ssCode
-        if self.code==None :
-           self.cleanPath()
-           from InterfaceQT4.monChoixCode import MonChoixCode
-           widgetChoix = MonChoixCode(self)
-           ret=widgetChoix.exec_()
-           #widgetChoix.show()
-        if self.code == None:return # pour le cancel de la fenetre choix code
-        AppliSsIhm.definitCode(self,self.code,ssCode)
-
-        #PN --> pb d exception qui font planter salome
-        # plus supporte en python 3
-        #app=QApplication
-        #if hasattr(prefsCode,'encoding'):
-        #   import sys
-        #   reload(sys)
-        #   sys.setdefaultencoding(prefsCode.encoding)
-
-    def construitMenu(self):
-        self.initPatrons()
-        self.initRecents()
-        self.initAides()
-        for intituleMenu in ("menuTraduction","menuOptions","menuMesh","menuExecution","menuN1"):
-              if hasattr(self,intituleMenu):
-                 menu=getattr(self,intituleMenu)
-                 menu.setAttribute(Qt.WA_DeleteOnClose)
-                 menu.close()
-                 delattr(self,intituleMenu)
-        for intituleAction in ("actionExecution","actionSaveRun"):
-            if hasattr(self,intituleAction):
-              action=getattr(self,intituleAction)
-              self.toolBar.removeAction(action)
-        if self.code.upper() in Appli.__dict__:
-          Appli.__dict__[self.code.upper()](self,)
-        if self.suiteTelemac : self.lookSuiteTelemac()
-        self.metMenuAJourUtilisateurs()
-        if  hasattr (self, 'maConfiguration') and self.maConfiguration.ajoutExecution : 
-            self.ajoutExecution()
-
-    def initAides(self):
-        #print "je passe la"
-        repAide=os.path.dirname(os.path.abspath(__file__))
-        fileName='index.html'
-        self.docPath=repAide+"/../Aide"
-        if hasattr(self,'maConfiguration') and hasattr(self.maConfiguration,'docPath') : self.docPath=self.maConfiguration.docPath
-        if hasattr(self,'maConfiguration') and hasattr(self.maConfiguration,'fileName'):fileName=self.maConfiguration.fileName
-        self.fileDoc=os.path.join(self.docPath,fileName)
-        self.actionCode.setText(tr("Aide specifique ")+str(self.code))
-        if not os.path.isfile(self.fileDoc) :
-               self.fileDoc=""
-               self.docPath=""
-               self.actionCode.setEnabled(False)
-               return
-
-        self.actionCode.setEnabled(True)
-        self.menuAide.addAction(self.actionCode)
-
-    def newN1(self):
-        ssCode=None
-        code="PSEN_N1"
-        self.cleanPath()
-        dirCode=os.path.abspath(os.path.join(os.path.abspath(__file__),'../..',"ProcessOutputs_Eficas"))
-        sys.path.insert(0,dirCode)
-        self.code=code
-        self.definitCode(code,ssCode)
-        self.initRecents()
-        self.multi=True
-        self.demande=False
-        self.fileNew()
-
-    def newPSEN(self):
-        ssCode=None
-        code="PSEN"
-        self.cleanPath()
-        dirCode=os.path.abspath(os.path.join(os.path.abspath(__file__),'../..',code))
-        sys.path.insert(0,dirCode)
-        self.code=code
-        self.definitCode(code,ssCode)
-        self.multi=True
-        self.demande=False
-        self.fileNew()
-
-    def ajoutN1(self):
-        return
-        self.menuN1 = self.menubar.addMenu(tr("Process Output"))
-        self.actionN1 = QAction(self)
-        self.actionN1.setText(tr("Process Output"))
-        self.menuN1.addAction(self.actionN1)
-        self.actionN1.triggered.connect(self.newN1)
-
-
-        if hasattr(self,'actionOpenProcess'):return
-
-        self.actionOpenProcess = QAction(self)
-        self.actionOpenProcess.setText(tr("Open Process_Output File"))
-        self.menuN1.addAction(self.actionOpenProcess)
-        self.actionOpenProcess.triggered.connect(self.openProcess)
-
-    def ajoutExecution(self):
-        self.menuExecution = self.menubar.addMenu(tr("&Run"))
-        self.actionExecution = QAction(self)
-        if sys.platform[0:5]=="linux":
-          icon6 = QIcon(self.repIcon+"/roue.png")
-          self.actionExecution.setIcon(icon6)
-        else :
-          self.actionExecution.setText(tr("Run"))
-        self.actionExecution.setObjectName("actionExecution")
-        self.menuExecution.addAction(self.actionExecution)
-        if not(self.actionExecution in self.toolBar.actions()):
-           self.toolBar.addAction(self.actionExecution)
-        self.actionExecution.setText(tr("Run"))
-        self.actionExecution.triggered.connect(self.run)
-
-    def ajoutSauveExecution(self):
-        self.actionSaveRun = QAction(self)
-        icon7 = QIcon(self.repIcon+"/export_MAP.png")
-        self.actionSaveRun.setIcon(icon7)
-        self.actionSaveRun.setObjectName("actionSaveRun")
-        self.menuExecution.addAction(self.actionSaveRun)
-        if not(self.actionSaveRun in self.toolBar.actions()):
-           self.toolBar.addAction(self.actionSaveRun)
-        self.actionSaveRun.setText(tr("Save Run"))
-        self.actionSaveRun.triggered.connect(self.saveRun)
-
-    def griserActionsStructures(self):
-        self.actionCouper.setEnabled(False)
-        self.actionColler.setEnabled(False)
-        self.actionCopier.setEnabled(False)
-        self.actionSupprimer.setEnabled(False)
-
-    def enleverActionsStructures(self):
-        self.toolBar.removeAction(self.actionCopier)
-        self.toolBar.removeAction(self.actionColler)
-        self.toolBar.removeAction(self.actionCouper)
-        self.menuEdition.removeAction(self.actionCouper)
-        self.menuEdition.removeAction(self.actionCopier)
-        self.menuEdition.removeAction(self.actionColler)
-
-
-    def enleverParametres(self):
-        self.toolBar.removeAction(self.actionParametres)
-        self.menuJdC.removeAction(self.actionParametres)
-
-    def enleverSupprimer(self):
-        self.toolBar.removeAction(self.actionSupprimer)
-
-    def enlevernewInclude(self):
-        self.actionNouvel_Include.setVisible(False)
-
-    def enleverRechercherDsCatalogue(self):
-        self.actionRechercherDsCatalogue.setVisible(False)
-
-    def connectRechercherDsCatalogue(self):
-        if hasattr(self,'rechercherDejaLa') : return
-        self.rechercherDejaLa=True
-        self.actionRechercherDsCatalogue.triggered.connect(self.handleRechercherDsCatalogue)
-
-    def ajoutSortieComplete(self):
-        if hasattr(self,'actionSortieComplete') : return
-        self.actionSortieComplete = QAction(self)
-        self.actionSortieComplete.setText(tr("Sortie Complete"))
-        self.menuFichier.insertAction(self.actionEnregistrer_sous,self.actionSortieComplete)
-        self.actionSortieComplete.triggered.connect(self.handleSortieComplete)
-
-
-    def MT(self):
-        self.enlevernewInclude()
-        self.toolBar.addSeparator()
-
-
-    def ZCRACKS(self):
-        self.enlevernewInclude()
-        self.toolBar.addSeparator()
-        self.ajoutExecution()
-
-        self.menuOptions = self.menubar.addMenu("menuOptions")
-        self.menuOptions.addAction(self.actionParametres_Eficas)
-        self.menuOptions.setTitle(tr("Options"))
-
-    def ADAO(self):
-        self.enleverActionsStructures()
-        self.enlevernewInclude()
-
-    def ASTER(self) :
-        self.menuTraduction = self.menubar.addMenu("menuTraduction")
-        self.menuTraduction.addAction(self.actionTraduitV11V12)
-        self.menuTraduction.addAction(self.actionTraduitV10V11)
-        self.menuTraduction.addAction(self.actionTraduitV9V10)
-        self.menuTraduction.setTitle(tr("Traduction"))
-
-        self.menuFichier.addAction(self.actionSauveLigne)
-
-        self.menuOptions = self.menubar.addMenu("menuOptions")
-        self.menuOptions.addAction(self.actionParametres_Eficas)
-        self.menuOptions.addAction(self.actionLecteur_Pdf)
-        self.menuOptions.setTitle(tr("Options"))
-
-    def CARMEL3D(self):
-        #if self.salome == 0 : return
-        self.enlevernewInclude()
-        self.menuMesh = self.menubar.addMenu(tr("Gestion Maillage"))
-        self.menuMesh.setObjectName("Mesh")
-        self.menuMesh.addAction(self.actionChercheGrpMaille)
-        #self.griserActionsStructures()
-
-    def CARMELCND(self):
-        self.enlevernewInclude()
-        self.enleverRechercherDsCatalogue()
-        self.ajoutExecution()
-        self.ajoutSauveExecution()
-        self.griserActionsStructures()
-
-    def MAP(self):
-        self.enlevernewInclude()
-        self.toolBar.addSeparator()
-        self.ajoutExecution()
-        self.ajoutSauveExecution()
-        self.menuOptions = self.menubar.addMenu("menuOptions")
-        self.menuOptions.addAction(self.actionParametres_Eficas)
-        self.menuOptions.setTitle(tr("Options"))
-
-    def MAPIDENTIFICATION(self):
-        self.enlevernewInclude()
-        self.enleverSupprimer()
-        #self.ajoutExecution()
-        self.enleverRechercherDsCatalogue()
-        self.enleverActionsStructures()
-        self.enleverParametres()
-
-    def PSEN(self):
-        if self.first:  self.first=0
-        try : self.action_Nouveau.triggered.disconnect(self.fileNew)
-        except : pass
-        try : self.action_Nouveau.triggered.disconnect(self.newPSEN)
-        except : pass
-
-        self.action_Nouveau.triggered.connect(self.newPSEN)
-        self.enleverActionsStructures()
-        self.enleverParametres()
-        self.enleverRechercherDsCatalogue()
-        self.enlevernewInclude()
-        self.ajoutExecution()
-        self.ajoutN1()
-        self.ajoutHelpPSEN()
-        self.ajoutIcones()
-
-    def PSEN_N1(self):
-        self.enleverActionsStructures()
-        self.enleverParametres()
-        self.enleverRechercherDsCatalogue()
-        self.enlevernewInclude()
-        self.ajoutExecution()
-        self.ajoutIcones()
-
-    def TELEMAC(self):
-        self.enleverActionsStructures()
-        self.enlevernewInclude()
-        self.connectRechercherDsCatalogue()
-        self.ajoutSortieComplete()
-
-    def lookSuiteTelemac(self):
-        self.enleverActionsStructures()
-        self.enlevernewInclude()
-        self.enleverParametres()
-        self.enleverSupprimer()
-        self.enleverRechercherDsCatalogue()
-
-    def ajoutHelpPSEN(self):
-        self.actionParametres_Eficas.setText('Help PSEN')
-        self.actionParametres_Eficas.triggered.connect(self.aidePSEN)
-
-
-
-    def ChercheGrpMesh(self):
-        Msg,listeGroup=self.ChercheGrpMeshInSalome()
-        if Msg == None :
-           self.viewmanager.handleAjoutGroup(listeGroup)
-        else :
-           print ("il faut gerer les erreurs")
-
-    def ChercheGrpMaille(self):
-        # Normalement la variable self.salome permet de savoir si on est ou non dans Salome
-        try:
-            Msg,listeGroup=self.ChercheGrpMailleInSalome() # recherche dans Salome
-            #Msg = None; listeGroup = None # recherche manuelle, i.e., sans Salome si ligne precedente commentee
-        except:
-            raise ValueError('Salome non ouvert')
-        if Msg == None :
-           self.viewmanager.handleAjoutGroup(listeGroup)
-        else :
-           print ("il faut gerer les erreurs")
-
-
-    def ChercheGrp(self):
-        #Msg,listeGroup=self.ChercheGrpMailleInSalome()
-        #if Msg == None :
-        #   self.viewmanager.handleAjoutGroup(listeGroup)
-        #else :
-        #print "il faut gerer "
-        pass
-
-
-    def ajoutIcones(self) :
-        # Pour pallier les soucis de repertoire d icone
-        #print self.repIcon
-        icon = QIcon(self.repIcon+"/new_file.png")
-        self.action_Nouveau.setIcon(icon)
-        icon1 = QIcon(self.repIcon+"/ouvrir.png")
-        self.actionOuvrir.setIcon(icon1)
-        icon2 = QIcon(self.repIcon+"/save.png")
-        self.actionEnregistrer.setIcon(icon2)
-        icon6 = QIcon(self.repIcon+"/delete.png")
-        self.actionSupprimer.setIcon(icon6)
-        icon7 = QIcon(self.repIcon+"/roue.png")
-        self.actionExecution.setIcon(icon7)
-
-
-
-
-    def connecterSignauxQT4(self) :
-        self.connect(self.recentMenu,SIGNAL('aboutToShow()'),self.handleShowRecentMenu)
-
-        self.connect(self.action_Nouveau,SIGNAL("triggered()"),self.fileNew)
-        self.connect(self.actionNouvel_Include,SIGNAL("triggered()"),self.newInclude)
-        self.connect(self.actionOuvrir,SIGNAL("triggered()"),self.fileOpen)
-        self.connect(self.actionEnregistrer,SIGNAL("triggered()"),self.fileSave)
-        self.connect(self.actionEnregistrer_sous,SIGNAL("triggered()"),self.fileSaveAs)
-        self.connect(self.actionFermer,SIGNAL("triggered()"),self.fileClose)
-        self.connect(self.actionFermer_tout,SIGNAL("triggered()"),self.fileCloseAll)
-        self.connect(self.actionQuitter,SIGNAL("triggered()"),self.fileExit)
-
-        self.connect(self.actionEficas,SIGNAL("triggered()"),self.aidePPal)
-        self.connect(self.actionVersion,SIGNAL("triggered()"),self.version)
-        self.connect(self.actionParametres,SIGNAL("triggered()"),self.gestionParam)
-
-        self.connect(self.actionCouper,SIGNAL("triggered()"),self.editCut)
-        self.connect(self.actionCopier,SIGNAL("triggered()"),self.editCopy)
-        self.connect(self.actionColler,SIGNAL("triggered()"),self.editPaste)
-        self.connect(self.actionSupprimer,SIGNAL("triggered()"),self.supprimer)
-        self.connect(self.actionRechercher,SIGNAL("triggered()"),self.rechercher)
-        self.connect(self.actionDeplier_replier,SIGNAL("triggered()"),self.handleDeplier)
-
-        self.connect(self.actionRapport_de_Validation,SIGNAL("triggered()"),self.jdcRapport)
-        self.connect(self.actionRegles_du_JdC,SIGNAL("triggered()"),self.jdcRegles)
-        self.connect(self.actionFichier_Source,SIGNAL("triggered()"),self.jdcFichierSource)
-        self.connect(self.actionFichier_Resultat,SIGNAL("triggered()"),self.visuJdcPy)
-
-
-
-
-        # Pour Aster
-        self.actionTraduitV9V10 = QAction(self)
-        self.actionTraduitV9V10.setObjectName("actionTraduitV9V10")
-        self.actionTraduitV9V10.setText(tr("TraduitV9V10"))
-        self.actionTraduitV10V11 = QAction(self)
-        self.actionTraduitV10V11.setObjectName("actionTraduitV10V11")
-        self.actionTraduitV10V11.setText(tr("TraduitV10V11"))
-        self.actionTraduitV11V12 = QAction(self)
-        self.actionTraduitV11V12.setObjectName("actionTraduitV11V12")
-        self.actionTraduitV11V12.setText(tr("TraduitV11V12"))
-        self.actionSauveLigne = QAction(self)
-        self.actionSauveLigne.setText(tr("Sauve Format Ligne"))
-
-        #self.connect(self.actionParametres_Eficas,SIGNAL("triggered()"),self.optionEditeur)
-        self.connect(self.actionLecteur_Pdf,SIGNAL("triggered()"),self.optionPdf)
-        self.connect(self.actionTraduitV9V10,SIGNAL("triggered()"),self.traductionV9V10)
-        self.connect(self.actionTraduitV10V11,SIGNAL("triggered()"),self.traductionV10V11)
-        self.connect(self.actionTraduitV11V12,SIGNAL("triggered()"),self.traductionV11V12)
-        self.connect(self.actionSauveLigne,SIGNAL("triggered()"),self.sauveLigne)
-
-
-        # Pour Carmel
-        self.actionChercheGrpMaille = QAction(self)
-        self.actionChercheGrpMaille.setText(tr("Acquiert groupe mailles"))
-        self.connect(self.actionChercheGrpMaille,SIGNAL("triggered()"),self.ChercheGrpMaille)
-
-        # Pour CarmelCND
-        self.actionChercheGrp = QAction(self)
-        self.actionChercheGrp.setText(tr("Acquisition Groupe Maille"))
-        self.connect(self.actionChercheGrp,SIGNAL("triggered()"),self.ChercheGrp)
-
-        # Pour Aide
-        self.actionCode = QAction(self)
-        self.actionCode.setText(tr("Specificites Maille"))
-        self.connect(self.actionCode,SIGNAL("triggered()"),self.aideCode)
-
-    def connecterSignaux(self) :
-
-        self.recentMenu.aboutToShow.connect(self.handleShowRecentMenu)
-        self.action_Nouveau.triggered.connect(self.fileNew)
-        self.actionNouvel_Include.triggered.connect(self.newInclude)
-        self.actionOuvrir.triggered.connect(self.fileOpen)
-        self.actionEnregistrer.triggered.connect(self.fileSave)
-        self.actionEnregistrer_sous.triggered.connect(self.fileSaveAs)
-        self.actionFermer.triggered.connect(self.fileClose)
-        self.actionFermer_tout.triggered.connect(self.fileCloseAll)
-        self.actionQuitter.triggered.connect(self.fileExit)
-
-        self.actionEficas.triggered.connect(self.aidePPal)
-        self.actionVersion.triggered.connect(self.version)
-        self.actionParametres.triggered.connect(self.gestionParam)
-        self.actionCommentaire.triggered.connect(self.ajoutCommentaire)
-
-        self.actionCouper.triggered.connect(self.editCut)
-        self.actionCopier.triggered.connect(self.editCopy)
-        self.actionColler.triggered.connect(self.editPaste)
-        self.actionSupprimer.triggered.connect(self.supprimer)
-        self.actionRechercher.triggered.connect(self.rechercher)
-        self.actionDeplier_replier.triggered.connect(self.handleDeplier)
-
-        self.actionRapport_de_Validation.triggered.connect(self.jdcRapport)
-        self.actionRegles_du_JdC.triggered.connect(self.jdcRegles)
-        self.actionFichier_Source.triggered.connect(self.jdcFichierSource)
-        self.actionFichier_Resultat.triggered.connect(self.visuJdcPy)
-        self.actionAfficher_l_Arbre.triggered.connect(self.ouvreArbre)
-        self.actionCacher_l_Arbre.triggered.connect(self.fermeArbre)
-
-
-        # Pour Aster
-        self.actionTraduitV9V10 = QAction(self)
-        self.actionTraduitV9V10.setObjectName("actionTraduitV9V10")
-        self.actionTraduitV9V10.setText(tr("TraduitV9V10"))
-        self.actionTraduitV10V11 = QAction(self)
-        self.actionTraduitV10V11.setObjectName("actionTraduitV10V11")
-        self.actionTraduitV10V11.setText(tr("TraduitV10V11"))
-        self.actionTraduitV11V12 = QAction(self)
-        self.actionTraduitV11V12.setObjectName("actionTraduitV11V12")
-        self.actionTraduitV11V12.setText(tr("TraduitV11V12"))
-        self.actionSauveLigne = QAction(self)
-        self.actionSauveLigne.setText(tr("Sauve Format Ligne"))
-
-        #self.actionParametres_Eficas.triggered.connect(self.optionEditeur)
-        self.actionTraduitV9V10.triggered.connect(self.traductionV9V10)
-        self.actionTraduitV10V11.triggered.connect(self.traductionV10V11)
-        self.actionTraduitV11V12.triggered.connect(self.traductionV11V12)
-        self.actionSauveLigne.triggered.connect(self.sauveLigne)
-
-        # Pour Carmel
-        self.actionChercheGrpMaille = QAction(self)
-        self.actionChercheGrpMaille.setText(tr("Acquiert Groupe Maille"))
-
-        # Pour CarmelCND
-        self.actionChercheGrp = QAction(self)
-        self.actionChercheGrp.setText(tr("Accquisition Groupe Maille"))
-        self.actionChercheGrp.triggered.connect(self.ChercheGrp)
-
-        # Pour Aide
-        self.actionCode = QAction(self)
-        self.actionCode.setText(tr("Specificites Maille"))
-        self.actionCode.triggered.connect(self.aideCode)
-
-
-    def handleDeplier(self):
-        self.viewmanager.handleDeplier()
-
-    def ajoutCommentaire(self):
-        self.viewmanager.ajoutCommentaire()
-
-    def ouvreFichiers(self) :
-    # Ouverture des fichiers de commandes donnes sur la ligne de commande
-        cwd=os.getcwd()
-        self.dir=cwd
-        for study in session.d_env.studies:
-            os.chdir(cwd)
-            d=session.getUnit(study,self)
-            self.viewmanager.handleOpen(fichier=study["comm"],units=d)
-
-
-    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 initPatrons(self) :
-    # Mise a jour du menu des fichiers recemment ouverts
-        from Editeur import listePatrons
-        if not(self.code in listePatrons.sous_menus) :
-           if hasattr(self,"menuPatrons"):
-              self.menuPatrons.setAttribute(Qt.WA_DeleteOnClose)
-              self.menuPatrons.close()
-              delattr(self,"menuPatrons")
-           return
-        if (not hasattr(self,"menuPatrons")):
-           self.menuPatrons = QMenu(self.menubar)
-           self.menuPatrons.setObjectName("menuPatrons")
-           self.menubar.addAction(self.menuPatrons.menuAction())
-           self.menuPatrons.setTitle(tr("Patrons"))
-        else :
-           self.menuPatrons.clear()
-        self.listePatrons = listePatrons.listePatrons(self.code)
-        idx = 0
-        for nomSsMenu in self.listePatrons.liste:
-            ssmenu=self.menuPatrons.addMenu(nomSsMenu)
-            for fichier in self.listePatrons.liste[nomSsMenu]:
-               id = ssmenu.addAction(fichier)
-               self.ficPatrons[id]=fichier
-               self.id.triggered.connect(self.handleOpenPatrons)
-            #   self.Patrons.setItemParameter(id,idx)
-               idx=idx+1
-
-    def initRecents(self):
-       self.recent =  []
-       try :
-           if sys.platform[0:5]=="linux" :
-              rep=os.path.join(os.environ['HOME'],'.config/Eficas',self.code)
-           else :
-              rep=os.path.join('C:/','.config/Eficas',self.code)
-           monFichier=rep+"/listefichiers_"+self.code
-           index=0
-           f=open(monFichier)
-           while ( index < 9) :
-              ligne=f.readline()
-              if ligne != "" :
-                 l=(ligne.split("\n"))[0]
-                 self.recent.append(l)
-              index=index+1
-       except :
-           pass
-
-       try    : f.close()
-       except : pass
-
-    def addToRecentList(self, fn):
-      while fn in self.recent: self.recent.remove(fn)
-      self.recent.insert(0,fn)
-      if len(self.recent) > 9:
-         self.recent = self.recent[:9]
-
-
-    def addToRecentListQT4(self, fn):
-        """
-        Public slot to add a filename to the list of recently opened files.
-
-        @param fn name of the file to be added
-        """
-        self.recent.removeAll(fn)
-        self.recent.prepend(fn)
-        if len(self.recent) > 9:
-            self.recent = self.recent[:9]
-        index=0
-        self.sauveRecents()
-
-    def sauveRecents(self) :
-       try :
-         rep=self.maConfiguration.rep_user
-         monFichier=rep+"/listefichiers_"+self.code
-       except :
-         return
-       try :
-            f=open(monFichier,'w')
-            if len(self.recent) == 0 : return
-            index=0
-            while ( index <  len(self.recent)):
-              ligne=str(self.recent[index])+"\n"
-              f.write(ligne)
-              index=index+1
-       except :
+import logging
+import os
+logger=logging.getLogger()
+
+def initialise(flog=None):
+    if flog == None : 
+          #MonHome=os.environ['HOME']
+          MonHome=os.path.expanduser("~")
+          MaDir=MonHome+"/Eficas_install"
+          try :
+            os.mkdir(MaDir)
+          except :
             pass
-       try :
-            f.close()
-       except :
-            pass
-
-
-
-    def traductionV11V12(self):
-        from .gereTraduction import traduction
-        traduction(self.maConfiguration.repIni,self.viewmanager,"V11V12")
-
-    def traductionV10V11(self):
-        from .gereTraduction import traduction
-        traduction(self.maConfiguration.repIni,self.viewmanager,"V10V11")
-
-    def traductionV9V10(self):
-        from .gereTraduction import traduction
-        traduction(self.maConfiguration.repIni,self.viewmanager,"V9V10")
-
-    def version(self) :
-        from .monVisu import DVisu
-        titre = tr("version ")
-        monVisuDialg=DVisu(parent=self,fl=0)
-        monVisuDialg.setWindowTitle(titre)
-        if self.code != None : monVisuDialg.TB.setText(self.VERSION_EFICAS +tr(" pour ") + self.code)
-        else :  monVisuDialg.TB.setText(self.VERSION_EFICAS )
-        monVisuDialg.adjustSize()
-        monVisuDialg.show()
-
-    def aidePPal(self) :
-        repAide=os.path.dirname(os.path.abspath(__file__))
-        maD=os.path.join( repAide,'..','Doc')
-        try :
-          indexAide=os.path.join(maD,'index.html')
-          if sys.platform[0:5]=="linux" : cmd="xdg-open "+indexAide
-          else                          : cmd="start "+indexAide
-          os.system(cmd)
-        except:
-          QMessageBox.warning( self,tr( "Aide Indisponible"),tr( "l'aide n est pas installee "))
-
-    def aidePSEN(self) :
-        repAide=os.path.dirname(os.path.abspath(__file__))
-        maD=os.path.join( repAide,'..','Doc')
-        try :
-          indexAide=os.path.join(maD,'index.html')
-          if sys.platform[0:5]=="linux" : cmd="xdg-open "+indexAide
-          else                          : cmd="start "+indexAide
-          os.system(cmd)
-        except:
-          QMessageBox.warning( self,tr( "Aide Indisponible"),tr( "l'aide n est pas installee "))
-
-    def aideCode(self) :
-        if self.code==None : return
-        try :
-        #if 1 :
-          if sys.platform[0:5]=="linux" : cmd="xdg-open "+self.fileDoc
-          else                          : cmd="start "+self.fileDoc
-          os.system(cmd)
-        except:
-        #else:
-          QMessageBox.warning( self,tr( "Aide Indisponible"),tr( "l'aide n est pas installee "))
-
-
-    def optionEditeur(self) :
-        try :
-           name='monOptions_'+self.code
-        except :
-           QMessageBox.critical( self,tr( "Parametrage"),tr( "Veuillez d abord choisir un code"))
-           return
-        try :
-        #if 1:
-           optionCode=__import__(name)
-        except :
-        #else :
-           QMessageBox.critical( self, tr("Parametrage"), tr("Pas de possibilite de personnalisation de la configuration "))
-           return
-        monOption=optionCode.Options(parent=self,modal = 0 ,configuration=self.maConfiguration)
-        monOption.show()
-
-    def optionPdf(self) :
-        from monOptionsPdf import OptionPdf
-        monOption=OptionPdf(parent=self,modal = 0 ,configuration=self.maConfiguration)
-        monOption.show()
-
-    def handleSortieComplete(self):
-        return self.viewmanager.saveCompleteCurrentEditor()
-
-    def handleShowRecentMenu(self):
-        """
-        Private method to set up recent files menu.
-        """
-        self.recentMenu.clear()
-
-        for rp in self.recent:
-            id = self.recentMenu.addAction(rp)
-            self.ficRecents[id]=rp
-            id.triggered.connect(self.handleOpenRecent)
-        self.recentMenu.addSeparator()
-        self.recentMenu.addAction(tr('&Effacer'), self.handleClearRecent)
-
-    def handleOpenPatrons(self):
-        idx=self.sender()
-        fichier=self.repIni+"/../Editeur/Patrons/"+self.code+"/"+self.ficPatrons[idx]
-        self.viewmanager.handleOpen(fichier=fichier, patron = 1)
-
-    def handleOpenRecent(self):
-        idx=self.sender()
-        fichier=self.ficRecents[idx]
-        self.viewmanager.handleOpen(fichier=fichier, patron =0 )
-
-    def handleClearRecent(self):
-        self.recent = QStringList()
-        self.sauveRecents()
-
-    def handleRechercherDsCatalogue(self):
-        if not self.viewmanager : return
-        self.viewmanager.handleRechercherDsCatalogue()
-
-    def fileNew(self):
-        try:
-            self.viewmanager.newEditor()
-        except EficasException as exc:
-            msg = six.text_type(exc)
-            if msg != "": QMessageBox.warning(self, tr(u"Erreur"), msg)
-
-    def openProcess(self):
-        ssCode=None
-        code="PSEN_N1"
-        self.cleanPath()
-        dirCode=os.path.abspath(os.path.join(os.path.abspath(__file__),'../..',"ProcessOutputs_Eficas"))
-        sys.path.insert(0,dirCode)
-        self.code=code
-        self.definitCode(code,ssCode)
-        self.multi=True
-        self.demande=False
-        self.initRecents()
-        self.fileOpen()
-
-
-    def fileOpen(self):
-        try:
-            self.viewmanager.handleOpen()
-        except EficasException as exc:
-            msg = six.text_type(exc)
-            if msg != "":
-                QMessageBox.warning(self, tr(u"Erreur"), msg)
-
-    def sauveLigne(self):
-        return self.viewmanager.sauveLigneCurrentEditor()
-
-    def fileSave(self):
-        return self.viewmanager.saveCurrentEditor()
-
-    def fileSaveAs(self):
-        return self.viewmanager.saveAsCurrentEditor()
-
-    def fileClose(self):
-        self.viewmanager.handleClose(texte='&Fermer')
-
-    def fileCloseAll(self):
-        self.viewmanager.handleCloseAll(texte='&Fermer')
-
-    def fileExit(self):
-        # On peut sortir sur Abort
-        res=self.viewmanager.handleCloseAll()
-        if (res != 2) :
-            self.close()
-        return res
-
-    def editCopy(self):
-        self.viewmanager.handleEditCopy()
-
-    def editCut(self):
-        self.viewmanager.handleEditCut()
-
-    def editPaste(self):
-        self.viewmanager.handleEditPaste()
-
-    def rechercher(self):
-        self.viewmanager.handleRechercher()
-
-    def run(self):
-        self.viewmanager.run()
-
-    def saveRun(self):
-        self.viewmanager.saveRun()
-
-
-    def supprimer(self):
-        self.viewmanager.handleSupprimer()
-
-    def jdcFichierSource(self):
-        self.viewmanager.handleViewJdcFichierSource()
-
-    def jdcRapport(self):
-        self.viewmanager.handleViewJdcRapport()
-
-    def jdcRegles(self):
-        self.viewmanager.handleViewJdcRegles()
-
-    def gestionParam(self):
-        self.viewmanager.handleGestionParam()
-
-    def visuJdcPy(self):
-        self.viewmanager.handleViewJdcPy()
-
-    def ouvreArbre(self):
-        self.viewmanager.ouvreArbre()
-
-    def fermeArbre(self):
-        self.viewmanager.fermeArbre()
-
-    def newInclude(self):
-        self.viewmanager.newIncludeEditor()
-
-    def cleanPath(self):
-        for pathCode in self.ListePathCode:
-            try:
-              aEnlever=os.path.abspath(os.path.join(os.path.dirname(__file__),'..',pathCode))
-              sys.path.remove(aEnlever)
-            except :
-              pass
-        for pathCode in self.listeAEnlever:
-            try:
-              sys.path.remove(aEnlever)
-            except :
-              pass
-
-
-    def closeEvent(self,event):
-      res=self.fileExit()
-      if res==2 : event.ignore()
-
-    def remplitIconesCommandes(self):
-        if self.maConfiguration.boutonDsMenuBar == False : return
-        if not hasattr(self, 'readercata') : return
-        from monLayoutBouton import MonLayoutBouton
-        if hasattr(self,'monLayoutBoutonRempli') : return
-        self.monLayoutBoutonRempli=MonLayoutBouton(self)
-        
-    def handleAjoutEtape(self,nomEtape):
-        self.viewmanager.handleAjoutEtape(nomEtape)
-     
-    def metMenuAJourUtilisateurs(self):
-        self.lesFonctionsUtilisateurs={}
-        if self.code not in self.mesScripts : return
-        if not hasattr(self.mesScripts[self.code],'dict_menu') : return
-        for monMenu in iter(self.mesScripts[self.code].dict_menu.items()) :
-            titre,lesFonctions= monMenu
-            self.menuOptions = self.menubar.addMenu("menuOptions")
-            self.menuOptions.setTitle(tr(titre))
-            for elt in lesFonctions :
-               laFonctionUtilisateur, label, lesArguments = elt
-               action = QAction(self)
-               action.setText(label)
-            #action.triggered.connect(self.appelleFonctionUtilisateur)
-               self.menuOptions.addAction(action)
-               self.lesFonctionsUtilisateurs[action]=(laFonctionUtilisateur, lesArguments)
-            self.menuOptions.triggered.connect(self.handleFonctionUtilisateur)
-
-    def handleFonctionUtilisateur(self,action) :
-        (laFonctionUtilisateur, lesArguments)=self.lesFonctionsUtilisateurs[action]
-        self.viewmanager.handleFonctionUtilisateur(laFonctionUtilisateur, lesArguments)
-
-if __name__=='__main__':
-
-    # Modules Eficas
-    rep=os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__),'..','Adao')))
-    sys.path.append(rep)
-    from Adao import prefs
-    from Adao import prefs_Adao
-    #if hasattr(prefsCode,'encoding'):
-       # Hack pour changer le codage par defaut des strings
-       #import sys
-       #reload(sys)
-       #sys.setdefaultencoding(prefsCode.encoding)
-       #del sys.setdefaultencoding
-       # Fin hack
-
-    from Editeur import import_code
-    from Editeur import session
-
-    # Analyse des arguments de la ligne de commande
-    options=session.parse(sys.argv)
-    code=options.code
-
-
-    app = QApplication(sys.argv)
-    #app.setMainWidget(mw) (qt3)
-    Eficas=Appli()
-    Eficas.show()
-
-    #mw.ouvreFichiers()
-    #mw.show()
-
-    res=app.exec_()
-    sys.exit(res)
+          try :
+            os.listdir(MaDir)
+            flog=MaDir+"/convert.log"
+          except :
+            flog='/tmp/convert.log'
+
+    hdlr=logging.FileHandler(flog,'w')
+    formatter = logging.Formatter('%(levelname)s: %(message)s')
+    hdlr.setFormatter(formatter)
+    logger.addHandler(hdlr) 
+    logger.setLevel(logging.INFO)
+    return hdlr
+
+
+def ferme (hdlr) :
+    logger.removeHandler(hdlr)
index 59f39bf8cae3911c8963f7133e687cf72f5f82ce..d7896621f41ecf61589a2bd893f9d7e6f344fecf 100755 (executable)
@@ -18,6 +18,7 @@
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
 
+
 from __future__ import absolute_import
 from __future__ import print_function
 try :
@@ -25,31 +26,32 @@ try :
 except : pass
 
 import os, sys
-import six
 
 from Extensions.eficas_exception import EficasException
 from Extensions import param2
 
 from InterfaceQT4.getVersion import getEficasVersion
 from InterfaceQT4.viewManagerSsIhm import MyViewManagerSsIhm
-#from editorSsIhm import JDCEditorSsIhm
+
+from Editeur        import session
 
 
 class AppliSsIhm:
     """
     Class implementing the main user interface.
     """
-    def __init__(self,code=None,salome=1,parent=None,ssCode=None,multi=False,langue='fr',ssIhm=True,versionCode=None):
+    def __init__(self,code=None,salome=1,parent=None,multi=False,langue='fr',ssIhm=True,labelCode=None,genereXSD=False):
         """
         Constructor
         """
         version=getEficasVersion()
         self.VERSION_EFICAS="Eficas QT5 Salome " + version
-        self.versionCode=versionCode
+        self.labelCode=labelCode
 
         self.salome=salome
         self.ssIhm=True
         self.code=code
+        self.genereXSD=genereXSD
 
         self.dict_reels={}
         self.fichierIn=None
@@ -63,6 +65,10 @@ class AppliSsIhm:
         self.listeCode=['Adao','ADAO','Carmel3D','Telemac','CF','MAP','ZCracks', 'SEP','SPECA','PSEN_Eficas','PSEN_N1']
         self.repIcon=os.path.join( os.path.dirname(os.path.abspath(__file__)),'..','Editeur','icons')
 
+        self.fichierCata=session.d_env.fichierCata
+        if session.d_env.labelCode : self.labelCode=session.d_env.labelCode
+        self.withXSD=session.d_env.withXSD
+
         if self.salome:
           import Accas
           try :
@@ -80,7 +86,7 @@ class AppliSsIhm:
         else           : self.langue="ang"
 
         if self.multi == False :
-             self.definitCode(code,ssCode)
+             self.definitCode(code,None)
              if code==None: return
 
         self.suiteTelemac=False
@@ -92,23 +98,34 @@ class AppliSsIhm:
         self.ssCode=ssCode
         if self.code == None:return # pour le cancel de la fenetre choix code
 
-        name='prefs_'+self.code
-        prefsCode=__import__(name)
+        try : 
+          name='prefs_'+self.code
+          prefsCode=__import__(name)
+          self.repIni=prefsCode.repIni
+        except : 
+          self.repIni=os.path.dirname(os.path.abspath(__file__))
+          
 
-        self.repIni=prefsCode.repIni
         if ssCode != None :
-           self.format_fichier= ssCode  #par defaut
-           prefsCode.NAME_SCHEME=ssCode
+           self.formatFichierOut = ssCode  #par defaut
+           prefsCode.NAME_SCHEME = ssCode
         else :
-           self.format_fichier="python" #par defaut
+           self.formatFichierIn  = "python" #par defaut
+           self.formatFichierOut = "python" #par defaut
 
         nameConf='configuration_'+self.code
-        configuration=__import__(nameConf)
-        self.maConfiguration = configuration.make_config(self,prefsCode.repIni)
+        try :
+          configuration=__import__(nameConf)
+          self.maConfiguration = configuration.make_config(self,self.repIni)
+        except :
+          from InterfaceQT4.configuration import makeConfig
+          #self.maConfiguration = configuration.makeConfig(self,prefsCode.repIni)
+          self.maConfiguration = makeConfig(self,self.repIni)
 
         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):
@@ -121,20 +138,29 @@ class AppliSsIhm:
 
 
     def initEditor(self,fichier = None,jdc = None, units = None,include=0):
-        if self.editor != None : 
-           print ('un seul editeur par appli')
+        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 = JDCEditorSsIhm(self,fichier, jdc, self.myQtab,units=units,include=include)
+        self.editor = self.viewmanager.getNewEditorNormal()
         
 
     def fileNew(self):
-        self.editor=initEditor(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(six.text_type(fichier))
+        fichierIn = os.path.abspath(fichier)
         try:
             monEditor=self.viewmanager.handleOpen(fichierIn)
         except EficasException as exc:
@@ -152,10 +178,12 @@ class AppliSsIhm:
         ok = editor.saveFileAs()
         print ('ok ',ok)
 
-    def dumpXsd(self):
+    def dumpXsd(self, avecEltAbstrait = False):
         current_cata    = CONTEXT.getCurrentCata()
-        current_cata.dumpXsd()
-        if self.maConfiguration.afficheIhm==False : exit()
+        texteXSD = current_cata.dumpXsd( avecEltAbstrait)
+        return texteXSD
+        #if self.maConfiguration.afficheIhm==False : exit()
+        #else : return texteXSD
 
 #,self.fileSaveAs
 #,self.fileClose
@@ -170,4 +198,4 @@ class AppliSsIhm:
 if __name__=='__main__':
 
     # Modules Eficas
-    monEficas= AppliSsIhm(code='Adao',salome=0,versionCode='V83')
+    monEficas= AppliSsIhm(code='Adao',salome=0,labelCode='V83')
index 1b0b79ab527cce468afbd1738d6b447730ece1e7..f6f227a71b2f252b28290561cdef1877e7a1146c 100644 (file)
@@ -42,9 +42,11 @@ class SaisieValeur(object):
 
 
   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())
@@ -56,24 +58,24 @@ class SaisieValeur(object):
                self.inSaisieValeur=False
                return
          else :
-            #PN PN PN ???? la 1 ligne est tres bizarre.
             try : 
-              if hasattr(self,"lineEditVal"):self.lineEditVal.setText(tr(valeur.nom))
+              # 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 :
+            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 != "" :
-            #PNPNPNP Il faut trouver une solution pour les 2 cas 
-            #   self.editor.afficheInfos(commentaire)
-            #self.Commentaire.setText(tr(commentaire))
             if validite :
                 self.editor.afficheCommentaire(commentaire)
             else :
@@ -82,17 +84,6 @@ class SaisieValeur(object):
          self.setValide()
 
 
-  #def TraiteLEValeurTuple(self,valeurBrute=None) :
-  #      listeValeurs=[]
-  #      if valeurBrute== None :valeurBrute=str(self.LEValeur.text())
-  #      listeValeursSplit=valeurBrute.split(',')
-  #      for val in listeValeursSplit :
-  #          try :
-  #             valeur=eval(val,{})        
-  #          except :
-  #             valeur=val
-  #          listeValeurs.append(valeur)
-  #      return listeValeurs
 
   def TraiteLEValeur(self,valeurTraitee=None) :
         # lit la chaine entree dans le line edit
index 2fd60cb78363669409e0948b009adaecc455cde3..2d6a8718a97570146aafeef55cf96aa5ea97d7ba 100644 (file)
@@ -1,4 +1,4 @@
-# -*- coding: utf-8 -*-
+# -*-  coding: utf-8 -*-
 # Copyright (C) 2007-2017   EDF R&D
 #
 # This library is free software; you can redistribute it and/or
@@ -30,12 +30,7 @@ try :
    from builtins import object
 except : pass
 
-import time
-import os,sys,py_compile
-import traceback
-import six.moves.cPickle
-import re
-import types
+import os, sys
 
 # Modules Eficas
 from Noyau.N_CR import CR
@@ -45,29 +40,34 @@ import analyse_catalogue
 import analyse_catalogue_initial
 import autre_analyse_cata
 import uiinfo
-from InterfaceQT4.monChoixCata import MonChoixCata
 from Extensions.i18n import tr
 from Extensions.eficas_exception import EficasException
 
-from PyQt5.QtWidgets import QMessageBox, QApplication, QDialog
 
 #-------------------------------
 class ReaderCataCommun(object):
 #-------------------------------
 
-   def askChoixCatalogue(self, cata_choice_list):
+   def askChoixCatalogue(self, cataListeChoix):
    # ____________________________________________
       """
       Ouvre une fenetre de selection du catalogue dans le cas où plusieurs
       ont ete definis dans Accas/editeur.ini
       """
+      try : 
+         from PyQt5.QtWidgets import QDialog
+      except : 
+         print ('Pas de choix interactif sans qt')
+         return
+
       code = getattr(self.appliEficas.maConfiguration, "code", None)
       if code != None :
           title=tr("Choix d une version du code ")+str(code)
       else :
           title=tr("Choix d une version ")
 
-      widgetChoix = MonChoixCata(self.appliEficas, [cata.user_name for cata in cata_choice_list], title)
+      from InterfaceQT4.monChoixCata import MonChoixCata
+      widgetChoix = MonChoixCata(self.appliEficas, [cata.labelCode for cata in cataListeChoix], title)
       ret=widgetChoix.exec_()
 
 
@@ -76,14 +76,13 @@ class ReaderCataCommun(object):
       lab+=str(self.code)
       lab+=tr(" avec le catalogue ")
       if ret == QDialog.Accepted:
-          cata = cata_choice_list[widgetChoix.CBChoixCata.currentIndex()]
-          self.fic_cata = cata.cata_file_path
-          self.versionCode = cata.identifier
-          self.appliEficas.format_fichier = cata.file_format
-          self.appliEficas.format_fichier_in = cata.file_format_in
-          lab+=self.versionCode
+          cata = cataListeChoix[widgetChoix.CBChoixCata.currentIndex()]
+          self.fichierCata = cata.fichierCata
+          self.labelCode   = cata.labelCode
+          self.appliEficas.formatFichierOut = cata.formatFichierOut
+          self.appliEficas.formatFichierIn  = cata.formatFichierIn
+          lab+=self.labelCode
           self.appliEficas.setWindowTitle(lab)
-          #qApp.mainWidget().setCaption(lab)
           widgetChoix.close()
       else:
           widgetChoix.close()
@@ -92,65 +91,91 @@ class ReaderCataCommun(object):
    def choisitCata(self):
    # ____________________
 
-      liste_cata_possibles=[]
+      listeCataPossibles=[]
       self.Commandes_Ordre_Catalogue=[]
 
-      all_cata_list = []
+
+      listeTousLesCatas = []
       for catalogue in self.appliEficas.maConfiguration.catalogues:
-          if isinstance(catalogue, CatalogDescription): all_cata_list.append(catalogue)
-          elif isinstance(catalogue, tuple)           : all_cata_list.append(CatalogDescription.create_from_tuple(catalogue))
+          if isinstance(catalogue, CatalogDescription): listeTousLesCatas.append(catalogue)
+          elif isinstance(catalogue, tuple)           : listeTousLesCatas.append(CatalogDescription.createFromTuple(catalogue))
           else: print(("Catalog description cannot be interpreted: ", catalogue))
 
       # This filter is only useful for codes that have subcodes (like MAP).
       # Otherwise, the "code" attribute of the catalog description can (should) be None.
-      if self.ssCode is None: liste_cata_possibles = all_cata_list
+      if self.ssCode is None: listeCataPossibles = listeTousLesCatas
       else:
-          for catalogue in all_cata_list:
-              if catalogue.code == self.code and catalogue.file_format == self.ssCode: liste_cata_possibles.append(catalogue)
-
-      if len(liste_cata_possibles)==0:
-          QMessageBox.critical(self.QWParent, tr("Import du catalogue"),
+          for catalogue in listeTousLesCatas:
+             if catalogue.code == self.code and catalogue.ssCode == self.ssCode: listeCataPossibles.append(catalogue)
+
+      # le catalogue est fixe dans la ligne de commande
+      if self.appliEficas.fichierCata != None : 
+         trouve=False
+         for catalogue in listeTousLesCatas: 
+             if os.path.abspath(catalogue.fichierCata) ==  (os.path.abspath(self.appliEficas.fichierCata)) :
+                listeCataPossibles=(catalogue,)
+                trouve=True
+                break
+         if not trouve:
+                catalogue=CatalogDescription.createFromTuple((self.code ,self.code,self.appliEficas.fichierCata,'python','python'))
+                listeCataPossibles=(catalogue,)
+             
+
+      if len(listeCataPossibles)==0:
+          try : 
+             from PyQt5.QtWidgets import QMessageBox, QDialog
+             QMessageBox.critical(self.QWParent, tr("Import du catalogue"),
                                tr("Pas de catalogue defini pour le code ") + self.code)
+          except : 
+             print ("Pas de catalogue defini pour le code " + self.code)
           self.appliEficas.close()
           if self.appliEficas.salome == 0 : sys.exit(1)
           return
 
 
-      if self.versionCode is not None:
+      # le label est fixe dans la ligne de commande
+      if self.labelCode is not None:
           # La version a ete fixee
-          for cata in liste_cata_possibles:
-             if self.versionCode == cata.identifier:
-                self.fic_cata = cata.cata_file_path
-                self.appliEficas.format_fichier = cata.file_format
-                self.appliEficas.format_fichier_in = cata.file_format_in
+          for cata in listeCataPossibles:
+             if self.labelCode == cata.labelCode:
+                self.fichierCata = cata.fichierCata
+                self.appliEficas.formatFichierIn  = cata.formatFichierIn
+                self.appliEficas.formatFichierOut = cata.formatFichierOut
       else:
-          cata_choice_list = []
-          for cata in liste_cata_possibles:
-              if cata.selectable:
-                  if cata.default : cata_choice_list.insert(0, cata)
-                  else            : cata_choice_list.append(cata)
-
-          if len(cata_choice_list) == 0:
-              QMessageBox.critical(self.QWParent, tr("Import du catalogue"),
+          cataListeChoix = []
+          for cata in listeCataPossibles:
+              if cata.default : cataListeChoix.insert(0, cata)
+              else            : cataListeChoix.append(cata)
+
+          if len(cataListeChoix) == 0:
+              try : 
+                from PyQt5.QtWidgets import QMessageBox
+                QMessageBox.critical(self.QWParent, tr("Import du catalogue"),
                                    tr("Aucun catalogue trouve"))
+              except :
+                print ("Pas de catalogue defini pour le code " + self.code)
               self.appliEficas.close()
               if self.appliEficas.salome == 0 : sys.exit(1)
 
-          elif len(cata_choice_list) == 1:
-              self.fic_cata = cata_choice_list[0].cata_file_path
-              self.versionCode = cata_choice_list[0].identifier
-              self.appliEficas.format_fichier = cata_choice_list[0].file_format
-              self.appliEficas.format_fichier_in = cata_choice_list[0].file_format_in
+          elif len(cataListeChoix) == 1:
+              self.fichierCata = cataListeChoix[0].fichierCata
+              self.labelCode   = cataListeChoix[0].labelCode
+              self.appliEficas.formatFichierOut = cataListeChoix[0].formatFichierOut
+              self.appliEficas.formatFichierIn  = cataListeChoix[0].formatFichierIn
 
           else:
               # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
               # lequel il veut utiliser ...
-              self.askChoixCatalogue(cata_choice_list)
+              if self.appliEficas.ssIhm : 
+                 print ('Unable to know which catafile is choosen')
+                 exit()
+              self.askChoixCatalogue(cataListeChoix)
               self.demandeCatalogue=True
 
-      if self.fic_cata == None :
+      if self.fichierCata == None :
           if self.appliEficas.salome == 0 :
-             print(("Pas de catalogue pour code %s, version %s" %(self.code,self.versionCode)))
+             print(("Pas de catalogue pour code %s, version %s" %(self.code,self.labelCode)))
              sys.exit(1)
           else :
              self.appliEficas.close()
@@ -162,17 +187,20 @@ class ReaderCata (ReaderCataCommun):
 #------------------------------------
 
    def __init__(self,QWParent, appliEficas):
-   # ______________________________________
+   # _______________________________________
 
+     
       self.QWParent=QWParent
       self.appliEficas=self.QWParent.appliEficas
       self.VERSION_EFICAS=self.appliEficas.VERSION_EFICAS
       self.demandeCatalogue=False
       self.code=self.appliEficas.code
       self.ssCode=self.appliEficas.ssCode
-      self.appliEficas.format_fichier='python'
-      self.versionCode=self.appliEficas.versionCode
-      self.fic_cata=None
+      # on positionne par defaut mais est-ce vraiment necessaire
+      self.appliEficas.formatFichierIn='python'
+      self.appliEficas.formatFichierOut='python'
+      self.labelCode=self.appliEficas.labelCode
+      self.fichierCata=self.appliEficas.fichierCata
       self.openCata()
       self.traiteIcones()
       self.cataitem=None
@@ -180,7 +208,6 @@ class ReaderCata (ReaderCataCommun):
       if self.code=="TELEMAC": self.creeDicoCasToCata()
 
 
-
    def openCata(self):
       """
           Ouvre le catalogue standard du code courant, cad le catalogue present
@@ -189,22 +216,45 @@ class ReaderCata (ReaderCataCommun):
       # import du catalogue
       self.choisitCata()
 
-      if self.appliEficas.maConfiguration.withXSD :
-         try :
-           #import raw.Telemac2d as modeleMetier
-           #import raw.cata_genere_fact as modeleMetier
-           import raw.cata_map_genere as modeleMetier
-           #import raw.cata_bloc as modeleMetier
-           print ('import Test ad modeleMetier')
-         except :
-           modeleMetier = None
-      else :
-           modeleMetier = None
-
-      self.cata = self.importCata(self.fic_cata)
+      modeleMetier = None
+      if not (self.appliEficas.genereXSD) :
+         if (self.appliEficas.maConfiguration.withXSD or self.appliEficas.withXSD)  :
+           try :
+             import pyxb
+           except :
+             self.QWParent.informe('environnement', 'please source pyxb environment')
+             exit()
+           try : 
+             nomCataXsd = os.path.splitext(os.path.basename(self.fichierCata))[0]
+             fichierCataTrunc=os.path.splitext(os.path.basename(self.fichierCata))[0]  
+             nomCataXsd = fichierCataTrunc+'_driver' 
+             pathCata = os.path.dirname(self.fichierCata)+'/raw/'+nomCataXsd+'.py'
+             import imp
+             modeleMetier= imp.load_source(nomCataXsd,pathCata)
+           except :
+             if self.appliEficas.ssIhm == False :print ('______________ poum import cata_genere ')
+             self.QWParent.informe('XSD driver', 'unable to load xsd driver',critique=False)
+             modeleMetier = None
+
+      self.cata = self.importCata(self.fichierCata)
+      if hasattr(self.cata, 'implement'): self.cata.JdC.implement = self.cata.implement
+      else : self.cata.JdC.implement = ""
+      if hasattr(self.cata, 'importedBy'): self.cata.JdC.importedBy = self.cata.importedBy
+      else : self.cata.JdC.importedBy = [] 
+      self.cata.JdC.labelCode = self.labelCode 
+      if not(hasattr(self.cata, 'dict_condition')): self.cata.dict_condition = {}
+      
+      # pointeur pour le dumpXSD
+      self.cata.JdC.cata=self.cata
+      
       self.cata.modeleMetier = modeleMetier
       if not self.cata :
-          QMessageBox.critical( self.QWParent, tr("Import du catalogue"),tr("Impossible d'importer le catalogue ")+ self.fic_cata)
+          #try:
+            #from PyQt5.QtWidgets import QMessageBox, QDialog
+            #QMessageBox.critical( self.QWParent, tr("Import du catalogue"),tr("Impossible d'importer le catalogue ")+ self.fichierCata)
+          #except : 
+          #  print ("Impossible d'importer le catalogue "+ self.fichierCata)
+          self.QWParent.informe("Catalogue","Impossible d'importer le catalogue "+ self.fichierCata)
           self.appliEficas.close()
           if self.appliEficas.salome == 0 :
              sys.exit(1)
@@ -214,7 +264,6 @@ class ReaderCata (ReaderCataCommun):
       # retrouveOrdreCataStandard fait une analyse textuelle du catalogue
       # remplace par retrouveOrdreCataStandardAutre qui utilise une numerotation
       # des mots cles a la creation
-      #print (self.cata)
       #print (dir(self.cata))
       self.retrouveOrdreCataStandardAutre()
       if self.appliEficas.maConfiguration.modeNouvCommande == "initial" : self.retrouveOrdreCataStandard()
@@ -242,7 +291,7 @@ class ReaderCata (ReaderCataCommun):
       # traitement des clefs documentaires
       #
 
-      self.titre=self.VERSION_EFICAS+" "+tr( " avec le catalogue ") + os.path.basename(self.fic_cata)
+      self.titre=self.VERSION_EFICAS+" "+tr( " avec le catalogue ") + os.path.basename(self.fichierCata)
       if self.appliEficas.ssIhm == False : self.appliEficas.setWindowTitle(self.titre)
       self.appliEficas.titre=self.titre
       self.QWParent.titre=self.titre
@@ -257,9 +306,13 @@ class ReaderCata (ReaderCataCommun):
       sys.path[:0] = [rep_cata]
       self.appliEficas.listeAEnlever.append(rep_cata)
 
+      # PNPNPN pas propre __ A reflechir
+      if 'cata_Vimmp' in list(sys.modules.keys()) :
+          del sys.modules['cata_Vimmp']
 
       if nom_cata in list(sys.modules.keys()) :
         del sys.modules[nom_cata]
+
       for k in sys.modules:
         if k[0:len(nom_cata)+1] == nom_cata+'.':
           del sys.modules[k]
@@ -275,6 +328,8 @@ class ReaderCata (ReaderCataCommun):
           o=__import__(nom_cata)
           return o
       except Exception as e:
+          self.QWParent.informe('catalog', 'unable to load catalog file')
+          import traceback
           traceback.print_exc()
           return 0
 
@@ -288,6 +343,8 @@ class ReaderCata (ReaderCataCommun):
           contient le nom des mots cles dans le bon ordre
       """
       self.cata_ordonne_dico, self.appliEficas.liste_simp_reel=autre_analyse_cata.analyseCatalogue(self.cata)
+      #print ('_________________________________________', self)
+      #print (self.cata_ordonne_dico)
       #self.appliEficas.liste_simp_reel = ()
       #self.cata_ordonne_dico = {}
 
@@ -296,9 +353,9 @@ class ReaderCata (ReaderCataCommun):
           Retrouve l'ordre des mots-cles dans le catalogue, cad :
           Attention s appuie sur les commentaires
       """
-      nom_cata = os.path.splitext(os.path.basename(self.fic_cata))[0]
-      rep_cata = os.path.dirname(self.fic_cata)
-      self.Commandes_Ordre_Catalogue = analyse_catalogue_initial.analyseCatalogue(self.fic_cata)
+      nom_cata = os.path.splitext(os.path.basename(self.fichierCata))[0]
+      rep_cata = os.path.dirname(self.fichierCata)
+      self.Commandes_Ordre_Catalogue = analyse_catalogue_initial.analyseCatalogue(self.fichierCata)
       #print self.Commandes_Ordre_Catalogue
 
    def traiteIcones(self):
index 5579a82b60aff7ada8f1b16dd5f1a8162cd816e0..9282b62261d76d381ad103d9342b75066f931763 100644 (file)
@@ -46,12 +46,13 @@ class ReaderCata (ReaderCataCommun):
       self.VERSION_EFICAS=self.appliEficas.VERSION_EFICAS
       self.code=self.appliEficas.code
       self.ssCode=self.appliEficas.ssCode
-      self.appliEficas.format_fichier='python'
-      self.appliEficas.format_fichier_in ='xml'
+      # PN ?? bizarre le 22/04/20
+      self.appliEficas.formatfichierOut='python'
+      self.appliEficas.formatfichierIn ='xml'
       self.modeNouvCommande=self.appliEficas.maConfiguration.modeNouvCommande
-      self.versionCode=self.appliEficas.versionCode
+      self.labelCode=self.appliEficas.labelCode
       self.version_cata=None
-      self.fic_cata=None
+      self.ficCata=None
       self.OpenCata()
       self.cataitem=None
       self.titre='Eficas XML'
@@ -65,11 +66,11 @@ class ReaderCata (ReaderCataCommun):
 
    def OpenCata(self):
 
-      #self.fic_cata = 'Cata_MED_FAM.xml'
+      #self.ficCata = 'Cata_MED_FAM.xml'
       #xml = open('/home/A96028/QT5GitEficasTravail/eficas/Med/Cata_MED_FAM.xml').read()
       #xml = open('/home/A96028/QT5GitEficasTravail/eficas/CataTestXSD/cata_test1.xml').read()
       self.choisitCata()
-      xml=open(self.fic_cata).read()
+      xml=open(self.ficCata).read()
       SchemaMed = readerEfiXsd.efficas.CreateFromDocument(xml)
       SchemaMed.exploreCata() 
       self.cata=SchemaMed
index a7fae98121cc158834d12a3c9c3cdfd35a1fafb8..801df350e4964991e5ec4f792c7ad64b92e9d835 100644 (file)
@@ -33,6 +33,7 @@ class ASSD(object):
     """
        Classe de base pour definir des types de structures de donnees ASTER
        equivalent d un concept ASTER
+       Doit_on garder tout ce qui concerne jeveux ? les concepts ?
     """
     idracine = "SD"
 
@@ -66,7 +67,7 @@ class ASSD(object):
             self.order = self.parent.icmd
         else:
             self.order = 0
-        # attributs pour le Catalogue de Structure de Données Jeveux
+        # attributs pour le Catalogue de Structure de Données
         # "self.cata_sdj" est un attribut de classe
         self.ptr_class_sdj = None
         self.ptr_sdj = None
@@ -102,8 +103,13 @@ class ASSD(object):
         return self.etape[key]
 
     def setName(self, nom):
-        """Positionne le nom de self (et appelle sd_init)
+        """Positionne le nom de self 
         """
+        print ('uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu')
+        print ('uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu')
+        print ('uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu')
+        print ('uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu')
+        print ('uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu')
         self.nom = nom
 
     def isTypCO(self):
@@ -130,7 +136,8 @@ class ASSD(object):
                 self.nom = self.parent.getName(self) or self.id
             except:
                 self.nom = ""
-        if self.nom.find('sansnom') != -1 or self.nom == '':
+
+        if self.nom=='sansnom' or self.nom == '':
             self.nom = self.id
         return self.nom
 
@@ -214,9 +221,36 @@ class ASSD(object):
             val = self.jdc.parLot
         return val == 'OUI'
 
-    def rebuild_sd(self):
-        """Conserver uniquement pour la compatibilite avec le catalogue v10 dans eficas."""
 
+    def getEficasAttribut(self, attribut): 
+        #print ('getEficasAttribut : ', self, attribut)
+        valeur=self.etape.getMocle(attribut)
+        try :
+          valeur=self.etape.getMocle(attribut)
+        except :
+          valeur = None
+        #print (valeur)
+        return valeur
+
+    def getEficasListOfAttributs(self,listeAttributs):
+        from .N_MCLIST import MCList
+        #print ('getEficasListOfAttributs pour', self,listeAttributs)
+        aTraiter=(self.etape,)
+        while len(listeAttributs) > 0 : 
+          attribut=listeAttributs.pop(0)
+          print ("attribut", attribut)
+          nvListe=[]
+          for mc in aTraiter :
+             print (mc)
+             try : 
+               resultat=mc.getMocle(attribut)
+               if isinstance(resultat,MCList): 
+                  for rmc in resultat : nvListe.append(rmc) 
+               else : nvListe.append(resultat)
+             except : pass
+          aTraiter=nvListe
+        #print ('fin getEficasListOfAttributs ', nvListe)
+        return nvListe
 
 class assd(ASSD):
 
index b1315229002ad5cdfa332ec277a2bbf26665f863..73d9835fb0b08f9cfcb571fc67c5599bfe01fecf 100644 (file)
@@ -35,6 +35,7 @@ from .N_Exception import AsException
 from .N_types import forceList
 
 
+
 class BLOC(N_ENTITE.ENTITE):
 
     """
@@ -51,7 +52,7 @@ class BLOC(N_ENTITE.ENTITE):
     class_instance = N_MCBLOC.MCBLOC
     label = 'BLOC'
 
-    def __init__(self, fr="", docu="", regles=(), statut='f', condition=None,ang="",
+    def __init__(self, fr="", docu="", regles=(), statut='f', condition=None,ang="", nomXML=None,
                  **args):
         """
             Un bloc est caractérisé par les attributs suivants :
@@ -77,8 +78,10 @@ class BLOC(N_ENTITE.ENTITE):
             self.regles = (regles,)
         self.statut = statut
         self.condition = condition
+        self.nomXML = nomXML
         self.entites = args
         self.affecter_parente()
+        self.txtNomComplet = ''
 
     def __call__(self, val, nom, parent=None, dicoPyxbDeConstruction=None):
         """
@@ -99,6 +102,7 @@ class BLOC(N_ENTITE.ENTITE):
         self.checkCondition()
         self.verifCataRegles()
 
+
     def verifPresence(self, dict, globs):
         """
            Cette méthode vérifie si le dictionnaire passé en argument (dict)
@@ -117,8 +121,11 @@ class BLOC(N_ENTITE.ENTITE):
         dico.update(dict)
         if self.condition != None:
             try:
+            #if 1 :
                 test = eval(self.condition, globs, dico)
                 return test
+            #try:
+            #   1
             except NameError:
                 # erreur 'normale' : un mot-clé n'est pas présent et on veut
                 # l'évaluer dans la condition
@@ -143,11 +150,14 @@ class BLOC(N_ENTITE.ENTITE):
                     '\n', "Erreur dans la condition : ", self.condition, ''.join(l))
         else:
             return 0
+
+
+
     
     def longueurDsArbre(self):
       longueur=0
       for mc in self.mcListe : 
-         longueur = longueur + longueurDsArbre(mc)
+         longueur = longueur + mc.longueurDsArbre()
       return longueur
 
 def blocUtils():
@@ -165,4 +175,12 @@ def blocUtils():
         """Valide si aucune des valeurs de 'mcsimp' n'est dans 'valeurs'."""
         return not au_moins_un(mcsimp, valeurs)
 
+    def getEficasAttribut( nomUserASSD, nomAttr):
+        if nomUserASSD == None : return None
+        return ( nomUserASSD.getEficasAttribut(nomAttr))
+
+    def getEficasListOfAttributs( nomASSD, listeAttributs):
+        if nomASSD == None : return ()
+        return ( nomASSD.getEficasListOfAttributs(listeAttributs))
+
     return locals()
index c46cd58dddd7c523dbd5269997b9da5bfe76ec55..998922e69ae341e4584ed6a30e623379171f97c4 100644 (file)
@@ -38,7 +38,7 @@ class CO(ASSD) :
         #
         if self.parent:
             try:
-                self.parent.NommerSdprod(self, nom)
+                self.parent.nommerSDProd(self, nom)
             except AsException as e:
                 appel = N_utils.calleeWhere(niveau=2)
                 raise AsException(
index 3a89a528c055298ab8dd250fab51843edde21d44..b900ade1a5bbe45016abaef4bcce1543901ade36 100644 (file)
@@ -40,9 +40,9 @@ class Conversion(object):
     """Conversion de type.
     """
 
-    def __init__(self, name, typ):
+    def __init__(self, name, typeACreer):
         self.name = name
-        self.typ = typ
+        self.typeACreer = typeACreer
 
     def convert(self, obj):
         """Filtre liste
@@ -68,11 +68,11 @@ class Conversion(object):
 
 class TypeConversion(Conversion):
 
-    """Conversion de type
+    """Conversion de typeACreer
     """
 
-    def __init__(self, typ):
-        Conversion.__init__(self, 'type', typ)
+    def __init__(self, typeACreer):
+        Conversion.__init__(self, 'type', typeACreer)
 
 
 class IntConversion(TypeConversion):
@@ -103,14 +103,27 @@ class FloatConversion(TypeConversion):
         return o
 
 
+class UserASSDConversion(TypeConversion):
+    def __init__(self, classUser):
+        TypeConversion.__init__(self, classUser)
+
+    def function(self, o):
+        #print ('je convertis : ', o, 'en ', self.typeACreer )
+        #import traceback
+        #traceback.print_stack()
+        if o == None : return None
+        nouvelObj=self.typeACreer(o)
+        return nouvelObj
+
 _convertI = IntConversion()
 _convertR = FloatConversion()
 
 
 def ConversionFactory(name, typ):
     if name == 'type':
-        if 'I' in typ:
-            return _convertI
-        elif 'R' in typ:
-            return _convertR
+        if 'I' in typ   : return _convertI
+        elif 'R' in typ : return _convertR
+    if name == 'UserASSD':
+       #print(typ)
+       return (UserASSDConversion(typ))
     return None
index 4735edd3fad71c904a78be20972cf19037d1dfcb..b1ca94f505efa8126d485d06d01ac90eb492e123 100644 (file)
@@ -67,6 +67,9 @@ class ENTITE(object):
             self.validators = self.factories['validator'](validators)
         else:
             self.validators = validators
+        #self.doitSenregistrerComme = None
+        self.txtNomComplet=''
+        self.redefinit=False
 
     def affecter_parente(self):
         """
@@ -76,6 +79,7 @@ class ENTITE(object):
             Il s'agit principalement des mots cles
         """
         for k, v in list(self.entites.items()):
+            #print( k,v)
             v.pere = self
             v.nom = k
 
@@ -262,17 +266,54 @@ class ENTITE(object):
             self.cr.fatal(_(u"L'attribut 'position' doit valoir 'local', 'global' "
                             u"ou 'global_jdc' : %r"), self.position)
 
-    def dumpXSD(self):
-        args = self.entites.copy()
-        mcs = set()
-        for nom, val in list(args.items()):
-            if val.label == 'SIMP':
-                mcs.add(nom)
-                # XXX
-                # if val.max != 1 and val.type == 'TXM':
-                    # print "#CMD", parent, nom
-            elif val.label == 'FACT':
-                liste=val.dumpXSD()
-                mcs.update(liste)
-        print (self.nom, mcs) 
-        return mcs
+    def nomComplet(self):
+        if self.txtNomComplet  != '' : return self.txtNomComplet
+        qui=self
+        while hasattr(qui, 'pere' ):
+              self.txtNomComplet+='_'+qui.nom
+              qui=qui.pere
+        self.txtNomComplet+='_'+qui.nom
+        return self.txtNomComplet
+
+    def addDefinitionMC(self,listeMCAvant,**args):
+        ouChercher=self
+        for mot in listeMCAvant:
+            try :
+              ouChercher=ouChercher.entites[mot]
+            except :
+              print ('impossible de trouver : ',mot,' ',listeMCAvant)
+        (nomMC,defMC)=args.items()[0]
+        defMC.pere = ouChercher
+        defMC.pere.propageRedefinit()
+        defMC.nom = nomMC
+        cata = CONTEXT.getCurrentCata()
+        print (cata)
+        ouChercher.entites[nomMC]=defMC
+
+    def changeDefinitionMC(self,listeMCAvant,**args):
+        ouChercher=self
+        for mot in listeMCAvant:
+            try :
+              ouChercher=ouChercher.entites[mot]
+            except :
+              print ('impossible de trouver : ',mot,' ',listeMCAvant)
+        monSIMP=ouChercher
+        for (nomAttributDef,valeurAttributDef) in args.items():
+             if hasattr(monSIMP, nomAttributDef) :
+               setattr(monSIMP, nomAttributDef, valeurAttributDef) 
+             else :
+               print ('pb avec ', nomAttributdef,valeurAttributMC)
+        monSIMP.propageRedefinit()
+
+    def propageRedefinit(self):
+   # a reflechir
+       self.redefinit=True
+       # PNPN il faut remonter a l etape
+   
+
+
+    def makeObjetPourVerifSignature(self,**args):
+        etape = self.class_instance(oper=self, args=args)
+        etape.MCBuild()
+        return etape
+
index 9a777aa6c597120bbc8262ce4a525a7f6bfa0778..3e2da2dbff69536c048545ece688298fd68a975f 100644 (file)
@@ -97,7 +97,7 @@ class ETAPE(N_MCCOMPO.MCCOMPO):
         enregistrements necessaires
         surcharge dans Ihm
         """
-        print ('makeRegister de  ETAPE')
+        #print ('makeRegister de  ETAPE')
         if self.parent:
             self.jdc = self.parent.getJdcRoot()
             self.id = self.parent.register(self)
@@ -430,7 +430,7 @@ Causes possibles :
             new_sd = self.sd.__class__(etape=new_etape)
             new_etape.sd = new_sd
             if self.reuse == None:
-                new_etape.parent.NommerSdprod(new_sd, self.sd.nom)
+                new_etape.parent.nommerSDProd(new_sd, self.sd.nom)
             else:
                 new_sd.setName(self.sd.nom)
         new_etape.copyIntern(self)
@@ -441,7 +441,7 @@ Causes possibles :
            Reinitialise le nommage du concept de l'etape lors d'un changement de jdc
         """
         if self.sd and self.reuse == None:
-            self.parent.NommerSdprod(self.sd, self.sd.nom)
+            self.parent.nommerSDProd(self.sd, self.sd.nom)
 
     def isInclude(self):
         """Permet savoir si on a affaire a la commande INCLUDE
@@ -463,3 +463,4 @@ Causes possibles :
         # pourrait etre appelee par une commande fortran faisant appel a des fonctions python
         # on passe la main au parent
         return self.parent.getConcept(nomsd)
index 4e45660ce66b7c79b9cbcf935617aa3759bbeade..907533908ab2e73c473dedd2a573c487cd927a4c 100644 (file)
@@ -133,9 +133,12 @@ class FACT(N_ENTITE.ENTITE):
             indice=0
             for v in val:
                 if type(v) == dict or isinstance(v, _F):
-                    objet = self.class_instance(
-                        nom=nom, definition=self, val=v, parent=parent,dicoPyxbDeConstruction=None)
-                        #nom=nom, definition=self, val=v, parent=parent,dicoPyxbDeConstruction=dicoPyxbDeConstruction[indice])
+                    if dicoPyxbDeConstruction :
+                       objet = self.class_instance(
+                          nom=nom, definition=self, val=v, parent=parent,dicoPyxbDeConstruction=dicoPyxbDeConstruction[indice])
+                    else : 
+                       objet = self.class_instance(
+                          nom=nom, definition=self, val=v, parent=parent,dicoPyxbDeConstruction=None)
                     indice=indice+1
                     l.append(objet)
                 elif isinstance(v, self.class_instance):
@@ -145,16 +148,20 @@ class FACT(N_ENTITE.ENTITE):
                 else:
                     l.append(N_OBJECT.ErrorObj(self, v, parent, nom))
         elif type(val) == dict or isinstance(val, _F):
-            objet = self.class_instance(
-                nom=nom, definition=self, val=val, parent=parent,dicoPyxbDeConstruction=dicoPyxbDeConstruction)
-            l.append(objet)
+             if dicoPyxbDeConstruction :
+                objet = self.class_instance(
+                   nom=nom, definition=self, val=val, parent=parent,dicoPyxbDeConstruction=dicoPyxbDeConstruction)
+             else : 
+                objet = self.class_instance(
+                nom=nom, definition=self, val=val, parent=parent,dicoPyxbDeConstruction=None)
+             l.append(objet)
         elif isinstance(val, self.class_instance):
 # idem --> quand passe t on la 
             l.append(val)
         else:
             l.append(N_OBJECT.ErrorObj(self, val, parent, nom))
         l.cata=l.jdc.cata
-        #l.buildObjPyxb(l)
+        l.buildObjPyxb(l)
         return l
 
     def verifCata(self):
@@ -165,3 +172,5 @@ class FACT(N_ENTITE.ENTITE):
         self.checkDocu()
         self.checkValidators()
         self.verifCataRegles()
+
+
index 2bde47a3ba3439be2e00486c9901f69bce345247..816fd4226518b74e1357ab1c851b16b3716fbb96 100644 (file)
@@ -23,7 +23,9 @@
 """
 from __future__ import absolute_import
 from .N_ASSD import ASSD
-import six
+try:basestring
+except NameError: basestring = str
+
 
 
 class GEOM(ASSD):
@@ -58,7 +60,7 @@ class GEOM(ASSD):
         return self.nom
 
     def __convert__(cls, valeur):
-        if isinstance(valeur, (str, six.text_type)) and len(valeur.strip()) <= 8:
+        if isinstance(valeur, basestring) and len(valeur.strip()) <= 8:
             return valeur.strip()
         raise ValueError(
             _(u'On attend une chaine de caractères (de longueur <= 8).'))
index 2b4a9ddaa15b37fbe957ab435e9cc33befd5cc05..22d565c0ca05a5f981207341088675d75b08f895 100644 (file)
@@ -41,7 +41,6 @@ from . import N_CR
 from .N_Exception import AsException, InterruptParsingError
 from .N_ASSD import ASSD
 from .strfunc import getEncoding
-from six.moves import range
 
 
 MemoryErrorMsg = """MemoryError :
@@ -88,17 +87,14 @@ NONE = None
 
     def __init__(self, definition=None, procedure=None, cata=None,
                  cata_ord_dico=None, parent=None,
-                 nom='SansNom', appli=None, context_ini=None, **args):
+                 nom='SansNom', appliEficas=None, context_ini=None, **args):
         self.procedure = procedure
         self.definition = definition
         self.cata = cata
-        # PN pourquoi ?
-        #if type(self.cata) != tuple and cata != None:
-        #    self.cata = (self.cata,)
         self._build_reserved_kw_list()
         self.cata_ordonne_dico = cata_ord_dico
         self.nom = nom
-        self.appli = appli
+        self.appliEficas = appliEficas
         self.parent = parent
         self.context_ini = context_ini
         # On conserve les arguments supplementaires. Il est possible de passer
@@ -128,13 +124,15 @@ NONE = None
         # on met le jdc lui-meme dans le context global pour l'avoir sous
         # l'etiquette "jdc" dans le fichier de commandes
         self.g_context = {'jdc': self}
+        CONTEXT.unsetCurrentJdC()
+        CONTEXT.setCurrentJdC(self)
         # Dictionnaire pour stocker tous les concepts du JDC (acces rapide par
         # le nom)
-        self.sds_dict = {}
+        self.sdsDict = {}
         self.etapes = []
         self.index_etapes = {}
         self.mc_globaux = {}
-        self.current_context = {}
+        self.currentContext = {}
         self.condition_context = {}
         self.index_etape_courante = 0
         self.UserError = "UserError"
@@ -149,9 +147,6 @@ NONE = None
            compte-rendu self.cr
         """
         try:
-            if self.appli != None:
-                self.appli.afficheInfos(
-                    'Compilation du fichier de commandes en cours ...')
             # Python 2.7 compile function does not accept unicode filename, so we encode it
             # with the current locale encoding in order to have a correct
             # traceback
@@ -188,6 +183,7 @@ Causes possibles :
            Cette methode execute le jeu de commandes compile dans le contexte
            self.g_context de l'objet JDC
         """
+      
         CONTEXT.setCurrentStep(self)
         # Le module nommage utilise le module linecache pour acceder
         # au source des commandes du jeu de commandes.
@@ -219,11 +215,12 @@ Causes possibles :
                 # Update du dictionnaire des concepts
                 for sdnom, sd in list(self.context_ini.items()):
                     if isinstance(sd, ASSD):
-                        self.sds_dict[sdnom] = sd
+                        self.sdsDict[sdnom] = sd
+
+            #if self.appliEficas != None:
+            #    self.appliEficas.afficheInfos(
+            #        'Interpretation du fichier de commandes en cours ...')
 
-            if self.appli != None:
-                self.appli.afficheInfos(
-                    'Interpretation du fichier de commandes en cours ...')
             # On sauve le contexte pour garder la memoire des constantes
             # En mode edition (EFICAS) ou lors des verifications le contexte
             # est recalcule
@@ -232,8 +229,6 @@ Causes possibles :
             exec(self.proc_compile, self.g_context)
 
             CONTEXT.unsetCurrentStep()
-            if self.appli != None:
-                self.appli.afficheInfos('')
 
         except InterruptParsingError:
             # interrupt the command file parsing used by FIN to ignore the end
@@ -264,7 +259,7 @@ Causes possibles :
         except NameError as e:
             etype, value, tb = sys.exc_info()
             l = traceback.extract_tb(tb)
-            s = traceback.format_exception_only(NameError,e)
+            s = traceback.format_exception_only(NameError, e)
             msg = "erreur de syntaxe,  %s ligne %d" % (s, l[-1][1])
             if CONTEXT.debug:
                 traceback.print_exc()
@@ -292,6 +287,10 @@ Causes possibles :
                 "erreur non prevue et non traitee prevenir la maintenance " + '\n' + ''.join(l))
             del exc_typ, exc_val, exc_fr
             CONTEXT.unsetCurrentStep()
+        idx=0
+        for e in self.etapes:
+            self.enregistreEtapePyxb(e,idx)
+            idx=idx+1
 
     def afficheFinExec(self):
         """
@@ -368,17 +367,17 @@ Causes possibles :
         if sd != None and (etape.definition.reentrant == 'n' or etape.reuse is None):
             # ATTENTION : On ne nomme la SD que dans le cas de non reutilisation
             # d un concept. Commande non reentrante ou reuse absent.
-            self.NommerSdprod(sd, nomsd)
+            self.nommerSDProd(sd, nomsd)
         return sd
 
-    def NommerSdprod(self, sd, sdnom, restrict='non'):
+    def nommerSDProd(self, sd, sdnom, restrict='non'):
         """
             Nomme la SD apres avoir verifie que le nommage est possible : nom
             non utilise
             Si le nom est deja utilise, leve une exception
             Met le concept cree dans le concept global g_context
         """
-        o = self.sds_dict.get(sdnom, None)
+        o = self.sdsDict.get(sdnom, None)
         if isinstance(o, ASSD):
             raise AsException("Nom de concept deja defini : %s" % sdnom)
         if sdnom in self._reserved_kw:
@@ -386,7 +385,7 @@ Causes possibles :
                 "Nom de concept invalide. '%s' est un mot-cle reserve." % sdnom)
 
         # Ajoute a la creation (appel de regSD).
-        self.sds_dict[sdnom] = sd
+        self.sdsDict[sdnom] = sd
         sd.setName(sdnom)
 
         # En plus si restrict vaut 'non', on insere le concept dans le contexte
@@ -394,6 +393,14 @@ Causes possibles :
         if restrict == 'non':
             self.g_context[sdnom] = sd
 
+    def regUserSD(self,sd):
+    # utilisee pour creer les references
+    # se contente d appeler la methode equivalente sur le jdc
+      id=self.regSD(sd)
+      self.nommerSDProd(sd,sd.nom)
+      return id
+
+
     def regSD(self, sd):
         """
             Methode appelee dans l __init__ d un ASSD lors de sa creation
@@ -435,32 +442,31 @@ Causes possibles :
             Retourne le nom du fichier correspondant a un numero d'unite
             logique (entier) ainsi que le source contenu dans le fichier
         """
-        if self.appli:
-            # Si le JDC est relie a une application maitre, on delègue la
+        #if self.appliEficas:
+            # Si le JDC est relie a une appliEficascation maitre, on delègue la
             # recherche
-            return self.appli.getFile(unite, fic_origine)
-        else:
-            if unite != None:
-                if os.path.exists("fort." + str(unite)):
-                    fname = "fort." + str(unite)
-            if fname == None:
-                raise AsException("Impossible de trouver le fichier correspondant"
-                                  " a l unite %s" % unite)
-            if not os.path.exists(fname):
-                raise AsException("%s n'est pas un fichier existant" % fname)
-            fproc = open(fname, 'r')
-            text = fproc.read()
-            fproc.close()
-            text = text.replace('\r\n', '\n')
-            linecache.cache[fname] = 0, 0, text.split('\n'), fname
-            return fname, text
+        #    return self.appliEficas.getFile(unite, fic_origine)
+        #else:
+        #    if unite != None:
+        #        if os.path.exists("fort." + str(unite)):
+        #            fname = "fort." + str(unite)
+        if fname == None:
+           raise AsException("Impossible de trouver le fichier correspondant")
+        if not os.path.exists(fname):
+                raise AsException(fname + " n'est pas un fichier existant" )
+        fproc = open(fname, 'r')
+        text = fproc.read()
+        fproc.close()
+        text = text.replace('\r\n', '\n')
+        linecache.cache[fname] = 0, 0, text.split('\n'), fname
+        return fname, text
 
     def set_parLot(self, parLot, user_value=False):
         """
         Met le mode de traitement a PAR LOT
         ou a COMMANDE par COMMANDE
         en fonction de la valeur du mot cle PAR_LOT et
-        du contexte : application maitre ou pas
+        du contexte : appliEficascation maitre ou pas
 
         En PAR_LOT='NON', il n'y a pas d'ambiguite.
         d'analyse et juste avant la phase d'execution.
@@ -469,11 +475,11 @@ Causes possibles :
         """
         if user_value:
             self.parLot_user = parLot
-        if self.appli == None:
-            # Pas d application maitre
+        if self.appliEficas == None:
+            # Pas d appliEficascation maitre
             self.parLot = parLot
         else:
-            # Avec application maitre
+            # Avec appliEficascation maitre
             self.parLot = 'OUI'
 
     def accept(self, visitor):
@@ -522,35 +528,35 @@ Causes possibles :
         # courante pendant le processus de construction des etapes.
         # Si on insère des commandes (par ex, dans EFICAS), il faut prealablement
         # remettre ce pointeur a 0
-        # self.current_context.items() if isinstance(v, ASSD)])
-        if self.parLot_user == 'NON':
-            d = self.current_context = self.g_context.copy()
-            if etape is None:
-                return d
+        # self.currentContext.items() if isinstance(v, ASSD)])
+        #if self.parLot_user == 'NON':
+        #    d = self.currentContext = self.g_context.copy()
+        #    if etape is None:
+        #        return d
             # retirer les sd produites par 'etape'
-            sd_names = [sd.nom for sd in etape.getCreated_sd()]
-            for nom in sd_names:
-                try:
-                    del d[nom]
-                except KeyError:
-                    from warnings import warn
-                    warn(
-                        "concept '%s' absent du contexte de %s" % (
-                            nom, self.nom),
-                        RuntimeWarning, stacklevel=2)
-            return d
+        #    sd_names = [sd.nom for sd in etape.getCreated_sd()]
+        #    for nom in sd_names:
+        #        try:
+        #            del d[nom]
+        #        except KeyError:
+        #            from warnings import warn
+        #            warn(
+        #                "concept '%s' absent du contexte de %s" % (
+        #                    nom, self.nom),
+        #                RuntimeWarning, stacklevel=2)
+        #    return d
         if etape:
             index_etape = self.index_etapes[etape]
         else:
             index_etape = len(self.etapes)
         if index_etape >= self.index_etape_courante:
             # On calcule le contexte en partant du contexte existant
-            d = self.current_context
+            d = self.currentContext
             if self.index_etape_courante == 0 and self.context_ini:
                 d.update(self.context_ini)
             liste_etapes = self.etapes[self.index_etape_courante:index_etape]
         else:
-            d = self.current_context = {}
+            d = self.currentContext = {}
             if self.context_ini:
                 d.update(self.context_ini)
             liste_etapes = self.etapes
@@ -603,13 +609,13 @@ Causes possibles :
         co.executed = 1
         return co
 
-    def del_concept(self, nomsd):
+    def delConcept(self, nomsd):
         """
-           Methode pour supprimer la reference d'un concept dans le sds_dict.
+           Methode pour supprimer la reference d'un concept dans le sdsDict.
            Ne detruire pas le concept (different de supprime).
         """
         try:
-            del self.sds_dict[nomsd.strip()]
+            del self.sdsDict[nomsd.strip()]
         except:
             pass
 
@@ -647,7 +653,10 @@ Causes possibles :
         #for cat in self.cata:
         cat=self.cata
         self._reserved_kw.update(
-                [kw for kw in dir(cat) if len(kw) <= 8 and kw == kw.upper()])
+                #PN 14  2020 [kw for kw in dir(cat) if len(kw) <= 8 and kw == kw.upper()])
+                [kw for kw in dir(cat) ])
         self._reserved_kw.difference_update(
             ['OPER', 'MACRO', 'BLOC', 'SIMP', 'FACT', 'FORM',
              'GEOM', 'MCSIMP', 'MCFACT'])
+
+
index 27a76e8f8dd5dfc8e59f1e292804b28f4ca57243..9ff694e4faa7f4ac778312d5495c3498b5cb8365 100644 (file)
@@ -48,8 +48,10 @@ class JDC_CATA(N_ENTITE.ENTITE):
     class_instance = N_JDC.JDC
     label = 'JDC'
 
-    def __init__(self, code='', execmodul=None, regles=(), niveaux=(), **args):
+    def __init__(self, code='', execmodul=None, regles=(), niveaux=(),fichierSource=None, **args):
         """
+        on se laisse la possibilite d initier fichierSource avec autre chose que le nom du fichier
+        au cas ou ... pour pouvoir changer le nom du 'sous code' implementer (cf readercata)
         """
         self.code = code
         self.execmodul = execmodul
@@ -63,6 +65,7 @@ class JDC_CATA(N_ENTITE.ENTITE):
         self.d_niveaux = {}
         self.l_niveaux = niveaux
         self.commandes = []
+        self.fichierSource = fichierSource
         for niveau in niveaux:
             self.d_niveaux[niveau.nom] = niveau
         # On change d'objet catalogue. Il faut d'abord mettre le catalogue
@@ -71,6 +74,10 @@ class JDC_CATA(N_ENTITE.ENTITE):
         CONTEXT.setCurrentCata(self)
         self.fenetreIhm=None
         self.dictTypesXSD={}
+        self.listeDesTypesXSDRedefini=[]
+        self.dictTypesASSDorUserASSDCrees={}
+        self.dictTypesASSDorUserASSDUtilises={}
+
  
     def __call__(self, procedure=None, cata=None, cata_ord_dico=None,
                  nom='SansNom', parent=None, **args):
index a80f98e489cd3d144b48db3b912e11503dd72f8c..e7069e03e3c805983e03a3606b439adcf4d08dce 100644 (file)
@@ -87,7 +87,7 @@ class MACRO(N_ENTITE.ENTITE):
     nommage = nommage
 
     def __init__(
-        self, nom, op, sd_prod=None, reentrant='n', repetable='o', fr="",ang="",fenetreIhm=None,
+        self, nom, op=None, sd_prod=None, reentrant='n', repetable='o', fr="",ang="",fenetreIhm=None,
             docu="", regles=(), op_init=None, niveau = None, fichier_ini=0, UIinfo=None, **args):
         """
            Méthode d'initialisation de l'objet MACRO. Les arguments sont utilisés pour initialiser
index 793fe07e1261e2308b6ae6f0895856879fd61168..4fda6801d50357cef56abf4e53e0b8ae9cff3133 100644 (file)
@@ -28,7 +28,6 @@ from __future__ import absolute_import
 from __future__ import print_function
 try :
    from builtins import str
-   from builtins import range
 except : pass
 import types
 import sys
@@ -43,7 +42,6 @@ from . import N_utils
 from .N_utils import AsType
 from .N_CO import CO
 from .N_ASSD import ASSD
-from six.moves import range
 
 
 class MACRO_ETAPE(N_ETAPE.ETAPE):
@@ -69,7 +67,7 @@ class MACRO_ETAPE(N_ETAPE.ETAPE):
         N_ETAPE.ETAPE.__init__(self, oper, reuse, args, niveau=5)
         self.g_context = {}
         # Contexte courant
-        self.current_context = {}
+        self.currentContext = {}
         self.macro_const_context = {}
         self.index_etape_courante = 0
         self.etapes = []
@@ -249,8 +247,8 @@ Causes possibles :
         """
         # L'etape courante pour laquelle le contexte a ete calcule est
         # memorisee dans self.index_etape_courante
-        # self.current_context.items() if isinstance(v, ASSD)])
-        d = self.current_context = self.g_context.copy()
+        # self.currentContext.items() if isinstance(v, ASSD)])
+        d = self.currentContext = self.g_context.copy()
         if etape is None:
             return d
         # retirer les sd produites par 'etape'
@@ -503,10 +501,10 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" % (t,
             # On est dans le cas de la creation d'un nouveau concept
             sd = etape.getSdProd()
             if sd != None:
-                self.NommerSdprod(sd, nomsd)
+                self.nommerSDProd(sd, nomsd)
         return sd
 
-    def NommerSdprod(self, sd, sdnom, restrict='non'):
+    def nommerSDProd(self, sd, sdnom, restrict='non'):
         """
           Cette methode est appelee par les etapes internes de la macro.
           La macro appelle le JDC pour valider le nommage.
@@ -552,14 +550,14 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" % (t,
         if restrict == 'non':
             # On demande le nommage au parent mais sans ajout du concept dans le contexte du parent
             # car on va l'ajouter dans le contexte de la macro
-            self.parent.NommerSdprod(sd, sdnom, restrict='oui')
+            self.parent.nommerSDProd(sd, sdnom, restrict='oui')
             # On ajoute dans le contexte de la macro les concepts nommes
             # Ceci est indispensable pour les CO (macro) dans un INCLUDE
             self.g_context[sdnom] = sd
         else:
             # La demande de nommage vient probablement d'une macro qui a mis
             # le concept dans son contexte. On ne traite plus que le nommage (restrict="oui")
-            self.parent.NommerSdprod(sd, sdnom, restrict='oui')
+            self.parent.nommerSDProd(sd, sdnom, restrict='oui')
 
     def deleteConceptAfterEtape(self, etape, sd):
         """
@@ -666,7 +664,7 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" % (t,
            l'etape courante.
         """
         ctx = {}
-        # update car par ricochet on modifierait jdc.current_context
+        # update car par ricochet on modifierait jdc.currentContext
         ctx.update(self.parent.getContexteCourant(self))
         # on peut mettre None car toujours en PAR_LOT='NON', donc la dernière
         ctx.update(self.getContexteAvant(None))
@@ -719,7 +717,7 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" % (t,
                 if etp.reuse:
                     new_sd.setName(etp.sd.nom)
                 else:
-                    self.NommerSdprod(new_sd, etp.sd.nom)
+                    self.nommerSDProd(new_sd, etp.sd.nom)
             new_etp.copyIntern(etp)
             self.etapes.append(new_etp)
             self.index_etapes[new_etp] = len(self.etapes) - 1
@@ -729,9 +727,9 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" % (t,
            Reinitialise l'etape avec un nouveau jdc parent new_jdc
         """
         if self.sd and self.reuse == None:
-            self.parent.NommerSdprod(self.sd, self.sd.nom)
+            self.parent.nommerSDProd(self.sd, self.sd.nom)
         for concept in self.sdprods:
-            self.parent.NommerSdprod(concept, concept.nom)
+            self.parent.nommerSDProd(concept, concept.nom)
 
     def reparent(self, parent):
         """
index 6f0af8f5b049edc2289e77a1f822d7f76fb04beb..15f27b9ab7c40cbfa5d6526601c86d1e7daa97a6 100644 (file)
@@ -45,7 +45,6 @@ class MCCOMPO(N_OBJECT.OBJECT):
         #import traceback
         #traceback.print_stack()
         #print(("MCCOMPO.buildMc _____________________________________", self.nom))
-        #print (self.dicoPyxbDeConstruction)
         if CONTEXT.debug:
             print(("MCCOMPO.buildMc ", self.nom))
         # Dans la phase de reconstruction args peut contenir des mots-clés
@@ -54,6 +53,7 @@ class MCCOMPO(N_OBJECT.OBJECT):
         # mais qui sont malgré tout des descendants de l'objet courant
         # (petits-fils, ...)
         args = self.valeur
+        #print ('MCCOMPO___________________', self.valeur)
         if args == None: args = {}
         mcListe = []
         
@@ -68,8 +68,6 @@ class MCCOMPO(N_OBJECT.OBJECT):
         # 2- les entités non présentes dans les arguments, présentes dans la définition avec un défaut
         # Phase 1.1 : on traite d'abord les SIMP pour enregistrer les mots cles
         # globaux
-        # PN ligne suivante uniquement pour commodite
-        # a detruire quand cela fonctionne recursivement
         if not hasattr(self, 'dicoPyxbDeConstruction') : self.dicoPyxbDeConstruction = {}
         for k, v in list(self.definition.entites.items()):
             if v.label != 'SIMP':
@@ -85,6 +83,7 @@ class MCCOMPO(N_OBJECT.OBJECT):
                    del self.dicoPyxbDeConstruction[k]
                 else :
                    objPyxbDeConstruction=None
+                #print (args.get(k, None))
                 objet = v(val=args.get(k, None), nom=k, parent=self,objPyxbDeConstruction=objPyxbDeConstruction)
                 mcListe.append(objet)
                 # Si l'objet a une position globale on l'ajoute aux listes
@@ -124,11 +123,7 @@ class MCCOMPO(N_OBJECT.OBJECT):
         # args ne contient plus que des mots-clés qui n'ont pas été attribués car ils sont
         #      à attribuer à des blocs du niveau inférieur ou bien sont des mots-clés erronés
         for k, v in list(self.definition.entites.items()):
-            if v.label != 'BLOC':
-                continue
-            # condition and a or b  : Equivalent de l'expression :  condition ?
-            # a : b du langage C
-
+            if v.label != 'BLOC': continue
             #PNPN on recalcule dico_valeurs dans le for
             # pour les globaux imbriques (exple Telemac Advection)
             # avant le calcul etait avant le for
@@ -155,12 +150,30 @@ class MCCOMPO(N_OBJECT.OBJECT):
         # on retourne la liste ainsi construite
         if self.jdc  : self.cata=self.jdc.cata
         else : self.cata = None
-        #self.buildObjPyxb(mcListe)
+        self.buildObjPyxb(mcListe)
         #else : print ('pas de construction pour ', self.nom, self.objPyxbDeConstruction)
         #print ('buildObjPyxb : ' , self.nom)
         #print(("MCCOMPO.buildMc fin_____________________________________", self.nom))
         return mcListe
 
+    def buildMcApresGlobal(self):
+        print ('Noyau ---------------- buildMcApresGlobal pour', self.nom)
+        nouveau_args = self.reste_val
+        blocsDejaLa=[]
+        for mc in self.mcListe :
+            if mc.nature == 'MCBLOC' : blocsDejaLa.append(mc.nom) 
+        for k, v in list(self.definition.entites.items()):
+            if v.label != 'BLOC': continue
+            if k in blocsDejaLa : continue
+            dico_valeurs = self.creeDictCondition(self.mcListe, condition=1)
+            globs = self.jdc and self.jdc.condition_context or {}
+            if v.verifPresence(dico_valeurs, globs):
+                bloc = v(nom=k, val=nouveau_args, parent=self,dicoPyxbDeConstruction=self.dicoPyxbDeConstruction)
+                if bloc :
+                   self.mcListe.append(bloc)
+                   self.reste_val = bloc.reste_val
+       
+
     def ordonneListe(self, mcListe):
         """
            Ordonne la liste suivant l'ordre du catalogue.
@@ -482,6 +495,7 @@ class MCCOMPO(N_OBJECT.OBJECT):
         return l
 
 
+
 def intersection_vide(dict1, dict2):
     """Verification qu'il n'y a pas de clé commune entre 'dict1' et 'dict2'."""
     sk1 = set(dict1)
index 52be431306d321b9e7ce88d3dc5b54abe2f01cf4..3974cdb622fae50782366b1f5418b8d22633de32 100644 (file)
@@ -42,10 +42,9 @@ class MCFACT(N_MCCOMPO.MCCOMPO):
             - nom
             - parent
         """
-        #print ('MCFACT', self, val, definition, nom, parent, objPyxbDeConstruction)
-        import traceback
+        print ('MCFACT', self, val, definition, nom, parent, dicoPyxbDeConstruction)
+        #import traceback
         #traceback.print_stack()
-        #if nom == 'experience' : print ('MCFACT', self, parent, dicoPyxbDeConstruction); exit()
         self.dicoPyxbDeConstruction=dicoPyxbDeConstruction
         if self.dicoPyxbDeConstruction :
            self.objPyxbDeConstruction=self.dicoPyxbDeConstruction['objEnPyxb']
@@ -56,7 +55,7 @@ class MCFACT(N_MCCOMPO.MCCOMPO):
         self.nom = nom
         self.val = val
         self.parent = parent
-        self.valeur = self.GETVAL(self.val)
+        self.valeur = self.getValeurEffective(self.val)
         if parent:
             self.jdc = self.parent.jdc
             self.niveau = self.parent.niveau
@@ -68,7 +67,7 @@ class MCFACT(N_MCCOMPO.MCCOMPO):
             self.etape = None
         self.mcListe = self.buildMc()
 
-    def GETVAL(self, val):
+    def getValeurEffective(self, val):
         """
             Retourne la valeur effective du mot-clé en fonction
             de la valeur donnée. Defaut si val == None
index a06134df52366463e144fbfbad650ba7da841fd7..92d007eb1eeba11c96abaa1f767f6e49d25c9262 100644 (file)
@@ -45,11 +45,8 @@ class MCSIMP(N_OBJECT.OBJECT):
            Attributs :
 
             - val : valeur du mot clé simple
-
             - definition
-
             - nom
-
             - parent
 
           Autres attributs :
@@ -57,43 +54,106 @@ class MCSIMP(N_OBJECT.OBJECT):
             - valeur : valeur du mot-clé simple en tenant compte de la valeur par défaut
 
         """
-        #print ("MCSIMP, ------------------------")
         #print (self, val, definition, nom, parent)
-        #print ("MCSIMP, ------------------------")
         self.definition = definition
         self.nom = nom
         self.val = val
         self.parent = parent
-        self.convProto = ConversionFactory('type', typ=self.definition.type)
-        self.valeur = self.GETVAL(self.val)
-        self.objPyxbDeConstruction=objPyxbDeConstruction
+        self.objPyxbDeConstruction = objPyxbDeConstruction
         if parent:
-            self.jdc  = self.parent.jdc
+            self.jdc = self.parent.jdc
             if self.jdc : self.cata = self.jdc.cata
-            else : self.cata = None
+            else        : self.cata = None
             self.niveau = self.parent.niveau
-            self.etape = self.parent.etape
-            #self.buildObjPyxb()
+            self.etape  = self.parent.etape
         else:
             # Le mot cle simple a été créé sans parent
             # est-ce possible ?
             print ('je suis dans le else sans parent du build')
-            self.jdc = None
-            self.cata = None
+            print (poum)
+            self.jdc    = None
+            self.cata   = None
             self.niveau = None
-            self.etape = None
+            self.etape  = None
+        if self.definition.creeDesObjets : 
+           self.convProto = ConversionFactory('UserASSD', self.definition.creeDesObjetsDeType)
+        else : 
+           self.convProto = ConversionFactory('type', typ=self.definition.type)
+        self.valeur = self.getValeurEffective(self.val)
+        if self.definition.utiliseUneReference :
+          if self.valeur != None: 
+             if not type(self.valeur) in (list, tuple): self.valeur.ajoutUtilisePar(self)
+             else : 
+               #PNPN --> chgt pour Vimmp
+               for v in self.valeur : 
+                   try : v.ajoutUtilisePar(self)
+                   except : print ('il y a un souci ici', self.nom, self.valeur)
+        self.buildObjPyxb()
+        self.listeNomsObjsCrees = []
 
-    def GETVAL(self, val):
+    def getValeurEffective(self, val):
         """
             Retourne la valeur effective du mot-clé en fonction
             de la valeur donnée. Defaut si val == None
         """
-        if (val is None and hasattr(self.definition, 'defaut')):
-            val = self.definition.defaut
+        if (val is None and hasattr(self.definition, 'defaut')): val = self.definition.defaut
+        if self.jdc != None and val in list(self.jdc.sdsDict.keys()): return self.jdc.sdsDict[val]
+         # dans le cas de lecture de .comm, il est possible que l objet est deja ete cree
+         # peut-etre devrait on aussi verifier que val est de type string ?
+        if self.definition.creeDesObjets : 
+           # isinstance(val, self.definition.creeDesObjetsDeType) ne fonctionne pas car il y a un avec cata devant et l autre non
+           if val != None :
+             if  (not(val.__class__.__name__ == self.definition.creeDesObjetsDeType.__name__)) : 
+                 val=self.convProto.convert(val)
+             else :
+                 if val.nom=='sansNom' : 
+                    for leNom,laVariable in self.jdc.g_context.items():
+                      if id(laVariable)== id(val) and (leNom != 'sansNom'):
+                         val.initialiseNom(leNom)
+                 if val.parent== None : val.initialiseParent(self) 
+           return val
         if self.convProto:
-            val = self.convProto.convert(val)
+           val = self.convProto.convert(val)
         return val
 
+    def creeUserASSDetSetValeur(self, val):
+        self.state='changed'
+        nomVal=val
+        if nomVal in self.jdc.sdsDict.keys():
+           if isinstance(self.jdc.sdsDict[nomVal],self.definition.creeDesObjetsDeType): return (0, 'concept deja reference')
+           else : return (0, 'concept d un autre type existe deja')
+        if self.convProto:
+            objVal = self.convProto.convert(nomVal)
+            objVal.initialiseNom(nomVal)
+            if objVal.parent== None : objVal.initialiseParent(self) 
+            p=self.parent
+            while p in self.parent :
+                  print ('mise a jour de ',p)
+                  if hasattr(p, 'listeDesReferencesCrees') : p.listeDesReferencesCrees.append(objVal)
+                  else : p.listeDesReferencesCrees=(objVal,)
+                  p=p.parent
+        return (self.setValeur(objVal), 'reference creee')
+
+    def creeUserASSD(self, val):
+        self.state='changed'
+        nomVal=val
+        if nomVal in self.jdc.sdsDict.keys():
+           if isinstance(self.jdc.sdsDict[nomVal],self.definition.creeDesObjetsDeType): return (0,None, 'concept deja reference')
+           else : return (0, None, 'concept d un autre type existe deja')
+        if self.convProto:
+            objVal = self.convProto.convert(nomVal)
+            objVal.initialiseNom(nomVal)
+        return (1, objVal, 'reference creee')
+
+    def rattacheUserASSD(self, objASSD):
+        if objASSD.parent== None : objASSD.initialiseParent(self) 
+        p=self.parent
+        while p in self.parent :
+           if hasattr(p, 'listeDesReferencesCrees') : p.listeDesReferencesCrees.append(objASSD)
+           else : p.listeDesReferencesCrees=(objASSD,)
+           p=p.parent
+
+      
     def getValeur(self):
         """
             Retourne la "valeur" d'un mot-clé simple.
@@ -185,6 +245,7 @@ class MCSIMP(N_OBJECT.OBJECT):
             dico[self.nom] = l
         return dico
 
+
     def getMcsWithCo(self, co):
         """
             Cette methode retourne l'objet MCSIMP self s'il a le concept co
@@ -201,3 +262,7 @@ class MCSIMP(N_OBJECT.OBJECT):
         """
         return [co for co in forceList(self.valeur)
                 if isinstance(co, CO) and co.isTypCO()]
+
+    def supprime(self):
+        if hasattr(self, 'val') and hasattr(self.val, 'supprime') :self.val.supprime()
+        N_OBJECT.OBJECT.supprime(self)
index 8765539fa91a44d93224a6c988de53efc375b508..45891db49b0978bf526125b5ef20f082d2c6dc35 100644 (file)
@@ -1,4 +1,4 @@
-# coding=utf-8
+## coding=utf-8
 # Copyright (C) 2007-2017   EDF R&D
 #
 # This library is free software; you can redistribute it and/or
@@ -64,6 +64,7 @@ class OBJECT(object):
         self.jdc = None
         self.niveau = None
 
+
     def getVal(self):
         """
             Retourne la valeur de l'objet. Cette méthode fournit
@@ -83,7 +84,7 @@ class OBJECT(object):
         else:
             return self
 
-    def GETVAL(self, val):
+    def getValeurEffective(self, val):
         """
             Retourne la valeur effective du mot-clé en fonction
             de la valeur donnée. Defaut si val == None
@@ -111,6 +112,7 @@ class OBJECT(object):
       return 1
 
 
+
 class ErrorObj(OBJECT):
 
     """Classe pour objets errones : emule le comportement d'un objet tel mcsimp ou mcfact
index 955b0897a2ae9b39d42e3185b0d563619ca879c9..22263f3ce370d68e92117aac09885f8436c8df6c 100644 (file)
@@ -119,6 +119,7 @@ class OPER(N_ENTITE.ENTITE):
         self.UIinfo = UIinfo
         self.affecter_parente()
         self.checkDefinition(self.nom)
+        self.txtNomComplet=""
 
     def __call__(self, reuse=None, **args):
         """
@@ -128,6 +129,7 @@ class OPER(N_ENTITE.ENTITE):
         nomsd = self.nommage.getNomConceptResultat(self.nom)
         etape = self.class_instance(oper=self, reuse=reuse, args=args)
         etape.MCBuild()
+        etape.metAJourNomASSD(nomsd)
         return etape.buildSd(nomsd)
 
     def make_objet(self, mc_list='oui'):
index 9606f3513e498b1b193591e307f401d50d40958b..40b8452de800b27d5f5bef6fbcdbb152ff086dfb 100644 (file)
@@ -25,6 +25,7 @@
 from __future__ import absolute_import
 import types
 
+import Accas
 from Noyau import N_ENTITE
 from Noyau import N_MCSIMP
 
@@ -48,8 +49,8 @@ class SIMP(N_ENTITE.ENTITE):
 
     def __init__(self, typ,ang="", fr="", statut='f', into=None, intoSug = None,siValide = None, defaut=None,
                  min=1, max=1, homo=1, position='local',
-                 val_min=float('-inf'), val_max=float('inf'), docu="", validators=None,
-                 sug=None,fenetreIhm=None):
+                 val_min=float('-inf'), val_max=float('inf'), docu="", validators=None, nomXML=None,
+                 sug=None,fenetreIhm=None, attribut=False,  sortie='n', intoXML=None):
         """
             Un mot-clé simple est caractérisé par les attributs suivants :
             - type : cet attribut est obligatoire et indique le type de valeur attendue
@@ -67,7 +68,11 @@ class SIMP(N_ENTITE.ENTITE):
             - val_max : valeur maximale autorisée
             - docu : clef sur de la documentation utilisateur
             - sug : valeur suggere
-            - fenetreIhm=None 
+            - fenetreIhm : si widget particulier
+            - attribut : si projection XSD sur attribut
+            - creeDesObjetsDeType : type des UserASSD si siValide en cree
+            - nomXML   : se projette en XSD avec un autre nom pour accepter les tirets
+            - sortie : force l ecriture dans le fichier de sortie (utile pour Telemac)
         """
         #print (self)
         #import traceback
@@ -75,31 +80,50 @@ class SIMP(N_ENTITE.ENTITE):
         #print (self)
         N_ENTITE.ENTITE.__init__(self, validators)
         # Initialisation des attributs
+        self.creeDesObjets = False
+        self.utiliseUneReference = False
+        self.creeDesObjetsDeType = None
+        self.utiliseDesObjetsDeType = None
         if type(typ) == tuple:
             self.type = typ
         else:
             self.type = (typ,)
-        self.fr = fr
-        self.statut = statut
-        self.into = into
-        self.intoSug = intoSug
+        for t in (self.type) :
+            try :   
+              if issubclass(t,Accas.UserASSD) : 
+                 creeDesObjetsDeType = t 
+                 self.utiliseUneReference = True
+            except : pass
+            if t == 'createObject' : self.creeDesObjets=True
+        if self.utiliseUneReference : 
+           if self.creeDesObjets : 
+                  self.utiliseUneReference = False
+                  self.creeDesObjetsDeType = creeDesObjetsDeType
+           else : self.utiliseDesObjetsDeType = creeDesObjetsDeType
+        self.fr       = fr
+        self.statut   = statut
+        self.into     = into
+        self.intoSug  = intoSug
         self.siValide = siValide
-        self.defaut = defaut
-        self.min = min
-        self.max = max
-        self.homo = homo
+        self.defaut   = defaut
+        self.min      = min
+        self.max      = max
+        self.homo     = homo
         self.position = position
-        self.val_min = val_min
-        self.val_max = val_max
-        self.docu = docu
-        self.sug = sug
-        self.ang=ang
+        self.val_min  = val_min
+        self.val_max  = val_max
+        self.docu     = docu
+        self.sug      = sug
+        self.ang      = ang
         if self.max     == '**' : self.max     = float('inf')
         if self.val_max == '**' : self.val_max = float('inf')
         if self.min     == '**' : self.min     = float('-inf')
         if self.val_min == '**' : self.val_min = float('-inf')
-        self.fenetreIhm=fenetreIhm
-        #self.creeT_SIMP()
+        self.fenetreIhm = fenetreIhm
+        self.attribut   = attribut
+        self.nomXML     = nomXML
+        self.intoXML    = intoXML
+        self.sortie     = sortie
 
     def verifCata(self):
         """
@@ -113,6 +137,7 @@ class SIMP(N_ENTITE.ENTITE):
         self.checkInto()
         self.checkPosition()
         self.checkValidators()
+   
 
     def __call__(self, val, nom, parent=None, objPyxbDeConstruction = None):
         """
@@ -121,38 +146,4 @@ class SIMP(N_ENTITE.ENTITE):
         """
         return self.class_instance(nom=nom, definition=self, val=val, parent=parent, objPyxbDeConstruction=objPyxbDeConstruction)
 
-#    def creeT_SIMP(self):
-#        from Efi2Xsd.readerEfficas import monSIMP
-#        from Efi2Xsd.mapDesTypes import dictSIMPEficasXML
-#        self.objXML=monSIMP()
-#        for nomEficasArg in dictSIMPEficasXML :
-#           argu=getattr(self,nomEficasArg)
-#           nomXMLarg=dictSIMPEficasXML[nomEficasArg]
-#           if not isinstance(nomXMLarg, (list, tuple)) :
-#              print(nomXMLarg, argu)
-              #if nomEficasArg  in listeParamDeTypeTypeAttendu:
-              #   typeAttendu = self.typ
-#                 
-#              setattr(self.objXML, nomXMLarg, argu)
            
-
-
-# for nomXMLArg in dir(self) :
-#          if nomXMLArg in self.dictATraiter :
-#              nomEficasArg=self.dictATraiter[nomXMLArg]
-#              argu=getattr(self,nomXMLArg)
-#              if argu==None : continue
-#
-#              if type(nomEficasArg) == types.DictionaryType:
-#                 for nomXML in list(nomEficasArg.keys()):
-#                      arguDecoupe=getattr(argu,nomXML)
-#                      nomEficasDecoupe=nomEficasArg[nomXML]
-#                      if arguDecoupe == None : continue
-#                      self.dictArgsEficas[nomEficasDecoupe]=arguDecoupe
-#              else :
-#                self.dictArgsEficas[nomEficasArg] = argu
-#
-# 
-#        
-#       
-#
diff --git a/Noyau/N_UserASSD.py b/Noyau/N_UserASSD.py
new file mode 100644 (file)
index 0000000..6ed1812
--- /dev/null
@@ -0,0 +1,125 @@
+# coding=utf-8
+# Copyright (C) 2007-2017   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
+try :
+  from builtins import object
+except : pass
+import traceback
+import sys
+
+from .N_ASSD import ASSD
+
+class UserASSD(ASSD):
+    """
+       Classe de base pour definir des types de structures de donnees definie par 
+       l utilisateur
+       equivalent d un concept ASSD pour un SIMP ou un FACT
+       Attention : le parent est a None au debut  et non le MC createur que l on ne connait pas
+       Lorsqu on ecrit le jdc, n ecrit nom=UserASSD()
+       le parent est le SIMP qui cree l objet
+       a la lecture si la classe commence par un majuscule on fait le boulot dans MCSIMP, sinon dans
+       l init de parametre car le parsing considere qu on a un parametre
+    """
+
+    def __init__(self,nom='sansNom'):
+       self.nom    = nom
+       self.jdc    = CONTEXT.getCurrentJdC()
+       self.parent = None 
+       self.initialiseValeur()
+       self.utilisePar = set()
+       if self.nom  != 'sansNom' : self.id = self.jdc.regSD(self)
+       else : self.id = None
+       self.ptr_sdj   = None
+
+
+    def initialiseParent(self, parent):
+       #print ('je passe initialiseParent pour : ', self, parent)
+       self.parent= parent
+
+    def initialiseNom(self,nom):
+       #print ('je passe initialiseNom pour : ', self, nom)
+       for (i,j)  in self.jdc.sdsDict.items() :
+          if j == self : 
+             del(self.jdc.sdsDict[i])
+       self.jdc.sdsDict[nom]=self
+       self.nom=nom
+       if self.nom != 'sansNom' and self.id ==None : self.id = self.jdc.regSD(self)
+
+    def initialiseValeur(self,valeur=None):
+       self.valeur=valeur
+
+    def ajoutUtilisePar(self,mc):
+       self.utilisePar.add(mc)
+
+    def enleveUtilisePar(self,mc):
+       try : self.utilisePar.remove(mc)
+       except : pass
+
+    def renomme(self,nouveauNom):
+       self.jdc.delConcept(self.nom)
+       self.jdc.sdsDict[nouveauNom] = self
+       self.setName(nouveauNom)
+       #print ('je suis dans renomme',nouveauNom, self.nom)
+       #print (self.utilisePar)
+       for mc in (self.utilisePar):
+           mc.demandeRedessine()
+       
+
+    def deleteReference(self):
+       print ('dans deleteReference')
+       for MC in self.utilisePar : 
+           # le delete est appele en cascade par toute la hierachie
+           # du mcsimp (au cas ou on detruise le fact ou le proc)
+           # du coup pas beau
+           try :
+              if type(MC.valeur) in (list,tuple): 
+                 MC.valeur=list(MC.valeur)
+                 while MC in MC.valeur: MC.valeur.remove(self)
+                 if MC.valeur == [] : MC.Valeur = None
+              else : MC.valeur=None
+              MC.state='changed'
+              MC.isValid()
+              #MC.demandeRedessine()
+              self.jdc.delConcept(self.nom)
+           except :
+              pass
+
+    def getEficasAttribut(self, attribut):
+       #print ('je suis dans getEficasAttr', attribut)
+       if self.parent == None : return None
+       #print ('apres if')
+       # parent est le SIMP donc c est bien parent.parent
+       try : 
+          valeur = self.parent.parent.getMocle(attribut)
+       except :
+          valeur = None
+       #print (valeur)
+       return valeur
+       
+        
+    def supprime(self):
+        self.deleteReference()
+        ASSD.supprime(self)
+        
index 9f7720cff5b1925f5a3b8d06fa2cdf5ca4f80508..df36f26bb6e512c6fa16330acbf0cebac5f55188 100644 (file)
@@ -28,7 +28,6 @@ from __future__ import absolute_import
 from __future__ import print_function
 try :
    from builtins import str
-   from builtins import range
    from builtins import object
 except : pass
    
@@ -37,9 +36,8 @@ import traceback
 import re
 from .N_ASSD import ASSD
 from .N_types import isInt, isFloat_or_int, isComplex, isNumber, isStr, isSequence
+from Accas import A_TUPLE
 from Extensions.i18n import tr
-import six
-from six.moves import range
 
 
 
@@ -64,6 +62,7 @@ class Protocol(object):
         self.args = {}
 
     def register(self, T, A):
+        print ('register Protocol',T,A)
         self.registry[T] = A
 
     def adapt(self, obj):
@@ -146,9 +145,9 @@ class TypeProtocol(PProtocol):
         self.typ = typ
 
     def default(self, obj, typ):
-
         err = ""
         for type_permis in typ:
+            if type_permis == 'createObject': continue
             if type_permis == 'R':
                 if isFloat_or_int(obj):
                     return obj
@@ -201,6 +200,12 @@ class TypeProtocol(PProtocol):
                         return obj
                 except Exception as err:
                     pass
+            elif  isinstance(type_permis, A_TUPLE.Tuple):
+                try:
+                    if type_permis.__convert__(obj):
+                        return obj
+                except Exception as err:
+                    pass
             elif  isinstance(type_permis, object):
                 try:
                     if type_permis.__convert__(obj):
@@ -210,7 +215,9 @@ class TypeProtocol(PProtocol):
             else:
                 print(("Type non encore gere %s" %type_permis))
         raise ValError(
-            tr("%s (de type %s) n'est pas d'un type autorise: %s %s") % (repr(obj), type(obj), typ, err))
+            tr("%s (de type %s) n'est pas d'un type autorise: %s ") % (repr(obj), type(obj), typ))
+        #import traceback; traceback.print_stack()
+        #print (object, type_permis,)
 
     def isComplexe(self, valeur):
         """ Retourne 1 si valeur est un complexe, 0 sinon """
@@ -1470,15 +1477,14 @@ class FunctionVal(Valid):
         return valeur
 
 # MC ca ne devrait plus servir !
-CoercableFuncs = {int:     int,
-                  int:    int,
-                  float:   float,
-                  complex: complex,
-                  str: six.text_type}
+# PN : commenter le 22.11.19
+#CoercableFuncs = {int:     int,
+#                  int:    int,
+#                  float:   float,
+#                  complex: complex,
+#                  str: six.text_type}
 
 
-#class FunctionValObjet(FunctionVal):
-#OOOOOOOOOOOOOOo
 
 class TypeVal(ListVal):
 
index a0415268258bb0763df100ac90499c6570c2c442..c5be200cfd8b6e569b0f123ca0c70d2a13c1e903 100644 (file)
@@ -37,7 +37,6 @@ import sys
 from .N_Exception import AsException
 from .N_types import isInt, isFloat, isComplex, isStr, isSequence, isASSD
 from .strfunc import getEncoding
-import six
 
 SEP = '_'
 
@@ -57,6 +56,7 @@ def calleeWhere(niveau=4):
         # Python 2.7 compile function does not accept unicode filename, so we encode it
         # with the current locale encoding in order to have a correct traceback.
         # Here, we convert it back to unicode.
+        import six
         filename = six.text_type(frame.f_code.co_filename, getEncoding())
         return frame.fLineNo, filename, frame.f_code.co_firstlineno, frame.f_locals
     except:
index 4e0833e034cde375684a340fca870fe97bf60e22..0101982f8e0e965537ceefab8c5f81f0e33cd091 100644 (file)
@@ -21,6 +21,7 @@
 from __future__ import absolute_import
 _root = None
 _cata = None
+_jdc  = None
 debug = 0
 
 # Le "current step" est l'etape courante.
@@ -78,3 +79,26 @@ def unsetCurrentCata():
     """
     global _cata
     _cata = None
+
+
+def getCurrentJdC():
+    """
+       Fonction qui retourne l'objet JDC courant
+    """
+    return _jdc
+
+def setCurrentJdC(jdc):
+    """
+       Fonction qui permet de changer l'objet JDC courant
+    """
+    global _jdc
+    if _jdc:
+        raise Exception("Impossible d'affecter _jdc. Il devrait valoir None")
+    _jdc = jdc
+
+def unsetCurrentJdC():
+    """
+       Fonction qui permet de remettre a None le JDC courant
+    """
+    global _jdc
+    _jdc = None
index e8a24ee22778177210806e9f672067022b84d4ac..5966f9fd735c6f00976f98fb106974e5d2ef6f1e 100644 (file)
@@ -37,7 +37,6 @@
 from __future__ import absolute_import
 try :
    from builtins import str
-   from builtins import range
 except :
    pass
 import re
@@ -48,8 +47,6 @@ from functools import partial
 # Modules EFICAS
 from . import N_utils
 from .strfunc import getEncoding
-import six
-from six.moves import range
 
 regex1 = '=?\s*%s\s*\('
 # commentaire standard precede d'un nombre quelconque de blancs (pas
@@ -81,6 +78,7 @@ def _getNomConceptResultat(ope, level=2):
     if sys.version_info >= (3,0) :
        filename = co.co_filename
     else : 
+       import six
        filename = six.text_type(co.co_filename, getEncoding())
     name = co.co_name
     # pattern pour identifier le debut de la commande
index 69b9c248cbcbd2c7dd977affd83a2322f733538f..76f9de749bb60b016a8183b2d399e5fcfd7cb268 100644 (file)
    </rect>
   </property>
   <property name="windowTitle">
-   <string>Coix du Code</string>
+   <string>Choix du Code</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <property name="spacing">
     <number>0</number>
    </property>
-   <property name="leftMargin">
-    <number>0</number>
-   </property>
-   <property name="topMargin">
-    <number>0</number>
-   </property>
-   <property name="rightMargin">
-    <number>0</number>
-   </property>
-   <property name="bottomMargin">
+   <property name="margin">
     <number>0</number>
    </property>
    <item>
       <string/>
      </property>
      <layout class="QVBoxLayout" name="vlBouton">
-      <property name="leftMargin">
-       <number>0</number>
-      </property>
-      <property name="topMargin">
-       <number>0</number>
-      </property>
-      <property name="rightMargin">
-       <number>0</number>
-      </property>
-      <property name="bottomMargin">
+      <property name="margin">
        <number>0</number>
       </property>
       <item>
index 3dbe619589eecb73f1a50e40c919afc31f17c967..58580df946fcb6be7611037615431ea327ee2bd6 100644 (file)
@@ -6,14 +6,23 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>400</width>
-    <height>300</height>
+    <width>420</width>
+    <height>363</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Form</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
+   <property name="topMargin">
+    <number>1</number>
+   </property>
+   <property name="bottomMargin">
+    <number>1</number>
+   </property>
    <item>
     <widget class="QFrame" name="frameLabelMC">
      <property name="sizePolicy">
        <rect>
         <x>0</x>
         <y>0</y>
-        <width>382</width>
-        <height>223</height>
+        <width>402</width>
+        <height>306</height>
        </rect>
       </property>
       <property name="sizePolicy">
        </sizepolicy>
       </property>
       <layout class="QVBoxLayout" name="MCOptionnelLayout">
+       <property name="spacing">
+        <number>2</number>
+       </property>
+       <property name="topMargin">
+        <number>2</number>
+       </property>
+       <property name="bottomMargin">
+        <number>2</number>
+       </property>
        <item>
         <spacer name="verticalSpacer">
          <property name="orientation">
index 5bdd3224b76bb81d45b7dbffca96da875b5cb2f6..66881fcae5aa555ada5cb9f104f54ff8e3de0270 100644 (file)
@@ -48,9 +48,7 @@
       </size>
      </property>
      <property name="styleSheet">
-      <string notr="true">/*background-color : rgb(168, 227, 142);rgb(57, 146, 228)*/
-background-color : rgb(66, 165, 238);
-/*border-style : outset;*/
+      <string notr="true">background-color : rgb(66, 165, 238);
 border-radius : 10px;
 border-width : 30 px;
 border-color : beige;
index 6f25807aceb62d450fc820d4d0f3efe9b347c89d..9c013397a413ad9217358788c646c04c8db92c8a 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
  <class>DVisu</class>
- <widget class="QWidget" name="DVisu">
+ <widget class="QDialog" name="DVisu">
   <property name="geometry">
    <rect>
     <x>0</x>
index 439dd60f0c273a62c0fe147d5256bc4e6c0d0786..9094f6a9511ed6734f4848579672a8d7ef9a6714 100644 (file)
@@ -17,7 +17,7 @@
    <string notr="true"> QGroupBox {
      border: 1px solid gray;
      border-radius: 5px;
-     margin-top: 1ex; /* leave space at the top for the title */
+     margin-top: 1ex; 
  }
 
  QGroupBox::title {
index cb31ccb2fe799e6ed8dc29c8e180270134e96354..9d4bfd0365c41d57d53b97bd65473030d8a92b58 100644 (file)
@@ -29,8 +29,7 @@
    <string/>
   </property>
   <property name="styleSheet">
-   <string notr="true">background-color : rgb(224,223,222);
-font : 'times' 9px</string>
+   <string notr="true"/>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout_5">
    <property name="spacing">
@@ -200,14 +199,12 @@ font : 'times' 9px</string>
      border-radius: 10px;
      padding: 0 8px;
      background: darkgray;
-   /*  selection-background-color: darkgray;*/
  }
 QLineEdit:disabled
 {
     background: lightgray;
 }
-/*read-only {
-     background: lightblue;*/</string>
+</string>
             </property>
             <property name="readOnly">
              <bool>false</bool>
index c7f86cb3ed5dac856697173a90e92361a39d2d95..d57b619e80ccc5c6084b30c21b009c05fcd935c7 100644 (file)
           <string>...</string>
          </property>
          <property name="icon">
-          <iconset theme="add"/>
+          <iconset>
+           <normaloff>../Editeur/icons/PlusBleu.png</normaloff>../Editeur/icons/PlusBleu.png</iconset>
          </property>
          <property name="iconSize">
           <size>
index 766ca93bef56f45a8989d82b4dca574756c359e4..c2c2d878e6d17bf9c2dcf1f943751f5529a0fc43 100644 (file)
@@ -17,7 +17,7 @@
    <string notr="true"> QGroupBox {
      border: 1px solid gray;
      border-radius: 5px;
-     margin-top: 1ex; /* leave space at the top for the title */
+     margin-top: 1ex;
  }
 
  QGroupBox::title {
index fdddf0fa9a0e811f649842935d7248a253462827..a77932397e0b63382d40f2e88cabd27804d42020 100644 (file)
@@ -11,7 +11,7 @@
    </rect>
   </property>
   <property name="sizePolicy">
-   <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
+   <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
     <horstretch>0</horstretch>
     <verstretch>0</verstretch>
    </sizepolicy>
             </property>
             <property name="icon">
              <iconset theme="find">
-              <normaloff>.</normaloff>.</iconset>
+              <normaloff/>
+             </iconset>
             </property>
             <property name="iconSize">
              <size>
           <x>0</x>
           <y>0</y>
           <width>300</width>
-          <height>125</height>
+          <height>129</height>
          </rect>
         </property>
         <layout class="QGridLayout" name="gridLayout_2">
-         <property name="leftMargin">
-          <number>0</number>
-         </property>
-         <property name="topMargin">
-          <number>0</number>
-         </property>
-         <property name="rightMargin">
-          <number>0</number>
-         </property>
-         <property name="bottomMargin">
+         <property name="horizontalSpacing">
           <number>0</number>
          </property>
-         <property name="horizontalSpacing">
+         <property name="margin">
           <number>0</number>
          </property>
          <item row="0" column="0">
        <property name="spacing">
         <number>0</number>
        </property>
-       <property name="leftMargin">
-        <number>0</number>
-       </property>
-       <property name="topMargin">
-        <number>0</number>
-       </property>
-       <property name="rightMargin">
-        <number>0</number>
-       </property>
-       <property name="bottomMargin">
+       <property name="margin">
         <number>0</number>
        </property>
        <item>
          <property name="sizeHint" stdset="0">
           <size>
            <width>20</width>
-           <height>40</height>
+           <height>400</height>
           </size>
          </property>
         </spacer>
index ecb561420a2e5e333efed3bc9278ec496643287b..30e2f41c72f92212ab8ecd440fa8c16f3d5bb3b3 100644 (file)
            <string>...</string>
           </property>
           <property name="icon">
-           <iconset>
-            <normaloff>../Editeur/icons/PlusBleu.png</normaloff>../Editeur/icons/PlusBleu.png</iconset>
+           <iconset theme="add"/>
           </property>
           <property name="iconSize">
            <size>
            <string notr="true">border : 0px</string>
           </property>
           <property name="icon">
-           <iconset>
-            <normaloff>../Editeur/icons/MoinsBleu.png</normaloff>../Editeur/icons/MoinsBleu.png</iconset>
+           <iconset theme="remove"/>
           </property>
           <property name="iconSize">
            <size>
            <string>...</string>
           </property>
           <property name="icon">
-           <iconset>
-            <normaloff>../Editeur/icons/verre-loupe-icone-6087-64.png</normaloff>../Editeur/icons/verre-loupe-icone-6087-64.png</iconset>
+           <iconset theme="find"/>
           </property>
           <property name="iconSize">
            <size>
diff --git a/UiQT5/eficas_en.qm b/UiQT5/eficas_en.qm
new file mode 100644 (file)
index 0000000..3bc02db
Binary files /dev/null and b/UiQT5/eficas_en.qm differ
index 28a3e1fe67f5b425bf442f475bc66d6f782415e0..0a2416b51d5382bd67f1028e55ac57d580a6a87e 100644 (file)
@@ -5,12 +5,12 @@
     <message>
         <location filename="convert/convert_ini.py" line="81"/>
         <source>lecture du fichier impossible :</source>
-        <translation type="obsolete">unable to read file :</translation>
+        <translation>unable to read file :</translation>
     </message>
     <message>
         <location filename="convert/convert_python.py" line="105"/>
         <source>Impossible d&apos;ouvrir le fichier %s</source>
-        <translation type="obsolete">unable to open file %s</translation>
+        <translation>unable to open file %s</translation>
     </message>
     <message>
         <location filename="convert/convert_python.py" line="116"/>
                                   On retourne le fichier non converti. Prevenir la maintenance.
 
  %s</source>
-        <translation type="obsolete">Unable to translate the file. it probably contains mistake
+        <translation>Unable to translate the file. it probably contains mistake
 ask eficas team
 %s</translation>
     </message>
     <message>
         <location filename="convert/convert_pyth.py" line="115"/>
         <source>Format de sortie : %s, non supporte</source>
-        <translation type="obsolete">Unsupported format  %s</translation>
+        <translation>Unsupported format  %s</translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue_initial.py" line="44"/>
         <source>Impossible d&apos;ouvrir le fichier : %s</source>
-        <translation type="obsolete">unable to open file: %s</translation>
+        <translation>unable to open file: %s</translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue.py" line="65"/>
         <source>Erreur ! Erreur !</source>
-        <translation type="obsolete">Error!</translation>
+        <translation>Error!</translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue.py" line="92"/>
         <source>Erreur rencontree dans recherche_enfants : %s</source>
-        <translation type="obsolete">Error in recherche_enfants : %s</translation>
+        <translation>Error in recherche_enfants : %s</translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue.py" line="102"/>
         <source>Erreur dans la creation du mot-cle : %s</source>
-        <translation type="obsolete">Error when creating %s</translation>
+        <translation>Error when creating %s</translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue.py" line="191"/>
         <source>Impossible d&apos;ouvrir le fichier : %s </source>
-        <translation type="obsolete">unable to open file : %s</translation>
+        <translation>unable to open file : %s</translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue.py" line="208"/>
         <source>le texte a analyser n&apos;est pas celui d&apos;une commande ou d&apos;un operateur : </source>
-        <translation type="obsolete">text is no eficas text:</translation>
+        <translation>text is no eficas text:</translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue.py" line="216"/>
         <source>Erreur dans la recherche  du nom de la commande : </source>
-        <translation type="obsolete">error when searching command&apos;s name :</translation>
+        <translation>error when searching command&apos;s name :</translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue.py" line="219"/>
         <source>Erreur dans la recherche des  args de la commande :</source>
-        <translation type="obsolete">error when searching argument&apos;s command :</translation>
+        <translation>error when searching argument&apos;s command :</translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue.py" line="238"/>
         <source>Erreur dans la recherche du  nom de la commande : </source>
-        <translation type="obsolete">error when searching command&apos;s name :</translation>
+        <translation>error when searching command&apos;s name :</translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue.py" line="241"/>
         <source>Erreur dans la recherche des args de la commande : </source>
-        <translation type="obsolete">error when searching argument&apos;s command :</translation>
+        <translation>error when searching argument&apos;s command :</translation>
     </message>
     <message>
         <location filename="Editeur/Objecttreeitem.py" line="304"/>
         <source>%d n&apos;est pas un index valide pour append_brother</source>
-        <translation type="obsolete">%d is not a valid  index for append-brother</translation>
+        <translation>%d is not a valid  index for append-brother</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="96"/>
         <source>le fichier de commandes %s n&apos;existe pas</source>
-        <translation type="obsolete">commands file %s does not exist</translation>
+        <translation>commands file %s does not exist</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="104"/>
         <source>un fichier de commandes doit etre defini avant une poursuite %s</source>
-        <translation type="obsolete">You have to define principal commands file before a secondary (poursuite) file %s</translation>
+        <translation>You have to define principal commands file before a secondary (poursuite) file %s</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="106"/>
         <source>le fichier poursuite %s n&apos;existe pas</source>
-        <translation type="obsolete">the secondary (poursuite) file does not exist</translation>
+        <translation>the secondary (poursuite) file does not exist</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="117"/>
         <source>include mal defini %s</source>
-        <translation type="obsolete">include is not correct %s</translation>
+        <translation>include is not correct %s</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="123"/>
         <source>un fichier de commandes doit etre defini avant un include %s</source>
-        <translation type="obsolete">You have to define principal commands file before include %s</translation>
+        <translation>You have to define principal commands file before include %s</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="125"/>
         <source>le fichier include %s n&apos;existe pas</source>
-        <translation type="obsolete">include file does not exist</translation>
+        <translation>include file does not exist</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="154"/>
         <source>jdc %(v_1)s, le fichier
                                       de commandes %(v_2)s n&apos;existe pas</source>
         <comment>v_1</comment>
-        <translation type="obsolete">jdc %(v_1)s : .comm  %(v_2)s does not exist</translation>
+        <translation>jdc %(v_1)s : .comm  %(v_2)s does not exist</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="188"/>
         <source> le fichier jdc %s n&apos;existe pas</source>
-        <translation type="obsolete">file %s does not exist</translation>
+        <translation>file %s does not exist</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="198"/>
         <source> jdc %s manque option jdc dans section jdc</source>
-        <translation type="obsolete">jdc %s does not have jdc option in command line</translation>
+        <translation>jdc %s does not have jdc option in command line</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="218"/>
         <source>%(v_1)s include %(v_2)s : %(v_3)s</source>
         <comment>v_1</comment>
-        <translation type="obsolete">%(v_1)s include %(v_2)s : %(v_3)s</translation>
+        <translation>%(v_1)s include %(v_2)s : %(v_3)s</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="222"/>
         <source>%(v_1)s fichier poursuite: %(v_2)s</source>
         <comment>v_1</comment>
-        <translation type="obsolete">%(v_1)ssecondary (poursuite) file  %(v_2)s </translation>
+        <translation>%(v_1)ssecondary (poursuite) file  %(v_2)s </translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="229"/>
         <source>nom etude : %s</source>
-        <translation type="obsolete">study&apos;s name : %s</translation>
+        <translation>study&apos;s name : %s</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="236"/>
         <source>utilisation : %prog [options]</source>
-        <translation type="obsolete">use : %prog[options]</translation>
+        <translation>use : %prog[options]</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="238"/>
         <source>nom du fichier de commandes</source>
-        <translation type="obsolete">principal .comm file&apos;s name</translation>
+        <translation>principal .comm file&apos;s name</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="242"/>
         <source>nom du fichier poursuite</source>
-        <translation type="obsolete">secondary (poursuite) file&apos;s name</translation>
+        <translation>secondary (poursuite) file&apos;s name</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="246"/>
         <source>numero d&apos;unite suivi du nom du fichier include</source>
-        <translation type="obsolete">unit number and include file&apos;s name</translation>
+        <translation>unit number and include file&apos;s name</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="250"/>
         <source>fichier decrivant une etude</source>
-        <translation type="obsolete">file containing a study</translation>
+        <translation>file containing a study</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="254"/>
         <source>version de catalogue a utiliser</source>
-        <translation type="obsolete"> catalog&apos;s version</translation>
+        <translation> catalog&apos;s version</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="257"/>
         <source>nom du code a utiliser</source>
-        <translation type="obsolete">code&apos;s name</translation>
+        <translation>code&apos;s name</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="260"/>
         <source>niveau de debug</source>
-        <translation type="obsolete">debug level</translation>
+        <translation>debug level</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="263"/>
         <source>schema</source>
-        <translation type="obsolete">schema</translation>
+        <translation>schema</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="298"/>
         <source>Nombre incorrect d&apos;arguments</source>
-        <translation type="obsolete">incorrect number of arguments</translation>
+        <translation>incorrect number of arguments</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="296"/>
         <source>Localisation specifiee pour l&apos;application.</source>
-        <translation type="obsolete">specified localization for the application.</translation>
+        <translation>specified localization for the application.</translation>
     </message>
     <message>
         <location filename="Editeur/utils.py" line="130"/>
         <source>Impossible de transferer les fichiers requis dans : %s</source>
-        <translation type="obsolete">unable to transfer files to : %s</translation>
+        <translation>unable to transfer files to : %s</translation>
     </message>
     <message>
         <location filename="Ihm/I_MCLIST.py" line="97"/>
         <source>Erreur</source>
-        <translation type="obsolete">error</translation>
+        <translation>error</translation>
     </message>
     <message>
         <location filename="Extensions/commande_comm.py" line="199"/>
         <source>Erreurs fatales</source>
-        <translation type="obsolete">fatale error</translation>
+        <translation>fatale error</translation>
     </message>
     <message>
         <location filename="Extensions/commande_comm.py" line="202"/>
         <source>Impossible reconstruire commande
 </source>
-        <translation type="obsolete">unable to construct command</translation>
+        <translation>unable to construct command</translation>
     </message>
     <message>
         <location filename="Extensions/commentaire.py" line="146"/>
         <source>Objet commentaire non valorise</source>
-        <translation type="obsolete">comment object has no value</translation>
+        <translation>comment object has no value</translation>
     </message>
     <message>
         <location filename="Extensions/interpreteur_formule.py" line="110"/>
         <source>Debut Fonction %s</source>
-        <translation type="obsolete">start function %s</translation>
+        <translation>start function %s</translation>
     </message>
     <message>
         <location filename="Extensions/interpreteur_formule.py" line="111"/>
         <source>Fin Fonction %s</source>
-        <translation type="obsolete">end function %s</translation>
+        <translation>end function %s</translation>
     </message>
     <message>
         <location filename="Extensions/jdc_include.py" line="94"/>
         <source>Nom de concept deja defini : %s</source>
-        <translation type="obsolete">Concept&apos;s name %s is already existing</translation>
+        <translation>Concept&apos;s name %s is already existing</translation>
     </message>
     <message>
         <location filename="Extensions/mcnuplet.py" line="104"/>
         <source>Longueur incorrecte</source>
-        <translation type="obsolete">incorrect length</translation>
+        <translation>incorrect length</translation>
     </message>
     <message>
         <location filename="Extensions/nuplet.py" line="65"/>
         <source>L&apos;attribut &apos;min&apos; doit etre un entier : </source>
-        <translation type="obsolete">min must be an integer :</translation>
+        <translation>min must be an integer :</translation>
     </message>
     <message>
         <location filename="Extensions/nuplet.py" line="68"/>
         <source>L&apos;attribut &apos;max&apos; doit etre un entier : </source>
-        <translation type="obsolete">max must be an integer :</translation>
+        <translation>max must be an integer :</translation>
     </message>
     <message>
         <location filename="Extensions/nuplet.py" line="70"/>
         <source>Nombres d&apos;occurrence min et max invalides :</source>
-        <translation type="obsolete">min and max are invalid:</translation>
+        <translation>min and max are invalid:</translation>
     </message>
     <message>
         <location filename="Extensions/nuplet.py" line="72"/>
         <source>L&apos;attribut &apos;fr&apos; doit etre une chaine de caracteres</source>
-        <translation type="obsolete">&apos;fr&apos; must be a string</translation>
+        <translation>&apos;fr&apos; must be a string</translation>
     </message>
     <message>
         <location filename="Extensions/nuplet.py" line="74"/>
         <source>L&apos;attribut &apos;statut&apos; doit valoir &apos;o&apos;,&apos;f&apos;,&apos;c&apos; ou &apos;d&apos;</source>
-        <translation type="obsolete">values for statut arguments are : &apos;o&apos;,&apos;f&apos;,&apos;c&apos; or &apos;d&apos;</translation>
+        <translation>values for statut arguments are : &apos;o&apos;,&apos;f&apos;,&apos;c&apos; or &apos;d&apos;</translation>
     </message>
     <message>
         <location filename="Extensions/nuplet.py" line="76"/>
         <source>L&apos;attribut &apos;docu&apos; doit etre une chaine de caracteres</source>
-        <translation type="obsolete">docu must be a string</translation>
+        <translation>docu must be a string</translation>
     </message>
     <message>
         <location filename="Extensions/nuplet.py" line="105"/>
         <source>Fin </source>
-        <translation type="obsolete">end</translation>
+        <translation>end</translation>
     </message>
     <message>
         <location filename="Extensions/parametre_eval.py" line="149"/>
         <source>Le parametre EVAL %s ne peut valoir None</source>
-        <translation type="obsolete">None is not a valid value for Eval parameter %s </translation>
+        <translation>None is not a valid value for Eval parameter %s </translation>
     </message>
     <message>
         <location filename="Extensions/parametre_eval.py" line="163"/>
         <source>Pas de nom donne au parametre EVAL</source>
-        <translation type="obsolete">No name for parameter EVAL</translation>
+        <translation>No name for parameter EVAL</translation>
     </message>
     <message>
         <location filename="Extensions/parametre_eval.py" line="166"/>
         <source>Un nom de parametre ne peut depasser 8 caracteres</source>
-        <translation type="obsolete">parameter&apos;s name can not exceed 8 characters</translation>
+        <translation>parameter&apos;s name can not exceed 8 characters</translation>
     </message>
     <message>
         <location filename="Ihm/I_FORM_ETAPE.py" line="159"/>
         <source>Un concept de nom %s existe deja !</source>
-        <translation type="obsolete">Concept&apos;s name %s is already existing!</translation>
+        <translation>Concept&apos;s name %s is already existing!</translation>
     </message>
     <message>
         <location filename="generator/Formatage.py" line="129"/>
         <source>ERREUR</source>
-        <translation type="obsolete">ERROR</translation>
+        <translation>ERROR</translation>
     </message>
     <message>
         <location filename="generator/generator_asterv5.py" line="101"/>
         <source>Format pas implemente : %s</source>
-        <translation type="obsolete">format : %s not implemented</translation>
+        <translation>format : %s not implemented</translation>
     </message>
     <message>
         <location filename="generator/generator_asterv5.py" line="145"/>
         <source>Type d&apos;objet non prevu : %s</source>
-        <translation type="obsolete">object type not expected : %s</translation>
+        <translation>object type not expected : %s</translation>
     </message>
     <message>
         <location filename="generator/generator_CARMEL3D.py" line="256"/>
         <source> ce groupe de maillage %s est associe a au moins un materiau  et au moins une source.</source>
-        <translation type="obsolete">mesh group %s is associated with at least one material and at least a source.</translation>
+        <translation>mesh group %s is associated with at least one material and at least a source.</translation>
     </message>
     <message>
         <location filename="generator/generator_CARMEL3D.py" line="267"/>
         <source>ce groupe de maillage %s  n&apos;est associe a aucun materiau ou source.</source>
-        <translation type="obsolete">mesh group %s is associated with no material or no source.</translation>
+        <translation>mesh group %s is associated with no material or no source.</translation>
     </message>
     <message>
         <location filename="generator/generator_Creation.py" line="83"/>
         <source>toutes les donnees ne sont pas connues</source>
-        <translation type="obsolete">all data are not available</translation>
+        <translation>all data are not available</translation>
     </message>
     <message>
         <location filename="generator/generator_file_from_template.py" line="59"/>
         <source>Fichier patron %s n&apos;existe pas.</source>
-        <translation type="obsolete">pattern file %s does not exist.</translation>
+        <translation>pattern file %s does not exist.</translation>
     </message>
     <message>
         <location filename="generator/generator_pyth.py" line="100"/>
         <source>Pas supporte</source>
-        <translation type="obsolete">not implemented</translation>
+        <translation>not implemented</translation>
     </message>
     <message>
         <location filename="generator/generator_ini.py" line="105"/>
         <source>Entite inconnue ou interdite :%s</source>
-        <translation type="obsolete">Unknown or unsupported entity : %s</translation>
+        <translation>Unknown or unsupported entity : %s</translation>
     </message>
     <message>
         <location filename="generator/generator_ini.py" line="123"/>
         <source>Entite inconnue ou interdite :%s. Elle est ignoree</source>
-        <translation type="obsolete">Unknown or unsupported entity : %s. ignored</translation>
+        <translation>Unknown or unsupported entity : %s. ignored</translation>
     </message>
     <message>
         <location filename="generator/generator_ini.py" line="133"/>
         <source>Les tuples ne sont pas supportes pour le format ini :%s </source>
-        <translation type="obsolete">Tuple are not allowed for format ini : %s</translation>
+        <translation>Tuple are not allowed for format ini : %s</translation>
     </message>
     <message>
         <location filename="generator/generator_ini.py" line="139"/>
         <source>Type de valeur non supportee par le format ini :%(nom)s
 %(exception)s</source>
         <comment>nom</comment>
-        <translation type="obsolete">Unsupported type of value for .ini format %(nom)s
+        <translation>Unsupported type of value for .ini format %(nom)s
 %(exception)s</translation>
     </message>
     <message>
         <location filename="generator/generator_openturns.py" line="124"/>
         <source>Il y a un pb a la Creation du XML</source>
-        <translation type="obsolete">problem when creating XML</translation>
+        <translation>problem when creating XML</translation>
     </message>
     <message>
         <location filename="generator/generator_openturns_study.py" line="127"/>
         <source>Il y a un pb a la Creation du STD</source>
-        <translation type="obsolete">problem when creating STD</translation>
+        <translation>problem when creating STD</translation>
     </message>
     <message>
         <location filename="generator/generator_pyth.py" line="130"/>
         <source>Entite inconnue ou interdite : %s. Elle est ignoree</source>
-        <translation type="obsolete">unkown ou unsupported entity : %s. ignored</translation>
+        <translation>unkown ou unsupported entity : %s. ignored</translation>
     </message>
     <message>
         <location filename="generator/OpenturnsXML.py" line="228"/>
         <source>Tag %s non-defini. Ceci est un bogue interne. en informer les developpeurs.</source>
-        <translation type="obsolete">Tag %s not defined. Ask developpeurs team.</translation>
+        <translation>Tag %s not defined. Ask developpeurs team.</translation>
     </message>
     <message>
         <location filename="generator/OpenturnsXML.py" line="240"/>
         <source> Le mot-cle %s est obligatoire.</source>
-        <translation type="obsolete">mandatory keyword : %s.</translation>
+        <translation>mandatory keyword : %s.</translation>
     </message>
     <message>
         <location filename="Ihm/I_ASSD.py" line="29"/>
         <source>concept %(inst_name)s de type %(class_name)s</source>
         <comment>inst_name</comment>
-        <translation type="obsolete">concept %(inst_name)s of type  %(class_name)s</translation>
+        <translation>concept %(inst_name)s of type  %(class_name)s</translation>
     </message>
     <message>
         <location filename="Ihm/I_ETAPE.py" line="108"/>
         <source>Un nom de concept doit etre un identificateur Python</source>
-        <translation type="obsolete">concept&apos;s name must be a python identifier</translation>
+        <translation>concept&apos;s name must be a python identifier</translation>
     </message>
     <message>
         <location filename="Ihm/I_ETAPE.py" line="126"/>
         <source>Concept existant</source>
-        <translation type="obsolete">allready existing concept</translation>
+        <translation>allready existing concept</translation>
     </message>
     <message>
         <location filename="Ihm/I_ETAPE.py" line="128"/>
         <source>Operateur reentrant mais concept non existant</source>
-        <translation type="obsolete">operator &apos;reentrant&apos; but concept does not exist</translation>
+        <translation>operator &apos;reentrant&apos; but concept does not exist</translation>
     </message>
     <message>
         <location filename="Ihm/I_ETAPE.py" line="140"/>
         <source>Operateur reentrant et concept existant trouve</source>
-        <translation type="obsolete">Operator &apos;re-entrant&apos; and concept exists</translation>
+        <translation>Operator &apos;re-entrant&apos; and concept exists</translation>
     </message>
     <message>
         <location filename="Ihm/I_ETAPE.py" line="142"/>
         <source>Concept deja existant et de mauvais type</source>
-        <translation type="obsolete">already existing concept of not supported type</translation>
+        <translation>already existing concept of not supported type</translation>
     </message>
     <message>
         <location filename="Ihm/I_ETAPE.py" line="198"/>
         <source>Nommage du concept refuse : un concept de meme nom existe deja</source>
-        <translation type="obsolete">Name is refused : already existing concept</translation>
+        <translation>Name is refused : already existing concept</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compooper.py" line="52"/>
         <source>Nommage du concept effectue</source>
-        <translation type="obsolete">Concept named</translation>
+        <translation>Concept named</translation>
     </message>
     <message>
         <location filename="Ihm/I_ETAPE.py" line="176"/>
         <source>Nommage impossible %s</source>
-        <translation type="obsolete">unable to name %s</translation>
+        <translation>unable to name %s</translation>
     </message>
     <message>
         <location filename="Ihm/I_FORM_ETAPE.py" line="105"/>
         <source>La liste des arguments d&apos;une formule doit etre entre parentheses : parenthese ouvrante manquante</source>
-        <translation type="obsolete">formula expects a list of arguments : no left parenthesis</translation>
+        <translation>formula expects a list of arguments : no left parenthesis</translation>
     </message>
     <message>
         <location filename="Ihm/I_FORM_ETAPE.py" line="107"/>
         <source>La liste des arguments d&apos;une formule doit etre entre parentheses : parenthese fermante manquante</source>
-        <translation type="obsolete">formula expects a list of arguments : no right parenthes</translation>
+        <translation>formula expects a list of arguments : no right parenthes</translation>
     </message>
     <message>
         <location filename="Ihm/I_FORM_ETAPE.py" line="152"/>
         <source>Pas de nom donne a la FORMULE</source>
-        <translation type="obsolete">no name given</translation>
+        <translation>no name given</translation>
     </message>
     <message>
         <location filename="Ihm/I_FORM_ETAPE.py" line="154"/>
         <source>Un nom de FORMULE ne peut depasser 8 caracteres</source>
-        <translation type="obsolete">name too  long (8 characters max)</translation>
+        <translation>name too  long (8 characters max)</translation>
     </message>
     <message>
         <location filename="Ihm/I_FORM_ETAPE.py" line="156"/>
         <source>Un nom de FORMULE ne peut pas commencer par un chiffre</source>
-        <translation type="obsolete">name does not begin with a figure</translation>
+        <translation>name does not begin with a figure</translation>
     </message>
     <message>
         <location filename="Ihm/I_FORM_ETAPE.py" line="173"/>
         <source>Le type de la valeur retournee n&apos;est pas specifie</source>
-        <translation type="obsolete">no type is specified for the return value</translation>
+        <translation>no type is specified for the return value</translation>
     </message>
     <message>
         <location filename="Ihm/I_FORM_ETAPE.py" line="175"/>
         <source>Une formule ne peut retourner une valeur de type : %s</source>
-        <translation type="obsolete">impossible to return a value of type : %s</translation>
+        <translation>impossible to return a value of type : %s</translation>
     </message>
     <message>
         <location filename="Ihm/I_JDC.py" line="308"/>
         <source>Impossible d&apos;ajouter la commande</source>
-        <translation type="obsolete">unable to add the keyword (commande)</translation>
+        <translation>unable to add the keyword (commande)</translation>
     </message>
     <message>
         <location filename="Ihm/I_JDC.py" line="314"/>
         <source>Impossible d ajouter la commande</source>
-        <translation type="obsolete">unable to add the keyword (commande)</translation>
+        <translation>unable to add the keyword (commande)</translation>
     </message>
     <message>
         <location filename="Ihm/I_JDC.py" line="629"/>
         <source>Pas implemente</source>
-        <translation type="obsolete">not implemented</translation>
+        <translation>not implemented</translation>
     </message>
     <message>
         <location filename="Ihm/I_JDC.py" line="724"/>
         <source>Nom de concept deja defini </source>
-        <translation type="obsolete">already defined concept</translation>
+        <translation>already defined concept</translation>
     </message>
     <message>
         <location filename="Ihm/I_JDC.py" line="899"/>
         <source> Nom de concept deja  defini : </source>
-        <translation type="obsolete">already defined concept :</translation>
+        <translation>already defined concept :</translation>
     </message>
     <message>
         <location filename="Ihm/I_JDC.py" line="942"/>
         <source>Impossible de trouver le fichier correspondant a l&apos;unite </source>
-        <translation type="obsolete">unable to find file corresponding to unit</translation>
+        <translation>unable to find file corresponding to unit</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="725"/>
         <source> n&apos;est pas un fichier existant</source>
-        <translation type="obsolete">is not an existing file</translation>
+        <translation>is not an existing file</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="1107"/>
         <source>Fichier invalide %s</source>
-        <translation type="obsolete">invalid file %s</translation>
+        <translation>invalid file %s</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="559"/>
         <source>Impossible de construire le jeu de commandes correspondant au fichier</source>
-        <translation type="obsolete">unable to create the jdc corresponding to the file</translation>
+        <translation>unable to create the jdc corresponding to the file</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="1057"/>
         <source>Erreur lors de l&apos;evaluation du fichier inclus</source>
-        <translation type="obsolete">Error when reading the &apos;include&apos; file</translation>
+        <translation>Error when reading the &apos;include&apos; file</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="1195"/>
         <source>Ce fichier ne sera pas pris en compte
  %s</source>
-        <translation type="obsolete">the file is ignored
+        <translation>the file is ignored
 %s</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="735"/>
         <source>Ce fichier ne sera pas pris en compte
 Le fichier associe n&apos;est pas defini</source>
-        <translation type="obsolete">the file is ignored : associated file is not defined</translation>
+        <translation>the file is ignored : associated file is not defined</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="907"/>
         <source>Le fichier n est pas defini</source>
-        <translation type="obsolete">file is not defined</translation>
+        <translation>file is not defined</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="944"/>
         <source>le fichier doit contenir une unique variable de sortie</source>
-        <translation type="obsolete">file must declare a single output variable</translation>
+        <translation>file must declare a single output variable</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="990"/>
         <source>Fichier invalide</source>
-        <translation type="obsolete">invalid file</translation>
+        <translation>invalid file</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="993"/>
         <source>Le contenu de ce fichier ne sera pas pris en compte
  %s</source>
-        <translation type="obsolete">the file will be ignored :
+        <translation>the file will be ignored :
 %s</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="1047"/>
         <source>Le fichier INCLUDE n est pas defini</source>
-        <translation type="obsolete">include file is not defined</translation>
+        <translation>include file is not defined</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="1057"/>
         <source>Le contenu de ce fichier ne sera pas pris en compte
 </source>
-        <translation type="obsolete">file will be ignored
+        <translation>file will be ignored
 </translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="1195"/>
         <source>Erreur lors de l&apos;evaluation du fichier poursuite</source>
-        <translation type="obsolete">Error when creating secondary (poursuite) file</translation>
+        <translation>Error when creating secondary (poursuite) file</translation>
     </message>
     <message>
         <location filename="Ihm/I_MCCOMPO.py" line="224"/>
         <source>L&apos;objet %(v_1)s ne peut  etre un fils de %(v_2)s</source>
         <comment>v_1</comment>
-        <translation type="obsolete">Object %(v_1)s can not be a child for %(v_2)s</translation>
+        <translation>Object %(v_1)s can not be a child for %(v_2)s</translation>
     </message>
     <message>
         <location filename="Ihm/I_MCCOMPO.py" line="253"/>
         <source>L&apos;objet %s ne peut pas etre repete</source>
-        <translation type="obsolete">Object %s can not be repeated</translation>
+        <translation>Object %s can not be repeated</translation>
     </message>
     <message>
         <location filename="Ihm/I_MCFACT.py" line="50"/>
         <source>Erreur - mclist inexistante : %s</source>
-        <translation type="obsolete">Error - mclist does not exist : %s</translation>
+        <translation>Error - mclist does not exist : %s</translation>
     </message>
     <message>
         <location filename="Ihm/I_MCFACT.py" line="59"/>
         <source>Erreur - mot cle facteur de nom : %s</source>
-        <translation type="obsolete">Error - keyword &quot;mot-clef facteur&quot; nammed : %s</translation>
+        <translation>Error - keyword &quot;mot-clef facteur&quot; nammed : %s</translation>
     </message>
     <message>
         <location filename="Ihm/I_MCLIST.py" line="94"/>
         <source>traitement non-prevu</source>
-        <translation type="obsolete">unexpected task</translation>
+        <translation>unexpected task</translation>
     </message>
     <message>
         <location filename="Ihm/I_MCLIST.py" line="97"/>
         <source>L&apos;objet %s ne peut pas etre ajoute</source>
-        <translation type="obsolete">Object %s cannot be add</translation>
+        <translation>Object %s cannot be add</translation>
     </message>
     <message>
         <location filename="Ihm/I_MCSIMP.py" line="258"/>
         <source>None n&apos;est pas une valeur autorisee</source>
-        <translation type="obsolete">None is not a valid value</translation>
+        <translation>None is not a valid value</translation>
     </message>
     <message>
         <location filename="Ihm/I_MCSIMP.py" line="490"/>
         <source>un concept de meme nom existe deja</source>
-        <translation type="obsolete">concept already exists</translation>
+        <translation>concept already exists</translation>
     </message>
     <message>
         <location filename="Ihm/I_MCSIMP.py" line="512"/>
         <source>Concept cree</source>
-        <translation type="obsolete">concept created</translation>
+        <translation>concept created</translation>
     </message>
     <message>
         <location filename="Ihm/I_MCSIMP.py" line="643"/>
         <source>La matrice n&apos;est pas une matrice %(n_lign)d sur %(n_col)d</source>
         <comment>n_lign</comment>
-        <translation type="obsolete">matrix is not a %(n_lign)d x %(n_col)d matrix</translation>
+        <translation>matrix is not a %(n_lign)d x %(n_col)d matrix</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compocomm.py" line="41"/>
         <source>Decommenter</source>
-        <translation type="obsolete">uncomment</translation>
+        <translation>uncomment</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compocomm.py" line="43"/>
         <source>Decommente la commande </source>
-        <translation type="obsolete">uncomment the command</translation>
+        <translation>uncomment the command</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compofact.py" line="133"/>
         <source>Impossible de supprimer un mot-cle obligatoire </source>
-        <translation type="obsolete">mandatory keyword cannot be deleted</translation>
+        <translation>mandatory keyword cannot be deleted</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compofact.py" line="136"/>
         <source>Mot-cle %s supprime</source>
-        <translation type="obsolete">Keyword %s deleted</translation>
+        <translation>Keyword %s deleted</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compofact.py" line="141"/>
         <source>Pb interne : impossible de supprimer ce mot-cle</source>
-        <translation type="obsolete">internal problem : unable to delete keyword</translation>
+        <translation>internal problem : unable to delete keyword</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compojdc.py" line="86"/>
         <source>Commentaire supprime</source>
-        <translation type="obsolete">comment is deleted</translation>
+        <translation>comment is deleted</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compojdc.py" line="88"/>
         <source>Commande %s supprimee</source>
-        <translation type="obsolete">command %s is deleted</translation>
+        <translation>command %s is deleted</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compojdc.py" line="91"/>
         <source>Pb interne : impossible de supprimer cet objet</source>
-        <translation type="obsolete">internal problem : unable to delete object</translation>
+        <translation>internal problem : unable to delete object</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compomacro.py" line="125"/>
         <source>Le fichier de commande n&apos;a pas pu etre converti pour etre editable par Eficas
 
 </source>
-        <translation type="obsolete">unable to convert .comm file in order to open it with Eficas</translation>
+        <translation>unable to convert .comm file in order to open it with Eficas</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compomacro.py" line="157"/>
         <source>Include vide</source>
-        <translation type="obsolete">include file is empty</translation>
+        <translation>include file is empty</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compomacro.py" line="157"/>
         <source>L&apos;include doit etre correctement initialise pour etre visualise</source>
-        <translation type="obsolete">include file must be correct</translation>
+        <translation>include file must be correct</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compomclist.py" line="223"/>
         <source>Impossible de supprimer ce mot-clef</source>
-        <translation type="obsolete">unable to delete this keyword</translation>
+        <translation>unable to delete this keyword</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compooper.py" line="67"/>
         <source>View3D</source>
-        <translation type="obsolete">View3D</translation>
+        <translation>View3D</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compooper.py" line="69"/>
         <source>affiche dans Geom les elements de structure</source>
-        <translation type="obsolete">diplay SE in Geom</translation>
+        <translation>diplay SE in Geom</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compooper.py" line="76"/>
         <source>Graphique</source>
-        <translation type="obsolete">graphic</translation>
+        <translation>graphic</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compooper.py" line="78"/>
         <source>affiche la distribution </source>
-        <translation type="obsolete">display distribution</translation>
+        <translation>display distribution</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compooper.py" line="201"/>
         <source>Impossible de supprimer un mot-clef obligatoire </source>
-        <translation type="obsolete">unable to delete a mandatory keyword</translation>
+        <translation>unable to delete a mandatory keyword</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compooper.py" line="203"/>
         <source>Mot-clef %s supprime </source>
-        <translation type="obsolete">Keyword %s is deleted</translation>
+        <translation>Keyword %s is deleted</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compoparam.py" line="146"/>
         <source>Definition d&apos;un parametre</source>
-        <translation type="obsolete">defines a parameter</translation>
+        <translation>defines a parameter</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/configuration.py" line="156"/>
         <source>Import du fichier de Configuration</source>
-        <translation type="obsolete">import configuration file</translation>
+        <translation>import configuration file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/configuration.py" line="156"/>
         <source>Erreur a la lecture du fichier de configuration %s </source>
-        <translation type="obsolete">Error when reading configuration file</translation>
+        <translation>Error when reading configuration file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="196"/>
         <source>Erreur fatale au chargement de %s</source>
-        <translation type="obsolete">fatal error when loading %s</translation>
+        <translation>fatal error when loading %s</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="197"/>
         <source>Erreur fatale au chargement d&apos;un fichier</source>
-        <translation type="obsolete">Fatal error when loading file</translation>
+        <translation>Fatal error when loading file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="313"/>
         <source>fichier modifie</source>
-        <translation type="obsolete">file updated </translation>
+        <translation>file updated </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="313"/>
         <source>Attention! fichier change hors EFICAS</source>
-        <translation type="obsolete">Warning ! this file was modified outside Eficas</translation>
+        <translation>Warning ! this file was modified outside Eficas</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="367"/>
         <source>Type de fichier non reconnu</source>
-        <translation type="obsolete">unsupported file type</translation>
+        <translation>unsupported file type</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="324"/>
         <source>EFICAS ne sait pas ouvrir le type de fichier %s</source>
-        <translation type="obsolete">Eficas is not able to open this file&apos;s type : %s</translation>
+        <translation>Eficas is not able to open this file&apos;s type : %s</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="367"/>
         <source>EFICAS ne sait pas ouvrir ce type de fichier</source>
-        <translation type="obsolete">Eficas is not able to open this file&apos;s type</translation>
+        <translation>Eficas is not able to open this file&apos;s type</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="610"/>
         <source>Copie impossible</source>
-        <translation type="obsolete">unable to copy</translation>
+        <translation>unable to copy</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="582"/>
         <source>Veuillez selectionner un objet a copier</source>
-        <translation type="obsolete">you have to select an object to copy</translation>
+        <translation>you have to select an object to copy</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="587"/>
         <source>Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne</source>
-        <translation type="obsolete">You have to select a single object : copy will be done after the selected node</translation>
+        <translation>You have to select a single object : copy will be done after the selected node</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="610"/>
         <source>Aucun Objet n a ete copie ou coupe</source>
-        <translation type="obsolete">No object was cut or copied</translation>
+        <translation>No object was cut or copied</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="636"/>
         <source>Copie refusee</source>
-        <translation type="obsolete">rejected copy</translation>
+        <translation>rejected copy</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="622"/>
         <source>Eficas n a pas reussi a copier l objet</source>
-        <translation type="obsolete">Eficas cannot copy this object</translation>
+        <translation>Eficas cannot copy this object</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="636"/>
         <source>Copie refusee pour ce type d objet</source>
-        <translation type="obsolete">Copy rejected : bad object type</translation>
+        <translation>Copy rejected : bad object type</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="648"/>
         <source>Deplacement refuse</source>
-        <translation type="obsolete">move rejected</translation>
+        <translation>move rejected</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="648"/>
         <source>Deplacement refuse entre 2 fichiers. Seule la copie est autorisee </source>
-        <translation type="obsolete">move rejected. no move between two files : only copy is available</translation>
+        <translation>move rejected. no move between two files : only copy is available</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="684"/>
         <source>Copie impossible a cet endroit</source>
-        <translation type="obsolete">unable to copy here</translation>
+        <translation>unable to copy here</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="684"/>
         <source>Veuillez selectionner une commande, un parametre, un commentaire ou une macro</source>
-        <translation type="obsolete">select a command; a parameter, a comment or a macro</translation>
+        <translation>select a command; a parameter, a comment or a macro</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="745"/>
         <source>Choix d&apos;un fichier XML</source>
-        <translation type="obsolete">Choice of XML file</translation>
+        <translation>Choice of XML file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="66"/>
         <source>Ouvrir Fichier</source>
-        <translation type="obsolete">Open file</translation>
+        <translation>Open file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1036"/>
         <source>Erreur a la generation</source>
-        <translation type="obsolete">Error when generating</translation>
+        <translation>Error when generating</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1036"/>
         <source>EFICAS ne sait pas convertir ce JDC</source>
-        <translation type="obsolete">Eficas is unable to convert JDC</translation>
+        <translation>Eficas is unable to convert JDC</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1040"/>
         <source>Format %s non reconnu</source>
-        <translation type="obsolete"> not supported format %s</translation>
+        <translation> not supported format %s</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="895"/>
         <source>Execution impossible </source>
-        <translation type="obsolete">Unable to execute</translation>
+        <translation>Unable to execute</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="832"/>
         <source>le JDC doit etre valide pour une execution MAP</source>
-        <translation type="obsolete">JDC has to be valid before run</translation>
+        <translation>JDC has to be valid before run</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="835"/>
         <source>le JDC doit contenir un et un seul composant</source>
-        <translation type="obsolete">JDC must contains a single componant</translation>
+        <translation>JDC must contains a single componant</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="935"/>
-        <source>sauvegarde</source>
-        <translation type="obsolete">save</translation>
+        <source>Sauvegarde du Fichier</source>
+        <translation>Save File</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="944"/>
-        <source>Sauvegarde du Fichier</source>
-        <translation type="obsolete">save file</translation>
+        <source>Le fichier</source>
+        <translation>file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="944"/>
-        <source>Le fichier &lt;b&gt;%s&lt;/b&gt; existe deja.</source>
-        <translation type="obsolete">file  &lt;b&gt;%s&lt;/b&gt; already exists.</translation>
+        <source>existe deja</source>
+        <translation>allready exists</translation>
     </message>
     <message>
-        <location filename="InterfaceQT4/editor.py" line="944"/>
         <source>&amp;Ecraser</source>
-        <translation type="obsolete">&amp;Replace</translation>
+        <translation>&amp;Replace</translation>
     </message>
     <message>
-        <location filename="InterfaceQT4/editor.py" line="1178"/>
-        <source>Donnez le nom du fichier correspondant a l unite logique </source>
-        <translation type="obsolete">Choose file corresponding to unit </translation>
+        <source>&amp;Abandonner</source>
+        <translation>&amp;Cancel</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1181"/>
         <source>Choix d&apos;un fichier de poursuite</source>
-        <translation type="obsolete">Choose poursuite file</translation>
+        <translation>Choose poursuite file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1182"/>
         <source>Le fichier %s contient une commande POURSUITE
 </source>
-        <translation type="obsolete">file %s contains a POURSUITE command</translation>
+        <translation>file %s contains a POURSUITE command</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereTraduction.py" line="37"/>
         <source>Traduire Fichier</source>
-        <translation type="obsolete">file translation</translation>
+        <translation>file translation</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereTraduction.py" line="37"/>
         <source>Fichiers JDC  (*.comm);;Tous les Fichiers (*)</source>
-        <translation type="obsolete">JDC files(*.comm);; All FIles(*)</translation>
+        <translation>JDC files(*.comm);; All FIles(*)</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereTraduction.py" line="62"/>
         <source>Fichier Traduit : %s
 
 </source>
-        <translation type="obsolete">Translated file : %s</translation>
+        <translation>Translated file : %s</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereTraduction.py" line="72"/>
         <source>Pas de difference entre le fichier origine et le fichier traduit</source>
-        <translation type="obsolete">No difference between the primary file and the translated file</translation>
+        <translation>No difference between the primary file and the translated file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monChoixCata.py" line="42"/>
         <source>%d versions du catalogue sont disponibles</source>
-        <translation type="obsolete">%d catalogs versions are available</translation>
+        <translation>%d catalogs versions are available</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="115"/>
         <source>&amp;Ok</source>
-        <translation type="obsolete">&amp;Ok</translation>
+        <translation>&amp;Ok</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/feuille.py" line="173"/>
         <source>Entrez </source>
-        <translation type="obsolete">enter</translation>
+        <translation>enter</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/feuille.py" line="119"/>
         <source> valeurs </source>
-        <translation type="obsolete"> values </translation>
+        <translation> values </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/feuille.py" line="174"/>
         <source>Entrez entre </source>
-        <translation type="obsolete">enter between </translation>
+        <translation>enter between </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/feuille.py" line="174"/>
         <source> et </source>
-        <translation type="obsolete"> and </translation>
+        <translation> and </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereIcones.py" line="245"/>
         <source>Selection</source>
-        <translation type="obsolete">selection</translation>
+        <translation>selection</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetSimpBase.py" line="86"/>
         <source>Type de base inconnu</source>
-        <translation type="obsolete">unkown type</translation>
+        <translation>unkown type</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereIcones.py" line="209"/>
         <source>Visualisation Fichier </source>
-        <translation type="obsolete">view file</translation>
+        <translation>view file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereIcones.py" line="209"/>
         <source>Impossibilite d&apos;afficher le Fichier</source>
-        <translation type="obsolete">Unable to display file</translation>
+        <translation>Unable to display file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereIcones.py" line="222"/>
         <source>Sauvegarder Fichier</source>
-        <translation type="obsolete">save File</translation>
+        <translation>save File</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereIcones.py" line="236"/>
         <source>Fichier selectionne</source>
-        <translation type="obsolete">file selected</translation>
+        <translation>file selected</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetSimpComplexe.py" line="116"/>
         <source>expression valide</source>
-        <translation type="obsolete">valid expression</translation>
+        <translation>valid expression</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetSimpComplexe.py" line="122"/>
         <source>expression invalide</source>
-        <translation type="obsolete">unvalid expression</translation>
+        <translation>unvalid expression</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetSimpComplexe.py" line="128"/>
         <source>expression n est pas de la forme a+bj</source>
-        <translation type="obsolete">expression is not as a+bj</translation>
+        <translation>expression is not as a+bj</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetSimpComplexe.py" line="140"/>
         <source>entrer une seule valeur SVP</source>
-        <translation type="obsolete">Please, enter a single value</translation>
+        <translation>Please, enter a single value</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetSimpComplexe.py" line="158"/>
         <source>saisir le type de complexe</source>
-        <translation type="obsolete">choose complex&apos;s type</translation>
+        <translation>choose complex&apos;s type</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monViewTexte.py" line="69"/>
         <source>Sauvegarder le fichier</source>
-        <translation type="obsolete">save file</translation>
+        <translation>save file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monViewTexte.py" line="69"/>
         <source>Le fichier &lt;b&gt;%(v_1)s&lt;/b&gt; n&apos;a pu etre sauvegarde. &lt;br&gt;Raison : %(v_2)s</source>
         <comment>v_1</comment>
-        <translation type="obsolete">file &lt;b&gt;%(v_1)s&lt;/b&gt; was not saved. Raison : %(v_2)s</translation>
+        <translation>file &lt;b&gt;%(v_1)s&lt;/b&gt; was not saved. Raison : %(v_2)s</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="78"/>
         <source>&amp;Recents</source>
-        <translation type="obsolete">&amp;Recently Opened</translation>
+        <translation>&amp;Recently Opened</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="147"/>
         <source>Aide specifique </source>
-        <translation type="obsolete">code&apos;s help</translation>
+        <translation>code&apos;s help</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="189"/>
         <source>Traduction</source>
-        <translation type="obsolete">translation</translation>
+        <translation>translation</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="194"/>
         <source>Options</source>
-        <translation type="obsolete">Options</translation>
+        <translation>Options</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="409"/>
         <source>version </source>
-        <translation type="obsolete">version</translation>
+        <translation>version</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/readercata.py" line="276"/>
         <source> pour </source>
-        <translation type="obsolete"> for </translation>
+        <translation> for </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="436"/>
         <source>Aide Indisponible</source>
-        <translation type="obsolete">no help avalaible</translation>
+        <translation>no help avalaible</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="450"/>
         <source>Parametrage</source>
-        <translation type="obsolete">Options</translation>
+        <translation>Options</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="443"/>
         <source>Veuillez d abord choisir un code</source>
-        <translation type="obsolete">Choose a code</translation>
+        <translation>Choose a code</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="450"/>
         <source>Pas de possibilite de personnalisation de la configuration </source>
-        <translation type="obsolete">no options avalaible for configuration</translation>
+        <translation>no options avalaible for configuration</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="471"/>
         <source>&amp;Effacer</source>
-        <translation type="obsolete">&amp;Delete</translation>
+        <translation>&amp;Delete</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtSaisie.py" line="98"/>
         <source>Veuillez entrer le complexe sous forme aster ou sous forme python</source>
-        <translation type="obsolete">enter a complex</translation>
+        <translation>enter a complex</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/readercata.py" line="147"/>
         <source>Import du catalogue</source>
-        <translation type="obsolete">Loading catalog</translation>
+        <translation>Loading catalog</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/readercata.py" line="95"/>
         <source>Pas de catalogue defini pour le code </source>
-        <translation type="obsolete">No catalog for this code</translation>
+        <translation>No catalog for this code</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/readercata.py" line="119"/>
         <source>Aucun catalogue trouve</source>
-        <translation type="obsolete">No catalog</translation>
+        <translation>No catalog</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/readercata.py" line="278"/>
         <source> avec le catalogue </source>
-        <translation type="obsolete">with catalog  </translation>
+        <translation>with catalog  </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/readercata.py" line="147"/>
         <source>Impossible d&apos;importer le catalogue </source>
-        <translation type="obsolete">unable to load catalog</translation>
+        <translation>unable to load catalog</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/readercata.py" line="268"/>
         <source>Choix d une version du code </source>
-        <translation type="obsolete">Choose a version for </translation>
+        <translation>Choose a version for </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/readercata.py" line="270"/>
         <source>Choix d une version </source>
-        <translation type="obsolete">choose a version</translation>
+        <translation>choose a version</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="219"/>
         <source>Parametre</source>
-        <translation type="obsolete">parameter</translation>
+        <translation>parameter</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="37"/>
         <source>Insere un parametre</source>
-        <translation type="obsolete">insert a parameter</translation>
+        <translation>insert a parameter</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="115"/>
         <source>item invalide</source>
-        <translation type="obsolete">invalid item</translation>
+        <translation>invalid item</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="115"/>
         <source>l item doit etre valide</source>
-        <translation type="obsolete">item must be valid</translation>
+        <translation>item must be valid</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="141"/>
         <source>apres</source>
-        <translation type="obsolete">after</translation>
+        <translation>after</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="136"/>
         <source>Insere un commentaire apres la commande </source>
-        <translation type="obsolete">insert a comment after the command</translation>
+        <translation>insert a comment after the command</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="144"/>
         <source>avant</source>
-        <translation type="obsolete">before</translation>
+        <translation>before</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="139"/>
         <source>Insere un commentaire avant la commande </source>
-        <translation type="obsolete">insert a comment before the command</translation>
+        <translation>insert a comment before the command</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="143"/>
         <source>Insere un parametre apres la commande </source>
-        <translation type="obsolete">insert a parameter after the command</translation>
+        <translation>insert a parameter after the command</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="146"/>
         <source>Insere un parametre avant la commande </source>
-        <translation type="obsolete">insert a parameter before the commande</translation>
+        <translation>insert a parameter before the commande</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="148"/>
         <source>Supprimer</source>
-        <translation type="obsolete">delete</translation>
+        <translation>delete</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="150"/>
         <source>supprime le mot clef </source>
-        <translation type="obsolete">delete keyword</translation>
+        <translation>delete keyword</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="151"/>
         <source>Documentation</source>
-        <translation type="obsolete">documentation</translation>
+        <translation>documentation</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="153"/>
         <source>documentation sur la commande </source>
-        <translation type="obsolete">command&apos;s documentation</translation>
+        <translation>command&apos;s documentation</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="183"/>
         <source>Documentation Vide</source>
-        <translation type="obsolete">empty documentation</translation>
+        <translation>empty documentation</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="163"/>
         <source>Aucune documentation n&apos;est associee a ce noeud</source>
-        <translation type="obsolete">no documentation is available for this node</translation>
+        <translation>no documentation is available for this node</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="170"/>
         <source>impossible de trouver la commande  </source>
-        <translation type="obsolete">unable to find command</translation>
+        <translation>unable to find command</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="171"/>
         <source>Lecteur PDF</source>
-        <translation type="obsolete">PDF reader</translation>
+        <translation>PDF reader</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="182"/>
         <source>impossible d&apos;ouvrir </source>
-        <translation type="obsolete">unable to open</translation>
+        <translation>unable to open</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="215"/>
         <source>Commentaire</source>
-        <translation type="obsolete">Comment</translation>
+        <translation>Comment</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="232"/>
         <source>ce noeud</source>
-        <translation type="obsolete">this node</translation>
+        <translation>this node</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/typeNode.py" line="234"/>
         <source>commente le noeud </source>
-        <translation type="obsolete">comment this node</translation>
+        <translation>comment this node</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="64"/>
         <source>Fichiers JDC (*.comm);;Tous les Fichiers (*)</source>
-        <translation type="obsolete">JDC Files (*.comm);;All Files(*)</translation>
+        <translation>JDC Files (*.comm);;All Files(*)</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="84"/>
         <source>&amp;Quitter</source>
-        <translation type="obsolete">&amp;Exit</translation>
+        <translation>&amp;Exit</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="116"/>
         <source>Quitter</source>
-        <translation type="obsolete">Exit</translation>
+        <translation>Exit</translation>
+    </message>
+    <message>
+        <source>sauvegarde</source>
+        <translation>save</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="337"/>
         <source>Fichier Duplique</source>
-        <translation type="obsolete">file is duplicated</translation>
+        <translation>file is duplicated</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="337"/>
         <source>Le fichier ne sera pas sauvegarde.</source>
-        <translation type="obsolete">File will not be saved.</translation>
+        <translation>File will not be saved.</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="349"/>
         <source>&amp;Annuler</source>
-        <translation type="obsolete">&amp;Cancel</translation>
+        <translation>&amp;Cancel</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="267"/>
         <source>Fichier</source>
-        <translation type="obsolete">File</translation>
+        <translation>File</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="267"/>
         <source>Le fichier &lt;b&gt;%s&lt;/b&gt; est deja ouvert.</source>
-        <translation type="obsolete">File  &lt;b&gt;%s&lt;/b&gt; is already open.</translation>
+        <translation>File  &lt;b&gt;%s&lt;/b&gt; is already open.</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="267"/>
         <source>&amp;Duplication</source>
-        <translation type="obsolete">&amp;Duplication</translation>
+        <translation>&amp;Duplication</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="267"/>
         <source>&amp;Abort</source>
-        <translation type="obsolete">&amp;Abort</translation>
+        <translation>&amp;Abort</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="349"/>
         <source>Fichier Modifie</source>
-        <translation type="obsolete">File is modified</translation>
+        <translation>File is modified</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="349"/>
         <source>Le fichier %s n a pas ete sauvegarde.</source>
-        <translation type="obsolete">file %s was not saved.</translation>
+        <translation>file %s was not saved.</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/viewManager.py" line="349"/>
         <source>&amp;Sauvegarder</source>
-        <translation type="obsolete">&amp;Save</translation>
+        <translation>&amp;Save</translation>
+    </message>
+    <message>
+        <location filename="InterfaceQT4/viewManager.py" line="349"/>
+        <source>&amp;Quitter sans sauvegarder</source>
+        <translation>&amp;Quit anyway</translation>
     </message>
     <message>
         <location filename="convert/convert_pyth.py" line="109"/>
         <source>Erreur a l&apos;evaluation :
  %s</source>
-        <translation type="obsolete">Error when loadind :
+        <translation>Error when loadind :
 %s</translation>
     </message>
     <message>
         <location filename="Editeur/utils.py" line="50"/>
         <source>Un fichier de nom %s existe deja : impossible de creer un repertoire de meme nom</source>
-        <translation type="obsolete">File %s already exists : unable to create a directory with the same name</translation>
+        <translation>File %s already exists : unable to create a directory with the same name</translation>
     </message>
     <message>
         <location filename="Editeur/utils.py" line="56"/>
         <source>Creation du repertoire %s impossible
  Verifiez vos droits d&apos;acces</source>
-        <translation type="obsolete">Unable to create directory : check your access rights</translation>
+        <translation>Unable to create directory : check your access rights</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="266"/>
         <source>localisation de l&apos;application, pour la traduction</source>
-        <translation type="obsolete">use for application translation</translation>
+        <translation>use for application translation</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/browser.py" line="435"/>
         <source>  n&apos;est pas un index valide pour append_brother</source>
-        <translation type="obsolete">is not correct - no possible &quot;append_brother&quot;</translation>
+        <translation>is not correct - no possible &quot;append_brother&quot;</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compooper.py" line="114"/>
         <source>Erreur interne</source>
-        <translation type="obsolete">Internal error</translation>
+        <translation>Internal error</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compooper.py" line="114"/>
         <source>La PDF de la loi ne peut pas etre affichee.</source>
-        <translation type="obsolete">unable to display law&apos;s PDF.</translation>
+        <translation>unable to display law&apos;s PDF.</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="746"/>
         <source>Le fichier contient une commande MODEL
 </source>
-        <translation type="obsolete">file contains MODEL command </translation>
+        <translation>file contains MODEL command </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1176"/>
         <source>Choix unite %d </source>
-        <translation type="obsolete">Choice for unit %d</translation>
+        <translation>Choice for unit %d</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1179"/>
         <source>Fichier pour unite </source>
-        <translation type="obsolete">File for unit </translation>
+        <translation>File for unit </translation>
     </message>
     <message>
         <location filename="Extensions/interpreteur_formule.py" line="97"/>
         <source>La formule passee a l&apos;interpreteur doit etre sous forme de tuple</source>
-        <translation type="obsolete">formula must be written as tuple</translation>
+        <translation>formula must be written as tuple</translation>
     </message>
     <message>
         <location filename="Extensions/nuplet.py" line="104"/>
         <source>Debut </source>
-        <translation type="obsolete">Beginning</translation>
+        <translation>Beginning</translation>
     </message>
     <message>
         <location filename="Extensions/parametre_eval.py" line="150"/>
         <source>Le parametre EVAL ne peut valoir None</source>
-        <translation type="obsolete">None is not a valid value for EVAL</translation>
+        <translation>None is not a valid value for EVAL</translation>
     </message>
     <message>
         <location filename="Extensions/parametre.py" line="188"/>
         <source>Pas de nom donne au parametre </source>
-        <translation type="obsolete">No name given</translation>
+        <translation>No name given</translation>
     </message>
     <message>
         <location filename="Extensions/parametre.py" line="193"/>
         <source>Le parametre %s ne peut valoir None</source>
-        <translation type="obsolete">None is an incorrect value for parameter %s</translation>
+        <translation>None is an incorrect value for parameter %s</translation>
     </message>
     <message>
         <location filename="generator/generator_aplat.py" line="147"/>
         <source>Format non implemente : %s</source>
-        <translation type="obsolete">Not implemented format</translation>
+        <translation>Not implemented format</translation>
     </message>
     <message>
         <location filename="generator/generator_pyth.py" line="143"/>
         <source>Type de valeur non supporte par le format pyth : n %(exception)s</source>
         <comment>nom</comment>
-        <translation type="obsolete">unsupported type of value</translation>
+        <translation>unsupported type of value</translation>
     </message>
     <message>
         <location filename="Ihm/I_FORM_ETAPE.py" line="138"/>
         <source>Impossible de realiser la verification de la formule</source>
-        <translation type="obsolete">unable to verify formula</translation>
+        <translation>unable to verify formula</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compooper.py" line="208"/>
         <source>Pb interne : impossible de supprimer ce mot-clef</source>
-        <translation type="obsolete">internal problem : unable to delete keyword</translation>
+        <translation>internal problem : unable to delete keyword</translation>
     </message>
     <message>
         <location filename="convert/parseur_python.py" line="499"/>
         <source>Eficas ne peut pas traiter plusieurs instructions 
                                                  sur la meme ligne : %s</source>
-        <translation type="obsolete">Eficas is not able to manage many instructions on a same line</translation>
+        <translation>Eficas is not able to manage many instructions on a same line</translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue.py" line="209"/>
         <source>le texte a analyser n&apos;est pas celui d&apos;une commande ou 
                                          d&apos;un operateur : %s</source>
-        <translation type="obsolete">text is not valid for a command or a operaor</translation>
+        <translation>text is not valid for a command or a operaor</translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue.py" line="229"/>
         <source>le texte a analyser n&apos;est pas celui d&apos;une commande connue : 
                                         %(v_1)s %(v_2)s</source>
         <comment>v_1</comment>
-        <translation type="obsolete">text is not valid for command %(v_1)s %(v_2)s </translation>
+        <translation>text is not valid for command %(v_1)s %(v_2)s </translation>
     </message>
     <message>
         <location filename="Editeur/analyse_catalogue.py" line="231"/>
         <source>le texte a analyser n&apos;est pas celui d&apos;une commande connue : 
                                          %(v_1)s %(v_2)s</source>
         <comment>v_1</comment>
-        <translation type="obsolete">text is not valid for command %(v_1)s %(v_2)s</translation>
+        <translation>text is not valid for command %(v_1)s %(v_2)s</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="149"/>
         <source> jdc %(v_1)s manque 
                                       fichier comm dans section %(v_2)s</source>
         <comment>v_1</comment>
-        <translation type="obsolete">file %(v_1)s need a .comm file in section %(v_2)s   </translation>
+        <translation>file %(v_1)s need a .comm file in section %(v_2)s   </translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="170"/>
@@ -1426,614 +1433,613 @@ Le fichier associe n&apos;est pas defini</source>
                                    fichier include %(v_2)s, %(v_3)s 
                                    n&apos;existe pas</source>
         <comment>v_1</comment>
-        <translation type="obsolete">file %(v_1)s need an include  file  %(v_2)s,%(v_3)s does not exist </translation>
+        <translation>file %(v_1)s need an include  file  %(v_2)s,%(v_3)s does not exist </translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="202"/>
         <source> jdc %(v_1)s manque fichier comm 
                                 dans section %(v_2)s</source>
         <comment>v_1</comment>
-        <translation type="obsolete">file %(v_1)s need a .comm file in section %(v_2)s</translation>
+        <translation>file %(v_1)s need a .comm file in section %(v_2)s</translation>
     </message>
     <message>
         <location filename="Editeur/session.py" line="206"/>
         <source>jdc %(v_1)s, le fichier de commandes 
                                 %(v_2)s n&apos;existe pas</source>
         <comment>v_1</comment>
-        <translation type="obsolete">jdc%(v_1)s, .comm  %(v_2)s does not exist</translation>
+        <translation>jdc%(v_1)s, .comm  %(v_2)s does not exist</translation>
     </message>
     <message>
         <location filename="Ihm/I_ETAPE.py" line="485"/>
         <source>
    Include Invalide. 
   ne sera pas pris en compte</source>
-        <translation type="obsolete">Invalid include file. text will not be included</translation>
+        <translation>Invalid include file. text will not be included</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="167"/>
         <source>Impossible de relire le fichier %s 
  </source>
-        <translation type="obsolete">unable to read file</translation>
+        <translation>unable to read file</translation>
     </message>
     <message>
         <location filename="Ihm/I_MACRO_ETAPE.py" line="178"/>
         <source>Le fichier include contient des erreurs </source>
-        <translation type="obsolete">include file contains errors</translation>
+        <translation>include file contains errors</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/compoparam.py" line="86"/>
         <source>PARAMETRE</source>
-        <translation type="obsolete">PARAMETER</translation>
+        <translation>PARAMETER</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1041"/>
         <source>EFICAS ne sait pas convertir le JDC selon le format </source>
-        <translation type="obsolete">Eficas does not know how to convert data according to the defined format</translation>
+        <translation>Eficas does not know how to convert data according to the defined format</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="871"/>
         <source>le JDC doit etre valide pour une execution </source>
-        <translation type="obsolete">Before a run action, JDC must be valid</translation>
+        <translation>Before a run action, JDC must be valid</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="895"/>
         <source>Sauvegarder SVP avant l&apos;execution </source>
-        <translation type="obsolete">Save before run action</translation>
+        <translation>Save before run action</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1020"/>
         <source>Sauvegarde de l&apos;input impossible </source>
-        <translation type="obsolete">unable to save input file</translation>
+        <translation>unable to save input file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1020"/>
         <source>Un JdC valide est necessaire pour creer un .input</source>
-        <translation type="obsolete">file must be valid to create a .input file</translation>
+        <translation>file must be valid to create a .input file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="964"/>
         <source>Choix du composant obligatoire</source>
-        <translation type="obsolete">You have to choose a component</translation>
+        <translation>You have to choose a component</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1177"/>
         <source>Le fichier %s contient une commande INCLUDE 
 </source>
-        <translation type="obsolete">file %s contains an &quot;INCLUDE&quot; command</translation>
+        <translation>file %s contains an &quot;INCLUDE&quot; command</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1183"/>
         <source>Donnez le nom du fichier dont vous 
  voulez faire une poursuite</source>
-        <translation type="obsolete">Name the principal file</translation>
+        <translation>Name the principal file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1311"/>
         <source>Fichiers Med (*.med);;Tous les Fichiers (*)</source>
-        <translation type="obsolete">Med Files (*.med);;All Files(*)</translation>
+        <translation>Med Files (*.med);;All Files(*)</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1314"/>
         <source>Fichier Med</source>
-        <translation type="obsolete">Med File</translation>
+        <translation>Med File</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/editor.py" line="1314"/>
         <source>Veuillez selectionner un fichier Med</source>
-        <translation type="obsolete">Choose a Med file</translation>
+        <translation>Choose a Med file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/feuille.py" line="165"/>
         <source>reel</source>
-        <translation type="obsolete">float</translation>
+        <translation>float</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/feuille.py" line="166"/>
         <source>entier</source>
-        <translation type="obsolete">integer</translation>
+        <translation>integer</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/feuille.py" line="167"/>
         <source>complexe</source>
-        <translation type="obsolete">complex</translation>
+        <translation>complex</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="436"/>
         <source>l&apos;aide n est pas installee </source>
-        <translation type="obsolete">Help is not available</translation>
+        <translation>Help is not available</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereIcones.py" line="291"/>
         <source>Export Med vers Fichier </source>
-        <translation type="obsolete">export Med Mesh in a file</translation>
+        <translation>export Med Mesh in a file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereIcones.py" line="291"/>
         <source>Impossibilite d exporter le Fichier</source>
-        <translation type="obsolete">Unable to export file</translation>
+        <translation>Unable to export file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monBoutonValide.py" line="43"/>
         <source>objet valide</source>
-        <translation type="obsolete">valid object</translation>
+        <translation>valid object</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetSimpTuple3.py" line="47"/>
         <source>Valeur non modifiable</source>
-        <translation type="obsolete">value can not be changed</translation>
+        <translation>value can not be changed</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetOptionnel.py" line="91"/>
         <source>Options pour 
 </source>
-        <translation type="obsolete">Settings </translation>
+        <translation>Settings </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetPlusieursInto.py" line="172"/>
         <source>Nombre minimal de valeurs : </source>
-        <translation type="obsolete">minimal number of values :</translation>
+        <translation>minimal number of values :</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetPlusieursInto.py" line="174"/>
         <source>Nombre maximal de valeurs : </source>
-        <translation type="obsolete">Maximal number of values :</translation>
+        <translation>Maximal number of values :</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetSimpComplexe.py" line="84"/>
         <source>l expression n est pas de la forme a+bj</source>
-        <translation type="obsolete">expression must be as a+bj</translation>
+        <translation>expression must be as a+bj</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/politiquesValidation.py" line="157"/>
         <source>Valeur du mot-cle enregistree</source>
-        <translation type="obsolete">Value is recorded</translation>
+        <translation>Value is recorded</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/politiquesValidation.py" line="162"/>
         <source>Valeur du mot-cle non autorisee </source>
-        <translation type="obsolete">Value is not authorized</translation>
+        <translation>Value is not authorized</translation>
     </message>
     <message>
-        <location filename="InterfaceQT4/viewManager.py" line="299"/>
-        <source>Fichier non encore nomme </source>
-        <translation type="obsolete">unnamed file</translation>
+        <source>Fichier non encore nomme</source>
+        <translation>unnamed file</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="1"/>
         <source>SOURCE</source>
-        <translation type="obsolete">SOURCE</translation>
+        <translation>SOURCE</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="2"/>
         <source>EnveloppeConnexeInducteur</source>
-        <translation type="obsolete">Bounding_Box</translation>
+        <translation>Bounding_Box</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="4"/>
         <source>VecteurDirecteur</source>
-        <translation type="obsolete">Direction_Vector</translation>
+        <translation>Direction_Vector</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="5"/>
         <source>Centre</source>
-        <translation type="obsolete">Center<byte value="x9"/></translation>
+        <translation>Center<byte value="x9"/></translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="6"/>
         <source>SectionBobine</source>
-        <translation type="obsolete">Section</translation>
+        <translation>Section</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="7"/>
         <source>Amplitude</source>
-        <translation type="obsolete">Amplitude</translation>
+        <translation>Amplitude</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="8"/>
         <source>NbdeTours</source>
-        <translation type="obsolete">NbTurns</translation>
+        <translation>NbTurns</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="9"/>
         <source>CONDUCTEUR</source>
-        <translation type="obsolete">CONDUCTOR</translation>
+        <translation>CONDUCTOR</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="10"/>
         <source>Conductivite</source>
-        <translation type="obsolete">Conductivity</translation>
+        <translation>Conductivity</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="11"/>
         <source>PermeabiliteRelative</source>
-        <translation type="obsolete">Relative_Permeability</translation>
+        <translation>Relative_Permeability</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="12"/>
         <source>NOCOND</source>
-        <translation type="obsolete">DIELECTRIC</translation>
+        <translation>DIELECTRIC</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="13"/>
         <source>VCUT</source>
-        <translation type="obsolete">CUT</translation>
+        <translation>CUT</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="14"/>
         <source>Orientation</source>
-        <translation type="obsolete">Orientation</translation>
+        <translation>Orientation</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="15"/>
         <source>ZS</source>
-        <translation type="obsolete">ZS</translation>
+        <translation>ZS</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="5"/>
         <source>RepCarmel</source>
-        <translation type="obsolete">Carmel_Directory</translation>
+        <translation>Carmel_Directory</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="18"/>
         <source>TypedeFormule</source>
-        <translation type="obsolete">Formula</translation>
+        <translation>Formula</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="19"/>
         <source>Frequence</source>
-        <translation type="obsolete">Frequency</translation>
+        <translation>Frequency</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="20"/>
         <source>Nb_Max_Iterations</source>
-        <translation type="obsolete">Max_Nb_Iterations</translation>
+        <translation>Max_Nb_Iterations</translation>
     </message>
     <message>
         <location filename="CarmelCND/PourTraductionCarmel.py" line="21"/>
         <source>Erreur_Max</source>
-        <translation type="obsolete">Max_Error</translation>
+        <translation>Max_Error</translation>
     </message>
     <message>
         <location filename="generator/generator_python.py" line="112"/>
         <source>Format non implemente </source>
-        <translation type="obsolete">non implemented format</translation>
+        <translation>non implemented format</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereListe.py" line="193"/>
         <source>Fichier de donnees</source>
-        <translation type="obsolete">data file</translation>
+        <translation>data file</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereListe.py" line="193"/>
         <source>Tous les  Fichiers (*)</source>
-        <translation type="obsolete">all files (*)</translation>
+        <translation>all files (*)</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetCB.py" line="51"/>
         <source>Select</source>
-        <translation type="obsolete">select</translation>
+        <translation>select</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetPlusieursBase.py" line="226"/>
         <source>nb min de valeurs : </source>
-        <translation type="obsolete">minimal number of values :</translation>
+        <translation>minimal number of values :</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetPlusieursBase.py" line="231"/>
         <source>nb max de valeurs atteint</source>
-        <translation type="obsolete">maximum number of values</translation>
+        <translation>maximum number of values</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas.py" line="389"/>
         <source>Sauve Format Ligne</source>
-        <translation type="obsolete">save file in line format</translation>
+        <translation>save file in line format</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtSaisie.py" line="138"/>
         <source>Valeur du mot-clef enregistree</source>
-        <translation type="obsolete">value recorded</translation>
+        <translation>value recorded</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtSaisie.py" line="142"/>
         <source>Valeur du mot-clef non autorisee :</source>
-        <translation type="obsolete">unvalid value</translation>
+        <translation>unvalid value</translation>
     </message>
     <message>
         <location filename="Noyau/N_VALIDATOR.py" line="170"/>
         <source>%s n&apos;est pas un fichier valide</source>
-        <translation type="obsolete">%s is not a valid file</translation>
+        <translation>%s is not a valid file</translation>
     </message>
     <message>
         <location filename="Noyau/N_VALIDATOR.py" line="1554"/>
         <source>: verifie les types dans un tuple</source>
-        <translation type="obsolete">valids type in a tuple</translation>
+        <translation>valids type in a tuple</translation>
     </message>
     <message>
         <location filename="Noyau/N_VALIDATOR.py" line="1557"/>
         <source>Les types entres ne sont pas permis</source>
-        <translation type="obsolete">unvalid type for values</translation>
+        <translation>unvalid type for values</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monFonctionPanel.py" line="62"/>
         <source>La cardinalite n&apos;est pas correcte, la derniere valeur est ignoree</source>
-        <translation type="obsolete">unvalid multiplicity. last value will be ignored</translation>
+        <translation>unvalid multiplicity. last value will be ignored</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monFonctionPanel.py" line="110"/>
         <source> n est pas un tuple de </source>
-        <translation type="obsolete">is not a tuple</translation>
+        <translation>is not a tuple</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monFonctionPanel.py" line="112"/>
         <source> valeurs</source>
-        <translation type="obsolete"> values </translation>
+        <translation> values </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetCreeParam.py" line="96"/>
         <source>Valeur incorrecte</source>
-        <translation type="obsolete">incorrect value</translation>
+        <translation>incorrect value</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetCreeParam.py" line="105"/>
         <source> n est pas un identifiant correct
  </source>
-        <translation type="obsolete">is not a valid name</translation>
+        <translation>is not a valid name</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="78"/>
         <source>Entrer un float SVP</source>
-        <translation type="obsolete">Float expected</translation>
+        <translation>Float expected</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="83"/>
         <source>Entrer un float inferieur a </source>
-        <translation type="obsolete">float lower than</translation>
+        <translation>float lower than</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="88"/>
         <source>Entrer un float superieur a </source>
-        <translation type="obsolete">float superior than</translation>
+        <translation>float superior than</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="111"/>
         <source>Mauvaise execution </source>
-        <translation type="obsolete">bad run</translation>
+        <translation>bad run</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="111"/>
         <source>impossible d executer la methode </source>
-        <translation type="obsolete">unable to run method</translation>
+        <translation>unable to run method</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="135"/>
         <source>Mauvaise Commande </source>
-        <translation type="obsolete">bad command</translation>
+        <translation>bad command</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="135"/>
         <source>Aucune variable connue</source>
-        <translation type="obsolete">no possible variable </translation>
+        <translation>no possible variable </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="183"/>
         <source>Mauvaise dimension de matrice</source>
-        <translation type="obsolete">bad matrix dimension</translation>
+        <translation>bad matrix dimension</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="181"/>
         <source>le nombre de ligne n est pas egal a </source>
-        <translation type="obsolete">number of lines is not </translation>
+        <translation>number of lines is not </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="183"/>
         <source>le nombre de colonne n est pas egal a </source>
-        <translation type="obsolete">number of columns is not</translation>
+        <translation>number of columns is not</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="191"/>
         <source>Mauvaise Valeur</source>
-        <translation type="obsolete">bad value</translation>
+        <translation>bad value</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="191"/>
         <source>l element </source>
-        <translation type="obsolete">element</translation>
+        <translation>element</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetMatrice.py" line="191"/>
         <source>n est pas correct</source>
-        <translation type="obsolete">is not correct</translation>
+        <translation>is not correct</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetParam.py" line="94"/>
         <source>Modification Impossible</source>
-        <translation type="obsolete">unable to modify</translation>
+        <translation>unable to modify</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetParam.py" line="94"/>
         <source>le parametre n&apos;est pas valide</source>
-        <translation type="obsolete">parameter is not valid</translation>
+        <translation>parameter is not valid</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetParam.py" line="108"/>
         <source> n est pas un identifiant correct</source>
-        <translation type="obsolete">is not a correct name</translation>
+        <translation>is not a correct name</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetParam.py" line="127"/>
         <source>Valeur incorrecte: </source>
-        <translation type="obsolete">incorrect value :</translation>
+        <translation>incorrect value :</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetParam.py" line="130"/>
         <source>Valeur incorrecte </source>
-        <translation type="obsolete">incorrect value</translation>
+        <translation>incorrect value</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetParam.py" line="133"/>
         <source>Valeur correcte </source>
-        <translation type="obsolete">valid value</translation>
+        <translation>valid value</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetSDCOInto.py" line="77"/>
         <source>impossible d&apos;evaluer : </source>
-        <translation type="obsolete">unable to evaluate :</translation>
+        <translation>unable to evaluate :</translation>
     </message>
     <message>
         <location filename="Extensions/parametre_eval.py" line="170"/>
         <source>Un concept de nom %s existe d&#xe9;j&#xe0; !</source>
-        <translation type="obsolete">already existing concept with name : %s !</translation>
+        <translation>already existing concept with name : %s !</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetCreeParam.py" line="109"/>
         <source> existe deja
  </source>
-        <translation type="obsolete">already exists</translation>
+        <translation>already exists</translation>
     </message>
     <message>
         <location filename="Ihm/I_MCSIMP.py" line="624"/>
         <source>La matrice n&apos;a pas le bon entete</source>
-        <translation type="obsolete">header does not match with matrix</translation>
+        <translation>header does not match with matrix</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/browser.py" line="463"/>
         <source>le mot clef </source>
-        <translation type="obsolete">keyword </translation>
+        <translation>keyword </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/browser.py" line="455"/>
         <source> doit etre insere avant </source>
-        <translation type="obsolete"> has to be inserted before </translation>
+        <translation> has to be inserted before </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/browser.py" line="464"/>
         <source>insertion impossible</source>
-        <translation type="obsolete">unable to insert keyword</translation>
+        <translation>unable to insert keyword</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/browser.py" line="463"/>
         <source> doit etre insere apres </source>
-        <translation type="obsolete"> has to be inserted after </translation>
+        <translation> has to be inserted after </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/monWidgetPlusieursTuple.py" line="244"/>
         <source>Nb maximum de valeurs atteint</source>
-        <translation type="obsolete">Maximal number of values </translation>
+        <translation>Maximal number of values </translation>
     </message>
     <message>
         <location filename="InterfaceQT4/gereRegles.py" line="58"/>
         <source>pas de regle de construction pour ce jeu de commandes</source>
-        <translation type="obsolete">No specific rules for building this dataset</translation>
+        <translation>No specific rules for building this dataset</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas.py" line="260"/>
         <source>Gestion Maillage</source>
-        <translation type="obsolete">Mesh Menu</translation>
+        <translation>Mesh Menu</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas.py" line="401"/>
         <source>Acquiert groupe mailles</source>
-        <translation type="obsolete">Read elements mesh</translation>
+        <translation>Read elements mesh</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas.py" line="406"/>
         <source>Acquisition Groupe Maille</source>
-        <translation type="obsolete">Read elements mesh</translation>
+        <translation>Read elements mesh</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="1"/>
         <source>VERSION</source>
-        <translation type="obsolete">VERSION_EN</translation>
+        <translation>VERSION_EN</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="2"/>
         <source>NUM</source>
-        <translation type="obsolete">NUMBER</translation>
+        <translation>NUMBER</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="3"/>
         <source>FILETYPE</source>
-        <translation type="obsolete">FILETYPE</translation>
+        <translation>FILETYPE</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="4"/>
         <source>PARAMETERS</source>
-        <translation type="obsolete">Parametres</translation>
+        <translation>Parametres</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="6"/>
         <source>Fichier_maillage</source>
-        <translation type="obsolete">FichierMaillage</translation>
+        <translation>FichierMaillage</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="7"/>
         <source>Echelle_du_maillage</source>
-        <translation type="obsolete">MeshScale</translation>
+        <translation>MeshScale</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="8"/>
         <source>Formulation</source>
-        <translation type="obsolete">Fomulation</translation>
+        <translation>Fomulation</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="9"/>
         <source>Timeproblem</source>
-        <translation type="obsolete">TimeProblem</translation>
+        <translation>TimeProblem</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="10"/>
         <source>spectral </source>
-        <translation type="obsolete">EssaiSpectral</translation>
+        <translation>EssaiSpectral</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="11"/>
         <source>Basis</source>
-        <translation type="obsolete">Basis</translation>
+        <translation>Basis</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="12"/>
         <source>Fourier</source>
-        <translation type="obsolete">Fourier</translation>
+        <translation>Fourier</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="13"/>
         <source>Ordre</source>
-        <translation type="obsolete">Ordre</translation>
+        <translation>Ordre</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="14"/>
         <source>FREQUENCY</source>
-        <translation type="obsolete">Frequency</translation>
+        <translation>Frequency</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="15"/>
         <source>minimisation</source>
-        <translation type="obsolete">Minimisation</translation>
+        <translation>Minimisation</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="16"/>
         <source>no</source>
-        <translation type="obsolete">no</translation>
+        <translation>no</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="17"/>
         <source>yes</source>
-        <translation type="obsolete">yes</translation>
+        <translation>yes</translation>
     </message>
     <message>
         <location filename="Carmel3D/PourTraduction.py" line="18"/>
         <source>nb_procs_para</source>
-        <translation type="obsolete">NbProcs</translation>
+        <translation>NbProcs</translation>
     </message>
     <message>
         <location filename="monCode/EssaiTraduction.py" line="1"/>
         <source>POLYMER</source>
-        <translation type="obsolete">Polymer_en_Anglais</translation>
+        <translation>Polymer_en_Anglais</translation>
     </message>
     <message>
         <location filename="monCode/EssaiTraduction.py" line="2"/>
         <source>MODEL_DATABASE</source>
-        <translation type="obsolete">MoDEL_DATa_Anglais</translation>
+        <translation>MoDEL_DATa_Anglais</translation>
     </message>
 </context>
 <context>
@@ -2428,17 +2434,17 @@ p, li { white-space: pre-wrap; }
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="158"/>
         <source>Execution</source>
-        <translation type="obsolete">Run</translation>
+        <translation>Run</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="166"/>
         <source>Execution </source>
-        <translation type="obsolete">Run</translation>
+        <translation>Run</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="326"/>
         <source>Patrons</source>
-        <translation type="obsolete">Patterns</translation>
+        <translation>Patterns</translation>
     </message>
     <message>
         <location filename="myMain.ui" line="120"/>
@@ -2528,12 +2534,12 @@ p, li { white-space: pre-wrap; }
     <message>
         <location filename="InterfaceQT4/qtEficas_with_log.py" line="176"/>
         <source>Save Run</source>
-        <translation type="obsolete">Save run</translation>
+        <translation>Save run</translation>
     </message>
     <message>
         <location filename="InterfaceQT4/qtEficas.py" line="184"/>
         <source>Run</source>
-        <translation type="obsolete">run</translation>
+        <translation>run</translation>
     </message>
     <message>
         <location filename="myMain.ui" line="243"/>
@@ -2555,13 +2561,9 @@ p, li { white-space: pre-wrap; }
         <source>Afficher l&apos;Arbre</source>
         <translation>Show dataset tree</translation>
     </message>
-</context>
-<context>
-    <name>JDCEditor</name>
     <message>
-        <location filename="InterfaceQT4/editor.py" line="944"/>
         <source>&amp;Abandonner</source>
-        <translation type="obsolete">&amp;Cancel</translation>
+        <translation>&amp;Cancel</translation>
     </message>
 </context>
 <context>
@@ -2772,7 +2774,7 @@ p, li { white-space: pre-wrap; }
     <message>
         <location filename="UiQT4/desWidgetCommentaire.ui" line="147"/>
         <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#0000ff;&quot;&gt;Commentaire&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
-        <translation type="obsolete">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#0000ff;&quot;&gt;Comment&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; color:#0000ff;&quot;&gt;Comment&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
     </message>
     <message>
         <location filename="desWidgetCommentaire.ui" line="330"/>
@@ -2787,7 +2789,7 @@ p, li { white-space: pre-wrap; }
     <message encoding="UTF-8">
         <location filename="UiQT4/desWidgetCommentaire.ui" line="182"/>
         <source>Détruit le commentaire</source>
-        <translation type="obsolete">Delete the comment</translation>
+        <translation>Delete the comment</translation>
     </message>
     <message>
         <location filename="desWidgetCommentaire.ui" line="339"/>
@@ -3221,7 +3223,7 @@ p, li { white-space: pre-wrap; }
     <message encoding="UTF-8">
         <location filename="UiQT4/desWidgetParam.ui" line="176"/>
         <source>Détruit le commentaire</source>
-        <translation type="obsolete">Delete the comment</translation>
+        <translation>Delete the comment</translation>
     </message>
     <message>
         <location filename="desWidgetParam.ui" line="568"/>
@@ -3440,7 +3442,7 @@ p, li { white-space: pre-wrap; }
     <message>
         <location filename="UiQT4/desWidgetPlusieursIntoOrdonne.ui" line="228"/>
         <source>TextLabel</source>
-        <translation type="obsolete">TextLabel</translation>
+        <translation>TextLabel</translation>
     </message>
     <message>
         <location filename="desWidgetPlusieursIntoOrdonne.ui" line="618"/>
diff --git a/UiQT5/eficas_fr.qm b/UiQT5/eficas_fr.qm
new file mode 100644 (file)
index 0000000..9dad8df
Binary files /dev/null and b/UiQT5/eficas_fr.qm differ
index 794f888a7a5104eb0b795a58b46dfb392f9f7302..aaa4377c60fca05f4041e0629e2fb657b3f99a49 100644 (file)
@@ -171,7 +171,7 @@ class PARSEUR_PYTHON(object):
         self.getOptions()
         return self.line
 
-    def getTexte(self,appli=None):
+    def getTexte(self,appliEficas=None):
         """
            Retourne le texte issu de l'analyse
         """
index 2e934c09ee03dea30ff17f2d8b164c608952ea5f..b77b3639fc2163285eb701234cb923c6d698bd7b 100644 (file)
@@ -26,7 +26,6 @@ from Extensions.i18n import tr
 #traceback.print_stack()
 
 from convert.convert_python import Pythonparser
-from six.moves import range
 try:
   basestring
 except NameError:
@@ -93,31 +92,31 @@ class TELEMACparser(Pythonparser):
 
    
 
-   def convert(self, outformat, appli=None):
+   def convert(self, outformat, appliEficas=None):
 
 
       from Accas import A_BLOC, A_FACT, A_SIMP
       try :
-        self.dicoCasToCata = appli.readercata.dicoCasToCata
+        self.dicoCasToCata = appliEficas.readercata.dicoCasToCata
       except :
         self.dicoCasToCata = {}
         print ('pas de dicoCasToCata')
-      self.dicoInverse              = appli.readercata.dicoInverse
-      self.dicoMC                   = appli.readercata.dicoMC
-      self.Ordre_Des_Commandes      = appli.readercata.Ordre_Des_Commandes
+      self.dicoInverse              = appliEficas.readercata.dicoInverse
+      self.dicoMC                   = appliEficas.readercata.dicoMC
+      self.Ordre_Des_Commandes      = appliEficas.readercata.Ordre_Des_Commandes
       try :
-        self.TelemacdicoEn            = appli.readercata.TelemacdicoEn
+        self.TelemacdicoEn            = appliEficas.readercata.TelemacdicoEn
       except :
         self.TelemacdicoEn = {}
         print ('pas de TelemacdicoEn')
       try :
-        self.DicoEnumCasFrToEnumCasEn = appli.readercata.DicoEnumCasFrToEnumCasEn
+        self.DicoEnumCasFrToEnumCasEn = appliEficas.readercata.DicoEnumCasFrToEnumCasEn
       except :
         self.DicoEnumCasFrToEnumCasEn = {}
         print ('pas de DicoEnumCasFrToEnumCasEn')
       
 
-      if appli.langue=='fr' :
+      if appliEficas.langue=='fr' :
           #from enum_Telemac2d_auto       import DicoEnumCasFrToEnumCasEn
           for k in self.DicoEnumCasFrToEnumCasEn :
               self.TelemacdicoEn[k]=self.DicoEnumCasFrToEnumCasEn[k]
@@ -295,8 +294,8 @@ class TELEMACparser(Pythonparser):
 
 
       # ne sert plus
-      #appli.listeTelemac=self.dictSimp
-      appli.listeTelemac={}
+      #appliEficas.listeTelemac=self.dictSimp
+      appliEficas.listeTelemac={}
       if 'debut' in dicoComment :
           commentaire="COMMENTAIRE("+repr(dicoComment['debut'])+")\n"
           self.textePy=commentaire+self.textePy
index 8d9f9b8ed305a1793f0e858cba11782d6dd02491..6fed1817f569d66db8416cf99100ecf1016674cc 100644 (file)
@@ -44,6 +44,7 @@ class XMLparser:
    """
 
    def __init__(self,cr=None):
+      print ('dans XML convert')
       self.text=''
       if cr : self.cr=cr
       else: self.cr=N_CR.CR(debut='CR convertisseur format XML',
@@ -60,7 +61,7 @@ class XMLparser:
 
 
 
-   def convert(self, outformat, appli=None):
+   def convert(self, outformat, appliEficas=None):
    # ici on ne fait rien
    # on le fera a la creation du JDC
        try:
index 52a8d37e4c03349a06db6ef767fcb40d9424c09d..0e8e7675a8bcf51e9543aa3b0b93006aa9788e27 100644 (file)
@@ -88,7 +88,7 @@ class Dicoparser(Pythonparser):
              if isinstance(valeurs[mot],dict) : self.traiteMCFact(mot,valeurs[mot])
              else : self.textePy += mot+' = ' +str(valeurs[mot])+','
          self.textePy+=');\n' # fin de la commande
-     print (self.textePy)
+     #print (self.textePy)
      return self.textePy
 
   def traiteMCFact(self,mot,valeurs):
index 098612eb8e4b87715433b689aba75e0b20b8ef1f..9a73c09c3b2ec61da061c8a74f8d1cba9f98361a 100644 (file)
@@ -115,7 +115,7 @@ class Pythparser(object):
          s= s.replace('"<string>"','"<%s>"'%self.filename)
          self.cr.fatal(tr("Erreur a l'evaluation :\n %s", s))
 
-   def convert(self,outformat,appli=None):
+   def convert(self,outformat,appliEficas=None):
       if outformat == 'dict':
          return self.getdict()
       else:
index 123f3183b5e0e811349c272237b4ea806038c5fd..510721e90906d8224d46470fee8e1df876623a55 100644 (file)
@@ -111,13 +111,13 @@ class Pythonparser(object):
          self.cr.fatal(tr("Impossible d'ouvrir le fichier %s" ,str(filename)))
          return
    
-   def convert(self,outformat,appli=None):
+   def convert(self,outformat,appliEficas=None):
       if outformat == 'exec':
          try:
             #import cProfile, pstats, StringIO
             #pr = cProfile.Profile()
             #pr.enable()            
-            l= PARSEUR_PYTHON(self.text).getTexte(appli)
+            l= PARSEUR_PYTHON(self.text).getTexte(appliEficas)
 
             #pr.disable()
             #s = StringIO.StringIO()
index 55482e26058f6ee1670236e2c92bee9d004c0d29..e0a17f969968f617a28eaaa543ed8f4ebc895a19 100644 (file)
@@ -17,7 +17,7 @@
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
 import re
-from convert_python import PythonParser
+from convert_python import Pythonparser
 
 def entryPoint():
    """
@@ -25,12 +25,12 @@ def entryPoint():
    """
    return {
           'name' : 'openturns_study',
-          'factory' : OTStudyParser
+          'factory' : OTStudyparser
           }
 
-class OTStudyParser(PythonParser):
+class OTStudyparser(Pythonparser):
    """
-   This converter works like PythonParser, except that it also initializes all
+   This converter works like Pythonparser, except that it also initializes all
    model variables to None in order to avoid Python syntax errors when loading
    a file with a different or inexistent definition of variables.
    """
@@ -38,7 +38,7 @@ class OTStudyParser(PythonParser):
    pattern_model_variable = re.compile(r'ModelVariable\s*=\s*(\w+)\s*,')
 
    def convert(self, outformat, appli=None):
-      text = PythonParser.convert(self, outformat, appli)
+      text = Pythonparser.convert(self, outformat, appli)
       varnames = self.pattern_model_variable.findall(text)
       newtext = ""
       for var in varnames:
index 14c26b8577598adb8d8ce8c8532b7769c9e44a28..ce2cc3d853d431d31663de7bb0523e6d3c6fe3f2 100644 (file)
@@ -32,7 +32,7 @@ def entryPoint():
         # Le nom du plugin
           'name' : 'openturns_wrapper',
         # La factory pour créer une instance du plugin
-          'factory' : PythonParser,
+          'factory' : Pythonparser,
           }
 
 
index e3f28ba3a54207a5a164914226771d42d9e72940..c577c58e25cf68c5f30b1ecaa97c63ca8fe45251 100644 (file)
@@ -21,14 +21,12 @@ from __future__ import absolute_import
 from __future__ import print_function
 try :
   from builtins import str
-  from builtins import range
   from builtins import object
 except :
   pass
 import sys,string,re
 import traceback
 from Extensions.i18n import tr
-from six.moves import range
 
 escapedQuotesRE = re.compile(r"(\\\\|\\\"|\\\')")
 stringsAndCommentsRE =  \
@@ -296,7 +294,7 @@ class PARSEUR_PYTHON(object):
     def __init__(self,texte):
         self.texte = texte
         self.l_objets=None
-        self.appli=None
+        self.appliEficas=None
 
     def isAffectation(self,texte):
         """
@@ -581,7 +579,7 @@ class PARSEUR_PYTHON(object):
                     if nouvelindice == len(texte) :
                         nouvelindice=nouvelindice -1
                         break
-                 if mot in self.appli.liste_simp_reel:
+                 if mot in self.appliEficas.liste_simp_reel:
                     if valeur[0] != "'":
                        try :
                          clef=eval(valeur)
@@ -612,7 +610,7 @@ class PARSEUR_PYTHON(object):
                        #cas du tuple de valeurs
                        valeur=texte[indiceC+1:nouvelindice+1]
                        indiceC=nouvelindice+1 
-                       if mot in self.appli.liste_simp_reel:
+                       if mot in self.appliEficas.liste_simp_reel:
                           valeur=valeur[1:-1]
                           for val in valeur.split(',') :
                           # Attention la derniere valeur est""
@@ -650,21 +648,21 @@ class PARSEUR_PYTHON(object):
            #index=epure1.find(u"=")
            #epure2=epure1[index+1:len(epure1)].replace(u"_F(u","(u")
            #dict_reel_concept=self.construitGenea(epure2)
-           if self.appli:
-             dict_reel_concept=construitGenea(epure2,self.appli.liste_simp_reel)
+           if self.appliEficas:
+             dict_reel_concept=construitGenea(epure2,self.appliEficas.liste_simp_reel)
            else:
              dict_reel_concept={}
         if nomConcept == "sansnom" :
            nomConcept = ""
         if nomConcept !=None :
            if len(dict_reel_concept) != 0:
-              self.appli.dict_reels[nomConcept]=dict_reel_concept
+              self.appliEficas.dict_reels[nomConcept]=dict_reel_concept
 
-    def getTexte(self,appli=None):
+    def getTexte(self,appliEficas=None):
         """
         Retourne le texte issu de l'analyse
         """
-        self.appli=appli
+        self.appliEficas=appliEficas
         try:
         #if 1:
             if not self.l_objets : self.analyse()
@@ -688,10 +686,10 @@ if __name__ == "__main__" :
     #fichier = 'D:/Eficas_dev/Tests/zzzz100a.comm'
     #fichier = 'U:/Eficas_dev/Tests/test_eval.comm'
     texte = open(fichier,'r').read()
-    class appli(object):
+    class appliEficas(object):
        dict_reels={}
        liste_simp_reel=["VALE","VALE_C","GROUP_MA","RAYON"]
-    a=appli()
+    a=appliEficas()
 
     compile(txt, '<string>', 'exec')
     print((a.dict_reels))
index aa4dbe296f4d66d91400106350389a3ea02fca12..eb57e461464aec44482d21ad27a186c457124e81 100644 (file)
@@ -223,10 +223,8 @@ class Formatage (object):
           self.texte_etape = self.texte_etape + ('\n'+self.indent_courant*' ')*ind +s_mcsimp.strip()
       else :
           # il faut couper ...
-          #nom,valeur = string.split(s_mcsimp,self.sep,1)
           nom,valeur = str.split(s_mcsimp,self.sep,1)
           chaine = self.creerChaine(nom,valeur,'\n'+self.indent_courant*' ',ind)
-          #self.jdc_fini = self.jdc_fini + ('\n'+self.indent_courant*' ')*ind + s_mcsimp.strip()
           self.texte_etape = self.texte_etape + chaine
       return
 
@@ -259,11 +257,11 @@ class Formatage (object):
         # il s'agit d'une vraie chaîne de caractères
         val = len(valeur)
         texte = (self.l_max-2-val)*' '+valeur
-        s=s+'\n'+texte
+        s=s+'\\\n'+texte
       elif re.match(filePattern,valeur) or re.match(filePattern2,valeur):
         val = len(valeur)
         texte = (self.l_max-2-val)*' '+valeur
-        s=s+'\n'+texte
+        s=s+'\\\n'+texte
       elif ',' in valeur:
         # il s'agit d'une liste de tuple
         # c est trop complique on ne splitte pas
@@ -294,10 +292,13 @@ class Formatage (object):
 
       else :
         # On a une ( mais pas de , . On passe la chaine sans modification
-        val = len(valeur)
+        val = len(valeur) +len(label)
         texte = (self.l_max-2-val)*' '+valeur
-        s=s+'\n'+texte
-
+        s='\n'+s+texte
+    else : 
+      label = nom + self.sep
+      val = len(valeur) +len(label)
+      s = '\n'+(self.l_max-2-val)*' '+label+valeur
     return s
 
 class FormatageLigne(Formatage) :
index e60d43e4bf26bc806430cbbaacd35cc8df0059d6..93ee4bc5e026fd25d5291a30d3072094e5aec66e 100755 (executable)
@@ -31,7 +31,6 @@ import traceback
 import types,re,os
 from Extensions.i18n import tr
 from .generator_dicoImbrique import DicoImbriqueGenerator
-import pdb
 
 def entryPoint():
    """
@@ -57,7 +56,7 @@ class PSENGenerator(DicoImbriqueGenerator):
    extensions=('.comm',)
 
 #----------------------------------------------------------------------------------------
-   def gener(self,obj,format='brut',config=None, appli=None):
+   def gener(self,obj,format='brut',config=None, appliEficas=None):
 
       try :
          self.MachineDico = obj.MachineDico
index 2c7b0fae8175c1143289a7b2fb14141b1942be97..efce52f05fa64a58671403fc8995440347c5c7b4 100755 (executable)
@@ -50,7 +50,7 @@ class ProcessOutputsGenerator(PythonGenerator,ModificationGenerator):
    extensions=('.comm',)
 
 #----------------------------------------------------------------------------------------
-   def gener(self,obj,format='brut',config=None, appli=None):
+   def gener(self,obj,format='brut',config=None, appliEficas=None):
 
       # Cette instruction genere le contenu du fichier de commandes (persistance)
       texteModification=self.generTexteModif(obj)
index 3b52f688074248e062cf92058dc1e5349b122a74..6935d5371a9fc9648935d2b88e5bec032ca8ce74 100644 (file)
@@ -58,11 +58,11 @@ class TELEMACGenerator(PythonGenerator):
    """
 
 #----------------------------------------------------------------------------------------
-   def gener(self,obj,format='brut',config=None,appli=None,statut="Leger"):
+   def gener(self,obj,format='brut',config=None,appliEficas=None,statut="Leger"):
  
       self.statut        = statut
-      self.langue        = appli.langue
-      try : self.TelemacdicoEn = appli.readercata.TelemacdicoEn
+      self.langue        = appliEficas.langue
+      try : self.TelemacdicoEn = appliEficas.readercata.TelemacdicoEn
       except : 
         print ('Attention : pas de TelemacdicoEn declare') 
         self.TelemacdicoEn = {}
@@ -76,7 +76,7 @@ class TELEMACGenerator(PythonGenerator):
           self.DicoEnumCasEnInverse[motClef]=d
       if self.langue == 'fr' : 
          #from  enum_Telemac2d_auto import DicoEnumCasFrToEnumCasEn
-         self.DicoEnumCasFrToEnumCasEn = appli.readercata.DicoEnumCasFrToEnumCasEn
+         self.DicoEnumCasFrToEnumCasEn = appliEficas.readercata.DicoEnumCasFrToEnumCasEn
          for motClef in self.DicoEnumCasFrToEnumCasEn:
               d={}
               for valTelemac in self.DicoEnumCasFrToEnumCasEn[motClef]:
@@ -85,12 +85,12 @@ class TELEMACGenerator(PythonGenerator):
               self.DicoEnumCasEnInverse[motClef]=d
       self.initDico()
       # Pour Simplifier les verifs d ecriture
-      if hasattr(appli,'listeTelemac') : self.listeTelemac=appli.listeTelemac
+      if hasattr(appliEficas,'listeTelemac') : self.listeTelemac=appliEficas.listeTelemac
       else : self.listeTelemac = ()
 
       self.dicoCataToCas={}
       try :
-        self.dicoCasToCata=appli.readercata.dicoCasToCata
+        self.dicoCasToCata=appliEficas.readercata.dicoCasToCata
       except :
         print ('Attention pas de dicoCasToCata declare')
         self.dicoCasToCata={}
@@ -148,8 +148,8 @@ class TELEMACGenerator(PythonGenerator):
 # ecriture de Leger
 #----------------------------------------------------------------------------------------
 
-   def writeComplet(self,fn,jdc,config,appli) :
-       jdc_formate=self.gener(jdc,config=config,appli=appli,statut="Entier")
+   def writeComplet(self,fn,jdc,config,appliEficas) :
+       jdc_formate=self.gener(jdc,config=config,appliEficas=appliEficas,statut="Entier")
        self.writeDefault(fn)
 
 
index 4fc98f10134b13ab0b113f8c4dad6d5435abd23f..b8e0f3c76aec3ee77424ebdf250e35a0b513cc9c 100644 (file)
@@ -54,15 +54,19 @@ class XMLGenerator(PythonGenerator):
    extensions=('.comm',)
 
 #----------------------------------------------------------------------------------------
-   def gener(self,obj,format='brut',config=None,appli=None):
+   def gener(self,obj,format='brut',config=None,appliEficas=None):
        
-      try :
-        print (obj)
+      print ('dans gener XMLGenerator Attention if 1 a la place de try ')
+      #try :
+      if 1 :
         self.texteXML=obj.toXml()
-      except : 
-        self.texteXML='erreur generation'
-        pass
+      #except : 
+      #  self.texteXML='erreur generation'
+      #  pass
       
+      print (self.texteXML)
+      self.textePourAide =""
+      self.dictNbNomObj={}
       # Cette instruction genere le contenu du fichier de commandes (persistance)
       self.text=PythonGenerator.gener(self,obj,format)
       return self.text
@@ -76,11 +80,35 @@ class XMLGenerator(PythonGenerator):
 #----------------------------------------------------------------------------------------
 
    def writeDefault(self,fn) :
-       #fileDico = fn[:fn.rfind(".")] + '.py'
-       fileDico='/tmp/toto.xml'
-       print (self.texteXML)
-       f = open( str(fileDico), 'w')
-       f.write('Dico = '+str(self.texteXML))
+       fileXML  = fn[:fn.rfind(".")] + '.xml'
+       #filePyxb = fn[:fn.rfind(".")] + '.py'
+       fileBase = os.path.basename(fileXML)
+       fileBase = fileBase[:fileBase.rfind(".")] + '.py'
+       filePyxb = '/tmp/' + fileBase
+       print (filePyxb)
+       #fileDico='/tmp/toto.xml'
+       #print (self.texteXML)
+       f = open( str(fileXML), 'w')
+       f.write(str(self.texteXML))
        f.close()
 
+       f = open( str(filePyxb), 'w')
+       f.write(str(self.textePourAide))
+       f.close()
+
+
+   def generMCSIMP(self,obj) :
+       if obj.nom in self.dictNbNomObj.keys():
+          nomUtil = obj.nom + "_" + str(self.dictNbNomObj[obj.nom])
+          self.dictNbNomObj[obj.nom] += 1
+       else :
+          nomUtil = obj.nom 
+          self.dictNbNomObj[obj.nom] = 1
+       self.textePourAide +=  nomUtil + " = vimmpCase." + obj.getNomDsXML() + "\n"
+       #self.textePourAide +=  "print  '"+ nomUtil+ " ='  , " + str(nomUtil) + "\n"
+       #self.textePourAide +='txt += "' + nomUtil + '" + " = " +str( ' + nomUtil + ') ' + "\n"
+
+
 
+       s=PythonGenerator.generMCSIMP(self,obj)
+       return s
index 2bbdaade91961ae4805ab0af0c19d8d092891123..6eaff182aa9dadad1cf1e652adbf0d4c4388d3c3 100644 (file)
@@ -90,7 +90,7 @@ class AplatGenerator(object):
       fp.write(self.text)
       fp.close()
 
-   def gener(self,obj,format='brut',config=None,appli=None):
+   def gener(self,obj,format='brut',config=None,appliEficas=None):
       """
           Retourne une representation du JDC obj sous une forme qui est parametree par format.
           Si format vaut 'brut', 'standard' ou 'beautifie', retourne le texte issu de generator
index 408ba95426b634b428e3d943553516a22f953117..91c69c232bb7b6c8c78ea9628c647d1e1cb71c15 100644 (file)
@@ -55,7 +55,7 @@ class DicoGenerator(PythonGenerator):
    extensions=('.comm',)
 
 #----------------------------------------------------------------------------------------
-   def gener(self,obj,format='brut',config=None,appli=None):
+   def gener(self,obj,format='brut',config=None,appliEficas=None):
        
       self.initDico()
       
@@ -91,9 +91,6 @@ class DicoGenerator(PythonGenerator):
    def generMCSIMP(self,obj) :
         """recuperation de l objet MCSIMP"""
         s=PythonGenerator.generMCSIMP(self,obj)
-        print ('jjjjjjjjjj')
-        print (obj.nom)
-        print (s)
         courant=self.Dico
         for p in obj.getGenealogiePrecise()[0:-1]:
             if not (p in courant.keys()) : courant[p]={}
index 4c201b9761a384cf3326084524a41c94c9e1313b..d5d845cf13f6f68bd614b207d238045f11b4d4cc 100644 (file)
@@ -54,7 +54,7 @@ class DicoImbriqueGenerator(PythonGenerator):
    extensions=('.comm',)
 
 #----------------------------------------------------------------------------------------
-   def gener(self,obj,format='brut',config=None, appli=None):
+   def gener(self,obj,format='brut',config=None, appliEficas=None):
        
       self.initDico()
       
index 43b4bb716237f1f7a066c06013d2a58b8b56d502..97e7edd0563b56645519ce10e41f3c219443da86 100644 (file)
@@ -56,7 +56,7 @@ class MapGenerator(PythonGenerator):
 
    """
 
-   def gener(self,obj,format='brut',config=None,appli=None):
+   def gener(self,obj,format='brut',config=None,appliEficas=None):
       self.initDico()
       self.text=PythonGenerator.gener(self,obj,format)
       if obj.isValid() :self.genereExeMap()
diff --git a/generator/generator_mapVP.py b/generator/generator_mapVP.py
new file mode 100644 (file)
index 0000000..a6c766a
--- /dev/null
@@ -0,0 +1,238 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2019   EDF R&D
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+"""
+   Ce module contient le plugin generateur de fichier au format 
+   CARMEL3D pour EFICAS.
+
+"""
+from __future__ import print_function
+from __future__ import absolute_import
+try :
+   from builtins import str
+except : pass
+
+import traceback
+import types,re,os
+import Accas
+
+from .generator_python import PythonGenerator
+
+listeCalParName = ('Time' , 'Temperature', 'DoseRate', 'Thickness')        #'calculation_parameter_names'
+                  
+def entryPoint():
+   """
+      Retourne les informations necessaires pour le chargeur de plugins
+
+      Ces informations sont retournees dans un dictionnaire
+   """
+   return {
+        # Le nom du plugin
+          'name' : 'MAPVp',
+        # La factory pour creer une instance du plugin
+          'factory' : MapGenerator,
+          }
+
+
+class MapGenerator(PythonGenerator):
+   """
+      Ce generateur parcourt un objet de type JDC et produit
+      un texte au format eficas et 
+      un texte au format py 
+
+   """
+
+   def gener(self,obj,format='brut',config=None,appliEficas=None):
+      self.appliEficas=appliEficas
+      self.cata=self.appliEficas.readercata.cata
+      self.initDico()
+      self.text=PythonGenerator.gener(self,obj,format)
+      if obj.isValid() :self.genereTexte(obj)
+      return self.text
+
+   def initDico(self) :
+      self.texteInput = ""
+      self.dictParam={}
+      self.dictValeur={}
+      self.listeEquations=[]
+      self.typeEtude = ""
+  
+
+   def genereTexte(self,obj) :
+     print ('genereTexte', self.typeEtude)
+     if self.typeEtude == "Calculation" : self.genereCalculation()
+
+
+   def generPROC_ETAPE(self,obj):
+     s=PythonGenerator.generPROC_ETAPE(self,obj)
+     if obj.nom == "Calculation_for_Mechanistic" : print ('hjkhjkh');self.typeEtude="Calculation" 
+     return s 
+      
+   def genereCalculation(self) :
+      '''
+      Prepare le contenu du fichier de parametres python
+      '''
+      self.texteInput = ""
+      self.texteInput += self.genereCsv()
+      self.texteInput += self.genereCalculationParams()
+      self.texteInput += self.txtNomCst
+      self.texteInput += self.txtVal
+      self.texteInput += self.txtValAct
+      self.texteInput += self.txtNomCstNA
+      self.texteInput += self.txtValNA
+      self.texteInput += self.txtInitName
+      self.texteInput += self.txtInitVal
+      self.texteInput += self.genereEquations()
+      print (self.texteInput)
+      
+   def writeDefault(self, fn):
+      # normalement c_solver_polymer_kinetics_myStudy.input ou myStudy est le nom de l etude 
+      fileInput = fn[:fn.rfind(".")] + '.input'
+      f = open( str(fileInput), 'wb')
+      f.write( self.texteInput )
+      f.close()
+      
+
+   def genereCalculationParams(self) :
+     txtNom  = "calculation_parameter_names = [ "
+     txtVal = "calculation_parameters = [ "
+     for param in ('Time' , 'Temperature', 'DoseRate', 'Thickness')  :
+         if param in self.dictValeur.keys() :
+           txtNom  += "'"+param +  "', "
+           txtVal += str(self.dictValeur[param]) + ", "
+     # on enleve les dernieres , et on ferme
+     txtNom = txtNom[0:-2]
+     txtNom += "]\n"
+     txtVal = txtVal[0:-2]
+     txtVal += "]\n"
+     txt = txtNom + txtVal 
+     return txt
+
+   def genereEquations(self) :
+      txt="equation =["
+      index=0
+      TechnicalUse = self.dictValeur['TechnicalUse']
+      ModelName    = self.dictValeur['ModelName']
+      for param in  self.listInitialParameters:
+          print ('*******************************************')
+          print (' je  traite ', param , 'index : ', index)
+          trouveParam=False
+
+          if index != 0 : txtParam = 'Dy[j*5 + '+str(index)+ '] = '
+          else :          txtParam = 'Dy[j*5] = '
+
+          for equation in  self.listeEquations : 
+            if param in (self.cata.dicoEquations[TechnicalUse][ModelName]['equa_diff'][equation].keys()):
+               print ('____________ trouve : ', param , 'in ', equation, ' ',  self.cata.dicoEquations[TechnicalUse][ModelName]['equa_diff'][equation][param])
+               trouveParam = True
+               if self.cata.dicoEquations[TechnicalUse][ModelName]['equa_diff'][equation][param][0] == '-' :
+                  txtParam += ' ' + self.cata.dicoEquations[TechnicalUse][ModelName]['equa_diff'][equation][param] 
+               else :
+                  if index != 0 :
+                     txtParam += ' + ' + self.cata.dicoEquations[TechnicalUse][ModelName]['equa_diff'][equation][param] 
+                  else :  
+                     txtParam +=  self.cata.dicoEquations[TechnicalUse][ModelName]['equa_diff'][equation][param] 
+               print ('         txtParam   intermediaire ', txtParam)
+
+          if trouveParam :   
+               txtParam = txtParam + ", "
+               txt += txtParam
+               index = index+1
+          print (txtParam)
+          print ('fin param', param, 'trouve ', trouveParam, '___________________________')
+          print ('*************************************************')
+          print (' ')
+      print ('_________________fin for')
+      txt=txt[0:-3]
+      txt+="]\n"
+      return txt
+
+   def genereCsv(self) :
+      txt =  'study_name = ' +self.dictValeur['SimulationName'] +  "\n"
+      txt += 'csv_output_file_name = ' + self.dictValeur['OutPutFolder'] + '/c_solver_stiff_ode_1d_' + self.dictValeur['SimulationName']+ '.csv\n'
+      return txt
+
+
+   def generMCList(self,obj):
+      s=PythonGenerator.generMCList(self,obj)
+      if obj.nom == 'ConstantesArrhenius' :
+         self.txtNomCst  = "Arrhenius_Name = [ "
+         self.txtVal     = "Arrhenius_A = [ "
+         self.txtValAct  = "Arrhenius_Ea = [ "
+         for objFils in obj.data:
+           for mc in objFils.mcListe :  
+              self.txtNomCst +=  "'" + mc.nom + "', "
+              self.txtVal    +=  str(mc.valeur[0]) + ", "
+              self.txtValAct +=  str(mc.valeur[1]) + ", "
+         self.txtNomCst = self.txtNomCst[0:-2]
+         self.txtVal    = self.txtVal[0:-2]
+         self.txtValAct = self.txtValAct [0:-2]
+         self.txtNomCst += ']\n'
+         self.txtVal    += ']\n'
+         self.txtValAct += ']\n'
+
+      if obj.nom == 'ConstantesNonArrhenius' :
+         self.txtNomCstNA  = "non_Arrhenius_coefs_names = [ "
+         self.txtValNA     = "non_Arrhenius_coefs = [ "
+         for objFils in obj.data:
+           for mc in objFils.mcListe :  
+              self.txtNomCstNA +=  "'" + mc.nom + "', "
+              self.txtValNA    +=  str(mc.valeur) + ", "
+         self.txtNomCstNA  = self.txtNomCstNA[0:-2]
+         self.txtValNA     = self.txtValNA[0:-2]
+         self.txtNomCstNA += ']\n'
+         self.txtValNA    += ']\n'
+           
+      if obj.nom == 'InitialParameters' :
+         self.listInitialParameters =[]
+         self.txtInitName  = "initial_Value_names = [ "
+         self.txtInitVal   = "initial_Values = [ "
+         for objFils in obj.data:
+           for mc in objFils.mcListe :  
+              self.txtInitName +=  "'" + mc.nom + "', "
+              self.txtInitVal  +=  str(mc.valeur) + ", "
+              self.listInitialParameters.append(mc.nom)
+         self.txtInitName  = self.txtInitName[0:-2]
+         self.txtInitVal   = self.txtInitVal[0:-2]
+         self.txtInitName += ']\n'
+         self.txtInitVal  += ']\n'
+
+      if obj.nom in( 'initiation','propagation','termination','stabilization') :
+         for o in obj : 
+           for mc  in o.mcListe :
+            nom=mc.nom.replace (' ','').replace ('+','_').replace ('-','_').replace ('>','_').replace('(','').replace(')','').replace('*','').replace('[','').replace(']','')
+            nom=obj.nom+'_'+nom
+            self.listeEquations.append(nom ) 
+      return s
+    
+   def generMCSIMP(self,obj) :
+      """
+      Convertit un objet MCSIMP en texte python
+      Remplit le dictionnaire des MCSIMP 
+      """
+      s=PythonGenerator.generMCSIMP(self,obj)
+      if obj.nom=='Consigne' : return s 
+      
+      if obj.getGenealogie()[0][-6:-1]=="_PARA":
+         self.dictParam[obj.nom]=obj.valeur
+      else :
+         self.dictValeur[obj.nom]=obj.valeur
+      return s
+  
index 479c472a91678836e63ffed1056b62ff33432610..ad8359a3254bcf51a7937077edb3383185f1b94e 100644 (file)
@@ -86,14 +86,14 @@ class PythonGenerator(object):
                          fin='fin CR format python pour python')
       # Le texte au format python est stocke dans l'attribut text
       self.text=''
-      self.appli=None
+      self.appliEficas=None
 
    def writefile(self,filename):
       fp=open(filename,'w')
       fp.write(self.text)
       fp.close()
 
-   def gener(self,obj,format='brut',config=None,appli=None):
+   def gener(self,obj,format='brut',config=None,appliEficas=None):
       """
           Retourne une representation du JDC obj sous une
           forme qui est parametree par format.
@@ -105,8 +105,7 @@ class PythonGenerator(object):
       if obj == None : 
          print ('appel a gener avec None')
          return
-      self.appli=obj.getJdcRoot().appli
-      #self.appli=obj.appli
+      self.appliEficas=appliEficas
       liste= self.generator(obj)
       #format='standard'
       if format == 'brut':
@@ -189,6 +188,11 @@ class PythonGenerator(object):
          caracteres a la syntaxe python
       """
       l=[]
+
+      #print ('generJDC', obj.sdsDict)
+      for objRef in obj.sdsDict :
+          if (isinstance(obj.sdsDict[objRef],Accas.UserASSD)):
+              l.append(self.generUserASSD(obj.sdsDict[objRef]))
       if obj.definition.l_niveaux == ():
          # Il n'y a pas de niveaux
          for etape in obj.etapes:
@@ -205,6 +209,12 @@ class PythonGenerator(object):
             l[-1] = l[-1]+'\n'
       return l
 
+   def generUserASSD(self,obj):
+       classeName =  obj.__class__.__name__
+       if obj.valeur == None :
+          texte = obj.nom + '=' + classeName + '()'
+          return texte
+
    def generMCNUPLET(self,obj):
       """ 
           Methode generant une representation de self permettant son ecriture
@@ -424,6 +434,7 @@ class PythonGenerator(object):
       """
       return obj.getName()
 
+
    def generMCFACT(self,obj):
       """
           Convertit un objet MCFACT en une liste de chaines de caracteres a la
@@ -512,9 +523,9 @@ class PythonGenerator(object):
          if vientDeListe and repr(valeur) != str(valeur) : s=repr(valeur)
          if (s.find('.')== -1 and s.find('e')== -1 and s.find('E')==-1) : s=s+'.0'
          clefobj=etape.getSdname()
-         if self.appli.appliEficas and clefobj in self.appli.appliEficas.dict_reels:
-           if valeur in self.appli.appliEficas.dict_reels[clefobj]:
-             s=self.appli.appliEficas.dict_reels[clefobj][valeur]
+         if self.appliEficas and clefobj in self.appliEficas.dict_reels:
+           if valeur in self.appliEficas.dict_reels[clefobj]:
+             s=self.appliEficas.dict_reels[clefobj][valeur]
          
       elif type(valeur) == bytes or type(valeur) == str :
          if valeur.find('\n') == -1:
@@ -527,6 +538,9 @@ class PythonGenerator(object):
             s = repr(valeur)
       elif isinstance(valeur,Accas.CO) or hasattr(etape,'sdprods') and valeur in etape.sdprods:
          s = "CO('"+ self.generator(valeur) +"')"
+      elif isinstance(valeur,Accas.UserASSD):
+      # ici on ne prend que la reference
+         s = valeur.nom
       elif isinstance(valeur,Accas.ASSD):
          s = self.generator(valeur)
       elif isinstance(valeur,Accas.PARAMETRE):
@@ -587,8 +601,8 @@ class PythonGenerator(object):
 
 
    def formatColonnes(self,nbrColonnes,listeValeurs,obj):
-      #try :
-      if 1 == 1 :
+      try :
+      #if 1 == 1 :
         indice=0
         textformat="("
         while ( indice < len(listeValeurs) ) :
@@ -607,7 +621,7 @@ class PythonGenerator(object):
                 indice=indice+1
             textformat=textformat+"\n"
         textformat=textformat[0:-1]+"),\n"
-      #except :
-      else :
+      except :
+      #else :
          textformat=str(obj.valeur)
       return textformat
index 331cbfbe0b3a9d0748d30f7392ea53ad805133eb..9f405a45f4108b76429b9078611b1e03a3fc6d74 100644 (file)
@@ -96,7 +96,7 @@ class vers3DSalomeGenerator(PythonGenerator):
       self.commande = ""
       self.dict_attributs = {} 
 
-   def gener(self,node,config=None,appli=None):
+   def gener(self,node,config=None,appliEficas=None):
       """
       """
       self.node=node
index f2659e1c777c437c41fd7b65b7190288426ef827..f27c2c1630ff75614faf91540d4f5f945c80eab2 100644 (file)
@@ -109,7 +109,7 @@ class STDGenerateur :
     print "ListeVariablesOut= %s", ListeVariablesOut
     #print "DictLois=", DictLois
     self.texteSTD = defaultSTD
-    self.OpenTURNS_path = appli.CONFIGURATION.OpenTURNS_path
+    self.OpenTURNS_path = appli.maConfiguration.OpenTURNS_path
 
     # Ce dictionnaire fait la correspondance entre le mot lu dans le dictionnaire des mots-clefs et la methode a appeler
     self.traitement = {
@@ -247,13 +247,13 @@ class STDGenerateur :
     if ( self.DictMCVal.has_key( 'Type' ) ):
       TypeAnalyse =  self.DictMCVal[ 'Type' ]
 
-    Traitement = None
+    traitement = None
     subDict = {}
     if ( self.traitement.has_key( TypeAnalyse ) ):
-      (Traitement, subDict) =  self.traitement[ TypeAnalyse ]
+      (traitement, subDict) =  self.traitement[ TypeAnalyse ]
 
-    if ( Traitement is not None ):
-      self.texteSTD = apply( STDGenerateur.__dict__[ Traitement ], (self, subDict) )
+    if ( traitement is not None ):
+      self.texteSTD = apply( STDGenerateur.__dict__[ traitement ], (self, subDict) )
     
     return self.texteSTD
 
@@ -293,12 +293,12 @@ class STDGenerateur :
     if ( self.DictMCVal.has_key( 'Method' ) ):
       Methode =  self.DictMCVal[ 'Method' ]
 
-    Traitement = None
+    traitement = None
     if ( subDict.has_key( Methode ) ):
-      Traitement =  subDict[ Methode ]
+      traitement =  subDict[ Methode ]
 
-    if ( Traitement is not None ):
-      txt += apply( STDGenerateur.__dict__[ Traitement ], (self,) )
+    if ( traitement is not None ):
+      txt += apply( STDGenerateur.__dict__[ traitement ], (self,) )
 
     txt += self.MinMaxResult()
     
@@ -382,7 +382,7 @@ class STDGenerateur :
 
     dictVariables = {}
     for variable in self.ListeVariablesIn:
-      nomVar = variable['ModelVariable'].get_name()
+      nomVar = variable['ModelVariable'].getName()
       dictVariables[ nomVar ] = variable['Distribution']
 
     i = 0
@@ -395,7 +395,7 @@ class STDGenerateur :
         marginale = "%s_%d" % (self.variable["marginal"], i)
         txt += "# Definit la loi marginale de la composante %d\n" % i
         txt += "%s = %s\n" % (marginale, apply( STDGenerateur.__dict__[ loi[ 'Kind' ] ], (self, loi) ))
-        txt += "%s.setName( '%s' )\n" % (marginale, conceptloi.get_name())
+        txt += "%s.setName( '%s' )\n" % (marginale, conceptloi.getName())
         txt += "%s[ %d ] = '%s'\n" % (self.variable["description"], i, variable)
         txt += "%s[ %d ] = Distribution( %s )\n" % (self.variable["collection"], i, marginale)
         txt += "\n"
@@ -449,7 +449,7 @@ class STDGenerateur :
     '''
     nomVar = "output"
     for variable in self.ListeVariablesOut:
-      nomVar = variable['ModelVariable'].get_name()
+      nomVar = variable['ModelVariable'].getName()
 
     txt  = "# Definit le vecteur aleatoire de sortie\n"
     txt += "%s = RandomVector( %s, %s )\n" % (self.variable["outputRandomVector"], self.variable["model"], self.variable["inputRandomVector"])
@@ -548,13 +548,13 @@ class STDGenerateur :
     if ( self.DictMCVal.has_key( 'Method' ) ):
       Methode =  self.DictMCVal[ 'Method' ]
 
-    Traitement = None
+    traitement = None
     if ( subDict.has_key( Methode ) ):
-      Traitement =  subDict[ Methode ]
+      traitement =  subDict[ Methode ]
 
-    if ( Traitement is not None ):
+    if ( traitement is not None ):
       txt += "# Etude 'Central Uncertainty'\n"
-      txt += apply( STDGenerateur.__dict__[ Traitement ], (self,) )
+      txt += apply( STDGenerateur.__dict__[ traitement ], (self,) )
 
     txt += self.Footer()
     return txt
@@ -711,12 +711,12 @@ class STDGenerateur :
     if ( self.DictMCVal.has_key( 'Method' ) ):
       Methode =  self.DictMCVal[ 'Method' ]
 
-    Traitement = None
+    traitement = None
     if ( subDict.has_key( Methode ) ):
-      Traitement =  subDict[ Methode ]
+      traitement =  subDict[ Methode ]
 
-    if ( Traitement is not None ):
-      txt += apply( STDGenerateur.__dict__[ Traitement ], (self, subDict) )
+    if ( traitement is not None ):
+      txt += apply( STDGenerateur.__dict__[ traitement ], (self, subDict) )
 
     txt += self.Footer()
     return txt
@@ -729,12 +729,12 @@ class STDGenerateur :
     if ( self.DictMCVal.has_key( 'Algorithm' ) ):
       Algorithme =  self.DictMCVal[ 'Algorithm' ]
 
-    Traitement = None
+    traitement = None
     if ( subDict.has_key( Algorithme ) ):
-      Traitement =  subDict[ Algorithme ]
+      traitement =  subDict[ Algorithme ]
 
-    if ( Traitement is not None ):
-      txt = apply( STDGenerateur.__dict__[ Traitement ], (self,) )
+    if ( traitement is not None ):
+      txt = apply( STDGenerateur.__dict__[ traitement ], (self,) )
 
     maxOuterSampling = None
     if ( self.DictMCVal.has_key( 'MaximumOuterSampling' ) ):
@@ -813,12 +813,12 @@ class STDGenerateur :
     if ( self.DictMCVal.has_key( 'OptimizationAlgorithm' ) ):
       OptimizationAlgo =  self.DictMCVal[ 'OptimizationAlgorithm' ]
 
-    Traitement = None
+    traitement = None
     if ( subDict.has_key( OptimizationAlgo ) ):
-      Traitement =  subDict[ OptimizationAlgo ]
+      traitement =  subDict[ OptimizationAlgo ]
 
-    if ( Traitement is not None ):
-      txt += apply( STDGenerateur.__dict__[ Traitement ], (self,) )
+    if ( traitement is not None ):
+      txt += apply( STDGenerateur.__dict__[ traitement ], (self,) )
 
     txt += self.OptimizerSettings()
     txt += self.PhysicalStartingPoint()
@@ -827,12 +827,12 @@ class STDGenerateur :
     if ( self.DictMCVal.has_key( 'Approximation' ) ):
       Approximation =  self.DictMCVal[ 'Approximation' ]
 
-    Traitement = None
+    traitement = None
     if ( subDict.has_key( Approximation ) ):
-      Traitement =  subDict[ Approximation ]
+      traitement =  subDict[ Approximation ]
 
-    if ( Traitement is not None ):
-      txt += apply( STDGenerateur.__dict__[ Traitement ], (self,) )
+    if ( traitement is not None ):
+      txt += apply( STDGenerateur.__dict__[ traitement ], (self,) )
 
     txt += self.RunAlgorithm()
     txt += self.AnalyticalResult()
index 66dd503de018307ab86789eaeb0130ac3db50cf2..595623d4feb720c68e07c912ead832c963b7a920 100644 (file)
@@ -86,7 +86,7 @@ class CARMEL3DGenerator(PythonGenerator):
 
       # Cette instruction genere le contenu du fichier de parametres pour le code Carmel3D
       # si le jdc est valide (sinon cela n a pas de sens)
-      if obj.isvalid() : 
+      if obj.isValid() : 
            # constitution du bloc VERSION du fichier PHYS (existe toujours)
            try :
              self.generBLOC_VERSION(obj)
@@ -242,9 +242,9 @@ class CARMEL3DGenerator(PythonGenerator):
 
         try:
             if usePrefix:
-                nomGroupeMaillage = self.nomReelGroupeMaillage(obj.get_sdname()) # nom du groupe de maillage, i.e. nom du concept, avec prefixes enleves
+                nomGroupeMaillage = self.nomReelGroupeMaillage(obj.getSdname()) # nom du groupe de maillage, i.e. nom du concept, avec prefixes enleves
             else:
-                nomGroupeMaillage = obj.get_sdname() # nom du groupe de maillage, i.e. nom du concept
+                nomGroupeMaillage = obj.getSdname() # nom du groupe de maillage, i.e. nom du concept
             # test: un et un seul nom de materiau ou source doit etre associe a ce groupe de maillage, via les cles MATERIAL et SOURCE, respectivement.
             # test sur un seul attribut, non pertinent car il peut y en avoir plusieurs.
             #assert len(obj.valeur.keys())==1,"Un et un seul nom de materiau ou source doit etre associe a ce groupe du maillage :"+nomGroupeMaillage
@@ -328,7 +328,7 @@ class CARMEL3DGenerator(PythonGenerator):
              texte+="         ]"+"\n"
        if self.debug: 
            print "texte = %s", texte
-       self.dictMaterConductor[obj.get_sdname()]=texte # sauvegarde du texte pour ce bloc
+       self.dictMaterConductor[obj.getSdname()]=texte # sauvegarde du texte pour ce bloc
 
    def generMATERIAL_DIELECTRIC(self,obj):
        """preparation du sous bloc DIELECTRIC"""
@@ -370,7 +370,7 @@ class CARMEL3DGenerator(PythonGenerator):
              texte+="         ]"+"\n"
        if self.debug: 
            print "texte = %s", texte
-       self.dictMaterDielectric[obj.get_sdname()]=texte # sauvegarde du texte pour ce bloc
+       self.dictMaterDielectric[obj.getSdname()]=texte # sauvegarde du texte pour ce bloc
 
    def generMATERIAL_ZSURFACIC(self,obj):
        """preparation du sous bloc ZSURFACIC"""
@@ -402,7 +402,7 @@ class CARMEL3DGenerator(PythonGenerator):
              texte+="         ]"+"\n"
        if self.debug: 
            print "texte = %s", texte
-       self.dictMaterZsurfacic[obj.get_sdname()]=texte # sauvegarde du texte pour ce bloc
+       self.dictMaterZsurfacic[obj.getSdname()]=texte # sauvegarde du texte pour ce bloc
 
    def generMATERIAL_EMISO(self,obj):
        """preparation du sous bloc EM_ISOTROPIC_FILES.
@@ -415,11 +415,11 @@ class CARMEL3DGenerator(PythonGenerator):
        #from os.path import basename
        #texte ="        CONDUCTIVITY MED "+basename(str(obj.valeur["CONDUCTIVITY_File"]))+"\n"
        #texte+="        PERMEABILITY MED "+basename(str(obj.valeur["PERMEABILITY_File"]))+"\n"
-       #      print "obj get sdname= ", obj.get_sdname()
-       #   if obj.get_sdname() in self.dictMaterEmIso.keys() :
-       #    self.dictMaterEmIso[obj.get_sdname()].append(texte) 
+       #      print "obj get sdname= ", obj.getSdname()
+       #   if obj.getSdname() in self.dictMaterEmIso.keys() :
+       #    self.dictMaterEmIso[obj.getSdname()].append(texte) 
        # else :
-       self.dictMaterEmIso[obj.get_sdname()]=texte
+       self.dictMaterEmIso[obj.getSdname()]=texte
   
    def generMATERIAL_EMANISO(self,obj):
        """preparation du sous bloc EM_ANISOTROPIC_FILES.
@@ -428,21 +428,21 @@ class CARMEL3DGenerator(PythonGenerator):
        """
        texte ="        CONDUCTIVITY MATER "+str(obj.valeur["CONDUCTIVITY_File"])+"\n"
        texte+="        PERMEABILITY MATER "+str(obj.valeur["PERMEABILITY_File"])+"\n"
-       #  print "obj get sdname= ", obj.get_sdname()
-       #  if obj.get_sdname() in self.dictMaterEmAnIso.keys() :
-       #    self.dictMaterEmAnIso[obj.get_sdname()].append(texte) 
+       #  print "obj get sdname= ", obj.getSdname()
+       #  if obj.getSdname() in self.dictMaterEmAnIso.keys() :
+       #    self.dictMaterEmAnIso[obj.getSdname()].append(texte) 
        #  else :
-       self.dictMaterEmAnIso[obj.get_sdname()]=texte
+       self.dictMaterEmAnIso[obj.getSdname()]=texte
    
    def generMATERIAL_NILMAT(self,obj):
        """preparation du sous bloc NILMAT"""
        texte=""
-       self.dictMaterNilmat[obj.get_sdname()]=texte
+       self.dictMaterNilmat[obj.getSdname()]=texte
    
    def generMATERIAL_ZINSULATOR(self,obj):
        """"preparation du sous bloc ZINSULATOR"""
        texte=""
-       self.dictMaterZinsulator[obj.get_sdname()]=texte
+       self.dictMaterZinsulator[obj.getSdname()]=texte
 
 #-------------------------------------------------------------------
 
@@ -490,7 +490,7 @@ class CARMEL3DGenerator(PythonGenerator):
             else:
                print tr("ERREUR! Une forme de la source du \
                                type WAVEFORM_CONSTANT ou WAVEFORM_SINUS est attendue.")
-            self.dictSourceStInd[obj.get_sdname()]=texte
+            self.dictSourceStInd[obj.getSdname()]=texte
             if self.debug: 
                 print texte
         except Exception:
@@ -519,7 +519,7 @@ class CARMEL3DGenerator(PythonGenerator):
             else:
                print tr("ERREUR! Une forme de la source du type \
                                WAVEFORM_CONSTANT ou WAVEFORM_SINUS est attendue.")
-            self.dictSourceHport[obj.get_sdname()]=texte
+            self.dictSourceHport[obj.getSdname()]=texte
             if self.debug: 
                 print texte
         except:
@@ -547,7 +547,7 @@ class CARMEL3DGenerator(PythonGenerator):
             else:
                print tr("ERREUR! Une forme de la source du type \
                                WAVEFORM_CONSTANT ou WAVEFORM_SINUS est attendue.")
-            self.dictSourceEport[obj.get_sdname()]=texte
+            self.dictSourceEport[obj.getSdname()]=texte
             if self.debug: 
                 print texte
         except:
@@ -561,14 +561,14 @@ class CARMEL3DGenerator(PythonGenerator):
       # constitution du bloc VERSION du fichier PHYS
       # creation d une entite  VERSION ; elle sera du type PROC car decrit ainsi
       # dans le du catalogue
-      version=obj.addentite('VERSION',pos=None)
+      version=obj.addEntite('VERSION',pos=None)
       self.generPROC_ETAPE(obj.etapes[0])
       self.texteCarmel3D+="["+obj.etapes[0].nom+"\n"
       for cle in obj.etapes[0].valeur :
           self.texteCarmel3D+="   "+cle+" "+str(obj.etapes[0].valeur[cle])+"\n"
       self.texteCarmel3D+="]\n"
       # destruction de l entite creee 
-      obj.suppentite(version)
+      obj.suppEntite(version)
 
 #----------------------------------------------------------------------------------------
    def generBLOC_MATERIALS(self) :
index 5c98cb5ad1d6c6122c14492c99541c45611faa69..05a3d85f216de30ae9b4add3c3fd0942d065025e 100644 (file)
@@ -68,7 +68,7 @@ class CARMEL3DTV0Generator(PythonGenerator):
       self.text=PythonGenerator.gener(self,obj,format)
 
       if self.debug:
-         print ("self.text = ", self.text)
+         print "self.text = %s" % self.text
 
       # Cette instruction genere le contenu du fichier de parametres pour le code Carmel3D
       # si le jdc est valide (sinon cela n a pas de sens)
@@ -77,7 +77,7 @@ class CARMEL3DTV0Generator(PythonGenerator):
              # constitution du bloc VERSION du fichier PHYS (existe toujours)
              self.generBLOC_VERSION(obj)
 
-           except ValueError as err:
+           except ValueError, err:
              raise ValueError(str(err))
 
       return self.text
@@ -181,11 +181,11 @@ class CARMEL3DTV0Generator(PythonGenerator):
         
         fileXML = os.path.join(repertory, 'configuration.xml') # nom du fichier de configuration XML (chemin complet)
         if self.debug: 
-            print ("\necriture du fichier XML : ", fileXML)
-            print ("self.dictMaterial = ",self.dictMaterial)
-            print ("self.dictSource = ",self.dictSource)
-            print ("self.dictGroupes = ",self.dictGroupes)
-            print ("self.dictMacroGroupes = ",self.dictMacroGroupes)
+            print "\necriture du fichier XML : ", fileXML
+            print "self.dictMaterial = ",self.dictMaterial
+            print "self.dictSource = ",self.dictSource
+            print "self.dictGroupes = ",self.dictGroupes
+            print "self.dictMacroGroupes = ",self.dictMacroGroupes
 
         root = ET.Element("configuration")
 
@@ -323,7 +323,7 @@ class CARMEL3DTV0Generator(PythonGenerator):
         #Bloc <TermeSourceElectrique>...</TermeSourceElectrique>
         TermeSourceElectrique=ET.SubElement(root, "TermeSourceElectrique")
         i=0 # ?
-        if self.debug: print ('self.dictSource = ',  self.dictSource)
+        if self.debug: print 'self.dictSource = ',  self.dictSource
         for source in self.dictSource.keys(): # parcours des sources
             if len(self.dictSource[source]['milieux']) > 0: # on continue si au moins un groupe de maillage, i.e., milieux est associé à cette source
                 if self.dictSource[source].has_key('STRANDED_INDUCTOR'): # inducteur bobiné
@@ -487,7 +487,7 @@ class CARMEL3DTV0Generator(PythonGenerator):
        # print "le dico complet=%s" %(self.dictGroupes)
 
         if self.debug: 
-            print ("ecriture du fichier d'execution (SH)")
+            print "ecriture du fichier d'execution (SH)"
         RepCarmel=os.path.join(repertory,"lancer.sh")
         f = open( RepCarmel, 'wb')
         self.texteCarmel3D_SH+='cd ' + repertory + ' \n'
@@ -506,12 +506,12 @@ class CARMEL3DTV0Generator(PythonGenerator):
    def generMCSIMP(self,obj) :
         """recuperation de l objet MCSIMP"""
         if self.debug: 
-            print ("MCSIMP", obj.nom, obj.valeur)
+            print "MCSIMP %(v_1)s  %(v_2)s" % {'v_1': obj.nom, "v_2": obj.valeur}
         s=PythonGenerator.generMCSIMP(self,obj)
         try:
             self.dicoCourant[obj.nom]=obj.valeurFormatee
         except:
-            print ("Oubli des messages texte homo='information'")
+            print "Oubli des messages texte homo='information'"
         return s
 
 
@@ -538,7 +538,7 @@ class CARMEL3DTV0Generator(PythonGenerator):
         obj.valeur=self.dicoEtapeCourant
 
         if self.debug: 
-            print ("PROC_ETAPE " ,obj.nom, str(obj.valeur))
+            print "PROC_ETAPE %(v_1)s  %(v_2)s" % {'v_1': unicode(obj.nom), "v_2": unicode(obj.valeur)}
         s=PythonGenerator.generPROC_ETAPE(self,obj)
         if obj.nom=="PARAMETERS" : self.generBLOC_PARAMETERS(obj)
         if obj.nom=="SOLVEUR" : self.generSOLVEUR(obj)
@@ -557,7 +557,7 @@ class CARMEL3DTV0Generator(PythonGenerator):
         s=PythonGenerator.generETAPE(self,obj)
         obj.valeur=self.dicoEtapeCourant
         if self.debug: 
-            print ("ETAPE " ,obj.nom, str(obj.valeur))
+            print "ETAPE : obj.nom = %(v_1)s , obj.valeur= %(v_2)s" % {'v_1': obj.nom, 'v_2': obj.valeur}
         if obj.nom=="MESHGROUP" : self.generMESHGROUP(obj)
         if obj.nom=="MATERIAL" : self.generMATERIAL(obj)
         if obj.nom=="SOURCE" : self.generSOURCE(obj)
@@ -577,7 +577,7 @@ class CARMEL3DTV0Generator(PythonGenerator):
         monGenerateur=generator.plugins[nomPlugin]()
         jdc_aux_texte=monGenerateur.gener(obj.jdc_aux)
         if self.debug: 
-            print ("jdc_aux_texte : ", jdc_aux_texte)
+            print "jdc_aux_texte : %s" % jdc_aux_texte
 
         # sauvegarde de tous les matériaux trouvés dans les bibliothèques INCLUDE
         for cle in monGenerateur.dictMaterial:
@@ -586,7 +586,7 @@ class CARMEL3DTV0Generator(PythonGenerator):
         for cle in monGenerateur.dictSource:
             self.dictSource[cle] = monGenerateur.dictSource[cle]
 
-        print ("________FIN MACRO______________________________________")
+        print "________FIN MACRO______________________________________"
         s=PythonGenerator.generMACRO_ETAPE(self,obj)
         return s
 
@@ -599,7 +599,7 @@ class CARMEL3DTV0Generator(PythonGenerator):
         """
         try:
             nomGroupe = obj.getSdname() # nom du groupe de maillage, i.e. nom du concept
-            print ("liste des noms sans prefixes", nomGroupe)
+            print "liste des noms sans prefixes %s" %(nomGroupe)
 
             # test: un et un seul nom de materiau ou source doit etre associe a ce groupe de maillage, via les cles MATERIAL et SOURCE, respectivement.
             # test sur un seul attribut, non pertinent car il peut y en avoir plusieurs.
@@ -608,7 +608,7 @@ class CARMEL3DTV0Generator(PythonGenerator):
             # on utilise le fait que obj.valeur est un dictionnaire
             self.dictGroupes[nomGroupe] = {}   
             if self.debug: 
-                print ("obj.valeur.keys()" , obj.valeur.keys())
+                print "obj.valeur.keys()= %s" % obj.valeur.keys()
             #if 'MATERIAL' in obj.valeur.keys() and 'SOURCE' in obj.valeur.keys(): # test d'erreur lors de presence de materiau et source a la fois
             #    raise ValueError,tr(" ce groupe de maillage %s est associe a au moins un materiau  et au moins une source." % nomGroupe)
             # association a un materiau
@@ -631,9 +631,9 @@ class CARMEL3DTV0Generator(PythonGenerator):
             #    self.dictGroupes['ordreDomaineJdC'].append(nomGroupe)
                 texte=""
                 texte+="%s"%(obj.valeur['Domaine'])
-                print ("le texte=", texte)
+                print"le texte=%s" %(texte)
                 self.dictDomaine[obj.getSdname()]=texte  
-                print ("liste des domaines " ,self.dictGroupes[nomGroupe]['DOMAINE'])
+                print "liste des domaines =%s" %(self.dictGroupes[nomGroupe]['DOMAINE'])
             if 'Potentiel_Flottant' in obj.valeur.keys():
                 self.dictGroupes[nomGroupe]['Potentiel_Flottant'] = True
             if 'Spire_Exploratrice' in obj.valeur.keys():
@@ -642,9 +642,9 @@ class CARMEL3DTV0Generator(PythonGenerator):
 #            else:
 #                raise ValueError, tr("ce groupe de maillage %s n'est associe a aucun materiau, source ou stranded_inductor_geometry." % nomGroupe)
             if self.debug:
-                print ("self.dictGroupes" , repr(self.dictGroupes))
-        except ValueError as err:
-            raise ValueError (str(err))
+                print "self.dictGroupes= %s" % repr(self.dictGroupes)
+        except ValueError, err:
+            raise ValueError, str(err)
 
    def generMACRO_GROUPE(self, obj):
         """preparation de la ligne NAME referencant le groupe de mailles 
@@ -653,11 +653,11 @@ class CARMEL3DTV0Generator(PythonGenerator):
         """
         try:
             nomMacroGroupe = obj.getSdname() # nom du macro groupe
-            print ("liste des noms sans prefixes " ,nomMacroGroupe)
+            print "liste des noms sans prefixes %s" %(nomMacroGroupe)
             self.dictMacroGroupes[nomMacroGroupe] = obj.valeur # sauvegarde des propriétés du macro-groupe
 
             if self.debug: 
-                print ("obj.valeur.keys()" , obj.valeur.keys())
+                print "obj.valeur.keys()= %s" % obj.valeur.keys()
             # association a une source
             if 'LISTE_MESHGROUP' in obj.valeur.keys(): # test de liste définie dans la macro-groupe, sinon erreur
                 listeGroupesMauvaisFormat = obj.valeur['LISTE_MESHGROUP'] # sauvegarde de l'association entre ce macro groupe et un materiau ou source, par son nom, i.e. nom du concept du materiau ou de la source
@@ -667,57 +667,56 @@ class CARMEL3DTV0Generator(PythonGenerator):
                     groupe = groupe.replace('"', "") # suppression des guillement doubles
                     self.dictMacroGroupes[nomMacroGroupe]['LISTE'].append(groupe) # sauvegarde du nom au formatage correct
             else:
-                raise ValueError (tr(" : ce MACRO_GROUPE doit contenir une liste de groupes LISTE_MESHGROUP."))
+                raise ValueError, nomMacroGroupe + tr(" : ce MACRO_GROUPE doit contenir une liste de groupes LISTE_MESHGROUP.")
 
             for nomGroupe in self.dictMacroGroupes[nomMacroGroupe]['LISTE']: # liste des groupes MESHGROUP de ce macro-groupe. On leur associe les propriétés du MACRO_GROUPE
                 for propriete in ('SOURCE', 'MATERIAL',  'STRANDED_INDUCTOR_GEOMETRY'): # liste des propriétés automatiques à copier du MACRO_GROUPE à chaque MESHGROUP de la liste
                     if  propriete in obj.valeur.keys(): # ce macro-groupe est associé à cette propriété
                         if self.dictGroupes[nomGroupe].has_key(propriete) and self.dictGroupes[nomGroupe][propriete] != self.dictGroupes[nomGroupe][propriete].nom: # erreur, ce meshgroup a déjà une telle propriéte définie, différente
-                            print ("ERREUR! Conflit entre la  MACRO_GROUPE et celle :  du MESHGROUP  associé à ce macro-groupe." ,\
-                             ( propriete, obj.valeur[propriete].nom,  nomMacroGroupe, self.dictGroupes[nomGroupe][propriete],  nomGroupe ))
-                            raise ValueError( propriete + ',' + obj.valeur[propriete].nom + ',' + nomMacroGroupe + ',' + self.dictGroupes[nomGroupe][propriete] + ',' +  nomGroupe\
-                            + tr(" : conflit entre la propriete (#1:#2) du MACRO_GROUPE (de nom #3) et celle (#4) du MESHGROUP (#5) associe a ce macro-groupe."))
+                            print u"ERREUR! Conflit entre la %s : %s du MACRO_GROUPE %s et celle : %s du MESHGROUP %s associé à ce macro-groupe." % \
+                             ( propriete, obj.valeur[propriete].nom,  nomMacroGroupe, self.dictGroupes[nomGroupe][propriete],  nomGroupe )
+                            raise ValueError, propriete + ',' + obj.valeur[propriete].nom + ',' + nomMacroGroupe + ',' + self.dictGroupes[nomGroupe][propriete] + ',' +  nomGroupe\
+                            + tr(" : conflit entre la propriete (#1:#2) du MACRO_GROUPE (de nom #3) et celle (#4) du MESHGROUP (#5) associe a ce macro-groupe.")
                         else : # pas de conflit de cette propriété, alors copie, meme si les propriétés sont les memes pour simplifier
                             self.dictGroupes[nomGroupe][propriete] = obj.valeur[propriete].nom # sauvegarde du nom de la propriété du macro-groupe dans le meshgroup
                 for propriete in ('CONDITION_LIMITE', ): # liste des propriétés définies à l'avance automatiques à copier du MACRO_GROUPE à chaque MESHGROUP de la liste
                     if  propriete in obj.valeur.keys(): # ce macro-groupe est associé à cette propriété
                         if self.dictGroupes[nomGroupe].has_key(propriete) and self.dictGroupes[nomGroupe][propriete] != self.dictGroupes[nomGroupe][propriete]: # erreur, ce meshgroup a déjà une telle propriéte définie, différente
-                            print ("ERREUR! Conflit entre la  MACRO_GROUPE et celle :  du MESHGROUP  associé à ce macro-groupe.") 
-                             #( propriete, obj.valeur[propriete],  nomMacroGroupe, self.dictGroupes[nomGroupe][propriete],  nomGroupe )
-                            #raise ValueError( propriete + ',' + obj.valeur[propriete].nom + ',' + nomMacroGroupe + ',' + self.dictGroupes[nomGroupe][propriete] + ',' +  nomGroupe\
-                            #+ tr(" : conflit entre la propriete (#1:#2) du MACRO_GROUPE (de nom #3) et celle (#4) du MESHGROUP (#5) associe a ce macro-groupe."))
-                            raise ValueError()
+                            print u"ERREUR! Conflit entre la %s : %s du MACRO_GROUPE %s et celle : %s du MESHGROUP %s associé à ce macro-groupe." % \
+                             ( propriete, obj.valeur[propriete],  nomMacroGroupe, self.dictGroupes[nomGroupe][propriete],  nomGroupe )
+                            raise ValueError, propriete + ',' + obj.valeur[propriete].nom + ',' + nomMacroGroupe + ',' + self.dictGroupes[nomGroupe][propriete] + ',' +  nomGroupe\
+                            + tr(" : conflit entre la propriete (#1:#2) du MACRO_GROUPE (de nom #3) et celle (#4) du MESHGROUP (#5) associe a ce macro-groupe.")
                         else : # pas de conflit de cette propriété, alors copie, meme si les propriétés sont les memes pour simplifier
                             self.dictGroupes[nomGroupe][propriete] = obj.valeur[propriete] # sauvegarde du nom de la propriété du macro-groupe dans le meshgroup
-        except ValueError as err:
-            raise ValueError( str(err))
+        except ValueError, err:
+            raise ValueError, str(err)
 
 
    def generSOLVEUR(self, obj):
         if self.debug:
-            print ("generation solveur", obj.valeur )
+            print "generation solveur obj.valeur = %s" % obj.valeur
         try :
             self.typeSolveur = obj.valeur['Type']
             if self.typeSolveur == "Solveur_lineaire" : self.generSOLVEUR_LINEAIRE(obj)
             if self.typeSolveur == "Solveur_non_lineaire" :
                 self.generSOLVEUR_LINEAIRE(obj)
                 self.generSOLVEUR_NON_LINEAIRE(obj)
-        except ValueError as  err:
-            raise ValueError( str(err))
+        except ValueError,  err:
+            raise ValueError,  str(err)
 
    def generSOLVEUR_LINEAIRE(self, obj):
         if self.debug:
-            print ("generation material" , obj.valeur    )
+            print "generation material obj.valeur = %s" % obj.valeur    
         try :
             nature = obj.valeur['Methode_lineaire']
             if nature =="Methode iterative BICGCR" : self.generMETHODE_ITERATIVE_BICGCR(obj)
             if nature  =="Methode directe MUMPS" : self.generMETHODE_DIRECTE_MUMPS(obj)
-        except ValueError as  err:
-            raise ValueError( str(err))
+        except ValueError,  err:
+            raise ValueError,  str(err)
 
    def generMETHODE_ITERATIVE_BICGCR(self, obj):
         if self.debug: 
-            print ("generation methode iterative BICGCR " , obj.valeur)
+            print "generation methode iterative BICGCR obj.valeur = %s" % obj.valeur
         self.kEpsilonGCP =  obj.valeur["Precision"]   
         self.precond=obj.valeur["Preconditionneur"]
         self.nbIterationMax=obj.valeur["Nombre_iterations_max"]
@@ -726,11 +725,11 @@ class CARMEL3DTV0Generator(PythonGenerator):
    def generMETHODE_DIRECTE_MUMPS(self, obj):
         texte=""
         if self.debug:
-            print ("_____________directe_____________")
+            print "_____________directe_____________"
 
    def generSOLVEUR_NON_LINEAIRE(self, obj):
         if self.debug: 
-            print ("generation solveur_non_lineaire",  obj.valeur)
+            print "generation solveur_non_lineaire obj.valeur = %s" % obj.valeur
         correspondance_methodeNonLineaire = {"Methode de Newton":2,"Methode de substitution":1} # correspondance sur la méthode non-linéaire entre le catalogue et le XML    
         self.methodeNonLineaire = correspondance_methodeNonLineaire[obj.valeur["Methode_non_lineaire"]]
         self.kEpsilonNonLinearite=obj.valeur["PrecisionNonLineaire"]
@@ -740,27 +739,27 @@ class CARMEL3DTV0Generator(PythonGenerator):
         """preparation du bloc correspondant a un materiau du fichier PHYS"""
         texte=""
         if self.debug: 
-            print ("generation material obj.valeur" , obj.valeur)
+            print "generation material obj.valeur = %s" % obj.valeur
         try :
             nomMaterial = obj.getSdname() 
             self.dictMaterial[nomMaterial]=obj.valeur
-            print ("self.dictMaterial=" ,self.dictMaterial)
-        except ValueError as  err:
-            raise ValueError( str(err))
+            print"self.dictMaterial=%s" %(self.dictMaterial)
+        except ValueError, err:
+            raise ValueError, str(err)
 #-------------------------------------------------------------------
 
    def generSOURCE(self,obj):
         """preparation du bloc correspondant a une source du fichier PHYS"""
         if self.debug: 
-            print ("generation source obj valeur " , obj.valeur)
+            print "generation source obj valeur = %s" % obj.valeur
         texte=""
         try :
             nomSource = obj.getSdname() 
             self.dictSource[nomSource]=obj.valeur # dictionnaire
             self.dictSource[nomSource]['milieux'] = [] # liste ordonnée des groupes associés à cette source
-            print ("mon dico des sources=" ,self.dictSource)
-        except ValueError as  err:
-            raise ValueError( str(err))
+            print"mon dico des sources=%s" %(self.dictSource)
+        except ValueError, err:
+            raise ValueError, str(err)
 
 #---------------------------------------------------------------------------------------
 # traitement fichier PHYS
@@ -783,7 +782,7 @@ class CARMEL3DTV0Generator(PythonGenerator):
 
    def generBLOC_PARAMETERS(self,obj):
         if self.debug: 
-            print ("generation parameters " , obj.valeur    )
+            print "generation parameters obj.valeur = %s" % obj.valeur    
 
         self.identification = obj.valeur["Identification_du_Modele"]
         self.fichierMaillage = obj.valeur["Fichier_maillage"]
@@ -802,17 +801,18 @@ class CARMEL3DTV0Generator(PythonGenerator):
 
    def generBLOC_SYMETRIE(self, obj): 
         if self.debug: 
-            print ("generation de la symetrie obj.valeur " , obj.valeur  )
+            print "generation de la symetrie obj.valeur = %s" % obj.valeur  
 
         try:
             self.listSymetrie.append(obj.valeur)
-        except ValueError as  err:
-            raise ValueError( str(err))
+            print"ma liste symetrie =%s" %(self.listSymetrie)
+        except ValueError, err:
+            raise ValueError, str(err)
 #----------------------------------------------------------------------------------------
 
    def generMOUVEMENT(self, obj):
         if self.debug:
-            print ("generation du mouvement obj.valeur " , obj.valeur  )
+            print "generation du mouvement obj.valeur = %s" % obj.valeur
         
         try:
             nom = obj.getSdname()
@@ -820,26 +820,26 @@ class CARMEL3DTV0Generator(PythonGenerator):
             self.dictMouvement[nom] = {'ordre': self.nombreMouvements, 'valeurs': obj.valeur}
             self.dictMouvement['ordre'].append(nom)
             if self.debug:
-                print ("self.dictMouvement " ,self.dictMouvement)
-                print ("self.nombreMouvements " ,self.nombreMouvements)
-        except ValueError as  err:
-            raise valueError(  str(err))
+                print "self.dictMouvement =%s" %(self.dictMouvement)
+                print "self.nombreMouvements =%i" %(self.nombreMouvements)
+        except ValueError,  err:
+            raise valueError,  str(err)
 #----------------------------------------------------------------------------------------
    def generSTRANDED_INDUCTOR_GEOMETRY(self, obj):
         """preparation du bloc STRANDED_INDUCTOR_GEOMETRY"""
         if self.debug: 
-            print ("generation strand obj valeur =" , obj.valeur)
+            print "generation strand obj valeur = %s" % obj.valeur
         try :
             nomStrand = obj.getSdname() 
             self.dictStrand[nomStrand]=obj.valeur
-            print ("mon dico des stranded inductor geometry" ,self.dictStrand)
+            print"mon dico des stranded inductor geometry=%s" %(self.dictStrand)
 
-        except ValueError as  err:
-            raise valueError(  str(err))
+        except ValueError, err:
+            raise ValueError, str(err)
 
    def generPOST_TRAITEMENT(self, obj):
         if self.debug: 
-            print ("generation post traitement obj.valeur " , obj.valeur    )
+            print "generation post traitement obj.valeur = %s" % obj.valeur    
         self.carteChamp=obj.valeur["Cartes_des_champs"]
         self.carteCourantInduit=obj.valeur["Cartes_des_courants_induits"]
         self.carteForce=obj.valeur["Cartes_des_forces"]
@@ -860,7 +860,8 @@ class CARMEL3DTV0Generator(PythonGenerator):
         3 formats possibles : 2 listes (anciennement tuples?)  et 1 nombre complexe
         """
         if self.debug:
-            print ("formatage")
+            print "formatage"
+            print "type : %(type_nb_c)s pour %(nb_c)s" % {'type_nb_c': type(nbC), 'nb_c': nbC}
         nbformate =""
         if isinstance(nbC,(tuple,list)):
             if nbC[0] == "'RI'" :
@@ -870,7 +871,7 @@ class CARMEL3DTV0Generator(PythonGenerator):
         else:
             nbformate = "COMPLEX " + str(nbC.real)+" "+str(nbC.imag)
         if self.debug: 
-            print ("nbformate " , nbformate)
+            print "nbformate : %s" % nbformate
         return nbformate
 
 
index 4e719c9f3f0d7ab7fba0c64af85fce73ab804fc8..9561c7baf93af8bbf554d421c6275449a1000498 100755 (executable)
@@ -292,7 +292,7 @@ class CARMELCNDGenerator(PythonGenerator):
         s=PythonGenerator.generMCSIMP(self,obj)
         if hasattr(obj.etape,'sdnom'): clef=obj.etape.sdnom+"____"
         else: clef=""
-        for i in obj.get_genealogie() :
+        for i in obj.getGenealogie() :
             clef=clef+"__"+i
         self.dictMCVal[clef]=obj.valeur
 
index 41a2d45c9d0f1641de3a783987256dd5c4d03084..4e4a2fcaed68063d310ce5c6a3b5497111ecfd25 100644 (file)
@@ -152,7 +152,7 @@ class CARMELCSGenerator(PythonGenerator):
 #        print 'generMCSIMP self.texteDico = ',self.texteDico
         if hasattr(obj.etape,'sdnom'): clef=obj.etape.sdnom+"____"
         else: clef=""
-        for i in obj.get_genealogie() :
+        for i in obj.getGenealogie() :
             clef=clef+"__"+i
         self.dictMCVal[clef]=obj.valeur
 
index 241d0bd9894e2a6f8f5b53dd7a90e04470f6b836..9dd9e09a8d2eaa60bc3d8873e9a5bbab21fade5c 100644 (file)
@@ -143,7 +143,7 @@ class SEPGenerator(PythonGenerator):
       Remplit le dictionnaire des MCSIMP si nous ne sommes ni dans une loi, ni dans une variable
       """
       clef=""
-      for i in obj.get_genealogie() :
+      for i in obj.getGenealogie() :
          clef=clef+"__"+i
       #self.dictMCVal[obj.nom]=obj.valeur
       self.dictMCVal[clef]=obj.valeur
index 057d738dda5948a49a96c500dbd9eb0697be1882..b8c57f12bde9747ff4ca21ee97b683cce4e0d5e9 100644 (file)
@@ -32,8 +32,8 @@ import traceback
 import types,re,os
 from Extensions.i18n import tr
 from .generator_python import PythonGenerator
-#ListeConcatene=('ridge_names','topo_names','geom_names','elset_names','faset_names','liset_names','nset_names','center','normal','dir')
-ListeConcatene=('ridge_names','topo_names','geom_names','elset_names','faset_names','liset_names','nset_names')
+#ListeConcatene=('ridge_names','topo_names','geom_names','elsetNames','fasetNames','lisetNames','nsetNames','center','normal','dir')
+ListeConcatene=('ridge_names','topo_names','geom_names','elsetNames','fasetNames','lisetNames','nsetNames')
 ListeConcatene2=('center','normal','dir')
 ListeConcatene3=('ra','rb')
 if_ellipse=False
index d544321fa40b8b96ddcb20094c2dd5f2733cc46a..cdde4e28fa625a794f6555c257ebb175348eb9b4 100644 (file)
@@ -96,7 +96,7 @@ class AsterGenerator:
          self.text=string.join(liste)
       elif format == 'beautifie':
          jdc_formate = Formatage(liste,sep=':',l_max=72)
-         self.text=jdc_formate.formate_jdc()
+         self.text=jdc_formate.formateJdc()
       else:
          raise EficasException(tr("Format pas implemente : %s", format))
       return self.text
@@ -262,7 +262,7 @@ class AsterGenerator:
             Methode particuliere pour les objets de type FORMULE
         """
         l=[]
-        nom = obj.get_nom()
+        nom = obj.getNom()
         if nom == '' : nom = 'sansnom'
         if len(obj.mc_liste)>0:
             l.append(nom + ' = FORMULE(')
@@ -463,7 +463,7 @@ class AsterGenerator:
           Convertit un objet derive d'ASSD en une chaine de caracteres à la
           syntaxe asterv5
       """
-      return obj.get_name()
+      return obj.getName()
 
    def generMCFACT(self,obj):
       """
index 94f901da7e7ba58fcb8519e6ecec39bba828d962..f7c97fc3dc34a1634282ee99452314d816c23301 100644 (file)
@@ -77,7 +77,7 @@ class Cuve2dgGenerator(PythonGenerator):
         "IncrementMaxTemperature" : "DTPREC",
         "ChoixExtractionTransitoires" : "CHOIEXTR",
         "IncrementMaxTempsAffichage" : "DTARCH",
-        "TraitementGeometrie" : "TYPEGEOM",
+        "traitementGeometrie" : "TYPEGEOM",
         "RayonInterne" : "RINT",
         "RayonInterne_mess" : "RINT_MESSAGE",
         "RayonExterne" : "REXT",
@@ -287,7 +287,7 @@ class Cuve2dgGenerator(PythonGenerator):
         "IncrementMaxTemperature" : "increment max de temp/noeud/instant (degC)",
         "ChoixExtractionTransitoires" : "choix d'extraction de transitoires de temp et contraintes",
         "IncrementMaxTempsAffichage" : "increment max de temps pour affichage (s)",
-        "TraitementGeometrie" : "traitement de la geometrie de la cuve : {GEOMETRIE, MAILLAGE}",
+        "traitementGeometrie" : "traitement de la geometrie de la cuve : {GEOMETRIE, MAILLAGE}",
         "RayonInterne" : "rayon interne (m)",
         "RayonInterne_mess" : "affichage ecran du rayon interne (m)",
         "RayonExterne" : "rayon externe (m)",
@@ -428,7 +428,7 @@ class Cuve2dgGenerator(PythonGenerator):
         "IncrementMaxTemperature" : "0.1",
         "ChoixExtractionTransitoires" : "NON",
         "IncrementMaxTempsAffichage" : "1000.",
-        "TraitementGeometrie" : "GEOMETRIE",
+        "traitementGeometrie" : "GEOMETRIE",
         "RayonInterne" : "1.994",
         "RayonInterne_mess" : "NON",
         "RayonExterne" : "2.2015",
@@ -568,7 +568,7 @@ class Cuve2dgGenerator(PythonGenerator):
         "IncrementMaxTemperature" : "OPTIONS",
         "ChoixExtractionTransitoires" : "OPTIONS",
         "IncrementMaxTempsAffichage" : "OPTIONS",
-        "TraitementGeometrie" : "DONNEES DE LA CUVE",
+        "traitementGeometrie" : "DONNEES DE LA CUVE",
         "RayonInterne" : "DONNEES DE LA CUVE",
         "RayonInterne_mess" : "DONNEES DE LA CUVE",
         "RayonExterne" : "DONNEES DE LA CUVE",
@@ -707,7 +707,7 @@ class Cuve2dgGenerator(PythonGenerator):
    def generMCSIMP(self,obj) :
        self.dico_mot[obj.nom]=obj.valeur
        clef=""
-       for i in obj.get_genealogie() :
+       for i in obj.getGenealogie() :
            clef=clef+"_"+i
        self.dico_genea[clef]=obj.valeur
        s=PythonGenerator.generMCSIMP(self,obj)
@@ -888,9 +888,9 @@ class Cuve2dgGenerator(PythonGenerator):
 
       # Rubrique DONNEES DE LA CUVE
       self.texteCuve += self.rubrique('DONNEES DE LA CUVE')
-      if self.dico_mot.has_key('TraitementGeometrie'):
-         self.texteCuve += self.affecteValeur('TraitementGeometrie', self.valeurproposee[str(self.dico_mot["TraitementGeometrie"])])
-         if str(self.dico_mot["TraitementGeometrie"])=='Topologie':
+      if self.dico_mot.has_key('traitementGeometrie'):
+         self.texteCuve += self.affecteValeur('traitementGeometrie', self.valeurproposee[str(self.dico_mot["traitementGeometrie"])])
+         if str(self.dico_mot["traitementGeometrie"])=='Topologie':
             self.texteCuve+="# - si MAILLAGE, fournir NBNO et liste des abscisses (m)"+"\n"
             self.texteCuve+="# - si GEOMETRIE, fournir (RINT, RINT_MESSAGE),"+"\n"
             self.texteCuve+="#                         (REXT, REXT_MESSAGE),"+"\n"
@@ -909,7 +909,7 @@ class Cuve2dgGenerator(PythonGenerator):
             self.texteCuve += self.ecritVariable('LigamentExterneMin_mess')
             self.texteCuve+="#"+"\n"
             self.texteCuve += self.ecritVariable('NombreNoeudsMaillage')
-         if str(self.dico_mot["TraitementGeometrie"])=='Maillage':
+         if str(self.dico_mot["traitementGeometrie"])=='Maillage':
             self.texteCuve+="# - si MAILLAGE, fournir NBNO et liste des abscisses (m)"+"\n"
             self.texteCuve+="# - si GEOMETRIE, fournir (RINT, RINT_MESSAGE),"+"\n"
             self.texteCuve+="#                         (REXT, REXT_MESSAGE),"+"\n"
@@ -920,7 +920,7 @@ class Cuve2dgGenerator(PythonGenerator):
             self.texteCuve += self.ecritVariable('NombreNoeudsMaillage')
             self.imprime(1,(self.dico_mot["ListeAbscisses"]))
       else :
-         self.texteCuve += self.affecteValeurDefaut('TraitementGeometrie')
+         self.texteCuve += self.affecteValeurDefaut('traitementGeometrie')
          self.texteCuve+="# - si MAILLAGE, fournir NBNO et liste des abscisses (m)"+"\n"
          self.texteCuve+="# - si GEOMETRIE, fournir (RINT, RINT_MESSAGE),"+"\n"
          self.texteCuve+="#                         (REXT, REXT_MESSAGE),"+"\n"
index dcbdc9e8754248f2ced691733e96ca14dc715265..40bc55b724bf19e3e489cc8f4b2f2f0f84fc7bb8 100644 (file)
@@ -76,7 +76,7 @@ class FileFromTemplateGenerator(PythonGenerator):
         """
         short_keyword = obj.nom.strip()
         long_keyword = ""
-        for i in obj.get_genealogie()[:-1]:
+        for i in obj.getGenealogie()[:-1]:
             long_keyword += i + "."
         long_keyword += short_keyword
         self.kw_dict[short_keyword] = obj.valeur
index 3fa2dd9bd66463ba86e5e1f8ee288f5bdf75d824..f1a60a9dc728aa1a280e45096e8d6498da149a2b 100644 (file)
@@ -87,7 +87,7 @@ class IniGenerator(object):
          Tous les mots-cles facteurs sont convertis en sections
          Un mot-cle facteur ne peut contenir que des mots-cles simples. Sinon => erreur
       """
-      liste_mcfact=[]
+      listeMcFact=[]
       sect_defaut=''
       if isinstance(obj,MCList):
         if len(obj.data) > 1:
@@ -100,9 +100,9 @@ class IniGenerator(object):
           if len(mocle.data) > 1:
             raise EficasException(tr("Pas supporte"))
           else:
-            liste_mcfact.append(self.generMCFACT(mocle.data[0]))
+            listeMcFact.append(self.generMCFACT(mocle.data[0]))
         elif isinstance(mocle,MCFACT):
-          liste_mcfact.append(self.generMCFACT(mocle))
+          listeMcFact.append(self.generMCFACT(mocle))
         elif isinstance(mocle,MCSIMP):
           sect_defaut=sect_defaut+self.generMCSIMP(mocle)
         else:
@@ -111,7 +111,7 @@ class IniGenerator(object):
       self.text=''
       if sect_defaut != '':
          self.text="[DEFAULT]\n"+sect_defaut
-      self.text=self.text + ''.join(liste_mcfact,'\n')
+      self.text=self.text + ''.join(listeMcFact,'\n')
       return self.text
 
    def generMCFACT(self,obj):
index bf0d063db9e891c2e5360178ec1c16e0c7ae49d7..bca30dc5faf120c56c4fc330c85843bbf84e37df 100644 (file)
@@ -84,7 +84,7 @@ class OpenturnsGenerator(PythonGenerator):
        Remplit le dictionnaire des MCSIMP si nous ne sommes ni dans une loi, ni dans une variable
        """
        s=PythonGenerator.generMCSIMP(self,obj)
-       if not( type(obj.valeur) in (list, tuple)) and (obj.get_min_max()[1] != 1):
+       if not( type(obj.valeur) in (list, tuple)) and (obj.getMinMax()[1] != 1):
           valeur=(obj.valeur,)
        else :
           valeur=obj.valeur
@@ -124,7 +124,7 @@ class OpenturnsGenerator(PythonGenerator):
 
    def genereXML(self):
        print "IDM: genereXML dans generator_openturns_wrapper.py"
-       #print "appli.CONFIGURATION=",self.appli.CONFIGURATION.__dict__
+       #print "appli.maConfiguration=",self.appli.maConfiguration.__dict__
        if self.listeFichiers != [] :
           self.dictMCVal["Files"]=self.listeFichiers
        print "dictMCVal", self.dictMCVal, "dictVariables", self.dictVariables
index ac9fcf9c29c24f6f77279f12db6c63d5a8522f78..0c51b249b45a3d8b5be6ad88730e1a9be8f6a83a 100644 (file)
@@ -73,7 +73,7 @@ class PythonGenerator(generator_python.PythonGenerator):
             Méthode particulière pour les objets de type FORMULE
         """
         l=[]
-        nom = obj.get_nom()
+        nom = obj.getNom()
         if nom == '' : nom = 'sansnom'
         l.append(nom + ' = FORMULE(')
         for v in obj.mc_liste: