Salome HOME
PN : Enleve Homard pour la v1.7
[tools/eficas.git] / Ihm / I_JDC.py
index b6e3406df78d305cf3775e4c5ac4751f21566170..f7ef14c0db99c29308f79a065213c027cb959240 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -41,14 +42,7 @@ class JDC(I_OBJECT.OBJECT):
       self.fonctions=[]
       self._etape_context=None
       self.recorded_units={}
-
-   def get_cmd(self,nomcmd):
-      """
-          Retourne l'objet de type COMMANDE de nom nomcmd
-      """
-      for cata in self.cata:
-         if hasattr(cata,nomcmd):
-            return getattr(cata,nomcmd)
+      self.old_recorded_units={}
 
    def get_sd_avant_du_bon_type(self,etape,types_permis):
       """
@@ -170,6 +164,10 @@ class JDC(I_OBJECT.OBJECT):
           self.reset_context()
           self.active_etapes()
           return e
+        except AsException,e:
+          self.reset_current_step()
+          self.editmode=0
+          raise AsException("Impossible d ajouter la commande "+name + '\n' +str(e))
         except:
           traceback.print_exc()
           self.reset_current_step()
@@ -189,10 +187,40 @@ class JDC(I_OBJECT.OBJECT):
    def get_sd_avant_etape(self,nom_sd,etape):
       return self.get_contexte_avant(etape).get(nom_sd,None)
 
+   def get_sd_apres_etape_avec_detruire(self,nom_sd,sd,etape,avec='non'):
+      """ 
+           Cette méthode retourne la SD sd de nom nom_sd qui est éventuellement
+           définie apres etape en tenant compte des concepts detruits
+           Si avec vaut 'non' exclut etape de la recherche
+      """
+      ietap=self.etapes.index(etape)
+      if avec == 'non':ietap=ietap+1
+      d={nom_sd:sd}
+      for e in self.etapes[ietap:]:
+         if e.isactif():
+            e.update_context(d)
+            autre_sd=d.get(nom_sd,None)
+            if autre_sd is None:
+              # Le concept a ete detruit
+              return None
+            if autre_sd is not sd :
+              # L'etape produit un concept de meme nom
+              if hasattr(e,'reuse') and e.reuse == autre_sd:
+                 # Le concept etant reutilise, on interrompt la recherche. 
+                 # On considere qu'il n'y a pas de nouveau concept defini
+                 # meme si dans les etapes suivantes le concept est detruit
+                 # et un concept de meme nom créé.
+                 return None
+              else:
+                 # Le concept est produit par l'etape
+                 return autre_sd
+      # On n'a rien trouve. Pas de concept de nom nom_sd
+      return None
+
    def get_sd_apres_etape(self,nom_sd,etape,avec='non'):
       """ 
            Cette méthode retourne la SD de nom nom_sd qui est éventuellement
-            définie apres etape 
+           définie apres etape 
            Si avec vaut 'non' exclut etape de la recherche
       """
       ietap=self.etapes.index(etape)
@@ -208,7 +236,7 @@ class JDC(I_OBJECT.OBJECT):
    def get_sd_autour_etape(self,nom_sd,etape,avec='non'):
       """
            Fonction: retourne la SD de nom nom_sd qui est éventuellement
-            définie avant ou apres etape
+           définie avant ou apres etape
            Permet de vérifier si un concept de meme nom existe dans le périmètre 
            d'une étape
            Si avec vaut 'non' exclut etape de la recherche
@@ -217,43 +245,6 @@ class JDC(I_OBJECT.OBJECT):
       if sd:return sd
       return self.get_sd_apres_etape(nom_sd,etape,avec)
 
-   def get_contexte_avant(self,etape):
-      """
-         Retourne le dictionnaire des concepts connus avant etape
-         On tient compte des commandes qui modifient le contexte
-         comme DETRUIRE ou les macros
-         Si etape == None, on retourne le contexte en fin de JDC
-      """
-      # L'étape courante pour laquelle le contexte a été calculé est
-      # mémorisée dans self.index_etape_courante
-      # XXX on pourrait faire mieux dans le cas PAR_LOT="NON" : en
-      # mémorisant l'étape
-      # courante pendant le processus de construction des étapes.
-      # Si on insère des commandes (par ex, dans EFICAS), il faut préalablement
-      # remettre ce pointeur à 0
-      if etape:
-         index_etape=self.etapes.index(etape)
-      else:
-         index_etape=len(self.etapes)
-      if index_etape >= self.index_etape_courante:
-         # On calcule le contexte en partant du contexte existant
-         d=self.current_context
-         if self.index_etape_courante==0 and self.context_ini:
-            d.update(self.context_ini)
-         liste_etapes=self.etapes[self.index_etape_courante:index_etape]
-      else:
-         d=self.current_context={}
-         if self.context_ini:d.update(self.context_ini)
-         liste_etapes=self.etapes
-
-      for e in liste_etapes:
-         if e is etape:
-            break
-         if e.isactif():
-            e.update_context(d)
-      self.index_etape_courante=index_etape
-      return d
-
    def get_contexte_apres(self,etape):
       """
          Retourne le dictionnaire des concepts connus apres etape
@@ -295,6 +286,8 @@ class JDC(I_OBJECT.OBJECT):
       """  
           Cette methode a pour fonction de supprimer une étape dans 
           un jeu de commandes
+          Retourne 1 si la suppression a pu être effectuée,
+          Retourne 0 dans le cas contraire
       """
       self.init_modif()
       # On memorise le contexte avant l'etape a supprimer
@@ -316,6 +309,7 @@ class JDC(I_OBJECT.OBJECT):
       
       self.reset_context()
       self.fin_modif()
+      return 1
 
    def analyse(self):
       self.compile()
@@ -323,28 +317,6 @@ class JDC(I_OBJECT.OBJECT):
       self.exec_compile()
       self.active_etapes()
 
-   def register(self,etape):
-      """ 
-           Cette méthode ajoute  etape dans la liste
-           des etapes self.etapes et retourne l identificateur d'étape
-           fourni par l appel a g_register
-           A quoi sert editmode ?
-           - Si editmode vaut 1, on est en mode edition de JDC. On cherche 
-           à enregistrer une étape que l'on a créée avec eficas (en passant 
-           par addentite) auquel cas on ne veut récupérer que son numéro 
-           d'enregistrement et c'est addentité qui l'enregistre dans 
-           self.etapes à la bonne place...
-           - Si editmode vaut 0, on est en mode relecture d'un fichier de 
-           commandes et on doit enregistrer l'étape à la fin de self.etapes 
-           (dans ce cas l'ordre des étapes est bien l'ordre chronologique 
-           de leur création   )
-      """
-      if not self.editmode:
-         self.etapes.append(etape)
-      else:
-         pass
-      return self.g_register(etape)
-
    def register_parametre(self,param):
       """
           Cette méthode sert à ajouter un paramètre dans la liste des paramètres
@@ -436,35 +408,6 @@ class JDC(I_OBJECT.OBJECT):
               if l : l_mc.extend(l)
      return l_mc    
 
-   def get_file(self,unite=None,fic_origine=''):
-      """
-          Retourne le nom du fichier correspondant à un numero d'unité
-          logique (entier) ainsi que le source contenu dans le fichier
-      """
-      if self.recorded_units.has_key(unite):
-         return self.recorded_units[unite]
-      elif self.appli :
-         # Si le JDC est relié à une application maitre, on délègue la recherche
-         file,text = self.appli.get_file(unite,fic_origine)
-      else:
-         file = None
-         if unite != None:
-            if os.path.exists("fort."+str(unite)):
-               file= "fort."+str(unite)
-         if file == None :
-            raise AsException("Impossible de trouver le fichier correspondant \
-                               a l unite %s" % unite)
-         if not os.path.exists(file):
-            raise AsException("%s n'est pas un fichier existant" % unite)
-         fproc=open(file,'r')
-         text=fproc.read()
-         fproc.close()
-      if file == None : return None,None
-      text=string.replace(text,'\r\n','\n')
-      linecache.cache[file]=0,0,string.split(text,'\n'),file
-      return file,text
-
-
    def get_genealogie(self):
       """
           Retourne la liste des noms des ascendants de l'objet self
@@ -472,36 +415,6 @@ class JDC(I_OBJECT.OBJECT):
       """
       return []
 
-   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 créé dans le concept global g_context
-      """
-      # XXX En mode editeur dans EFICAS, le nommage doit etre géré différemment
-      # Le dictionnaire g_context ne représente pas le contexte
-      # effectif avant une étape.
-      # Il faut utiliser get_contexte_avant avec indication de l'étape
-      # traitée. 
-      # Cette etape est indiquee par l'attribut _etape_context qui a ete 
-      # positionné préalablement par un appel à 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("Nom de concept deja defini : %s" % 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
-
    def set_etape_context(self,etape):
       """
           Positionne l'etape qui sera utilisee dans NommerSdProd pour
@@ -574,26 +487,15 @@ class JDC(I_OBJECT.OBJECT):
       if fonction not in self.fonctions : self.fonctions.append(fonction)
       self.g_context[fonction.nom]=fonction
 
-   def delete_concept_after_etape(self,etape,sd):
-      """
-          Met à jour les étapes du JDC qui sont après etape en fonction
-          de la disparition du concept sd
-      """
-      index = self.etapes.index(etape)+1
-      if index == len(self.etapes) : 
-         return # etape est la dernière étape du jdc ...on ne fait rien !
-      for child in self.etapes[index:]:
-        child.delete_concept(sd)
-
    def delete_concept(self,sd):
       """
           Inputs :
-             sd=concept detruit
+             sd=concept detruit
           Fonction :
-             Mettre a jour les etapes du JDC suite à la disparition du
-             concept sd
-             Seuls les mots cles simples MCSIMP font un traitement autre
-             que de transmettre aux fils
+          Mettre a jour les etapes du JDC suite à 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)
@@ -615,6 +517,10 @@ class JDC(I_OBJECT.OBJECT):
       for etape in self.etapes :
          print etape.nom+".state: ",etape.state
       
+   def change_unit(self,unit,etape,old_unit):
+      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"""
       if unit is None:
@@ -623,28 +529,76 @@ class JDC(I_OBJECT.OBJECT):
       else:
          self.recorded_units[unit]=(etape.fichier_ini ,etape.fichier_text,etape.recorded_units)
 
-#ATTENTION cette methode surcharge la methode du package Validation : a reintegrer
-   def isvalid(self,cr='non'):
+#ATTENTION SURCHARGE : cette methode doit etre gardée en synchronisation avec celle de Noyau
+   def register(self,etape):
       """
-        Méthode booléenne qui retourne 0 si le JDC est invalide, 1 sinon
+           Cette méthode ajoute  etape dans la liste
+           des etapes self.etapes et retourne l identificateur d'étape
+           fourni par l appel a g_register
+
+           A quoi sert editmode ?
+              - Si editmode vaut 1, on est en mode edition de JDC. On cherche
+                à enregistrer une étape que l'on a créée avec eficas (en passant
+                par addentite) auquel cas on ne veut récupérer que son numéro
+                d'enregistrement et c'est addentité qui l'enregistre dans
+                self.etapes à la bonne place...
+              - Si editmode vaut 0, on est en mode relecture d'un fichier de
+                commandes et on doit enregistrer l'étape à la fin de self.etapes
+                (dans ce cas l'ordre des étapes est bien l'ordre chronologique
+                de leur création   )
+      """
+      if not self.editmode:
+         self.etapes.append(etape)
+      else:
+         pass
+      return self.g_register(etape)
+
+#ATTENTION SURCHARGE : cette methode doit etre gardée 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 créé dans le concept global g_context
       """
-      # FR : on prend en compte l'état du JDC ('unchanged','modified','undetermined')
-      # afin d'accélérer le test de validité du JDC
-      if self.state == 'unchanged':
-        return self.valid
+      # XXX En mode editeur dans EFICAS, le nommage doit etre géré différemment
+      # Le dictionnaire g_context ne représente pas le contexte
+      # effectif avant une étape.
+      # Il faut utiliser get_contexte_avant avec indication de l'étape
+      # traitée.
+      # Cette etape est indiquee par l'attribut _etape_context qui a ete
+      # positionné préalablement par un appel à 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:
-        valid = 1
-        texte,test = self.verif_regles()
-        if test == 0:
-          if cr == 'oui': self.cr.fatal(string.strip(texte))
-          valid = 0
-        if valid :
-          for e in self.etapes:
-            if not e.isactif() : continue
-            if not e.isvalid():
-              valid = 0
-              break
-        self.state="unchanged"
-        self.valid = valid
-        return self.valid
+         o=self.sds_dict.get(sdnom,None)
+
+      if isinstance(o,ASSD):
+         raise AsException("Nom de concept deja defini : %s" % 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
+
+#ATTENTION SURCHARGE : cette methode doit etre gardée en synchronisation avec celle de Noyau
+   def delete_concept_after_etape(self,etape,sd):
+      """
+          Met à jour les étapes du JDC qui sont après etape en fonction
+          de la disparition du concept sd
+      """
+      index = self.etapes.index(etape)+1
+      if index == len(self.etapes) :
+         return # etape est la dernière étape du jdc ...on ne fait rien !
+      for child in self.etapes[index:]:
+        child.delete_concept(sd)
+
+#ATTENTION SURCHARGE : les methodes ci-dessous surchargent des methodes de Noyau et Validation : a reintegrer