From 5ef962a6122d6543da6e4d88f000babdd66a00ee Mon Sep 17 00:00:00 2001 From: "pascale.noyret" Date: Wed, 30 Sep 2020 10:48:51 +0200 Subject: [PATCH] report modif variees + patch CEA --- Accas/A_ASSD.py | 4 + Accas/A_ETAPE.py | 5 +- Accas/A_JDC.py | 2 +- Accas/A_MACRO_ETAPE.py | 2 +- Accas/A_MCBLOC.py | 2 +- Accas/A_MCFACT.py | 2 +- Accas/A_MCLIST.py | 2 +- Accas/A_MCSIMP.py | 2 +- Accas/A_PROC_ETAPE.py | 2 +- Accas/A_TUPLE.py | 16 + Accas/__init__.py | 8 +- Adao/configuration_Adao.py | 3 +- Editeur/Eficas_utils.py | 3 +- Editeur/Objecttreeitem.py | 31 +- Editeur/TroisDPal.py | 6 +- Editeur/__init__.py | 2 - Editeur/analyse_catalogue.py | 10 +- Editeur/catadesc.py | 87 +- Editeur/comploader.py | 6 +- Editeur/icons/ast-green-dark-ball.png | Bin 0 -> 248 bytes Editeur/listePatrons.py | 2 - Editeur/session.py | 60 +- Efi2Xsd/AccasXsd.py | 1033 ++++++++++++++-- Efi2Xsd/MCAccasXML.py | 533 +++++++++ Efi2Xsd/balisesXSD.py | 100 ++ Efi2Xsd/mapDesTypes.py | 7 +- Extensions/jdc_include.py | 8 +- Extensions/localisation.py | 17 +- Extensions/mcnuplet.py | 4 +- Extensions/nuplet.py | 4 +- Extensions/param2.py | 1 + Extensions/parametre.py | 17 +- Extensions/translationQT5.py | 14 +- Ihm/I_ASSD.py | 8 +- Ihm/I_A_CLASSER.py | 3 +- Ihm/I_ENTITE.py | 313 +++-- Ihm/I_ETAPE.py | 24 +- Ihm/I_FICHIER.py | 1 - Ihm/I_JDC.py | 141 +-- Ihm/I_MACRO_ETAPE.py | 94 +- Ihm/I_MCBLOC.py | 6 +- Ihm/I_MCCOMPO.py | 59 +- Ihm/I_MCFACT.py | 13 + Ihm/I_MCLIST.py | 7 +- Ihm/I_MCSIMP.py | 134 ++- Ihm/I_OBJECT.py | 25 + Ihm/I_REGLE.py | 16 +- InterfaceQT4/browser.py | 332 +++--- InterfaceQT4/compobloc.py | 5 - InterfaceQT4/compocomm.py | 3 +- InterfaceQT4/compofact.py | 39 +- InterfaceQT4/compojdc.py | 2 +- InterfaceQT4/compomacro.py | 40 +- InterfaceQT4/compomclist.py | 17 +- InterfaceQT4/compooper.py | 74 +- InterfaceQT4/composimp.py | 96 +- InterfaceQT4/configuration.py | 62 +- InterfaceQT4/editor.py | 71 +- InterfaceQT4/editorSsIhm.py | 176 +-- InterfaceQT4/eficas_go.py | 190 ++- InterfaceQT4/feuille.py | 2 +- InterfaceQT4/gereIcones.py | 5 +- InterfaceQT4/groupe.py | 18 +- InterfaceQT4/monBoutonValide.py | 6 +- InterfaceQT4/monChoixCode.py | 10 +- InterfaceQT4/monChoixCommande.py | 2 +- InterfaceQT4/monChoixLangue.py | 12 +- InterfaceQT4/monFonctionPanel.py | 1 - InterfaceQT4/monViewTexte.py | 3 +- InterfaceQT4/monWidgetBloc.py | 3 + InterfaceQT4/monWidgetCB.py | 17 +- InterfaceQT4/monWidgetCBIntoSug.py | 10 +- InterfaceQT4/monWidgetCommande.py | 121 +- InterfaceQT4/monWidgetCreeParam.py | 1 - InterfaceQT4/monWidgetCreeUserAssd.py | 184 +++ InterfaceQT4/monWidgetFact.py | 32 +- InterfaceQT4/monWidgetFactPlie.py | 5 +- InterfaceQT4/monWidgetInactif.py | 1 + InterfaceQT4/monWidgetIntoSug.py | 1 - InterfaceQT4/monWidgetMatrice.py | 3 +- InterfaceQT4/monWidgetNiveauFact.py | 1 + InterfaceQT4/monWidgetOptionnel.py | 4 +- InterfaceQT4/monWidgetParam.py | 3 +- .../monWidgetPlusieursASSDIntoOrdonne.py | 11 +- InterfaceQT4/monWidgetPlusieursBase.py | 179 ++- InterfaceQT4/monWidgetPlusieursInto.py | 5 +- InterfaceQT4/monWidgetPlusieursIntoOrdonne.py | 16 +- InterfaceQT4/monWidgetRadioButton.py | 1 - InterfaceQT4/monWidgetSimpBase.py | 14 +- InterfaceQT4/monWidgetSimpBool.py | 4 +- InterfaceQT4/monWidgetSimpTuple.py | 1 - InterfaceQT4/monWidgetTableau.py | 11 + InterfaceQT4/politiquesValidation.py | 8 +- InterfaceQT4/qtEficas.py | 1036 +---------------- InterfaceQT4/qtEficasSsIhm.py | 72 +- InterfaceQT4/qtSaisie.py | 25 +- InterfaceQT4/readercata.py | 205 ++-- InterfaceQT4/readercataXML.py | 13 +- Noyau/N_ASSD.py | 44 +- Noyau/N_BLOC.py | 22 +- Noyau/N_CO.py | 2 +- Noyau/N_CONVERT.py | 31 +- Noyau/N_ENTITE.py | 69 +- Noyau/N_ETAPE.py | 7 +- Noyau/N_FACT.py | 23 +- Noyau/N_GEOM.py | 6 +- Noyau/N_JDC.py | 141 +-- Noyau/N_JDC_CATA.py | 9 +- Noyau/N_MACRO.py | 2 +- Noyau/N_MACRO_ETAPE.py | 24 +- Noyau/N_MCCOMPO.py | 32 +- Noyau/N_MCFACT.py | 9 +- Noyau/N_MCSIMP.py | 103 +- Noyau/N_OBJECT.py | 6 +- Noyau/N_OPER.py | 2 + Noyau/N_SIMP.py | 95 +- Noyau/N_UserASSD.py | 125 ++ Noyau/N_VALIDATOR.py | 30 +- Noyau/N_utils.py | 2 +- Noyau/context.py | 24 + Noyau/nommage.py | 4 +- UiQT5/desChoixCode.ui | 24 +- UiQT5/desGroupeOptionnel.ui | 26 +- UiQT5/desPBOptionnelMT.ui | 4 +- UiQT5/desVisu.ui | 2 +- UiQT5/desWidgetBloc.ui | 2 +- UiQT5/desWidgetCommande.ui | 7 +- UiQT5/desWidgetFact.ui | 3 +- UiQT5/desWidgetFactPlie.ui | 2 +- UiQT5/desWidgetPlusieursInto.ui | 33 +- UiQT5/desWidgetTableau.ui | 9 +- UiQT5/eficas_en.qm | Bin 0 -> 80792 bytes UiQT5/eficas_en.ts | 836 ++++++------- UiQT5/eficas_fr.qm | Bin 0 -> 23 bytes convert/autre_parseur.py | 2 +- convert/convert_TELEMAC.py | 21 +- convert/convert_XML.py | 3 +- convert/convert_dico.py | 2 +- convert/convert_pyth.py | 2 +- convert/convert_python.py | 4 +- convert/old/convert_openturns_study.py | 10 +- convert/old/convert_openturns_wrapper.py | 2 +- convert/parseur_python.py | 22 +- generator/Formatage.py | 15 +- generator/generator_PSEN.py | 3 +- generator/generator_ProcessOutputs.py | 2 +- generator/generator_TELEMAC.py | 16 +- generator/generator_XML.py | 50 +- generator/generator_aplat.py | 2 +- generator/generator_dico.py | 5 +- generator/generator_dicoImbrique.py | 2 +- generator/generator_map.py | 2 +- generator/generator_mapVP.py | 238 ++++ generator/generator_python.py | 36 +- generator/generator_vers3DSalome.py | 2 +- generator/oldCodes/OpenturnsSTD.py | 64 +- generator/oldCodes/generator_CARMEL3D.py | 42 +- .../oldCodes/generator_CARMEL3D_temporel.py | 139 +-- generator/oldCodes/generator_CARMELCND.py | 2 +- generator/oldCodes/generator_CARMELCS.py | 2 +- generator/oldCodes/generator_SEP.py | 2 +- generator/oldCodes/generator_ZCracks.py | 4 +- generator/oldCodes/generator_asterv5.py | 6 +- generator/oldCodes/generator_cuve2dg.py | 20 +- .../oldCodes/generator_file_from_template.py | 2 +- generator/oldCodes/generator_ini.py | 8 +- .../oldCodes/generator_openturns_wrapper.py | 4 +- generator/oldCodes/generator_python6.py | 2 +- 168 files changed, 5112 insertions(+), 3378 deletions(-) create mode 100644 Accas/A_TUPLE.py create mode 100644 Editeur/icons/ast-green-dark-ball.png create mode 100755 Efi2Xsd/MCAccasXML.py create mode 100644 Efi2Xsd/balisesXSD.py mode change 100644 => 100755 InterfaceQT4/editorSsIhm.py create mode 100644 InterfaceQT4/monWidgetCreeUserAssd.py create mode 100644 Noyau/N_UserASSD.py create mode 100644 UiQT5/eficas_en.qm create mode 100644 UiQT5/eficas_fr.qm create mode 100644 generator/generator_mapVP.py diff --git a/Accas/A_ASSD.py b/Accas/A_ASSD.py index afa935fa..22c98794 100644 --- a/Accas/A_ASSD.py +++ b/Accas/A_ASSD.py @@ -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 + + diff --git a/Accas/A_ETAPE.py b/Accas/A_ETAPE.py index a3dbd595..11dc12de 100644 --- a/Accas/A_ETAPE.py +++ b/Accas/A_ETAPE.py @@ -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) diff --git a/Accas/A_JDC.py b/Accas/A_JDC.py index d17bd234..3748913d 100644 --- a/Accas/A_JDC.py +++ b/Accas/A_JDC.py @@ -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 diff --git a/Accas/A_MACRO_ETAPE.py b/Accas/A_MACRO_ETAPE.py index 2bba807e..28a3ce74 100644 --- a/Accas/A_MACRO_ETAPE.py +++ b/Accas/A_MACRO_ETAPE.py @@ -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, diff --git a/Accas/A_MCBLOC.py b/Accas/A_MCBLOC.py index df125d12..5bd5cebd 100644 --- a/Accas/A_MCBLOC.py +++ b/Accas/A_MCBLOC.py @@ -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): diff --git a/Accas/A_MCFACT.py b/Accas/A_MCFACT.py index 50fd1a8d..769dcd28 100644 --- a/Accas/A_MCFACT.py +++ b/Accas/A_MCFACT.py @@ -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): diff --git a/Accas/A_MCLIST.py b/Accas/A_MCLIST.py index 5554f5ec..922abb89 100644 --- a/Accas/A_MCLIST.py +++ b/Accas/A_MCLIST.py @@ -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): diff --git a/Accas/A_MCSIMP.py b/Accas/A_MCSIMP.py index a3c63cb6..7c7ecbca 100644 --- a/Accas/A_MCSIMP.py +++ b/Accas/A_MCSIMP.py @@ -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): diff --git a/Accas/A_PROC_ETAPE.py b/Accas/A_PROC_ETAPE.py index 7db1db8b..6fdd8361 100644 --- a/Accas/A_PROC_ETAPE.py +++ b/Accas/A_PROC_ETAPE.py @@ -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 index 00000000..4cbd14e3 --- /dev/null +++ b/Accas/A_TUPLE.py @@ -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 + diff --git a/Accas/__init__.py b/Accas/__init__.py index eadd2bb2..52682045 100644 --- a/Accas/__init__.py +++ b/Accas/__init__.py @@ -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 diff --git a/Adao/configuration_Adao.py b/Adao/configuration_Adao.py index 02bd5390..735905fb 100644 --- a/Adao/configuration_Adao.py +++ b/Adao/configuration_Adao.py @@ -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" diff --git a/Editeur/Eficas_utils.py b/Editeur/Eficas_utils.py index 89c601c5..80951e03 100644 --- a/Editeur/Eficas_utils.py +++ b/Editeur/Eficas_utils.py @@ -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)) diff --git a/Editeur/Objecttreeitem.py b/Editeur/Objecttreeitem.py index 7d419ca9..b0b6641a 100644 --- a/Editeur/Objecttreeitem.py +++ b/Editeur/Objecttreeitem.py @@ -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) diff --git a/Editeur/TroisDPal.py b/Editeur/TroisDPal.py index 6d42efa0..5fc0d085 100644 --- a/Editeur/TroisDPal.py +++ b/Editeur/TroisDPal.py @@ -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() diff --git a/Editeur/__init__.py b/Editeur/__init__.py index b32d290b..266bf453 100644 --- a/Editeur/__init__.py +++ b/Editeur/__init__.py @@ -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 """ diff --git a/Editeur/analyse_catalogue.py b/Editeur/analyse_catalogue.py index c9974282..51f1cf84 100644 --- a/Editeur/analyse_catalogue.py +++ b/Editeur/analyse_catalogue.py @@ -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() diff --git a/Editeur/catadesc.py b/Editeur/catadesc.py index 89b70599..7f3ffeae 100644 --- a/Editeur/catadesc.py +++ b/Editeur/catadesc.py @@ -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 diff --git a/Editeur/comploader.py b/Editeur/comploader.py index 40ba093f..5f240ae0 100644 --- a/Editeur/comploader.py +++ b/Editeur/comploader.py @@ -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 index 0000000000000000000000000000000000000000..6fc9d5b5a6419294ed6fbedcb1bfba3514f07a1b GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv@!3HGlXG}j1q}Y|gW!U_%O?XxI14-? ziy0WWfl9fB85w5HkpK#^mw5WRvOnZu<1^8lW6GQX6f!MwjVN)>&&^HED`8Mj@XRg9 zFDgk*QAjJw&sB&B@KwmnO-xUN(P0iCyO3ca8t0>4#Y?xUOG{D8v#WBR< zbaH~knuduDf9iv-7(X&yVkI29rPL~}wkLwu$(%*jf#>Lj(=MkCl;3FCtXsV5G~4<_ lXLYlc^D<7J^HXMFV7S5{DAXon9Sby%!PC{xWt~$(69DT;N}&J% literal 0 HcmV?d00001 diff --git a/Editeur/listePatrons.py b/Editeur/listePatrons.py index f1cf08b4..2a305736 100644 --- a/Editeur/listePatrons.py +++ b/Editeur/listePatrons.py @@ -18,12 +18,10 @@ # 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"}}, diff --git a/Editeur/session.py b/Editeur/session.py index ebbf40a9..0fcad780 100644 --- a/Editeur/session.py +++ b/Editeur/session.py @@ -21,10 +21,10 @@ 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 diff --git a/Efi2Xsd/AccasXsd.py b/Efi2Xsd/AccasXsd.py index a9d7e576..7954f4d0 100755 --- a/Efi2Xsd/AccasXsd.py +++ b/Efi2Xsd/AccasXsd.py @@ -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 index 00000000..9921c1d0 --- /dev/null +++ b/Efi2Xsd/MCAccasXML.py @@ -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 index 00000000..ffff4879 --- /dev/null +++ b/Efi2Xsd/balisesXSD.py @@ -0,0 +1,100 @@ +texteDebut='\n\n' +texteDebutNiveau2='\n\n' +texteDebutNiveau3='\n\n' +texteFin='' + +# SIMP +debutSimpleType = '\t\n' +debutSimpleTypeSsNom = '\t\n' +fermeSimpleType = '\t\n' +debutRestrictionBase = '\t\t\n' +fermeRestrictionBase = '\t\t\n' +enumeration = '\t\t\t\n' +maxInclusiveBorne = '\t\t\t\n' +minInclusiveBorne = '\t\t\t\n' + +debutTypeSimpleListe = '\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n' +finTypeSimpleListe = '\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n' +fermeBalisesMileu = '\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t \n' + +maxLengthTypeSimple = '\t\t\t\n' +minLengthTypeSimple = '\t\t\t\n' +eltDsSequence = '\t\t\t\n' +eltWithDefautDsSequence = '\t\t\t\n' +UsingASSDkeyRefDeclaration = '\n\t \n\t\t\n\t\t\n\t\n' +# +# +# +# + + # + # + + + + +# COMPO +debutTypeCompo = '\t\n' +debutTypeCompoEtape = '\t \n\t \n' +finTypeCompoEtape = '\t \n\t \n' +debutTypeCompoSeq = '\t\t\n' +finTypeCompoSeq = '\t\t\n' +finTypeCompo = '\t\n' +eltCompoDsSequence = '\t\t\t\n' +#eltCompoDsSequenceInExtension = '\t\t\t\n' + +# ETAPE +eltEtape = '\t\n' + +# BLOC +debutTypeSubst = '\t \n\t\t\n' +finTypeSubst = '\t\t\n\t\n' +substDsSequence = '\t\t\t\n' +#choiceDsBloc = '\t\t\t\n' +debutChoiceDsBloc = '\n' +debutChoiceDsBlocAvecMin = '\n' +finChoiceDsBloc = '\n' +debSequenceDsBloc = '\n' +finSequenceDsBloc = '\n' +debutTypeSubstDsBlocFactorise = '\t\n' +finTypeSubstDsBlocFactorise = '\t\n' +debutUnion = '\t\t\t\n' +finUnion = '\t\t\t\n' + + + +# User OR ASSD +operAttributeName = '\t\t\n' +attributeTypeForASSD = '\t\t\n' +attributeTypeUtilisateurName = '\t\t\n' +producingASSDkeyRefDeclaration='\t\n\t\t\n\t\t\n\t\n' +texteFieldUnitaire="./{}:{}/@name |" + +# CATA +debutTypeCata = '\t\n\t\t\n' +debutTypeCataExtension = '\t\n' +finTypeCata = '\t\t\n\t\n' +finSchema = '' +#eltCata = '\t\n' +#eltCodeSpecDsCata = '\t\t\t\n' +#fermeEltCata = '\t\n' +includeCata = '\n\n' + + +# EXTENSION +debutExtension = '\t\t\n\t\t\n\t\t\n' +finExtension = '\t\t\n\t\t\n\t\t\n' + +# TYPE ABSTRAIT +eltAbstraitCataPPal = '\t\n' +eltAbstraitCataFils = '\t\n\t\t\n\t\t\t\n\t\t\n\t\n' +eltCataPPal = '\t\n' +eltCataFils = '\t\n' +eltCata = '\t\n\t\t\n\t\t \n\t\t\t\n\t\t \n\t\t\n' + +#\n\t\n' +#implementeAbstrait = '\t\n' + +if __name__ == '__main__' : + print ('ne fait rien') + diff --git a/Efi2Xsd/mapDesTypes.py b/Efi2Xsd/mapDesTypes.py index d90cbc12..4667b08b 100755 --- a/Efi2Xsd/mapDesTypes.py +++ b/Efi2Xsd/mapDesTypes.py @@ -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' ) diff --git a/Extensions/jdc_include.py b/Extensions/jdc_include.py index b6fe4fe2..98467da9 100644 --- a/Extensions/jdc_include.py +++ b/Extensions/jdc_include.py @@ -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 diff --git a/Extensions/localisation.py b/Extensions/localisation.py index 24757be5..1cee811e 100644 --- a/Extensions/localisation.py +++ b/Extensions/localisation.py @@ -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: diff --git a/Extensions/mcnuplet.py b/Extensions/mcnuplet.py index 81e623d3..1078fb27 100644 --- a/Extensions/mcnuplet.py +++ b/Extensions/mcnuplet.py @@ -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 diff --git a/Extensions/nuplet.py b/Extensions/nuplet.py index fad34c6d..465c6f01 100644 --- a/Extensions/nuplet.py +++ b/Extensions/nuplet.py @@ -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() diff --git a/Extensions/param2.py b/Extensions/param2.py index fa5ea0db..cc198709 100644 --- a/Extensions/param2.py +++ b/Extensions/param2.py @@ -25,6 +25,7 @@ try : except : pass import math import types +# PNPN a resorber import six try: diff --git a/Extensions/parametre.py b/Extensions/parametre.py index 5ab01bab..9f5bb93d 100644 --- a/Extensions/parametre.py +++ b/Extensions/parametre.py @@ -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 diff --git a/Extensions/translationQT5.py b/Extensions/translationQT5.py index e8116f5f..cc763f92 100644 --- a/Extensions/translationQT5.py +++ b/Extensions/translationQT5.py @@ -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)) diff --git a/Ihm/I_ASSD.py b/Ihm/I_ASSD.py index ba384b0e..a3359c53 100644 --- a/Ihm/I_ASSD.py +++ b/Ihm/I_ASSD.py @@ -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 "" - #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 diff --git a/Ihm/I_A_CLASSER.py b/Ihm/I_A_CLASSER.py index aa46e117..389869c4 100644 --- a/Ihm/I_A_CLASSER.py +++ b/Ihm/I_A_CLASSER.py @@ -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 diff --git a/Ihm/I_ENTITE.py b/Ihm/I_ENTITE.py index 922f8796..f29bda01 100644 --- a/Ihm/I_ENTITE.py +++ b/Ihm/I_ENTITE.py @@ -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) +# diff --git a/Ihm/I_ETAPE.py b/Ihm/I_ETAPE.py index 43bbbb8f..06fc8935 100644 --- a/Ihm/I_ETAPE.py +++ b/Ihm/I_ETAPE.py @@ -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 diff --git a/Ihm/I_FICHIER.py b/Ihm/I_FICHIER.py index 31b12cae..94478178 100644 --- a/Ihm/I_FICHIER.py +++ b/Ihm/I_FICHIER.py @@ -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 diff --git a/Ihm/I_JDC.py b/Ihm/I_JDC.py index 4cd44491..c0db8261 100644 --- a/Ihm/I_JDC.py +++ b/Ihm/I_JDC.py @@ -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: diff --git a/Ihm/I_MACRO_ETAPE.py b/Ihm/I_MACRO_ETAPE.py index 1503f3d4..2f4771f1 100644 --- a/Ihm/I_MACRO_ETAPE.py +++ b/Ihm/I_MACRO_ETAPE.py @@ -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={} diff --git a/Ihm/I_MCBLOC.py b/Ihm/I_MCBLOC.py index 46f53502..19a2690e 100644 --- a/Ihm/I_MCBLOC.py +++ b/Ihm/I_MCBLOC.py @@ -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() + diff --git a/Ihm/I_MCCOMPO.py b/Ihm/I_MCCOMPO.py index cf92a936..f856657d 100644 --- a/Ihm/I_MCCOMPO.py +++ b/Ihm/I_MCCOMPO.py @@ -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") + diff --git a/Ihm/I_MCFACT.py b/Ihm/I_MCFACT.py index b0d49fe9..a95eba45 100644 --- a/Ihm/I_MCFACT.py +++ b/Ihm/I_MCFACT.py @@ -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): """ diff --git a/Ihm/I_MCLIST.py b/Ihm/I_MCLIST.py index 84792a8d..17f5da40 100644 --- a/Ihm/I_MCLIST.py +++ b/Ihm/I_MCLIST.py @@ -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 diff --git a/Ihm/I_MCSIMP.py b/Ihm/I_MCSIMP.py index 15462a1d..eef48d84 100644 --- a/Ihm/I_MCSIMP.py +++ b/Ihm/I_MCSIMP.py @@ -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") + diff --git a/Ihm/I_OBJECT.py b/Ihm/I_OBJECT.py index 1013aaf3..56b08c19 100644 --- a/Ihm/I_OBJECT.py +++ b/Ihm/I_OBJECT.py @@ -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 diff --git a/Ihm/I_REGLE.py b/Ihm/I_REGLE.py index 56e1febf..b0f19adc 100644 --- a/Ihm/I_REGLE.py +++ b/Ihm/I_REGLE.py @@ -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 diff --git a/InterfaceQT4/browser.py b/InterfaceQT4/browser.py index 76230250..64ee7d2d 100644 --- a/InterfaceQT4/browser.py +++ b/InterfaceQT4/browser.py @@ -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 diff --git a/InterfaceQT4/compobloc.py b/InterfaceQT4/compobloc.py index f41f7c07..a05c21e8 100644 --- a/InterfaceQT4/compobloc.py +++ b/InterfaceQT4/compobloc.py @@ -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 diff --git a/InterfaceQT4/compocomm.py b/InterfaceQT4/compocomm.py index 8a83ce8f..8c501b79 100644 --- a/InterfaceQT4/compocomm.py +++ b/InterfaceQT4/compocomm.py @@ -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 diff --git a/InterfaceQT4/compofact.py b/InterfaceQT4/compofact.py index 8a9d66fb..57dd1df8 100644 --- a/InterfaceQT4/compofact.py +++ b/InterfaceQT4/compofact.py @@ -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')) diff --git a/InterfaceQT4/compojdc.py b/InterfaceQT4/compojdc.py index 111a4e98..87121de4 100644 --- a/InterfaceQT4/compojdc.py +++ b/InterfaceQT4/compojdc.py @@ -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 diff --git a/InterfaceQT4/compomacro.py b/InterfaceQT4/compomacro.py index 64a9d63f..9a1fcbb2 100644 --- a/InterfaceQT4/compomacro.py +++ b/InterfaceQT4/compomacro.py @@ -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 diff --git a/InterfaceQT4/compomclist.py b/InterfaceQT4/compomclist.py index 7035e14b..c37efb07 100644 --- a/InterfaceQT4/compomclist.py +++ b/InterfaceQT4/compomclist.py @@ -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) diff --git a/InterfaceQT4/compooper.py b/InterfaceQT4/compooper.py index c03704bf..b8f4aafe 100644 --- a/InterfaceQT4/compooper.py +++ b/InterfaceQT4/compooper.py @@ -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 diff --git a/InterfaceQT4/composimp.py b/InterfaceQT4/composimp.py index cf26ced0..c550b15e 100644 --- a/InterfaceQT4/composimp.py +++ b/InterfaceQT4/composimp.py @@ -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: diff --git a/InterfaceQT4/configuration.py b/InterfaceQT4/configuration.py index d8eefdc8..6b4aab48 100644 --- a/InterfaceQT4/configuration.py +++ b/InterfaceQT4/configuration.py @@ -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) diff --git a/InterfaceQT4/editor.py b/InterfaceQT4/editor.py index 8db32eb9..e9ab3864 100755 --- a/InterfaceQT4/editor.py +++ b/InterfaceQT4/editor.py @@ -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 %s 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() diff --git a/InterfaceQT4/editorSsIhm.py b/InterfaceQT4/editorSsIhm.py old mode 100644 new mode 100755 index d6b507c0..d6f8b9d4 --- a/InterfaceQT4/editorSsIhm.py +++ b/InterfaceQT4/editorSsIhm.py @@ -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) diff --git a/InterfaceQT4/eficas_go.py b/InterfaceQT4/eficas_go.py index 0bd3abfb..763af011 100755 --- a/InterfaceQT4/eficas_go.py +++ b/InterfaceQT4/eficas_go.py @@ -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) diff --git a/InterfaceQT4/feuille.py b/InterfaceQT4/feuille.py index bd1c1d68..41dc13fa 100644 --- a/InterfaceQT4/feuille.py +++ b/InterfaceQT4/feuille.py @@ -174,12 +174,12 @@ class Feuille(QWidget,ContientIcones,SaisieValeur,FacultatifOuOptionnel): #c=str('

')+c+"

" c=str('

')+c+"

" 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() diff --git a/InterfaceQT4/gereIcones.py b/InterfaceQT4/gereIcones.py index 13b31b09..26ba38f4 100644 --- a/InterfaceQT4/gereIcones.py +++ b/InterfaceQT4/gereIcones.py @@ -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() diff --git a/InterfaceQT4/groupe.py b/InterfaceQT4/groupe.py index 55b66eec..e7d20873 100644 --- a/InterfaceQT4/groupe.py +++ b/InterfaceQT4/groupe.py @@ -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) + diff --git a/InterfaceQT4/monBoutonValide.py b/InterfaceQT4/monBoutonValide.py index 335d1644..78864707 100644 --- a/InterfaceQT4/monBoutonValide.py +++ b/InterfaceQT4/monBoutonValide.py @@ -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 diff --git a/InterfaceQT4/monChoixCode.py b/InterfaceQT4/monChoixCode.py index 59fc6098..a5a2ddcc 100644 --- a/InterfaceQT4/monChoixCode.py +++ b/InterfaceQT4/monChoixCode.py @@ -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) diff --git a/InterfaceQT4/monChoixCommande.py b/InterfaceQT4/monChoixCommande.py index 7d41beec..990fc1c0 100644 --- a/InterfaceQT4/monChoixCommande.py +++ b/InterfaceQT4/monChoixCommande.py @@ -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) diff --git a/InterfaceQT4/monChoixLangue.py b/InterfaceQT4/monChoixLangue.py index ed44719f..decc00be 100644 --- a/InterfaceQT4/monChoixLangue.py +++ b/InterfaceQT4/monChoixLangue.py @@ -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() diff --git a/InterfaceQT4/monFonctionPanel.py b/InterfaceQT4/monFonctionPanel.py index 31cc2245..93dd4102 100644 --- a/InterfaceQT4/monFonctionPanel.py +++ b/InterfaceQT4/monFonctionPanel.py @@ -25,7 +25,6 @@ try : except : pass import types,os -from six.moves import range from PyQt5.QtCore import Qt diff --git a/InterfaceQT4/monViewTexte.py b/InterfaceQT4/monViewTexte.py index 0c167c9b..c57813ab 100644 --- a/InterfaceQT4/monViewTexte.py +++ b/InterfaceQT4/monViewTexte.py @@ -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: diff --git a/InterfaceQT4/monWidgetBloc.py b/InterfaceQT4/monWidgetBloc.py index 1dc33526..1f656d4f 100644 --- a/InterfaceQT4/monWidgetBloc.py +++ b/InterfaceQT4/monWidgetBloc.py @@ -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 diff --git a/InterfaceQT4/monWidgetCB.py b/InterfaceQT4/monWidgetCB.py index a23b51fc..3e12bb6b 100644 --- a/InterfaceQT4/monWidgetCB.py +++ b/InterfaceQT4/monWidgetCB.py @@ -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) diff --git a/InterfaceQT4/monWidgetCBIntoSug.py b/InterfaceQT4/monWidgetCBIntoSug.py index c2e71c7a..8075451d 100644 --- a/InterfaceQT4/monWidgetCBIntoSug.py +++ b/InterfaceQT4/monWidgetCBIntoSug.py @@ -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)); diff --git a/InterfaceQT4/monWidgetCommande.py b/InterfaceQT4/monWidgetCommande.py index 9c381ab8..54ab0e55 100644 --- a/InterfaceQT4/monWidgetCommande.py +++ b/InterfaceQT4/monWidgetCommande.py @@ -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 + + diff --git a/InterfaceQT4/monWidgetCreeParam.py b/InterfaceQT4/monWidgetCreeParam.py index a46ebddc..d53025c1 100644 --- a/InterfaceQT4/monWidgetCreeParam.py +++ b/InterfaceQT4/monWidgetCreeParam.py @@ -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 index 00000000..ba6cd4b9 --- /dev/null +++ b/InterfaceQT4/monWidgetCreeUserAssd.py @@ -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) + diff --git a/InterfaceQT4/monWidgetFact.py b/InterfaceQT4/monWidgetFact.py index d756cb28..c6758b39 100644 --- a/InterfaceQT4/monWidgetFact.py +++ b/InterfaceQT4/monWidgetFact.py @@ -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) diff --git a/InterfaceQT4/monWidgetFactPlie.py b/InterfaceQT4/monWidgetFactPlie.py index 17d79b58..e479f312 100644 --- a/InterfaceQT4/monWidgetFactPlie.py +++ b/InterfaceQT4/monWidgetFactPlie.py @@ -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 diff --git a/InterfaceQT4/monWidgetInactif.py b/InterfaceQT4/monWidgetInactif.py index ba8696db..db3657af 100644 --- a/InterfaceQT4/monWidgetInactif.py +++ b/InterfaceQT4/monWidgetInactif.py @@ -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) diff --git a/InterfaceQT4/monWidgetIntoSug.py b/InterfaceQT4/monWidgetIntoSug.py index afb8f74a..42c72358 100644 --- a/InterfaceQT4/monWidgetIntoSug.py +++ b/InterfaceQT4/monWidgetIntoSug.py @@ -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 diff --git a/InterfaceQT4/monWidgetMatrice.py b/InterfaceQT4/monWidgetMatrice.py index 0acfb209..843da9aa 100644 --- a/InterfaceQT4/monWidgetMatrice.py +++ b/InterfaceQT4/monWidgetMatrice.py @@ -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) diff --git a/InterfaceQT4/monWidgetNiveauFact.py b/InterfaceQT4/monWidgetNiveauFact.py index 236ab677..b3a7f27f 100644 --- a/InterfaceQT4/monWidgetNiveauFact.py +++ b/InterfaceQT4/monWidgetNiveauFact.py @@ -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 : diff --git a/InterfaceQT4/monWidgetOptionnel.py b/InterfaceQT4/monWidgetOptionnel.py index 904e5841..c698206a 100644 --- a/InterfaceQT4/monWidgetOptionnel.py +++ b/InterfaceQT4/monWidgetOptionnel.py @@ -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() diff --git a/InterfaceQT4/monWidgetParam.py b/InterfaceQT4/monWidgetParam.py index 287e5ee1..cb799fe5 100644 --- a/InterfaceQT4/monWidgetParam.py +++ b/InterfaceQT4/monWidgetParam.py @@ -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 ")) diff --git a/InterfaceQT4/monWidgetPlusieursASSDIntoOrdonne.py b/InterfaceQT4/monWidgetPlusieursASSDIntoOrdonne.py index 3498fe85..172a5cf6 100644 --- a/InterfaceQT4/monWidgetPlusieursASSDIntoOrdonne.py +++ b/InterfaceQT4/monWidgetPlusieursASSDIntoOrdonne.py @@ -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)): diff --git a/InterfaceQT4/monWidgetPlusieursBase.py b/InterfaceQT4/monWidgetPlusieursBase.py index 486ae7d5..3fd6d90c 100644 --- a/InterfaceQT4/monWidgetPlusieursBase.py +++ b/InterfaceQT4/monWidgetPlusieursBase.py @@ -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 diff --git a/InterfaceQT4/monWidgetPlusieursInto.py b/InterfaceQT4/monWidgetPlusieursInto.py index 16c3fbdd..f54ec53d 100644 --- a/InterfaceQT4/monWidgetPlusieursInto.py +++ b/InterfaceQT4/monWidgetPlusieursInto.py @@ -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() diff --git a/InterfaceQT4/monWidgetPlusieursIntoOrdonne.py b/InterfaceQT4/monWidgetPlusieursIntoOrdonne.py index d7f78f30..06bc5753 100644 --- a/InterfaceQT4/monWidgetPlusieursIntoOrdonne.py +++ b/InterfaceQT4/monWidgetPlusieursIntoOrdonne.py @@ -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): diff --git a/InterfaceQT4/monWidgetRadioButton.py b/InterfaceQT4/monWidgetRadioButton.py index 129046be..569e56be 100644 --- a/InterfaceQT4/monWidgetRadioButton.py +++ b/InterfaceQT4/monWidgetRadioButton.py @@ -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() diff --git a/InterfaceQT4/monWidgetSimpBase.py b/InterfaceQT4/monWidgetSimpBase.py index ef4c5cea..d1252feb 100644 --- a/InterfaceQT4/monWidgetSimpBase.py +++ b/InterfaceQT4/monWidgetSimpBase.py @@ -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,"") diff --git a/InterfaceQT4/monWidgetSimpBool.py b/InterfaceQT4/monWidgetSimpBool.py index 5b12888f..53a60983 100644 --- a/InterfaceQT4/monWidgetSimpBool.py +++ b/InterfaceQT4/monWidgetSimpBool.py @@ -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) diff --git a/InterfaceQT4/monWidgetSimpTuple.py b/InterfaceQT4/monWidgetSimpTuple.py index b75a5676..792df7d9 100644 --- a/InterfaceQT4/monWidgetSimpTuple.py +++ b/InterfaceQT4/monWidgetSimpTuple.py @@ -26,7 +26,6 @@ except : pass import types,os -from six.moves import range from PyQt5.QtCore import Qt # Modules Eficas diff --git a/InterfaceQT4/monWidgetTableau.py b/InterfaceQT4/monWidgetTableau.py index dc990292..5a0bc061 100644 --- a/InterfaceQT4/monWidgetTableau.py +++ b/InterfaceQT4/monWidgetTableau.py @@ -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) diff --git a/InterfaceQT4/politiquesValidation.py b/InterfaceQT4/politiquesValidation.py index a93175d7..83c2dab7 100644 --- a/InterfaceQT4/politiquesValidation.py +++ b/InterfaceQT4/politiquesValidation.py @@ -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() diff --git a/InterfaceQT4/qtEficas.py b/InterfaceQT4/qtEficas.py index f8f580ce..779a9bb5 100755 --- a/InterfaceQT4/qtEficas.py +++ b/InterfaceQT4/qtEficas.py @@ -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 @@ -19,1009 +18,32 @@ # 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) diff --git a/InterfaceQT4/qtEficasSsIhm.py b/InterfaceQT4/qtEficasSsIhm.py index 59f39bf8..d7896621 100755 --- a/InterfaceQT4/qtEficasSsIhm.py +++ b/InterfaceQT4/qtEficasSsIhm.py @@ -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') diff --git a/InterfaceQT4/qtSaisie.py b/InterfaceQT4/qtSaisie.py index 1b0b79ab..f6f227a7 100644 --- a/InterfaceQT4/qtSaisie.py +++ b/InterfaceQT4/qtSaisie.py @@ -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 diff --git a/InterfaceQT4/readercata.py b/InterfaceQT4/readercata.py index 2fd60cb7..2d6a8718 100644 --- a/InterfaceQT4/readercata.py +++ b/InterfaceQT4/readercata.py @@ -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): diff --git a/InterfaceQT4/readercataXML.py b/InterfaceQT4/readercataXML.py index 5579a82b..9282b622 100644 --- a/InterfaceQT4/readercataXML.py +++ b/InterfaceQT4/readercataXML.py @@ -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 diff --git a/Noyau/N_ASSD.py b/Noyau/N_ASSD.py index a7fae981..801df350 100644 --- a/Noyau/N_ASSD.py +++ b/Noyau/N_ASSD.py @@ -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): diff --git a/Noyau/N_BLOC.py b/Noyau/N_BLOC.py index b1315229..73d9835f 100644 --- a/Noyau/N_BLOC.py +++ b/Noyau/N_BLOC.py @@ -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() diff --git a/Noyau/N_CO.py b/Noyau/N_CO.py index c46cd58d..998922e6 100644 --- a/Noyau/N_CO.py +++ b/Noyau/N_CO.py @@ -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( diff --git a/Noyau/N_CONVERT.py b/Noyau/N_CONVERT.py index 3a89a528..b900ade1 100644 --- a/Noyau/N_CONVERT.py +++ b/Noyau/N_CONVERT.py @@ -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 diff --git a/Noyau/N_ENTITE.py b/Noyau/N_ENTITE.py index 4735edd3..b1ca94f5 100644 --- a/Noyau/N_ENTITE.py +++ b/Noyau/N_ENTITE.py @@ -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 + diff --git a/Noyau/N_ETAPE.py b/Noyau/N_ETAPE.py index 9a777aa6..3e2da2db 100644 --- a/Noyau/N_ETAPE.py +++ b/Noyau/N_ETAPE.py @@ -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) + diff --git a/Noyau/N_FACT.py b/Noyau/N_FACT.py index 4e45660c..90753390 100644 --- a/Noyau/N_FACT.py +++ b/Noyau/N_FACT.py @@ -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() + + diff --git a/Noyau/N_GEOM.py b/Noyau/N_GEOM.py index 2bde47a3..816fd422 100644 --- a/Noyau/N_GEOM.py +++ b/Noyau/N_GEOM.py @@ -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).')) diff --git a/Noyau/N_JDC.py b/Noyau/N_JDC.py index 2b4a9dda..22d565c0 100644 --- a/Noyau/N_JDC.py +++ b/Noyau/N_JDC.py @@ -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']) + + diff --git a/Noyau/N_JDC_CATA.py b/Noyau/N_JDC_CATA.py index 27a76e8f..9ff694e4 100644 --- a/Noyau/N_JDC_CATA.py +++ b/Noyau/N_JDC_CATA.py @@ -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): diff --git a/Noyau/N_MACRO.py b/Noyau/N_MACRO.py index a80f98e4..e7069e03 100644 --- a/Noyau/N_MACRO.py +++ b/Noyau/N_MACRO.py @@ -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 diff --git a/Noyau/N_MACRO_ETAPE.py b/Noyau/N_MACRO_ETAPE.py index 793fe07e..4fda6801 100644 --- a/Noyau/N_MACRO_ETAPE.py +++ b/Noyau/N_MACRO_ETAPE.py @@ -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): """ diff --git a/Noyau/N_MCCOMPO.py b/Noyau/N_MCCOMPO.py index 6f0af8f5..15f27b9a 100644 --- a/Noyau/N_MCCOMPO.py +++ b/Noyau/N_MCCOMPO.py @@ -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) diff --git a/Noyau/N_MCFACT.py b/Noyau/N_MCFACT.py index 52be4313..3974cdb6 100644 --- a/Noyau/N_MCFACT.py +++ b/Noyau/N_MCFACT.py @@ -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 diff --git a/Noyau/N_MCSIMP.py b/Noyau/N_MCSIMP.py index a06134df..92d007eb 100644 --- a/Noyau/N_MCSIMP.py +++ b/Noyau/N_MCSIMP.py @@ -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) diff --git a/Noyau/N_OBJECT.py b/Noyau/N_OBJECT.py index 8765539f..45891db4 100644 --- a/Noyau/N_OBJECT.py +++ b/Noyau/N_OBJECT.py @@ -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 diff --git a/Noyau/N_OPER.py b/Noyau/N_OPER.py index 955b0897..22263f3c 100644 --- a/Noyau/N_OPER.py +++ b/Noyau/N_OPER.py @@ -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'): diff --git a/Noyau/N_SIMP.py b/Noyau/N_SIMP.py index 9606f351..40b8452d 100644 --- a/Noyau/N_SIMP.py +++ b/Noyau/N_SIMP.py @@ -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 index 00000000..6ed18126 --- /dev/null +++ b/Noyau/N_UserASSD.py @@ -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) + diff --git a/Noyau/N_VALIDATOR.py b/Noyau/N_VALIDATOR.py index 9f7720cf..df36f26b 100644 --- a/Noyau/N_VALIDATOR.py +++ b/Noyau/N_VALIDATOR.py @@ -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): diff --git a/Noyau/N_utils.py b/Noyau/N_utils.py index a0415268..c5be200c 100644 --- a/Noyau/N_utils.py +++ b/Noyau/N_utils.py @@ -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: diff --git a/Noyau/context.py b/Noyau/context.py index 4e0833e0..0101982f 100644 --- a/Noyau/context.py +++ b/Noyau/context.py @@ -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 diff --git a/Noyau/nommage.py b/Noyau/nommage.py index e8a24ee2..5966f9fd 100644 --- a/Noyau/nommage.py +++ b/Noyau/nommage.py @@ -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 diff --git a/UiQT5/desChoixCode.ui b/UiQT5/desChoixCode.ui index 69b9c248..76f9de74 100644 --- a/UiQT5/desChoixCode.ui +++ b/UiQT5/desChoixCode.ui @@ -11,22 +11,13 @@ - Coix du Code + Choix du Code 0 - - 0 - - - 0 - - - 0 - - + 0 @@ -41,16 +32,7 @@ - - 0 - - - 0 - - - 0 - - + 0 diff --git a/UiQT5/desGroupeOptionnel.ui b/UiQT5/desGroupeOptionnel.ui index 3dbe6195..58580df9 100644 --- a/UiQT5/desGroupeOptionnel.ui +++ b/UiQT5/desGroupeOptionnel.ui @@ -6,14 +6,23 @@ 0 0 - 400 - 300 + 420 + 363 Form + + 2 + + + 1 + + + 1 + @@ -95,8 +104,8 @@ 0 0 - 382 - 223 + 402 + 306 @@ -106,6 +115,15 @@ + + 2 + + + 2 + + + 2 + diff --git a/UiQT5/desPBOptionnelMT.ui b/UiQT5/desPBOptionnelMT.ui index 5bdd3224..66881fca 100644 --- a/UiQT5/desPBOptionnelMT.ui +++ b/UiQT5/desPBOptionnelMT.ui @@ -48,9 +48,7 @@ - /*background-color : rgb(168, 227, 142);rgb(57, 146, 228)*/ -background-color : rgb(66, 165, 238); -/*border-style : outset;*/ + background-color : rgb(66, 165, 238); border-radius : 10px; border-width : 30 px; border-color : beige; diff --git a/UiQT5/desVisu.ui b/UiQT5/desVisu.ui index 6f25807a..9c013397 100644 --- a/UiQT5/desVisu.ui +++ b/UiQT5/desVisu.ui @@ -1,7 +1,7 @@ DVisu - + 0 diff --git a/UiQT5/desWidgetBloc.ui b/UiQT5/desWidgetBloc.ui index 439dd60f..9094f6a9 100644 --- a/UiQT5/desWidgetBloc.ui +++ b/UiQT5/desWidgetBloc.ui @@ -17,7 +17,7 @@ QGroupBox { border: 1px solid gray; border-radius: 5px; - margin-top: 1ex; /* leave space at the top for the title */ + margin-top: 1ex; } QGroupBox::title { diff --git a/UiQT5/desWidgetCommande.ui b/UiQT5/desWidgetCommande.ui index cb31ccb2..9d4bfd03 100644 --- a/UiQT5/desWidgetCommande.ui +++ b/UiQT5/desWidgetCommande.ui @@ -29,8 +29,7 @@ - background-color : rgb(224,223,222); -font : 'times' 9px + @@ -200,14 +199,12 @@ font : 'times' 9px border-radius: 10px; padding: 0 8px; background: darkgray; - /* selection-background-color: darkgray;*/ } QLineEdit:disabled { background: lightgray; } -/*read-only { - background: lightblue;*/ + false diff --git a/UiQT5/desWidgetFact.ui b/UiQT5/desWidgetFact.ui index c7f86cb3..d57b619e 100644 --- a/UiQT5/desWidgetFact.ui +++ b/UiQT5/desWidgetFact.ui @@ -433,7 +433,8 @@ ... - + + ../Editeur/icons/PlusBleu.png../Editeur/icons/PlusBleu.png diff --git a/UiQT5/desWidgetFactPlie.ui b/UiQT5/desWidgetFactPlie.ui index 766ca93b..c2c2d878 100644 --- a/UiQT5/desWidgetFactPlie.ui +++ b/UiQT5/desWidgetFactPlie.ui @@ -17,7 +17,7 @@ QGroupBox { border: 1px solid gray; border-radius: 5px; - margin-top: 1ex; /* leave space at the top for the title */ + margin-top: 1ex; } QGroupBox::title { diff --git a/UiQT5/desWidgetPlusieursInto.ui b/UiQT5/desWidgetPlusieursInto.ui index fdddf0fa..a7793239 100644 --- a/UiQT5/desWidgetPlusieursInto.ui +++ b/UiQT5/desWidgetPlusieursInto.ui @@ -11,7 +11,7 @@ - + 0 0 @@ -262,7 +262,8 @@ - .. + + @@ -356,23 +357,14 @@ 0 0 300 - 125 + 129 - - 0 - - - 0 - - - 0 - - + 0 - + 0 @@ -460,16 +452,7 @@ 0 - - 0 - - - 0 - - - 0 - - + 0 @@ -480,7 +463,7 @@ 20 - 40 + 400 diff --git a/UiQT5/desWidgetTableau.ui b/UiQT5/desWidgetTableau.ui index ecb56142..30e2f41c 100644 --- a/UiQT5/desWidgetTableau.ui +++ b/UiQT5/desWidgetTableau.ui @@ -153,8 +153,7 @@ ... - - ../Editeur/icons/PlusBleu.png../Editeur/icons/PlusBleu.png + @@ -188,8 +187,7 @@ border : 0px - - ../Editeur/icons/MoinsBleu.png../Editeur/icons/MoinsBleu.png + @@ -304,8 +302,7 @@ ... - - ../Editeur/icons/verre-loupe-icone-6087-64.png../Editeur/icons/verre-loupe-icone-6087-64.png + diff --git a/UiQT5/eficas_en.qm b/UiQT5/eficas_en.qm new file mode 100644 index 0000000000000000000000000000000000000000..3bc02dbcd95fb738813352f3f6a48c4bdd97918f GIT binary patch literal 80792 zcmeIb34EMYxj%lgCzGu^rIa#Fm$ao#x`9wirA<;ObR$U%RBV|flV(aX6K67Aa6v&7 z6cN{}hzKH^sG$D1E+`(?LT%&`#%Y3 zUmB;|qGHSg;}?~@C~ZZHw3V1IzmNS=+S>O>JO0bkPCQB4Da)lj_)uvNX_7XcRjT8& zN_Bl*snc#z>W)gK&fc%oHQ!N1&jVMRFHpt(X8>oXs^Ytcl={wns`P%P)KOQe(w~1w zsk?imz2|$<{$R*yAC&foXGr_&Q>FdQ6lot>EA8*@lJ<`uk@mlTEA8L^OWGG^O8er6 zbX%mBN?Y=IX)C5nTY0Oru@6XF^G#{%E2W({N7^a%(oX%Sw1<>QJN+0{w*EO)bZD(A zyY>sf!IP@&TQ>o(UsV+!1Py$ClbUehl}dG=q~cHgPN`i#Q*(c|N~td`QVY($N~xP~ zQ44QId+z0`c@ExBb*Lq!k1CZ|p;lC5tuFbuT5;=2rT%ojI$nVuzxoGt!jX?D_4jIN z|JkNa_&|wLlMYhr&;10(?NaUgCMk8+47K%x=V82E>Xf^&h8^!w+lH1Xb?4QpJHAY* zPdBK(B-ZEMe^q^Z_bYY&C93c4PPBKbfmQgu^j?+e!n%F-T9v&HYkpmw%6;aiO3nF| zdi(o8TW`KjeQwqrN?p;bZg_sOQm21jJ@EJ2l-gdZ9=z&tr7qm99{$}^O5Ix{?R`_F zeRztrkDVj!(|?!t`EqGrTB+Nj;udMk)=FEElD10vE2{36&$VBacKidmXslVQRlTvT{R#C~Pi08VZh9z@Ar++Pa^H&xtm24_H zVLs;b!P|;9?ZA5c#}!3ySpouH8Y|j)TU@C_*B51;!94fOy6jz=6Ao$aR(*EK(X`i^dxc-Q9l^Xxu z;zJi;y_)YXUVLI+sU!2nOYaA~6Te-&^7iADI_Go6EjLst^_5Gc{pl^mTWcIm^#+fKvy8y_g%H5v5rl^MmEmw~SjU09rb5%h8Kw~KRiU4W~jcuzn2iydA3 zu1E0Rg0B|8`v%PK+IhwAyYqRaezvIi{PNA<6Y=8D7Tu;)(JjT-eDdQ;)!tZqJ?K>} z+g^PA)t4#t{nf=^y|hHBlO_~@?Jw=B=#cLffBPT!K0mYg=Dn9Ib=;H1-+TNbrG9=< z@g3dx{LwAN_kI-pU3O~m!>cgfA*+g?cz%vjZ`oN=(uw_7^ZSxV< za`CFTQj0oDJ`&%e)PGHu_PHi$|1nY8f4@oE7r#~V*?K&8=6xmCeC&Cp#ywN=#WUKJ zikFo9=c=2Ode7F9Z|HSMmfYNo`K*~;a@%8hr4Fts`Tp(OmHNRIx-BZXujH;{Cn{BW zV#%)#dr7HxzEtvXZl_YWUsCeOd(%p7y}0Cw?T;(9^TCp*vVe2>MJ50I?O&8Seq*V+ z1fO@lr?m8+SpO3ymzJl1hrfJDw?&6_msX)$b;4z(u{hT8%6+BPmjK?yr`dvyL zaYN~mk6sD+`5tM1_Mo(nTrchK{wnRCZZ2KD?P+MSzi+()Ep&rhe}on?^46zIufG)ZH~p^C z8_qpN6;1!Jv@`!l+FAcm`mKw8rqs0Glz!)5=PGsE^wQg}M!#=Asr38xSigfiO7FQ4 z@Xfok^uCYXj`wetcGlgc4?cl;9zCh_p+77K-JetX*GEAwS6oy2ROuYZoBt?%`p$PN zRlKnDUl&eR>b$P9imQGKd9|*r{y5;_jPkO{<(SX;&y_WP{EJGRdTZIdjWM-RsLXRABsPUeaw*QES@ca|HNqzHHzjv={F!JEw0Z z=J#ybd#}!8{oYshk*)at3#-aLcI+DH7pIqf;xF5j+L9{!)P0=)<7Jl~4!Jq>Oxacc z%Hg?xmRFBzhW^%<_x`2>?_XKo`_z?6-SC$3+z&x7 zjaQYwy}Sha!N1Et_(`<;A1}Y~nO)Gmjw%1x(C>l2HRYGwG6(zQ59QbXdlvY9ZTXj{ zUJm{C!Sb(t^QXXnwQh^lj`FV`h4DY}m-1VG0y=8CsQk98@ZPTumiDPHmw*2<;PYeO zDZk?e{QkiYm*2Y+`1#gj<$pf64g25+<$w8eQmMnfQc-&R7RZtRuBiCsZAvYiS~32z z&5&0QRm^-5@b7{(zGCH-H(`Bms#tkH z=w?rSMdqzv2VZ@zV(_hxDD~GZx-B~F){6W#(BB1jSM2>(G5GUo(%!kdV&DCDDAjj- z#i#GP81%cP;?qw+zqvA2@rBC$*f)DBuDW%yQWM@<@x_H0f5U=`8!{7t&#H?5cgH1= z54{z)pWmd^U2~ zizaQ7_MoFG?!M(KkawLG4{XJH>?^PMc@^-{{GN)3sKAe+zbBx<%-`Qe+2Zv z*%eQHDb6et8z?;=Mnw{PJhcRqDoHR(|WQ5~b?5SKju`EbN`fDsTJtN3pJxr2YOu zm3N&EJm0aW@}9n*fqy+$`J>Mr2fA2Od4CS$z0g_t^U5=z&s0}F)W1=w2m30YZ2BAK z|3u}B9T@-1%d0B)0?z&~RgK%d6zhCR)wD0KQtH>Atvck1JoK7ds}5U*=Q0;n&0UAj z-#x0T@$5MCq<2>>`1JeGPqwOg2sYaKT-7muX@k7#s#^Is;Pq1*sy06Hd&v2ltJ**J zIP~wLWs(q7lkY{C8 z`;NRwsT~JbU9h+X^nZQTrFG|EJzA=+>cIMad_&c@KXDU&|Ie!L{2lOZJFM!*^$#l5 zKC$ZOzkWCP_V215dJFLRj)$ur{>%~J{~xb)ziP&jCLv7t!O)|p8v!IRaC!J+Hp@+ zz4(>OvES#$if$}}-t%B=>f*^teee3%w9~JEKEF7&EO&=eZ=Dxg{{IN07##@=-$@Kf^M*f}dP-Z|y5a}PQK^8Vb|``&#M z^o0jw=byY?sXt#3`@oOufX5eNAG-Iau*si}T{I8R^?ft;sdbk^PW(>VubvF71=wh+XrpH00N$*frn9^Lu_2 zyY3p`_dm*G*WHhGzTwxg>yMfUe)gHz*WUEJQvdyCX;k~gRKY;e5ABg>A72v74AolY&VP40c z8hh^hm~W;n_RkORhyM0b?4{*@gIru%U9xfx^zc>Hhd%i@;QMfOn>f^3{5c2uQ)$8^x13fIP-gMj+tjo8n&$#kD*oDQ_y_L^^ z9{ygPdI8`6VZ!dEA{j{s^7ol4D7RM)fZ01 zdVS{i)fa#KCh*$_sz3SbBVZ>US$*lLgV2{>sJ@JRV%%}npKqUx{qpnbYd_cpKG9Kq z{fqAg+(%b`iFVm-H&);Hm6yN=|5SZbC*b(dGu1Z@p`T^{RekH!Ch)}vs_%O{-#fqh zClyJh{`Rc2FSk@b@NM``E_=TEr~LkfKUDwX=n|#gb!GK0zHvX~{PESld0!d$+2ra! z^siIuO&_m*{DJ3S2OV7fmzUn9ib`iyKe-b7_#4mFs2^ShyL)d<@o$%d9_wq$e|bCb zl&`5i8_$1lNzJ&~H^F{;kF?)?u4dxx-$H+}niE#Rp1k&xH7EAo0sV7#&Bn#>soZ#F z&6e?4@AMTlZ@CcjoL5@2{r5|iTD`p{dDjf^+wnDh-vvItU0ZX`kA4q6-dpqDi$TZV z`%BGv^K;-IlWIONX`)gqR@Youh3AeryXIrtF^^+oHJ^NHF81NwHJ6m!20EW#b1D4` z<@eWo?w}T>KKYTFFQA{Ic)aG@;xkmywAPy2ehD}hJzsN240`C257pfD zDbUmP|E#$O?gjO|vYLA?2i@IyXU#*GZ&XFq#WfFKaTetIS8IO#*AB?fTWbFGB=G;8 z$u<9a`W&pw(whId`}5GlR@4@~)CTyzQCspd;F$hDwUw>F(@(Zb`_TKOeQIuPuXb7LU0Cl4wMSiq z_nuu*+tQSSf8qMt)@>!wqtB|{FbSVme4%#x3$r1Qa&{{^2>$leX9Xx#R`#t;*WJ zd=2aL{o87v{vhUc#xHAMezX{T?e4nRC4h739d)(0-l$aDyXwY`2VcDGyLIDcUJkwS z%)0S+!5-{=pl-@%uwK(T>gF_l8vONAX~&;Zx8Qu(4L_JD?GLM^{dJMFzspGb$D5`7 z@3W=-`}?K+*A8i4TqNzwKhbSbNvpKw-;=hoN7`70v~^#UcHBp#o$v!`C;z9kQ$Hu| zv}@~{PkK_RtM95?x#AO`^KaB0_r%4JyDRF}KAOe;Tvyj|^L?P_rn+rUmSKG_miD2W zrTy*urG5N+(mu7NZr9iF-rv{Mz4Ke3yGB)a_AS6;^&jirzxeCWgU_w|*bLC?M=q?p z;<5`MC!eaj?yBd(Cq7ko&r#rqolEL|IJq6`@Ugmw`aq{ME~tC-Ijqy%x70n;za9GL zF5MO#dP9B5ncxpUs+RWmhfDiky}B)G$k$i>_jyV^cb;yGiteb7ZJ7@Kd`122Y3D+} zy0(7yXTJ~nPu0(V`^VuAnpS`KH}L&&XV)Kb0oM7*`SmM*k9AMnSHEf-K3{ZM{l*VM zZ`<->eftdT;oq59 ze_q`z$oKQ>&%d`5`}l_Xk2bsm{;Q8l`^bQ_&pMx9xI}+0DteE!4a@33dHp@G57*US zlE-?in_vH>Ct$}Mvbp}7|6Ydm?XCaWNxPwkom>A1`(L@B{*fPpZdP7W|HlR0utUz$ zZIRkv|Kjt&U-90QDw_3=60o4{YMn}}-72B_RZ8`!IR2kj-T0KprzAf2;+uZ_)r7x? z(C)?m<7$uowjY0`RYrf)rJoMI-26?-7n`xs>!IG_#8L= zPK+mZC%faALU&>)(Vy9wPg?rA1UO1!_Uvn?UWq&)6pWAtxylLrKZpLi@tLE^j7WI` z1HX&w)#a1?n{y@2690TYtKTG*%6hO3zmveP93_vZi6?J8w#2)W@txUBelSTq4J1T}?A^#7ca?nn?bVk-fn!E7>TLHd!S9*6++0u++g@I&oR zq=zg+#W0kEb3+-WM2U^8NJf4lCX*ov45^%Xxh|gEo5~GwC3YoZmTul>I2EaA9(dXg zwM5O=SS3{m^$?~gkMp=3DA~NdRKLB@d|u}C)&stRpRE!jAr=m3dy>;E9x>sihOJh zGob}Cp&Xc)UZ%{TMmFg<04TnQVt!!&^L8-JJ~2ZcMnU1?OmCPR#qTgAyg;)CZ|@~A z>98J<209>L%qTPCX)R5uV^E~`B-2Bw-V|9^cP5(!QAOu7*D{V@PYRDQYs4{ZTx+^z zlp)BXLCQ4)|3SgNhw_8K8bneQ>ZVA4+@J>U_%*HNwWHOU5oQFH9(P6bLI6$Cfym%R zLU?<d_vP%mMQaN{ZI-T#gjW87>v^pFp1b5F*Gg`OULoU=dKVG5$b(q>DjeP)=0-IwDzt&t@1yOTQ; z*&bVOar8!1(5^^hUj5oe+XU3`Gc;1uYvtVbWH+Reg&sMB4uF7tU>>iT+cDg@3w`^V zq&$RiIi~Dz&WqoLrOeC~+%u4iNeJa!d}!Yw{;vf;WTuumQGCtT^P}}iDZ|yHUB|g{ zT*t;UU>~%)`)zrsxI?a4rEMzPCLCM82kU-wDXp#?FBaPdnrjvxLIa?qjYYe^A6RkO z2#MA478rQPuZF4scZJ6wGVR5Mm=YzU(?4p-A8UP*$vE6`Hgll0b6=N?-$A< z?RYV-SFIkvUK@hjB>LWVbqavaVnVK1pNZ+vI2PXJ@F;vo5|#zYV5w4CRTG1Va*&Hf z=MM>_P5;Ji@7Z2+R%5e3W6Gpw8eOfsFOh~V+?UDb;%#f!wXE)l!gr+Fs8O8(!`g-3 z#YyAB(yd3P(VoS)RN)2zg@02ttj>3X^fqN*PR&zfo8zdX_!X`o#YG} z5F`ejQ>07JH8BKg*=^}&t3xK#wF#+9)`lGdX2Ehq3gH(=GxDtki4GVxfHY}9pv7gn z^8-MxW~Pn=aXbrjEx-ej&Ls0a(RnU#0E~LNC=|u>;rPDHpfdX;)F-$oApPk3N#`xI zkEu19VlYGVa@m?hE@k0Q6ClPm0qL!33;ycF-|gm|Sj(o3ty@|;+qSevXRuJCheYQQ zs-QFl9hC^9nD0?B3S`se{1(q(DC|3o!GRVXv2ThGqqqx09yJIIRhrHZvvdxajR6oHWu-a|0OtXyXP}FRFS-z7oD&XG z5G1G>cZM@AaWpWPf!Y!93rB|yS@P9C~xKzXh5*(--7= z4*VK23ExrMe7#O?fzt+htag{?@`G^g4tlueb|Kw9^^7Q@^*oTXP_?e7{(#X>mN}-C5g=P6w6>`7>QP&BgW)BvkFP5?ZA+ zy0ntdp|N6)3TKF7o(qI_+q-r;J*+_a0F=W7LMc??qVtrf!I(fa!;W)@bw`YLKUJ?N z?d?1eO5BiyAH!0@f7d$RDcM+cau>BCiRWT8Zn@!+hLPP570e9lHLt2DYWGXO++ z7wnCGfG*&IBoI`i!UWL}7)LxY&>lzv@gBsHphHC`unRKVhH3&LWKY4C(tvR-Ns$DU zV3CDUr#lmW@53()pir6a#=mrrQ{SW-vJ=nwJ^8C!vPsc)!1c4qL6`#!Z!zNKEoLmf zRZNky;=41jLWqAfjfw7Vo4GIn`brWbaeq15up!y<)?`=S7IrV zXquwO5cQh=CbT98`(eX#mRNA^gJ?(R6z)iep2-_&P`ZOLLNx@thJhWrIQci9aMd$T zlT^y36tmmenE0-M-fjS169pJNfC09pu2zw2igzU8K#@fwBVx2Rksrz+gq^e*dDE~8 z1xyJuaBZvK8i*okE+$Juk$Ydl09Mn)^fw{UUwkX9*=VOt(A|X$JYpTxJC_nFr3r;0 zR0p%B^EbEBM|Bn*_-RIx^Db^+(_o=@XYvetq3Op%y_Dlxn;b@6TIIJs%{mnl225KZ z|K{dB5!OeGfozr-q&l@Af!HYB{@s~0^w^)4nY`#~I)H8FvwYb30RNZ|LSy|1jNwCXCW|1n zMUC4UnxJe0SLq1LTS{AZYlR&O;^_!WpoJDNVO(bg=OT!VofF0X8Ltg^z^ORXJ!alq z7*OCZ1gO=Ji~-hm{Oh-M%iG%9t#%6V)Qj0{wIg*9!TKZK4RmM zQQ1^?F;QrExvCS*rzX4?@N<}TTGj?%8}tDLc(i+l&aM;`glrGLB}7f}HqeX~Ie;=_ zHACo*NkcgkmL*V9K^qg42B!G%Fxil_^*{hH44RgX1kz}*G+nI)sbxTR6eEm$k?WB> z{TAOu43!0;(W}s(0dwuxx;eT_$-KS3_!rd^;+*>uJJw)xdbqz-x)Ywbq||&nC@eMk{)}%4p^ZfJj(*ibnj`*ETo2+8P+=QC$-uXozhe&?A$dp z6GbrY(BJGeJsjKyf!&`$t{tq!baHPJZg}i$;3(P~XTUr_pu@ah-iE-w?co}5Gv{G7 z(>y+29*@tAyMIK7Y4yD+$%X?U6>=&`KZ|M%Uf?|{h1`J_#Rt0kk=lek?i$sF_|EAO z0K!>?4Pc*?3X3#g)cQ%4G|ITXG|?LHjpQzn(Ng6Ii^tgx1^`$F2@+H(5*qPzEl}07 zGsUI=aC<=VqCUu$kY$$Pf)3q7oZ%Aj{>CJtrFk(9SJ+*+3kr-vX+y_ZR&QlZQf6(Z zcq1g@JCg{k76@IQSfFz;hh0h)TP_W}l7ADYmVM@OP}TKCYst8^F)nGy`w-O-eS^mOpBSu zzdK^UvUQ?hLSYo-UdHLt5H!fULH;cML)K|tY>1!{Y)e9I9|K?nlndm>ZbWSjg6jv+ zT`Ct{9)LZFgvJxuop3>fK#VTc{~m-^04>Dy`YtZkcC?GT0@7GaCmNiFrw1s|&rX$eta5Vz4Q^c7i9!_C)Nu(1~!cdsH=?!7Q=^`wfq~;Ed5saQW zB8HFbNTz!cy~!1jpfnT{P(gQi%-&2hCez%pA+a|~L{oi)OP*_Xj(NRaUe7_4b6Z$e zt3j*lVJ`p`80y1J67Y<%$!&X+-FfXG^jx+UMza*}QlqAtO8uI4FjWAylKW2?BL2wm zKAzgPcMv&E@eN5y<%+L$(xao(9|yLv4)MS?M4wMnn^l{ccIDc2>)Sd{+uRm?X#!rN zTz?zp#)a+n#TKg8wzr+UrEO!&Y0>v8@m?_KSm8hxeRj6XoiIl+ni&*fVw9U%<+n1% zxii%1RY(QK%D4&Cl*9x)8ZtSsDCPtT=r&;@I#Z%78T0?I#Tf9$5zzM5x&V z7Tm7_@eo0-yfA1I(D47^Y!L5g%VF-2g9#+SAfG;%b!|CnL_=8)f^kf-J2^2OPc~CA zC?U6nxlD&e6v5Mcv_jU;=yAm4b|HjcQKObRN3s?N;Fem4mYj^w%{PNBazM{%zifQof+mJ_<{xuR zCtc!9tuqhITQEP09uE>1<#dwSVDTW4r3pi_&j<*BW%LM>}Y?mO7~ET?xcz#JqaVotQ(7V4px)qw9TEMuXb3#Dud zhLAp2U<@LcadSJ9=tCfxb{0`7x4{Vp8>l&PL8s$wm;Aw29+ zLKt2N$tIx$;BcnxJx_(=Uul&$(;as_LXmKQ$8`oQ4lG7ruLEiBG8 zu#Z`)(RY^OY5D^sD}%?vhSTUfpd_@KerK-hkMDzPldxm>i>T_Sdm zc#>1l89}{LvOztL6igimZ?QH%klL%vU?}r0unN19dHQhN1S2LyAU?ulP;gP`lj_bo zMd|+%D{EmOH)sTUb8!hoVw~iEuIvz8kUsmVxu)1CqQ;xjQ0;~w z(-9!{^-o<1ed>Xm;+wO{-MV)MloNE^r4x|l9Kf~{?6fHvF0|5xr-~Y+brVCI%Y##g ziyzS>;b{N`HoP3vay-|)T7j|1cYCs=P^!&pof96m-=Q>bzas)4rKT0uJ;5{>H;Gv2 zNc<%M)^4U8*#6Llo%CXz+vCJFdZQz+)jF;m1ocuG10!g86wR= z40upL&2ghEzWN;&T-YT`5Eo2~kR%H6jgSOL3<0T-R*(n)SJMMUxXSR{ z({WlDj2#^YlIMZ62ILZQh*QE3UdXX=q!mu#bpF&Afzv1`1{S{v)yAXCz+JX&@tN^F zJiV9EiaoB+(c}!8acb5%B_?)TGXh&3mdte~^Ck&$5(JpGhJ0sAkr)x?KEn;W%w_-e;YrAI$z zpL00bDFxwdURhHr#SAr(=LBQ-lrsE|o1Ai{5%kfh7V5>4wp%Y5#Up?1QH_S(1(qj= zqn7z02VA6^;Os%XG1IuPu^0b!H!|6-v8ORg7e{GC+4*dkPRM;k3c;;yz~z zSF*{eKO*62RNfj&Y4uIcZ)nopoyz6)cTt$OApzBYwAQU6;nqEpJWlyEF&DkRpkxt zMt@m9Ar*Uq>T1B*jgkkcH0TnJBk!oHOU(=EQ9((BG#C$$8?(gA@ad|@Ieb817Ns}H z_xE5+5q=tgoet&lDBbM3lOTfO4GA#=^+DNb>%pQSMnBQLUIZ=Vfr6fyppAkkI9rfus+MW4l2I zg=vBcz1G42bazaR6JQhD+Gi^TW{z7rn?|g3q>*xSjUTsT~ zfdD&aUU~-;-sktgn9hRLr+0K``sZ6R2^L@--8isU1k}PU6e}J}@z3S!wKobL5b;5I zK0(khTor<-VDV3jrLzJABxmVH3j$Szpr7bXuLKmU!=}U;+5}kIaeQS9VCw`-o;?_}^_oTl(dJEC+B>$a>uj@t6s;oXmJ4yW1doW& zE!N``oO6Q1x(8fXE+l8_H36kkO7`xpCzn zi?~6gc2`iBTI+*zW!EaFlGn=Su2sS=@}k=KV2-cs%C2h1S#Gcp_(r56WR$v&gC61T z%D8f;lEYu_1ca~f@R94%qZ7&Xw0oH$epC{~oQ94(LmxEP&XFMtDv!kY!@D6|)RED0 z0|yIb%<`eeC0Va%U!f8hNBI_zdnCA@Hh^xqgVu-X)mNXg(KoJr18vyU+P2<8s(Y>a zoOtKeVz|S*ZMJd_Bq}y-X9)&afv!87VRW- zh;OKoNvFxTWjsOV5~&C@8?R~bkKz+wzD*n5pIdd71S#H?@WSh5&-jc*{O;Gs#j)jT zO_D-J{g*bbKkp6#Y}r$1M4)n~Prbu$N!Va&bDk&&oo|~cIV71{t}90jE>1`CXo`qxQpg$D`dEI zYh=-fi&mIh2Bsx|$vt%1pKz@uH^SsMube7k7NvcXV@yiovZKwK5vtcCg^qR)tjj2I zwnL;lMik(4oh%+HFxySevWc%p%7*XmJ-^%4YI8KJPx~$=L<#Gu`y+$YCdUVL_Z49gV0l?^al}2wTB7 z8L;s(0rxbrc*Gnan3bQnK9fcTcAyx{S4!PlsAo13{W6ZI+<|sAC?WxqW3}#&t^!cI z>9bBt#2u}xJ6Eq+-O(0ZsVPvJNP>m5#0eXuJ`IyvoFYNdP9~U6%%U0y>P-h*wQC{z z_B`{p&maOobjL^#!zn0g`aIP1*@H?&X_gM9BgV0iq9fFq5qO~4JKH(Y^n){tPLh1| zZ8?V<&J6I9vc38-2W`-a*iI1F3syz@oUKj*1^Dk6fQZm@_F}7^k89!v@1_AabQ$e) zL4iJn`%w-@DTZBsuE@_S{p0$pp1x_>mjzgAe^fpqBA|wsqp0V;&?ON6nCwe zU?d@tu*Kn>h^5HzqBn;P1A#p#yaFT8;s`Q9+xkWvac17rF=`h)l!iI7#E|P`i%xv` z*vZKkrf~<;M3v|#cX5fz7MocPIu)@xYTC6827x*-@?c&dNE`H6J`PGJldBI96i@hi z!KcFog>*?~y1Vm8qd}HSd;m$-s6~dU0=JkY;>>VGMlm`qL`vMC&PfTgNF>eyUcAAS zOQ-Z&vbUE6Wd05a7mEcfjQwkYCxex`+Nkl#1r<7vdRLBlr(~Qt|Q#;Whzod zB8}tH`cyX^xVsWj1T;{10Gwcon2Us7WS+SPnmNSP`T{K za6W_VSu_=V9(`Q^QvCO(x>0n*BQ?7G`2kE6-USGFuEV?DM3m_0s57L-t3N-0*;F7L zT~8@GAYD>a&xE~->eYx(Nt}EaKRSP*JAiRqm!<=2itjyU5+wC{?| zo7SJUq0LfHx6p!CZ+7apSx>qcoGe zInSr$as}69^HSVs@lbj5<(3)fk8_~M=}6|XQP^p-(w_+mrnQr)CSV)1Y@H;2uo9kr zj1tZ?OoGk@kL$CNA$^FRS#hW{ECq@_{wT*N)^2Lwuw}i4sHQo{8m`Y7(LVD&??@ET z<&jR^)sD~*rqiZ^zL$pKhoe_0I^=o>H{_{?SD|yMx-F)uD?43agqw1qL*+TlA|B&_ z5;*<<;~SNZabnA}%R!~^$bj{GM=vaf%nS`9`S|b$k?J@qWVdsgDmvNGc2vWTTo+2T zo2`I@jFTIL>rcDKO~9tP#=|>Qf^3=x?FHAQE0ko~ytxZn9ZVOH_zF(Qslduj?b>_( zT-?_m!o_2R(2_0OdBBk9Q-urxHjNTMR(iHpZe0LD!<7>2lDuLE#0XcMLWKGxUFSOA z!wfoUGn`$?gdF#2Px2U>t@M2*b}mh3&pfOscwa^w`a3x*2ki$4t$2@InQ9-kGS81u z)t($|Nnrf`C^^(Xv5*jBi|_D$c?SZ8Ef(Ik7@CI!0gZsydyfL2a~924xB(fzH<1bY z+6)~3)Fl$vv&35znx)o_;SI?F1|7vMtY6I31L*rexEq*uGKhRc-yVsMN43hG&RT$v z?Pr#3vcJE4;X_#yd?*R`G12QITeydXJ}4+l1${Ijw0{e&RFMka1=HZ~8&%P8`6G2> zlnNQf`Q-;TjKC@W4n5%+#af+KMoDKuh-y3JxcHh(7esLMy&7!?lEwLR^U6E)G4tr- zgjG0Vbf_wM37*2}do@&fxRm6>W;v@m+@lK7H#)V`l_hP&ZRgr-?1xy=@lst6Z#7_I z)n)#|oln(EE@`5#h%P_!erm9uzxkxj#7-S^$)p#Fy44hK!JQ;JD+`8em%gae;p$CL zX~5xiS`?l0RM(thY;ZeS9MV$&yEs-i0|GKU&V0bkySfuT)xj)ILnH^HGoJ=nn~T_Q3HiJzYg-_1DP4UfDO zG$mGOM0iH97p`!ZmPVZf8C-2satAzvRDVlS6bt#<@ z&D|H}y=s+P82lhkd;wLwFEY88CNZ|E?S8a(!J%xg-B}PEY%*8fY|@*P(J!CK!6!-2 z;<1VOAZX?x&BLbHtL+s}nZ<8rYHhXJlF&CbFmTTCkN9hrGrPuYB^p{ zlHw3mnxosHQ!^fJj03Aq!>-$;u^L((w~}TIl8BHA~DfN#hc% zTuz@4(Z(QeSjf_^)}-ZV6vFi(|Dhz-dPa}1(owmheZ?Rf0GaFW0c5nf5X$iR@!~V1 zptNf)M&*aGFJ{*mpN%FEa`v#F$II{VKz3LFo}Ot4WA?BB?Z0l<{>yD3UF^$o5KI*I zds1u^G76$AOB+0(=izN{GOk5Uor#*EF>TF+He*7rU2Mm2*sw69;JY#aZ|YjTSfJ>7 ztihIchbMuOM5!OrGs?A?r;ft^nbs-p56XAy&qRbczr9oA%>Y+h-eC7)ahnW_p5!2t zjI;5hm=j&_ScxB+sCSPFm)u_9M3AAA)y zKU-&rAj7*Se6E22@umu{FVRSYmr4kYO*aF=^Byhtz%-l5TvZLQu<4Po2r3Y7s~pdb zuH&f~GUT9&M4ae^A~=4*O1F@>a0;xmAx1JHXLY^Y5H~GklpR}ad;EVrmmGw;%^En7OH z2%iMM4a=K%AcV<_y;zQJqj{-fE1aL}Hf@Z)H^mnpa>ES%JeP4>C63_cAy_;q4H%j% zO7J3VTi6VZNs^iuz&_OJ4pAZZv~4n-P40wy-dYg5$Y4lGTWZ;%hWGJ#UUPj8c*{)x>2 zos+=?%IG$T2b>^M7I+6}&p1WQRvNce(z04%Mii)Q&G=~ehPALi9arV#dDrDx@t$}B z_rUgm;b&4goNFWR$F*uv7^PU2$U9Nh*r{6{$~(}o+H|db+*-GWc!39VFI;`z(U}BJ zsAPF`&i5UaZ<}S@V42beVj7qadjn>h@qK0B^t@coUjW{78RkSmlx81;eMD!!!o-L-1j9V&s z35j@LY@U~1%+G_vPj*zdc#@yh^+d-A3;c!7FG8l&DXDW1M@-}4JM4pcYR1fIL!mi& zWl$D!ix`=&Klx+OAZQBLfkbyU6J6OFY-+|R_o!vQT36*;Q^`HcEO|>4zKyWvbU??YU}1=*YMbgXGc4X_2}3pjk#gcsDlv6Hd{a>)sUHt;vCmBhhdWi6r1-+| zNf z+BxgLIFxL_Ez?Bxj<^;C40p;E#WY`dOEGg>U|%{}7w!e1*j)PhTVx=j zj7uW#u-7bV$VBHf0lUGCw}$t2B~PQ-FOhA~EXAL!|{nBuM@m=ygsVbzk z0@Gu?+oR~YR@QF|9=nku@>lT@c;?znUkr?u2ALZToe>zu)q;KY%YWx-IteGoG3X&i zqGW0Kjevvvqe#7a3}Q0`?6-_kzw)PDObYbJ^TbfAqf2M6m?u%2!g=ts{GG#c*H@8i zlo%Fa8EdKL5&l9HK@unF_{}(oHM6jj-6L3%652~AvMrEcuSO<3nLaXZC3^v?N#L)% zXAd&nn_U!PQ}rZd9cA}0RP7HL)uOV%fJq*W_OKP{g+16OA^^NIo8ravI5wSr^t|&4 zeHs&=qYgO3!wjl+?CR-uYhIw7feCDkqCQ+4|3I|3iv zRPi8BfAzE3R$w+kI7ghDa{zUOiPT{sb^MQ8$rpW(^}Cv-g{+t3VH^LB`XH$WggJO4 zy7r{RSa|qsP@<+h^co(^(5In_gZkr|F1-RSg}C_wb%I6%HOt@zmDD8$(j3ladOxJU zF~LxX2S2ry1Z;a->E#nl#c~hspxh8lh3!hQp`^AX^%*ZcVj;+!mBRJxpfX8$M3_iO zWW)cpDM&?5-$5STlI!&?yk6n}%`#Uc_>u>-nxb#)92LqB_X8yraU@`*BSc!#4U=oI z(jbX`ej-E+d@-BN0^@t13E{$R7N%(oFl<8 zLM|1|qck+!Ir7mUsKEz_E9^$Z%{I(XvPG#y%O0X$BpIXgFnh7&a?nSFTg(rv-)I1v z?E{RIn?ow7Hv5KOwsAo@>pP!RgAU>N<^^rN7Jj-IJ3D&RiF2cSeE`3b=6syV5c^zo zjBp6g#b_ypdu5?cdORt)6X!{6_Y^i+hjcTtLc{rHLezKz%EgF!E#uI&2m6H9eS*uI_xJm^#SQ>k3#Tc$Rb?QyH>PU3+o&MU*)wkS3ugh#l zob0J%nk;2mcyT@FqnHg$JHmH{)N-$2qHsBmsD)9#)c@$~%rfS@iaqMrWSu7+1r$Jx zfN*EJMDE2?j(=s)M_`JQndBFR%{mGoIW_DFMh}|9ELSIb28Qiu*($I(vU6{9+RtQj z?!zUFE$R24)CNa{lIESxUg(_IPVhEjUQlYy2Aql`Arz{N5tE5T)6!~iVlIV~=-L4s zMcH)ynit?EDHa9SUTrBDE~!~v;X z;lr@6?(pIyj)W70zL9Juyqu7gjKgjpptb3)9Y{9p&g~$hkD_1-RIMcRy*#{Za%^5_ zQ5rPXr;!&8hbxBfNp|ITMtdj)(!4-JaoQ3cn4;MQ2MT0Wm_erKj02u%#4w3CZd21` zyQ5yPoec~?m48J3&0f8`(d;qSmDa5-;T{s+q2;n;fq7#h) z24-0KbM8x#jbX|8Uw{ShN47<{I&lMs1{^oP!O}FO1~RTq$)xjQH7V<8bQG3K;6$g@ zo7ZDGQw%KnIP<~@5s$|t%q!(N+)*-M;UUuyRimq#4%!Z9RYZ>To0qFt)&pXp-=dyR z*F1N`!PQxh=qwFsS9Fjrpt}jhFG3h+lH<`N4?JyU284MxprxU%Y?Bj1n z1K#dANCh7E?Aa*pKL5H*C;>`+WhSzJ>Te$N)M2vuOy=n987L54PlN@RjmJ^ng8zG| z);aZ7gZ@KB;7Yt5Vg&la&iGq0a`gGF(Glvv!X-O27@VraWdS-e6@6tkkVW;{I~^=e^?t?o}MG)Tgczk|RC^;_w_Lr`0%Daq|-{)aJIIP1w7 z4fym7f@vnZBb4nVwt&CK!0;taO*(#F=U_l$vALoWjQeX8OzgvY4S?;e(tnFd(yTvq z={fJyf77c=<|HLqk42GAGA%~zNF)vV847DE9NaRLWMuYy(lfReX(7Pb(ExEyGMOxF za-ysrgS_Y%-RmZNBj2;MqdNj&ZN_NQ`r&N$=3~|>yRvU+pnuiMzGR}OdDY6UOwYbm zD+l9Pm7VEh8@j=yli7w#;~tHiTbv01>`c%Qjg6GUXPa)m*UwRE-5iYe$8mwW)rj znwlb3qo1}!(RuqGjbN$(G{i|Kqy$ebt6AMY*q7)^4!KwI*>G5ce8UasD46_I-nzlf zTC%+q1A0i0P!bGXRJQf@CYUx}XtkO&ctU<6=(}{*kCd%q%*Srq9<0keP_1ONH`BBK zI=Apyp^>IRr_!hZQe+I1sAIs5ZN^!j<8>xYp>C!lAQ4uD+wqN7m`z6qweP7_C&!Gp;cmL->J&GNuwvZx%vj(Wg0q`mCv~uh7`@#%n}K^@`0ROeab>#FbtbGyFo6X@!Xydyk&aI5I>*wTV%X*3wacCCelJbHC>7Uht>2 zN)G^J2qH90Y!CJAzji<*mJQ1bBV!w1uEsXg&5ZG5rXBZBJG=incU`q%l^WWAU7;0l z!!aKJ2(5q_0?85m%v^Bhq(!c60;>QXNhG|oZm2)~gRZCcQx&z<10E$~dBg9O8i7&%buOf_+oW4>G z#o9X8wQbzkwy`tr55^XPu3XK<$S0YeUB#nX%jNY6mMzpmxek_=B*k)vc%=<1+R{70 zNBTHGnZ zLF*Ze6RyzT?*X;#!BfnQ6|u1s-?PSFGyY?}zePqfS+4tX(?&_FO+e`o{u4dQrjb$8 zkt`#cByNfzwX3&b-MIjKOX4=vxVX7QJLCWP+!779Xm*}{M(W>(S%{|Q_Rx&?Y3vi8 zK^?y4=8dbj<3HYlD=|Sz18RI+L7E{nLdXDkaRpt^%x-?CRztk;L}R1Zfv#_Ua<#Xp z)=2jbph2 zQScRhiu{au!G)jT{N0&&V=V$@5O+M9&b-Yt@i*b3*d$ijA7OIWJo>9ZJ(6y3!}t-t46ubkPssipI@&28}$IybD3Z{D(I{koQT!=mQq zQX81PhPbWiF}DTQ)`cHcpIMSV@R`s-Xr9Z3?19Bq#+J-Lt7NueRpgF zA878*<SN;XjKQ{`Eds-Wc8i!T#ysi8 z7>jxn1F8OfD;hg^kzfa}zHB@O>6`c^mpUuC;^@I4=i{DaYG>cjisg$JyT7yN6=@zC z?}t4TgEizDJ_9HRnMyAj$_%bpJh=B5By8)?U74Yw%s}8PgyDw*U!VvSM$vCAdfU*V zF2s?}T$F;{l*YHmh)LysMAu=H%Y%H$5`f;YYH8eY5#+=*hXi_D-%1q|Mf!&^yh8E- z6xf1&&I7UHG9d>I_$2VzbtRK;a)-pBA8>bryBLW*Q;Q=fE^WLQPDEohPXtkJhDV>_ z^M#L9Y=--qja}1&f5~~glOJSw&xD_lnUXiXvIgkB(z9nGMJp=WR9b3 zOYy6k?tBiH+I8-Q$|z2u4;lnIt8w@n6D2*Y#X4|cSPBeAhW8(Tbh){!zsW%|&)YM( z17?&QwxMMO1(y-INS86p!VyXa5#_k|7yB#n>?Dmw3YJA+P)rnoz%g&t4rWjuWYO*v z>Z8iJx4>*;`W0=mm{%$aJv`MMory#3@Wo=xt22TpV%9kqR&H<(LlE||Rz9QGtwA4j zCo^~Lq*jmy9dB_c9TdZ!J{FI+CwcL>zIKl$H@L2Gof49%!zb5|pUFx)$z zYy*0rshB4#=eFS%2*=P3cPri$4{Mck*Lo!r!w);iHa*wPJu#VYO|}B){nv?!=YORV zz-+{t>@hD?&fUnHMG|=%+?znakkRJhin&t6G4O1_$5%SHE1~Z$@{ig8<%n!=4;D-` zb|(sk&y3voX=I$Zv|#1+H?Aga1jfS3H308&_I>2e>RJ+V(Y?K^X&9f_wh)+^^7s~) zU^k#@cMC*K7@!!`dd>$d+PqcXl0oWdglg)*|HZkWH6QbMb&D<>ps!~QcVDUB@t=r9 z=k9?=KbCpM90`M_Q#_VOf=al*8azg%_v0i+i|^r~Z2#dc!#%t<^sv6qzz=}GXYbT{ zc?)~iht>-{yeZW4rs2RiIrQ+!frkUcC_{G?exOFf)`21oLx%?+1EKk+vo$p6*1~pX9@sEutqx{>2?Y8*YOT}jkoW=E|>4eC8g0G=o57h6h?cfb9?AOs7$20 zAMm-_NlZ&w>@lXkP%)rwDwZ@YM{g+(Ivxdic#MOUyQ#4Z?7tS?ZmnVX`{g0f0_Wf` z0@*5cG`|Kk*}aV&`N953j&^_LCmMhR(xH55YxunRi zeTl|t*&sJ(2JaH6*o+GR;qnfnVE7V{{^fU7R@VzAYAUZp;|&Aahi?!zxgCjfnJljo zV^IwT0WI1`r7I21dofR83j@lv;;9iy>}l3giV8dZE!d)_i+WU_?8gbp=2mIL{gh*2 z{CuUPJ)aIg)1Y~ejvat1Tnj0nN|^ELu#Ls{oM(-za987e{4Y3gWk+InG9Dg1AW$kq zR0KP`C)Nc(w>_axI}AHYP)=zv)C%$-CjIJ4usEW<$Fj~uSA0nT zCiGXQ%WJT7Q!qGRu~mZe(dX%9qJgu9Thgpr#ZV^Gza|kBSAjWi@;N-b*l8$O>a*OJ zYs-D!u=aU*XC5g`OGAP9S2oi8*KMSQuVAE7R+`g`aR8@08ssi}-H>}=Mj8!r!y|=| z8~)kNdzf@es%K|%XnEqu_C!xAvnCHmRyu^9W9(F(NF;QOdvI0H+j3|25A?ikz#j81 zFa~z&MqM1oALz72^^EB7@mV)2Wj}Vh&@tE$lZwM(=t>zK_LCeRuS}G-oeG0E8z36y z1OSE~cv9>B>xQy8%fpco3|qwGI3)1`0|dBvW>lavQ*FFgQ`qN?Kst?o~9rfY0qk$l32WZ`Wo!Zyh_W%$wK?nWVFp{M&6fPcK$Z9vZRt&}?=Xv? z$}Am9VmOIcHb}6Dzk9h2V-9Z^{A{(esbJ<3?y=5fSIkh#=V{VWPlF z(j*IJlQ4lyj)nq^h?9|C5?GTKj}IS zAjfA5ALaoNNTzY_Js8FAtZ#L<@)ms-wh)Ykm{0&RLoz<$lW_A<3a$=s4B)v4h8h{n zrqRxWybS6{2!$DBJYnK_?;4T+fW&{~>*i2eWN;`h#fgA&C#lKdMTMrb4M_+7d!ROA zJUSbi0L3Q2!T`4KkS6~29gcAJilk7=d2Kh)4|oj{-n@}lqVQOjK10!j&|khk$C3>> zsaxir?Sva62`4jh(D#3lMmvs?48Yk^2==33qcOD4VDsS!f3Xn5YCt^VCj;4ZG1OKs zjIZt=Iy}@^hYfIFtXAGdg11wFN|f_ z?cLtF0mBwR~F1->O;R8G&nn)HC8mmr4zeTJEb(NE}SH#5p*

i_*A}3e!d0>wUUBAtI`x$ZS28&V zkHd=B0$AEUCKV())6r%?FSE}r0KF}R*#>rC%Q}jI?Ku#^>#Z9U0OR#g4+;$Z2GS4; zKp0)41F0m~1`QC9O;51B1Zp}!s=_PmJs3JX$ZrKx4|A9RIdp*mUI+1N8##b&*Jg68 z<5ozU5c_|%)^DI^AY<(-_J158zegCLLR4fQ&Zlq&y&ZvW12{H5j>3Qt^2iYBGHVeJ_eYFKgPfMyvu481&pg?z2G=>SNt!+6eK;rvd(^@V3e ze1h&GIeI7`+>D4yXrTX{YD{F#XW5@ij3!4Z;h3I^Y(k9q%V9^W%3O)mDOhV%8 zSUJeLG}v6KS96g6^N%9+ng>Uz)Hxf+k01BI!)xW~v<&&iW9oi{%!a#&(Jf!e1voqc zEPaeVMhglG?Wn*oqm~?g@LxanYeu#2WJfhwr|%;~FmJa=^g=TqBQG&H9m;g%cj}!! z1u~ajN2W?K_1!tCXRvrM5*m^BL#N};{nurgC7QtL1!TMjwuaZ?|FI4q>!=rTD)+^w zlSsS|EPME8qBQ)SUZpX3`5alGQ>;S6g@nBA5y!JPOee2c4RD6T6u&ek*VoviZ*riE z$B&{}Xs_H!cuE2Nho@1@5gK0v4kvCJR_RIWOtoQ+vLL>JqSMEOA~)2)lXzn}`d?rz z5oB0_kfF^h7y)!_Zp^LVGjikA=s;a*_|RfI_K{i#RdsaG2DYB#y^PFfal~oy+Qu{^ z0L+U3aNq-)kwM=;%0&dW=!zUjFJ*AJ0EyWAlflQaQ42}tG3q2^?sxP)$w=3)gR&DD z(|>^6OEWSD&CE6*k1R%9lc=j_$T2U<#9()UMRH}@M3J8ICj$-GJk@2-o7icU=20Aho@9 zyxl#FSa7(dNC5B$lbLbPj9@RbnqlR@=|{6j3wQub2Z?&ykxrF$CE2H<4(ge9QUC#FY+?bR7Z!@$b}B2GHE&ib(J%n7Cz;wbiJfc6XV!*%JQ z%xlaKWeDu9*GiihbK+}w6%2$io!z2q3mGCV(*>v~ZVJA}Tku>3)^o_a2Nt=PJegIn zlh=q3S{AqyE{uw#9O*3j-`=gh2dH@}BwXC7NW)AErL0@orwP#q*ypfa2e_!&Im5n!r7A@|Ay2AKbfxMTQ8#)yI1)S~ zD0~TB6(Xqcjnw6<;}IkEJ{3-4N<+zf6vc>Hn%+UBsaX`$)kh9kj0~y}(lNXGk*hhH ztug~5);$RCs(8lg@Oh-;yPZo(htuzdolAgzT(%b$0un`j4MpVPUiNO}Y>1=}n;XRS z$&G>l9-!T9?>~Smv)Am;0$Hz)0`1)fKya7KIhtaONPTka0BcPJ#&`{BV$5n&VGu`P zFE)F!aA%d^#0DefpvB{ffI-G9YZ_7 zY``|a8;J)LfbRfpIa}|6bujyF#3#c?1xI|rU1BF|tE07Lld*@c9#h!Gf8K*nPJayKLyfKy}lQP`4^40}%1v_v` zvwH|BJi5*=tt^%%V#RWOl|(lAHacjW^Q|ijC-6j26j-BI>rajJ4*H*s3G;Y`d-%n3 z$oUS-7`Aq_Jt%~GrSv%&mS@vzGw(;LEt_vG*2Way}x(=+W*?Gf17T!g;pXxPm zxw|l!-rqs&Y;k$uds5?@Vy9|wiHMM7C%Mxre1~(ryDsq+@xyXecX_GsVu)<@9=@7|-vAZ7oXk^dq$ z0ehjEnhlvA^1C$D#I5vcGxVKmwIx zd8Dvlmw}16gz6}3Bxk3hSBOquEg9Jccnzs&tnQZr;2j_qW$Qh#42JvIo&=hxjk$44 zFJ{SO4Ww>rYJNwZcOL<+ejh|70y)r%%t0q|N!lnd(llR$)K#9tM(jayTo$!Q+(>9Q zF80Z#hUxaTQs>6H&f`3WEMZX{^f*AvT&VK{zIOJ3UhUFZdJPb%%PXAZRq~3?z2QSs zua-}QJAVy%#F*W27T69D<%D|<;N38XVV`nWr$#9Jb*puC;Kv)joY;XMZ}_@b!;SZ9 zi9OW!8;RDVpdBDm4|Qy(^x+<|5qh}p*ek1JH+)eyKTHQ^ywMZ-ff;Y~gdQI6KoUCo zexnk)fc6>?dKjOEr4L6`E}=VeS!(#uOL~A+b4&kkqy@5rHyau+wO{w1DF$13s}xK8 znBqUiIyz+a5UvC1VND^q^BB6Y_Q1Am(uJ7|jd4JV@>x2!bG?xsbP2*aro9y<_d}%6 zZuKUFDutS(5l0-Mi<9YUKf|7i2n-0?SO}BDAQ>pzn~lS#+-{hM4Pcp)oh_Ka3fw#80&(?E&Xa%#1~kTDwqjW-kL&g zqP~W`tY>Q~xko>1tJ+;I6}V~r_@0c`CNJ;cP0+f|tNUD#4mP6n5__pZ?LAX{SPwhJ zEl&&-OLgiK0d$K&?G*EP*2z3d#!qZ*v3FLf??FI4B=dSjhZI?}KhH>CfnwXHhuYRm zH|{G(H6ypW@?`%cOjebi&5y_?0W^&Rt)FHP^S=u}Xl0fsL+9;gxT z9qZC1)vP@RHkr#q#~H-ob{E_m73QS4sn&8|?Wzq(fI`|6vbT6kM-q25p{yIOptT** z8fl1Et5jL~e?!UbD2B<~Mq;-1S&cqp!6O0RVNVSFf5&0{$6 lecture du fichier impossible : - unable to read file : + unable to read file : Impossible d'ouvrir le fichier %s - unable to open file %s + unable to open file %s @@ -19,1406 +19,1413 @@ On retourne le fichier non converti. Prevenir la maintenance. %s - Unable to translate the file. it probably contains mistake + Unable to translate the file. it probably contains mistake ask eficas team %s Format de sortie : %s, non supporte - Unsupported format %s + Unsupported format %s Impossible d'ouvrir le fichier : %s - unable to open file: %s + unable to open file: %s Erreur ! Erreur ! - Error! + Error! Erreur rencontree dans recherche_enfants : %s - Error in recherche_enfants : %s + Error in recherche_enfants : %s Erreur dans la creation du mot-cle : %s - Error when creating %s + Error when creating %s Impossible d'ouvrir le fichier : %s - unable to open file : %s + unable to open file : %s le texte a analyser n'est pas celui d'une commande ou d'un operateur : - text is no eficas text: + text is no eficas text: Erreur dans la recherche du nom de la commande : - error when searching command's name : + error when searching command's name : Erreur dans la recherche des args de la commande : - error when searching argument's command : + error when searching argument's command : Erreur dans la recherche du nom de la commande : - error when searching command's name : + error when searching command's name : Erreur dans la recherche des args de la commande : - error when searching argument's command : + error when searching argument's command : %d n'est pas un index valide pour append_brother - %d is not a valid index for append-brother + %d is not a valid index for append-brother le fichier de commandes %s n'existe pas - commands file %s does not exist + commands file %s does not exist un fichier de commandes doit etre defini avant une poursuite %s - You have to define principal commands file before a secondary (poursuite) file %s + You have to define principal commands file before a secondary (poursuite) file %s le fichier poursuite %s n'existe pas - the secondary (poursuite) file does not exist + the secondary (poursuite) file does not exist include mal defini %s - include is not correct %s + include is not correct %s un fichier de commandes doit etre defini avant un include %s - You have to define principal commands file before include %s + You have to define principal commands file before include %s le fichier include %s n'existe pas - include file does not exist + include file does not exist jdc %(v_1)s, le fichier de commandes %(v_2)s n'existe pas v_1 - jdc %(v_1)s : .comm %(v_2)s does not exist + jdc %(v_1)s : .comm %(v_2)s does not exist le fichier jdc %s n'existe pas - file %s does not exist + file %s does not exist jdc %s manque option jdc dans section jdc - jdc %s does not have jdc option in command line + jdc %s does not have jdc option in command line %(v_1)s include %(v_2)s : %(v_3)s v_1 - %(v_1)s include %(v_2)s : %(v_3)s + %(v_1)s include %(v_2)s : %(v_3)s %(v_1)s fichier poursuite: %(v_2)s v_1 - %(v_1)ssecondary (poursuite) file %(v_2)s + %(v_1)ssecondary (poursuite) file %(v_2)s nom etude : %s - study's name : %s + study's name : %s utilisation : %prog [options] - use : %prog[options] + use : %prog[options] nom du fichier de commandes - principal .comm file's name + principal .comm file's name nom du fichier poursuite - secondary (poursuite) file's name + secondary (poursuite) file's name numero d'unite suivi du nom du fichier include - unit number and include file's name + unit number and include file's name fichier decrivant une etude - file containing a study + file containing a study version de catalogue a utiliser - catalog's version + catalog's version nom du code a utiliser - code's name + code's name niveau de debug - debug level + debug level schema - schema + schema Nombre incorrect d'arguments - incorrect number of arguments + incorrect number of arguments Localisation specifiee pour l'application. - specified localization for the application. + specified localization for the application. Impossible de transferer les fichiers requis dans : %s - unable to transfer files to : %s + unable to transfer files to : %s Erreur - error + error Erreurs fatales - fatale error + fatale error Impossible reconstruire commande - unable to construct command + unable to construct command Objet commentaire non valorise - comment object has no value + comment object has no value Debut Fonction %s - start function %s + start function %s Fin Fonction %s - end function %s + end function %s Nom de concept deja defini : %s - Concept's name %s is already existing + Concept's name %s is already existing Longueur incorrecte - incorrect length + incorrect length L'attribut 'min' doit etre un entier : - min must be an integer : + min must be an integer : L'attribut 'max' doit etre un entier : - max must be an integer : + max must be an integer : Nombres d'occurrence min et max invalides : - min and max are invalid: + min and max are invalid: L'attribut 'fr' doit etre une chaine de caracteres - 'fr' must be a string + 'fr' must be a string L'attribut 'statut' doit valoir 'o','f','c' ou 'd' - values for statut arguments are : 'o','f','c' or 'd' + values for statut arguments are : 'o','f','c' or 'd' L'attribut 'docu' doit etre une chaine de caracteres - docu must be a string + docu must be a string Fin - end + end Le parametre EVAL %s ne peut valoir None - None is not a valid value for Eval parameter %s + None is not a valid value for Eval parameter %s Pas de nom donne au parametre EVAL - No name for parameter EVAL + No name for parameter EVAL Un nom de parametre ne peut depasser 8 caracteres - parameter's name can not exceed 8 characters + parameter's name can not exceed 8 characters Un concept de nom %s existe deja ! - Concept's name %s is already existing! + Concept's name %s is already existing! ERREUR - ERROR + ERROR Format pas implemente : %s - format : %s not implemented + format : %s not implemented Type d'objet non prevu : %s - object type not expected : %s + object type not expected : %s ce groupe de maillage %s est associe a au moins un materiau et au moins une source. - mesh group %s is associated with at least one material and at least a source. + mesh group %s is associated with at least one material and at least a source. ce groupe de maillage %s n'est associe a aucun materiau ou source. - mesh group %s is associated with no material or no source. + mesh group %s is associated with no material or no source. toutes les donnees ne sont pas connues - all data are not available + all data are not available Fichier patron %s n'existe pas. - pattern file %s does not exist. + pattern file %s does not exist. Pas supporte - not implemented + not implemented Entite inconnue ou interdite :%s - Unknown or unsupported entity : %s + Unknown or unsupported entity : %s Entite inconnue ou interdite :%s. Elle est ignoree - Unknown or unsupported entity : %s. ignored + Unknown or unsupported entity : %s. ignored Les tuples ne sont pas supportes pour le format ini :%s - Tuple are not allowed for format ini : %s + Tuple are not allowed for format ini : %s Type de valeur non supportee par le format ini :%(nom)s %(exception)s nom - Unsupported type of value for .ini format %(nom)s + Unsupported type of value for .ini format %(nom)s %(exception)s Il y a un pb a la Creation du XML - problem when creating XML + problem when creating XML Il y a un pb a la Creation du STD - problem when creating STD + problem when creating STD Entite inconnue ou interdite : %s. Elle est ignoree - unkown ou unsupported entity : %s. ignored + unkown ou unsupported entity : %s. ignored Tag %s non-defini. Ceci est un bogue interne. en informer les developpeurs. - Tag %s not defined. Ask developpeurs team. + Tag %s not defined. Ask developpeurs team. Le mot-cle %s est obligatoire. - mandatory keyword : %s. + mandatory keyword : %s. concept %(inst_name)s de type %(class_name)s inst_name - concept %(inst_name)s of type %(class_name)s + concept %(inst_name)s of type %(class_name)s Un nom de concept doit etre un identificateur Python - concept's name must be a python identifier + concept's name must be a python identifier Concept existant - allready existing concept + allready existing concept Operateur reentrant mais concept non existant - operator 'reentrant' but concept does not exist + operator 'reentrant' but concept does not exist Operateur reentrant et concept existant trouve - Operator 're-entrant' and concept exists + Operator 're-entrant' and concept exists Concept deja existant et de mauvais type - already existing concept of not supported type + already existing concept of not supported type Nommage du concept refuse : un concept de meme nom existe deja - Name is refused : already existing concept + Name is refused : already existing concept Nommage du concept effectue - Concept named + Concept named Nommage impossible %s - unable to name %s + unable to name %s La liste des arguments d'une formule doit etre entre parentheses : parenthese ouvrante manquante - formula expects a list of arguments : no left parenthesis + formula expects a list of arguments : no left parenthesis La liste des arguments d'une formule doit etre entre parentheses : parenthese fermante manquante - formula expects a list of arguments : no right parenthes + formula expects a list of arguments : no right parenthes Pas de nom donne a la FORMULE - no name given + no name given Un nom de FORMULE ne peut depasser 8 caracteres - name too long (8 characters max) + name too long (8 characters max) Un nom de FORMULE ne peut pas commencer par un chiffre - name does not begin with a figure + name does not begin with a figure Le type de la valeur retournee n'est pas specifie - no type is specified for the return value + no type is specified for the return value Une formule ne peut retourner une valeur de type : %s - impossible to return a value of type : %s + impossible to return a value of type : %s Impossible d'ajouter la commande - unable to add the keyword (commande) + unable to add the keyword (commande) Impossible d ajouter la commande - unable to add the keyword (commande) + unable to add the keyword (commande) Pas implemente - not implemented + not implemented Nom de concept deja defini - already defined concept + already defined concept Nom de concept deja defini : - already defined concept : + already defined concept : Impossible de trouver le fichier correspondant a l'unite - unable to find file corresponding to unit + unable to find file corresponding to unit n'est pas un fichier existant - is not an existing file + is not an existing file Fichier invalide %s - invalid file %s + invalid file %s Impossible de construire le jeu de commandes correspondant au fichier - unable to create the jdc corresponding to the file + unable to create the jdc corresponding to the file Erreur lors de l'evaluation du fichier inclus - Error when reading the 'include' file + Error when reading the 'include' file Ce fichier ne sera pas pris en compte %s - the file is ignored + the file is ignored %s Ce fichier ne sera pas pris en compte Le fichier associe n'est pas defini - the file is ignored : associated file is not defined + the file is ignored : associated file is not defined Le fichier n est pas defini - file is not defined + file is not defined le fichier doit contenir une unique variable de sortie - file must declare a single output variable + file must declare a single output variable Fichier invalide - invalid file + invalid file Le contenu de ce fichier ne sera pas pris en compte %s - the file will be ignored : + the file will be ignored : %s Le fichier INCLUDE n est pas defini - include file is not defined + include file is not defined Le contenu de ce fichier ne sera pas pris en compte - file will be ignored + file will be ignored Erreur lors de l'evaluation du fichier poursuite - Error when creating secondary (poursuite) file + Error when creating secondary (poursuite) file L'objet %(v_1)s ne peut etre un fils de %(v_2)s v_1 - Object %(v_1)s can not be a child for %(v_2)s + Object %(v_1)s can not be a child for %(v_2)s L'objet %s ne peut pas etre repete - Object %s can not be repeated + Object %s can not be repeated Erreur - mclist inexistante : %s - Error - mclist does not exist : %s + Error - mclist does not exist : %s Erreur - mot cle facteur de nom : %s - Error - keyword "mot-clef facteur" nammed : %s + Error - keyword "mot-clef facteur" nammed : %s traitement non-prevu - unexpected task + unexpected task L'objet %s ne peut pas etre ajoute - Object %s cannot be add + Object %s cannot be add None n'est pas une valeur autorisee - None is not a valid value + None is not a valid value un concept de meme nom existe deja - concept already exists + concept already exists Concept cree - concept created + concept created La matrice n'est pas une matrice %(n_lign)d sur %(n_col)d n_lign - matrix is not a %(n_lign)d x %(n_col)d matrix + matrix is not a %(n_lign)d x %(n_col)d matrix Decommenter - uncomment + uncomment Decommente la commande - uncomment the command + uncomment the command Impossible de supprimer un mot-cle obligatoire - mandatory keyword cannot be deleted + mandatory keyword cannot be deleted Mot-cle %s supprime - Keyword %s deleted + Keyword %s deleted Pb interne : impossible de supprimer ce mot-cle - internal problem : unable to delete keyword + internal problem : unable to delete keyword Commentaire supprime - comment is deleted + comment is deleted Commande %s supprimee - command %s is deleted + command %s is deleted Pb interne : impossible de supprimer cet objet - internal problem : unable to delete object + internal problem : unable to delete object Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas - unable to convert .comm file in order to open it with Eficas + unable to convert .comm file in order to open it with Eficas Include vide - include file is empty + include file is empty L'include doit etre correctement initialise pour etre visualise - include file must be correct + include file must be correct Impossible de supprimer ce mot-clef - unable to delete this keyword + unable to delete this keyword View3D - View3D + View3D affiche dans Geom les elements de structure - diplay SE in Geom + diplay SE in Geom Graphique - graphic + graphic affiche la distribution - display distribution + display distribution Impossible de supprimer un mot-clef obligatoire - unable to delete a mandatory keyword + unable to delete a mandatory keyword Mot-clef %s supprime - Keyword %s is deleted + Keyword %s is deleted Definition d'un parametre - defines a parameter + defines a parameter Import du fichier de Configuration - import configuration file + import configuration file Erreur a la lecture du fichier de configuration %s - Error when reading configuration file + Error when reading configuration file Erreur fatale au chargement de %s - fatal error when loading %s + fatal error when loading %s Erreur fatale au chargement d'un fichier - Fatal error when loading file + Fatal error when loading file fichier modifie - file updated + file updated Attention! fichier change hors EFICAS - Warning ! this file was modified outside Eficas + Warning ! this file was modified outside Eficas Type de fichier non reconnu - unsupported file type + unsupported file type EFICAS ne sait pas ouvrir le type de fichier %s - Eficas is not able to open this file's type : %s + Eficas is not able to open this file's type : %s EFICAS ne sait pas ouvrir ce type de fichier - Eficas is not able to open this file's type + Eficas is not able to open this file's type Copie impossible - unable to copy + unable to copy Veuillez selectionner un objet a copier - you have to select an object to copy + you have to select an object to copy Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne - You have to select a single object : copy will be done after the selected node + You have to select a single object : copy will be done after the selected node Aucun Objet n a ete copie ou coupe - No object was cut or copied + No object was cut or copied Copie refusee - rejected copy + rejected copy Eficas n a pas reussi a copier l objet - Eficas cannot copy this object + Eficas cannot copy this object Copie refusee pour ce type d objet - Copy rejected : bad object type + Copy rejected : bad object type Deplacement refuse - move rejected + move rejected Deplacement refuse entre 2 fichiers. Seule la copie est autorisee - move rejected. no move between two files : only copy is available + move rejected. no move between two files : only copy is available Copie impossible a cet endroit - unable to copy here + unable to copy here Veuillez selectionner une commande, un parametre, un commentaire ou une macro - select a command; a parameter, a comment or a macro + select a command; a parameter, a comment or a macro Choix d'un fichier XML - Choice of XML file + Choice of XML file Ouvrir Fichier - Open file + Open file Erreur a la generation - Error when generating + Error when generating EFICAS ne sait pas convertir ce JDC - Eficas is unable to convert JDC + Eficas is unable to convert JDC Format %s non reconnu - not supported format %s + not supported format %s Execution impossible - Unable to execute + Unable to execute le JDC doit etre valide pour une execution MAP - JDC has to be valid before run + JDC has to be valid before run le JDC doit contenir un et un seul composant - JDC must contains a single componant + JDC must contains a single componant - sauvegarde - save + Sauvegarde du Fichier + Save File - Sauvegarde du Fichier - save file + Le fichier + file - Le fichier <b>%s</b> existe deja. - file <b>%s</b> already exists. + existe deja + allready exists - &Ecraser - &Replace + &Replace - - Donnez le nom du fichier correspondant a l unite logique - Choose file corresponding to unit + &Abandonner + &Cancel Choix d'un fichier de poursuite - Choose poursuite file + Choose poursuite file Le fichier %s contient une commande POURSUITE - file %s contains a POURSUITE command + file %s contains a POURSUITE command Traduire Fichier - file translation + file translation Fichiers JDC (*.comm);;Tous les Fichiers (*) - JDC files(*.comm);; All FIles(*) + JDC files(*.comm);; All FIles(*) Fichier Traduit : %s - Translated file : %s + Translated file : %s Pas de difference entre le fichier origine et le fichier traduit - No difference between the primary file and the translated file + No difference between the primary file and the translated file %d versions du catalogue sont disponibles - %d catalogs versions are available + %d catalogs versions are available &Ok - &Ok + &Ok Entrez - enter + enter valeurs - values + values Entrez entre - enter between + enter between et - and + and Selection - selection + selection Type de base inconnu - unkown type + unkown type Visualisation Fichier - view file + view file Impossibilite d'afficher le Fichier - Unable to display file + Unable to display file Sauvegarder Fichier - save File + save File Fichier selectionne - file selected + file selected expression valide - valid expression + valid expression expression invalide - unvalid expression + unvalid expression expression n est pas de la forme a+bj - expression is not as a+bj + expression is not as a+bj entrer une seule valeur SVP - Please, enter a single value + Please, enter a single value saisir le type de complexe - choose complex's type + choose complex's type Sauvegarder le fichier - save file + save file Le fichier <b>%(v_1)s</b> n'a pu etre sauvegarde. <br>Raison : %(v_2)s v_1 - file <b>%(v_1)s</b> was not saved. Raison : %(v_2)s + file <b>%(v_1)s</b> was not saved. Raison : %(v_2)s &Recents - &Recently Opened + &Recently Opened Aide specifique - code's help + code's help Traduction - translation + translation Options - Options + Options version - version + version pour - for + for Aide Indisponible - no help avalaible + no help avalaible Parametrage - Options + Options Veuillez d abord choisir un code - Choose a code + Choose a code Pas de possibilite de personnalisation de la configuration - no options avalaible for configuration + no options avalaible for configuration &Effacer - &Delete + &Delete Veuillez entrer le complexe sous forme aster ou sous forme python - enter a complex + enter a complex Import du catalogue - Loading catalog + Loading catalog Pas de catalogue defini pour le code - No catalog for this code + No catalog for this code Aucun catalogue trouve - No catalog + No catalog avec le catalogue - with catalog + with catalog Impossible d'importer le catalogue - unable to load catalog + unable to load catalog Choix d une version du code - Choose a version for + Choose a version for Choix d une version - choose a version + choose a version Parametre - parameter + parameter Insere un parametre - insert a parameter + insert a parameter item invalide - invalid item + invalid item l item doit etre valide - item must be valid + item must be valid apres - after + after Insere un commentaire apres la commande - insert a comment after the command + insert a comment after the command avant - before + before Insere un commentaire avant la commande - insert a comment before the command + insert a comment before the command Insere un parametre apres la commande - insert a parameter after the command + insert a parameter after the command Insere un parametre avant la commande - insert a parameter before the commande + insert a parameter before the commande Supprimer - delete + delete supprime le mot clef - delete keyword + delete keyword Documentation - documentation + documentation documentation sur la commande - command's documentation + command's documentation Documentation Vide - empty documentation + empty documentation Aucune documentation n'est associee a ce noeud - no documentation is available for this node + no documentation is available for this node impossible de trouver la commande - unable to find command + unable to find command Lecteur PDF - PDF reader + PDF reader impossible d'ouvrir - unable to open + unable to open Commentaire - Comment + Comment ce noeud - this node + this node commente le noeud - comment this node + comment this node Fichiers JDC (*.comm);;Tous les Fichiers (*) - JDC Files (*.comm);;All Files(*) + JDC Files (*.comm);;All Files(*) &Quitter - &Exit + &Exit Quitter - Exit + Exit + + + sauvegarde + save Fichier Duplique - file is duplicated + file is duplicated Le fichier ne sera pas sauvegarde. - File will not be saved. + File will not be saved. &Annuler - &Cancel + &Cancel Fichier - File + File Le fichier <b>%s</b> est deja ouvert. - File <b>%s</b> is already open. + File <b>%s</b> is already open. &Duplication - &Duplication + &Duplication &Abort - &Abort + &Abort Fichier Modifie - File is modified + File is modified Le fichier %s n a pas ete sauvegarde. - file %s was not saved. + file %s was not saved. &Sauvegarder - &Save + &Save + + + + &Quitter sans sauvegarder + &Quit anyway Erreur a l'evaluation : %s - Error when loadind : + Error when loadind : %s Un fichier de nom %s existe deja : impossible de creer un repertoire de meme nom - File %s already exists : unable to create a directory with the same name + File %s already exists : unable to create a directory with the same name Creation du repertoire %s impossible Verifiez vos droits d'acces - Unable to create directory : check your access rights + Unable to create directory : check your access rights localisation de l'application, pour la traduction - use for application translation + use for application translation n'est pas un index valide pour append_brother - is not correct - no possible "append_brother" + is not correct - no possible "append_brother" Erreur interne - Internal error + Internal error La PDF de la loi ne peut pas etre affichee. - unable to display law's PDF. + unable to display law's PDF. Le fichier contient une commande MODEL - file contains MODEL command + file contains MODEL command Choix unite %d - Choice for unit %d + Choice for unit %d Fichier pour unite - File for unit + File for unit La formule passee a l'interpreteur doit etre sous forme de tuple - formula must be written as tuple + formula must be written as tuple Debut - Beginning + Beginning Le parametre EVAL ne peut valoir None - None is not a valid value for EVAL + None is not a valid value for EVAL Pas de nom donne au parametre - No name given + No name given Le parametre %s ne peut valoir None - None is an incorrect value for parameter %s + None is an incorrect value for parameter %s Format non implemente : %s - Not implemented format + Not implemented format Type de valeur non supporte par le format pyth : n %(exception)s nom - unsupported type of value + unsupported type of value Impossible de realiser la verification de la formule - unable to verify formula + unable to verify formula Pb interne : impossible de supprimer ce mot-clef - internal problem : unable to delete keyword + internal problem : unable to delete keyword Eficas ne peut pas traiter plusieurs instructions sur la meme ligne : %s - Eficas is not able to manage many instructions on a same line + Eficas is not able to manage many instructions on a same line le texte a analyser n'est pas celui d'une commande ou d'un operateur : %s - text is not valid for a command or a operaor + text is not valid for a command or a operaor le texte a analyser n'est pas celui d'une commande connue : %(v_1)s %(v_2)s v_1 - text is not valid for command %(v_1)s %(v_2)s + text is not valid for command %(v_1)s %(v_2)s le texte a analyser n'est pas celui d'une commande connue : %(v_1)s %(v_2)s v_1 - text is not valid for command %(v_1)s %(v_2)s + text is not valid for command %(v_1)s %(v_2)s jdc %(v_1)s manque fichier comm dans section %(v_2)s v_1 - file %(v_1)s need a .comm file in section %(v_2)s + file %(v_1)s need a .comm file in section %(v_2)s @@ -1426,614 +1433,613 @@ Le fichier associe n'est pas defini fichier include %(v_2)s, %(v_3)s n'existe pas v_1 - file %(v_1)s need an include file %(v_2)s,%(v_3)s does not exist + file %(v_1)s need an include file %(v_2)s,%(v_3)s does not exist jdc %(v_1)s manque fichier comm dans section %(v_2)s v_1 - file %(v_1)s need a .comm file in section %(v_2)s + file %(v_1)s need a .comm file in section %(v_2)s jdc %(v_1)s, le fichier de commandes %(v_2)s n'existe pas v_1 - jdc%(v_1)s, .comm %(v_2)s does not exist + jdc%(v_1)s, .comm %(v_2)s does not exist Include Invalide. ne sera pas pris en compte - Invalid include file. text will not be included + Invalid include file. text will not be included Impossible de relire le fichier %s - unable to read file + unable to read file Le fichier include contient des erreurs - include file contains errors + include file contains errors PARAMETRE - PARAMETER + PARAMETER EFICAS ne sait pas convertir le JDC selon le format - Eficas does not know how to convert data according to the defined format + Eficas does not know how to convert data according to the defined format le JDC doit etre valide pour une execution - Before a run action, JDC must be valid + Before a run action, JDC must be valid Sauvegarder SVP avant l'execution - Save before run action + Save before run action Sauvegarde de l'input impossible - unable to save input file + unable to save input file Un JdC valide est necessaire pour creer un .input - file must be valid to create a .input file + file must be valid to create a .input file Choix du composant obligatoire - You have to choose a component + You have to choose a component Le fichier %s contient une commande INCLUDE - file %s contains an "INCLUDE" command + file %s contains an "INCLUDE" command Donnez le nom du fichier dont vous voulez faire une poursuite - Name the principal file + Name the principal file Fichiers Med (*.med);;Tous les Fichiers (*) - Med Files (*.med);;All Files(*) + Med Files (*.med);;All Files(*) Fichier Med - Med File + Med File Veuillez selectionner un fichier Med - Choose a Med file + Choose a Med file reel - float + float entier - integer + integer complexe - complex + complex l'aide n est pas installee - Help is not available + Help is not available Export Med vers Fichier - export Med Mesh in a file + export Med Mesh in a file Impossibilite d exporter le Fichier - Unable to export file + Unable to export file objet valide - valid object + valid object Valeur non modifiable - value can not be changed + value can not be changed Options pour - Settings + Settings Nombre minimal de valeurs : - minimal number of values : + minimal number of values : Nombre maximal de valeurs : - Maximal number of values : + Maximal number of values : l expression n est pas de la forme a+bj - expression must be as a+bj + expression must be as a+bj Valeur du mot-cle enregistree - Value is recorded + Value is recorded Valeur du mot-cle non autorisee - Value is not authorized + Value is not authorized - - Fichier non encore nomme - unnamed file + Fichier non encore nomme + unnamed file SOURCE - SOURCE + SOURCE EnveloppeConnexeInducteur - Bounding_Box + Bounding_Box VecteurDirecteur - Direction_Vector + Direction_Vector Centre - Center + Center SectionBobine - Section + Section Amplitude - Amplitude + Amplitude NbdeTours - NbTurns + NbTurns CONDUCTEUR - CONDUCTOR + CONDUCTOR Conductivite - Conductivity + Conductivity PermeabiliteRelative - Relative_Permeability + Relative_Permeability NOCOND - DIELECTRIC + DIELECTRIC VCUT - CUT + CUT Orientation - Orientation + Orientation ZS - ZS + ZS RepCarmel - Carmel_Directory + Carmel_Directory TypedeFormule - Formula + Formula Frequence - Frequency + Frequency Nb_Max_Iterations - Max_Nb_Iterations + Max_Nb_Iterations Erreur_Max - Max_Error + Max_Error Format non implemente - non implemented format + non implemented format Fichier de donnees - data file + data file Tous les Fichiers (*) - all files (*) + all files (*) Select - select + select nb min de valeurs : - minimal number of values : + minimal number of values : nb max de valeurs atteint - maximum number of values + maximum number of values Sauve Format Ligne - save file in line format + save file in line format Valeur du mot-clef enregistree - value recorded + value recorded Valeur du mot-clef non autorisee : - unvalid value + unvalid value %s n'est pas un fichier valide - %s is not a valid file + %s is not a valid file : verifie les types dans un tuple - valids type in a tuple + valids type in a tuple Les types entres ne sont pas permis - unvalid type for values + unvalid type for values La cardinalite n'est pas correcte, la derniere valeur est ignoree - unvalid multiplicity. last value will be ignored + unvalid multiplicity. last value will be ignored n est pas un tuple de - is not a tuple + is not a tuple valeurs - values + values Valeur incorrecte - incorrect value + incorrect value n est pas un identifiant correct - is not a valid name + is not a valid name Entrer un float SVP - Float expected + Float expected Entrer un float inferieur a - float lower than + float lower than Entrer un float superieur a - float superior than + float superior than Mauvaise execution - bad run + bad run impossible d executer la methode - unable to run method + unable to run method Mauvaise Commande - bad command + bad command Aucune variable connue - no possible variable + no possible variable Mauvaise dimension de matrice - bad matrix dimension + bad matrix dimension le nombre de ligne n est pas egal a - number of lines is not + number of lines is not le nombre de colonne n est pas egal a - number of columns is not + number of columns is not Mauvaise Valeur - bad value + bad value l element - element + element n est pas correct - is not correct + is not correct Modification Impossible - unable to modify + unable to modify le parametre n'est pas valide - parameter is not valid + parameter is not valid n est pas un identifiant correct - is not a correct name + is not a correct name Valeur incorrecte: - incorrect value : + incorrect value : Valeur incorrecte - incorrect value + incorrect value Valeur correcte - valid value + valid value impossible d'evaluer : - unable to evaluate : + unable to evaluate : Un concept de nom %s existe déjà ! - already existing concept with name : %s ! + already existing concept with name : %s ! existe deja - already exists + already exists La matrice n'a pas le bon entete - header does not match with matrix + header does not match with matrix le mot clef - keyword + keyword doit etre insere avant - has to be inserted before + has to be inserted before insertion impossible - unable to insert keyword + unable to insert keyword doit etre insere apres - has to be inserted after + has to be inserted after Nb maximum de valeurs atteint - Maximal number of values + Maximal number of values pas de regle de construction pour ce jeu de commandes - No specific rules for building this dataset + No specific rules for building this dataset Gestion Maillage - Mesh Menu + Mesh Menu Acquiert groupe mailles - Read elements mesh + Read elements mesh Acquisition Groupe Maille - Read elements mesh + Read elements mesh VERSION - VERSION_EN + VERSION_EN NUM - NUMBER + NUMBER FILETYPE - FILETYPE + FILETYPE PARAMETERS - Parametres + Parametres Fichier_maillage - FichierMaillage + FichierMaillage Echelle_du_maillage - MeshScale + MeshScale Formulation - Fomulation + Fomulation Timeproblem - TimeProblem + TimeProblem spectral - EssaiSpectral + EssaiSpectral Basis - Basis + Basis Fourier - Fourier + Fourier Ordre - Ordre + Ordre FREQUENCY - Frequency + Frequency minimisation - Minimisation + Minimisation no - no + no yes - yes + yes nb_procs_para - NbProcs + NbProcs POLYMER - Polymer_en_Anglais + Polymer_en_Anglais MODEL_DATABASE - MoDEL_DATa_Anglais + MoDEL_DATa_Anglais @@ -2428,17 +2434,17 @@ p, li { white-space: pre-wrap; } Execution - Run + Run Execution - Run + Run Patrons - Patterns + Patterns @@ -2528,12 +2534,12 @@ p, li { white-space: pre-wrap; } Save Run - Save run + Save run Run - run + run @@ -2555,13 +2561,9 @@ p, li { white-space: pre-wrap; } Afficher l'Arbre Show dataset tree - - - JDCEditor - &Abandonner - &Cancel + &Cancel @@ -2772,7 +2774,7 @@ p, li { white-space: pre-wrap; } <html><head/><body><p><span style=" color:#0000ff;">Commentaire</span></p></body></html> - <html><head/><body><p><span style=" color:#0000ff;">Comment</span></p></body></html> + <html><head/><body><p><span style=" color:#0000ff;">Comment</span></p></body></html> @@ -2787,7 +2789,7 @@ p, li { white-space: pre-wrap; } Détruit le commentaire - Delete the comment + Delete the comment @@ -3221,7 +3223,7 @@ p, li { white-space: pre-wrap; } Détruit le commentaire - Delete the comment + Delete the comment @@ -3440,7 +3442,7 @@ p, li { white-space: pre-wrap; } TextLabel - TextLabel + TextLabel diff --git a/UiQT5/eficas_fr.qm b/UiQT5/eficas_fr.qm new file mode 100644 index 0000000000000000000000000000000000000000..9dad8dffceb9623e88f8b96d9cd0caf25574c6fa GIT binary patch literal 23 fcmcE7ks@*G{hX<16=n7(EZlpygMop8iIEWihQJ9+ literal 0 HcmV?d00001 diff --git a/convert/autre_parseur.py b/convert/autre_parseur.py index 794f888a..aaa4377c 100644 --- a/convert/autre_parseur.py +++ b/convert/autre_parseur.py @@ -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 """ diff --git a/convert/convert_TELEMAC.py b/convert/convert_TELEMAC.py index 2e934c09..b77b3639 100644 --- a/convert/convert_TELEMAC.py +++ b/convert/convert_TELEMAC.py @@ -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 diff --git a/convert/convert_XML.py b/convert/convert_XML.py index 8d9f9b8e..6fed1817 100644 --- a/convert/convert_XML.py +++ b/convert/convert_XML.py @@ -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: diff --git a/convert/convert_dico.py b/convert/convert_dico.py index 52a8d37e..0e8e7675 100644 --- a/convert/convert_dico.py +++ b/convert/convert_dico.py @@ -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): diff --git a/convert/convert_pyth.py b/convert/convert_pyth.py index 098612eb..9a73c09c 100644 --- a/convert/convert_pyth.py +++ b/convert/convert_pyth.py @@ -115,7 +115,7 @@ class Pythparser(object): s= s.replace('""','"<%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: diff --git a/convert/convert_python.py b/convert/convert_python.py index 123f3183..510721e9 100644 --- a/convert/convert_python.py +++ b/convert/convert_python.py @@ -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() diff --git a/convert/old/convert_openturns_study.py b/convert/old/convert_openturns_study.py index 55482e26..e0a17f96 100644 --- a/convert/old/convert_openturns_study.py +++ b/convert/old/convert_openturns_study.py @@ -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: diff --git a/convert/old/convert_openturns_wrapper.py b/convert/old/convert_openturns_wrapper.py index 14c26b85..ce2cc3d8 100644 --- a/convert/old/convert_openturns_wrapper.py +++ b/convert/old/convert_openturns_wrapper.py @@ -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, } diff --git a/convert/parseur_python.py b/convert/parseur_python.py index e3f28ba3..c577c58e 100644 --- a/convert/parseur_python.py +++ b/convert/parseur_python.py @@ -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, '', 'exec') print((a.dict_reels)) diff --git a/generator/Formatage.py b/generator/Formatage.py index aa4dbe29..eb57e461 100644 --- a/generator/Formatage.py +++ b/generator/Formatage.py @@ -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) : diff --git a/generator/generator_PSEN.py b/generator/generator_PSEN.py index e60d43e4..93ee4bc5 100755 --- a/generator/generator_PSEN.py +++ b/generator/generator_PSEN.py @@ -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 diff --git a/generator/generator_ProcessOutputs.py b/generator/generator_ProcessOutputs.py index 2c7b0fae..efce52f0 100755 --- a/generator/generator_ProcessOutputs.py +++ b/generator/generator_ProcessOutputs.py @@ -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) diff --git a/generator/generator_TELEMAC.py b/generator/generator_TELEMAC.py index 3b52f688..6935d537 100644 --- a/generator/generator_TELEMAC.py +++ b/generator/generator_TELEMAC.py @@ -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) diff --git a/generator/generator_XML.py b/generator/generator_XML.py index 4fc98f10..b8e0f3c7 100644 --- a/generator/generator_XML.py +++ b/generator/generator_XML.py @@ -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 diff --git a/generator/generator_aplat.py b/generator/generator_aplat.py index 2bbdaade..6eaff182 100644 --- a/generator/generator_aplat.py +++ b/generator/generator_aplat.py @@ -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 diff --git a/generator/generator_dico.py b/generator/generator_dico.py index 408ba954..91c69c23 100644 --- a/generator/generator_dico.py +++ b/generator/generator_dico.py @@ -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]={} diff --git a/generator/generator_dicoImbrique.py b/generator/generator_dicoImbrique.py index 4c201b97..d5d845cf 100644 --- a/generator/generator_dicoImbrique.py +++ b/generator/generator_dicoImbrique.py @@ -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() diff --git a/generator/generator_map.py b/generator/generator_map.py index 43b4bb71..97e7edd0 100644 --- a/generator/generator_map.py +++ b/generator/generator_map.py @@ -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 index 00000000..a6c766a5 --- /dev/null +++ b/generator/generator_mapVP.py @@ -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 + diff --git a/generator/generator_python.py b/generator/generator_python.py index 479c472a..ad8359a3 100644 --- a/generator/generator_python.py +++ b/generator/generator_python.py @@ -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 diff --git a/generator/generator_vers3DSalome.py b/generator/generator_vers3DSalome.py index 331cbfbe..9f405a45 100644 --- a/generator/generator_vers3DSalome.py +++ b/generator/generator_vers3DSalome.py @@ -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 diff --git a/generator/oldCodes/OpenturnsSTD.py b/generator/oldCodes/OpenturnsSTD.py index f2659e1c..f27c2c16 100644 --- a/generator/oldCodes/OpenturnsSTD.py +++ b/generator/oldCodes/OpenturnsSTD.py @@ -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() diff --git a/generator/oldCodes/generator_CARMEL3D.py b/generator/oldCodes/generator_CARMEL3D.py index 66dd503d..595623d4 100644 --- a/generator/oldCodes/generator_CARMEL3D.py +++ b/generator/oldCodes/generator_CARMEL3D.py @@ -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) : diff --git a/generator/oldCodes/generator_CARMEL3D_temporel.py b/generator/oldCodes/generator_CARMEL3D_temporel.py index 5c98cb5a..05a3d85f 100644 --- a/generator/oldCodes/generator_CARMEL3D_temporel.py +++ b/generator/oldCodes/generator_CARMEL3D_temporel.py @@ -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=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 diff --git a/generator/oldCodes/generator_CARMELCND.py b/generator/oldCodes/generator_CARMELCND.py index 4e719c9f..9561c7ba 100755 --- a/generator/oldCodes/generator_CARMELCND.py +++ b/generator/oldCodes/generator_CARMELCND.py @@ -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 diff --git a/generator/oldCodes/generator_CARMELCS.py b/generator/oldCodes/generator_CARMELCS.py index 41a2d45c..4e4a2fca 100644 --- a/generator/oldCodes/generator_CARMELCS.py +++ b/generator/oldCodes/generator_CARMELCS.py @@ -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 diff --git a/generator/oldCodes/generator_SEP.py b/generator/oldCodes/generator_SEP.py index 241d0bd9..9dd9e09a 100644 --- a/generator/oldCodes/generator_SEP.py +++ b/generator/oldCodes/generator_SEP.py @@ -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 diff --git a/generator/oldCodes/generator_ZCracks.py b/generator/oldCodes/generator_ZCracks.py index 057d738d..b8c57f12 100644 --- a/generator/oldCodes/generator_ZCracks.py +++ b/generator/oldCodes/generator_ZCracks.py @@ -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 diff --git a/generator/oldCodes/generator_asterv5.py b/generator/oldCodes/generator_asterv5.py index d544321f..cdde4e28 100644 --- a/generator/oldCodes/generator_asterv5.py +++ b/generator/oldCodes/generator_asterv5.py @@ -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): """ diff --git a/generator/oldCodes/generator_cuve2dg.py b/generator/oldCodes/generator_cuve2dg.py index 94f901da..f7c97fc3 100644 --- a/generator/oldCodes/generator_cuve2dg.py +++ b/generator/oldCodes/generator_cuve2dg.py @@ -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" diff --git a/generator/oldCodes/generator_file_from_template.py b/generator/oldCodes/generator_file_from_template.py index dcbdc9e8..40bc55b7 100644 --- a/generator/oldCodes/generator_file_from_template.py +++ b/generator/oldCodes/generator_file_from_template.py @@ -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 diff --git a/generator/oldCodes/generator_ini.py b/generator/oldCodes/generator_ini.py index 3fa2dd9b..f1a60a9d 100644 --- a/generator/oldCodes/generator_ini.py +++ b/generator/oldCodes/generator_ini.py @@ -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): diff --git a/generator/oldCodes/generator_openturns_wrapper.py b/generator/oldCodes/generator_openturns_wrapper.py index bf0d063d..bca30dc5 100644 --- a/generator/oldCodes/generator_openturns_wrapper.py +++ b/generator/oldCodes/generator_openturns_wrapper.py @@ -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 diff --git a/generator/oldCodes/generator_python6.py b/generator/oldCodes/generator_python6.py index ac9fcf9c..0c51b249 100644 --- a/generator/oldCodes/generator_python6.py +++ b/generator/oldCodes/generator_python6.py @@ -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: -- 2.39.2