From: pascale.noyret Date: Thu, 24 Jun 2021 13:21:52 +0000 (+0200) Subject: permet d obrenir editorSsIhm X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=0112cb2247d0ddb8899342287eb714d1d543d93c;p=tools%2Feficas.git permet d obrenir editorSsIhm --- diff --git a/Efi2Xsd/AccasXsd.py b/Efi2Xsd/AccasXsd.py new file mode 100755 index 00000000..0f63f0d2 --- /dev/null +++ b/Efi2Xsd/AccasXsd.py @@ -0,0 +1,1485 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2021 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + + +import sys,os +import types +import Accas +import imp +from copy import deepcopy, copy +import traceback + +# CONTEXT est accessible (__init__.py de Noyau) + +#import raw.efficas as efficas +sys.path.insert(0,os.path.abspath(os.path.join(os.getcwd(),'..'))) + +# ds l init du SIMP il manque siValide et fenetreIhm + +from .mapDesTypes import dictSIMPEficasXML, dictSIMPXMLEficas +from .mapDesTypes import dictFACTEficasXML, dictFACTXMLEficas +from .mapDesTypes import dictPROCEficasXML, dictPROCXMLEficas +from .mapDesTypes import dictOPEREficasXML, dictOPERXMLEficas +from .mapDesTypes import dictBLOCEficasXML, dictBLOCXMLEficas +from .mapDesTypes import dictPourCast, dictNomsDesTypes +from .mapDesTypes import listeParamDeTypeTypeAttendu, listeParamDeTypeStr, dictPourCast +from .mapDesTypes import listeParamTjsSequence, listeParamSelonType +from .mapDesTypes import Tuple + +PourTraduction = False + +from .balisesXSD import * + +# ----------------- +class X_definition: +# ----------------- + 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 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,'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 metAJourPyxb(self,nomDuTypePyxb) : + self.aCreer=False + self.nomDuTypePyxb=nomDuTypePyxb + 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,] + else : + cata.dictTypesXSD[nom].append(self) + + def definitNomDuTypePyxb(self,forceACreer=False,debug=False): + #if self.nom == 'SubgridScaleModel' : debug=True + #print ('definitNomDuTypePyxb', self, self.nom,self.nomComplet(),forceACreer) + #PNPN + if hasattr(self,'nomDuTypePyxb') : self.aCreer = False; return self.nomDuTypePyxb + #debug=False + if debug : print ('definitNomDuTypePyxb traitement pour ', self.nom) + 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()) : + if debug : print ('definitNomDuTypePyxb encore jamais traite ', self.nom , ' a pour type' , nom) + cata.dictTypesXSD[nom] = [self,] + self.nomDuTypePyxb=nom + return nom + + if nom == 'T_Consigne' : return nom + + if not forceACreer : + self.aCreer = False + listePossible=cata.dictTypesXSD[nom] + indice=0 + while (indice < len(listePossible)) : + objAComparer=listePossible[indice] + if debug : print (self.compare) + if self.compare(objAComparer) : + self.nomDuTypePyxb=objAComparer.nomDuTypePyxb + if debug : print (self, objAComparer) + if debug : print (type(self), type(objAComparer)) + if debug : print ('definitNomDuTypePyxb', self.nom , 'type identique', objAComparer.nomDuTypePyxb ) + # c est nul pour la comparaison mais cela permet d etre ok dans le dictionnaire passe a Accas + cata.dictTypesXSD[nom].append(self) + if self.label != 'SIMP' : + if objAComparer not in list(cata.dictTypesXSDJumeaux.keys()) : cata.dictTypesXSDJumeaux[objAComparer]=[self,] + else : cata.dictTypesXSDJumeaux[objAComparer].append(self) + 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 + return nomAlter + + +# ---------------------------------------- +class X_compoFactoriseAmbigu(X_definition): +# ---------------------------------------- + + def __init__(self,nom,listeDeCreation,pere, debug=True): + + if debug : + for i in listeDeCreation : print (i.nom) + self.label='BlocAmbigu' + self.nom=nom + self.pere=pere + self.statut='f' + self.entites={} + self.mcXSD=[] + self.typesXSDDejaDumpes=[] + self.ordre_mc=[] + self.lesConditions = 'Possible Conditions : ' + for mc in listeDeCreation : + if hasattr(mc, 'condition'):self.lesConditions += '\n\t\t\t\t\t\t' + mc.condition + self.mcXSD.append(mc) + self.ordre_mc.append(mc.nom) + + if debug : print (self.mcXSD) + if debug : print (self.ordre_mc) + self.construitEntites(self.mcXSD) + self.constructionArbrePossibles() + lesPossibles=deepcopy(self.arbrePossibles) + if debug : print ('lesPossibles ', lesPossibles) + + self.getNomDuCodeDumpe() + self.nomDuTypePyxb = self.definitNomDuTypePyxb() + if debug : print (self.nomDuTypePyxb) + self.texteSimple = '' + self.texteComplexeVenantDesFils = '' + self.texteComplexe = debutTypeSubstDsBlocFactorise.format(self.nomDuTypePyxb) + # on enleve [] des possibles puisque l elt sera optionnel + lesPossibles.remove([]) + if debug : print ('________________ init de compoAmbigu',self.nom, lesPossibles) + if debug : print ('self.entites', self.entites) + self.mcXSD=self.factoriseEtCreeDump(lesPossibles,nomAppel='Root') + if debug : print ('self.mcXSD',self.mcXSD) + self.texteComplexe += finTypeSubstDsBlocFactorise + self.texteComplexe +=self.texteComplexeVenantDesFils + #print ('fin pour prepareDumpXSD pour', self.nom) + + def compare(self,autreMC): + if self.label != autreMC.label : return False + #PN : le bug est la + # arbre des possibles identiques mais les types different + # comment faire ? + #print (self.arbrePossibles) + #print (autreMC.arbrePossibles) + #if self.arbrePossibles== autreMC.arbrePossibles : 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 == 'Consigne' or mcFilsNom == 'blocConsigne' : continue + 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, debug = False): + if debug : 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_factCompoAmbigu 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, self.lesConditions) + + def nomComplet(self) : + print ('dans nomComplet pourquoi ?',self, self.nom) + + + def factoriseEtCreeDump(self, laListe, indent=2 ,nomAppel=None, debug=False): + if debug : print ('_______________________________ factoriseEtCreeDump') + if debug : 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 debug : print ('la Liste', laListe, declencheChoiceAvecSeqVid) + if debug : print (aReduire) + 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 + + if debug : print ('creeSequence', creeSequence, aReduire) + for nomMC in aReduire.keys(): + if debug : print (nomMC) + 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,debug=False) : + if debug : + print ('______________________________________________________') + print ('ajouteAuxTextes', nomMC, self.nom) + # for i in self.entites.keys() : print (self.entites[i][0].nom) + if (indent > 3) : indent = indent - 3 + + # PN change le 17 fevrier . Est-ce normal d arriver la ? + # if faut traiter les Blocs exclusifs qui donnent des choices de sequences + # mais celles-ci risquent d etre ambigues + while (isinstance(nomMC,list)) : + nomMC=nomMC[0] + + if nomMC == 'Consigne' or nomMC == 'blocConsigne' : return + if debug : print (nomMC, 'dans ajoute vraiment aux textes', self.entites ) + if len(self.entites[nomMC]) == 1: + mc=self.entites[nomMC][0] + mc.dumpXsd(dansFactorisation=True) + self.texteComplexe += '\t'*(indent) + mc.texteElt + if mc.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe + if mc.aCreer : self.texteSimple += mc.texteSimple + if mc.aCreer : mc.aCreer=False + 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.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe + if mc.aCreer : self.texteSimple += mc.texteSimple + for mcIdent in self.entites[nomMC][1:]: mcIdent.metAJourPyxb(mc.nomDuTypePyxb) + if mc.aCreer : mc.aCreer=False + return + + # on ajoute le nom de l element + if not (isinstance(self.entites[nomMC][0], Accas.SIMP)) : + sontTousDisjoint=True + index=1 + if debug : print ('on cherche si ils sont disjoints : ',self.entites[nomMC]) + for mc in self.entites[nomMC] : + if debug : print ('compare mc' , mc, ' avec :') + for mcFrere in self.entites[nomMC][index:]: + ok = mc.isDisjoint(mcFrere) + if not ok : + sontTousDisjoint=False + break + if not(sontTousDisjoint) : break + index+=1 + if not sontTousDisjoint: + print ('2 blocs freres ont le meme nom et ne sont pas disjoints : pas encore traite') + print ('Projection XSD impossible, changez un des ', nomMC) + exit() + self.fusionneDsUnChoix(nomMC,indent) + if debug : print ('self.nom', self.nom) + if debug : print ('self.texteComplexe' , self.texteComplexe) + if debug : print ('self.texteSimple' , self.texteSimple) + if debug : print ('self.texteElt' , self.texteElt) + if debug : print ('________________________') + return + + + if hasattr(self.entites[nomMC][0], 'dejaDumpe') : # on a deja cree le type + if debug : print (self.entites[nomMC][0].nomDuTypePyxb, ' deja dumpe') + else : + if debug : print ('appel de dumpXsd') + self.entites[nomMC][0].dejaDumpe=True + self.entites[nomMC][0].dumpXsd(dansFactorisation=True,multiple=True,first=first) + if debug : print (self.entites[nomMC][0].nomDuTypePyxb) + + texteDocUnion='\n' + i=1 + for mc in self.entites[nomMC]: + if mc.ang != '' : texteDocUnion += str(i) + '- ' + mc.ang + ' or \n'; i=i+1 + elif mc .fr != '' : texteDocUnion += str(i) + '- ' + mc.fr + ' ou \n'; i=i+1 + if texteDocUnion == '\n' : + self.texteComplexe += '\t'*(indent) + self.entites[nomMC][0].texteElt + else : + texteDocUnion = texteDocUnion[0:-4] + debutTexteEltUnion = self.entites[nomMC][0].texteElt.split('maxOccurs=')[0] + self.texteComplexe += '\t'*(indent)+ reconstitueUnion.format(debutTexteEltUnion,texteDocUnion) + if self.entites[nomMC][0].nomDuTypePyxb in self.typesXSDDejaDumpes : return + self.typesXSDDejaDumpes.append(self.entites[nomMC][0].nomDuTypePyxb) + if debug : print ('et la j ajoute les definitions de type', self.entites[nomMC][0].nomDuTypePyxb) + + nomTypePyxbUnion=self.entites[nomMC][0].nomDuTypePyxb + texteSimpleUnion = debutSimpleType.format(nomTypePyxbUnion) + texteSimpleUnion += debutUnion + texteSimpleUnion += '\t'*(indent)+self.entites[nomMC][0].texteSimplePart2 + texteSimplePart1 = self.entites[nomMC][0].texteSimplePart1 + for e in listePourUnion[1:] : + e.dumpXsd(dansFactorisation=True,multiple=True,first=False) + # si on ext un mc simple la ligne suivante est inutile + # en revanche on ajoute le texte a tous les coups + #self.texteComplexeVenantDesFils += e.texteComplexe + e.metAJourPyxb(nomTypePyxbUnion) + texteSimpleUnion += '\t'*(indent) + e.texteSimplePart2 + texteSimplePart1 += e.texteSimplePart1 + texteSimpleUnion += finUnion + texteSimpleUnion +=fermeSimpleType + self.texteSimple += texteSimplePart1 + texteSimpleUnion + if debug : + print ('______________') + print (self.texteSimple) + print ('______________') + #print ('self.texteSimple', self.texteSimple) + + def fusionneDsUnChoix(self, nomMC,indent, debug=False): + if debug : print ('_________________________________', self.nom, self, nomMC,indent) + if debug : print (self.texteComplexe) + texteDocUnion='\n' + texteComplexe='' + texteComplexeVenantDesFils='' + texteSimple='' + mcRef= self.entites[nomMC][0] + # max = 1 : a priori les choix sont exclusifs + if (hasattr (mcRef, 'aDejaEteDumpe')) : + if debug : print ("je passe la NORMALEMENT car j ai deja ete dumpe") + return + leNomDuTypePyxb = mcRef.definitNomDuTypePyxb(forceACreer=True) + if debug : print ('nomMC', nomMC) + for mc in self.entites[nomMC]: + if debug : print ('------------', mc) + # on laisse dansFactorisation a False car ce n est pas comme une fusion de bloc + mc.texteComplexe = '' + mc.texteSimple = '' + mc.texteElt = '' + mc.dumpXsd(dansFactorisationDeFusion=True) + if debug : print ('texteSimple\n', mc.texteSimple, '\n fin\n') + if debug : print ('texteComplexeVenantDesFils\n',mc.texteComplexeVenantDesFils, '\n fin\n') + if debug : print ('texteComplexe\n', mc.texteComplexe, '\n fin\n') + if mc.ang != '' : texteDocUnion += str(i) + '- ' + mc.ang + ' or \n'; i=i+1 + elif mc .fr != '' : texteDocUnion += str(i) + '- ' + mc.fr + ' ou \n'; i=i+1 + texteComplexe += mc.texteComplexe + texteComplexeVenantDesFils += mc.texteComplexeVenantDesFils + texteSimple += mc.texteSimple + + if debug : print ('______________________________') + if debug : print ('textecomplexeVenantDesFils : \n' ,texteComplexeVenantDesFils ) + if debug : print ('______________________________') + if debug : print ('______________________________') + if debug : print ('textecomplexe : \n' ,texteComplexe ) + if debug : print ('______________________________') + self.entites[nomMC][0].aDejaEteDumpe=True + + self.texteElt = eltCompoDsSequence.format(nomMC, self.nomDuCodeDumpe,mcRef.nomDuTypePyxb,1,1) + self.texteDuFact = debutTypeCompo.format(self.entites[nomMC][0].nomDuTypePyxb) + self.texteDuFact += debutChoiceDsBloc + self.texteDuFact += texteComplexe + self.texteDuFact += finChoiceDsBloc + self.texteDuFact += finTypeCompo + self.texteSimple += texteSimple + self.texteComplexeVenantDesFils += texteComplexeVenantDesFils + self.texteComplexeVenantDesFils += self.texteDuFact + self.texteComplexe += self.texteElt + if debug : print ('______________________________') + if debug : print ('texteSimple : \n' ,self.texteSimple ) + if debug : print ('______________________________') + self.entites[nomMC][0].aDejaEteDumpe=True + + + +# ---------------------------------------- +class X_definitionComposee (X_definition): +# ------------------------------------------ + + def creeTexteComplexeVenantDesFils(self,dansFactorisation=False,debug=False): + texteComplexeVenantDesFils="" + blocsDejaDumpes=set() + #for nom in self.ordre_mc: + # mcFils = self.entites[nom] + if debug : print ('creeTexteComplexeVenantDesFils', self.nom) + if self.nom == 'LeProc' : debug = True + for mcFils in self.mcXSD : + #print (mcFils,mcFils.nom) + if mcFils.nom == 'B1_B2' :debug=True + else : debug=False + if not (isinstance(mcFils, Accas.BLOC)) : + mcFils.dumpXsd(dansFactorisation) + self.texteComplexe += mcFils.texteElt + if mcFils.aCreer : self.texteSimple += mcFils.texteSimple + if mcFils.aCreer : texteComplexeVenantDesFils += mcFils.texteComplexe + else : + 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 + if mcFils.aCreer : self.texteSimple += mcFils.texteSimple + if mcFils.aCreer : texteComplexeVenantDesFils += mcFils.texteComplexe + return texteComplexeVenantDesFils + + def dumpXsd(self, dansFactorisation=False, dansFactorisationDeFusion = False, multiple = False, first=True, debug=False): + if PourTraduction : print (self.nom) + # le prepareDump est appele sur les fils + if not (self.dejaPrepareDump) : self.prepareDumpXSD() + + self.getNomDuCodeDumpe() + if first : + if multiple : self.nomDuTypePyxb = self.definitNomDuTypePyxb(forceACreer=True) + else : self.nomDuTypePyxb = self.definitNomDuTypePyxb() + self.texteSimple = "" # on n ajoute pas de type simple + + self.traduitMinMax() + # pour accepter les PROC et ... + # + if debug : print ('dumpXsd', self.nom, self.aCreer) + if self.aCreer or dansFactorisationDeFusion: + if not dansFactorisationDeFusion : 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) + if not dansFactorisationDeFusion : + self.texteComplexe = texteComplexeVenantDesFils + self.texteComplexe + self.texteComplexeVenantDesFils = '' + else : + self.texteComplexeVenantDesFils = texteComplexeVenantDesFils + # 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 ) and not dansFactorisationDeFusion: self.texteComplexe += finTypeCompo + else : + self.texteComplexe = "" + + if self.ang != "" : self.texteElt=eltCompoDsSequenceWithHelp.format(self.nom,self.nomDuCodeDumpe,self.nomDuTypePyxb,self.minOccurs,self.maxOccurs, self.ang) + elif self.fr != "" : self.texteElt=eltCompoDsSequenceWithHelp.format(self.nom,self.nomDuCodeDumpe,self.nomDuTypePyxb,self.minOccurs,self.maxOccurs, self.fr) + else : self.texteElt=eltCompoDsSequence.format(self.nom,self.nomDuCodeDumpe,self.nomDuTypePyxb,self.minOccurs,self.maxOccurs) + #print ('------------------------------------------------',self.nom) + #print (self.texteComplexe) + + def traduitMinMax(self): + # ______________________ + # valable pour PROC et OPER + self.minOccurs = 0 + 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) + if val1 != val2 : return False + if len(self.entites) != len(autreMC.entites) : return False + for defFille in self.entites.keys(): + if defFille not in autreMC.entites.keys() : return False + if not self.entites[defFille].compare(autreMC.entites[defFille]) : return False + return True + + def prepareDumpXSD(self): + self.dejaPrepareDump=True + self.inUnion=False + self.tousLesFils=[] + self.mcXSD=[] + for nomMC in self.ordre_mc: + mc=self.entites[nomMC] + self.mcXSD.append(mc) + mc.prepareDumpXSD() + self.chercheListesDeBlocsNonDisjoints() + for l in list(self.listeDesBlocsNonDisjoints) : + if not(self.besoinDeFactoriserTrivial(l)) : self.listeDesBlocsNonDisjoints.remove(l) + else : self.factorise(l) + + def chercheListesDeBlocsNonDisjoints(self): + self.listeDesBlocsNonDisjoints=[] + for nomChild in self.ordre_mc : + child=self.entites[nomChild] + if child.label != 'BLOC' : continue + if self.listeDesBlocsNonDisjoints == [] : + self.listeDesBlocsNonDisjoints.append([child]) + continue + vraimentIndependant=True + for liste in list(self.listeDesBlocsNonDisjoints): + independant=True + for bloc in liste : + if bloc.isDisjoint(child) : continue + if bloc.estLeMemeQue(child) : continue + independant=False + vraimentIndependant=False + if not (independant) : + liste.append(child) + if vraimentIndependant: + self.listeDesBlocsNonDisjoints.append([child]) + # on nettoye la liste des blocs tous seuls + for l in list(self.listeDesBlocsNonDisjoints) : + if len(l) ==1 : self.listeDesBlocsNonDisjoints.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): + # tout faux + # a revoir + return True + besoin=False + lesPremiers=set() + for mcBloc 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,debug=False): + self.listeConstruction=liste + nomDebut=liste[0].nom + indexDebut=self.mcXSD.index(liste[0]) + nomFin=liste[-1].nom + indexFin=self.mcXSD.index(liste[-1]) + 1 + nom=nomDebut+'_'+nomFin + if debug : print ('___________ dans factorise', nom) + listeAFactoriser=[] + for i in range(indexDebut, indexFin) : + listeAFactoriser.append(self.mcXSD[i]) + + newListe=self.mcXSD[0:indexDebut] + + monEltFacteur=X_compoFactoriseAmbigu(nom,listeAFactoriser,self) + newListe.append(monEltFacteur) + newListe=newListe+self.mcXSD[indexFin:] + self.mcXSD=newListe + if debug :print ('___________ fin fin factorise', nom) + + def construitTousLesFils(self): + for nomChild in self.ordre_mc : + if nomChild == 'Consigne' or nomChild == 'blocConsigne' : continue + 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 + if self.statut =='o' and self.min < 2: self.minOccurs=1 + + 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): +# --------------------------------- + def dumpXsd(self, dansFactorisation=False, multiple = False, first=False): + X_definitionComposee.dumpXsd(self,dansFactorisation) + self.texteComplexe += finTypeCompoSeq + self.texteComplexe += attributeNameName + 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): +#----------------------------------- + pass + +#----------------------------------- +class X_BLOC (X_definitionComposee): +#----------------------------------- + def dumpXsd(self, dansFactorisation=False, multiple = False, first=False, debug = False): + if debug : print ('X_BLOC dumpXsd', self.nom) + self.tousLesFils=[] + if self.nom == 'blocConsigne' : + self.texteComplexe = "" + self.texteSimple = "" + self.nomDuTypePyxb = "NonTraiteConsigne" + self.texteSimpleVenantDesFils = "" + self.aCreer = False + self.texteElt = "" + + return + 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 + if self.aCreer : + self.texteComplexe = debutTypeSubst.format(self.nomDuTypePyxb) + texteComplexeVenantDesFils=self.creeTexteComplexeVenantDesFils(dansFactorisation) + self.texteComplexe = texteComplexeVenantDesFils + self.texteComplexe + self.texteComplexe += finTypeSubst + + else : + self.texteComplexe = "" + + self.texteElt=substDsSequence.format(self.code,self.nomDuTypePyxb,0,1,'condition : ' +self.condition) + + #print ('------------------------------------------------') + + 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) + if val1 != val2 : return False + if len(self.entites) != len(autreMC.entites) : return False + for defFille in self.entites.keys(): + if defFille not in autreMC.entites.keys() : return False + 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, dansFactorisation=False, multiple=False, first=False, debug=False): + #debug = True + #if PourTraduction : print (self.nom) + if debug : print ('X_SIMP dumpXsd pour', self.nom, '___________________________') + self.prepareDumpXSD() + # si inUnion la comparaison est fausse : on cree le nomDuType + if multiple : self.inUnion=True + #print ('exploreObjet SIMP') + self.getNomDuCodeDumpe() + self.aCreer = True + self.texteComplexe = "" + self.texteSimple = "" + self.texteElt = "" + if self.nom =='Consigne' : return + + # --> homonymie on peut utiliser genealogie ? + self.nomDuTypeDeBase = self.traduitType() + if debug : print ('nomDuTypeDeBase', self.nomDuTypeDeBase) + if debug : print ('multiple', multiple, 'first', first) + if not multiple : + self.nomDuTypePyxb = self.definitNomDuTypePyxb() + else : + if first : + # on force la creation + self.nomDuTypePyxb = self.definitNomDuTypePyxb() + self.aCreer = True + else : + self.nomDuTypePyxb='NonDetermine' + + if debug : print ('nomDuTypePyxb', self.nomDuTypePyxb) + if debug : print ('aCreer', self.aCreer) + + + # on se sert des listes ou non pour la gestion des minOccurs /maxOccurs est > 0 + if self.statut =='f' : minOccurs = 0 + else : minOccurs = 1 + if dansFactorisation : minOccurs = 1 + + if self.suisUneMatrice : + self.dumpSpecifiqueMatrice(minOccurs) + return + + if self.suisUnTuple : + self.dumpSpecifiqueTuple(minOccurs) + return + + if self.avecBlancs and self.max > 1 : + self.dumpSpecifiqueTexteAvecBlancs(minOccurs,multiple) + return + + #print ('minOccurs',minOccurs) + # le defaut est dans l elt Name -> tester la coherence d existence avec Accas + # regles Accas + + # 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') + texteAide = "" + if self.ang != '' : texteAide = self.ang + else : texteAide = self.fr + if self.intoXML and self.into : + if self.intoXML != self.into : + #print ('je passe la pour ', self.nom) + texteAide :texteAide = texteAide+'\nPossible choices for '+ self.nom + 'at this place : \n'+str(self.into)+'\n' + + if self.defaut : + if self.max > 1 or self.max == '**' or self.max == float('inf') : + txtDefaut="" + for val in self.defaut : txtDefaut+=str(val) + " " + # cela ne fonctionne pas tres bien. a revoir + txtDefaut+=txtDefaut[0:-1] + if not('TXM' in (self.type)) : + # a revoir pour les tuples avec defaut + if texteAide != '' : self.texteElt = eltDsSequenceWithDefautAndHelp.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut,texteAide) + else : self.texteElt = eltDsSequenceWithDefaut.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut) + else : + texteAide += texteAide+'\ndefault Value in MDM : \n'+txtDefaut + self.texteElt = eltDsSequenceWithHelp.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,texteAide) + else : + if str(self.defaut) == 'True' : txtDefaut = 'true' + elif str(self.defaut) == 'False' : txtDefaut = 'false' + else : txtDefaut = str(self.defaut) + if texteAide != '' : self.texteElt = eltDsSequenceWithDefautAndHelp.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut,texteAide) + else : self.texteElt = eltDsSequenceWithDefaut.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut) + else : + if texteAide != '' : self.texteElt = eltDsSequenceWithHelp.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,texteAide) + else : self.texteElt = eltDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1) + elif first: + # l'aide est geree a la fusion + self.texteElt = eltDsSequence.format(self.nom,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 debug : print ('je suis aCreer', self.aCreer) + if not self.aCreer : return + + typeATraduire=self.type[0] + + self.texteSimplePart1="" + if not(isinstance(typeATraduire,str)) and not(isinstance(typeATraduire,Accas.Tuple)) and issubclass(typeATraduire, Accas.UserASSD) : + cata = CONTEXT.getCurrentCata() + if len(self.type) == 2 and self.type[1]=='createObject' : suffixe = 'C' + else : suffixe = 'U' + #print (cata.listeUserASSDDumpes) + #print (typeATraduire.__name__) + #print (typeATraduire.__name__ in cata.listeUserASSDDumpes) + if typeATraduire.__name__ not in cata.listeUserASSDDumpes : + cata.listeUserASSDDumpes.add(typeATraduire.__name__) + if issubclass(typeATraduire, Accas.UserASSDMultiple) : + self.texteSimplePart1 = defUserASSDMultiple.format(typeATraduire.__name__) + if cata.definitUserASSDMultiple == False : + cata.definitUserASSDMultiple = True + cata.texteSimple = cata.texteSimple + defBaseXSDUserASSDMultiple + else : + self.texteSimplePart1 = defUserASSD.format(typeATraduire.__name__) + if cata.definitUserASSD == False : + cata.definitUserASSD = True + cata.texteSimple = cata.texteSimple + defBaseXSDUserASSD + if typeATraduire.__name__+'_'+suffixe not in cata.listeUserASSDDumpes : + cata.texteSimple = cata.texteSimple + defUserASSDOrUserASSDMultiple.format(typeATraduire.__name__, suffixe,typeATraduire.__name__) + cata.listeUserASSDDumpes.add(typeATraduire.__name__+'_'+suffixe) + + + 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 + self.texteSimplePart2 = self.texteSimple + self.texteSimple = self.texteSimplePart1 + self.texteSimplePart2 + + + def dumpSpecifiqueTexteAvecBlancs(self,minOccurs,multiple): + # attention multiple non traite + # pour l instant on n a pas max =1 et on ne traite pas les into + + texteAide = "" + if self.ang != '' : texteAide = self.ang + elif self.fr != '' : texteAide = self.fr + + self.texteElt = eltDsSequenceWithHelp.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,texteAide) + txtDefaut="" + # Pas de Defaut pour les string en XSD + # max sert pour la taille de la liste + if self.defaut : texteAide += ' Valeur par defaut dans le comm : '+str(self.defaut) + if texteAide != '' : self.texteElt = eltDsSequenceWithHelp.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,texteAide) + else : self.texteElt = eltDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1) + + + if self.max == '**' or self.max == float('inf') : max='unbounded' + else : max = self.max + + if self.max > 1 : # juste au cas ou on traite 1 pareil + self.texteSimple = '' + cata = CONTEXT.getCurrentCata() + if self.nomDuTypePyxb in cata.listeTypeTXMAvecBlancs: return + cata.listeTypeTXMAvecBlancs.add(self.nomDuTypePyxb) + self.texteSimple = complexChaineAvecBlancs.format(self.nomDuTypePyxb,max,self.nomDuTypePyxb) + if self.intoXML != None : into = self.intoXML + else : into = self.into + if into == None : + self.texteSimple += typeEltChaineAvecBlancSansInto.format(self.nomDuTypePyxb) + else : + self.texteSimple += debutChaineAvecBlancsInto.format(self.nomDuTypePyxb) + for val in into : self.texteSimple += milieuChaineAvecBlancsInto.format(val) + self.texteSimple += finChaineAvecBlancsInto + + + def dumpSpecifiqueTuple(self,minOccurs): + self.nomDuTypeDeBase = self.traduitType() + tousPareil=True + # il faut gerer l aide et les defaut + if self.defaut : print ('il faut tester le defaut') + if self.max == '**' or self.max == float('inf') : max='unbounded' + else : max = self.max + self.texteElt = tupleNonHomogeneElt.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,max) + leType=self.nomDuTypeDeBase[0] + for leTypeComp in self.nomDuTypeDeBase[1:] : + if leTypeComp != leType : + tousPareil = False + break; + #if tousPareil : + #PN PN a statuer + # self.texteSimple += debutSimpleType.format(self.nomDuTypePyxb) + # self.texteSimple += debutTypeSimpleListe + # self.texteSimple += "\t\t\t\t"+debutRestrictionBase.format(leType) + # 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: + # 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 += fermeSimpleType + # return + + self.texteSimple = '' + complexeTypeTuple = tupleDebutComplexeType.format(self.nomDuTypePyxb) + num = 1 + for leType in self.nomDuTypeDeBase : + self.texteSimple += tupleNonHomogeneSimpleType.format(self.nomDuTypePyxb,str(num),leType) + complexeTypeTuple += tupleMilieuComplexeType.format(str(num),self.nomDuTypePyxb,str(num)) + num = num + 1 + complexeTypeTuple += tupleFinComplexeType + self.texteSimple += complexeTypeTuple + + + def dumpSpecifiqueMatrice(self,minOccurs): + # if faut traiter le defaut + typeDeMatrice =self.type[0] + + self.texteSimple += debutSimpleType.format(self.nomDuTypePyxb+'_element') + self.texteSimple += debutRestrictionBase.format(self.nomDuTypeDeBase) + if typeDeMatrice.typEltInto != None: + for val in typeDeMatrice.typEltInto : self.texteSimple += enumeration.format(val) + self.texteSimple += fermeRestrictionBase + self.texteSimple += fermeSimpleType + nom=self.nomDuTypePyxb + nbCols=typeDeMatrice.nbCols + nbLigs=typeDeMatrice.nbCols + self.texteSimple += matriceSimpleType.format(nom,nom,nbCols,nom,self.code,nom,nbLigs,nbLigs,nom,self.code,nom,self.min,self.max) + self.texteElt = eltMatrice.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1) + + + def prepareDumpXSD(self): + self.inUnion=False + if self.statut == 'f' : self.arbrePossibles = (self.nom,[]) + else : self.arbrePossibles = (self.nom,) + self.mcXSD=[] + + + + def traduitType(self,debug=False): + # il faut traduire le min et le max + # il faut ajouter les regles + # il faut gerer les types tuple et fichier + # on ne paut pas tester le type qui depend du cataloge + if hasattr(self.type[0], 'typElt') : + #print ('je suis une Matrice de ' ,dictNomsDesTypes[self.type[0].typElt]) + self.suisUneMatrice = True + # on presume que le type de l elt est un ASSD + if self.type[0].typElt not in dictNomsDesTypes.keys(): return 'xs:string' + return dictNomsDesTypes[self.type[0].typElt] + else : + self.suisUneMatrice = False + if hasattr(self.type[0], 'ntuple') : + self.suisUnTuple = True + # Pour l instant pas de into dans les tuples non homogenes et pas de reference + # sinon, il faudra faire un for sur la suite avec les createObjet + leType=self.validators.typeDesTuples[0] + enRetour=[] + for i in range(self.type[0].ntuple): + enRetour.append(dictNomsDesTypes[self.validators.typeDesTuples[i]]) + return enRetour + #typeATraduire=leType + else : + self.suisUnTuple = False + typeATraduire=self.type[0] + if not (typeATraduire in list(dictNomsDesTypes.keys())) : + #if (isinstance(typeATraduire, Accas.ASSD) or issubclass(typeATraduire, Accas.ASSD)) : + if (not(isinstance(typeATraduire,str)) and issubclass(typeATraduire, Accas.ASSD)) : + # cas d une creation + cata = CONTEXT.getCurrentCata() + # PNPNPN a Revoir pour la creation des keyrefs + 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) + if issubclass(typeATraduire, Accas.UserASSD) : return typeATraduire.__name__+'_C' + else : return 'xs:string' + + # cas d une consommation + if typeATraduire not in list(cata.dictTypesASSDorUserASSDUtilises) : + cata.dictTypesASSDorUserASSDUtilises[typeATraduire]=[self,] + else : + cata.dictTypesASSDorUserASSDUtilises[typeATraduire].append(self,) + if issubclass(typeATraduire, Accas.UserASSD) : return typeATraduire.__name__+'_U' + else : 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) + 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 + else : self.minInclusive = self.val_min + + def traduitMinMax(self): + if self.min == 1 and self.max == 1 : return + #print ('il faut creer une liste ' , self.nom) + + 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 + 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, 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.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) + if 0 : pass + else : self.texteCata += eltCataPPal.format(self.code,self.code,self.code) + else : + self.texteCata += eltAbstraitCataFils.format(self.implement,self.nomDuXsdPere,self.nomDuXsdPere) + if 0 : pass + else : 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 + + 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 + + + + #if not PourTraduction : print (self.texteXSD) + + import pprint + #pprint.pprint (cata.dictTypesXSDJumeaux) + #for k in cata.dictTypesXSDJumeaux: + # print (k.nom, k.nomComplet()) + # print (cata.dictTypesXSDJumeaux[k][0].nom, cata.dictTypesXSDJumeaux[k][0].nomComplet()) + + #pprint.pprint (cata.dictTypesXSD) + #for k in cata.dictTypesXSD: + # print (k) + # print (cata.dictTypesXSD) + + dico = {} + for k in list(cata.dictTypesXSD.keys()): + dico[k]={} + different=False + for definition in cata.dictTypesXSD[k] : + if definition.label == 'BLOC' or definition.label == 'BlocAmbigu':continue + if definition.nomDuTypePyxb != 'T_'+definition.nom : different=True + listeATraiter=[definition.geneaCompleteSousFormeDeListe(),] + while listeATraiter != [] : + listeGenea=listeATraiter[0] + listeATraiter=listeATraiter[1:] + txtNomComplet='' + indexMC=0 + for MC in listeGenea: + txtNomComplet=txtNomComplet+'_'+MC.nom + if MC in list(cata.dictTypesXSDJumeaux.keys()) : + for MCJumeau in cata.dictTypesXSDJumeaux[MC]: + # attention nvlleGenalogie n a pas de sens en Accas + nvlleGenalogie=listeGenea[:indexMC]+MCJumeau.geneaCompleteSousFormeDeListe() + listeATraiter.append(nvlleGenalogie) + indexMC=indexMC+1 + dico[k][txtNomComplet]=definition.nomDuTypePyxb + if dico[k]== {} or (not different) : del dico[k] + import pprint + #pprint.pprint(dico) + # PN reflechir a ce *** de nom + #if dico != {} : self.texteXSD += texteAnnotation.format(self.nomDuCodeDumpe,str(dico)) + if dico != {} : self.texteXSD += texteAnnotation.format(str(dico)) + + #import pprint + #if (not PourTraduction) and (dico != {}) : pprint.pprint(dico) + print ('__________________________ decommenter pour le texteXSD________________________') + #print (dico) + #print (self.texteXSD) + self.texteXSD += texteFin + 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 + if c.ang != '' : c.texteElt = eltEtapeWithHelp.format(c.nom,self.implement,c.nomDuTypePyxb,self.implement,c.ang) + elif c.fr != '' : c.texteElt = eltEtapeWithHelp.format(c.nom,self.implement,c.nomDuTypePyxb,self.implement,c.fr) + else : 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..06966aa1 --- /dev/null +++ b/Efi2Xsd/MCAccasXML.py @@ -0,0 +1,682 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2021 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import 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=False): + if not self.cata or not self.cata.modeleMetier : return + if self.nom == 'Consigne' : return None + trouve = False + + if debug : print ('--------------- in delObjPyxb pour ' , self.nom) + 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 ('indiceDsLeContenu',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()))) + if debug : 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=True) : + if not self.cata or not self.cata.modeleMetier : return + if self.nom == 'Consigne' : return None + if debug : print (self.definition.nomComplet()) + 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.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 hasattr(self.definition,'nomXML') and self.definition.nomXML != None : self.monNomClasseModeleMetier='T_'+self.definition.nomXML + if self.monNomClasseModeleMetier in list(self.cata.DicoNomTypeDifferentNomElt.keys()) : + nomComplet=self.definition.nomComplet() + if nomComplet in list(self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier].keys()): + self.monNomClasseModeleMetier=self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier][nomComplet] + if debug : print ('Pour', self.nom, ' le type est ', self.monNomClasseModeleMetier) + self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier) + + if self.waitMatrice() : + #PNPN : Attention rien ne relie les objets listeObjPyxb a un objAccas + # 27/04 je ne sais pas si cela posera pb + self.listeLines = [] + self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier) + self.maClasseModeleMetier_line=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier+'_line') + if debug : print ('Matrice de type ', self.maClasseModeleMetier) + for v in self.valeur: + l=self.maClasseModeleMetier_line(v) + self.listeLines.append(l) + self.objPyxb=self.maClasseModeleMetier(*self.listeLines) + #if self.objPyxb !=None : self.objPyxb.objAccas=self + if debug : print ('Matrice ', self.nom, self.objPyxb) + return + if self.waitTuple() : + self.objPyxb = [] + self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier) + # if faut traiter l autre cas + # et optimiser + if self.definition.max !=1 : + for v in self.valeur : + if debug : print ('je traite ', v) + listeConstruction=[] + for i in range(self.combienEltDsTuple()): + num=i+1 + maClasseElt=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier+'_n'+str(num)) + listeConstruction.append(maClasseElt(v[i])) + self.objPyxb.append(self.maClasseModeleMetier(*listeConstruction)) + if debug : print (self.objPyxb) + return + if self.waitChaineAvecBlancs() and self.definition.max > 1: + self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier) + if debug : print (self.valeur) + if self.valeur != None and self.valeur != [] : self.objPyxb = self.maClasseModeleMetier(*self.valeur) + else :self.objPyxb = self.maClasseModeleMetier() + if debug : print ('X_MCSIMP', self.nom, self.objPyxb, ) + if debug : print ('__________ fin X_MCSIMP', self.objPyxb, self.nom, self, self.maClasseModeleMetier,self.valeur) + return + + + 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 : + if self.definition.max > 1 : + # PNPN A corriger + # self.objPyxb=self.maClasseModeleMetier(self.valeur) + self.objPyxb=self.maClasseModeleMetierFactory(self.valeur) + else : 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) + + + #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 debug : print (self.nom , ' a pour pere', self.perePyxb, self.perePyxb.nom, self.perePyxb.objPyxb) + if debug : print ('debut du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent()) + + #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 + if debug : print ('fin du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent()) + + if inspect.isclass(newVal) and issubclass(newVal,A_ASSD) : + newVal = newVal.nom + setattr(self.perePyxb.objPyxb,self.nom,nvlObj) + trouve=False + indice=0 + for i in self.perePyxb.objPyxb.orderedContent(): + if i.elementDeclaration.id() == self.nom: + #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=False) : + if not self.cata or not self.cata.modeleMetier : return + + #if self.nom == 'Scenario_data' : debug=1 + if debug : print ('X_MCCOMPO', self.nom) + deepDebug=False + 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 + print ('______________', objAccas.nom, objAccas.objPyxb) + 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.monNomClasseModeleMetier in list(self.cata.DicoNomTypeDifferentNomElt.keys()) : + self.nomComplet=self.definition.nomComplet() + self.monNomClasseModeleMetier=self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier][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.listArg) + if debug : print (self.maClasseModeleMetier) + # self.objPyxb=self.maClasseModeleMetier(*self.listArg) + self.objPyxb=self.maClasseModeleMetier(**self.dicoArg) + if deepDebug : + print ('debut de __________ new ordered content') + for o in self.objPyxb.orderedContent(): + print ('o', o) + print ('value', o.value) + print ('type', type(o.value)) + print ('id', id(o.value)) + print ('fin __________ new ordered content') + print ('debut de __________ listArg') + for obj in self.listArg: + print ('obj',obj) + print ('type obj', type(obj)) + print ('id(obj)', id(obj)) + print ('fin __________ listArg') + + newOrderedContent=[] + if debug : print ('list Arg') + for obj in self.listArg: + if debug : + print ('obj',obj) + print ('type obj', type(obj)) + print ('id(obj)', id(obj)) + + # on teste le caractere pluriel + if isinstance(obj, list): + for c in self.objPyxb.orderedContent() : + if hasattr (c,'value') and c.value == obj : + newOrderedContent.append(c) + continue + 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))] ) + # PN 22 sept 2020 . pourquoi pas toujours l id. le tyoe ne convient pas en cas d union d enum + newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:id(o.value), self.objPyxb.orderedContent())).index(id(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] + debug=True + if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb) + if debug : print ('X_MCCOMPO', self.listArg) + if debug : print ('X_MCCOMPO', newOrderedContent) + if debug : print ( 'X_MCCOMPO',self.objPyxb.orderedContent()) + if debug : print ('fin buildObjetPyxb _______________________________________') + # assert(self.objPyxb.validateBinding()) + + + def exploreBLOC(self,objAccas,debug=False): + if debug : 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 + self.listArg.append(fils.objPyxb) + self.dicoArg[fils.nom]=fils.objPyxb + fils.perePyxb=self + if debug : print (fils.nom ,' est un SIMP a pour pere Pyxb', self, self.nom) + if debug : print ('fin ds exploreBLOC', objAccas .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.sdName=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, debug=False): + if debug : print ('ds to XML') + if not self.cata or not self.cata.modeleMetier : return + if debug : print (' to xml ***************',self.objPyxb,'***************',) + if debug : print (' to xml ***************',self,'***************',) + if debug : print (' to xml ***************',self.objPyxb.orderedContent(),'***************',) + if debug : print(self.objPyxb.toDOM().toprettyxml()) + if debug : print(self.objPyxb.toxml()) + return (self.objPyxb.toDOM().toprettyxml()) + + + def analyseFromXML(self,debug=False): + print ("je suis ds analyseFromXML -- > appel ds analyseXML de I_JDC.py") + if self.procedure == "" : return + self.objPyxb=self.cata.modeleMetier.CreateFromDocument(self.procedure) + if not hasattr(self.cata.modeleMetier,'AccasUserAssd'): + from Accas import UserASSD + self.cata.modeleMetier.AccasUserAssd=UserASSD + 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 + if debug : print ('dicoPyxbDeConstruction', objEtape.dictArgs['dicoPyxbDeConstruction']) + maClasseAccas=getattr(self.cata,objEtape.monNomClasseAccas) + if debug : print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh') + if debug : print ('maClasseAccas ', maClasseAccas) + if debug : print ('objEtape ', objEtape , type(objEtape)) + if debug : print ('nomClasseAccas ',objEtape.monNomClasseAccas, type(objEtape.monNomClasseAccas)) + if debug : print ('_ExpandedName ', objEtape._ExpandedName, type(objEtape._ExpandedName)) + if debug : print ('dictArgs ',objEtape.dictArgs) + if debug : print ('dictPyxb ',objEtape.dictPyxb) + # attention au call d Oper qui renomme l objet pyxb + if hasattr(objEtape,'sdName') : + if debug and hasattr(objEtape,'sdName') :print ('sdName',objEtape.sdName) + objAccasEtape=maClasseAccas(nomXML=objEtape.sdName, **(objEtape.dictArgs)) + else : objAccasEtape=maClasseAccas(**(objEtape.dictArgs)) + if debug : print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh') + + + def pyxbToDict(self,objAAnalyser, debug=True): + # la transformation de l objAAnalyser en type lu par eficas ne fonctionne pas pour tout + if objAAnalyser is None: return + if debug : print ('debut pour_____________________________ ',objAAnalyser) + dictArgs = {} + # traitement SIMP + # --------------- + # a revoir pour les matrices + # et les tuples + debug = 1 + if isinstance(objAAnalyser, pyxb.binding.basis.simpleTypeDefinition): + if debug : print ('je suis un MCSimple', objAAnalyser) + # traitement scalaire + objAAnalyser.dictPyxb=objAAnalyser + if not (isinstance(objAAnalyser,pyxb.binding.basis.STD_list)): + if debug : print ('je suis un scalaire') + if isinstance(objAAnalyser,self.cata.modeleMetier.AccasUserAssd) or isinstance(objAAnalyser,self.cata.modeleMetier.AccasUserAssdMultiple): + if debug : print ('je suis un UserASSD') + laClassePyxbUserAssd=type(objAAnalyser) + return self.creeUserAssd(objAAnalyser,laClassePyxbUserAssd) + if isinstance(objAAnalyser, pyxb.binding.datatypes.boolean) : return bool(objAAnalyser) + 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) + return objAAnalyser + else : + if debug : print ('je suis une liste') + laListe=[] + # liste homogene + if len(objAAnalyser)>0: + if issubclass(objAAnalyser[0].__class__,self.cata.modeleMetier.AccasUserAssd) or issubclass(objAAnalyser[0].__class__,self.cata.modeleMetier.AccasUserAssdMultiple): estUnUserASSDorUserASSDMultiple = True + else : estUnUserASSDorUserASSDMultiple=False + else : estUnUserASSDorUserASSDMultiple=False + if debug : print ('estUnUserASSDorUserASSDMultiple', estUnUserASSDorUserASSDMultiple) + for obj in objAAnalyser : + if estUnUserASSDorUserASSDMultiple: + laClassePyxbUserAssd=obj.__class__ + laListe.append(self.creeUserAssd(obj,laClassePyxbUserAssd)) + elif 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 creeUserAssd(self,objAAnalyser,laClassePyxbUserAssd,debug=True): + + enCreation=False + if debug : print ('creeUserAssd ', objAAnalyser, ' ',laClassePyxbUserAssd) + leTypeIntermediaire=laClassePyxbUserAssd.XsdSuperType() + if debug : print ('leTypeIntermediaire ', leTypeIntermediaire) + if debug : print ('leTypeIntermediaire ', leTypeIntermediaire.XsdSuperType()) + if leTypeIntermediaire.__name__[-2:]== '_C' : enCreation = True + elif leTypeIntermediaire.__name__[-2:] != '_U' : print ('pb avec', laClassePyxbUserAssd); return None #exit() + nomClasseAccasUserAssd=leTypeIntermediaire.XsdSuperType().__name__ + if debug : print ('nomClasseAccasUserAssd', nomClasseAccasUserAssd) + laClasseAccas=getattr(self.cata,nomClasseAccasUserAssd) + print (laClasseAccas) + if not(enCreation): + if str(objAAnalyser) in self.g_context.keys():return self.g_context[str(objAAnalyser)] + else : + obj=laClasseAccas() + self.g_context[str(objAAnalyser)]=obj + return obj + if str(objAAnalyser) in self.g_context.keys(): + if isinstance(self.g_context[str(objAAnalyser)],laClasseAccas): + return self.g_context[str(objAAnalyser)] + else : + nvlObj=laClasseAccas() + oldObj=self.g_context[str(objAAnalyser)] + nvlObj.transfere(oldObj) + self.g_context[str(objAAnalyser)]=nvlObj + return nvlObj + else : + obj=laClasseAccas() + self.g_context[str(objAAnalyser)]=obj + return obj + +# 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..a9becb59 --- /dev/null +++ b/Efi2Xsd/balisesXSD.py @@ -0,0 +1,149 @@ +texteDebut='\n\n' +texteDebutNiveau2='\n\n' +texteDebutNiveau3='\n\n' +texteFin='' + +#texteAnnotation= '\t\n\t\t\n\t\t{}\n\t\t\n\t\t\n\t\n\t\n' +texteAnnotation= '\t\n\t\t\n\t\t{}\n\t\t\n\t\t\n\t\n\t\n' + +# 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' +eltDsSequenceWithHelp = '\t\t\t\n\t\t\t\t\n\t\t\t\t\t{}\n\t\t\t\t\n\t\t\t\n' +eltDsSequenceWithDefautAndHelp = '\t\t\t\n\t\t\t\t\n\t\t\t\t\t{}\n\t\t\t\t\n\t\t\t\n' +eltDsSequenceWithDefaut = '\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' +eltCompoDsSequenceWithHelp = '\t\t\t\n' +#name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}">\n\t\t\t\t\n\t\t\t\t\t{}\n\t\t\t\t\n\t\t\t\n' +#eltCompoDsSequenceInExtension = '\t\t\t\n' + +# ETAPE +eltEtape = '\t\n' +eltEtapeWithHelp = '\t\n\t\t\t\t\n\t\t\t\t\t{}\n\t\t\t\t\n\t\t\t\n' + +# BLOC +debutTypeSubst = '\t \n\t\t\n' +finTypeSubst = '\t\t\n\t\n' +substDsSequence = '\t\t\t\n\t\t\t\t\n\t\t\t\t\t{}\n\t\t\t\t\n\t\t\t\n' +#choiceDsBloc = '\t\t\t\n' +debutChoiceDsBloc = '\t\t\n' +debutChoiceDsBlocAvecMin = '\n' +finChoiceDsBloc = '\t\t\n' +debSequenceDsBloc = '\n' +finSequenceDsBloc = '\n' +debutTypeSubstDsBlocFactorise = '\t\n' +finTypeSubstDsBlocFactorise = '\t\n' +debutUnion = '\t\t\t\n' +finUnion = '\t\t\t\n' +reconstitueUnion = '{} maxOccurs="1">\n\t\t\t\t\n\t\t\t\t\t{}\n\t\t\t\t\n\t\t\t\n' + + + +# User OR ASSD +attributeNameName = '\t\t\n' +attributeTypeForASSD = '\t\t\n' +attributeTypeUtilisateurName = '\t\t\n' +producingASSDkeyRefDeclaration='\t\n\t\t\n\t\t\n\t\n' +texteFieldUnitaire="./{}:{}/@name |" +defBaseXSDUserASSD='\t\n\t\t\n\t\t\n\t\n' +defBaseXSDUserASSDMultiple='\t\n\t\t\n\t\t\n\t\n' + +defUserASSDMultiple='\t\n\t\t\n\t\t\n\t\n' +defUserASSD ='\t\n\t\t\n\t\t\n\t\n' + +defUserASSDOrUserASSDMultiple='\t\n\t\t\n\t\t\n\t\n' + + +# 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' +eltCataPPalWithHelp = '\t\n\t\t\t\t\n\t\t\t\t\t{}\n\t\t\t\t\n\t\t\t\n' +eltCataFils = '\t\n' +eltCataFilsWithHelp = '\t\n\t\t\t\t\n\t\t\t\t\t{}\n\t\t\t\t\n\t\t\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' + +# MATRICE oldVersion +# (_matrix ou pas ?) +#matriceSimpleType = '\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n' +#matriceSimpleType = '\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n' +#matriceSimpleType +='\t\n\t\t\n\t\t\t\t\n\t\t\n\t\n\t\n' +#matriceSimpleType +='\t\n\t\t\n\t\t\t\t\n\t\t\n\t\n\t\n' +#matriceSimpleType +='\t\n\t\t\n\t\t\t\t\n\t\t\n\t' +#eltMatrice = ' ' + +# TUPLE +tupleNonHomogeneSimpleType = '\t\n\t\t\n\t\t\n' +tupleNonHomogeneElt = '\t\t\t\n' +tupleDebutComplexeType = '\t\n\t\t' +tupleMilieuComplexeType = '\n\t\t\t' +tupleFinComplexeType = '\n\t\t\n\t\n' + +# MATRICE +eltMatrice = '\t\t\t \n' +matriceSimpleType = '\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n' +matriceSimpleType +='\t\n\t\t\n\t\t\t\n\t\t \n\t\n' +matriceSimpleType +='\t \n\t\t\n\t\n' + +# CHAINES AVEC BLANC +debutChaineAvecBlancsInto = '\t\n\t\t\n' +milieuChaineAvecBlancsInto = '\t\t\t\n' +finChaineAvecBlancsInto = '\t\t\n\t\t\n' + +complexChaineAvecBlancs = '\t\n\t\t\n\t\t\t\t\n\t\t\t\n\t\n' + +typeEltChaineAvecBlancSansInto = '\t\t\n\t\t\t\n\t\t\t\n\t\t' +if __name__ == '__main__' : + print ('ne fait rien') diff --git a/Efi2Xsd/mapDesTypes.py b/Efi2Xsd/mapDesTypes.py new file mode 100755 index 00000000..5d8126db --- /dev/null +++ b/Efi2Xsd/mapDesTypes.py @@ -0,0 +1,117 @@ +class Tuple: + def __init__(self,ntuple): + self.ntuple=ntuple + + def __convert__(self,valeur): + if type(valeur) == types.StringType: + return None + if len(valeur) != self.ntuple: + return None + return valeur + + def info(self): + return "Tuple de %s elements" % self.ntuple + + __repr__=info + __str__=info + + + +def inverseDico(dicoSource) : +#--------------------------- + dicoInverse = {} + for (clef,valeur) in dicoSource.items(): + if not(type(valeur) is tuple): + dicoInverse[valeur]=clef + continue + (elt,att)=valeur + if elt not in dicoInverse : dicoInverse[elt]={} + dicoInverse[elt][att]=clef + return dicoInverse + +dictSIMPEficasXML= { 'typ' : 'nomTypeAttendu', + 'statut' : 'statut', + 'min' : 'minOccurences', + 'max' : 'maxOccurences', + 'homo' : 'homo' , + 'position' : 'portee', + 'validators' : 'validators' , + 'sug' : 'valeurSugg', + 'defaut' : 'valeurDef' , + 'into' : ('plageValeur','into'), + 'val_min' : ('plageValeur','borneInf'), + 'val_max' : ('plageValeur','borneSup'), + 'ang' : ('doc','ang'), + 'fr' : ('doc','fr',), + 'docu' : ('doc','docu'), + } + +dictSIMPXMLEficas= inverseDico(dictSIMPEficasXML) + + + +dictFACTEficasXML = { 'statut' : 'statut', + 'min' : 'minOccurences', + 'max' : 'maxOccurences', + 'ang' : ('doc','ang'), + 'fr' : ('doc','fr',), + 'docu' : ('doc','docu'), + 'regles' : 'regles', + 'validators' : 'validators' , + } + +dictFACTXMLEficas = inverseDico(dictFACTEficasXML) + +dictBLOCEficasXML = { 'statut' : 'statut', + 'ang' : ('doc','ang'), + 'fr' : ('doc','fr',), + 'regles' : 'regles', + 'condition' : 'condition' , + } + +dictBLOCXMLEficas = inverseDico(dictBLOCEficasXML) + +dictPROCEficasXML = { 'nom' : 'nom', + 'regles' : 'regles', + 'ang' : ('doc','ang'), + 'fr' : ('doc','fr',), + 'docu' : ('doc','docu'), + } + +dictPROCXMLEficas = inverseDico(dictPROCEficasXML) + +dictOPEREficasXML = dictPROCEficasXML +dictOPERXMLEficas = dictPROCXMLEficas + +dictPourCast = { 'I' : int, 'R' : float, 'bool' : bool , } +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' ) + +listeParamTjsSequence = ('into' , 'intoSug') +listeParamSelonType = ('defaut', 'sug', 'into', 'intoSug') + +if __name__ == "__main__": + import pprint + pp=pprint.PrettyPrinter(indent=4) + print ('dictSIMPEficasXML') + pp.pprint(dictSIMPEficasXML) + print ('\n\n') + print ('dictSIMPXMLEficas') + pp.pprint(dictSIMPXMLEficas) + print ('\n\n') + print ('dictFACTEficasXML') + pp.pprint(dictFACTEficasXML) + print ('\n\n') + print ('dictFACTXMLEficas') + pp.pprint(dictFACTXMLEficas) + print ('\n\n') + print ('dictPROCEficasXML') + pp.pprint(dictPROCEficasXML) + print ('\n\n') + print ('dictPROCXMLEficas') + pp.pprint(dictPROCXMLEficas) + print ('\n\n') + print ('dictNomsDesTypes') + pp.pprint(dictNomsDesTypes ) diff --git a/InterfaceSsIhm/.qtEficasSsIhm.py.swp b/InterfaceSsIhm/.qtEficasSsIhm.py.swp deleted file mode 100644 index fa214f5f..00000000 Binary files a/InterfaceSsIhm/.qtEficasSsIhm.py.swp and /dev/null differ diff --git a/InterfaceSsIhm/configuration.py b/InterfaceSsIhm/configuration.py new file mode 100644 index 00000000..a9cb3375 --- /dev/null +++ b/InterfaceSsIhm/configuration.py @@ -0,0 +1,260 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2021 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +""" + Ce module sert pour charger les parametres de configuration d'EFICAS +""" +# Modules Python +from __future__ import absolute_import +try : + from builtins import str + from builtins import range + from builtins import object +except : pass + +import os, sys, types, re +import traceback +from Editeur.Eficas_utils import read_file +from Extensions.i18n import tr + + +class configBase(object): + + #------------------------------- + def __init__(self,appliEficas,repIni): + #------------------------------- + + # Classe de base permettant de lire, afficher + # et sauvegarder les fichiers utilisateurs + # On a deux directories : la directory generale (Repertoire d install + Nom du code + # Par exemple : ~/Install_Eficas/EficasV1_14/Openturns_Wrapper + # et la directorie de l utilisateur + # HOME/.Eficas_Openturns + # Le fichier prefs.py va etre lu dans la directory generale + # puis surcharge eventuellement par celui contenu dans ${PREFS_CATA_$CODE} + # par celui de l utilisateur + # le fichier de catalogue va etre lu dans la directory de l utilisateur s il exite + # dans le fichier general sinon + + 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 + self.repIni = repIni + + 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) + else : + self.rep_user = os.path.join('C:/','.config/Eficas',self.code) + + + self.setValeursParDefaut() + + if self.code != '' : + self.lectureFichierIniStandard() + self.lectureFichierIniIntegrateur() + self.lectureFichierIniUtilisateur() + + if self.boutonDsMenuBar: + self.closeAutreCommande = True + self.closeFrameRechercheCommande = True + + #Particularite des schemas MAP + if hasattr(self,'make_ssCode'): self.make_ssCode(self.ssCode) + + #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'] + else: + self.savedir='C:/' + + + + def setValeursParDefaut(self): + #----------------------------- + + # Valeurs par defaut + if not os.path.isdir(self.rep_user) : os.makedirs(self.rep_user) + self.path_doc = os.path.abspath(os.path.join(self.repIni,'..','Doc')) + 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)) + 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.demandeLangue=False + self.suiteTelemac=False + self.nombreDeBoutonParLigne=0 + self.translatorFichier=None + self.dicoImages= {} + self.dicoIcones= {} + self.afficheCommandesPliees = True + self.afficheFirstPlies = False + self.simpleClic = False + self.afficheOptionnelVide=False + self.afficheListesPliees=True + self.boutonDsMenuBar=False + self.ficIcones=None + self.repIcones=None + self.differencieSiDefaut=False + self.typeDeCata='Python' + 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=[] + self.rendVisiblesLesCaches=False + self.pasDeMCOptionnels=False + + self.dumpXSD=False + self.withXSD=False + self.afficheIhm=True + + self.afficheUQ=False + self.afficheUQ=True + + + + #-------------------------------------- + def lectureFichierIniStandard(self): + #-------------------------------------- + + 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) + setattr(self,k,valeur) + + + + #-------------------------------------- + def lectureFichierIniIntegrateur(self): + #-------------------------------------- + # Verifie l'existence du fichier "standard" + # appelle la lecture de ce fichier + clef="PREFS_CATA_"+self.code + try : + repIntegrateur=os.path.abspath(os.environ[clef]) + except : + return + + fic_ini_integrateur=os.path.join(repIntegrateur,self.name) + if not os.path.isfile(fic_ini_integrateur): return + txt = read_file(fic_ini_integrateur) + d=locals() + try: + exec(txt, d) + except : + 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 : + try : + setattr(self,k,d[k]) + except : + pass + #Glut pour les repertoires materiaux + #et pour la doc + for k in d : + if (k[0:8]=="rep_mat_") or (k[0:8]=="rep_doc_"): + setattr(self,k,d[k]) + + + #-------------------------------------- + def lectureFichierIniUtilisateur(self): + #-------------------------------------- + # Surcharge les parametres standards par les parametres utilisateur s'ils existent + self.fic_ini_utilisateur = os.path.join(self.rep_user,self.name) + if not os.path.isfile(self.fic_ini_utilisateur): return + + txt = read_file(self.fic_ini_utilisateur) + d=locals() + try: + exec(txt, d) + except : + l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2]) + 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]) + except : + pass + for k in d : + if (k[0:8]=="rep_mat_") or (k[0:8]=="rep_doc_"): + setattr(self,k,d[k]) + + #-------------------------------------- + def saveParams(self): + #-------------------------------------- + # sauvegarde + # les nouveaux parametres dans le fichier de configuration utilisateur + # + texte="" + for clef in self.labels_user : + if hasattr(self,clef): + valeur=getattr(self,clef) + texte= texte + clef+" = " + repr(valeur) +"\n" + #Glut pour les repertoires materiaux + #et pour la doc + for k in dir(self): + if (k[0:8]=="rep_mat_") or (k[0:8]=="rep_doc_"): + valeur=getattr(self,k) + texte= texte + k+" = " + repr(valeur) +"\n" + + f=open(self.fic_ini_utilisateur,'w+') + f.write(texte) + f.close() +# + + +def makeConfig(appliEficas,rep): + return configBase(appliEficas,rep) diff --git a/InterfaceSsIhm/editorSsIhm.py b/InterfaceSsIhm/editorSsIhm.py old mode 100644 new mode 100755 index bd5efb7d..7c12bdda --- a/InterfaceSsIhm/editorSsIhm.py +++ b/InterfaceSsIhm/editorSsIhm.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright (C) 2007-2013 EDF R&D +# Copyright (C) 2007-2021 EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -20,16 +20,14 @@ from __future__ import absolute_import from __future__ import print_function try : - from builtins import str - from builtins import range + from builtins import str + from builtins import range except : pass import types,sys,os, re import subprocess import traceback -import six -from six.moves import range import traceback @@ -55,49 +53,49 @@ 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.first = True self.jdc_item = None self.dicoNouveauxMC = {} self.dicoNouveauxFact = {} 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' : - from . import readercataXML as readercata - else : - from . import readercata - self.readercata = readercata.ReaderCata( self, self.appliEficas ) - self.appliEficas.readercata=self.readercata - self.appliEficas.code=self.code + if self.maConfiguration.typeDeCata == 'XML' : + from . import readercataXML as readercata + else : + from . import readercata + self.readercata = readercata.ReaderCata( self, self.appliEficas ) + self.appliEficas.readercata=self.readercata + self.appliEficas.code=self.code else : - self.readercata=self.appliEficas.readercata - if self.readercata.fic_cata == None : return #Sortie Salome + self.readercata=self.appliEficas.readercata + 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() + #if self.appliEficas.maConfiguration.dumpXSD==True : self.appliEficas.dumpXsd() self.dict_reels={} self.liste_simp_reel=[] self.dicoNouveauxMC={} @@ -105,24 +103,31 @@ class JDCEditorSsIhm : try: - self.maConfiguration.generator_module - _module = __import__(self.maConfiguration.generator_module) - info = _module.entryPoint() - generator.plugins.addEntryPoint(info) + self.maConfiguration.generator_module + _module = __import__(self.maConfiguration.generator_module) + info = _module.entryPoint() + generator.plugins.addEntryPoint(info) except: - pass + pass try: - self.maConfiguration.convert_module - #print self.maConfiguration.convert_module - _module = __import__(self.maConfiguration.convert_module) - info = _module.entryPoint() - convert.plugins.addEntryPoint(info) + self.maConfiguration.convert_module + #print self.maConfiguration.convert_module + _module = __import__(self.maConfiguration.convert_module) + info = _module.entryPoint() + convert.plugins.addEntryPoint(info) except : - pass + pass 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 @@ -136,48 +141,45 @@ class JDCEditorSsIhm : self.nouveau=0 if self.fichier is not None: # fichier jdc fourni if jdc==None : - #print ('PNPN : chgt try en if') - try : - #if 1 : - self.jdc = self.readFile(self.fichier) - except : - print ("mauvaise lecture du fichier") - if self.salome : - try : - self.appliEficas.addJdcInSalome( self.fichier) - except : - print ("mauvais enregistrement dans Salome") + #print ('PNPN : chgt try en if') + try : + #if 1 : + self.jdc = self.readFile(self.fichier) + except : + print ("mauvaise lecture du fichier") + if self.salome : + try : self.appliEficas.addJdcInSalome( self.fichier) + except : print ("mauvais enregistrement dans Salome") else : - self.jdc=jdc + self.jdc=jdc if self.jdc is not None and units is not None: - self.jdc.recorded_units=units - self.jdc.old_recorded_units=units + self.jdc.recorded_units=units + self.jdc.old_recorded_units=units 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 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: + #else: #comploader.chargerComposants() - #cette ligne devrait etre dans editor ??? - self.jdc_item=Objecttreeitem.makeObjecttreeitem( self, "nom", self.jdc ) + #self.jdc_item=Objecttreeitem.makeObjecttreeitem( self, "nom", self.jdc ) #-------------------------------# def readFile(self, fn): @@ -190,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: - # Le convertisseur existe on l'utilise - - p=convert.plugins[self.appliEficas.format_fichier_in]() - 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') + 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[formatIn]() + p.readfile(fn) + + if p.text=="" : self.nouveau=1 + #print ('PNPN --> CIST a faire') + + 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, @@ -250,33 +252,27 @@ 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 + jdc.recorded_units=units + jdc.old_recorded_units=units + # 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 - #--------------------------------# + #--------------------------------# def _newJDCInclude( self ,units = None): #--------------------------------# """ @@ -288,24 +284,26 @@ 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 - J.old_recorded_units=units + J.recorded_units=units + J.old_recorded_units=units return J @@ -315,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(): @@ -327,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 #----------------------------------------------# @@ -341,64 +339,68 @@ class JDCEditorSsIhm : #-----------------------# def generDico(self): #-----------------------# - if 'dico' in generator.plugins: - self.generator=generator.plugins['dico']() - #print (self.generator) - jdc_formate=self.generator.gener(self.jdc) - #print (jdc_formate) - dico=self.generator.Dico - #print (dico) - return dico + if 'dico' in generator.plugins: + self.generator=generator.plugins['dico']() + #print (self.generator) + jdc_formate=self.generator.gener(self.jdc) + #print (jdc_formate) + dico=self.generator.Dico + #print (dico) + return dico #-----------------------# 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") #-----------------------# def viewJdcRegles(self): #-----------------------# # on ajoute les regles - texte_global, test_global = self.jdc.verifRegles() + texte_global, test_global = self.jdc.verifRegles() self._viewText(texte_global, "JDC_REGLES") #-----------------------# def getJdcRapport(self): #-----------------------# # on ajoute les regles - strRapport = six.text_type( self.jdc.report() ) + strRapport = str( self.jdc.report() ) return strRapport #---------------------# def getFileName(self): #---------------------# - return self.fichier + return self.fichier #-------------------# def initModif(self): #-------------------# - """ - Met l'attribut modified a 'o' : utilise par Eficas pour savoir - si un JDC doit etre sauvegarde avant destruction ou non - """ - self.modified = True + """ + Met l'attribut modified a 'o' : utilise par Eficas pour savoir + si un JDC doit etre sauvegarde avant destruction ou non + """ + self.modified = True #--------------------------------------------------# @@ -411,14 +413,14 @@ 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: - txt += eol + if txt[-len(eol):] != eol: + txt += eol else: txt += eol txt=self.ajoutVersionCataDsJDC(txt) @@ -432,34 +434,37 @@ 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 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) - if pourRun : jdc_formate=self.generator.textePourRun - if self.code == 'TELEMAC' : jdc_formate=self.generator.texteDico - except ValueError as e: - self.informe( "Erreur a la generation",str(e),'red') - return - - if not self.generator.cr.estvide(): - self.informe("Erreur a la generation","EFICAS ne sait pas convertir ce JDC",'red') + 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,appliEficas=self.appliEficas) + if pourRun : jdc_formate=self.generator.textePourRun + if self.code == 'TELEMAC' : jdc_formate=self.generator.texteDico + except ValueError as e: + self.informe( "Erreur a la generation",str(e),'red') + return + + if not self.generator.cr.estvide(): + self.informe("Erreur a la generation","EFICAS ne sait pas convertir ce JDC",'red') + return "" + else: + return jdc_formate + else: + # Il n'existe pas c'est une erreur + self.informe("Format inconnu", self.format + " non reconnu" ) return "" - else: - return jdc_formate - else: - # Il n'existe pas c'est une erreur - self.informe("Format inconnu", self.format + " non reconnu" ) - return "" #------------------------------# def verifieChecksum(self,text): @@ -472,48 +477,48 @@ class JDCEditorSsIhm : checkAvant=text[indexDeb:indexFin+13] textJDC=text[0:indexDeb]+text[indexFin+13:-1] if self.code != 'PSEN' and self.code != 'PSEN_N1': - checksum=self.getChecksum(textJDC) - pareil=(checkAvant==checksum) + checksum=self.getChecksum(textJDC) + pareil=(checkAvant==checksum) else : - pareil=1 + pareil=1 return pareil, textJDC #---------------------------# def getChecksum(self,texte): #---------------------------# try : - import haslib - newtexte=texte.replace('"','\\"') - hash_checksum = hashlib.md5() - hash_checksum.update(newtexte.encode('utf-8')) - checksum = hash_checksum.hexdigest() - 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 + 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): #---------------------# - if 'dicoImbrique' in generator.plugins: - self.generator=generator.plugins['dicoImbrique']() - #print (self.generator) - jdc_formate=self.generator.gener(self.jdc) - dico=self.generator.Dico - return dico - else : - self.afficheInfos(tr("Format %s non reconnu" , self.format),Qt.red) - return "" - - #-----------------------------------------# + if 'dicoImbrique' in generator.plugins: + self.generator=generator.plugins['dicoImbrique']() + #print (self.generator) + jdc_formate=self.generator.gener(self.jdc) + dico=self.generator.Dico + return dico + else : + self.afficheInfos(tr("Format %s non reconnu" , 'Dictionnaire Imbrique' ),'red') + return "" + + #-----------------------------------------# def chercheGroupes(self): #-----------------------------------------# listeMA,listeNO=self.getTextJDC("GroupMA") @@ -523,20 +528,20 @@ 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]() - jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.maConfiguration) - dicoCourant=self.generator.dico + # Le generateur existe on l'utilise + self.generator=generator.plugins[format]() + jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.maConfiguration) + dicoCourant=self.generator.dico return dicoCourant #-----------------------------------------------------------------# def saveFileLegerAs(self, fileName = None) : #-----------------------------------------------------------------# if fileName != None : - self.fichier = fileName - return self.saveFileLeger(fileName) + self.fichier = fileName + return self.saveFileLeger(fileName) return self.saveFileLeger() #-----------------------------------------------------------------# @@ -546,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) # --------------------------------------------- @@ -556,24 +561,24 @@ class JDCEditorSsIhm : #--------------------------------# def ajoutCommentaire(self): #--------------------------------# - print ('pas programme sans Ihm') - print ('prevenir la maintenance du besoin') + print ('pas programme sans Ihm') + print ('prevenir la maintenance du besoin') #--------------------------------------# def informe(self,titre,txt,critique=True): #--------------------------------------# # methode differenre avec et sans ihm - if critique : print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!') - print (titre) - print (txt) - if critique : print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!') + if critique : print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print (titre) + print (txt) + if critique : print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!') #--------------------------------------# def afficheInfos(self,txt,couleur=None): #--------------------------------------# # methode differenre avec et sans ihm - print (txt) + print (txt) #-----------------------------------------------------------------------# def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600): @@ -595,16 +600,19 @@ 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 self.appliEficas.maConfiguration.fichierXML !=None : self.jdc.analyseXML() + 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) # @@ -633,13 +641,13 @@ class JDCEditorSsIhm : etape=monItem.item.object CONTEXT.set_current_step(etape) try : - ok=etape.build_includeEtape(texte) + ok=etape.build_includeEtape(texte) except : - ok=0 + ok=0 if not ok : - QMessageBox.information( self, - tr("Import texte"), - tr("Impossible d importer le texte")) + QMessageBox.information( self, + tr("Import texte"), + tr("Impossible d importer le texte")) self.tree.racine.build_children() return ok @@ -657,7 +665,7 @@ class JDCEditorSsIhm : # dans le JDC ouChercher=etape for mot in listeAvant : - ouChercher=ouChercher.getChild(mot,restreint="oui") + ouChercher=ouChercher.getChild(mot,restreint="oui") monMC=ouChercher.getChild(MCFils,restreint="oui") if monMC != None : ouChercher.suppentite(monMC) ouChercher.state='changed' @@ -672,7 +680,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 @@ -691,7 +699,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) @@ -709,7 +717,7 @@ class JDCEditorSsIhm : # dans le JDC ouChercher=etape for mot in listeAvant : - ouChercher=ouChercher.getChild(mot,restreint="oui") + ouChercher=ouChercher.getChild(mot,restreint="oui") monMC=etape.getChild(ouChercher,restreint="oui") if monMC== None : monMC= ouChercher.addEntite(MCFils) monMC.isvalid() @@ -720,14 +728,14 @@ class JDCEditorSsIhm : # pour VP monObj=etape for mot in listeAvant : - monObj=monObj.getChild(mot,restreint="oui") - if monObj==None : return False + monObj=monObj.getChild(mot,restreint="oui") + if monObj==None : return False if monObj == None : return False if monObj.valeur != valeur : - # PNPN le setValeur fait des bugs --> pourquoi - #monObj.setValeur(valeur) - monObj.valeur=valeur - monObj.isValid() + # PNPN le setValeur fait des bugs --> pourquoi + #monObj.setValeur(valeur) + monObj.valeur=valeur + monObj.isValid() return True #-------------------------------------------------# @@ -742,9 +750,9 @@ class JDCEditorSsIhm : if debug : print ('etape trouvee', ouChercher) if ouChercher==None : return None for mot in listeAvant : - ouChercher=ouChercher.getChild(mot,restreint="oui") - if debug : print (mot, ouChercher) - if ouChercher==None : return None + ouChercher=ouChercher.getChild(mot,restreint="oui") + if debug : print (mot, ouChercher) + if ouChercher==None : return None monMC=ouChercher.getChild(MCFils,restreint="oui") if debug : print ('monMC', monMC) if monMC== None : return None @@ -759,9 +767,9 @@ class JDCEditorSsIhm : ouChercher=etape debug=0 for mot in listeAvant : - ouChercher=ouChercher.getChild(mot,restreint="oui") - if debug : print (mot, ouChercher) - if ouChercher==None : return None + ouChercher=ouChercher.getChild(mot,restreint="oui") + if debug : print (mot, ouChercher) + if ouChercher==None : return None monMC=ouChercher.getChild(MCFils,restreint="oui") if debug : print ('monMC', monMC) return monMC @@ -776,9 +784,9 @@ class JDCEditorSsIhm : if e.nom == nomEtape : ouChercher=e; break if ouChercher==None : return None for mot in listeAvant : - ouChercher=ouChercher.getChild(mot,restreint="oui") - #print (mot, ouChercher) - if ouChercher==None : return None + ouChercher=ouChercher.getChild(mot,restreint="oui") + #print (mot, ouChercher) + if ouChercher==None : return None monMC=ouChercher.getChild(MCFils,restreint="oui") monMC.set_valeur(valeur) monMC.isvalid() @@ -789,14 +797,14 @@ class JDCEditorSsIhm : # dans le JDC ouChercher=etape if isinstance (etape, str): - ouChercher=None - for e in self.jdc.etapes: - if e.nom == etape : ouChercher=e; break + ouChercher=None + for e in self.jdc.etapes: + if e.nom == etape : ouChercher=e; break if ouChercher==None : return for mot in listeAvant : - ouChercher=ouChercher.getChild(mot,restreint="oui") - if ouChercher==None : return + ouChercher=ouChercher.getChild(mot,restreint="oui") + if ouChercher==None : return monMC=ouChercher.getChild(MCFils,restreint="oui") if monMC== None : monMC= ouChercher.addEntite(MCFils) @@ -815,24 +823,34 @@ class JDCEditorSsIhm : for mot in listeAvant : try : - ouChercher=ouChercher.getChild(mot,restreint="oui") + ouChercher=ouChercher.getChild(mot,restreint="oui") # Le mot clef n est pas la except : return 0 try : - monMC=ouChercher.getChild(MCFils,restreint="oui") + monMC=ouChercher.getChild(MCFils,restreint="oui") # Le mot clef n est pas la except : return 0 if monMC == None : return 0 if hasattr(monMC.definition,'into') : - if type(monMC.definition.into) ==types.FunctionType : maListeDeValeur=monMC.definition.into() - else : maListeDeValeur=monMC.definition.into + if type(monMC.definition.into) ==types.FunctionType : maListeDeValeur=monMC.definition.into() + else : maListeDeValeur=monMC.definition.into else : - return 0 + return 0 monMC.state='changed' return 1 + def dumpXsd(self, avecEltAbstrait = False): + #-----------------------------------------# + texteXSD = self.readercata.cata.JdC.dumpXsd(avecEltAbstrait) + return texteXSD + + def dumpStructure(self): + #----------------------------# + texteStructure = self.readercata.cata.JdC.dumpStructure() + return texteStructure + #-------------------------------------# def changeDefautDefMC(self,nomEtape,listeMC,valeurs): #-------------------------------------# @@ -847,9 +865,9 @@ class JDCEditorSsIhm : ouChercher=definitionEtape if len(listeMC) > 1 : - for mc in listeMC[0:-1]: - mcfact=ouChercher.entites[mc] - ouChercher=mcfact + for mc in listeMC[0:-1]: + mcfact=ouChercher.entites[mc] + ouChercher=mcfact mcAccas=ouChercher.entites[listeMC[-1]] mcAccas.defaut=valeurs @@ -890,8 +908,8 @@ class JDCEditorSsIhm : # dans le MDD #print 'in deleteDefinitionMC', etape,listeAvant,nomDuMC if isinstance (etape, str): - for e in self.jdc.etapes: - if e.nom == etape : etape=e; break + for e in self.jdc.etapes: + if e.nom == etape : etape=e; break if etape == None : return #definitionEtape=getattr(self.jdc.cata[0],etape) definitionEtape=getattr(self.jdc.cata,etape) @@ -967,8 +985,8 @@ class JDCEditorSsIhm : self.changeIntoDefMC(etape,listeMC,into) if isinstance (etape, str): - for e in self.jdc.etapes: - if e.nom == etape : etape=e; break + for e in self.jdc.etapes: + if e.nom == etape : etape=e; break if etape == None : return ouChercher = etape @@ -1001,11 +1019,11 @@ class JDCEditorSsIhm : indexDeb=text.find("#VERSION_CATALOGUE:") indexFin=text.find(":FIN VERSION_CATALOGUE") if indexDeb < 0 : - self.versionCataDuJDC="sans" - textJDC=text + self.versionCataDuJDC="sans" + textJDC=text else : - self.versionCataDuJDC=text[indexDeb+19:indexFin] - textJDC=text[0:indexDeb]+text[indexFin+23:-1] + self.versionCataDuJDC=text[indexDeb+19:indexFin] + textJDC=text[0:indexDeb]+text[indexFin+23:-1] self.versionCata="sans" if hasattr(self.readercata.cata,'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata.VERSION_CATALOGUE @@ -1062,39 +1080,39 @@ class JDCEditorSsIhm : #---------------------------# def _newJDCCND(self): #---------------------------# - extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)') - - #if self.salome == 0 : - QMessageBox.information( self, - tr("Fichier Med"), - tr("Veuillez selectionner un fichier Med")) - QSfichier = QFileDialog.getOpenFileName(self.appliEficas, - caption='Fichier Med', - filter=extensions) - QSfichier=QSfichier[0] - self.fichierMED=QSfichier - from acquiertGroupes import getGroupes - erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED) - if erreur != "" : print ("a traiter") - texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n" - texteSources="" - texteCond="" - texteNoCond="" - texteVcut="" - texteZs="" - for groupe in self.listeGroupes : - if groupe[0:8]=='CURRENT_': - texteSources +=groupe[8:]+"=SOURCE(" - texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n" - if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n" - if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n" - if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n" - if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n" - texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs - self.newTexteCND=texte - self.modified=1 - return texte + extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)') + + #if self.salome == 0 : + QMessageBox.information( self, + tr("Fichier Med"), + tr("Veuillez selectionner un fichier Med")) + QSfichier = QFileDialog.getOpenFileName(self.appliEficas, + caption='Fichier Med', + filter=extensions) + QSfichier=QSfichier[0] + self.fichierMED=QSfichier + from acquiertGroupes import getGroupes + erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED) + if erreur != "" : print ("a traiter") + texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n" + texteSources="" + texteCond="" + texteNoCond="" + texteVcut="" + texteZs="" + for groupe in self.listeGroupes : + if groupe[0:8]=='CURRENT_': + texteSources +=groupe[8:]+"=SOURCE(" + texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n" + if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n" + if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n" + if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n" + if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n" + texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs + self.newTexteCND=texte + self.modified=1 + return texte if __name__ == "__main__": - print ('a faire') + print ('a faire') diff --git a/InterfaceSsIhm/eficas_go.py b/InterfaceSsIhm/eficas_go.py index a4ef937b..9609025c 100755 --- a/InterfaceSsIhm/eficas_go.py +++ b/InterfaceSsIhm/eficas_go.py @@ -23,76 +23,224 @@ from __future__ import absolute_import from __future__ import print_function try : - from builtins import str + from builtins import str 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 .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) +if sys.version_info[0] < 3: + print("Must be using Python 3") + sys.exit() -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 + from PyQt5.QtWidgets import QApplication except : - print('Please, set qt environment') - return + print('Please, set qt environment') + 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, fichierCata=None): +#------------------------------------------------------------------------------------------------------------------------- + """ + 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 .qtEficasSsIhm import AppliSsIhm + Eficas=AppliSsIhm(code=code, salome=0, multi=multi, langue=langue, labelCode=labelCode, genereXSD=genereXSD, fichierCata=fichierCata) + 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) + texteXSD=monEditor.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 lanceEficas_Web(code=None): +#------------------------------ + from Editeur import session + options=session.parse(sys.argv) + if code != None : options.code = code + try : fichier=options.comm[0] + except : fichier=None + + monEficasSsIhm = getEficasSsIhm(code=options.code ) + from .editorSsIhm import JDCEditorSsIhm + monEditeur=JDCEditorSsIhm(monEficasSsIhm,fichier) + print ('voici le JDCEditor', monEditeur) + +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 + try : fichier=options.comm[0] + except : fichier=None + if fichier==None : + print ('comm file is needed') + return + + monEficasSsIhm = getEficasSsIhm(code=options.code, forceXML=True) + + from .editorSsIhm import JDCEditorSsIhm + monEditeur=JDCEditorSsIhm(monEficasSsIhm,fichier) + print (options) + if options.fichierXMLOut == None : + fichierXMLOut=fichier[:fichier.rfind(".")]+'.xml' + else : + fichierXMLOut=options.fichierXMLOut + if not(monEditeur.jdc.isValid()): + print ('Fichier comm is not valid') + return + #print ('Fichier comm is not valid') + monEditeur.XMLgenerator.gener(monEditeur.jdc) + monEditeur.XMLgenerator.writeDefault(fichierXMLOut) + +def genereStructure(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() + texteStructure=monEditor.dumpStructure() + + fichierCataTrunc=os.path.splitext(os.path.basename(options.fichierCata))[0] + fileStructure = fichierCataTrunc + '.txt' + f = open( str(fileStructure), 'w') + f.write(str(texteStructure)) + f.close() + +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=False): +#------------------------------- + # 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)) + laDefDeLaFonctionDansAccas = getattr(monEditor.readercata.cata,laFonctionName) + objConstruit = laDefDeLaFonctionDansAccas.makeObjetPourVerifSignature(*args,**kwargs) + if (objConstruit.isValid()) : + ret = laFonction(*args, **kwargs) + return ret + else : + print ('mauvais arguments') + print (objConstruit.CR()) + return None + return fonctionValidee + + #maClasseAccas=getattr(self.cata,objEtape.monNomClasseAccas) + return fonctionValidee + + return laFonction + +def createFromDocumentAccas(fichierCata=None,fichier=None,code=None): +#------------------------------------------------------------ + if fichier == None : print ('file is needed'); return None + if fichierCata == None : print ('cata file is needed'); return None + + from Noyau.N_OBJECT import activeSurcharge + activeSurcharge() + + from .editorSsIhm import JDCEditorSsIhm + monEficasSsIhm = getEficasSsIhm(code='Essai', fichierCata=fichierCata) + monEditeur=JDCEditorSsIhm(monEficasSsIhm,fichier) + return monEditeur.jdc + #from Noyau + + +# --------------------------- 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) @@ -102,73 +250,75 @@ def lanceEficas_ssIhm(code=None,fichier=None,ssCode=None,version=None,debug=Fals from . import readercata if not hasattr ( Eficas, 'readercata'): - monreadercata = readercata.ReaderCata( parent, Eficas ) - Eficas.readercata=monreadercata + monreadercata = readercata.ReaderCata( parent, Eficas ) + Eficas.readercata=monreadercata from .editor import JDCEditor monEditeur=JDCEditor(Eficas,fichier) 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 : - fileName=fichier.split(".")[0]+"_reecrit.comm" - fn=fichier.split(".")[0]+"_cr.txt" + if ou == None : + fileName=fichier.split(".")[0]+"_reecrit.comm" + fn=fichier.split(".")[0]+"_cr.txt" else : - f=fichier.split(".")[0]+"_reecrit.comm" - f1=os.path.basename(f) - fn=fichier.split(".")[0]+"_cr.txt" - f2=os.path.basename(fn) - fileName=os.path.join(ou,f1) - fileCr=os.path.join(ou,f2) + f=fichier.split(".")[0]+"_reecrit.comm" + f1=os.path.basename(f) + fn=fichier.split(".")[0]+"_cr.txt" + f2=os.path.basename(fn) + fileName=os.path.join(ou,f1) + fileCr=os.path.join(ou,f2) debut=False if debug : - import cProfile, pstats, StringIO - pr = cProfile.Profile() - pr.enable() - monEditeur.saveFileAs(fileName=fileName) - pr.disable() - s = StringIO.StringIO() - sortby = 'cumulative' - ps = pstats.Stats(pr, stream=s).sort_stats(sortby) - ps.print_stats() - print (s.getValue()) + import cProfile, pstats, StringIO + pr = cProfile.Profile() + pr.enable() + monEditeur.saveFileAs(fileName=fileName) + pr.disable() + s = StringIO.StringIO() + sortby = 'cumulative' + ps = pstats.Stats(pr, stream=s).sort_stats(sortby) + ps.print_stats() + print (s.getValue()) elif not leger : monEditeur.saveFileAs(fileName=fileName) else : monEditeur.saveFileLegerAs(fileName=fileName) if cr: - f = open(fileCr, 'w') - f.write(str(monEditeur.jdc.report())) - f.close() + f = open(fileCr, 'w') + f.write(str(monEditeur.jdc.report())) + f.close() def lanceEficas_param(code='Adao',fichier=None,version='V0',macro='ASSIMILATION_STUDY'): """ 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) from . import readercata if not hasattr ( Eficas, 'readercata'): - monreadercata = readercata.ReaderCata( parent, Eficas ) - Eficas.readercata=monreadercata + monreadercata = readercata.ReaderCata( parent, Eficas ) + Eficas.readercata=monreadercata from .editor import JDCEditor monEditeur=JDCEditor(Eficas,fichier) @@ -176,10 +326,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 +333,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,42 +349,18 @@ 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(): if not (line[0]=='#'): - jdc+="%s"%line + jdc+="%s"%line # Warning, we have to make sure that the jdc comes as a simple # string without any extra spaces/newlines return jdc.strip() -def lanceEficas_Web(code=None,fichier=None,ssCode=None,version=None,debug=False,langue='en',multi=False,versionCode=None): - from Editeur import session - options=session.parse(sys.argv) - if version!=None and options.cata == None : options.cata=version - if fichier==None and options.comm != [] : fichier=options.comm[0] - if code == None : code=options.code - - from .qtEficasSsIhm import AppliSsIhm - Eficas=AppliSsIhm(code=code,salome=0,ssCode=ssCode,multi=multi,langue=langue,versionCode=versionCode) - - from .ssIhm import QWParentSSIhm - parent=QWParentSSIhm(code,Eficas,version) - - from . import readercata - if not hasattr ( Eficas, 'readercata'): - monreadercata = readercata.ReaderCata( parent, Eficas ) - Eficas.readercata=monreadercata - - from .editor import JDCEditor - monEditeur=JDCEditor(Eficas,fichier) - return monEditeur - - 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/InterfaceSsIhm/qtEficasSsIhm.py b/InterfaceSsIhm/qtEficasSsIhm.py index af26c198..ea744076 100755 --- a/InterfaceSsIhm/qtEficasSsIhm.py +++ b/InterfaceSsIhm/qtEficasSsIhm.py @@ -18,14 +18,14 @@ # 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 + from builtins import str except : pass import os, sys -import six from Extensions.eficas_exception import EficasException from Extensions import param2 @@ -33,22 +33,25 @@ from Extensions import param2 from .getVersion import getEficasVersion from .viewManagerSsIhm import MyViewManagerSsIhm +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,fichierCata=None): """ 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 @@ -62,25 +65,30 @@ 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') + if fichierCata== None: self.fichierCata=session.d_env.fichierCata + else : self.fichierCata=fichierCata + if session.d_env.labelCode : self.labelCode=session.d_env.labelCode + self.withXSD=session.d_env.withXSD + if self.salome: - import Accas - try : - import eficasSalome - Accas.SalomeEntry = eficasSalome.SalomeEntry - except : - print ('eficas hors salome') + import Accas + try : + import eficasSalome + Accas.SalomeEntry = eficasSalome.SalomeEntry + except : + print ('eficas hors salome') self.multi=multi - if self.multi : - print ('pas de multi sans ihm') + if self.multi : + print ('pas de multi sans ihm') if langue=='fr': self.langue=langue else : self.langue="ang" if self.multi == False : - self.definitCode(code,ssCode) - if code==None: return + self.definitCode(code,None) + if code==None: return self.suiteTelemac=False self.viewmanager=MyViewManagerSsIhm(self) @@ -91,23 +99,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 .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) + from Extensions import localisation + localisation.localise(None,self.langue,translatorFichier=self.maConfiguration.translatorFichier) + if self.withXSD : self.maConfiguration.withXSD=True def getSource(self,file): @@ -120,20 +139,29 @@ class AppliSsIhm: def initEditor(self,fichier = None,jdc = None, units = None,include=0): - if self.editor != None : - print ('un seul editeur par appli') - sys.Exit() - self.editor = JDCEditorSsIhm(self,fichier, jdc, self.myQtab,units=units,include=include) - + if (hasattr(self, 'editor')) and self.editor != None : + print ('un seul editeur par application') + sys.exit() + self.editor = self.viewmanager.getNewEditorNormal() + + def initEditorNormal(self,fichier = None,jdc = None, units = None,include=0): + if (hasattr(self, 'editor')) and self.editor != None : + print ('un seul editeur par application') + sys.Exit() + #self.editor = JDCEditorSsIhm(self,fichier, jdc, self.myQtab,units=units,include=include) + self.editor = self.viewmanager.getNewEditorNormal() + def fileNew(self): - self.editor=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: @@ -151,10 +179,13 @@ class AppliSsIhm: ok = editor.saveFileAs() print ('ok ',ok) - def dumpXsd(self): - current_cata = CONTEXT.getCurrentCata() - current_cata.dumpXsd() - if self.maConfiguration.afficheIhm==False : exit() + def dumpXsd(self, avecEltAbstrait = False): + currentCata = CONTEXT.getCurrentCata() + texteXSD = currentCata.dumpXsd( avecEltAbstrait) + return texteXSD + #if self.maConfiguration.afficheIhm==False : exit() + #else : return texteXSD + #,self.fileSaveAs #,self.fileClose @@ -163,10 +194,10 @@ class AppliSsIhm: #,self.jdcRegles #,self.jdcFichierSource #,self.visuJdcPy - + if __name__=='__main__': # Modules Eficas - monEficas= AppliSsIhm(code='Adao',salome=0,versionCode='V83') + monEficas= AppliSsIhm(code='Adao',salome=0,labelCode='V83') diff --git a/InterfaceSsIhm/viewManagerSsIhm.py b/InterfaceSsIhm/viewManagerSsIhm.py index 6d83df3c..358cf6cb 100644 --- a/InterfaceSsIhm/viewManagerSsIhm.py +++ b/InterfaceSsIhm/viewManagerSsIhm.py @@ -20,60 +20,57 @@ from __future__ import absolute_import try : - from builtins import str - from builtins import object + from builtins import str + from builtins import object except : pass import os from Extensions.i18n import tr -import six -from PyQt5.QtWidgets import QFileDialog, QMessageBox -from PyQt5.QtCore import QFileInfo # -------------------------------- class JdcSsIhmHandler(object): # -------------------------------- # retourne a l utilisateur - def __init__(self,viewManager): + def __init__(self,viewManager): # -------------------------------------- - self.viewManagerSsIhm=viewManager + self.viewManagerSsIhm=viewManager - def viewJdcPy(self) : + def viewJdcPy(self) : # --------------------- - self.viewManagerSsIhm.handleViewJdcPy(self) + self.viewManagerSsIhm.handleViewJdcPy(self) - def viewJdcSource(self) : + def viewJdcSource(self) : # --------------------- - self.viewManagerSsIhm.handleViewJdcSource(self) + self.viewManagerSsIhm.handleViewJdcSource(self) - def getFileName(self): + def getFileName(self): # --------------------- - self.viewManagerSsIhm.getFileName(self) + self.viewManagerSsIhm.getFileName(self) - def viewJdcRapport(self) : + def viewJdcRapport(self) : # --------------------- - self.viewManagerSsIhm.handleViewJdcRapport(self) + self.viewManagerSsIhm.handleViewJdcRapport(self) - def getJdcRapport(self) : + def getJdcRapport(self) : # --------------------- - return self.viewManagerSsIhm.handleGetJdcRapport(self) + return self.viewManagerSsIhm.handleGetJdcRapport(self) - def getDicoPython(self) : + def getDicoPython(self) : # ------------------------- - return self.viewManagerSsIhm.generDico(self) + return self.viewManagerSsIhm.generDico(self) - def isJdcValid(self) : + def isJdcValid(self) : # ------------------------- - return self.viewManagerSsIhm.isJdcValid(self) + return self.viewManagerSsIhm.isJdcValid(self) - def fileSaveAs(self,fileName): + def fileSaveAs(self,fileName): # ------------------------- - return self.viewManagerSsIhm.fileSaveAs(self,fileName) + return self.viewManagerSsIhm.fileSaveAs(self,fileName) - def fileLegerSaveAs(self,fileName): + def fileLegerSaveAs(self,fileName): # ----------------------------------- - return self.viewManagerSsIhm.fileLegerSaveAs(self,fileName) + return self.viewManagerSsIhm.fileLegerSaveAs(self,fileName) @@ -82,335 +79,161 @@ class MyViewManagerSsIhm(object): #-------------------------------- # Symetrique de ViewManager mais pas d heritage entre les 2 # dans le viewManager pas de souci pour savoir qui est le jdc sur lequel on travaille -# ici en revanche.... c est moins sur +# ici en revanche.... c est moins sur . voir avec le fichier # -------------------------------- - def __init__(self,appliEficas): + def __init__(self,appliEficas): # -------------------------------- - self.appliEficas=appliEficas - self.tabWidgets = [] - self.mesIndexes = {} - self.dictEditors={} - self.untitledCount = 0 - self.doubles = {} + self.appliEficas=appliEficas + self.tabWidgets = [] + self.mesIndexes = {} + self.dictEditors={} + self.untitledCount = 0 + self.doubles = {} # ------------------------------------------------------ - def handleOpen(self,fichier=None, units=None): + def handleOpen(self,fichier=None, units=None): # ------------------------------------------------------ - result = None - if fichier is None: - print ('nom de fichier obligatoire') - return None + result = None + if fichier is None: + print ('nom de fichier obligatoire') + return None - for handler in self.dictEditors : - editor=self.dictEditors[handler] - if self.samePath(fichier, editor.getFileName()): - print ('fichier deja ouvert . pas de nouvel editor') - return handler + for handler in self.dictEditors : + editor=self.dictEditors[handler] + if self.samePath(fichier, editor.getFileName()): + print ('fichier deja ouvert . pas de nouvel editor') + return handler - monNewHandler = self.getNewEditor(fichier,units) - return monNewHandler + monNewHandler = self.getNewEditor(fichier,units) + return monNewHandler # ---------------------------------------------------------------------- - def getNewEditor(self,fichier = None,jdc = None, units = None,include=0): + def getNewEditor(self,fichier = None,jdc = None, units = None,include=0): # ---------------------------------------------------------------------- - - from .editorSsIhm import JDCEditorSsIhm - editor = JDCEditorSsIhm(self.appliEficas,fichier,jdc, units=units,include=include) - - if editor.jdc: # le fichier est bien un jdc - monHandler = JdcSsIhmHandler(self) - self.dictEditors[monHandler]=editor - return monHandler - else: - print ('impossible de construire le jdc') - return None +# il faudrait decider entre e handler ou non +# le cas d usage n est pas tout a fait identique : +# avec handler pour les utilisateurs avance +# sans pour les utilisateurs encore plus ancvances et les tests + + from .editorSsIhm import JDCEditorSsIhm + editor = JDCEditorSsIhm(self.appliEficas,fichier,jdc, units=units,include=include) + + if editor.jdc: # le fichier est bien un jdc + monHandler = JdcSsIhmHandler(self) + self.dictEditors[monHandler]=editor + return monHandler + else: + print ('impossible de construire le jdc') + return None + +# -------------------------------------------------------------------------------- + def getNewEditorNormal(self,fichier = None,jdc = None, units = None,include=0): +# -------------------------------------------------------------------------------- + + from .editorSsIhm import JDCEditorSsIhm + editor = JDCEditorSsIhm(self.appliEficas,fichier,jdc, units=units,include=include) + self.editor=editor + return editor # ----------------------------- - def samePath(self,f1, f2): + def samePath(self,f1, f2): # ------------------------------ - """ - compare two paths. - """ - if f1 is None or f2 is None: return 0 - if os.path.normcase(os.path.normpath(f1)) == os.path.normcase(os.path.normpath(f2)) : return 1 - return 0 + """ + compare two paths. + """ + if f1 is None or f2 is None: return 0 + if os.path.normcase(os.path.normpath(f1)) == os.path.normcase(os.path.normpath(f2)) : return 1 + return 0 # --------------------------------- - def handleViewJdcPy(self,handler): + def handleViewJdcPy(self,handler): # --------------------------------- if not (handler in self.dictEditors) : - print ('editor non trouve') - return + print ('editor non trouve') + return self.dictEditors[handler].viewJdcPy() # --------------------------------- - def getFileName(self,handler): + def getFileName(self,handler): # --------------------------------- if not (handler in self.dictEditors) : - print ('editor non trouve') - return + print ('editor non trouve') + return return self.dictEditors[handler].getFileName() # --------------------------------------------- - def handleViewJdcSource(self,handler): + def handleViewJdcSource(self,handler): # --------------------------------------------- print (handler) if not (handler in self.dictEditors) : - print ('editor non trouve') - return + print ('editor non trouve') + return self.dictEditors[handler].viewJdcSource() # --------------------------------------------- - def handleViewJdcRapport(self,handler): + def handleViewJdcRapport(self,handler): # --------------------------------------------- print (handler) if not (handler in self.dictEditors) : - print ('editor non trouve') - return + print ('editor non trouve') + return self.dictEditors[handler].viewJdcRapport() # --------------------------------------------- - def handleGetJdcRapport(self,handler): + def handleGetJdcRapport(self,handler): # --------------------------------------------- if not (handler in self.dictEditors) : - print ('editor non trouve') - return + print ('editor non trouve') + return return self.dictEditors[handler].getJdcRapport() # --------------------------------------------- - def handleViewJdcRapport(self,handler): + def handleViewJdcRapport(self,handler): # --------------------------------------------- print (handler) if not (handler in self.dictEditors) : - print ('editor non trouve') - return + print ('editor non trouve') + return self.dictEditors[handler].viewJdcRapport() # --------------------------------------------- - def generDico(self,handler): + def generDico(self,handler): # --------------------------------------------- print (handler) if not (handler in self.dictEditors) : - print ('editor non trouve') - return + print ('editor non trouve') + return return self.dictEditors[handler].generDico() # --------------------------------------------- - def isJdcValid(self,handler): + def isJdcValid(self,handler): # --------------------------------------------- print (handler) if not (handler in self.dictEditors) : - print ('editor non trouve') - return + print ('editor non trouve') + return return self.dictEditors[handler].jdc.isValid() # --------------------------------------------- - def fileSaveAs(self,handler,fileName): + def fileSaveAs(self,handler,fileName): # --------------------------------------------- print (handler) if not (handler in self.dictEditors) : - print ('editor non trouve') - return + print ('editor non trouve') + return return self.dictEditors[handler].saveFile(fileName) # --------------------------------------------- - def fileLegerSaveAs(self, handler,fileName): + def fileLegerSaveAs(self, handler,fileName): # --------------------------------------------- # print (handler) if not (handler in self.dictEditors) : - print ('editor non trouve') - return + print ('editor non trouve') + return self.dictEditors[handler].saveFileLegerAs(fileName) - - -# def handleClose(self,doitSauverRecent = 1,texte=tr('&Quitter')): -# if doitSauverRecent : self.appliEficas.sauveRecents() -# index=self.myQtab.currentIndex() -# if index < 0 : return -# res=self.checkDirty(self.dict_editors[index],texte) -# if res == 2 : return 2 # l utilisateur a annule -# index=self.myQtab.currentIndex() -# idx=index -# while idx < len(self.dict_editors) -1 : -# self.dict_editors[idx]=self.dict_editors[idx+1] -# idx = idx + 1 -# del self.dict_editors[len (self.dict_editors) -1] -# try : -# del self.doubles[self.dict_editors[index]] -# except : -# pass -# self.myQtab.removeTab(index) -# return res -# - -# -# def handleCloseAll(self,texte=tr('Quitter')): -# res=0 -# self.appliEficas.sauveRecents() -# while len(self.dict_editors) > 0 : -# self.myQtab.setCurrentIndex(0) -# res=self.handleClose(0,texte) -# if res==2 : return res # l utilsateur a annule -# return res -# -# -# -# def newEditor(self,include=0): -# if self.appliEficas.demande==True : -# self.appliEficas.definitCode(None,None) -# if self.appliEficas.code == None:return -# maPage=self.getEditor(include=include) -# - -# -# def handleViewJdcRegles(self): -# index=self.myQtab.currentIndex() -# if index < 0 : return -# self.dict_editors[index].viewJdcRegles() -# -# def handleGestionParam(self): -# index=self.myQtab.currentIndex() -# if index < 0 : -# QMessageBox.warning( self.appliEficas,tr(u"Creation Parametre indisponible"),tr(u"les parametres sont lies a un jeu de donnees")) -# return -# self.dict_editors[index].gestionParam() -# -# -# -# def saveCurrentEditor(self): -# index=self.myQtab.currentIndex() -# if index < 0 : return -# editor=self.dict_editors[index] -# if editor in self.doubles : -# QMessageBox.warning( -# None, -# tr("Fichier Duplique"), -# tr("Le fichier ne sera pas sauvegarde."),) -# return -# ok, newName = editor.saveFile() -# if ok : -# fileName=os.path.basename(six.text_type(newName)) -# self.myQtab.setTabText(index,fileName) -# return ok -# -# def saveLegerCurrentEditor(self): -# index=self.myQtab.currentIndex() -# if index < 0 : return -# editor=self.dict_editors[index] -# ok, newName = editor.saveFileLeger() -# return ok -# -# def sauveLigneCurrentEditor(self): -# index=self.myQtab.currentIndex() -# if index < 0 : return -# editor=self.dict_editors[index] -# if editor in self.doubles : -# QMessageBox.warning( -# None, -# tr("Fichier Duplique"), -# tr("Le fichier ne sera pas sauvegarde."),) -# return -# ok, newName = editor.sauveLigneFile() -# if ok : -# fileName=os.path.basename(six.text_type(newName)) -# self.myQtab.setTabText(index,fileName) -# return ok -# -# -# def saveAsCurrentEditor(self): -# index=self.myQtab.currentIndex() -# editor=self.dict_editors[index] -# oldName=editor.fichier -# ok,newName = editor.saveFileAs() -# if ok : -# fileName=os.path.basename(six.text_type(newName)) -# self.myQtab.setTabText(index,fileName) -# if editor in self.doubles : -# if oldName != newName : -# del self.doubles[editor] -# return ok -# -# def displayJDC(self,jdc,fn=None): -# """ -# Public slot to display a file in an editor. -# @param fn name of file to be opened -# # insert filename into list of recently opened files -# """ -# titre=None -# if fn != None : titre=fn.split("/")[-1] -# editor = self.getEditor(fichier= fn, jdc = jdc ,include=1) -# self.appliEficas.addToRecentList(editor.getFileName()) -# - -##PNPNPNPN --> a affiner -# if fichier is None: -# self.untitledCount += 1 -# self.myQtab.addTab(win, tr("Fichier non encore nomme ", self.untitledCount)) -# #self.myQtab.addTab(win, str(self.appliEficas.code)) -# else: -# liste=fichier.split('/') -# txt = liste[-1] -# if not QFileInfo(fichier).isWritable(): -# txt = '%s (ro)' % txt -# self.myQtab.addTab(win,txt ) -# self.myQtab.setCurrentWidget(win) -# self.currentEditor=win -# win.setFocus() -# -# def getOpenStartDir(self) : -# #PN --> Les Preferences -# try : -# userDir=os.path.expanduser("~/Eficas_install/") -# return userDir -# except : -# return "" -# -# -# def checkDirty(self, editor,texte): -# """ -# Private method to check dirty status and open a message window. -# -# @param editor editor window to check -# @return flag indicating successful reset of the dirty flag (boolean) -# """ -# res=1 -# if (editor.modified) and (editor in self.doubles) : -# msgBox = QMessageBox(None) -# msgBox.setWindowTitle(tr("Fichier Duplique")) -# msgBox.setText(tr("Le fichier ne sera pas sauvegarde.")) -# msgBox.addButton(texte,0) -# msgBox.addButton(tr("&Annuler"),1) -# res=msgBox.exec_() -# if res == 0 : return 1 -# return 2 -# if editor.modified: -# fn = editor.getFileName() -# if fn is None: fn = tr('Noname') -# msgBox = QMessageBox(None) -# msgBox.setWindowTitle(tr("Fichier Modifie")) -# msgBox.setText(tr("Le fichier ne sera pas sauvegarde.")) -# msgBox.addButton(tr("&Sauvegarder"),1) -# msgBox.addButton(tr("&Quitter sans sauvegarder"),0) -# msgBox.addButton(tr("&Annuler"),2) -# res=msgBox.exec_() -# if res == 2 : return res -# if res == 0: -# (ok, newName) = editor.saveFile() -# if ok: -# fileName=os.path.basename(six.text_type(newName)) -# index=self.myQtab.currentIndex() -# self.myQtab.setTabText(index,fileName) -# return ok -# return res -# -# def handleAjoutGroup(self,listeGroup): -# index=self.myQtab.currentIndex() -# if index < 0 : return -# editor=self.dict_editors[index] -# editor.handleAjoutGroup(listeGroup) diff --git a/editorSsIhm.py b/editorSsIhm.py new file mode 100755 index 00000000..7c12bdda --- /dev/null +++ b/editorSsIhm.py @@ -0,0 +1,1118 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2021 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +from __future__ import absolute_import +from __future__ import print_function +try : + from builtins import str + from builtins import range +except : pass + +import types,sys,os, re +import subprocess +import traceback + + +import traceback + +# Modules Eficas + +import convert, generator +from Editeur import session +from Editeur import comploader +from Editeur import Objecttreeitem + +DictExtensions= {"MAP" : ".map", "TELEMAC" : '.cas'} +debug = False + + + +class JDCEditorSsIhm : +# ------------------- # + """ + Editeur de jdc + """ + +# --------------------------------------------- +# Methodes Communes ou appelees depuis avec Ihm +# --------------------------------------------- + + 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 = appliEficas + self.fichier = 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 + self.dicoNouveauxMC = {} + self.dicoNouveauxFact = {} + self.dict_reels = {} + self.liste_simp_reel = [] + + 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 + + + if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.readercata.demandeCatalogue==True or self.appliEficas.multi==True: + if self.maConfiguration.typeDeCata == 'XML' : + from . import readercataXML as readercata + else : + from . import readercata + self.readercata = readercata.ReaderCata( self, self.appliEficas ) + self.appliEficas.readercata=self.readercata + self.appliEficas.code=self.code + else : + self.readercata=self.appliEficas.readercata + if self.readercata.fichierCata == None : return #Sortie Salome + self.titre=self.readercata.titre + + self.formatFichierOut = self.appliEficas.formatFichierOut + self.formatFichierIn = self.appliEficas.formatFichierIn + + #if self.appliEficas.maConfiguration.dumpXSD==True : self.appliEficas.dumpXsd() + self.dict_reels={} + self.liste_simp_reel=[] + self.dicoNouveauxMC={} + self.dicoNouveauxFact={} + + + try: + self.maConfiguration.generator_module + _module = __import__(self.maConfiguration.generator_module) + info = _module.entryPoint() + generator.plugins.addEntryPoint(info) + except: + pass + + try: + self.maConfiguration.convert_module + #print self.maConfiguration.convert_module + _module = __import__(self.maConfiguration.convert_module) + info = _module.entryPoint() + convert.plugins.addEntryPoint(info) + except : + pass + + 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 + + self.modified = False + self.isReadOnly = False + + #------- construction du jdc -------------- + + + self.nouveau=0 + if self.fichier is not None: # fichier jdc fourni + if jdc==None : + #print ('PNPN : chgt try en if') + try : + #if 1 : + self.jdc = self.readFile(self.fichier) + except : + print ("mauvaise lecture du fichier") + if self.salome : + try : self.appliEficas.addJdcInSalome( self.fichier) + except : print ("mauvais enregistrement dans Salome") + else : + self.jdc=jdc + + if self.jdc is not None and units is not None: + self.jdc.recorded_units=units + self.jdc.old_recorded_units=units + + else: + if not self.jdc: # nouveau jdc + if not include : self.jdc = self._newJDC(units=units) + else : self.jdc = self._newJDCInclude(units=units) + self.nouveau=1 + + if self.jdc: + self.jdc.editor = self + self.jdc.lang = self.appliEficas.langue + self.jdc.aReafficher=False + txt_exception = None + 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 ) + + #-------------------------------# + def readFile(self, fn): + #--------------------------------# + """ + Public slot to read the text from a file. + @param fn filename to read from (string or QString) + """ + + # charge un JDC + # paticularisee avec Ihm + + fn = str(fn) + jdcName=os.path.basename(fn) + + # Il faut convertir le contenu du fichier en fonction du format + 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[formatIn]() + p.readfile(fn) + + if p.text=="" : self.nouveau=1 + #print ('PNPN --> CIST a faire') + + 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.formatFichierIn) + return None + + CONTEXT.unsetCurrentStep() + + #jdc=self.readercata.cata[0].JdC(procedure=text, + jdc=self.readercata.cata.JdC(procedure=text, + appliEficas=self.appliEficas, + cata=self.readercata.cata, + cata_ord_dico=self.readercata.cata_ordonne_dico, + nom=jdcName, + rep_mat=self.maConfiguration.rep_mat + ) + self.modified = False + return jdc + + + #--------------------------------# + def _newJDC( self ,units = None): + #--------------------------------# + """ + Initialise un nouveau JDC vierge + """ + self.modified=1 + CONTEXT.unsetCurrentStep() + + texte="" + if self.code == "CARMELCND" : texte=self._newJDCCND() + if self.code == "ZCRACKS" : texte=self._newZCRACKS() + if self.code == "PSEN" : texte = self._newPSEN() + if self.code == "PSEN_N1" : texte = self._newPSEN_N1() + + if hasattr(self.readercata.cata,'TEXTE_NEW_JDC') : texte=self.readercata.cata.TEXTE_NEW_JDC + + + jdc=self.readercata.cata.JdC( procedure =texte, + appliEficas=self.appliEficas, + cata=self.readercata.cata, + cata_ord_dico=self.readercata.cata_ordonne_dico, + rep_mat=self.maConfiguration.rep_mat + ) + + jdc.lang = self.appliEficas.langue + if units is not None: + jdc.recorded_units=units + jdc.old_recorded_units=units + # 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 ? + jdc.editor=self + return jdc + + #--------------------------------# + def _newJDCInclude( self ,units = None): + #--------------------------------# + """ + Initialise un nouveau JDC vierge + """ + import Extensions.jdc_include + JdC_aux=Extensions.jdc_include.JdC_include + CONTEXT.unsetCurrentStep() + + #jaux=self.readercata.cata[0].JdC( procedure="", + jaux=self.readercata.cata.JdC( procedure="", + 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="", + 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 + J.old_recorded_units=units + return J + + + + #-----------------------# + def getSource(self,file): + #-----------------------# + + # Il faut convertir le contenu du fichier en fonction du format + if self.formatFichierIn in convert.plugins : + # Le convertisseur existe on l'utilise + p=convert.plugins[self.formatFichierIn]() + p.readfile(file) + text=p.convert('execnoparseur') + if not p.cr.estvide(): + self.afficheInfos("Erreur a la conversion",'red') + return text + else: + # 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.formatFichierIn) + return None + + #----------------------------------------------# + def __generateTempFilename(self, prefix, suffix): + #----------------------------------------------# + import tempfile + (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix) + os.close(fd) + return filename + + #-----------------------# + def generDico(self): + #-----------------------# + if 'dico' in generator.plugins: + self.generator=generator.plugins['dico']() + #print (self.generator) + jdc_formate=self.generator.gener(self.jdc) + #print (jdc_formate) + dico=self.generator.Dico + #print (dico) + return dico + + #-----------------------# + def viewJdcSource(self): + #-----------------------# + if self.fichier == None : return + 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.formatFichierOut) ) + self._viewText(strSource, "JDC_RESULTAT") + + #-----------------------# + def viewJdcRapport(self): + #-----------------------# + # on ajoute les regles + strRapport = str( self.jdc.report() ) + self._viewText(strRapport, "JDC_RAPPORT") + + #-----------------------# + def viewJdcRegles(self): + #-----------------------# + # on ajoute les regles + texte_global, test_global = self.jdc.verifRegles() + self._viewText(texte_global, "JDC_REGLES") + + #-----------------------# + def getJdcRapport(self): + #-----------------------# + # on ajoute les regles + strRapport = str( self.jdc.report() ) + return strRapport + + #---------------------# + def getFileName(self): + #---------------------# + return self.fichier + + #-------------------# + def initModif(self): + #-------------------# + """ + Met l'attribut modified a 'o' : utilise par Eficas pour savoir + si un JDC doit etre sauvegarde avant destruction ou non + """ + self.modified = True + + + #--------------------------------------------------# + def writeFile(self, fn, txt = None,formatLigne="beautifie"): + #--------------------------------------------------# + """ + Public slot to write the text to a file. + + @param fn filename to write to string + @return flag indicating success + """ + + fn = str(fn) + + if txt == None : + txt = self.getTextJDC(self.formatFichierOut,formatLigne=formatLigne) + eol = '\n' + if len(txt) >= len(eol): + if txt[-len(eol):] != eol: + txt += eol + else: + txt += eol + txt=self.ajoutVersionCataDsJDC(txt) + if self.code != 'PSEN' and self.code != 'PSEN_N1' : checksum=self.getChecksum(txt) + else : checksum='' + txt=txt+checksum + if self.code=="TELEMAC" : return 1 + try: + f = open(fn, 'w') + f.write(txt) + f.close() + return 1 + except IOError as 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 = 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,appliEficas=self.appliEficas) + if pourRun : jdc_formate=self.generator.textePourRun + if self.code == 'TELEMAC' : jdc_formate=self.generator.texteDico + except ValueError as e: + self.informe( "Erreur a la generation",str(e),'red') + return + + if not self.generator.cr.estvide(): + self.informe("Erreur a la generation","EFICAS ne sait pas convertir ce JDC",'red') + return "" + else: + return jdc_formate + else: + # Il n'existe pas c'est une erreur + self.informe("Format inconnu", self.format + " non reconnu" ) + return "" + + #------------------------------# + def verifieChecksum(self,text): + #------------------------------# + # Attention : souci sous Windows + # + indexDeb=text.find("#CHECKSUM:") + if indexDeb < 0 : return 1, text + indexFin=text.find(":FIN CHECKSUM") + checkAvant=text[indexDeb:indexFin+13] + textJDC=text[0:indexDeb]+text[indexFin+13:-1] + if self.code != 'PSEN' and self.code != 'PSEN_N1': + checksum=self.getChecksum(textJDC) + pareil=(checkAvant==checksum) + else : + pareil=1 + return pareil, textJDC + + #---------------------------# + def getChecksum(self,texte): + #---------------------------# + 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): + #---------------------# + if 'dicoImbrique' in generator.plugins: + self.generator=generator.plugins['dicoImbrique']() + #print (self.generator) + jdc_formate=self.generator.gener(self.jdc) + dico=self.generator.Dico + return dico + else : + self.afficheInfos(tr("Format %s non reconnu" , 'Dictionnaire Imbrique' ),'red') + return "" + + #-----------------------------------------# + def chercheGroupes(self): + #-----------------------------------------# + listeMA,listeNO=self.getTextJDC("GroupMA") + return listeMA,listeNO + + #-----------------------------------------# + def chercheDico(self): + #-----------------------------------------# + dicoCourant={} + format = self.appliEficas.formatFichierOut + if format in generator.plugins: + # Le generateur existe on l'utilise + self.generator=generator.plugins[format]() + jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.maConfiguration) + dicoCourant=self.generator.dico + return dicoCourant + + #-----------------------------------------------------------------# + def saveFileLegerAs(self, fileName = None) : + #-----------------------------------------------------------------# + if fileName != None : + self.fichier = fileName + return self.saveFileLeger(fileName) + return self.saveFileLeger() + + #-----------------------------------------------------------------# + def saveFileComplet(self, fichier = None, formatLigne="beautifie"): + #-----------------------------------------------------------------# + fn = fichier + self.generator=generator.plugins[self.format]() + print (self.generator) + if hasattr(self.generator, "writeComplet"): + self.generator.writeComplet(fichier,self.jdc,config=self.appliEficas.maConfiguration,appliEficas=self.appliEficas) + + +# --------------------------------------------- +# Methodes Surchargees par avecIhm +# --------------------------------------------- + + #--------------------------------# + def ajoutCommentaire(self): + #--------------------------------# + print ('pas programme sans Ihm') + print ('prevenir la maintenance du besoin') + + + #--------------------------------------# + def informe(self,titre,txt,critique=True): + #--------------------------------------# + # methode differenre avec et sans ihm + if critique : print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print (titre) + print (txt) + if critique : print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!') + + #--------------------------------------# + def afficheInfos(self,txt,couleur=None): + #--------------------------------------# + # methode differenre avec et sans ihm + print (txt) + + #-----------------------------------------------------------------------# + def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600): + #--------------------------------------------------------------------# + print ('_____________________________') + print (txt) + print ('_____________________________') + + + #-----------------------------------------------------------------# + def saveFile(self, fichier, formatLigne="beautifie"): + #-----------------------------------------------------------------# + """ + Public slot to save the text to a file. + + @param path directory to save the file in (string or QString) + @return tuple of two values (boolean, string) giving a success indicator and + the name of the saved file + """ + + + self.fichierOut = fichier + if self.appliEficas.maConfiguration.fichierXML !=None : self.jdc.analyseXML() + 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) +# + + #----------------------------------------------# + def sauveLigneFile(self): + #----------------------------------------------# + self.modified=1 + return self.saveFile(formatLigne="Ligne") + + + #-----------------------------------# + def updateJdc(self, itemApres,texte): + #------------------------------------# + # ajoute une etape de JdC a partir d un texte + monItem=itemApres + etape=monItem.item.object + CONTEXT.setCurrentStep(etape) + etape.buildIncludeInclude(texte) + self.tree.racine.buildChildren() + + #-----------------------------------# + def updateJdcEtape(self, itemApres,texte): + #------------------------------------# + # ajoute une etape de JdC a partir d un texte + monItem=itemApres + etape=monItem.item.object + CONTEXT.set_current_step(etape) + try : + ok=etape.build_includeEtape(texte) + except : + ok=0 + if not ok : + QMessageBox.information( self, + tr("Import texte"), + tr("Impossible d importer le texte")) + self.tree.racine.build_children() + return ok + + + + #-------------------------------------# + def deleteEtape(self,etape): + #-------------------------------------# + # dans le JDC + self.jdc.suppentite(etape) + + #-------------------------------------# + def deleteMC(self,etape,MCFils,listeAvant=()): + #-------------------------------------# + # dans le JDC + ouChercher=etape + for mot in listeAvant : + ouChercher=ouChercher.getChild(mot,restreint="oui") + monMC=ouChercher.getChild(MCFils,restreint="oui") + if monMC != None : ouChercher.suppentite(monMC) + ouChercher.state='changed' + ouChercher.isvalid() + + #--------------------------------------------------------# + def ajoutMC(self,etape,MCFils,valeurs,listeAvant=()): + #--------------------------------------------------------# + # dans le JDC + debug=False + if debug : print ('ajoutMC', etape,MCFils,valeurs,listeAvant) + ouChercher=etape + if debug : print (ouChercher) + for mot in listeAvant : + ouChercher=ouChercher.getChild(mot,restreint="oui") + monMC=ouChercher.getChild(MCFils,restreint="oui") + if monMC == None : monMC = ouChercher.addEntite(MCFils) + monMC.valeur=valeurs + monMC.val=valeurs + monMC.state='changed' + monMC.isvalid() + return 1 + + #--------------------------------------------------------# + def ajoutMCinMCFactUnique(self,etape,MCFils,valeurs,listeAvant=()): + # Attention si +sieursMCFACT + #--------------------------------------------------------# + # dans le JDC + debug=False + if debug : print ('ajoutMC', etape,MCFils,valeurs,listeAvant) + ouChercher=etape + if debug : print (ouChercher) + for mot in listeAvant : + ouChercher=ouChercher.getChild(mot,restreint="oui") + # Attention si +sieursMCFACT + ouChercher=ouChercher[0] + if debug : print (ouChercher) + monMC=ouChercher.getChild(MCFils,restreint="oui") + if monMC == None : monMC = ouChercher.addEntite(MCFils) + monMC.valeur=valeurs + monMC.val=valeurs + monMC.state='changed' + monMC.isValid() + return 1 + + #----------------------------------------------# + def ajoutMCFact(self,etape,MCFils,listeAvant=()): + #----------------------------------------------# + # dans le JDC + ouChercher=etape + for mot in listeAvant : + ouChercher=ouChercher.getChild(mot,restreint="oui") + monMC=etape.getChild(ouChercher,restreint="oui") + if monMC== None : monMC= ouChercher.addEntite(MCFils) + monMC.isvalid() + + #-----------------------------------------------------------------# + def setValeurMCSimpInEtape(self,etape,listeAvant,valeur): + #-----------------------------------------------------------------# + # pour VP + monObj=etape + for mot in listeAvant : + monObj=monObj.getChild(mot,restreint="oui") + if monObj==None : return False + if monObj == None : return False + if monObj.valeur != valeur : + # PNPN le setValeur fait des bugs --> pourquoi + #monObj.setValeur(valeur) + monObj.valeur=valeur + monObj.isValid() + return True + + #-------------------------------------------------# + def getValeur(self,nomEtape,MCFils,listeAvant=()): + #-------------------------------------------------# + # dans le JDC + + debug=0 + ouChercher=None + for e in self.jdc.etapes: + if e.nom == nomEtape : ouChercher=e; break + if debug : print ('etape trouvee', ouChercher) + if ouChercher==None : return None + for mot in listeAvant : + ouChercher=ouChercher.getChild(mot,restreint="oui") + if debug : print (mot, ouChercher) + if ouChercher==None : return None + monMC=ouChercher.getChild(MCFils,restreint="oui") + if debug : print ('monMC', monMC) + if monMC== None : return None + return monMC.valeur + + #-------------------------------------------------# + def getMCDsEtape(self,etape,MCFils,listeAvant=()): + #-------------------------------------------------# + # dans le JDC + + if etape==None : return None + ouChercher=etape + debug=0 + for mot in listeAvant : + ouChercher=ouChercher.getChild(mot,restreint="oui") + if debug : print (mot, ouChercher) + if ouChercher==None : return None + monMC=ouChercher.getChild(MCFils,restreint="oui") + if debug : print ('monMC', monMC) + return monMC + + #-----------------------------------------------------------# + def setValeur(self,nomEtape,MCFils,valeur,listeAvant=()): + #--------------------------------------------------------# + # dans le JDC + + ouChercher=None + for e in self.jdc.etapes: + if e.nom == nomEtape : ouChercher=e; break + if ouChercher==None : return None + for mot in listeAvant : + ouChercher=ouChercher.getChild(mot,restreint="oui") + #print (mot, ouChercher) + if ouChercher==None : return None + monMC=ouChercher.getChild(MCFils,restreint="oui") + monMC.set_valeur(valeur) + monMC.isvalid() + + #-----------------------------------------------------------# + def changeIntoMC(self,etape,MCFils,valeurs, listeAvant=()): + #-----------------------------------------------------------# + # dans le JDC + ouChercher=etape + if isinstance (etape, str): + ouChercher=None + for e in self.jdc.etapes: + if e.nom == etape : ouChercher=e; break + if ouChercher==None : return + + for mot in listeAvant : + ouChercher=ouChercher.getChild(mot,restreint="oui") + if ouChercher==None : return + monMC=ouChercher.getChild(MCFils,restreint="oui") + if monMC== None : monMC= ouChercher.addEntite(MCFils) + + monMC.definition.into=valeurs + from Noyau.N_VALIDATOR import IntoProtocol + monMC.definition.intoProto = IntoProtocol("into", into=monMC.definition.into, val_min=monMC.definition.val_min, val_max=monMC.definition.val_max) + monMC.state='changed' + monMC.isvalid() + + #-------------------------------------------------------------------# + def reCalculeValiditeMCApresChgtInto(self,nomEtape,MCFils,listeAvant=()): + #-------------------------------------------------------------------# + # dans le JDC + for e in self.jdc.etapes: + if e.nom == nomEtape : ouChercher=e; break + + for mot in listeAvant : + try : + ouChercher=ouChercher.getChild(mot,restreint="oui") + # Le mot clef n est pas la + except : return 0 + try : + monMC=ouChercher.getChild(MCFils,restreint="oui") + # Le mot clef n est pas la + except : return 0 + if monMC == None : return 0 + + if hasattr(monMC.definition,'into') : + if type(monMC.definition.into) ==types.FunctionType : maListeDeValeur=monMC.definition.into() + else : maListeDeValeur=monMC.definition.into + else : + return 0 + + monMC.state='changed' + return 1 + + def dumpXsd(self, avecEltAbstrait = False): + #-----------------------------------------# + texteXSD = self.readercata.cata.JdC.dumpXsd(avecEltAbstrait) + return texteXSD + + def dumpStructure(self): + #----------------------------# + texteStructure = self.readercata.cata.JdC.dumpStructure() + return texteStructure + + #-------------------------------------# + def changeDefautDefMC(self,nomEtape,listeMC,valeurs): + #-------------------------------------# + # dans le MDD + + #if isinstance (etape, str): + # for e in self.jdc.etapes: + # if e.nom == etape : etape=e; break + #if etape == None : return + definitionEtape=getattr(self.jdc.cata,nomEtape) + #definitionEtape=getattr(self.jdc.cata[0],nomEtape) + ouChercher=definitionEtape + if len(listeMC) > 1 : + + for mc in listeMC[0:-1]: + mcfact=ouChercher.entites[mc] + ouChercher=mcfact + + mcAccas=ouChercher.entites[listeMC[-1]] + mcAccas.defaut=valeurs + return 1 + + #------------------------------------------------# + def changeIntoDefMC(self,etape,listeMC,valeurs): + #------------------------------------------------# + # dans le MDD + #definitionEtape=getattr(self.jdc.cata[0],nomEtape) + #definitionEtape=getattr(self.jdc.cata,nomEtape) + print ( 'changeIntoDefMC ',etape,listeMC,valeurs) + ouChercher=getattr(self.jdc.cata,etape.nom) + + #if len(listeMC) > 1 : + # for mc in listeMC[0:-1]: + # mcfact=ouChercher.entites[mc] + # ouChercher=mcfact + #mcAccas=ouChercher.entites[listeMC[-1]] + + for mc in listeMC : + mcAccas=ouChercher.entites[mc] + ouChercher=mcAccas + if ouChercher == None : return 0 + + if hasattr(mcAccas,'into') : oldValeurs=mcAccas.into + else : oldValeurs=None + + if oldValeurs==valeurs : return 1 + mcAccas.into=valeurs + from Noyau.N_VALIDATOR import IntoProtocol + mcAccas.intoProto = IntoProtocol("into", into=valeurs, val_min=mcAccas.val_min, val_max=mcAccas.val_max) + return 1 + + #-------------------------------------------------------------# + def deleteDefinitionMC(self,etape,listeAvant,nomDuMC): + #-------------------------------------------------------------# + # dans le MDD + #print 'in deleteDefinitionMC', etape,listeAvant,nomDuMC + if isinstance (etape, str): + for e in self.jdc.etapes: + if e.nom == etape : etape=e; break + if etape == None : return + #definitionEtape=getattr(self.jdc.cata[0],etape) + definitionEtape=getattr(self.jdc.cata,etape) + ouChercher=definitionEtape + for k in listeAvant : + ouChercher=ouChercher.entites[k] + MCADetruire=ouChercher.entites[nomDuMC] + ouChercher.ordre_mc.remove(nomDuMC) + print ('remove de ', nomDuMC) + del ouChercher.entites[nomDuMC] + del self.dicoNouveauxMC[nomDuMC] + + + #-------------------------------------------------------------# + def ajoutDefinitionMC(self,nomEtape,listeAvant,nomDuMC,typ,**args): + #-------------------------------------------------------------# + # dans le MDD + #definitionEtape=getattr(self.jdc.cata[0],nomEtape) + definitionEtape=getattr(self.jdc.cata,nomEtape) + ouChercher=definitionEtape + for k in listeAvant : + ouChercher=ouChercher.entites[k] + from Accas import A_SIMP + Nouveau=A_SIMP.SIMP(typ,**args) + Nouveau.pere=ouChercher + Nouveau.nom=nomDuMC + #Nouveau.ordre_mc=[] + ouChercher.entites[nomDuMC]=Nouveau + ouChercher.ordre_mc.append(nomDuMC) + #print ('ajout de ', nomDuMC) + #traceback.print_stack() + # ajout CIST sauvegarde + if nomDuMC in self.dicoNouveauxMC : del self.dicoNouveauxMC[nomDuMC] + self.dicoNouveauxMC[nomDuMC]=('ajoutDefinitionMC',nomEtape,listeAvant,nomDuMC,typ,args) + #print self.dicoNouveauxMC + + #---------------------------------------------------------------------# + def ajoutDefinitionMCFact(self,nomEtape,listeAvant,nomDuMC,listeMC,**args): + #---------------------------------------------------------------------# + # dans le MDD + print ('ajoutDefinitionMCFact', nomDuMC) + #definitionEtape=getattr(self.jdc.cata[0],nomEtape) + definitionEtape=getattr(self.jdc.cata,nomEtape) + ouChercher=definitionEtape + for k in listeAvant : + ouChercher=ouChercher.entites[k] + from Accas import A_SIMP + for mc in listeMC : + nomMC=mc[0] + typMC=mc[1] + argsMC=mc[2] + nouveauMC=A_SIMP.SIMP(typMC,**argsMC) + nouveauMC.nom=nomMC + args[nomMC]=nouveauMC + from Accas import A_FACT + nouveauFact=A_FACT.FACT(**args) + nouveauFact.pere=ouChercher + nouveauFact.nom=nomDuMC + from Editeur.autre_analyse_cata import traite_entite + traite_entite(nouveauFact,[]) + ouChercher.entites[nomDuMC]=nouveauFact + ouChercher.ordre_mc.append(nomDuMC) + self.dicoNouveauxFact[nomDuMC]=('ajoutDefinitionMC',nomEtape,listeAvant,nomDuMC,listeMC,args) + #print self.dicoNouveauxMC + + #----------------------------------------------------# + + #----------------------------------------------------# + def changeIntoMCandSet(self,etape,listeMC,into,valeurs): + #----------------------------------------------------# + # dans le MDD et le JDC + + self.changeIntoDefMC(etape,listeMC,into) + + if isinstance (etape, str): + for e in self.jdc.etapes: + if e.nom == etape : etape=e; break + if etape == None : return + + ouChercher = etape + for mot in listeMC[:-1] : + ouChercher=ouChercher.getChild(mot,restreint="oui") + if ouChercher==None : return + MCFils=listeMC[-1] + monMC=ouChercher.getChild(MCFils,restreint="oui") + if monMC== None : monMC= etape.addEntite(MCFils) + + monMC.definition.into=into + monMC.valeur=valeurs + monMC.val=valeurs + monMC.state='changed' + monMC.isvalid() + + #-------------------------------------# + def ajoutVersionCataDsJDC(self,txt): + #-------------------------------------# + #if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt + if not hasattr(self.readercata.cata,'VERSION_CATALOGUE'): return txt + ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata.VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n" + texte=txt+ligneVersion + return texte + + #-------------------------------------# + def verifieVersionCataDuJDC(self,text): + #-------------------------------------# + memeVersion=False + indexDeb=text.find("#VERSION_CATALOGUE:") + indexFin=text.find(":FIN VERSION_CATALOGUE") + if indexDeb < 0 : + self.versionCataDuJDC="sans" + textJDC=text + else : + self.versionCataDuJDC=text[indexDeb+19:indexFin] + textJDC=text[0:indexDeb]+text[indexFin+23:-1] + + self.versionCata="sans" + if hasattr(self.readercata.cata,'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata.VERSION_CATALOGUE + + if self.versionCata==self.versionCataDuJDC : memeVersion=True + return memeVersion,textJDC + + #-------------------------------# + def traduitCatalogue(self,texte): + #-------------------------------# + nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata + sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur"))) + try : + traducteur=__import__(nomTraducteur) + monTraducteur=traducteur.MonTraducteur(texte) + nouveauTexte=monTraducteur.traduit() + return nouveauTexte + except : + return texte + + +# Methodes a resorber +# il faut mettre a jour les catalogues avec +# TEXTE_NEW_JDC +# + + #---------------------------# + def _new_CF(self): + #---------------------------# + texte="CONDUITE_FORCEE();" + return texte + + #---------------------------# + def _newPSEN(self): + #---------------------------# + texte="DIRECTORY() ; PSSE_PARAMETERS() ; SIMULATION() ; sansnom=DISTRIBUTION() ; sansnom=DISTRIBUTION() ; CORRELATION() ;" + #texte="" + return texte + + #---------------------------# + def _newPSEN_N1(self): + #---------------------------# + texte="CASE_SELECTION();N_PROCESSING_OPTIONS();CONTINGENCY_OPTIONS();CONTINGENCY_SELECTION();\nCONTINGENCY_PROCESSING(); " + #texte="CONTINGENCY_SELECTION();\nCONTINGENCY_PROCESSING(); " + return texte + + #---------------------------# + def _newZCRACKS(self): + #---------------------------# + texte="MAILLAGES();REMESHING();" + return texte + + + #---------------------------# + def _newJDCCND(self): + #---------------------------# + extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)') + + #if self.salome == 0 : + QMessageBox.information( self, + tr("Fichier Med"), + tr("Veuillez selectionner un fichier Med")) + QSfichier = QFileDialog.getOpenFileName(self.appliEficas, + caption='Fichier Med', + filter=extensions) + QSfichier=QSfichier[0] + self.fichierMED=QSfichier + from acquiertGroupes import getGroupes + erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED) + if erreur != "" : print ("a traiter") + texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n" + texteSources="" + texteCond="" + texteNoCond="" + texteVcut="" + texteZs="" + for groupe in self.listeGroupes : + if groupe[0:8]=='CURRENT_': + texteSources +=groupe[8:]+"=SOURCE(" + texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n" + if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n" + if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n" + if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n" + if groupe[0:3]=='ZS_': texteZs +=groupe[3:]+"=ZS();\n" + texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs + self.newTexteCND=texte + self.modified=1 + return texte + + +if __name__ == "__main__": + print ('a faire')