From 9b08e576cc9b521fa0379d09fa425d2eab20a936 Mon Sep 17 00:00:00 2001 From: "pascale.noyret" Date: Mon, 7 Sep 2020 14:20:15 +0200 Subject: [PATCH] push avant merge avec la V9-5 --- Accas/A_ETAPE.py | 4 +-- Editeur/session.py | 4 +++ Efi2Xsd/AccasXsd.py | 3 ++- Efi2Xsd/MCAccasXML.py | 40 ++++++++++++++++----------- Ihm/I_ETAPE.py | 3 ++- Ihm/I_MCSIMP.py | 16 +++++++++-- InterfaceQT4/editorSsIhm.py | 28 ++++++++++++------- InterfaceQT4/eficas_go.py | 43 +++++++++++++++++++++++++++++- InterfaceQT4/monWidgetFact.py | 5 ++-- InterfaceQT4/monWidgetOptionnel.py | 2 +- InterfaceQT4/qtEficasSsIhm.py | 4 +-- InterfaceQT4/readercata.py | 22 ++++++++------- Noyau/N_ENTITE.py | 7 ++++- Noyau/N_OPER.py | 1 + Tests/MappingAccasXsd/cata_ASSD.py | 21 +++------------ 15 files changed, 136 insertions(+), 67 deletions(-) diff --git a/Accas/A_ETAPE.py b/Accas/A_ETAPE.py index aecc47dd..11dc12de 100644 --- a/Accas/A_ETAPE.py +++ b/Accas/A_ETAPE.py @@ -21,9 +21,9 @@ from __future__ import absolute_import from Noyau import N_ETAPE from Validation import V_ETAPE from Ihm import I_ETAPE -from Efi2Xsd.MCAccasXML 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={}): N_ETAPE.ETAPE.__init__(self,oper,reuse,args) V_ETAPE.ETAPE.__init__(self) diff --git a/Editeur/session.py b/Editeur/session.py index a43312a8..0fcad780 100644 --- a/Editeur/session.py +++ b/Editeur/session.py @@ -278,6 +278,10 @@ def createparser(): 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 diff --git a/Efi2Xsd/AccasXsd.py b/Efi2Xsd/AccasXsd.py index 286ed56e..7954f4d0 100755 --- a/Efi2Xsd/AccasXsd.py +++ b/Efi2Xsd/AccasXsd.py @@ -906,8 +906,9 @@ class X_SIMP (X_definition): class X_JDC_CATA : #----------------- - def dumpXsd(self, debug = True): + 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) diff --git a/Efi2Xsd/MCAccasXML.py b/Efi2Xsd/MCAccasXML.py index 5be1d127..9921c1d0 100755 --- a/Efi2Xsd/MCAccasXML.py +++ b/Efi2Xsd/MCAccasXML.py @@ -24,7 +24,7 @@ class X_OBJECT: # ------------- def delObjPyxb(self, debug=True): - if not self.cata.modeleMetier : return + if not self.cata or not self.cata.modeleMetier : return if self.nom == 'Consigne' : return None trouve = False @@ -71,7 +71,7 @@ class X_OBJECT: def addObjPyxb(self,indiceDsLeContenu,debug=False): - if not self.cata.modeleMetier : return + 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 @@ -110,8 +110,8 @@ class X_OBJECT: class X_MCSIMP(X_OBJECT): # ----------------------- - def buildObjPyxb(self, debug=True) : - if not self.cata.modeleMetier : return + 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') @@ -151,8 +151,8 @@ class X_MCSIMP(X_OBJECT): if debug : print ('fin X_MCSIMP', self.objPyxb, self.nom, self, self.maClasseModeleMetier,self.valeur) - def setValeurObjPyxb(self,newVal, debug=False): - if not self.cata.modeleMetier : return + 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 @@ -189,8 +189,8 @@ 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) - if not self.cata.modeleMetier : return self.listArg=[] self.dicoArg={} for objAccas in mc_list : @@ -288,13 +288,13 @@ class X_MCCOMPO(X_OBJECT) : class X_MCBLOC (X_MCCOMPO): # -------------------------- def buildObjPyxb(self,mc_list,debug=False): - if not self.cata.modeleMetier : return + 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.modeleMetier : return + 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: @@ -302,7 +302,7 @@ class X_MCBLOC (X_MCCOMPO): rangDeLObjet=rangDeLObjet+obj.longueurDsArbre() def delObjPyxb(self, debug=False): - if not self.cata.modeleMetier : return + 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() @@ -323,7 +323,7 @@ class X_MCLIST (X_MCCOMPO): rangDeLObjet= rangDeLObjet + 1 def delObjPyxb(self, debug=False): - if not self.cata.modeleMetier : return + if not self.cata or not self.cata.modeleMetier : return if debug : print ('X_MCLIST delObjPyxb', self.nom, ' --------------------------') for obj in self: obj.delObjPyxb() @@ -334,12 +334,20 @@ 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.modeleMetier : return + 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 @@ -377,10 +385,10 @@ class X_JDC (X_MCCOMPO): def toXml(self,fichier=None): print ('ds to XML') - if not self.cata.modeleMetier : return - print ('***************',self.objPyxb,'***************',) - print ('***************',self,'***************',) - print ('***************',self.objPyxb.orderedContent(),'***************',) + 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()) diff --git a/Ihm/I_ETAPE.py b/Ihm/I_ETAPE.py index c7b89958..06fc8935 100644 --- a/Ihm/I_ETAPE.py +++ b/Ihm/I_ETAPE.py @@ -105,7 +105,7 @@ 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 ?) + # 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") @@ -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) diff --git a/Ihm/I_MCSIMP.py b/Ihm/I_MCSIMP.py index a864cedd..e3b26948 100644 --- a/Ihm/I_MCSIMP.py +++ b/Ihm/I_MCSIMP.py @@ -438,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() @@ -454,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": diff --git a/InterfaceQT4/editorSsIhm.py b/InterfaceQT4/editorSsIhm.py index 8b933e35..d6f8b9d4 100755 --- a/InterfaceQT4/editorSsIhm.py +++ b/InterfaceQT4/editorSsIhm.py @@ -226,8 +226,6 @@ class JDCEditorSsIhm : CONTEXT.unsetCurrentStep() #jdc=self.readercata.cata[0].JdC(procedure=text, - print ('llllllllllllllll') - print (self.readercata.cata.JdC) jdc=self.readercata.cata.JdC(procedure=text, appliEficas=self.appliEficas, cata=self.readercata.cata, @@ -235,7 +233,6 @@ class JDCEditorSsIhm : nom=jdcName, rep_mat=self.maConfiguration.rep_mat ) - print ('llllllllllllllll') self.modified = False return jdc @@ -489,13 +486,24 @@ class JDCEditorSsIhm : #---------------------------# def getChecksum(self,texte): #---------------------------# - newtexte=texte.replace('"','\\"') - commande='echo "'+newtexte+'"|md5sum' - a=os.popen(commande) - checksum=a.read() - a.close() - ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM" - return ligne + try : + import haslib + newtexte=texte.replace('"','\\"') + hash_checksum = hashlib.md5() + hash_checksum.update(newtexte.encode('utf-8')) + checksum = hash_checksum.hexdigest() + ligne = ligne="#CHECKSUM:"+checksum+":FIN CHECKSUM" + except : + try : + newtexte=texte.replace('"','\\"') + commande='echo "'+newtexte+'"|md5sum' + a=os.popen(commande) + checksum=a.read() + a.close() + except : + checksum='Fichier trop long \n' + ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM" + return ligne #----------------------# def getDico(self): diff --git a/InterfaceQT4/eficas_go.py b/InterfaceQT4/eficas_go.py index 79517563..f06de685 100755 --- a/InterfaceQT4/eficas_go.py +++ b/InterfaceQT4/eficas_go.py @@ -89,7 +89,7 @@ def genereXSD(code=None): monEficasSsIhm = getEficasSsIhm(code=options.code) monEditor=monEficasSsIhm.getEditor() - texteXSD=monEficasSsIhm.dumpXsd() + 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:] @@ -139,6 +139,47 @@ def validateDataSet(code=None): 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 diff --git a/InterfaceQT4/monWidgetFact.py b/InterfaceQT4/monWidgetFact.py index 8c2dc717..c6758b39 100644 --- a/InterfaceQT4/monWidgetFact.py +++ b/InterfaceQT4/monWidgetFact.py @@ -30,6 +30,7 @@ from desWidgetFactTableau import Ui_WidgetFactTableau from Extensions.i18n import tr # Import des panels +# PN 18 mai 2020 : affiche systematique des optionnels class MonWidgetFactCommun(Groupe): """ """ @@ -40,7 +41,7 @@ class MonWidgetFactCommun(Groupe): self.GroupBox.setText(tr(labeltext)) self.GroupBox.setTextInteractionFlags(Qt.TextSelectableByMouse) self.parentQt.commandesLayout.insertWidget(-1,self) - self.doitAfficherOptionnel=False + 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): diff --git a/InterfaceQT4/monWidgetOptionnel.py b/InterfaceQT4/monWidgetOptionnel.py index be75c09b..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 : diff --git a/InterfaceQT4/qtEficasSsIhm.py b/InterfaceQT4/qtEficasSsIhm.py index 7e2eb6aa..1c1b42b4 100755 --- a/InterfaceQT4/qtEficasSsIhm.py +++ b/InterfaceQT4/qtEficasSsIhm.py @@ -177,9 +177,9 @@ class AppliSsIhm: ok = editor.saveFileAs() print ('ok ',ok) - def dumpXsd(self): + def dumpXsd(self, avecEltAbstrait = False): current_cata = CONTEXT.getCurrentCata() - texteXSD = current_cata.dumpXsd() + texteXSD = current_cata.dumpXsd( avecEltAbstrait) return texteXSD #if self.maConfiguration.afficheIhm==False : exit() #else : return texteXSD diff --git a/InterfaceQT4/readercata.py b/InterfaceQT4/readercata.py index d4ec3258..21b6f8fa 100644 --- a/InterfaceQT4/readercata.py +++ b/InterfaceQT4/readercata.py @@ -220,7 +220,7 @@ class ReaderCata (ReaderCataCommun): try : import pyxb except : - print ('please source pyxb environment') + self.QWParent.informe('environnement', 'please source pyxb environment') exit() try : #if 1 : @@ -234,10 +234,10 @@ class ReaderCata (ReaderCataCommun): pathCata = os.path.dirname(self.fichierCata)+'/raw/'+nomCataXsd+'.py' import imp modeleMetier= imp.load_source(nomCataXsd,pathCata) - #print ('_________________________', modeleMetier) except : #else: if self.appliEficas.ssIhm == False :print ('______________ poum import cata_genere ') + self.QWParent.informe('XSD driver', 'unable to load xsd driver',critique=False) modeleMetier = None else : modeleMetier = None @@ -255,11 +255,12 @@ class ReaderCata (ReaderCataCommun): self.cata.modeleMetier = modeleMetier if not self.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) + #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) @@ -333,6 +334,7 @@ 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 @@ -347,8 +349,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) + #print ('_________________________________________', self) + #print (self.cata_ordonne_dico) #self.appliEficas.liste_simp_reel = () #self.cata_ordonne_dico = {} @@ -366,7 +368,7 @@ class ReaderCata (ReaderCataCommun): if self.appliEficas.maConfiguration.ficIcones==None : return try: ficIcones=self.appliEficas.maConfiguration.ficIcones - fichierIcones = __import__(ficIcones, globals(), locals(), [], -1) + fichierIcones = __import__(ficIcones, globals(), locals(), [], 0) self.appliEficas.maConfiguration.dicoIcones=fichierIcones.dicoDesIcones.dicoIcones self.appliEficas.maConfiguration.dicoImages=fichierIcones.dicoDesIcones.dicoImages except: diff --git a/Noyau/N_ENTITE.py b/Noyau/N_ENTITE.py index 670ec414..b1ca94f5 100644 --- a/Noyau/N_ENTITE.py +++ b/Noyau/N_ENTITE.py @@ -311,4 +311,9 @@ class ENTITE(object): # 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_OPER.py b/Noyau/N_OPER.py index dace06be..22263f3c 100644 --- a/Noyau/N_OPER.py +++ b/Noyau/N_OPER.py @@ -129,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/Tests/MappingAccasXsd/cata_ASSD.py b/Tests/MappingAccasXsd/cata_ASSD.py index 5bb15be5..0cc371d7 100644 --- a/Tests/MappingAccasXsd/cata_ASSD.py +++ b/Tests/MappingAccasXsd/cata_ASSD.py @@ -36,22 +36,7 @@ Maillage = OPER ( nom='Maillage', sd_prod=maillage, Champ = OPER ( nom='Champ', sd_prod=champ, SurLeMaillage = SIMP( statut='o', typ = maillage), ) +ChampMultiple = OPER ( nom='ChampMultiple', sd_prod=champ, + SurLeMaillage2 = SIMP( statut='o', typ = maillage,max="**"), +) -#MaFonction = PROC( nom='MaFonction', -# monArgument1 = SIMP( statut='o', typ = 'TXM'), -# monArgument2 = SIMP( statut='f', typ = 'I'), -#) -#DefinitionListe = PROC( nom='DefinitionListe', -# creeListe = SIMP( statut='f', typ = 'TXM',max='**'), -# creeListe2 = SIMP( statut='f', typ = 'I',homo="SansOrdreNiDoublon",max='**', into=(1,2,3,4)), -# creeListe3 = SIMP( statut='f', typ = 'I',max='**', into=(1,2,3,4)), -#) -#DefinitionFact = PROC (nom='DefinitionFact', -# leFactRepetable = FACT ( max= '**', -# unEntier = SIMP (statut='o', typ='I', defaut =1), -# ), -# leFactCompose = FACT (statut ='o',max='**', -# unFactPart1 = SIMP (statut='o', typ='I', defaut =1), -# unFactPart2 = SIMP (statut='o', typ='I', defaut =1), -# ) -#) -- 2.39.2