+ def get_genealogie_precise(self):
+ return []
+
+ def get_genealogie(self):
+ """
+ Retourne la liste des noms des ascendants de l'objet self
+ jusqu'a la premiere ETAPE parent.
+ """
+ return []
+
+ def get_liste_cmd(self):
+ """
+ Retourne la liste des commandes du catalogue
+ """
+ return self.niveau.definition.get_liste_cmd()
+
+ def get_groups(self):
+ """
+ Retourne la liste des groupes
+ """
+ return self.niveau.definition.liste_groupes,self.niveau.definition.dict_groupes
+
+ def set_etape_context(self,etape):
+ """
+ Positionne l'etape qui sera utilisee dans NommerSdProd pour
+ decider si le concept passe pourra etre nomme
+ """
+ self._etape_context=etape
+
+ def reset_context(self):
+ """
+ Cette methode reinitialise le contexte glissant pour pouvoir
+ tenir compte des modifications de l'utilisateur : craation
+ de commandes, nommage de concepts, etc.
+ """
+ #print "reset_context",self,self.nom
+ self.current_context={}
+ self.index_etape_courante=0
+ ind={}
+ for i,etape in enumerate(self.etapes):
+ ind[etape]=i
+ self.index_etapes=ind
+
+ # for etape in self.etapes:
+ # etape.reset_context()
+
+ def del_sdprod(self,sd):
+ """
+ Supprime la SD sd de la liste des sd et des dictionnaires de contexte
+ """
+ #print "del_sdprod",self,sd
+ #print "del_sdprod",self.sds
+ #print "del_sdprod",self.g_context
+ #print "del_sdprod",self.sds_dict
+ #if sd in self.sds : self.sds.remove(sd)
+ if sd.nom in self.g_context : del self.g_context[sd.nom]
+ if sd.nom in self.sds_dict : del self.sds_dict[sd.nom]
+
+ def del_param(self,param):
+ """
+ Supprime le parametre param de la liste des paramatres
+ et du contexte gobal
+ """
+ if param in self.params : self.params.remove(param)
+ if param.nom in self.g_context : del self.g_context[param.nom]
+
+ def del_fonction(self,fonction):
+ """
+ Supprime la fonction fonction de la liste des fonctions
+ et du contexte gobal
+ """
+ if fonction in self.fonctions : self.fonctions.remove(fonction)
+ if fonction.nom in self.g_context: del self.g_context[fonction.nom]
+
+ def append_sdprod(self,sd):
+ """
+ Ajoute la SD sd a la liste des sd en verifiant au prealable qu'une SD de
+ meme nom n'existe pas deja
+ """
+ if sd == None or sd.nom == None:return
+
+ o=self.sds_dict.get(sd.nom,None)
+ if isinstance(o,ASSD):
+ raise AsException(tr("Nom de concept deja defini "+ sd.nom))
+ self.sds_dict[sd.nom]=sd
+ self.g_context[sd.nom] = sd
+ #if sd not in self.sds : self.sds.append(sd)
+
+ def append_param(self,param):
+ """
+ Ajoute le parametre param a la liste des params
+ et au contexte global
+ """
+ # il faudrait verifier qu'un parametre de meme nom n'existe pas deja !!!
+ if param not in self.params : self.params.append(param)
+ self.g_context[param.nom]=param
+
+ def append_fonction(self,fonction):
+ """
+ Ajoute la fonction fonction a la liste des fonctions
+ et au contexte global
+ """
+ # il faudrait verifier qu'une fonction de meme nom n'existe pas deja !!!
+ if fonction not in self.fonctions : self.fonctions.append(fonction)
+ self.g_context[fonction.nom]=fonction
+
+ def delete_concept(self,sd):
+ """
+ Inputs :
+ - sd=concept detruit
+ Fonction :
+ Mettre a jour les etapes du JDC suite a la disparition du
+ concept sd
+ Seuls les mots cles simples MCSIMP font un traitement autre
+ que de transmettre aux fils
+ """
+ for etape in self.etapes :
+ etape.delete_concept(sd)
+ #PN PN PN pour les matrices ????
+ #self.get_variables_avant(etape)
+
+ def replace_concept_after_etape(self,etape,old_sd,sd):
+ """
+ Met a jour les etapes du JDC qui sont apres etape en fonction
+ du remplacement du concept sd
+ """
+ index = self.etapes.index(etape)+1
+ if index == len(self.etapes) :
+ return # etape est la derniere etape du jdc ...on ne fait rien !
+ for child in self.etapes[index:]:
+ child.replace_concept(old_sd,sd)
+
+ def update_concept_after_etape(self,etape,sd):
+ """
+ Met a jour les etapes du JDC qui sont apres etape en fonction
+ de la modification (principalement nommage) du concept sd
+ """
+ if etape is None:
+ #On traite toutes les etapes
+ index=0
+ else:
+ index = self.etapes.index(etape)+1
+ if index == len(self.etapes) :
+ return # etape est la derniere etape du jdc ...on ne fait rien !
+ for child in self.etapes[index:]:
+ child.update_concept(sd)
+
+ def dump_state(self):
+ print(("JDC.state: ",self.state))
+ for etape in self.etapes :
+ print((etape.nom+".state: ",etape.state))
+
+ def change_unit(self,unit,etape,old_unit):
+ #print "change_unit",unit,etape,old_unit
+ #print id(self.recorded_units),self.recorded_units
+ #if self.recorded_units.has_key(old_unit):del self.recorded_units[old_unit]
+ self.record_unit(unit,etape)
+
+ def record_unit(self,unit,etape):
+ """Enregistre les unites logiques incluses et les infos relatives a l'etape"""
+ #print "record_unit",unit,etape
+ if unit is None:
+ # Cas de POURSUITE
+ self.recorded_units[None]=(etape.fichier_ini ,etape.fichier_text,etape.recorded_units)
+ else:
+ self.recorded_units[unit]=(etape.fichier_ini ,etape.fichier_text,etape.recorded_units)
+ #print id(self.recorded_units),self.recorded_units
+ #print self.recorded_units.get(None,(None,"",{}))[2]
+ #print self.recorded_units.get(None,(None,"",{}))[2].get(None,(None,"",{}))
+
+ def changefichier(self,fichier):
+ self.fin_modif()
+
+ def eval_in_context(self,valeur,etape):
+ """ Tente d'evaluer valeur dans le contexte courant de etape
+ Retourne le parametre valeur inchange si l'evaluation est impossible
+ """
+ #contexte initial du jdc
+ context=self.condition_context.copy()
+ #contexte courant des concepts. Il contient les parametres
+ context.update(self.get_contexte_avant(etape))
+ try :
+ objet = eval(valeur,context)
+ return objet
+ except:
+ #traceback.print_exc()
+ pass
+ return valeur
+
+#ATTENTION SURCHARGE : cette methode doit etre gardee en synchronisation avec celle de Noyau
+ def supprime(self):
+ Noyau.N_JDC.JDC.supprime(self)
+ for etape in self.etapes:
+ etape.supprime()
+ self.appli=None
+ self.g_context={}
+ self.const_context={}
+ self.sds_dict={}
+ self.mc_globaux={}
+ self.current_context={}
+ self.condition_context={}
+ self.etapes_niveaux=[]
+ self.niveau=None
+ self.params=[]
+ self.fonctions=[]
+ self._etape_context=None
+ self.etapes=[]
+
+#ATTENTION SURCHARGE : cette methode doit etre gardee en synchronisation avec celle de Noyau
+ def register(self,etape):
+ """
+ Cette methode ajoute etape dans la liste
+ des etapes self.etapes et retourne l identificateur d'etape
+ fourni par l appel a g_register
+
+ A quoi sert editmode ?
+ - Si editmode vaut 1, on est en mode edition de JDC. On cherche
+ a enregistrer une etape que l'on a creee avec eficas (en passant
+ par addentite) auquel cas on ne veut recuperer que son numero
+ d'enregistrement et c'est addentite qui l'enregistre dans
+ self.etapes a la bonne place...
+ - Si editmode vaut 0, on est en mode relecture d'un fichier de
+ commandes et on doit enregistrer l'etape a la fin de self.etapes
+ (dans ce cas l'ordre des etapes est bien l'ordre chronologique
+ de leur creation )
+ """
+ if not self.editmode:
+ self.etapes.append(etape)
+ self.index_etapes[etape] = len(self.etapes) - 1
+ else:
+ pass
+ return self.g_register(etape)
+
+#ATTENTION SURCHARGE : cette methode doit etre gardee en synchronisation avec celle de Noyau
+ def NommerSdprod(self,sd,sdnom,restrict='non'):
+ """
+ Nomme la SD apres avoir verifie que le nommage est possible :
+ nom non utilise
+ Si le nom est deja utilise, leve une exception
+ Met le concept cree dans le concept global g_context
+ """
+ # XXX En mode editeur dans EFICAS, le nommage doit etre gere differemment
+ # Le dictionnaire g_context ne represente pas le contexte
+ # effectif avant une etape.
+ # Il faut utiliser get_contexte_avant avec indication de l'etape
+ # traitee.
+ # Cette etape est indiquee par l'attribut _etape_context qui a ete
+ # positionne prealablement par un appel a set_etape_context
+
+ if CONTEXT.debug : print(("JDC.NommerSdprod ",sd,sdnom))
+
+ if self._etape_context:
+ o=self.get_contexte_avant(self._etape_context).get(sdnom,None)
+ else:
+ o=self.sds_dict.get(sdnom,None)
+
+ if isinstance(o,ASSD):
+ raise AsException(tr(" Nom de concept deja defini : "+ sdnom))
+
+ # ATTENTION : Il ne faut pas ajouter sd dans sds car il s y trouve deja.
+ # Ajoute a la creation (appel de reg_sd).
+ self.sds_dict[sdnom]=sd
+ sd.nom=sdnom
+
+ # En plus si restrict vaut 'non', on insere le concept dans le contexte du JDC
+ if restrict == 'non':
+ self.g_context[sdnom]=sd
+
+ def delete_concept_entre_etapes(self,index1,index2,sd):
+ if index2 <= index1 :return
+ for child in self.etapes[index1:index2]:
+ child.delete_concept(sd)
+
+ def delete_concept_after_etape(self,etape,sd):
+ """
+ Met a jour les etapes du JDC qui sont apres etape en fonction
+ de la disparition du concept sd
+ """
+ index = self.etapes.index(etape)+1
+ if index == len(self.etapes) :
+ return # etape est la derniere etape du jdc ...on ne fait rien !
+ for child in self.etapes[index:]:
+ child.delete_concept(sd)
+
+#ATTENTION SURCHARGE : les methodes ci-dessus surchargent des methodes de Noyau et Validation : a reintegrer
+