]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
This commit was manufactured by cvs2git to create tag 'V1_3a4'. V1_3a4
authorcvs2git <renaud.nedelec@opencascade.com>
Fri, 13 Sep 2002 16:49:34 +0000 (16:49 +0000)
committercvs2git <renaud.nedelec@opencascade.com>
Fri, 13 Sep 2002 16:49:34 +0000 (16:49 +0000)
Sprout from I26 2002-09-02 17:27:12 UTC eficas 'Version Aster 6.3.14'
Cherrypick from master 2002-09-13 16:49:33 UTC eficas 'CCAR: Modification principale : ajout de la possibilité d'afficher les noms de':
    AIDE/__init__.py
    AIDE/aide_gui.py
    AIDE/aide_objets.py
    AIDE/index_aide.py
    Accas/A_ASSD.py
    Accas/A_AU_MOINS_UN.py
    Accas/A_A_CLASSER.py
    Accas/A_BLOC.py
    Accas/A_ENSEMBLE.py
    Accas/A_ETAPE.py
    Accas/A_EVAL.py
    Accas/A_EXCLUS.py
    Accas/A_FACT.py
    Accas/A_FORM.py
    Accas/A_FORM_ETAPE.py
    Accas/A_JDC.py
    Accas/A_JDC_CATA.py
    Accas/A_MACRO.py
    Accas/A_MACRO_ETAPE.py
    Accas/A_MCBLOC.py
    Accas/A_MCFACT.py
    Accas/A_MCLIST.py
    Accas/A_MCNUPLET.py
    Accas/A_MCSIMP.py
    Accas/A_NUPLET.py
    Accas/A_OPER.py
    Accas/A_PRESENT_ABSENT.py
    Accas/A_PRESENT_PRESENT.py
    Accas/A_PROC.py
    Accas/A_PROC_ETAPE.py
    Accas/A_SIMP.py
    Accas/A_UN_PARMI.py
    Accas/__init__.py
    Aster/Cata/cata_STA6.py
    Aster/INSTALL
    Aster/LICENSE.TERMS
    Aster/README
    Aster/alphasdist.py
    Aster/editeur.ini
    Aster/eficas_aster.py
    Aster/prefs.py
    Aster/sdist.py
    Descartes/cata_descartes.py
    Descartes/cata_descartes_new.py
    Descartes/editeur.ini
    Descartes/eficas_descartes.py
    Descartes/prefs.py
    Editeur/Interp.py
    Editeur/Objecttreeitem.py
    Editeur/__init__.py
    Editeur/analyse_catalogue.py
    Editeur/appli.py
    Editeur/autre_analyse_cata.py
    Editeur/browser.py
    Editeur/bureau.py
    Editeur/catabrowser.py
    Editeur/cataediteur.py
    Editeur/centerwindow.py
    Editeur/compobloc.py
    Editeur/compocomm.py
    Editeur/compocommandecomm.py
    Editeur/compofact.py
    Editeur/compoformule.py
    Editeur/compojdc.py
    Editeur/compomacro.py
    Editeur/compomclist.py
    Editeur/componiveau.py
    Editeur/componuplet.py
    Editeur/compooper.py
    Editeur/compoparam.py
    Editeur/compoparameval.py
    Editeur/compoproc.py
    Editeur/composimp.py
    Editeur/configuration.py
    Editeur/definition_cata.py
    Editeur/eficas.py
    Editeur/eficas_go.py
    Editeur/faq.py
    Editeur/fenetre_mc_inconnus.py
    Editeur/fontes.py
    Editeur/images.py
    Editeur/import_code.py
    Editeur/jdcdisplay.py
    Editeur/menubar.py
    Editeur/options.py
    Editeur/panels.py
    Editeur/readercata.py
    Editeur/splash.py
    Editeur/statusbar.py
    Editeur/toolbar.py
    Editeur/tooltip.py
    Editeur/treeitemincanvas.py
    Editeur/treewidget.py
    Editeur/uiinfo.py
    Editeur/utils.py
    Editeur/widgets.py
    Exemples/README
    Exemples/ex11/main.py
    Exemples/ex18/main.py
    Extensions/__init__.py
    Extensions/commande_comm.py
    Extensions/commentaire.py
    Extensions/etape_niveau.py
    Extensions/interpreteur_formule.py
    Extensions/jdc.py
    Extensions/mcnuplet.py
    Extensions/niveau.py
    Extensions/nuplet.py
    Extensions/parametre.py
    Extensions/parametre_eval.py
    Extensions/pluginloader.py
    Ihm/I_ASSD.py
    Ihm/I_A_CLASSER.py
    Ihm/I_ENTITE.py
    Ihm/I_ETAPE.py
    Ihm/I_EXCLUS.py
    Ihm/I_FONCTION.py
    Ihm/I_FORM_ETAPE.py
    Ihm/I_JDC.py
    Ihm/I_JDC_CATA.py
    Ihm/I_MACRO_ETAPE.py
    Ihm/I_MCBLOC.py
    Ihm/I_MCCOMPO.py
    Ihm/I_MCFACT.py
    Ihm/I_MCLIST.py
    Ihm/I_MCSIMP.py
    Ihm/I_OBJECT.py
    Ihm/I_PRESENT_ABSENT.py
    Ihm/I_PRESENT_PRESENT.py
    Ihm/I_PROC_ETAPE.py
    Ihm/I_REGLE.py
    Ihm/I_UN_PARMI.py
    Ihm/__init__.py
    Installation/Doc_technique_install.doc
    Installation/README
    Installation/README_install
    Installation/install.py
    Minicode/cata_saturne.py
    Minicode/eficas_mini.py
    Minicode/prefs.py
    Noyau/N_MACRO.py
    Noyau/N_OPER.py
    Noyau/N_PROC.py
    Saturne/prefs.py
    Syrthes/cata_syrthes.py
    Syrthes/editeur.ini
    Syrthes/eficas_syrthes.py
    Syrthes/prefs.py
    Tools/__init__.py
    Validation/V_ETAPE.py
    Validation/V_MACRO_ETAPE.py
    convert/Parserv5/Translate.py
    convert/Parserv5/__init__.py
    convert/Parserv5/conv.py
    convert/Parserv5/tables.py
    convert/Parserv5/tables.tag
    convert/__init__.py
    convert/convert_asterv5.py
    convert/convert_ini.py
    convert/convert_pyth.py
    convert/convert_python.py
    convert/parseur_python.py
    generator/Formatage.py
    generator/__init__.py
    generator/generator_aplat.py
    generator/generator_asterv5.py
    generator/generator_ini.py
    generator/generator_pyth.py
    generator/generator_python.py

167 files changed:
AIDE/__init__.py [new file with mode: 0644]
AIDE/aide_gui.py [new file with mode: 0644]
AIDE/aide_objets.py [new file with mode: 0644]
AIDE/index_aide.py [new file with mode: 0644]
Accas/A_ASSD.py [new file with mode: 0644]
Accas/A_AU_MOINS_UN.py
Accas/A_A_CLASSER.py
Accas/A_BLOC.py
Accas/A_ENSEMBLE.py
Accas/A_ETAPE.py
Accas/A_EVAL.py
Accas/A_EXCLUS.py
Accas/A_FACT.py
Accas/A_FORM.py
Accas/A_FORM_ETAPE.py
Accas/A_JDC.py
Accas/A_JDC_CATA.py
Accas/A_MACRO.py
Accas/A_MACRO_ETAPE.py
Accas/A_MCBLOC.py
Accas/A_MCFACT.py
Accas/A_MCLIST.py
Accas/A_MCNUPLET.py
Accas/A_MCSIMP.py
Accas/A_NUPLET.py
Accas/A_OPER.py
Accas/A_PRESENT_ABSENT.py
Accas/A_PRESENT_PRESENT.py
Accas/A_PROC.py
Accas/A_PROC_ETAPE.py
Accas/A_SIMP.py
Accas/A_UN_PARMI.py
Accas/__init__.py
Aster/Cata/cata_STA6.py
Aster/INSTALL [new file with mode: 0644]
Aster/LICENSE.TERMS [new file with mode: 0644]
Aster/README [new file with mode: 0644]
Aster/alphasdist.py [new file with mode: 0644]
Aster/editeur.ini
Aster/eficas_aster.py
Aster/prefs.py
Aster/sdist.py [new file with mode: 0644]
Descartes/cata_descartes.py [new file with mode: 0755]
Descartes/cata_descartes_new.py [new file with mode: 0755]
Descartes/editeur.ini [new file with mode: 0644]
Descartes/eficas_descartes.py [new file with mode: 0755]
Descartes/prefs.py [new file with mode: 0644]
Editeur/Interp.py
Editeur/Objecttreeitem.py
Editeur/__init__.py
Editeur/analyse_catalogue.py
Editeur/appli.py
Editeur/autre_analyse_cata.py [new file with mode: 0644]
Editeur/browser.py
Editeur/bureau.py
Editeur/catabrowser.py
Editeur/cataediteur.py
Editeur/centerwindow.py
Editeur/compobloc.py
Editeur/compocomm.py
Editeur/compocommandecomm.py
Editeur/compofact.py
Editeur/compoformule.py
Editeur/compojdc.py
Editeur/compomacro.py
Editeur/compomclist.py
Editeur/componiveau.py
Editeur/componuplet.py
Editeur/compooper.py
Editeur/compoparam.py
Editeur/compoparameval.py
Editeur/compoproc.py
Editeur/composimp.py
Editeur/configuration.py
Editeur/definition_cata.py
Editeur/eficas.py
Editeur/eficas_go.py
Editeur/faq.py
Editeur/fenetre_mc_inconnus.py
Editeur/fontes.py
Editeur/images.py
Editeur/import_code.py
Editeur/jdcdisplay.py
Editeur/menubar.py
Editeur/options.py
Editeur/panels.py
Editeur/readercata.py
Editeur/splash.py
Editeur/statusbar.py
Editeur/toolbar.py
Editeur/tooltip.py
Editeur/treeitemincanvas.py
Editeur/treewidget.py
Editeur/uiinfo.py [new file with mode: 0644]
Editeur/utils.py
Editeur/widgets.py
Exemples/README
Exemples/ex11/main.py
Exemples/ex18/main.py
Extensions/__init__.py
Extensions/commande_comm.py
Extensions/commentaire.py
Extensions/etape_niveau.py
Extensions/interpreteur_formule.py
Extensions/jdc.py
Extensions/mcnuplet.py
Extensions/niveau.py
Extensions/nuplet.py
Extensions/parametre.py
Extensions/parametre_eval.py
Extensions/pluginloader.py
Ihm/I_ASSD.py [new file with mode: 0644]
Ihm/I_A_CLASSER.py
Ihm/I_ENTITE.py
Ihm/I_ETAPE.py
Ihm/I_EXCLUS.py
Ihm/I_FONCTION.py [new file with mode: 0644]
Ihm/I_FORM_ETAPE.py
Ihm/I_JDC.py
Ihm/I_JDC_CATA.py
Ihm/I_MACRO_ETAPE.py
Ihm/I_MCBLOC.py
Ihm/I_MCCOMPO.py
Ihm/I_MCFACT.py
Ihm/I_MCLIST.py
Ihm/I_MCSIMP.py
Ihm/I_OBJECT.py
Ihm/I_PRESENT_ABSENT.py
Ihm/I_PRESENT_PRESENT.py
Ihm/I_PROC_ETAPE.py
Ihm/I_REGLE.py
Ihm/I_UN_PARMI.py
Ihm/__init__.py
Installation/Doc_technique_install.doc [new file with mode: 0755]
Installation/README [new file with mode: 0755]
Installation/README_install [new file with mode: 0755]
Installation/install.py [new file with mode: 0755]
Minicode/cata_saturne.py
Minicode/eficas_mini.py
Minicode/prefs.py
Noyau/N_MACRO.py
Noyau/N_OPER.py
Noyau/N_PROC.py
Saturne/prefs.py
Syrthes/cata_syrthes.py [new file with mode: 0755]
Syrthes/editeur.ini [new file with mode: 0644]
Syrthes/eficas_syrthes.py [new file with mode: 0755]
Syrthes/prefs.py [new file with mode: 0644]
Tools/__init__.py
convert/Parserv5/Translate.py
convert/Parserv5/__init__.py
convert/Parserv5/conv.py
convert/Parserv5/tables.py
convert/Parserv5/tables.tag
convert/__init__.py
convert/convert_asterv5.py
convert/convert_ini.py
convert/convert_pyth.py
convert/convert_python.py
convert/parseur_python.py
generator/Formatage.py
generator/__init__.py
generator/generator_aplat.py
generator/generator_asterv5.py
generator/generator_ini.py
generator/generator_pyth.py
generator/generator_python.py

diff --git a/AIDE/__init__.py b/AIDE/__init__.py
new file mode 100644 (file)
index 0000000..e4fa459
--- /dev/null
@@ -0,0 +1,12 @@
+import os
+import aide_objets
+import aide_gui
+
+def go(fichier=None,master=None):
+    if not fichier :
+       fichier=os.path.join(os.path.dirname(__file__),"index_aide.py")
+    index = aide_objets.INDEX(fichier)
+    index.build()
+    o = aide_gui.AIDE_GUI(index,master=master)
+    o.build()
+    return o
diff --git a/AIDE/aide_gui.py b/AIDE/aide_gui.py
new file mode 100644 (file)
index 0000000..50aa3ce
--- /dev/null
@@ -0,0 +1,212 @@
+"""
+Ce module génère l'IHM permettant d'accéder à l'aide en ligne d'une application(ex: EFICAS)
+Il analyse l'objet index passé en argument et génére automatiquement en conséquence le menu
+avec liens hyper texte
+"""
+
+from Tkinter import *
+
+class AIDE_GUI:
+   """
+   Classe définissant l'IHM de l'appli d'aide
+   """
+   def __init__(self,objet,master=None):
+      self.objet = objet
+      self.master = master
+      self.init()
+      self.init_window()
+      self.init_frames()
+      self.init_buttons()
+      self.init_text()
+      
+   def init(self):
+      """
+      Initialise les structures de données utlisées par l'objet
+      """
+      self.padx = [0,0,0,0]
+      self.padx[0] = 0
+      self.padx[1] = 30
+      self.padx[2] = 50
+      self.historique = []   
+      
+   def init_window(self):
+      """
+      Initialise la fenêtre mère de l'appli
+      """
+      fenetre = Toplevel()
+      if self.master :
+         self.fenetre = fenetre
+      else:
+         self.fenetre = fenetre.master
+        fenetre.destroy()
+      self.fenetre.title(self.objet.titre)
+      self.fenetre.geometry("700x700+50+50")
+      self.fenetre.resizable(1,1)
+      #self.fenetre.minsize(600,800)
+      #self.fenetre.maxsize(900,800)
+      self.fenetre.protocol("WM_DELETE_WINDOW",self.quit)
+      self.fenetre.update()
+        
+   def init_frames(self):
+      """
+      Initialise les frames principales de l'appli
+      """
+      self.frame1 = Frame(self.fenetre,relief='flat',bd=2)
+      self.frame2 = Frame(self.fenetre,relief='flat',bd=2)
+      self.frame1.grid(row=0,column=0,sticky='news')
+      self.frame2.grid(row=1,column=0,sticky='news')
+      self.fenetre.grid_columnconfigure(0,weight=1,minsize=0)
+      self.fenetre.grid_rowconfigure(1,minsize=30)
+      self.fenetre.grid_rowconfigure(0,weight=1,minsize=0)
+      
+   def init_buttons(self):
+      """
+      Crée les boutons dans le bas de la fenêtre
+      """
+      self.b_retour = Button(self.frame2,text = "Précédent",command=self.go_back)
+      self.b_retour.place(relx=0.33,rely=0.5,anchor='center')
+      Button(self.frame2,text="Fermer",command=self.quit).place(relx=0.66,rely=0.5,anchor='center') 
+      
+
+   def init_text(self):
+      """
+      Construit le widget Text qui accueillera l'index et les fichiers
+      """
+      self.scroll_v = Scrollbar(self.frame1)
+      self.scroll_v.grid(row=0,column=1,rowspan=2,sticky='nesw')
+      self.scroll_h = Scrollbar(self.frame1,orient='horizontal')
+      self.scroll_h.grid(row=1,column=0,rowspan=2,sticky='nesw')
+      self.canvas = Canvas(self.frame1,
+                           bg='white',
+                          relief='sunken',
+                          scrollregion=(0,0,1000,1000),
+                          yscrollcommand=self.scroll_v.set,
+                          xscrollcommand=self.scroll_h.set)
+      self.canvas.grid(row=0,column=0,sticky='nesw')
+      self.scroll_v.configure(command=self.canvas.yview)
+      self.scroll_h.configure(command=self.canvas.xview)
+      self.frame1.grid_columnconfigure(0,weight=1,minsize=0)
+      self.frame1.grid_rowconfigure(0,weight=1,minsize=0)
+      self.frame1.grid_rowconfigure(1,minsize=10)
+      self.frame1.grid_columnconfigure(1,minsize=10)
+
+   def build(self):
+      """
+      Lance la construction dynamique de l'index en hyper texte
+      """
+      self.frame1.update_idletasks()
+      largeur = self.frame1.winfo_width()
+      self.canvas.create_rectangle(0,0,1,1,outline='white')
+      self.y_courant = 0
+      # Construction du titre encadré d'une bordure
+      titre = self.canvas.create_text(int(largeur/2),50,anchor='center',text=self.objet.titre,font="Helvetica 12 bold")
+      bbox = self.canvas.bbox(titre)
+      bordure = self.canvas.create_rectangle(bbox[0]-5,bbox[1]-5,bbox[2]+5,bbox[3]+5,
+                                             outline = 'black',
+                                            fill = 'grey75')
+      self.canvas.lower(bordure)                                    
+      self.y_courant += 100
+      # Construction des items
+      for item in self.objet.l_items :
+          self.build_item(item,0)
+      # Affichage du texte dans le fichier associé (s'il existe)
+      if self.objet.fichier :
+         try:
+           texte=open(self.objet.fichier,'r').read()
+         except:
+            texte="Fichier %s inaccessible" % self.objet.fichier
+        self.canvas.create_text(10,self.y_courant+20,
+                                text=texte,
+                                anchor='nw')
+      # Configuration dynamique des boutons
+      self.config_boutons()
+      #
+      self.canvas.config(scrollregion=self.canvas.bbox('all'))
+      
+   def config_boutons(self):
+      """
+      Activation du bouton précédent s'il y a lieu
+      """
+      if self.historique : 
+         self.b_retour.config(state='normal')
+      else :
+         self.b_retour.config(state='disabled')
+      
+   def build_item(self,item,padx):
+      """
+      Affiche l'item dans le menu décalé de padx
+      """
+      l = Label(self.canvas,
+                text=item.titre,
+               foreground = 'blue',
+               background='white',
+               font="Helvetica 12 bold")
+      l.bind("<Button-1>",lambda e,s=self,o=item : s.update_objet(o))
+      l.bind("<Enter>",lambda e,s=self,o=l : s.select_label(o))
+      l.bind("<Leave>",lambda e,s=self,o=l : s.deselect_label(o))
+      self.canvas.create_window(self.padx[padx],self.y_courant,window=l,anchor='w')
+      self.y_courant += 20
+      for sub_item in item.l_items :
+          self.build_item(sub_item,padx+1)
+      
+   def show_file(self,fichier):
+      """
+      Affiche le fichier passé en argument
+      """
+      print "on veut afficher :",fichier
+
+   def select_label(self,label):
+      """
+      Callback invoqué lorsque le label passé en argument est sélectionné
+      """
+      label.config(fg='white',bg='blue')
+
+   def deselect_label(self,label):
+      """
+      Callback invoqué lorsque le label passé en argument est sélectionné
+      """
+      label.config(bg='white',fg='blue')      
+
+   def go_back(self):
+      """
+      Affiche l'item précédent
+      """
+      self.update_objet(self.historique[-1])
+      self.historique = self.historique[0:-1]
+      # Configuration dynamique des boutons
+      self.config_boutons()
+      
+   def update_objet(self,new_objet):
+      """
+      Cette méthode remplace l'objet courant par new_objet.
+      Elle vide le widget text et affiche le nouvel objet
+      """
+      if not self.historique : 
+         self.historique.append(self.objet)
+      elif new_objet is not self.historique[-1] :
+         self.historique.append(self.objet)
+      self.objet = new_objet 
+      self.canvas.delete('all')
+      self.build()
+                       
+   def quit(self):
+      """
+      Ferme l'appli Aide
+      """
+      self.fenetre.destroy()     
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
+      
diff --git a/AIDE/aide_objets.py b/AIDE/aide_objets.py
new file mode 100644 (file)
index 0000000..e8e923f
--- /dev/null
@@ -0,0 +1,76 @@
+"""
+Ce module génère un objet INDEX par lecture et interprétation du fichier texte
+le décrivant (ex : index_aide.py)
+"""
+
+import os
+
+class ITEM_INDEX :
+   """
+   Construit un objet ITEM_INDEX
+   """
+   def __init__(self,t_item):
+       self.t_item = t_item
+       self.init()
+
+   def init(self):
+       """
+       Initialise les structures de données de l'item
+       """
+       self.titre = ""
+       self.fichier = ""
+       self.l_items = []
+              
+   def build(self):
+       """
+       Construit les sous-items de self s'il y a lieu et retoruve le label et le fichier de l'item
+       dans le tuple
+       """
+       self.titre = self.t_item[0]
+       self.fichier = self.t_item[1]
+       l_items = self.t_item[2]
+       if l_items :
+          for item in l_items :
+            o = ITEM_INDEX(item)
+             o.build()
+             self.l_items.append(o)
+
+class INDEX :
+   """
+   Construit un objet INDEX (non graphique) à partir de l'interprétation du fichier d'index
+   (type index_aide.py) passé en argument
+   """
+   def __init__(self,fichier_index):
+       self.fichier_index = fichier_index
+       self.init()
+       
+   def init(self):
+      """
+      Initialise les structures de données propres à l'index
+      """
+      self.titre = ""
+      self.fichier = None
+      self.l_items = []
+      
+   def build(self):
+      """
+      Lit le fichier index et l'interprète
+      """
+      txt = open(self.fichier_index,'r').read()
+      d = {}
+      d['repertoire']=os.path.dirname(self.fichier_index)
+      #txt = "items ="+txt
+      #print txt
+      exec txt in d
+      items = d.get("items",None)
+      if items :
+        self.titre = items[0]
+        self.fichier = items[1]
+        l_items = items[2]
+        for item in l_items :
+            o = ITEM_INDEX(item)
+           o.build()
+            self.l_items.append(o)
+
+      
+       
diff --git a/AIDE/index_aide.py b/AIDE/index_aide.py
new file mode 100644 (file)
index 0000000..9c04096
--- /dev/null
@@ -0,0 +1,24 @@
+"""
+Contient la description des fichiers d'aide et leur structuration
+
+chaque panneau est un tuple de 3 éléments :
+
+- élément 1 : titre de la page
+- élément 2 : URL du fichier à afficher quand on visualise cette page d'aide ou None si aucun
+- élément 3 : tuple contenant les sous-panneaux de ce panneau (tuple de 3-tuples) ou None si aucun
+
+La variable repertoire est initialisee avec le chemin du repertoire local
+"""
+
+import os
+
+items =("Aide en ligne EFICAS",None,
+            ( 
+               ("FAQs",os.path.join(repertoire,"..","Editeur","faqs.txt"),None),
+               ("Install",os.path.join(repertoire,"..","INSTALL"), 
+                                ( 
+                                   ("Procedure d'installation",os.path.join(repertoire,"..","INSTALL"),None), 
+                                )
+              ),
+            ),
+       )
diff --git a/Accas/A_ASSD.py b/Accas/A_ASSD.py
new file mode 100644 (file)
index 0000000..b9661c4
--- /dev/null
@@ -0,0 +1,49 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
+from Ihm import I_ASSD
+from Ihm import I_FONCTION
+from Noyau import N_ASSD 
+from Noyau import N_GEOM 
+from Noyau import N_FONCTION 
+from Noyau import N_CO 
+
+# On ajoute la classe ASSD dans l'héritage multiple pour recréer 
+# une hiérarchie d'héritage identique à celle de Noyau
+# pour faire en sorte que isinstance(o,ASSD) marche encore après 
+# dérivation
+
+class ASSD(N_ASSD.ASSD,I_ASSD.ASSD):pass
+
+class assd(N_ASSD.assd,I_ASSD.ASSD,ASSD):pass
+
+class FONCTION(N_FONCTION.FONCTION,I_FONCTION.FONCTION,ASSD):
+   def __init__(self,etape=None,sd=None,reg='oui'):
+      N_FONCTION.FONCTION.__init__(self,etape=etape,sd=sd,reg=reg)
+      I_FONCTION.FONCTION.__init__(self,etape=etape,sd=sd,reg=reg)
+
+class fonction(N_FONCTION.fonction,I_FONCTION.fonction,ASSD):
+   def __init__(self,etape=None,sd=None,reg='oui'):
+      N_FONCTION.fonction.__init__(self,etape=etape,sd=sd,reg=reg)
+      I_FONCTION.fonction.__init__(self,etape=etape,sd=sd,reg=reg)
+
+class GEOM(N_GEOM.GEOM,I_ASSD.ASSD,ASSD):pass
+class geom(N_GEOM.geom,I_ASSD.ASSD,ASSD):pass
+class CO(N_CO.CO,I_ASSD.ASSD,ASSD):pass
index d7c525b0214a4c87353944c67160e0c65463e015..eb194670158e9a8066ab93202c23b1a4a1e1ad75 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_REGLE
 from Validation import V_AU_MOINS_UN
 from Ihm import I_REGLE
index c3b32debadf85af1488efc06b89c6561038ad42f..b522b2cdafbbe383d691d0e2ca59eed413d7276c 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_REGLE
 from Validation import V_A_CLASSER
 from Ihm import I_A_CLASSER
index 5b341d6c166916dcf96c76f6c4ebada7711724bc..668c93951a1f510a88fe1b3d9174d9345b3f05e6 100644 (file)
@@ -1,6 +1,29 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_BLOC
 from Ihm import I_ENTITE
 import A_MCBLOC
 
 class BLOC(N_BLOC.BLOC,I_ENTITE.ENTITE):
    class_instance=A_MCBLOC.MCBLOC
+   def __init__(self,*tup,**args):
+      I_ENTITE.ENTITE.__init__(self)
+      N_BLOC.BLOC.__init__(self,*tup,**args)
+
index 6675920ba53680d0389b08589dd2b79e0d1750e7..e9ebac788f0992316e27120c543714d0ee7096e5 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_REGLE
 from Validation import V_ENSEMBLE
 from Ihm import I_REGLE
index cfd20bd9243bece6bbdfedb30ba37df467a9384e..6ba5b7e90678430fbc6291a9d37b43754fcae9ab 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_ETAPE
 from Validation import V_ETAPE
 from Ihm import I_ETAPE
@@ -8,4 +27,3 @@ class ETAPE(I_ETAPE.ETAPE,V_ETAPE.ETAPE,
       # Pas de constructeur pour B_ETAPE.ETAPE
       N_ETAPE.ETAPE.__init__(self,oper,reuse,args)
       V_ETAPE.ETAPE.__init__(self)
-      I_ETAPE.ETAPE.__init__(self)
index dff258a9e2c8ff1312a702566fa42db3ab894749..ab40f1234474868cdd4f12d4cfeafc21328a4a16 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_EVAL 
 
 class EVAL(N_EVAL.EVAL):
index 5473d01a3d7324f2a89a1fffed8dc033f2eec652..5bbf943eb3f5ecd54429fc227111594a4613c21b 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_REGLE
 from Validation import V_EXCLUS
 from Ihm import I_EXCLUS
index d40a9c5974fea0ca0ba38dff32a32ab4046977a1..00da61811734b4823700025293abb793a5aca308 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_FACT
 from Ihm import I_ENTITE
 import A_MCFACT
@@ -6,3 +25,7 @@ import A_MCLIST
 class FACT(N_FACT.FACT,I_ENTITE.ENTITE):
    class_instance=A_MCFACT.MCFACT
    list_instance=A_MCLIST.MCList
+   def __init__(self,*tup,**args):
+      I_ENTITE.ENTITE.__init__(self)
+      N_FACT.FACT.__init__(self,*tup,**args)
+
index 132a24b9f23f32b17f274193962b1470432a9d5e..ea61db3edd728bb25978ed6bad4bcb629cabcaa9 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_FORM
 from Ihm import I_ENTITE
 import A_FORM_ETAPE 
index 9c6483bd8c23af9ecaaf09bcc146c42e3b7de987..af4d7cf0823d3f82d67d72b3cb93118244b79de2 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_FORM_ETAPE
 from Validation import V_MACRO_ETAPE
 from Ihm import I_FORM_ETAPE
index b709e01f1749977bbf373d77bb4199cfba0945a7..9216fe5a8ab8752a8a7c8a17535a1d229bd9eedc 100644 (file)
@@ -1,9 +1,30 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_JDC
 from Validation import V_JDC
 from Extensions import jdc
 from Ihm import I_JDC
 
 class JDC(jdc.JDC,I_JDC.JDC,V_JDC.JDC,N_JDC.JDC):
+   from A_ASSD import CO,assd
+
    def __init__(self,*pos,**args):
       N_JDC.JDC.__init__(self,*pos,**args)
       V_JDC.JDC.__init__(self)
index 0a810dc32c19bbcaa79b602b42ce716a1b22d032..10cf409e136c7a7b4174602a1c2680b55a3cba7a 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_JDC_CATA
 import A_JDC
 from Ihm import I_JDC_CATA
index 311769f814032afc19579fbb8623e27ee5778392..c4e841a224576b9bd3d9a1651ce97bc702a91c90 100644 (file)
@@ -1,6 +1,29 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_MACRO
 from Ihm import I_ENTITE
 import A_MACRO_ETAPE 
 
 class MACRO(N_MACRO.MACRO,I_ENTITE.ENTITE):
    class_instance=A_MACRO_ETAPE.MACRO_ETAPE
+   def __init__(self,*tup,**args):
+      I_ENTITE.ENTITE.__init__(self)
+      N_MACRO.MACRO.__init__(self,*tup,**args)
+
index 29463bd528e730f7bea07ae56609aa93f3b23f51..9613ebb0ec138c0cdbf67e8aac139dca04cd2209 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_MACRO_ETAPE
 from Validation import V_MACRO_ETAPE
 from Ihm import I_MACRO_ETAPE
index 3f931840c7badfb9853846037a2af9ff0d34c32c..963ae8f11fdd0877c88866f5a5c46a9cadfc1110 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_MCBLOC
 from Validation import V_MCBLOC
 from Ihm import I_MCBLOC
index 96d172a676e438f86e740d72c2fe84a491498478..5a1b2a96fba9a32738c48cb975c89b3aabf27c49 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_MCFACT
 from Validation import V_MCFACT
 from Ihm import I_MCFACT
index e3fba40a4369a58f01cb85e5456583d8c5a870da..d2874c59eb3097c852ac6d734063806e4af5d51e 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_MCLIST
 from Validation import V_MCLIST
 from Ihm import I_MCLIST
index 49bfa75bb8f479eea368e37aaacb8bdd99d7f0c4..76258bae5887edaef95a7fd02701428be6978ad7 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Extensions import mcnuplet
 from Ihm import I_MCCOMPO
 
index 35854885c073d14e27c05614ce3aa61a0ba49f79..b517eb65ea6ce23cfebe601664f73c03eb86d56d 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_MCSIMP
 from Validation import V_MCSIMP
 from Ihm import I_MCSIMP
index 1d19c2c0bef082470f9627a1bc84701f8a7b400a..6c1c5f4cdabeb87febb38757715f35ae22757b8c 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 
 from Extensions import nuplet
 import A_MCLIST
index f7c6107bec2f1e47ee3c282fced16a3808dd3ce7..b1076cb8337cb4d477625a4bdb712b1635956222 100644 (file)
@@ -1,6 +1,28 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_OPER
 from Ihm import I_ENTITE
 import A_ETAPE 
 
 class OPER(N_OPER.OPER,I_ENTITE.ENTITE):
    class_instance=A_ETAPE.ETAPE
+   def __init__(self,*tup,**args):
+      I_ENTITE.ENTITE.__init__(self)
+      N_OPER.OPER.__init__(self,*tup,**args)
index ac2b0b3076f670c4e28fd54d45a74eae27c4a874..fc77397c269c4ae29b64518a949175b648fd72d1 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_REGLE
 from Validation import V_PRESENT_ABSENT
 from Ihm import I_PRESENT_ABSENT
index 96f52fd64f2524ca0c76935322d41c645f7acdb7..bb14edfb480c0613f1fc5f081fa518fc5ce15f7c 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_REGLE
 from Validation import V_PRESENT_PRESENT
 from Ihm import I_PRESENT_PRESENT
index d0b56b0718c837e03351a14359ea0ca0c7f9edee..18abbda4b36ff2a0f7208e5f03f1381f491ab68b 100644 (file)
@@ -1,6 +1,29 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_PROC
 from Ihm import I_ENTITE
 import A_PROC_ETAPE 
 
 class PROC(N_PROC.PROC,I_ENTITE.ENTITE):
    class_instance=A_PROC_ETAPE.PROC_ETAPE
+   def __init__(self,*tup,**args):
+      I_ENTITE.ENTITE.__init__(self)
+      N_PROC.PROC.__init__(self,*tup,**args)
+
index 9d7c0f89af0015befefdd1190d6505a124739b54..9f0911ae6202e654c03c8ac94722bdd70b05f331 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_PROC_ETAPE
 from Validation import V_PROC_ETAPE
 from Ihm import I_PROC_ETAPE
@@ -8,4 +27,3 @@ class PROC_ETAPE(I_PROC_ETAPE.PROC_ETAPE,
    def __init__(self,oper=None,args={}):
       N_PROC_ETAPE.PROC_ETAPE.__init__(self,oper=oper,args=args)
       V_PROC_ETAPE.PROC_ETAPE.__init__(self)
-      I_PROC_ETAPE.PROC_ETAPE.__init__(self)
index 3cafb4929cf13444ee1e1e8afdd2105a0812a827..2af12a7fbb9c572dd6a13f08ac8145ceb6b5114d 100644 (file)
@@ -1,6 +1,29 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_SIMP
 from Ihm import I_ENTITE
 import A_MCSIMP
 
 class SIMP(N_SIMP.SIMP,I_ENTITE.ENTITE):
    class_instance=A_MCSIMP.MCSIMP
+   def __init__(self,*tup,**args):
+      I_ENTITE.ENTITE.__init__(self)
+      N_SIMP.SIMP.__init__(self,*tup,**args)
+
index ee7a505832abf024ebd52e2137e6a5318dfd5eb9..55b281d3236aece3367022fff07445ffe6b172f1 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_REGLE
 from Validation import V_UN_PARMI
 from Ihm import I_UN_PARMI
index b61776b384d06485234f3e92f0c22b04bc24552d..f39305316a1b4f8c2fb96c1aa866950dfcd01c77 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
    Ce package contient les classes qui seront effectivement utilisées dans les applications. 
    C'est dans ce package que sont réalisées les combinaisons de classes de base
@@ -39,11 +58,11 @@ from A_EXCLUS import EXCLUS
 from A_ENSEMBLE import ENSEMBLE
 from A_A_CLASSER import A_CLASSER
 
-from Noyau.N_ASSD import ASSD,assd
-from Noyau.N_GEOM import GEOM,geom
-from Noyau.N_FONCTION import FONCTION
-from Noyau.N_FONCTION import fonction
-from Noyau.N_CO import CO
+from A_ASSD import ASSD,assd
+from A_ASSD import GEOM,geom
+from A_ASSD import FONCTION, fonction
+from A_ASSD import CO
+
 from Noyau.N__F import _F
 
 from Noyau.N_Exception import AsException
index 4204f5e08f6e97f14bf68af984cfb23c717743af..82444c0fee7ccb12a80da51174a692db1d12d99e 100755 (executable)
@@ -29,7 +29,7 @@ except:
 
 #
 __version__="$Name:  $"
-__Id__="$Id: cata_aster_v6.py,v 1.12 2001/01/16 15:55:05 iliade Exp $"
+__Id__="$Id: cata_STA6.py,v 1.1.1.2 2002/09/02 17:27:12 eficas Exp $"
 #
 JdC = JDC_CATA(code='ASTER',
                execmodul=None,
@@ -337,6 +337,7 @@ class vect_elem_temp_r(vect_elem):pass
 AFFE_CARA_ELEM=OPER(nom="AFFE_CARA_ELEM",op=  19,sd_prod=cara_elem,
                     fr="Affectation de caractéristiques à des éléments de structure",
                     docu="U4.42.01-g3",reentrant='n',
+                    UIinfo={'groupes':('CACHE',)},
          regles=(AU_MOINS_UN('POUTRE','BARRE','COQUE','CABLE','DISCRET','MASSIF',
                              'ASSE_GRIL','GRILLE','AFFE_SECT','AFFE_FIBRE'),),
          MODELE          =SIMP(statut='o',typ=modele ),
@@ -617,6 +618,7 @@ AFFE_CARA_ELEM=OPER(nom="AFFE_CARA_ELEM",op=  19,sd_prod=cara_elem,
 AFFE_CHAR_ACOU=OPER(nom="AFFE_CHAR_ACOU",op=  68,sd_prod=char_acou,
                     fr="Affectation de charges et conditions aux limites acoustiques constantes",
                     docu="U4.44.04-e",reentrant='n',
+                    UIinfo={'groupes':('CALCUL','ACOU')},
          regles=(AU_MOINS_UN('PRES_IMPO','VITE_FACE','IMPE_FACE','LIAISON_UNIF' ),),
          MODELE          =SIMP(statut='o',typ=modele ),
          VERI_DDL        =SIMP(statut='f',typ='TXM',defaut="OUI",into=("OUI","NON") ),
diff --git a/Aster/INSTALL b/Aster/INSTALL
new file mode 100644 (file)
index 0000000..e3a5d8f
--- /dev/null
@@ -0,0 +1,40 @@
+
+
+1- Installation standard
+
+Pour installer EFICAS a partir de la distribution : <nom_distrib>.tgz
+faire :
+       tar xzvf <nom_distrib>.tgz
+
+ce qui a pour effet de créer un répertoire de nom <nom_distrib>.
+
+Pour modifier l'emplacement de la doc, le chemin d'accès à Acrobat Reader,
+les catalogues, il faut modifier le fichier editeur.ini dans le répertoire Aster.
+
+
+ATTENTION : 
+Si Eficas est installé dans un répertoire particulier d'administration 
+dans lequel les utilisateurs n'ont pas le droit d'écriture, il faut que
+l'administrateur lance Eficas pour générer
+les fichiers et catalogues compilés .pyc et _pickled.py
+
+
+
+2- Utilisation d'Eficas
+
+Pour utiliser Eficas, aller dans le répertoire Aster et faire :
+       python eficas_aster.py
+
+
+
+3- Installation avec un noyau pré-installé
+
+Aller dans le répertoire Aster du répertoire Eficas
+et modifier le fichier prefs.py comme suit :
+Mettre dans la variable CODE_PATH le chemin absolu vers
+le répertoire contenant les deux répertoires Noyau et Validation que vous voulez
+utiliser à la place de ceux fournis dans la livraison d'Eficas
+
+Pour changer les catalogues, modifier le fichier editeur.ini dans le répertoire Aster
+
+
diff --git a/Aster/LICENSE.TERMS b/Aster/LICENSE.TERMS
new file mode 100644 (file)
index 0000000..8c88a1e
--- /dev/null
@@ -0,0 +1,21 @@
+ ======================================================================
+ THIS PROGRAM IS FREE SOFTWARE. YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
+ IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
+ THE FREE SOFTWARE FOUNDATION, EITHER VERSION 2 OF THE LICENSE, AND 
+ ANY LATER VERSION.                   
+ THIS PROGRAM 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 GENERAL PUBLIC LICENSE FOR MORE DETAILS.             
+ ======================================================================
+          TRADUCTION EDF ( POUR INFORMATION )         
+ ======================================================================
+ CE PROGRAMME EST UN LOGICIEL LIBRE. VOUS POUVEZ LE DIFFUSER ET/OU LE  
+ MODIFIER SELON LES DISPOSITIONS DE LA LICENCE GRAND PUBLIC GNU (GPL)  
+ TELLE QU'ELLE EST PUBLIEE PAR LA FREE SOFTWARE FOUNDATION, VERSION 2  
+ DE LA LICENCE ET TOUTE VERSION ULTERIEURE.          
+ CE PROGRAMME EST DIFFUSE AVEC L'ESPOIR QU'IL SERA UTILE, MAIS SANS    
+ GARANTIE, SANS MEME LA GARANTIE IMPLICITE DE QUALIFICATION DE MISE SUR
+ LE MARCHE OU D'ADAPTATION A UNE UTILISATION PARTICULIERE.        
+ VOIR POUR DE PLUS AMPLES DETAILS LA LICENCE GRAND PUBLIC GNU (GPL)    
+ ======================================================================
diff --git a/Aster/README b/Aster/README
new file mode 100644 (file)
index 0000000..0597ecb
--- /dev/null
@@ -0,0 +1,2 @@
+
+Pour installer EFICAS voir dans le fichier INSTALL
diff --git a/Aster/alphasdist.py b/Aster/alphasdist.py
new file mode 100644 (file)
index 0000000..8095a87
--- /dev/null
@@ -0,0 +1,120 @@
+"""
+     Ce module sert à construire les distributions de versions alpha d'EFICAS en fonction
+     du tag CVS courant (Vx_yaz). Une version alpha est une version dont toutes les fonctionnalités
+     ne sont pas implémentées. On utilise pour ces versions, les packages Noyau Validation Cata et Macro
+     locaux.
+     Les distributions sont :
+      - un tar.gz pour UNIX ne contenant pas mxTextTools
+      - un zip pour Windows contenant mx TextTools préinstallé
+     L'utilisation de ce module est la suivante :
+      1- Se mettre dans un répertoire de travail
+      2- Configurer son environnement pour utiliser le référentiel CVS EFICAS
+      3- Exporter les sources d'Eficas par la commande :
+            cvs export -r TAG -d Eficas_export EficasV1_2
+         ou TAG est le tag CVS de la version que l'on veut distribuer (par exemple V1_3a1)
+      4- Aller dans le répertoire Eficas_export
+      4- Executer le script alphasdist.py
+             python alphasdist.py
+         Ce qui a pour effet de creer un repertoire dist contenant les 2 distributions
+         et de les copier dans le répertoire indiqué par dir_download s'il est accessible
+
+"""
+import os,shutil,glob,sys
+import types
+
+version="$Name:  $"[7:-2] or 'Test1_3'
+# ==========Path du noyau local           ====================
+path_Noyau=".."
+# ============================================================
+nom_distrib="Eficas"+version+"AsterSTA6"
+path_distrib=os.path.join("dist",nom_distrib)
+path_TextTools="/home/eficas/pkg/mxTools/egenix2.0.2pourWindows/mx/TextTools"
+dir_download= "/home/eficas/WWW/telechargement/eficas"
+
+def main():
+   if os.path.isdir('dist'):shutil.rmtree('dist')
+
+   copyfiles('.',path_distrib,['LICENSE.TERMS','INSTALL'])
+
+   copyfiles('../Editeur',os.path.join(path_distrib,'Editeur'),['*.py','faqs.txt'])
+   copyfiles('../Ihm',os.path.join(path_distrib,'Ihm'),['*.py'])
+   copyfiles('../Extensions',os.path.join(path_distrib,'Extensions'),['*.py'])
+   copyfiles('../Accas',os.path.join(path_distrib,'Accas'),['*.py'])
+   copyfiles('../Macro',os.path.join(path_distrib,'Macro'),['*.py'])
+   copyfiles('../AIDE',os.path.join(path_distrib,'AIDE'),['*.py'])
+   copyfiles('../AIDE/fichiers',os.path.join(path_distrib,'AIDE/fichiers'),['*'])
+   copyfiles('../Aster',os.path.join(path_distrib,'Aster'),['prefs.py',
+                                                            'editeur.ini',
+                                                            'eficas_aster.py',
+                                                           ])
+   copyfiles('../convert',os.path.join(path_distrib,'convert'),['*.py'])
+   copyfiles('../convert/Parserv5',os.path.join(path_distrib,'convert','Parserv5'),['*.py'])
+
+   copyfiles('../generator',os.path.join(path_distrib,'generator'),['*.py'])
+
+   copyfiles('../Editeur/icons',os.path.join(path_distrib,'Editeur','icons'),['*.gif'])
+
+   copyfiles(os.path.join(path_Noyau,'Noyau'),os.path.join(path_distrib,'Noyau'),['*.py'])
+   copyfiles(os.path.join(path_Noyau,'Validation'),os.path.join(path_distrib,'Validation'),['*.py'])
+   copyfiles('../Aster/Cata',os.path.join(path_distrib,'Aster','Cata'),['*.py',
+                                                                                       ])
+
+   copyfiles('../Tools',os.path.join(path_distrib,'Tools'),['*.py'])
+   copyfiles('../Tools/foztools',os.path.join(path_distrib,'Tools','foztools'),['*.py'])
+   
+   tarball= maketarball('dist',nom_distrib,nom_distrib)
+   try:
+      shutil.copy(tarball,dir_download)
+   except:
+      print "Repertoire de download inconnu : ",dir_download
+
+   try:
+      shutil.copytree(path_TextTools,os.path.join(path_distrib,'Tools','TextTools'))
+   except:
+      print "Impossible de recuperer mxTextTools : ",dir_download
+      sys.exit(1)
+
+   zipfile= makezipfile('dist',nom_distrib,nom_distrib)
+   try:
+      shutil.copy(zipfile,dir_download)
+   except:
+      print "Repertoire de download inconnu : ",dir_download
+
+def make_dir(dir_cible):
+   if type(dir_cible) is not types.StringType:
+      raise "make_dir : dir_cible doit etre une string (%s)" % `dir_cible`
+   head,tail=os.path.split(dir_cible)
+   tails=[tail]
+   while head and tail and not os.path.isdir(head):
+      head,tail=os.path.split(head)
+      tails.insert(0, tail)
+
+   for d in tails:
+      head = os.path.join(head, d)
+      if not os.path.isdir(head):os.mkdir(head)
+
+
+def copyfiles(dir_origin,dir_cible,listfiles):
+   if not os.path.isdir(dir_cible):make_dir(dir_cible)
+   for glob_files in listfiles:
+      for file in glob.glob(os.path.join(dir_origin,glob_files)):
+         shutil.copy(file,dir_cible)
+
+def maketarball(dir_trav,dir_cible,nom_tar):
+   prev=os.getcwd()
+   print prev
+   os.chdir(dir_trav)
+   os.system("tar -cf "+nom_tar+".tar "+dir_cible)
+   os.system("gzip -f9 "+nom_tar+".tar ")
+   os.chdir(prev)
+   return os.path.join(dir_trav,nom_tar+".tar.gz")
+
+def makezipfile(dir_trav,dir_cible,nom_tar):
+   prev=os.getcwd()
+   os.chdir(dir_trav)
+   os.system("zip -rq "+nom_tar+".zip "+dir_cible)
+   os.chdir(prev)
+   return os.path.join(dir_trav,nom_tar+".zip")
+
+main()
+
index e86dc06901b9f0f3199f02b47190d782c403d5c3..c9e1a9e7f551effb1f349b447444c910a7aaba83 100644 (file)
@@ -1,3 +1,23 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
 import os
 
 import prefs
@@ -12,11 +32,14 @@ isdeveloppeur   =       "NON"
 path_cata_dev   =       "/tmp/cata"
 # Répertoire temporaire
 rep_travail     =   "/tmp"
+# Répertoire initial
+initialdir=os.curdir
 
 # Choix des catalogues
 rep_mat="bidon"
 
-catalogues = (('ASTER','v5',os.path.join(rep_cata,'cata_STA5.py'),'asterv5'),
+catalogues = (
+              #('ASTER','v5',os.path.join(rep_cata,'cata_STA5.py'),'asterv5'),
               ('ASTER','v6',os.path.join(rep_cata,'cata_STA6.py'),'python','defaut'),
              )
 
index 2debb64d1a3fb15ec9c28852a860e8db0513a828..ca862a9415587e737c6c870212ef6b260a65743e 100755 (executable)
@@ -1,4 +1,24 @@
 #!/usr/bin/env python
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
 """
     Ce module sert à lancer EFICAS configuré pour Code_Aster
 """
index f3d82ae82ca0c1fd12e7aeb21ce229035306274d..261ee3b2d3db9d67c007c946c2c70c55578466d4 100644 (file)
@@ -1,3 +1,23 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
 import os
 
 # REPINI sert à localiser le fichier editeur.ini
@@ -19,3 +39,50 @@ CODE_PATH = None
 # Par défaut on utilise le répertoire icons dans Editeur
 ICONDIR=os.path.join(INSTALLDIR,'Editeur','icons')
 
+# lang indique la langue utilisée pour les chaines d'aide : fr ou ang
+lang='fr'
+
+labels= ('Fichier','Edition','Jeu de commandes',
+#               'Catalogue','Browsers',
+                'Options',
+                'Aide',
+           )
+
+appli_composants=['readercata','bureau',
+#                  'browser',
+                   'options',
+           ]
+
+menu_defs={ 'bureau': [
+              ('Fichier',[
+                           ('Nouveau','newJDC'),
+                           ('Ouvrir','openJDC'),
+                           ('Enregistrer','saveJDC'),
+                           ('Enregistrer sous','saveasJDC'),
+                           None,
+                           ('Fermer','closeJDC'),
+                           ('Quitter','exitEFICAS'),
+                         ]
+              ),
+              ('Edition',[
+                           ('Copier','copy'),
+                           ('Couper','cut'),
+                           ('Coller','paste'),
+                         ]
+              ),
+              ('Jeu de commandes',[
+                                   ('Rapport de validation','visuCRJDC'),
+           #                        ('Fichier à plat','visu_a_plat'),
+                                   ('Fichier format v6','visuJDC_py'),
+                                   ('Fichier source','visu_txt_brut_JDC'),
+                                   ('Paramètres Eficas','affichage_fichier_ini'),
+                                   ('Mots-clés inconnus','mc_inconnus'),
+                                  ]
+              ),
+              ('Aide',[
+                        ('Aide EFICAS','aideEFICAS'),
+                      ]
+              ),
+             ]
+           }
+
diff --git a/Aster/sdist.py b/Aster/sdist.py
new file mode 100644 (file)
index 0000000..f95b682
--- /dev/null
@@ -0,0 +1,118 @@
+"""
+     Ce module sert à construire les distributions d'EFICAS en fonction
+     du tag CVS courant
+     Les distributions sont :
+      - un tar.gz pour UNIX ne contenant pas mxTextTools
+      - un zip pour Windows contenant mx TextTools préinstallé
+     L'utilisation de ce module est la suivante :
+      1- Se mettre dans un répertoire de travail
+      2- Configurer son environnement pour utiliser le référentiel CVS EFICAS
+      3- Exporter les sources d'EficasV1 par la commande :
+            cvs export -r TAG -d Eficas_export EficasV1
+         ou TAG est le tag CVS de la version que l'on veut distribuer (par exemple V1_1p1)
+      4- Copier le répertoire fourni par Aster (ACCAS6.2.0) au meme niveau que Eficas_export
+      5- Aller dans le répertoire Eficas_export
+      6- Executer le script sdist.py
+             python sdist.py
+         Ce qui a pour effet de creer un repertoire dist contenant les 2 distributions
+         et de les copier dans le répertoire indiqué par dir_download s'il est accessible
+
+"""
+import os,shutil,glob,sys
+import types
+
+version="$Name:  $"[7:-2] or 'Test1_2'
+# ==========Path du noyau fourni par Aster====================
+path_Noyau="../../Accas6.3.0"
+# ============================================================
+nom_distrib="Eficas"+version+"AsterSTA6"
+path_distrib=os.path.join("dist",nom_distrib)
+path_TextTools="/home/eficas/pkg/mxTools/egenix2.0.2pourWindows/mx/TextTools"
+dir_download= "/home/eficas/WWW/telechargement/eficas"
+
+def main():
+   if os.path.isdir('dist'):shutil.rmtree('dist')
+
+   copyfiles('.',path_distrib,['LICENSE.TERMS','INSTALL'])
+
+   copyfiles('../Editeur',os.path.join(path_distrib,'Editeur'),['*.py','faqs.txt'])
+   copyfiles('../Ihm',os.path.join(path_distrib,'Ihm'),['*.py'])
+   copyfiles('../Extensions',os.path.join(path_distrib,'Extensions'),['*.py'])
+   copyfiles('../Accas',os.path.join(path_distrib,'Accas'),['*.py'])
+   copyfiles('../AIDE',os.path.join(path_distrib,'AIDE'),['*.py'])
+   copyfiles('../AIDE/fichiers',os.path.join(path_distrib,'AIDE/fichiers'),['*'])
+   copyfiles('../Aster',os.path.join(path_distrib,'Aster'),['prefs.py',
+                                                            'editeur.ini',
+                                                            'eficas_aster.py',
+                                                           ])
+   copyfiles('../convert',os.path.join(path_distrib,'convert'),['*.py'])
+   copyfiles('../convert/Parserv5',os.path.join(path_distrib,'convert','Parserv5'),['*.py'])
+
+   copyfiles('../generator',os.path.join(path_distrib,'generator'),['*.py'])
+
+   copyfiles('../Editeur/icons',os.path.join(path_distrib,'Editeur','icons'),['*.gif'])
+
+   copyfiles(os.path.join(path_Noyau,'Noyau'),os.path.join(path_distrib,'Noyau'),['*.py'])
+   copyfiles(os.path.join(path_Noyau,'Validation'),os.path.join(path_distrib,'Validation'),['*.py'])
+   copyfiles(os.path.join(path_Noyau,'Cata'),os.path.join(path_distrib,'Aster','Cata'),['*.py',
+                                                                                       ])
+
+   copyfiles('../Tools',os.path.join(path_distrib,'Tools'),['*.py'])
+   copyfiles('../Tools/foztools',os.path.join(path_distrib,'Tools','foztools'),['*.py'])
+   
+   tarball= maketarball('dist',nom_distrib,nom_distrib)
+   try:
+      shutil.copy(tarball,dir_download)
+   except:
+      print "Repertoire de download inconnu : ",dir_download
+
+   try:
+      shutil.copytree(path_TextTools,os.path.join(path_distrib,'Tools','TextTools'))
+   except:
+      print "Impossible de recuperer mxTextTools : ",dir_download
+      sys.exit(1)
+
+   zipfile= makezipfile('dist',nom_distrib,nom_distrib)
+   try:
+      shutil.copy(zipfile,dir_download)
+   except:
+      print "Repertoire de download inconnu : ",dir_download
+
+def make_dir(dir_cible):
+   if type(dir_cible) is not types.StringType:
+      raise "make_dir : dir_cible doit etre une string (%s)" % `dir_cible`
+   head,tail=os.path.split(dir_cible)
+   tails=[tail]
+   while head and tail and not os.path.isdir(head):
+      head,tail=os.path.split(head)
+      tails.insert(0, tail)
+
+   for d in tails:
+      head = os.path.join(head, d)
+      if not os.path.isdir(head):os.mkdir(head)
+
+
+def copyfiles(dir_origin,dir_cible,listfiles):
+   if not os.path.isdir(dir_cible):make_dir(dir_cible)
+   for glob_files in listfiles:
+      for file in glob.glob(os.path.join(dir_origin,glob_files)):
+         shutil.copy(file,dir_cible)
+
+def maketarball(dir_trav,dir_cible,nom_tar):
+   prev=os.getcwd()
+   print prev
+   os.chdir(dir_trav)
+   os.system("tar -cf "+nom_tar+".tar "+dir_cible)
+   os.system("gzip -f9 "+nom_tar+".tar ")
+   os.chdir(prev)
+   return os.path.join(dir_trav,nom_tar+".tar.gz")
+
+def makezipfile(dir_trav,dir_cible,nom_tar):
+   prev=os.getcwd()
+   os.chdir(dir_trav)
+   os.system("zip -rq "+nom_tar+".zip "+dir_cible)
+   os.chdir(prev)
+   return os.path.join(dir_trav,nom_tar+".zip")
+
+main()
+
diff --git a/Descartes/cata_descartes.py b/Descartes/cata_descartes.py
new file mode 100755 (executable)
index 0000000..ae8d16a
--- /dev/null
@@ -0,0 +1,1655 @@
+# debut entete
+
+import Accas
+from Accas import *
+
+JdC = JDC_CATA(code="DESCARTES",
+               execmodul=None
+              )
+
+import string
+
+class TObjet(ASSD):
+  def __init__(self,**args):
+    apply(ASSD.__init__,(self,),args)
+    name=string.ljust(self.__class__.__name__[:12],12)
+
+  def __getitem__(self,attrname):
+    return self.etape[attrname]
+    
+  def db(self):
+    if hasattr(self,'_dbsun'):return self._dbsun
+    else:
+      self._dbsun={'t':1}
+      return self._dbsun
+
+  def putdb(self,o):
+    self._dbsun=o
+
+#
+# Definition des types d'objet qui seront produits par les commandes
+# Il suffit de declarer une classe qui derive de la classe mere TObjet
+# qui derive elle meme de la classe ASSD utilisee dans EFICAS
+#
+class Isotope (TObjet):pass
+class BornesEnergie (TObjet):pass
+class BibliothequeIsotopes (TObjet):pass
+class ChaineFiliation(TObjet) :pass
+class Materiau (TObjet):pass
+class Point (TObjet):pass
+class Vecteur (TObjet):pass
+class Droite (TObjet):pass
+class Segment (TObjet):pass
+class ArcCercle (TObjet):pass
+class Secteur (TObjet):pass
+class Conique (TObjet):pass
+class Triangle (TObjet):pass
+class Rectangle (TObjet):pass
+class Carre (TObjet):pass
+class Hexagone (TObjet):pass
+class Polygone (TObjet):pass
+class Sphere (TObjet):pass
+class BoiteRectangulaire (TObjet):pass
+class BoiteGenerale (TObjet):pass
+class CylindreX (TObjet):pass
+class CylindreY (TObjet):pass
+class CylindreZ (TObjet):pass
+class Cylindre (TObjet):pass
+class Cone (TObjet):pass
+class PrismeHexagonal (TObjet):pass
+class Tore (TObjet):pass
+class Plan (TObjet):pass
+class PlanX (TObjet):pass
+class PlanY (TObjet):pass
+class PlanZ (TObjet):pass
+class Polyedre (TObjet):pass
+class Quadrique (TObjet):pass
+class Cellule(TObjet) :pass
+class Cluster(TObjet):pass
+class Orientation(TObjet):pass
+class FormePositionnee (TObjet):pass
+class GeometrieSurfacique(TObjet):pass
+class GeometrieCombinatoire(TObjet):pass
+class Reseau(TObjet):pass
+class GrilleAssemblage (TObjet):pass
+class PartieInferieureAssemblageCombustible (TObjet):pass
+class PartieSuperieureAssemblageCombustible (TObjet):pass
+class OptionsAutoprotection(TObjet):pass
+class AssemblageType(TObjet):pass
+class AssemblageCombustibleCharge (TObjet):pass
+class ElementBarre (TObjet):pass
+class ElementsGrappeCommande (TObjet):pass
+class ElementsAbsorbantsFixes (TObjet):pass
+class GrappeBouchonAssemblage (TObjet):pass
+#class ElementsAssemblage (TObjet):pass
+class SystemeUnitesMesure (TObjet):pass
+class Vide (TObjet):pass
+class ReflexionIsotrope (TObjet):pass
+class ReflexionSpeculaire (TObjet):pass
+class Albedo (TObjet):pass
+class Translation (TObjet):pass
+class Rotation (TObjet):pass
+class ConditionLimiteSpeciale (TObjet):pass
+class ConditionLimiteGenerale (TObjet):pass
+class CorrespondanceReperePositionReseau (TObjet):pass
+class PositionAssemblageCombustible (TObjet):pass
+class PositionInstrumentationInterne (TObjet):pass
+class PositionGrappesCommande (TObjet):pass
+class StructuresInternesReacteur (TObjet):pass
+class CaracteristiquesPalier (TObjet):pass
+class SiteNucleaire (TObjet):pass
+class EspaceVariations (TObjet):pass
+class DonneesEvolutionIrradiation (TObjet):pass
+class ConditionsFonctionnementMoyennes (TObjet):pass
+#class PlanChargementCoeur (TObjet):pass
+class DateClesCampagne (TObjet):pass
+class OptionsCodes (TObjet):pass
+class DonneesGeneralesEtude (TObjet):pass
+# fin entete
+
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ISOTOPE : Classe de definition d'un isotope
+#                   Caracteristiques elementaires des isotopes ou molecules et liens avec les bibliotheques de donnees nucleaires
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ISOTOPE=OPER(nom="ISOTOPE",sd_prod=Isotope,op=0,
+
+  fr                           = "Definition d'un isotope ou d'une molecule et de ses bibliotheques",
+  ang = "Isotope or Molecule definition and data libraries",
+  Symbole                      = SIMP (typ='TXM',statut='o'),
+  MasseAtomique                = SIMP (typ='R',statut='o',fr="Masse atomique en uma"),
+  NombreDeCharge               = SIMP (typ='I',statut='o',fr="Nombre de charge atomique Z"),
+  NombreDeMasse                = SIMP (typ='I',statut='o',fr="Nombre de masse atomique A"),
+  Type                        = SIMP (typ='TXM',statut='f',into=('Standard','Detecteur','Structure','Poison'),fr="Type de l'isotope"),
+  ConstituantsChimiques        = SIMP (typ='TXM',max='**',statut='f',fr="Symboles des constituants elementaires de la molecule"),
+  NomsBibliotheque             = NUPL ( max      = '**',
+                                         statut   = 'o',
+                                         elements = (  SIMP (typ='TXM',fr="Identificateur Procedure Bibliotheque"),
+                                                       SIMP (typ='TXM',fr="Identifiant de l'isotope dans la bibliotheque"))),
+  NomsBibliothequeAutoprotegee = NUPL ( max      = '**',
+                                         statut   = 'f',
+                                         elements = (  SIMP (typ='TXM',fr="Identificateur Procedure Bibliotheque"),
+                                                       SIMP (typ='TXM',fr="Identifiant Bibliotheque autoprotegee de l'isotope")))
+ ); 
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe BORNES_ENERGIE : Classe de definition des limites en energie d'un maillage multigroupe
+#                   
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+BORNES_ENERGIE=OPER(nom="BORNES_ENERGIE",sd_prod=BornesEnergie,op=0,
+    fr                 = "Definition d une discretisation de l espace energetique",
+    ang                = "Definition of an energy discretisation",
+    NbMacrogroupes     = SIMP (typ='I',statut='o',fr="Nombre de macrogroupes du maillage energetique"),
+    BornesEnergetiques  = SIMP (typ='R',max='**',statut='o',fr="Bornes en energie du maillage energetique"),
+ ); 
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe BIBLIOTHEQUE_ISOTOPES : Classe de definition d'une bibliotheque des donnees nucleaires d'isotopes ou de molecules 
+#                                 Caracteristiques elementaires des isotopes ou molecules
+#                                 et liens avec les bibliotheques de donnees nucleaires
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+BIBLIOTHEQUE_ISOTOPES=OPER(nom="BIBLIOTHEQUE_ISOTOPES",sd_prod=BibliothequeIsotopes,op=0, 
+
+  fr                        = "Definition d une bibliotheque de donnees nucleaires des isotopes",
+  ang = "Definition of an isotopic nuclear data library",
+  Description               = SIMP (typ='TXM',statut='f'),
+  Fichiers                  = FACT (
+      max      = '**',
+      statut   = 'o',
+      SystemeExploitation       = SIMP (typ='TXM',fr="Systeme d'exploitation"),
+      NomFichier                = SIMP (typ='TXM',fr="Nom du fichier"),
+      FormatFichier             = SIMP (typ='TXM',fr="Format du fichier",statut='f'),
+      BornesEnergetiques        = SIMP (typ=BornesEnergie,statut='f',fr="Bornes en eV du maillage en energie"))
+  );
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CHAINE_FILIATION : Classe de definition des filiations isotopiques dues aux transmutations
+#                            sous irradiation neutronique. 
+#                            Description textuelle sous format (APOLLO2, SUNSET ou DARWIN) ou description particuliere Descartes.
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CHAINE_FILIATION = OPER (nom="CHAINE_FILIATION",op=0,sd_prod=ChaineFiliation,
+
+  fr                   = "Definition d'une chaine de filiation isotopique sous irradiation",
+  ang                  = "Definition of a depletion chain",
+  NombreIsotopes       = SIMP (typ='I',statut='o',fr="Nombre d'isotopes decrits dans la chaine"),
+  ChaineAPOLLO2        = SIMP (typ='TXM',statut='f',fr="Description de la chaine sous format APOLLO2"),
+  ChaineSUNSET         = SIMP (typ='TXM',statut='f',fr="Description de la chaine sous format SUNSET"),
+  ChaineDARWIN         = SIMP (typ='TXM',statut='f',fr="Nom du fichier contenant la description DARWIN de la chaine"),
+  Isotopes          = FACT ( max      = '**', statut   = 'f',
+                              Isotope = FACT ( max      = '**', statut   = 'f',
+                                               IsotopePere = SIMP (typ=Isotope,fr="Nom isotope pere",statut='o'),
+                                               TypeReaction = SIMP (typ='TXM',fr="Type de reaction",statut='o'),
+                                               RapportBranchement =  SIMP (typ='R',fr="Rapport de branchement",defaut=1.,statut='f')
+                                             )
+                           )
+ );
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe MATERIAU : Classe de définition d'un matériau à partir de mélange d'isotopes ou de matériaux.
+#                   Définition alternative par donnée des enrichissements
+#                    Caractéristiques fournies a 20 C.
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+MATERIAU=OPER(nom="MATERIAU",op=0,sd_prod=Materiau,
+
+  fr                   = "Definition d'un materiau",
+  ang = "Definition of a mixture",
+  TypeDefinition       = SIMP (typ='TXM',statut='f',defaut="Isotopique",into=("Isotopique","Enrichissement")),
+  BlocIsotopique       = BLOC (condition = "TypeDefinition=='Isotopique'",
+        Type           = SIMP (        statut = 'o',
+                               typ    = 'TXM',
+                               into   = ('Absorbant','Combustible','Melange','ModerateurInterne','ModerateurExterne','Detecteur',
+                                                 'Grille','Gaine','Tube','Poison','PoisonConsommable','AbsorbantIntegre',
+                                                 'Solide','Liquide','Gaz','MateriauVide'),
+                               defaut = 'Combustible'),
+        MethodeMelange = SIMP (statut='o',typ='TXM',into=('Isotopique','Massique','Concentration'),defaut='Massique'),
+        Constituants   = NUPL (        statut   = 'o',
+                               max      = '**',
+                               elements = (SIMP (typ=(Isotope,Materiau)),SIMP (typ='R')),
+                               fr       = "Couples (Isotope ou Materiau) et (Pourcentage ou Cencentration)")
+  ),
+  BlocEnrichissement   = BLOC (condition = "TypeDefinition=='Enrichissement'",
+        Type                 = SIMP (typ='TXM',into=('UO2','MOX','UO2Gadolinium','MOXGadolinium'),statut='o'),
+        EnrichissementU235   = SIMP (typ=('R','TXM'),defaut=3.7,statut='f',fr="Enrichissement % en U235 du combustible"),
+        EnrichissementPu     = SIMP (typ=('R','TXM'),defaut=0.,statut='f',fr="Enrichissement % en plutonium du combustible"),
+        EnrichissementGado   = SIMP (typ=('R','TXM'),defaut=0.,statut='f',fr="Enrichissement % en Gd2O3 du combustible"),
+        VecteurPu            = NUPL (  max='**',statut='f',
+                               elements=(      SIMP (typ=Isotope,fr="Nom isotope du plutonium"), 
+                                               SIMP (typ='R',fr="Pourcentage isotopique"))),
+        DateReference        = SIMP (typ='I',min=3,max=3,statut='f',fr="Date J M A de reference du combustible"),
+        DateDivergence       = SIMP (typ='I',min=3,max=3,statut='f',fr="Date J M A de divergence du reacteur ou ce combustible est charge"),
+        VieillissementJours  = SIMP (  typ    = 'R',
+                               defaut = 0.,
+                               statut = 'f',
+                               fr     = "Nbre de jours de vieillissement du combustible, calculable si on donne DateDivergence")),
+  MasseVolumique       = SIMP (statut='f',typ=('R','I','TXM'),fr="Masse volumique theorique du materiau g/cm3"),
+  TauxEvidement        = SIMP (statut='f',typ=('R','I'),fr="Taux % d'evidement du materiau"),
+  TauxPorosite         = SIMP (statut='f',typ=('R','I'),fr="Taux % de porosite du materiau"),
+  Temperature          = SIMP (statut='f',typ=('R','I','TXM'),fr="Temperature en Celsius du materiau"),
+  GazRemplissage       = SIMP (statut='f',typ=(Isotope,Materiau),defaut='HE4',fr="Gaz de remplissage des evidements du materiau solide"),
+  PressionInitialeGaz  = SIMP (statut='f',typ=('R','I'),defaut=32.,fr="Pression en bars du gaz de remplissage des evidements"),
+  DilatationLineaire   = SIMP (statut='f',typ=('R','I'),fr="Coefficient de dilatation thermique lineaire cm/C du materiau"),
+  Chaine              = SIMP (statut='f',typ=ChaineFiliation,defaut='ChaineSaturee',fr="Chaine de filiation isotopique associee au materiau"),
+  TauxImpuretes = SIMP (statut='f',typ=('R','I'),fr="Taux % d'impuretes")
+ );
+# ==================================================================================================================================
+#                                    Definition des Classes elementaires pour la geometrie
+# ==================================================================================================================================
+#  Classe POINT : Classe de definition d'un point de l'espace
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POINT = OPER (nom="POINT",op=0,sd_prod=Point,
+
+  fr          = "Definition d'un point de l'espace",
+  ang = "Definition of a point in space",
+  Coordonnees = SIMP (typ='R',min=2,max=3,statut='o',fr="Coordonnees du point dans l'espace")
+ );
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe VECTEUR : Classe de definition d'un vecteur dans l'espace
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+VECTEUR = OPER (nom="VECTEUR",op=0,sd_prod=Vecteur,
+
+  fr          = "Definition d'un vecteur dans l'espace",
+  ang = "Definition of a vector in space",
+  regles = (UN_PARMI ('Composantes','Points')),
+  Composantes = SIMP (typ='R',min=2,max=3,statut='f',fr="Composantes du vecteur en 2D ou 3D"),
+  Points      = SIMP (typ=Point,min=2,max=2,statut='f',fr="Vecteur defini par deux points") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DROITE : Classe de definition d'une droite
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DROITE = OPER (nom="DROITE",op=0,sd_prod=Droite,
+
+  fr       = "Definition d'une droite par 2 POINTs, 1 POINT et 1 VECTEUR, ou Equation ax + by + cz + d = 0",
+  ang = "Definition of a straight line with 2 POINTs or with Equation ax + by + cz + d = 0",
+  regles = (UN_PARMI ('Points','Equation','VecteurOrigine')),
+  Points   = SIMP (typ=Point,min=2,max=2,statut='f',fr="Deux points de definition de la droite"),
+  Equation = SIMP (typ='R',min=2,max=4,statut='f',fr="Coefficients successifs abcd de l'equation d'une droite"),
+  VecteurOrigine = FACT (statut='f',
+  Vecteur  = SIMP (typ=Vecteur,statut='f',fr="Donnee du vecteur directeur de la droite"),
+  Origine  = SIMP (typ=Point,statut='f',fr="Donnee d'un point de passage de la droite"))) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe SEGMENT : Classe de definition d'un segment (Idem DROITE + Longueur et Origine)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+SEGMENT = OPER (nom="SEGMENT",op=0,sd_prod=Segment,
+
+  fr       = "Definition d'un segment 2 Points ou Origine + ((Longueur + Equation ax + by + d = 0) ou vecteur)",
+  ang = "Definition of a segment ax + by + cz + d = 0",
+  regles = (UN_PARMI ('Points','Equation','Vecteur')),
+  Points   = SIMP (typ=Point,min=2,max=2,statut='f',fr="Deux points de definition du segment"),
+  Equation = SIMP (typ='R',min=2,max=4,statut='f',fr="Coefficients successifs abcd de l'equation de la droite "),
+  Vecteur  = SIMP (typ=Vecteur,statut='f',fr="Donnee du vecteur directeur du segment"),
+  Longueur = SIMP (typ='R',statut='f',fr="Longueur du segment"),
+  Origine  = SIMP (typ=Point,statut='f',fr="Donnee de l'origine du segment") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ARC_CERCLE : Classe de definition d'un arc de cercle
+#                      Angles donnes en degres 
+#                       Dans le cas 2D on peut positionner l'arc de cercle en donnant l'angle du debut de l'arc par rapport a l'axe Ox
+#                       Dans le cas 3D on donne en plus la hauteur et l'axe directeur de l'arc
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ARC_CERCLE = OPER (nom="ARC_CERCLE",op=0,sd_prod=ArcCercle,
+
+  fr         = "Definition d'un arc de cercle",
+  ang = "Definition of a circular arc",
+  Type       = SIMP (typ='TXM',statut='f',defaut='2D',into=('2D','3D'),fr="Type d'arc 2D ou 3D"),
+  Rayon      = SIMP (typ='R',statut='o',fr="Rayon de l'arc de cercle"),
+  Angles     = SIMP (typ='R',max=2,defaut=(360.,0.),statut='f',fr="Angles en degres de l'arc : Total et Debut"),
+  VecteurAxe = SIMP (typ=Vecteur,statut='f',fr="Vecteur directeur de l'axe de l'arc") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe SECTEUR :     Classe de definition d'un disque ou d'un secteur d'une couronne circulaire
+#                       Angle du secteur donne en degres (360° par defaut)
+#                       Dans le cas 2D on peut positionner le secteur en donnant l'angle du debut de secteur par rapport a l'axe Ox
+#                       Dans le cas 3D on donne en plus la hauteur et l'axe directeur du secteur
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+SECTEUR = OPER (nom="SECTEUR",op=0,sd_prod=Secteur,
+
+  fr         = "Definition d'un disque ou d'un secteur d'une couronne",
+  ang = "Definition of a circular sector",
+  Type       = SIMP (typ='TXM',statut='o',into=('2D','3D'),fr="Type de secteur 2D ou 3D"),
+  Rayons     = SIMP (typ='R',min=2,max=2,statut='o',fr="Rayons interne et externe de la couronne"),
+  Angles     = SIMP (typ='R',max=2,defaut=(360.,0.),statut='f',fr="Angles en degres du secteur"),
+  Hauteur    = SIMP (typ='R',defaut=0.,statut='f',fr="Hauteur du secteur"),
+  VecteurAxe = SIMP (typ=Vecteur,defaut=0.,statut='f',fr="Vecteur directeur de l'axe du secteur") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CONIQUE : Classe de definition d'une conique 2D
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CONIQUE = OPER (nom="CONIQUE",op=0,sd_prod=Conique,
+
+  fr             = "Definition d'une conique 2D ax2+by2+cxy+dx+ey+f=0",
+  ang = "Definition of a quadratic curve 2D",
+  Equation       = SIMP (typ='R',min=2,max=6,statut='o',fr="Coefficients successifs abcdef de l'equation d'une conique"),
+  OrigineVecteur = NUPL (
+      elements = (SIMP (typ=Point),SIMP (typ=Vecteur)),
+      statut   = 'f',
+      fr       = "Donnee de l'origine et du vecteur directeur") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe TRIANGLE : Classe de definition d'un triangle
+#                      Angles donnes en degres par rapport a l'axe Ox horizontal
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+TRIANGLE = OPER (nom="TRIANGLE",op=0,sd_prod=Triangle,
+
+  fr     = "Definition d'un triangle",
+  ang = "Definition of a triangle",
+  regles = (UN_PARMI ('Points','AngleCotes')),
+  Points = SIMP (typ=Point,min=3,max=3,statut='f'),
+  AngleCotes = SIMP (typ='R',min=3,max=3,statut='f',fr="Donnee d'un Angle en degres et Longueurs de deux cotes")
+ );
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe RECTANGLE : Classe de definition d'un rectangle
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RECTANGLE = OPER (nom="RECTANGLE",op=0,sd_prod=Rectangle,
+
+  fr     = "Definition d'un rectangle",
+  ang = "Definition of a rectangle",
+  regles = (UN_PARMI ('Points','Cotes')),
+  Points = SIMP (typ=Point,min=3,max=3,statut='f',fr="Definition du rectangle par trois points"),
+  Cotes  = SIMP (typ='R',min=2,max=2,statut='f',fr="Donnee de la longueur de deux cotes") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CARRE : Classe de definition d'un carre
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CARRE = OPER (nom="CARRE",op=0,sd_prod=Carre,
+
+  fr     = "Definition d'un carre",
+  ang = "Definition of a square",
+  regles = (UN_PARMI ('Points','Cote')),
+  Points = SIMP (typ=Point,min=2,max=2,statut='f',fr="Definition du carre par deux points"),
+  Cote   = SIMP (typ='R',statut='f',fr="Donnee de la longueur du cote du carre")
+ );
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe HEXAGONE : Classe de definition d'un hexagone
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+HEXAGONE = OPER (nom="HEXAGONE",op=0,sd_prod=Hexagone,
+
+  fr    = "Definition d'un hexagone",
+  ang = "Definition of an hexagon",
+  Rayon = SIMP (typ='R',statut='f',fr="Rayon du cercle inscrit dans l'hexagone")
+ );
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe POLYGONE : Classe de definition d'un polygone
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POLYGONE = OPER (nom="POLYGONE",op=0,sd_prod=Polygone,
+
+  fr     = "Definition d'un polygone",
+  ang = "Definition of a polygon",
+  Points = SIMP (typ=Point,max='**',statut='f',fr="Definition d'un polygone par tous ses points")
+ );
+# ==================================================================================================================================
+#            Definition des Classes pour une geometrie 3D : Elements geometriques combinatoires ou surfaciques
+# L'utilisation de certaines classes de combinatoire en surfacique consiste a simplement specifier la position de l'objet
+# ou a eliminer certaines surfaces limites de la classe
+# Pour une sphere : donnee du centre de la sphere
+# Pour un cylindre : Pas de donnee de la hauteur, mais donnee d'un point de l'axe du cylindre
+# ==================================================================================================================================
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe SPHERE : Classe de definition d'une sphere (ou d'une sphere sectorisee ou decoupee en rondelles)
+#                  Des portions de la sphere peuvent etre selectionnees en donnant leurs cotes limites sur un axe de la sphere
+#                  (origine de l'axe au centre de la sphere, donc cotes comprises entre -R, +R si R est le rayon de la sphere)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+SPHERE = OPER (nom="SPHERE",op=0,sd_prod=Sphere,
+
+  fr              = "Definition d'une forme spherique",
+  ang = "Definition of a spherical form",
+  Rayon           = SIMP (typ='R',statut='o',fr="Rayon de la sphere"),
+  Secteur         = SIMP (typ='R',statut='f',fr="Angle du secteur de la sphere"),
+  TranchesAxiales = NUPL (
+      max      = '**',
+      statut   = 'f',
+      fr       = "Limites des tranches axiales de la sphere sectorisee",
+      elements = (SIMP (typ='R',fr="Cote depart de la tranche"),SIMP (typ='R',fr="Cote finale de la tranche"))) ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe BOITE_RECTANGULAIRE : Classe de definition d'une forme parallelepipedique de cotes paralleles aux axes de reference
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+BOITE_RECTANGULAIRE = OPER (nom="BOITE_RECTANGULAIRE",op=0,sd_prod=BoiteRectangulaire,
+
+  fr    = "Definition d'une d'une forme parallelepipedique rectangulaire",
+  ang = "Definition of a rectangular box form",
+  Cotes = SIMP (typ='R',min=3,max=3,statut='o',fr="Longueurs des Cotes de la boite rectangulaire") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe BOITE_GENERALE : Classe de definition d'une forme parallelepipedique quelconque
+#        Le plan de base de la boite doit etre le plan xOy. On donne donc uniquement les 2 vecteurs **normaux**
+#        aux 2 autres plans, et les 3 longueurs des arretes principales.
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+BOITE_GENERALE = OPER (nom="BOITE_GENERALE",op=0,sd_prod=BoiteGenerale,
+
+  fr                 = "Definition d'une forme parallelepipedique quelconque",
+  ang = "Definition of a general box form",
+  VecteursDirecteurs = SIMP (typ=Vecteur,min=2,max=2,statut='o',fr="Vecteurs normaux aux faces non horizontales de la boite"),
+  Cotes              = SIMP (typ='R',min=3,max=3,statut='o',fr="Longueurs des Cotes de la boite") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CYLINDRE_X : Classe de definition d'une forme cylindrique d'axe parallele a Ox
+#         Pour tous les cylindres, la donnee de deux rayons transforme le cylindre circulaire en cylindre elliptique
+#         La donnee d'un angle limite le cylindre a ce secteur
+#         Pour un secteur d'un cylindre elliptique, il est necessaire de donner en plus l'angle de depart du secteur
+#         par rapport a l'axe majeur de l'ellipse
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CYLINDRE_X = OPER (nom="CYLINDRE_X",op=0,sd_prod=CylindreX,
+
+  fr      = "Definition d'une forme cylindrique d'axe parallele a Ox",
+  ang = "Definition of a right cylinder form // Ox",
+  Rayons  = SIMP (typ='R',max=2,statut='o',fr="Rayons mineur et majeur du cylindre X"),
+  Hauteur = SIMP (typ='R',statut='f',fr="Hauteur du cylindre X"),
+  Angles  = SIMP (typ='R',max=2,statut='f',fr="Angles du secteur du cylindre X") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CYLINDRE_Y : Classe de definition d'une forme cylindrique d'axe parallele a Oy
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CYLINDRE_Y = OPER (nom="CYLINDRE_Y",op=0,sd_prod=CylindreY,
+
+  fr      = "Definition d'une forme cylindrique d'axe parallele a Oy",
+  ang = "Definition of a right cylinder form // Oy",
+  Rayons  = SIMP (typ='R',max=2,statut='o',fr="Rayons mineur et majeur du cylindre Y"),
+  Hauteur = SIMP (typ='R',statut='f',fr="Hauteur du cylindre Y"),
+  Angles  = SIMP (typ='R',max=2,statut='f',fr="Angles du secteur du cylindre Y") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CYLINDRE_Z : Classe de definition d'une forme cylindrique d'axe parallele a Oz
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CYLINDRE_Z = OPER (nom="CYLINDRE_Z",op=0,sd_prod=CylindreZ,
+
+  fr      = "Definition d'une forme cylindrique d'axe parallele a Oz",
+  ang = "Definition of a right cylinder form // Oz",
+  Rayons  = SIMP (typ='R',max=2,statut='o',fr="Rayons mineur et majeur du cylindre Z"),
+  Hauteur = SIMP (typ='R',statut='f',fr="Hauteur du cylindre Z"),
+  Angles  = SIMP (typ='R',max=2,statut='f',fr="Angles du secteur du cylindre Z") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CYLINDRE : Classe de definition d'une forme cylindrique quelconque
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CYLINDRE = OPER (nom="CYLINDRE",op=0,sd_prod=Cylindre,
+
+  fr         = "Definition d'une forme cylindrique quelconque",
+  ang = "Definition of a general cylinder form",
+  Rayons     = SIMP (typ='R',max=2,statut='o',fr="Rayons mineur et majeur du cylindre"),
+  VecteurAxe = SIMP (typ=Vecteur,statut='o',fr="Vecteur directeur de l'axe du cylindre"),
+  Hauteur    = SIMP (typ='R',statut='f',fr="Hauteur du cylindre"),
+  Angles     = SIMP (typ='R',max=2,statut='f',fr="Angles du secteur du cylindre") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CONE : Classe de definition d'un forme conique
+#           Une portion de cone peut etre definie en donnant les cotes axiales (origine de l'axe du cone au sommet du cone) de
+#           la zone retenue
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CONE = OPER (nom="CONE",op=0,sd_prod=Cone,
+
+  fr              = "Definition d'une forme conique",
+  ang = "Definition of a conic form",
+  DemiAngleSommet = SIMP (typ='R',statut='o',fr="Demi-angle au sommet"),
+  LimitesAxiales  = SIMP (typ='R',min=2,max=2,statut='f',fr="Limites axiales du cone"),
+  VecteurAxe      = SIMP (typ=Vecteur,statut='o',fr="Vecteur directeur de l'axe du cone") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PRISME_HEXAGONAL : Classe de definition d'une forme de prisme hexagonal 3D
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PRISME_HEXAGONAL = OPER (nom="PRISME_HEXAGONAL",op=0,sd_prod=PrismeHexagonal,
+
+  fr         = "Definition d'une forme de prisme hexagonal 3D",
+  ang = "Definition of a 3D hexagonal form",
+  Rayon      = SIMP (typ='R',statut='o',fr="Rayon du cercle circonscrit (=cote de l'hexagone)"),
+  Hauteur    = SIMP (typ='R',statut='f',fr="Hauteur de l'hexagone"),
+  VecteurAxe = SIMP (typ=Vecteur,statut='o',fr="Vecteur directeur de l'axe de l'hexagone") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe TORE : Classe de definition d'une forme toroidale
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+TORE = OPER (nom="TORE",op=0,sd_prod=Tore,
+
+  fr     = "Definition d'une forme toroidale",
+  ang = "Definition of a toroidal form",
+  Rayons = SIMP (typ='R',min=2,max=2,statut='o',fr="Rayons du tore : 1/2 distance a l'axe et rayon de la section du tore") ) ;
+# ==================================================================================================================================
+#               Definition des Classes pour une geometrie 3D : Elements geometriques surfaciques
+# ==================================================================================================================================
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PLAN : Classe de definition d'un plan
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PLAN = OPER (nom="PLAN",op=0,sd_prod=Plan,
+
+  fr       = "Definition d'un plan ax + by + cz + d = 0",
+  ang = "Definition of a plane surface ax + by + cz + d = 0",
+  Points   = SIMP (typ=Point,min=3,max=3,statut='f',fr="Donnee de 3 points non alignes"),
+  Equation = SIMP (typ='R',min=2,max=4,statut='f',fr="Coefficients successifs abcd de l'equation du plan")
+ );
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PLAN_X : Classe de definition d'un plan perpendiculaire a l'axe Ox
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PLAN_X = OPER (nom="PLAN_X",op=0,sd_prod=PlanX,
+
+  fr   = "Definition d'un plan perpendiculaire a Ox",
+  ang = "Definition of a plane surface perpendicular to Ox",
+  Cote = SIMP (typ='R',statut='o',fr="Cote du plan // OyOz") ) ;
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PLAN_Y : Classe de definition d'un plan perpendiculaire a l'axe Oy
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PLAN_Y = OPER (nom="PLAN_Y",op=0,sd_prod=PlanY,
+
+  fr   = "Definition d'un plan perpendiculaire a Oy",
+  ang = "Definition of a plane surface perpendicular to Oy",
+  Cote = SIMP (typ='R',statut='o',fr="Cote du plan // OxOz") ) ;
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PLAN_Z : Classe de definition d'un plan perpendiculaire a l'axe Oz
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PLAN_Z = OPER (nom="PLAN_Z",op=0,sd_prod=PlanZ,
+
+  fr   = "Definition d'un plan perpendiculaire a Oz",
+  ang = "Definition of a plane surface perpendicular to Oz",
+  Cote = SIMP (typ='R',statut='o',fr="Cote du plan // OxOy") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe POLYEDRE : Classe de definition d'une forme polyhedrique 3D quelconque (N faces, N > 4)
+#                    Definition surfacique : Donnee des N plans et du choix du cote positif ou negatif
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POLYEDRE = OPER (nom="POLYEDRE",op=0,sd_prod=Polyedre,
+
+  fr    = "Definition d'une forme polyhedrique 3D quelconque ",
+  ang = "Definition of a 3D polyhedron form with N > 4 plane faces",
+  Plans = NUPL (
+      min      = 5,
+      max      = '**',
+      statut   = 'o',
+      fr       = "Surfaces planes limites du polyedre",
+      elements = (SIMP (typ=(Plan,PlanX,PlanY,PlanZ),fr="Plans limites du polyedre"),
+                  SIMP (typ='TXM',into=('Plus','Moins'),fr="Choix du cote positif ou negatif de l'espace"))) 
+                ) ;
+
+#     elements = (SIMP (typ=(Plan,PlanX,PlanY,PlanZ),fr="Plans limites du polyedre"),
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe QUADRIQUE : Classe de definition d'une quadrique 3D
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+QUADRIQUE = OPER (nom="QUADRIQUE",op=0,sd_prod=Quadrique,
+
+  fr       = "Definition d'une quadrique 3D ax2+by2+cz2+dxy+eyz+fxz+gx+hy+iz+j=0",
+  ang = "Definition of a quadratic curve 3D ax2+by2+cz2+dxy+eyz+fxz+gx+hy+iz+j=0",
+  Equation = SIMP (typ='R',min=2,max=10,statut='o',fr="Coefficients successifs abcdefghij de l'equation d'une quadrique") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CELLULE : Classe de definition d'une cellule (ensemble elementaire  de regions annulaires et sectorisees)
+#                   Apres la hauteur de la cellule, entree des donnees par listes successives pour l'ensemble des couronnes de la
+#                   cellule, la zone externe etant decrite a part dans l'attribut FormeTechnologique :
+#                   - Liste des materiaux
+#                   - Liste des rayons des couronnes correspondantes
+#                   - Liste des sous-couronnes : - Numero de couronne a discretiser (Numero 1 a partir du centre),
+#                                                 - Nombre de sous-couronnes,
+#                                                 - Mot-cle Equivolumique si decoupage en sections transverses egales,
+#                                                 - Rayons des couronnes intermediaires ou proportions volumiques si mot-cle
+#                                                   Proportions indique anterieurement.
+#                   - Liste des sectorisations :  - Nom de couronne a sectoriser ,
+#                                                 - Nombre de secteurs,
+#                                                 - Mot-cle Equivolumique si decoupage en secteurs egaux et positionnement du premier
+#                                                   secteur par rapport a l'axe x, et pas de changement de composition du secteur,
+#                                                 - Mot-cle alternatif Angle si on veut modifier ou positionner les secteurs dans la
+#                                                   couronne : on donne alors des triplets de donnees pour chaque secteur :
+#                                                               - nom du materiau composant le le secteur,
+#                                                               - position trigonometrique en \260 du debut du secteur
+#                                                               - et angle en \260 du secteur.
+#                                                 Le trace des secteurs sont definis en partant du centre de la couronne.
+#                                                 Pour la sectorisation de la forme externe, deux cas se presentent :
+#                                                       - soit pas de couronnes internes : les secteurs se tracent alors en partant
+#                                                         du centre de la forme externe,
+#                                                       - dans le cas contraire, les secteurs partent du centre des couronnes.
+#                                                 Les secteurs peuvent ne pas couvrir l'ensemble de la couronne.
+#                   Pour la zone peripherique, on doit definir les cotes de la cellule (cas cartesien), son materiau, sa
+#                   discretisation, et le decentrage du centre des couronnes par rapport au centre de ce contour peripherique
+#                   (Coordonnees x,y du centre des couronnes / au centre du contour)
+#                   Pour le moment, limitation a 2D
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CELLULE = OPER (nom="CELLULE",op=0,sd_prod=Cellule,
+
+  fr             = "Definition d'une cellule elementaire d'un assemblage",
+  ang = "Definition of a basic pin cell",
+  Type           = SIMP (typ='TXM',defaut='Combustible',
+                         into=( 'Combustible','BarreGrise','BarreNoire','BarreAcier','BarreAic','BarreB4c',
+                                'Detecteur','Trou','TubeGuide','Postiche','Pyrex','ExPyrex','Gadolinium',
+                                'CellType1','CellType2','CellType3'),statut='o'),
+  HauteurMoyenne = SIMP (typ='R',defaut=1.,statut='o',fr="Hauteur moyenne de la cellule de base"),
+  Couronnes      = FACT (
+      NomsSymboliques = SIMP (typ='TXM',max='**',statut='o',fr="Liste des noms arbitraires des couronnes"),
+      Materiaux       = SIMP (typ=Materiau,max='**',statut='o',fr="Liste des materiaux des couronnes"),
+      Temperatures    = SIMP (typ=('R','I','TXM'),max='**',statut='o',fr="Liste des temperatures des couronnes"),
+      Rayons          = SIMP (typ='R',max='**',statut='o',fr="Liste des rayons des couronnes"),
+      RayonsMineurs   = SIMP (typ='R',max='**',statut='f',fr="Liste des rayons mineurs des couronnes elliptiques"),
+      Hauteurs        = SIMP (typ='R',max='**',statut='f',fr="Liste des hauteurs des couronnes")),
+  SousCouronnes   = FACT (
+      max      = '**',
+      statut   = 'f',
+      NomCouronne              = SIMP (typ='TXM',fr="Nom symbolique de la couronne"),
+      NbSousCouronnes          = SIMP (typ='I',fr="Nombre de sous-couronnes de discretisation"),
+      TypeDiscretisation       = SIMP (typ='TXM',defaut='Equivolumique',into=('Equivolumique','Proportions','Equidistant'),statut='f'),
+      ProportionsVolumiques    = SIMP (typ='R',statut='f',max='**',fr="Proportions volumiques optionnelles des sous-couronnes"),
+      ProfilTemperature        = SIMP (typ='R',max='**',statut='f',fr="Profil de temperature")), 
+  Homogeneisation = FACT (
+      max      = '**',
+      statut   = 'f',
+      NomCouronne      = SIMP (typ='TXM',fr="Nom arbitraire de la couronne homogeneisee"),
+      ListeCouronnes   = SIMP (typ='TXM',max='**',fr="Liste des noms des couronnes jointives a homogeneiser")),
+  Secteurs     = FACT (
+      max      = '**',
+      statut   = 'f',
+      NomCouronne = SIMP (typ='TXM',statut='o',fr="Nom de la couronne ou de la forme externe a sectoriser"),
+      NbSecteurs  = SIMP (typ='I',fr="Nombre de secteurs de la couronne",statut='o'),
+      TypeSectorisation = SIMP (typ='TXM',defaut='Coins',into=('Equivolumique','Angle','Coins','MilieuxCotes'),statut='f'),
+      Sectorisation = FACT (
+              max       = '**',
+              statut    = 'f',
+              Materiaux = SIMP (typ=Materiau,max='**',fr="Materiau des secteurs"),
+              Temperatures = SIMP (typ=('R','I','TXM'),max='**',fr="Temperature des secteurs"),
+              AnglesDepart = SIMP (typ='R',max='**',fr="Angle de depart du secteur"),
+              Angles       = SIMP (typ='R',max='**',fr="Angle du secteur"))),
+  FormeExterne = FACT (
+      NomSymbolique = SIMP (typ='TXM',statut='f'),
+      Type          = SIMP (
+          typ=(ArcCercle,Carre,Rectangle,Hexagone,Triangle,Polygone),
+          statut = 'f',  # la donnee est facultative si la cellule est inserree dans un reseau
+          fr     = "Forme geometrique exterieure"),
+      Materiau      = SIMP (typ=Materiau,fr="Materiau de la forme externe"),
+      Temperature   = SIMP (typ=('R','I','TXM'),fr="Temperature du materiau de la forme externe"),
+      Decentrement  = SIMP (
+          typ    = 'R',
+          min    = 2,
+          max    = 3,
+          defaut = (0.,0.,0.),
+          statut = 'f',
+          fr     = "Coordonnees xyz du centre des couronnes / centre du contour")) ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CLUSTER : Classe de definition d'un cluster de cellules cylindriques de forme exterieure quelconque
+#                   Un cluster est defini comme une superposition centree de cadrans telephoniques (a l'ancienne mode), chaque
+#                   cadran ayant des trous de tailles differentes, l'ensemble etant dispose dans un contour de forme quelconque.
+#                   Possibilites donnees ci-dessous : 
+#                       - Positionnement des couronnes de canaux, chaque canal etant une CELLULE predefinie,
+#                       - Definition du fond du cluster : 
+#                               - Serie de couronnes de materiaux distincts
+#                               - Forme exterieure quelconque
+#                       - Sectorisation eventuelle de la zone peripherique
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CLUSTER = OPER (nom="CLUSTER",op=0,sd_prod=Cluster,
+  fr               = "Definition d'un cluster de cellules cylindriques",
+  ang = "Definition of a cylindrical cell cluster",
+  Hauteur          = SIMP (typ='R',defaut=1.,statut='f',fr="Hauteur du cluster"),
+  Couronnes        = FACT (
+      Cellules = SIMP (typ=Cellule,max='**',fr="Liste des cellules sur chaque cercle"),
+      Rayons   = SIMP (typ='R',max='**',fr="Liste des rayons des couronnes de cellules"),
+      Angles   = SIMP (typ='R',max='**',fr="Liste des pas angulaires de positionnement des cellules cylindriques")),
+  FormeGlobale     = FACT (
+      NomSymbolique        = SIMP (typ='TXM'),
+      RayonsInternes       = SIMP (typ='R',max='**',fr="Liste des rayons des couronnes internes",statut='f'),
+      MateriauxInternes    = SIMP (typ=Materiau,max='**',fr="Materiaux Couronnes internes",statut='f'),
+      TemperaturesInternes = SIMP (typ=('R','I','TXM'),max='**',fr="Temperatures des materiaux internes",statut='f'),
+      FormeExterne         = SIMP (
+          typ    = (ArcCercle,Carre,Rectangle,Hexagone,Triangle,Polygone),
+          statut = 'o',
+          fr     = "Forme geometrique exterieure"),
+      MateriauExterne      = SIMP (typ=Materiau,fr="Materiau de la forme externe",statut='o'),
+      TemperatureExterne   = SIMP (typ=('R','I','TXM'),max='**',fr="Temperature du materiau externe",statut='f'),
+      Decentrement         = SIMP (
+          typ    = 'R',
+          min    = 2,
+          max    = 3,
+          defaut = (0.,0.,0.),
+          statut = 'f',
+          fr     = "Coordonnees xyz du centre des couronnes / centre du contour")),
+  SecteursExternes = FACT (
+      NbSecteurs   = SIMP (typ='I',fr="Nombre de secteurs de la couronne externe",statut='o'),
+      TypeSecteur  = SIMP (
+          typ    = 'TXM',
+          defaut = 'Coins',
+          into   = ('Equivolumique','Angle','Coins','MilieuxCotes'),
+          statut = 'f'),
+      Materiaux    = SIMP (max='**',typ=Materiau,fr="Materiau des secteurs",statut='f'),
+      AngleDepart  = SIMP (max='**',typ='R',fr="Angle de depart des secteurs",statut='f'),
+      AngleSecteur = SIMP (max='**',typ='R',fr="Angle des secteurs",statut='f')) ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ORIENTATION :         Classe de definition d'une orientation angulaire dans un plan 2D apres symetrie eventuelle / Ox
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ORIENTATION = OPER (nom="ORIENTATION",op=0,sd_prod=Orientation,
+
+  fr              = "Definition d'une orientation d'un reseau ou d'une cellule",
+  ang = "Definition of a cell or lattice orientation",
+  Symetrie      = SIMP (typ=(Plan,PlanX,PlanY,PlanZ),statut='f',fr="Indication d'une operation de symetrie / Plan"),
+  AngleRotation = SIMP (typ='R',defaut=0.,statut='f',fr="Angle de rotation en degres"),
+  CentreRotation = SIMP (typ=Point,statut='f',fr='Centre de rotation'),
+  AxeRotation    = SIMP (typ=Vecteur,statut='f',fr="Vecteur de l'axe de rotation") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe FORME_POSITIONNEE :   Classe de definition d'une forme geometrique positionnee
+#                               La position est definie a l'aide du centre de la forme geometrique, 
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+FORME_POSITIONNEE = OPER (nom="FORME_POSITIONNEE",op=0,sd_prod=FormePositionnee,
+
+  fr             = "Definition d'une forme positionnee",
+  ang = "Definition of a shape and its position",
+  Forme          = SIMP (
+      typ    = (Sphere,BoiteRectangulaire,BoiteGenerale,CylindreX,CylindreY,CylindreZ,Cylindre,Cone,
+                PrismeHexagonal,Tore,Polyedre,Cellule,Cluster),
+      statut = 'o',
+      fr     = "Forme geometrique de base a positionner"),
+  PositionCentre   = SIMP (typ=Point,statut='o',fr="Coordonnees du centre de la forme geometrique"),
+  OrientationForme = SIMP (typ=Orientation,statut='f',fr="Orientation de la forme")
+ ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe GEOMETRIE_SURFACIQUE : Classe de definition d'une geometrie surfacique
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+GEOMETRIE_SURFACIQUE = OPER (nom="GEOMETRIE_SURFACIQUE",op=0,sd_prod=GeometrieSurfacique,
+
+  fr            = "Definition d'une geometrie surfacique",
+  ang = "Definition of a surfacic geometry",
+  MateriauRemplissage = SIMP (typ=Materiau,statut='o',fr="Materiau de remplissage de la geometrie surfacique"),
+  Surfaces      = NUPL (
+      max      = '**',
+      statut   = 'o',
+      fr       = "Serie de couples (Surface,Plus ou Moins) definissant les surfaces limites de la geometrie",
+      elements = (
+          SIMP (typ='TXM'),
+          SIMP (typ='TXM',into=('Plus','Moins'))))
+ );
+
+#         simp (typ=(PlanX,PlanY,PlanZ,Plan,CylindreX,CylindreY,CylindreZ,Cylindre,Sphere,Cone,Quadrique)),
+
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe GEOMETRIE_COMBINATOIRE : Classe de definition d'une geometrie combinatoire
+#                                  Ecrasement : Constitution par ecrasements successifs (dans l'ordre des donnees) de la
+#                                               Geometrie Initiale, la frontiere externe etant celle de la geometrie initiale
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+GEOMETRIE_COMBINATOIRE = OPER (nom="GEOMETRIE_COMBINATOIRE",op=0,sd_prod=GeometrieCombinatoire,
+
+  fr                    = "Definition d'une geometrie combinatoire",
+  ang = "Definition of a combinatorial geometry",
+  GeometriePremierPlan = SIMP (typ=FormePositionnee,statut='o',fr="Geometrie se trouvant au premier plan"),
+  GeometrieEcrasee     = SIMP (typ=FormePositionnee,max='**',statut='f',
+                                fr="Geometries ecrasées et surchargées par la GeometriePremierPlan"),
+  GeometrieUnion        = SIMP (typ=FormePositionnee,max='**',statut='f',
+                                fr="Geometries a reunir a la GeometriePremierPlan en gardant les interfaces, les intersections etant des volumes particuliers"),
+  GeometrieReunion      = SIMP (typ=FormePositionnee,max='**',statut='f',
+                                fr="Geometries a reunir a la GeometriePremierPlan pour former un volume unique"),
+  GeometrieIntersection        = SIMP (typ=FormePositionnee,max='**',statut='f',
+                                fr="Geometries a intersecter avec la GeometriePremierPlan")
+ ) ; 
+
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CORRESPONDANCE_REPERE_POSITION_RESEAU : Classe de definition de la position des assemblages combustibles dans un REP
+#                                           Reperes (bataille navale ou autre) et
+#                                           Coordonnees cartesiennes entieres des assemblages combustibles pour un type de palier
+#                                           Origine des coordonnees en bas a gauche d'un systeme en xy
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CORRESPONDANCE_REPERE_POSITION_RESEAU = OPER (nom="CORRESPONDANCE_REPERE_POSITION_RESEAU",op=0,sd_prod=CorrespondanceReperePositionReseau,
+
+  fr                        = "Correspondance entre reperes alphanumeriques et cases d'un reseau",
+  ang = "Alphanumeric identificators and lattice coordinates",
+  Positions                 = NUPL (   max='**',statut='o',
+                                        elements=(SIMP (typ='TXM',fr="Repere alphanumerique arbitraire de l'assemblage"),
+                                                  SIMP (typ='I',fr="Premiere Coordonnee entiere de l'assemblage"),
+                                                  SIMP (typ='I',fr="Seconde Coordonnee entiere de l'assemblage")))
+ );
+
+# -----------------------------------------------------------------------------------------------------------------------------------
+# Classe RESEAU :
+#   Classe de definition d'un reseau de juxtapositions de cellules ou de reseaux
+#   Assemblage de cellules ou de reseaux dans une grille rectangulaire ou hexagonale
+#   Les positions des cellules et des reseaux dans le nouveau reseau sont a fournir sur les mailles 
+#   du reseau sans tenir compte des symetries, 
+#   Le reseau peut etre charge :
+#     - de maniere uniforme : un seul type de CELLULE ou de RESEAU 
+#     - de maniere complete : a chaque maille doit etre affecte un reseau ou une cellule et optionnellement son 
+#       orientation, l'ordre des donnees dans le plan radial etant celui obtenu en partant de l'element le plus
+#       bas a gauche, et dans le sens axial ensuite (eventuellement si 3D) 
+#     - de maniere partielle : liste des cellules et reseaux charges et leur position xyz dans le nouveau reseau
+#       et orientations correspondantes de ces cellules et reseaux
+#   Des reperes alphanumeriques arbitraires peuvent etre associes a chaque maille du reseau, ce qui permet
+#   si necessaire de manipuler ces elements du reseau par l'intermediaire de ces symboles (exemple des 
+#   reperes bataille navale des assemblages dans le reseau d'un coeur REP).
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RESEAU = OPER (nom="RESEAU",op=0,sd_prod=Reseau,
+
+  fr                   = "Definition d'un reseau compose de juxtapositions de cellules, de reseaux ou d'assemblages",
+  en                   = "Definition of a lattice",
+  Identificateur       = SIMP (typ='TXM',statut='f',fr="Identificateur arbitraire du reseau"),
+  TypeGeometrie                = SIMP (typ='TXM',into=('cartesienne','hexagonale'),defaut='cartesienne',statut='f'),
+  NbMaillesX           = SIMP (typ='I',defaut=17,statut='o',fr="Nbre de mailles sur le premier axe du reseau"),
+  NbMaillesY            = SIMP (typ='I',defaut=17,statut='f',fr="Nbre de mailles sur le second axe du reseau"),
+  NbMaillesZ            = SIMP (typ='I',defaut=1 ,statut='f',fr="Nbre de mailles sur l'axe vertical du reseau"),
+  PasReseau             = SIMP (typ='R',defaut=1.26 ,statut='f',max=2,fr="Pas du reseau en X et Y"),
+  MateriauRemplissage   = SIMP (typ=Materiau,defaut='ModExt',statut='f',fr="Materiau de remplissage du reseau"),
+  TypeDefinition        = SIMP (typ='TXM',statut='f',defaut="Complet",into=("Uniforme","Complet","Partiel")),
+  BlocUniforme          = BLOC (condition = "TypeDefinition=='Uniforme'",
+                                ElementsBase  = SIMP (typ=(Cellule,Reseau,Cluster,GeometrieCombinatoire,AssemblageCombustibleCharge),statut='o',
+                                                           fr = "Remplissage uniforme du nouveau reseau par un element particulier"),
+                                OrientationElement = SIMP (typ=Orientation,fr="Orientation de l'element geometrique de base",statut='f')),
+  BlocComplet           = BLOC (condition = "TypeDefinition=='Complet'",      
+                                ElementsBase    = NUPL (max='**', statut='f',
+                                                        elements=(SIMP (typ=(Cellule, Reseau, GeometrieCombinatoire,AssemblageCombustibleCharge)),
+                                                                  SIMP (typ='TXM',fr="Sigle ou repere associe a l'element geometrique de base"))),
+                                Chargement     = SIMP (typ='TXM',statut='f',max='**',
+                                                        fr="Liste ordonnee des sigles associes aux elements geometriques charges"),                                                                                                
+                                Regroupement   = SIMP (typ='I',statut='f',max='**',
+                                                        fr="Indices de regroupement des elements en approximation multicellule"),                                                                                                
+                                Reperes                = SIMP (typ='TXM',max='**',statut='f',fr="Reperes arbitraires des elements charges"),
+                                ),
+  BlocPartiel           = BLOC (condition = "TypeDefinition=='Partiel'",
+                                Chargement  = FACT (max='**',
+                                        ElementsPositionnes = NUPL (max='**', statut='f',
+                                                        elements=(SIMP (typ=(Cellule, Reseau, GeometrieCombinatoire,AssemblageCombustibleCharge)),
+                                                                  SIMP (typ='I',min=2,max=2,fr="Coordonnees i j de l'element geometrique de base"))),                                 
+                                        ElementsReperes    = NUPL (max='**', statut='f',
+                                                        elements=(SIMP (typ=(Cellule, Reseau, GeometrieCombinatoire,AssemblageCombustibleCharge)),
+                                                                  SIMP (typ='TXM',fr="Repere associe a l'element geometrique de base"))),                                
+                                        CorrespondanceReperePositions = SIMP (typ=CorrespondanceReperePositionReseau,
+                                                                              statut='f',
+                                                                              fr="Correspondance entre Repere alphanumerique et coordonnees dans le reseau"),
+                                        OrientationElement = SIMP (typ=Orientation,max='**',statut='f',fr="Orientation des elements a positionner"),
+                                        )),
+ ZonePeripherique      = FACT (
+                          Epaisseurs      = SIMP (typ='R',max='**',statut='f',fr="Liste des epaisseurs des couches peripheriques"),
+                          Materiaux       = SIMP (typ=Materiau,max='**',statut='f',fr="Liste des materiaux des couches peripheriques"),
+                          MateriauExterne = SIMP (typ=Materiau,statut='f',fr="Materiau de remplissage de la zone externe du reseau hexagonal"))
+ );
+
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe GRILLE_ASSEMBLAGE : Classe de definition des grilles composant le squelette des assemblages combustibles
+#                             Caracteristiques  technologiques (dimension, materiaux de composition) et positionnement simplifie   
+#                             des materiaux dans les canaux de l'assemblage pour dilution homogene a 2D dans le milieu peripherique.
+#                               - Materiaux fournis sous forme de couples (nom de materiau et masse en g)
+#                               - Repartition decrite en donnant pour une liste de materiaux (faisant partie des materiaux
+#                                 precedemment indiques) la liste des types de cellules (precedee du mot-cle TypeCellule) et des 
+#                                 types de materiaux (precedes du mot-cle TypeMateriau) devant etre modifies par la presence des
+#                                 grilles 
+#                                                    < liste de MATERIAU >, 
+#                                       TypeCellule  < liste de types de cellule >,
+#                                       TypeMateriau < liste de types de materiau >
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+GRILLE_ASSEMBLAGE = OPER (nom="GRILLE_ASSEMBLAGE",op=0,sd_prod=GrilleAssemblage,
+
+  fr             = "Definition d'une grille d'assemblage",
+  ang = "Definition of an elementary assembly grid",
+  TypeGrille     = SIMP (typ='TXM',defaut='GrilleMelange',statut='f',fr="Type de grille de structure assemblage"),
+  Hauteur        = SIMP (typ='R',defaut=3.3,statut='f',fr="Hauteur de la grille de structure assemblage"),
+  Largeur        = SIMP (typ='R',defaut=21.338,statut='f',fr="Largeur de la grille de structure assemblage"),
+  MateriauxMasse = NUPL (
+      elements = (SIMP (typ=Materiau),SIMP (typ='R')),
+      max      = '**',
+      statut   = 'f',
+      fr       = "Serie de couples (Materiau,masse en g) de composition de la grille"),
+  Repartition    = FACT (
+      max      = '**',
+      statut   = 'o',
+      MateriauGrille = SIMP (typ=Materiau,fr="Nom du materiau a repartir",statut='o'),          
+      TypeCellule    = SIMP (typ='TXM',max='**',statut='o',fr="Liste des types de cellule ou est reparti le materiau"),
+      TypeMateriau   = SIMP (typ='TXM',max='**',statut='o') )
+                        ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PARTIE_INFERIEURE_ASSEMBLAGE_COMBUSTIBLE  :   Classe de definition de l'embout inferieur d'un assemblage combustible
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PARTIE_INFERIEURE_ASSEMBLAGE_COMBUSTIBLE = OPER (nom="PARTIE_INFERIEURE_ASSEMBLAGE_COMBUSTIBLE",op=0,sd_prod=PartieInferieureAssemblageCombustible,
+
+  fr                                       = "Definition de la partie inferieure d'un assemblage combustible",
+  ang = "Definition of the bottom part of a fuel assembly",
+  MateriauEmbout                          = SIMP (typ=Materiau, statut='f',defaut='ACIER',fr="Materiau de l'embout inferieur"),
+  MasseBouchonInferieurCrayonCombustible   = SIMP (typ='R',statut='o',fr="Masse du bouchon inferieur du crayon combustible"),
+  HauteurBouchonInferieurCrayonCombustible = SIMP (typ='R',statut='o',fr="Hauteur du bouchon inferieur du crayon combustible"),
+  MateriauBouchonInferieurCrayonCombustible    = SIMP (typ=Materiau, statut='f',defaut='ZIRCALOY',fr="Materiau du bouchon inferieur du crayon combustible"),
+  MasseEmbout                              = SIMP (typ='R',statut='o',fr="Masse de l'embout inferieur"),
+  EpaisseurPlaqueAdaptatrice               = SIMP (typ='R',statut='o',fr="Epaisseur de la plaque adaptatrice de l'embout inferieur"),
+  LargeurPlaqueAdaptatrice                 = SIMP (typ='R',statut='o',fr="Largeur de la plaque adaptatrice de l'embout inferieur"),
+  TrousPlaqueAdaptatrice                   = NUPL (
+      max      = '**',
+      statut   = 'o',
+      elements = ( SIMP (typ='I',statut='o',fr="Nombre de trous de taille definie ci-apres"),
+                   SIMP (typ='TXM',into=('Rayon','Cotes'),statut='o',fr="Choix de la forme des trous, elliptique ou rectangulaire"),
+                   SIMP (typ='R',min=2,max=2,statut='o',fr="Rayons ou cotes des trous"),
+                   SIMP (typ='TXM',defaut='Hauteur',into=('Hauteur','Epaisseur'),statut='o',fr="Mot-cle au choix"),
+                   SIMP (typ='R',statut='o',fr="Hauteur des trous dans la plaque adaptatrice"))),
+  JeuBouchonCombustiblePlaque  = SIMP (typ='R',statut='o',fr="Hauteur du jeu entre bouchon combustible et plaque adaptatrice"),
+  HauteurPied                   = SIMP (typ='R',statut='o',fr="Hauteur du pied de l'embout inferieur"),
+  CapuchonRint                 = SIMP (typ='R',statut='f',fr="Rayon interne du capuchon"),
+  CapuchonRext                 = SIMP (typ='R',statut='f',fr="Rayon externe du capuchon"),
+  HauteurVisEpaulee             = SIMP (typ='R',statut='f',fr="Hauteur des vis epaulees des tubes guides"),
+  MasseVisEpaulee               = SIMP (typ='R',statut='f',fr="Masse totale des vis epaulees des tubes guides"),
+  VisEpauleeRint               = SIMP (typ='R',statut='f',fr="Rayon interne d'une vis epaulee"),
+  VisEpauleeRext               = SIMP (typ='R',statut='f',fr="Rayon externe d'une vis epaulee"),
+  MasseFiltre                   = SIMP (typ='R',statut='f',fr="Masse du filtre anti-debris"),
+  MateriauFiltre               = SIMP (typ=Materiau, statut='f', defaut='INCONEL',fr="Materiau du filtre anti-debris"),
+  HauteurCale                   = SIMP (typ='R',statut='f',fr="Hauteur de la cale dans le crayon combustible"),
+  MateriauCale                 = SIMP (typ=Materiau, statut='f', defaut='ACIER',fr="Materiau de la cale dans le crayon combustible"),
+  RayonPionCentrage             = SIMP (typ='R',statut='f',fr="Rayon externe des pions de centrage de la plaque inferieure coeur"),
+  HauteurPionCentrage           = SIMP (typ='R',statut='f',fr="Hauteur des pions de centrage de la plaque inferieure coeur"),
+  HauteurOgivePionCentrage      = SIMP (typ='R',statut='f',fr="Hauteur de l'ogive des pions de centrage de la plaque inferieure coeur"),
+  MateriauPionCentrage         = SIMP (typ=Materiau, statut='f',defaut='ACIER',fr="Materiau des pions de centrage de la plaque inferieure coeur"),
+  HauteurBouchonTubeGuide       = SIMP (typ='R',statut='f',fr="Hauteur des bouchons des tubes guides"),
+  MateriauBouchonTubeGuide     = SIMP (typ=Materiau, statut='f',defaut='ACIER',fr="Materiau des bouchons des tubes guides") 
+                                          ) ;
+
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PARTIE_SUPERIEURE_ASSEMBLAGE_COMBUSTIBLE :    Classe de definition de l'embout superieur d'un assemblage combustible
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PARTIE_SUPERIEURE_ASSEMBLAGE_COMBUSTIBLE = OPER (nom="PARTIE_SUPERIEURE_ASSEMBLAGE_COMBUSTIBLE",op=0,sd_prod=PartieSuperieureAssemblageCombustible,
+
+  fr                                       = "Definition de la partie superieure d'un assemblage combustible",
+  ang = "Definition of the top part of a fuel assembly",
+  MateriauEmbout                          = SIMP (typ=Materiau, statut='f',defaut='ACIER',fr="materiau  de l'embout superieur"),
+  MasseBouchonSuperieurCrayonCombustible   = SIMP (typ='R',statut='o',fr="Masse du bouchon superieur du crayon combustible"),
+  HauteurBouchonSuperieurCrayonCombustible = SIMP (typ='R',statut='o',fr="Hauteur du bouchon superieur du crayon combustible"),
+  MateriauBouchonSuperieurCrayonCombustible    = SIMP (typ=Materiau, statut='f',defaut='ZIRCALOY',fr="Materiau du bouchon superieur du crayon combustible"),
+  RessortCrayonCombustible                 = SIMP (typ='R',statut='o',fr="Masse du ressort du crayon combustible"),
+  HauteurChambreExpansion                  = SIMP (typ='R',statut='o',fr="Hauteur de la chambre d'expansion"),
+  MasseEmbout                              = SIMP (typ='R',statut='o',fr="Masse de l'embout superieur"),
+  HauteurEmbout                            = SIMP (typ='R',statut='o',fr="Hauteur de l'embout superieur"),
+  MasseRessortsEmbout                      = SIMP (typ='R',statut='o',fr="Masse des ressorts de l'embout superieur"),
+  MateriauRessortsEmbout                  = SIMP (typ=Materiau,  statut='f', defaut='INCONEL',fr="Materiau des ressorts de l'embout superieur"),
+  EpaisseurPlaqueAdaptatrice               = SIMP (typ='R',statut='o',fr="Epaisseur de la plaque adaptatrice"),
+  LargeurPlaqueAdaptatrice                 = SIMP (typ='R',statut='o',fr="Largeur de la plaque adaptatrice"),
+  TrousPlaqueAdaptatrice                   = NUPL (
+      max      = '**',
+      statut   = 'o',
+      elements = (      SIMP (typ='I',),
+                        SIMP (typ='TXM',into=('Rayon','Cotes')),
+                        SIMP (typ='R',min=2,max=2,fr="Rayons mineur et majeur ou Cotes du trou"),
+                        SIMP (typ='TXM',into=('Hauteur','Epaisseur')),
+                        SIMP (typ='R',fr="Hauteur du trou"))), 
+  JeuBouchonCombustiblePlaque              = SIMP (typ='R',statut='o',fr="Hauteur du jeu entre Bouchon combustible et Plaque adaptatrice"),
+  EpaisseurJupe                            = SIMP (typ='R',statut='o',fr="Epaisseur de la jupe de l'embout superieur"),
+  HauteurJupe                              = SIMP (typ='R',statut='f',fr="Hauteur de la jupe de l'embout superieur"),
+  RayonPionCentrage                        = SIMP (typ='R',statut='f',fr="Rayon des pions de centrage superieurs"),
+  HauteurPionCentrage                      = SIMP (typ='R',statut='f',fr="Hauteur des pions de centrage superieurs"),
+  HauteurOgivePionCentrage                 = SIMP (typ='R',statut='f',fr="Hauteur de l'ogive des pions de centrage superieurs"),
+  MateriauPionCentrage                    = SIMP (typ=Materiau, statut='f',defaut='ACIER',fr="Materiau des pions de centrage superieurs"),
+  RayonInterneManchon                     = SIMP (typ='R',statut='f',fr="Rayon interne des manchons des tubes guides"),
+  RayonExterneManchon                     = SIMP (typ='R',statut='f',fr="Rayon externe des manchons des tubes guides"),
+  HauteurManchon                           = SIMP (typ='R',statut='f',fr="Hauteur des manchons des tubes guides"),
+  MasseManchon                             = SIMP (typ='R',statut='f',fr="Masse d'un manchon des tubes guides") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe OPTIONS_AUTOPROTECTION : Classe de definition des donnees d'autoprotection du code de reseau
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+OPTIONS_AUTOPROTECTION = OPER (nom="OPTIONS_AUTOPROTECTION",op=0,sd_prod=OptionsAutoprotection,
+
+  fr                    = "Definition des donnees d'autoprotection des resonances",
+  ang = "Definition of resonance self shielding data",
+  TypeCombustible      = SIMP (typ='TXM',max='**',statut='o',fr="Type de combustible auquel s'appliquent ces options d'autoprotection"),
+  MethodeAutoprotection = SIMP (typ='TXM',into=('SanchezCoste','SousGroupes'),defaut='SanchezCoste',statut='f'),
+  IsotopesAutoproteges  = NUPL (
+      max      = '**',
+      elements = (SIMP (typ=Isotope,statut='o',fr="Nom de l'isotope a autoproteger"),
+                   SIMP (typ='TXM',into=('Moyenne','Detaillee','Couronne'),statut='o'),
+                   SIMP (typ='TXM',into=('Materiaux','Cellules'),statut='f',fr="Choix d'autoprotection sur les materiaux ou les cellules"),
+                   SIMP (typ='TXM',max='**',statut='f',fr="Liste des types de materiaux ou de cellules concernes"))),
+  Irradiations  = SIMP (typ='R',max='**',statut='f',fr="Irradiations ou se font les calculs d'autoprotection"),
+  IrradiationsPoison  = SIMP (typ='R',max='**',statut='f',fr="Irradiations ou se font les calculs d'autoprotection des poisons integres au combustible")
+  ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ASSEMBLAGE_TYPE : Classe de definition d'un type d'assemblage (ensemble de crayons ou de reseaux quelconques)
+#                           Rajout des structures grilles et embouts (dans le cas des REP)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ASSEMBLAGE_TYPE = OPER (nom="ASSEMBLAGE_TYPE",op=0,sd_prod=AssemblageType,
+
+  fr                    = "Definition d'un assemblage type et des elements associes eventuels",
+  ang = "Definition of an assembly type and its associated elements",
+# TypeGeometrie         = SIMP (typ='TXM',into=('Cartesienne','Hexagonale','Generale'),defaut='Cartesienne',statut='f'),
+# TypeAbsorbant         = SIMP (typ='TXM',defaut='0P',statut='f'),
+# Identificateur        = SIMP (typ='TXM',defaut='AFA  17 0P 0P',statut='f'),
+  Geometrie             = SIMP (typ=(Cellule,Reseau,GeometrieCombinatoire),statut='o',max='**',
+                                fr="Liste des geometries associees a l'assemblage"),
+#    Symetrie           = SIMP (typ='TXM',into=('1/4','1/8','1/2','PI','PI/2','PI/6','PI/3','2PI/3','SansSymetrie'),
+#                               defaut='SansSymetrie',statut='f'),
+#    ZoneCalculee       = SIMP (typ='TXM',defaut='Entiere',
+#                               into=('Entiere','1/2 N','1/2 S','1/2 E','1/2 O','1/4 N-E','1/4 N-O','1/4 S-E',
+#                                               '1/4 S-O','1/8 E-NE','1/8 N-NE','1/8 N-NO',
+#                                               '1/8 O-SO','1/8 S-SO','1/8 S-SE','1/8 E-SE',
+#                                               '1/6 E','1/6 NE','1/6 NO','1/6 O''1/6 SO','1/6 SE'),statut='f'),
+  GrillesStructure      = NUPL (
+                         max      = '**',
+                         statut   = 'f',
+                         elements = (  SIMP (typ=GrilleAssemblage,fr="Type de grille"),
+                                       SIMP (typ='R',max='**',fr="Positions axiales du type de grille"))),
+  PartieInferieure      = SIMP (typ=PartieInferieureAssemblageCombustible,statut='f',fr="Type d'embout inferieur"),
+  PartieSuperieure      = SIMP (typ=PartieSuperieureAssemblageCombustible,statut='f',fr="Type d'embout superieur"),
+  ElementsAssocies     = SIMP (typ=(ElementsGrappeCommande,ElementsAbsorbantsFixes,GrappeBouchonAssemblage),max='**',statut='f')
+#  ZoneCalculee          = SIMP (typ='DROITE',min=2,max=2,statut='f',fr="Droites delimitant la zone de calcul"),
+#  DonneesAutoprotection = SIMP (typ=Autoprotection,statut='f')
+ ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ASSEMBLAGE_COMBUSTIBLE_CHARGE : Classe de definition d'un assemblage combustible charge dans un coeur REP
+#                               
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ASSEMBLAGE_COMBUSTIBLE_CHARGE = OPER (nom="ASSEMBLAGE_COMBUSTIBLE_CHARGE",op=0,sd_prod=AssemblageCombustibleCharge,
+
+  fr                          = "Definition d'un assemblage combustible charge en reacteur",
+  ang = "Definition of a core loaded fuel assembly ",
+  Identificateur              = SIMP (typ='TXM',statut='o',fr="Code d'identification de l'assemblage combustible"),
+  Constructeur                = SIMP (typ='TXM',statut='o',into=('FRAMATOME','SIEMENS','ABB','ENUSA','WESTINGHOUSE')),
+  TypeAssemblage              = SIMP (typ=AssemblageType,statut='o'),
+  CleControle                 = SIMP (typ='TXM',statut='o'),
+  Engagement                  = SIMP (typ='TXM',statut='o'),
+  NumeroLot                   = SIMP (typ='I',statut='o'),
+  EnrichissementTheoriqueU235 = SIMP (typ='R',statut='o'),
+  EnrichissementTheoriquePu   = SIMP (typ='R',statut='f'),
+  MasseTheoriqueNL            = SIMP (typ='R',statut='o'),
+  MasseInitialeUPu            = SIMP (typ='R',statut='o'),
+  MasseInitialeU232          = SIMP (typ='R',statut='f'),
+  MasseInitialeU234           = SIMP (typ='R',statut='f'),
+  MasseInitialeU235           = SIMP (typ='R',statut='f'),
+  MasseInitialeU236           = SIMP (typ='R',statut='f'),
+  MasseInitialePu239          = SIMP (typ='R',statut='f'),
+  MasseInitialePu240          = SIMP (typ='R',statut='f'),
+  MasseInitialePu241          = SIMP (typ='R',statut='f'),
+  MasseInitialePu242          = SIMP (typ='R',statut='f'),
+  MasseInitialeAm241          = SIMP (typ='R',statut='f'),
+  AbsorbantFixe                      = SIMP (typ='TXM',statut='f'),
+  Campagnes                   = NUPL (
+      max      = '**',
+      statut   = 'f',
+      elements = ( SIMP (typ='TXM',fr="Identificateur de la campagne"),SIMP (typ='TXM',fr="Etat de l'assemblage"))),
+  BibliothequeNeutronique = SIMP (typ='TXM',statut='f',fr="Repertoire des Bibliothèques neutroniques associees") ) ;
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ELEMENT_BARRE :       Classe de définition d'une barre element d'un assemblage
+#                               Definition des barres des grappes de commande (barre et gaine, et composants axiaux)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ELEMENT_BARRE = OPER (nom="ELEMENT_BARRE",op=0,sd_prod=ElementBarre,
+
+  fr                           = "Définition d'une barre element d'un assemblage",
+  en                           = "Definition of an assembly rod element",
+  MateriauPartieInferieure     = SIMP (typ=Materiau,statut='o',defaut='ACIER',fr="Materiau composant la partie inferieure de la barre"),
+  MateriauPartieSuperieure     = SIMP (typ=Materiau,statut='o',defaut='ACIER',fr="Materiau composant la partie superieure de la barre"),
+  HauteurBarre                 = SIMP (typ='R',statut='o',fr="Hauteur de la barre"),
+  HauteurPartieInferieure      = SIMP (typ='R',statut='f',fr="Hauteur de la partie inferieure de la barre"),
+  HauteurPartieSuperieure      = SIMP (typ='R',statut='f',fr="Hauteur de la partie superieure de la barre"),
+  RayonInternePartieInferieure = SIMP (typ='R',statut='f',defaut=0.,fr="Rayon Interne de la partie inferieure de la barre"),
+  RayonInternePartieSuperieure = SIMP (typ='R',statut='f',defaut=0.,fr="Rayon Interne de la partie superieure de la barre"),
+  RayonExternePartieInferieure = SIMP (typ='R',statut='o',fr="Rayon Externe de la partie inferieure de la barre"),
+  RayonExternePartieSuperieure = SIMP (typ='R',statut='f',fr="Rayon Externe de la partie superieure de la barre"),
+  MasseRessort                 = SIMP (typ='R',statut='o',fr="Masse du ressort de la barre"),
+  MateriauRessort              = SIMP (typ=Materiau,statut='o',fr="Materiau du ressort de la barre"),
+  HauteurRessort               = SIMP (typ='R',statut='o',fr="Hauteur du ressort de la barre"),
+  HauteurBouchonInferieur      = SIMP (typ='R',defaut=0.,statut='f',fr="Hauteur du bouchon inferieur de la barre"),
+  HauteurBouchonSuperieur      = SIMP (typ='R',defaut=0.,statut='f',fr="Hauteur du bouchon superieur de la barre"),
+  RayonBouchonInferieur                = SIMP (typ='R',defaut=0.,statut='f',fr="Rayon externe du bouchon inferieur de la barre"),
+  RayonBouchonSuperieur                = SIMP (typ='R',defaut=0.,statut='f',fr="Rayon externe du bouchon superieur de la barre"),
+  MateriauGaine                        = SIMP (typ=Materiau,defaut='ACIER',statut='o',fr="Materiau de la gaine externe de la barre"),
+  RayonInterneGaine            = SIMP (typ='R',defaut=0.,statut='f', fr="Rayon Interne de la gaine externe de la barre"),
+  RayonExterneGaine            = SIMP (typ='R',defaut=0.,statut='f', fr="Rayon Externe de la gaine externe de la barre")
+ ) ;
+#----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ELEMENTS_GRAPPE_COMMANDE :   Classe de définition des éléments des grappes de commande
+#                              Association avec les différents types de barres absorbantes
+#                              Description simplifiée de l'araignée et du bouchon des barres
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ELEMENTS_GRAPPE_COMMANDE = OPER (nom="ELEMENTS_GRAPPE_COMMANDE",op=0,sd_prod=ElementsGrappeCommande,
+
+  fr                   = "Définition des éléments des grappes de commande",
+  en                   = "Definition of control rod cluster components",
+  ElementsBarre                = SIMP (typ= ElementBarre,      max='**',statut='f',fr="Liste des barres absorbantes associees"),
+  HauteurPasInsertion  = SIMP (typ='R',defaut=1.5875,  statut='f'),
+  HauteurInsertionMax  = SIMP (typ='R',defaut=300.,    statut='f'),
+  NbPasInsertion       = SIMP (typ='I',defaut=0,       statut='f'),
+  HauteurAraignee16P   = SIMP (typ='R',defaut=0.,      statut='f'),
+  HauteurAraignee4M    = SIMP (typ='R',defaut=0.,      statut='f'),
+  HauteurAraignee4G    = SIMP (typ='R',defaut=0.,      statut='f'),
+  HauteurPommeau       = SIMP (typ='R',defaut=0.,      statut='f'),
+  RayonPommeau         = SIMP (typ='R',defaut=0.,      statut='f') ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ELEMENTS_ABSORBANTS_REP : Classe de definition des elements des grappes d'absorbants fixes
+#                                 
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ELEMENTS_ABSORBANTS_FIXES = OPER (nom="ELEMENTS_ABSORBANTS_FIXES",op=0,sd_prod=ElementsAbsorbantsFixes,
+
+  fr                                 = "Definition des elements des grappes d'absorbants fixes",
+  ang = "Definition of non movable absorber control rod cluster elements",
+# Limitation a 12 caracteres
+# HBouchInfPyrex       = SIMP (typ='R',statut='f'),
+# RBouchInfPyrex       = SIMP (typ='R',statut='f'),
+# HZoneVidePyrex        = SIMP (typ='R',statut='f'),
+# HBouchSupPyrex       = SIMP (typ='R',statut='f'),
+# RBouchSupPyrex       = SIMP (typ='R',statut='f'),
+# MatBouchonPyrex       = SIMP (typ=Materiau,statut='f')
+  CrayonPyrexHauteurBouchonInferieur = SIMP (typ='R',statut='f'),
+  CrayonPyrexRayonBouchonInferieur   = SIMP (typ='R',statut='f'),
+  CrayonPyrexHauteurZoneVide         = SIMP (typ='R',statut='f'),
+  CrayonPyrexHauteurBouchonSuperieur = SIMP (typ='R',statut='f'),
+  CrayonPyrexRayonBouchonSuperieur   = SIMP (typ='R',statut='f'),
+  CrayonPyrexMateriauBouchon         = SIMP (typ=Materiau,statut='f') ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe GRAPPE_BOUCHON_ASSEMBLAGE_REP : Classe de definition d'une grappe bouchon
+#                                 
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+GRAPPE_BOUCHON_ASSEMBLAGE = OPER (nom="GRAPPE_BOUCHON_ASSEMBLAGE",op=0,sd_prod=GrappeBouchonAssemblage,
+
+  fr                                 = "Definition d'une grappe bouchon d'assemblage combustible",
+  ang = "Definition of ",
+  HauteurBouchonPartieBasse          = SIMP (typ='R',statut='f'),
+  RayonBouchonPartieBasse            = SIMP (typ='R',statut='f'),
+  HauteurBouchonPartieIntermediaire1 = SIMP (typ='R',statut='f'),
+  RayonBouchonPartieIntermediaire1   = SIMP (typ='R',statut='f'),
+  HauteurBouchonPartieIntermediaire2 = SIMP (typ='R',statut='f'),
+  RayonBouchonPartieIntermediaire2   = SIMP (typ='R',statut='f'),
+  HauteurBouchonRegionSousPlaque     = SIMP (typ='R',statut='f'),
+  HauteurBouchonRegionSurPlaque      = SIMP (typ='R',statut='f'),
+  RayonBouchonRegionPlaque           = SIMP (typ='R',statut='f'),
+  HauteurSupport                     = SIMP (typ='R',statut='f'),
+  MasseGrappe                        = SIMP (typ='R',statut='f'),
+  Materiau                           = SIMP (typ=Materiau,statut='f') ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ELEMENTS_ASSEMBLAGE : Classe de définition des éléments associes a l'assemblage combustibe REP
+#                                 
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - class ReflexionIsotrope (TObjet):pass
+#ELEMENTS_ASSEMBLAGE = OPER (nom="ELEMENTS_ASSEMBLAGE",op=0,sd_prod=ElementsAssemblage,
+#
+#  fr  = "Definition des elements associes a l'assemblage",
+#  ang = "Definition of the fuel assembly associated elements",
+#  GrappeBouchon         = SIMP (typ=GrappeBouchonAssemblage,statut='o'),
+#  CrayonsAbsorbants     = SIMP (typ=ElementsAbsorbants,statut='o'),
+#  GrappesCommande       = SIMP (typ=ElementsGrappeCommande,statut='o')
+# ) ;
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe SYSTEME_UNITES_MESURE :       Classe de definition du systeme d'unites pour l'expression des donnees 
+#                               Sauf indication contraire dans les attributs des classes, les unites utilisees sont definies
+#                               dans la classe ci-dessous
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+SYSTEME_UNITES_MESURE = OPER (nom="SYSTEME_UNITES_MESURE",op=0,sd_prod=SystemeUnitesMesure,
+
+  fr                           = "Definition du systeme d'unites pour l'expression des donnees",
+  ang = "Definition of data unit system",
+  Longueur                     = SIMP (typ='TXM',statut='o',defaut='cm'),
+  Masse                        = SIMP (typ='TXM',statut='o',defaut='g'),
+  Temps                        = SIMP (typ='TXM',statut='o',defaut='s'),
+  Irradiation                  = SIMP (typ='TXM',statut='o',defaut='MWj/t'),
+  Fluence                      = SIMP (typ='TXM',statut='o',defaut='n/kb'),
+  SectionEfficaceMicroscopique = SIMP (typ='TXM',statut='o',defaut='barn'),
+  SectionEfficaceMacroscopique = SIMP (typ='TXM',statut='o',defaut='cm-1'),
+  MasseVolumique               = SIMP (typ='TXM',statut='o',defaut='g/cm3'),
+  Concentration                = SIMP (typ='TXM',statut='o',defaut='E24*atome/cm3'),
+  Temperature                  = SIMP (typ='TXM',statut='o',defaut='C'),
+  ProportionMateriau           = SIMP (typ='R',statut='o',defaut=0.01),
+  Taux                         = SIMP (typ='R',statut='o',defaut=0.01),
+  Enrichissement               = SIMP (typ='R',statut='o',defaut=0.01),
+  Pression                     = SIMP (typ='TXM',statut='o',defaut='bar') ) ;
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classes CONDITION_LIMITE elementaires :     Classes de definition de Conditions limites elementaires
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+VIDE = OPER (nom="VIDE",op=0,sd_prod=Vide,
+                               fr  = "Condition aux limites de vide",
+                               ang= "Void boundary condition" ) ;
+
+REFLEXION_ISOTROPE = OPER (nom="REFLEXION_ISOTROPE",op=0,sd_prod=ReflexionIsotrope,
+                               fr  = "Condition aux limites de reflexion isotrope",
+                               ang= "Isotropic Reflexion boundary condition" ) ;
+
+REFLEXION_SPECULAIRE = OPER (nom="REFLEXION_SPECULAIRE",op=0,sd_prod=ReflexionSpeculaire,
+                               fr  = "Condition aux limites de reflexion speculaire",
+                               ang= "Specular Reflexion boundary condition" ) ;
+ALBEDO = OPER (nom="ALBEDO",op=0,sd_prod=Albedo,
+                               fr   = "Condition aux limites d'albedo",
+                               ang= "Albedo boundary condition",
+                               albedo = SIMP (typ='R',statut='o',max='**') ) ;
+TRANSLATION = OPER (nom="TRANSLATION",op=0,sd_prod=Translation,
+                               fr      = "Condition aux limites de translation",
+                               ang = "Translation boundary condition",
+                               Vecteur = SIMP (typ=Vecteur,statut='o') ) ;
+ROTATION = OPER (nom="ROTATION",op=0,sd_prod=Rotation,
+                               fr     = "Condition aux limites de rotation",
+                               ang = "Rotational boundary condition",
+                               Centre = SIMP (typ=Point,statut='o'),
+                               Angle  = SIMP (typ='R',statut='o',defaut=90.) ) ;
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CONDITION_LIMITE_SPECIALE :  Classe de definition de Conditions limites sur les surfaces elementaires de la geometrie
+#                                      modifiant la CL generale
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CONDITION_LIMITE_SPECIALE = OPER (nom="CONDITION_LIMITE_SPECIALE",op=0,sd_prod=ConditionLimiteSpeciale,
+
+  fr     = "Condition limite particuliere qui sera plaquee sur la geometrie",
+  ang = "Special boundary condition added to the geometry",
+  Type = SIMP (typ=(Vide,ReflexionIsotrope,ReflexionSpeculaire, Albedo, Translation, Rotation),statut='o'),
+  ZonesApplication = SIMP (    typ=(Segment,ArcCercle,Conique),max='**',statut='o',
+                               fr="Liste des segments ou surfaces sur lesquels porte la condition limite")
+ ) ;
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CONDITION_LIMITE_GENERALE : Classe de definition des conditions limites de l'objet geometrique complet
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CONDITION_LIMITE_GENERALE = OPER (nom="CONDITION_LIMITE_GENERALE",op=0,sd_prod=ConditionLimiteGenerale,
+
+  fr  = "Condition limite a la surface externe de la geometrie complete",
+  ang = "Boundary condition for the complete geometry",
+  ZoneCalculee          = NUPL (statut='f',min=2,max=2,fr="Droites ou plans delimitant la zone de calcul",
+                                elements = (SIMP (typ=(Droite,Plan)), SIMP (typ='TXM',into=('Plus','Moins')))),
+  ConditionParDefaut   = SIMP (typ=(Vide, ReflexionIsotrope, ReflexionSpeculaire, Albedo),
+                               defaut=ReflexionIsotrope,
+                               statut='f',
+                               fr="Condition limite par defaut"),
+  ConditionsParticulieres  = NUPL (
+                               fr       = "Conditions particulieres modifiant localement la condition limite par defaut",
+                               max      = '**',
+                               statut   = 'f',
+                               elements = (SIMP (typ='TXM',into=('X-','X+','Y-','Y+','Z-','Z+','R+','X','Y','Z')),
+                                           SIMP (typ=(Vide,ReflexionIsotrope,ReflexionSpeculaire, Albedo, Translation, Rotation)))),
+  ConditionsSupplementaires = SIMP (
+                               typ    = ConditionLimiteSpeciale,
+                               statut = 'f',
+                               max    = '**',
+                               fr     = "Conditions limites non exprimables avec les donnees precedentes") 
+ ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe POSITION_ASSEMBLAGE_COMBUSTIBLE : Classe de definition de la position des assemblages combustibles dans un REP
+#                                           Reperes (bataille navale ou autre) et
+#                                           Coordonnees cartesiennes entieres des assemblages combustibles pour un type de palier
+#                                           Origine des coordonnees en bas a gauche d'un systeme en xy
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POSITION_ASSEMBLAGE_COMBUSTIBLE = OPER (nom="POSITION_ASSEMBLAGE_COMBUSTIBLE",op=0,sd_prod=PositionAssemblageCombustible,
+
+  fr                        = "Position des assemblages combustibles",
+  ang = "Position of fuel assemblies",
+  NbAssemblagesCombustibles = SIMP (typ='I',statut='o',defaut=157),
+  regles=(UN_PARMI('PositionReseau', 'Positions'),),
+  PositionReseau            = SIMP (typ=CorrespondanceReperePositionReseau,statut="f"),
+  Positions                 = NUPL (   max='**',statut='f',
+                                        elements=(SIMP (typ='TXM',fr="Repere alphanumerique arbitraire de l'assemblage"),
+                                                  SIMP (typ='I'  ,fr="Premiere Coordonnee entiere de l'assemblage"),
+                                                  SIMP (typ='I'  ,fr="Seconde Coordonnee entiere de l'assemblage")))
+ ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe POSITION_INSTRUMENTATION : Classe de definition de la position des assemblages instrumentes dans un REP 
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POSITION_INSTRUMENTATION_INTERNE = OPER (nom="POSITION_INSTRUMENTATION_INTERNE",op=0,sd_prod=PositionInstrumentationInterne,
+
+  fr                        = "Definition de la position des assemblages instrumentes",
+  ang = "Definition of neutron flux detector position",
+# TypePalier                = SIMP (typ='TXM',max='**',statut='o'),
+  NbAssemblagesInstrumentes = SIMP (typ='I',statut='o'),
+  Positions                 = NUPL (
+      max      = '**',
+      statut   = 'o',
+      elements = (SIMP (typ='TXM',fr= "Type d'instrumentation"),
+                  SIMP (typ='I',min=2,max=2,fr= "Coordonnees entieres de l'assemblage instrumente dans le reseau"))) ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe POSITION_GRAPPES_COMMANDE : Classe de definition des grappes de commande pour un type de schema de grappe
+#                                     Donnees de la position (coordonnees entieres en xy), du type de grappe et du groupe d'appartenance 
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POSITION_GRAPPES_COMMANDE = OPER (nom="POSITION_GRAPPES_COMMANDE",op=0,sd_prod=PositionGrappesCommande,
+
+  fr              = "Definition des grappes de commande pour un schema d'implantation particulier",
+  ang = "Definition of control rod cluster position ant type",
+  TypeSchema      = SIMP (typ='TXM',statut='o'),
+  NbTotalGrappes  = SIMP (typ='I',statut='o'),
+  PositionsEtType = NUPL (max='**',statut='o',
+                          elements=(SIMP (typ='TXM',fr="Nom du groupe de grappes"),
+                                    SIMP (typ='I',fr="Nombre de grappes du groupe"),
+                                    SIMP (typ='TXM',fr="Type de grappes"),
+                                    SIMP (typ='I',max='**',fr="Coordonnees des grappes"))) ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe STRUCTURES_INTERNES_REACTEUR :        Classe de definition des structures internes du coeur du reacteur
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+STRUCTURES_INTERNES_REACTEUR = OPER (nom="STRUCTURES_INTERNES_REACTEUR",op=0,sd_prod=StructuresInternesReacteur,
+
+  fr                      = "Definition des structures internes du coeur",
+  ang = "Definition of core internal structures",
+  PlaqueInferieureCoeur   = FACT (
+      Epaisseur = SIMP (typ='R',statut='o',                    fr="Epaisseur de la plaque inferieure du coeur"),
+      Materiau  = SIMP (typ=Materiau,statut='f',defaut='ACIER',fr="Materiau  de la plaque inferieure du coeur"),
+      Trous     = NUPL (
+          max      = '**',
+          elements = (
+              SIMP (typ='I',                           fr="Nombre de trous dont on donne les dimensions"),
+              SIMP (typ='TXM',into=('Rayon','Cotes'),  fr="Mot-cle indiquant si on donne le rayon ou les cotes"),
+              SIMP (typ='R',min=2,max=2,               fr="Rayon ou cotes des trous"),
+              SIMP (typ='TXM',into=('Hauteur','Epaisseur'),fr="Mot-cle indiquant l'entree de la hauteur du trou"),
+              SIMP (typ='R',                           fr="Hauteur du trou")))),
+  PlaqueSuperieureCoeur   = FACT (
+      Epaisseur = SIMP (typ='R',                                fr="Epaisseur de la plaque superieure du coeur"),
+      Materiau  = SIMP (typ=Materiau,statut='f',defaut='ACIER',fr="Materiau  de la plaque superieure du coeur"),
+      Trous     = NUPL (
+          max      = '**',
+          elements = (
+              SIMP (typ='I',                           fr="Nombre de trous dont on donne les dimensions"),
+              SIMP (typ='TXM',into=('Rayon','Cotes'),  fr="Mot-cle indiquant si on donne le rayon ou les cotes"),
+              SIMP (typ='R',min=2,max=2,               fr="Rayon ou cotes des trous"),
+              SIMP (typ='TXM',into=('Hauteur','Epaisseur'),fr="Mot-cle indiquant l'entree de la hauteur du trou"),
+              SIMP (typ='R',                           fr="Hauteur du trou")))),
+  CloisonnementCoeur      = FACT (
+      Epaisseur             = SIMP (typ='R',                                   fr="Epaisseur du cloisonnement du coeur"),
+      Materiau              = SIMP (typ=Materiau,statut='f',defaut='ACIER',    fr="Materiau  du cloisonnement du coeur"),
+      DimensionsInterieures = NUPL (
+          max      = '**',
+          elements = (
+              SIMP (typ='I',                                   fr="Nombre d'assemblages dans la rangee"),
+              SIMP (typ='TXM',into=('Assemblages','Assemblies'),fr="Mot-cle suivant le nombre d'assemblages"),
+              SIMP (typ='TXM',into=('Largeur','Cote'),         fr="Mot-cle precedant la largeur interieure du cloisonnement"),
+              SIMP (typ='R',                                   fr="Largeur interieure du cloisonnement"),
+              SIMP (typ='TXM',into=('NbJeuCloisonGrille','NbJeu'),fr="Mot-cle precedant le nombre de jeux CloisonGrille"),
+              SIMP (typ='I',                                   fr="Nombre de jeux CloisonGrille"))),
+      TrousDepressurisation = NUPL (elements=(SIMP (typ='I',fr="Nombre de trous de depressurisation"),
+                                               SIMP (typ='TXM',into=('Rayon','Radius'),fr="Mot-cle precedant la valeur du rayon des trous"),
+                                               SIMP (typ='R',fr="Rayon des trous de depressurisation"))),
+      TemperatureMoyenne    = SIMP (typ='R',fr="Temperature Moyenne du cloisonnement")),
+  RenfortsInternes        = FACT (
+      Nombre                      = SIMP (typ='I',max='**'),
+      Epaisseur                   = SIMP (typ='R',max='**'),
+      Materiau                    = SIMP (typ=Materiau,max='**',statut='f',defaut='ACIER'),
+      NbTrousDepressurisation     = SIMP (typ='I',max='**'),
+      RayonsTrousDepressurisation = SIMP (typ='R',max='**'),
+      TemperatureMoyenne          = SIMP (typ='R'),statut='f'),
+  EnveloppeVirole        = FACT (
+      RayonInterne       = SIMP (typ='R'),
+      RayonExterne       = SIMP (typ='R'),
+      Materiau           = SIMP (typ=Materiau,statut='f',defaut='ACIER'),
+      TemperatureMoyenne = SIMP (typ='R')),
+  Boucliers              = FACT (
+      RayonInterne       = SIMP (typ='R'),
+      RayonExterne       = SIMP (typ='R'),
+      Materiau           = SIMP (typ=Materiau,statut='f',defaut='ACIER'),
+      Secteurs           = NUPL (max='**',elements=(SIMP (typ='R'),SIMP (typ='R'))),
+      TemperatureMoyenne = SIMP (typ='R')),
+  Cuve                    = FACT (
+      RayonInterne       = SIMP (typ='R'),
+      RayonExterne       = SIMP (typ='R'),
+      Materiau           = SIMP (typ=Materiau,statut='f',defaut='ACIER'),
+      TemperatureMoyenne = SIMP (typ='R')) ) ; # Fin STRUCTURES_INTERNES_REACTEUR
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CARACTERISTIQUES_PALIER : Classe de definition des donnees generales d'un type de palier de reacteur 
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CARACTERISTIQUES_PALIER = OPER (nom="CARACTERISTIQUES_PALIER",op=0,sd_prod=CaracteristiquesPalier,
+
+  fr                  = "Definition des donnees generales d'un type de palier de reacteur",
+  ang = "Definition of general data for a type of nuclear reactor",
+  TypePalier         = SIMP (typ='TXM',statut='o',fr="Identificateur du type de palier"),
+  PositionCombustible = SIMP (typ=PositionAssemblageCombustible,statut='o'),
+  PositionDetecteur   = SIMP (typ=PositionInstrumentationInterne,statut='o'),
+  StructuresInternes  = SIMP (typ=StructuresInternesReacteur,statut='o'),
+  NbBouclesPrimaires  = SIMP (typ='I',statut='o',defaut=3,fr="Nombre de boucles primaires"),
+  NbTubesParGV        = SIMP (typ='I',statut='f',fr="Nombre de tubes par GV") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe SITE_NUCLEAIRE_EDF : Classe de definition d'un site nucleaire EDF (Tranches, paliers et numero comptable) 
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+SITE_NUCLEAIRE = OPER (nom="SITE_NUCLEAIRE",op=0,sd_prod=SiteNucleaire,
+
+  fr       = "Definition d'un site nucleaire EDF",
+  ang = "Definition of a nuclear power plant site",
+  NomSite  = SIMP (typ='TXM',statut='o',fr="Nom du site nucleaire",defaut='TRICASTIN'),
+  Tranches = NUPL (max='**',elements=( SIMP (typ='I'  ,statut='o',fr="Numero de la tranche nucleaire"),
+                                       SIMP (typ='TXM',statut='o',fr="Trigramme de la tranche nucleaire"),
+                                       SIMP (typ=CaracteristiquesPalier,statut='o',fr="Type de palier"),
+                                       SIMP (typ='I'  ,statut='o',fr="Numero comptable de la tranche"))) ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ESPACE_VARIATIONS :     Classe de definition des parametres de contre-reactions neutroniques et de leurs variations
+#                                       Donnees definissant l'espace des parametres dont dependent les bibliotheques
+#                                       neutroniques et la discretisation de leur espace de variation.
+#                                       Definition de la methode de balayage de cet espace (Suite d'options complementaires) :
+#                                       1) ParametresIndependants :     Calculs independants en donnant successivement a chacun
+#                                                                       des parametres leurs valeurs individuelles
+#                                       2) CoinsDomaine :               Rajout des calculs aux limites extremes du domaine
+#                                       3) BordsDomaine :               Rajout des calculs aux bords du domaine
+#                                       4) Grilles2D :                  Rajout des calculs sur les grilles 2D 
+#                                                                       passant par un point de reference
+#                                       5) CasParticuliers :            Rajout de points specifiques de calcul
+#                                       6) EspaceComplet :              Balayage complet du domaine des parametres
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ESPACE_VARIATIONS = OPER (nom="ESPACE_VARIATIONS",op=0,sd_prod=EspaceVariations,
+
+  fr              = "Definition de l'espace de variation des parametres neutroniques",
+  ang = "Definition of feedback or variable parameters",
+  Variations      = NUPL (max='**',statut='f',
+                          elements=(   SIMP (typ='TXM',fr="Nom du parametre a faire varier"),
+                                        SIMP (typ='R',max='**',fr="Valeurs discretes de variation du parametre"))),
+  MethodeBalayage = SIMP (
+      typ    = 'TXM',
+      max    = '**',
+      defaut = 'ParametresIndependants',
+      into   = ('ParametresIndependants','CoinsDomaine','BordsDomaine','Grilles2D','CasParticuliers','EspaceComplet'),
+      statut = 'f'),
+  TypeVariation   = SIMP (typ='TXM',defaut='absolu',into=('relatif','absolu'),statut='f'),
+  CasParticuliers = NUPL (max='**',statut='f',fr="Liste des couples (Parametre, Valeur du parametre) pour les cas particuliers",
+                          elements=(SIMP (typ='TXM'),SIMP (typ='R'))),
+  CasReference    = NUPL (max='**',statut='f',fr="Liste des couples (Parametre, Valeur du parametre) pour le cas de reference",
+                          elements=(SIMP (typ='TXM'),SIMP (typ='R'))) ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DONNEES_EVOLUTION_IRRADIATION : Classe de definition des valeurs d'irradiation intervenant dans les phases de calcul et d'edition
+#                       Pour le moment, on ne considere que l'Evolution, les Editions, l'Autoprotection et les ContreReactions
+#                       ou les irradiations de reprise (Normale, Gs et Beta pour EDF).
+#                       Donnees consistant pour chaque phase d'une liste d'irradiations en MWj/t
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DONNEES_EVOLUTION_IRRADIATION = OPER (nom="DONNEES_EVOLUTION_IRRADIATION",op=0,sd_prod=DonneesEvolutionIrradiation,
+
+  fr                   = "Definition des donnees du calcul d'evolution et des irradiations de reprise",
+  ang = "Definition of depletion calculation data and burnup restart calculations",
+  Unite                       = SIMP (typ='TXM',defaut='MWj/t',into=('MWj/t','Jours'),statut='f',fr="Unite pour les irradiations"),
+  Minimum              = SIMP (typ='R',defaut=0.,statut='f',fr="Irradiation du debut de calcul"),
+  Maximum              = SIMP (typ='R',defaut=100000.,statut='f',fr="Irradiation maximum des calculs"),
+  Evolution            = SIMP (typ='R',max='**',defaut=0.,statut='f',fr="Irradiations du calcul d'evolution"),
+  Editions             = SIMP (typ='R',max='**',defaut=0.,statut='f',fr="Irradiations ou se font les editions"),
+  ContreReactions      = SIMP (typ='R',max='**',statut='f',fr="Irradiations ou se font les calculs de reprise de contre-reactions"),
+  ReprisesGs           = SIMP (typ='R',max='**',statut='f',fr="Irradiations ou se font les calculs de reprise GS EDF"),
+  ReprisesBeta         = SIMP (typ='R',max='**',statut='f',fr="Irradiations ou se font les calculs de reprise BETA EDF"),
+  Reprises             = SIMP (typ='R',max='**',statut='f',fr="Irradiations ou se font les calculs de reprise"),
+  Refroidissement      = FACT (
+                         Instants = SIMP (typ='R',max='**',fr="Irradiations de debut de refroidissement du combustible"),
+                         Jours    = SIMP (typ=('R','I'),max='**',fr="Nombre de jours de refroidissement correspondant aux instants de refroidissement")),
+  InsertionGrappe      = NUPL (max='**',statut='f',elements=(
+                                SIMP (typ='TXM',fr="Type de grappe inseree"),
+                                SIMP (typ=('R','I'), min=2,max=2,fr="Irradiations de Debut et Fin d'insertion de la grappe"),
+                                SIMP (typ='R',fr="Cote axiale de la limite inferieure de la grappe inseree"))) ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CONDITIONS_FONCTIONNEMENT : Classe de definition des conditions de fonctionnement Reacteur pour une campagne donnee
+#                               
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CONDITIONS_FONCTIONNEMENT_MOYENNES = OPER (nom="CONDITIONS_FONCTIONNEMENT_MOYENNES",op=0,sd_prod=ConditionsFonctionnementMoyennes,
+
+  fr                          = "Definition des conditions de fonctionnement pour une campagne donnee",
+  ang = "Definition of a campaign operating conditions ",
+  IdentificateurCampagne      = SIMP (typ='TXM',statut='f',fr="Identificateur de la campagne"),
+  PuissanceElectriqueMW       = SIMP (typ='R',statut='o',defaut=900.,fr="Puissance electrique du reacteur en MW"),
+  PuissanceThermiqueMWth      = SIMP (typ='R',statut='o',defaut=2775.,fr="Puissance thermique du reacteur en MWth"),
+  PressionPrimaireEntreeBar   = SIMP (typ='R',statut='o',defaut=155.1,fr="Pression du moderateur en bars a l'entree du coeur actif"),
+  PressionPrimaireSortieBar   = SIMP (typ='R',statut='o',defaut=155.1,fr="Pression du moderateur en bars en sortie du coeur actif"),
+  TitreMoyenBorePpm           = SIMP (typ='R',statut='o',defaut=500.,fr="Titre moyen en ppm en bore dans le moderateur"),
+  TmodEntreePnulleC           = SIMP (typ='R',statut='o',defaut=286.0,fr="Temperature en C du moderateur a puissance nulle a l'entree du coeur"),
+  TmodEntreePnomC             = SIMP (typ='R',statut='o',defaut=286.4,fr="Temperature en C du moderateur a puissance nominale a l'entree du coeur"),
+  DeltaTmodEntreeSortiePnomC  = SIMP (typ='R',statut='o',defaut=39.0,fr="Ecart en C de temperature entre entree et sortie du coeur a puissance nominale"),
+  TmodMoyenneCoeurPnomC       = SIMP (typ='R',statut='o',defaut=305.3,fr="Temperature moyenne en C du moderateur dans le coeur actif"),
+  TmodMoyenneCuvePnomC        = SIMP (typ='R',statut='f',defaut=305.0,fr="Temperature moyenne en C du moderateur dans la cuve"),
+  TcomMoyennePnomC            = SIMP (typ='R',statut='f',defaut=600.0,fr="Temperature moyenne en C du combustible dans le coeur"),
+  TmodMoyenneReflecteurPnomC  = SIMP (typ='R',statut='f',defaut=296.0,fr="Temperature moyenne en C du reflecteur radial"),
+  PositionGrappeHaute         = SIMP (typ='I',statut='f',defaut=225,fr="Position haute des grappes, en nombre de pas extraits"),
+  DebitPrimaireConceptionM3_h = SIMP (typ='R',statut='f',defaut=70500.,fr="Debit primaire de conception dans le coeur en m3/h"),
+  ProportionDebitCoeurCuve    = SIMP (typ='R',statut='f',defaut=0.97,fr="Rapport du debit coeur / debit cuve"),
+  NbTubesGVBouches            = SIMP (typ='I',statut='f',defaut=0,fr="Nombre de tubes GV bouches"),
+  SectionEcoulementCoeur      = SIMP (typ='R',statut='f',defaut=3.87,fr="Section d'ecoulement du moderateur dans le coeur en m2")
+ ) ; # Fin CONDITIONS_FONCTIONNEMENT
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PLAN_CHARGEMENT_COEUR : Classe de definition du plan de chargement combustible d'un coeur pour une campagne donnee                               
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#PLAN_CHARGEMENT_COEUR = OPER (nom="PLAN_CHARGEMENT_COEUR",op=0,sd_prod=PlanChargementCoeur,
+#
+#  fr                     = "Definition du plan de chargement combustible d'un coeur",
+#  ang = "Definition of a fuel loading core map ",
+#  IdentificateurCampagne = SIMP (typ='TXM',statut='o'),
+#  TypePlan               = SIMP (typ='TXM',into=('STD','FR','FF','FFG'), statut='f'),
+#  AssemblagePosition     = NUPL (
+#      max      = '**',
+#      elements = (      SIMP (typ=AssemblageCombustibleCharge,fr="Identificateur de l'assemblage"),
+#                        SIMP (typ='TXM',statut='f',fr="Repere alphanumerique de la Position dans le coeur"),
+#                        SIMP (typ='I',min=2,max=2,statut='f',fr="Coordonnees ij dans le plan radial du reseau du coeur")))
+# );
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DATES_CLES_CAMPAGNE : Classe de definition des dates cles d'une campagne et de sa longueur
+#                               
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DATES_CLES_CAMPAGNE = OPER (nom="DATES_CLES_CAMPAGNE",op=0,sd_prod=DateClesCampagne,
+
+  fr                                  = "Definition des dates cles d'une campagne et de sa longueur",
+  ang = "Definition of the campaign dates and length",
+  IdentificateurCampagne              = SIMP (typ='TXM',statut='o',defaut='CZ101'),
+  DateDDC                             = SIMP (typ='I',min=3,max=3,statut='o',fr="Date J M A de debut de campagne"),
+  DatePnom                            = SIMP (typ='I',min=3,max=3,statut='o',fr="Date J M A d'atteinte de la puissance nominale"),
+  DateFDC                             = SIMP (typ='I',min=3,max=3,statut='o',fr="Date J M A de fin de campagne"),
+  LongueurNaturelleTheoriqueMWj_t     = SIMP (typ='R',statut='f',fr="Longueur naturelle theorique calculee de la campagne en MWj/t"),
+  LongueurNaturelleRecaleeMWj_t       = SIMP (typ='R',statut='f',fr="Longueur naturelle recalee calculee de la campagne en MWj/t"),
+  LongueurNaturelleExperimentaleMWj_t = SIMP (typ='R',statut='f',fr="Longueur naturelle mesuree de la campagne en MWj/t"),
+  LongueurAnticipationJepp            = SIMP (typ='R',statut='f',fr="Nombre de JEPP d'anticipation"),
+  LongueurProlongationJepp            = SIMP (typ='R',statut='f',fr="Nombre de JEPP de prolongation"),
+  LongueurTotaleExperimentaleMWj_t    = SIMP (typ='R',statut='f',fr="Longueur totale de la campagne en MWj/t") ) ;
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe OPTIONS_CODES :      Classe de definition des options generales et du type de calcul demande
+#                               
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+OPTIONS_CODES = OPER (nom="OPTIONS_CODES",op=0,sd_prod=OptionsCodes,
+  fr                 = "Definition des options des codes de calcul",
+  ang = "Definition of calculation code options",
+# TypeCalcul         = SIMP (typ='TXM',defaut='Evolution',statut='f'),
+# CodeCalcul         = SIMP (typ='TXM',defaut='SUNSET',statut='f'),
+# ConditionLimite    = SIMP (typ=ConditionLimiteGenerale,statut='o'),
+  OptionsCodeReseau  = FACT (
+      OptionMulticellule        = SIMP (typ='TXM',defaut='ROTH',statut='f',into=('ROTH','MULTICELLULE'),fr="Option du calcul multicellule"),
+      OptionPij                 = SIMP (typ='TXM',defaut='&UP0 &ROTH',statut='f',into=('&UP0 &ROTH','&UP0 &HETE','&UP1 &HETE'),fr="Option du calcul des Pij"),
+      ParametresIntegration     = SIMP (typ='TXM',defaut='MAIL_INT 7 7 7 7',statut='f',fr="Donnees du maillage d'integration en heterogene"),
+      ProportionNoyauxParDefaut = SIMP (typ='R',defaut=1.E-12,statut='f',fr="Valeur initiale des concentrations des noyaux lourds non definis"),
+      OptionLaplacienB2         = SIMP (typ='TXM',defaut='CRITIQUE',statut='f',into=('CRITIQUE','NUL','IMPOSE'),fr="Option du calcul des fuites homogenes"),
+      LaplacienB2               = SIMP (typ='R',defaut=0.,statut='f',fr="Valeur initiale du laplacien du calcul des fuites"),
+      OrdreAnisotropie          = SIMP (typ='I',defaut=1,statut='f',fr="Ordre d'anisotropie des sections de transfert"),
+      Autoprotection            = SIMP (typ='TXM',defaut='Oui',statut='f',into=('Oui','Non'),fr="Calcul d'autoprotection ou non"),
+      DonneesAutoprotection     = SIMP (typ=OptionsAutoprotection,statut='f',max='**',fr="Nom des objets decrivant les isotopes a autoproteger et les options associees"),
+      RecalculAutoprotection    = SIMP (typ='TXM',defaut='Oui',statut='f',into=('Oui','Non'),fr="Demande ou non de recalcul de l'autoprotection"),
+      Equivalence               = SIMP (typ='TXM',defaut='Non',statut='f',into=('Oui','Non'),fr="Demande ou non de calcul d'equivalence"),
+      NbGroupesEquivalence      = SIMP (typ='I',max='**',defaut=(2,6,16),statut='f',fr="Liste des nombres de groupes des calculs d'quivalence"),
+      EditionAssemblage         = SIMP (typ='TXM',defaut='Oui',statut='f',into=('Oui','Non'),fr="Demande d'edition des sections efficaces homogeneisees sur l'ensemble du domaine"),
+      EditionCellule            = SIMP (typ='TXM',defaut='Oui',statut='f',into=('Oui','Non'),fr="Demande d'edition des sections efficaces homogeneisees par cellule"),
+      EditionFluxDetaille       = SIMP (typ='TXM',defaut='Oui',statut='f',into=('Oui','Non'),fr="Demande d'edition des flux moyens sur l'ensemble du domaine sur la maillage multigroupe detaille"),
+      EditionMilieu             = SIMP (typ='TXM',defaut='Oui',statut='f',into=('Oui','Non'),fr="Demande d'edition des compositions isotopiques detaillees sur tous les milieux de calcul"),
+      EditionTrimaran           = SIMP (typ='TXM',defaut='Non',statut='f',into=('Oui','Non'),fr="Demande d'edition des sections efficaces pour TRIPOLI multigroupe"),
+      SpectreNeutrons           = SIMP (typ='TXM',defaut='Prompt',statut='f',into=('Prompt','Retarde'),fr="Type de spectre de neutrons pour le calcul de transport"),
+      ListeIsotopesEdites       = SIMP (typ='TXM',statut='f',max='**',fr="Liste des initiales des symboles des isotopes a editer"),
+      FichierBickley            = SIMP (typ='TXM',statut='f',fr="Nom du fichier des fonctions Bickley"),
+      EditionIsotopeHomogene    = SIMP (typ='TXM',defaut='Non',statut='f',into=('Oui','Non'),fr="Demande d'edition de constitution d'isotopes homogeneises sous forme APOLLIB"),
+      RepertoireHomoge          = SIMP (typ='TXM',statut='f',fr="Nom du repertoire du fichier des isotopes homogenes sous forme APOLLIB"),
+      FichierHomoge             = SIMP (typ='TXM',statut='f',fr="Nom du fichier des isotopes homogenes sous forme APOLLIB"),
+      ExecutableAPOLLO          = NUPL (
+          elements = ( SIMP (typ='TXM',fr="Systeme d'exploitation"),SIMP (typ='TXM',fr="Nom du fichier executable")),
+          statut   = 'f'),
+      ProceduresApollo2         = FACT (
+                OptionsListing  = SIMP (typ='TXM',statut='f'),
+                Evolution       = SIMP (typ='TXM',statut='f'),
+                Reprise         = SIMP (typ='TXM',statut='f'),
+                Equivalence     = SIMP (typ='TXM',statut='f'),
+                EditionCellule  = SIMP (typ='TXM',statut='f'),
+                EditionHomoge   = SIMP (typ='TXM',statut='f')),
+      ProceduresSunset          = FACT (
+                Evolution       = SIMP (typ='TXM',statut='f'),
+                Reprise         = SIMP (typ='TXM',statut='f'),
+                Equivalence     = SIMP (typ='TXM',statut='f'),
+                EditionCellule  = SIMP (typ='TXM',statut='f'),
+                EditionHomoge   = SIMP (typ='TXM',statut='f'))),
+# --------------------------------------------------------------
+  OptionsCodeCoeur  = FACT (
+      ReactiviteVisee = SIMP (typ='R',defaut=0.,statut='f',fr="Valeur en pcm de la reactivite visee en calcul critique"),
+      EfficaciteBoreEstimee = SIMP (typ='R',defaut=-6.,statut='f',fr="Valeur estimee en pcm/ppm de l'efficacite du bore"),
+      TitreBoreInitiale = SIMP (typ='R',defaut=600.,statut='f',fr="Valeur estimee en ppm du titre en bore du moderateur"),
+      ApproximationTransport = SIMP (typ='TXM',defaut='SPn',statut='f',into=('SPn','Sn')),
+      BlocSPn  = BLOC (condition = "ApproximationTransport=='SPn'",
+                        OrdreApproximation = SIMP (typ='I',defaut=1,statut='f',fr="Ordre n impair de la methode SPn"),
+                        ElementFini       = SIMP (typ='TXM',defaut='RTN0',statut='f',into=('RTN0','RTN1'),fr="Type d'element fini"),
+                        MaxIterationsDiffusion = SIMP (typ='I',defaut=1,into=(1,2,3,4,5),statut='f',fr="Nombre maximal d'iterations de diffusion")),
+      BlocSn   = BLOC (condition = "ApproximationTransport=='Sn'",
+                        OrdreApproximation = SIMP (typ='I',defaut=4,statut='f',fr="Ordre n pair de la methode Sn"),
+                        ElementFini       = SIMP (typ='TXM',defaut='RTN',statut='f',into=('RTN','BDM'),fr="Type d'element fini"),
+                        Acceleration      = SIMP (typ='TXM',defaut='Oui',statut='f',into=('Oui','Non'),fr="Acceleration par la diffusion"),
+                        MaxIterationsDiffusion = SIMP (typ='I',defaut=20,statut='f',fr="Nombre maximal d'iterations de calcul de diffusion") ),
+      PrecisionValeurPropre = SIMP (typ='R',defaut=1.E-5,statut='f',fr="Precision sur la valeur propre"),
+      PrecisionFlux = SIMP (typ='R',defaut=1.E-3,statut='f',fr="Precision sur le flux"),
+      PrecisionResolutionMultigroupe = SIMP (typ='R',defaut=1.E-6,statut='f',fr="Precision de la resolution multigroupe"),
+      PrecisionIterationTermeDiffusion = SIMP (typ='R',defaut=1.E-6,statut='f',fr="Precision des iterations sur le terme de diffusion"),
+      MaxIterationsEnEnergie = SIMP (typ='I',defaut=1,statut='f',fr="Nombre maximal d'iterations pour la resolution Gauss Seidel en energie"),
+      MaxIterationsTermeDiffusion = SIMP (typ='I',defaut=1,statut='f',fr="Nombre maximal d'iterations sur le terme de diffusion"),
+      MaxIterationsDecompositionDomaine = SIMP (typ='I',defaut=1,statut='f',fr="Nombre d'iterations de decomposition de domaine"),
+      MaxIterationsKeffAvantCR = SIMP (typ='I',defaut=1,statut='f',fr="Nombre de calculs de keff avant appel aux contre-reactions"),
+      GestionAutomatiquePasCinetique = SIMP (typ='TXM',defaut='Oui',into=('Oui','Non'),statut='f',fr="Gestion automatique du pas de temps du calcul cinetique"),
+      PrecisionIterationsFluxPrecurseurs = SIMP (typ='R',defaut=1.E-6,statut='f',fr="Precision sur les iterations Flux Precurseurs"),
+      PrecisionParametreGestionAutomatique = SIMP (typ='R',defaut=0.0008,statut='f',fr="Precision sur les iterations Flux Precurseurs"),
+      MaxIterationsFluxPrecurseurs = SIMP (typ='I',defaut=50,statut='f',fr="Nombre maximal d'iterations Flux Precurseurs"),
+      ThetaSchemaCinetique = SIMP (typ='R',defaut=0.5,statut='f',fr="Valeur du parametre theta du schema cinetique") ),
+#  ------------------------------------------------------------------------------------------------------------------------------------
+   OptionsThermiqueThermohydraulique = FACT (
+       CoefficientEchangeGaineFluide = SIMP (typ='TXM',defaut='DITTUS_BOELTER',into=('FLICA','DITTUS_BOELTER'),statut='f',
+                                             fr="Option du Coefficient d'échange gaine-fluide (flux < au flux critique)"),
+       CoefficientEchangeGaineFluideEbullition = SIMP (typ='TXM',defaut='BST',into=('BST','TONG'),statut='f',
+                                                       fr="Option du Coefficient d'échange gaine-fluide (Ebullition en film)"),
+       CoefficientEchangeJeuPastilleGaineConstantTransitoire = SIMP (typ='TXM',defaut='Non',into=('Non','Oui'),statut='f',
+                                                                     fr="Option de constance des coefficients d'échange gap"),
+       CoefficientEchangeJeuPastilleGaine = SIMP (typ='TXM',defaut='HGAP_88',into=('EJECTION','TUO2','PLIN_BU','FIXE','HGAP_88'),statut='f',
+                                                       fr="Option du Coefficient d'échange du jeu pastille-gaine"),
+       BlocHgapTuo2    = BLOC (condition = "CoefficientEchangeJeuPastilleGaine=='TUO2'",
+                                 Tuo2Initiale = SIMP (typ='R',statut='o',
+                                                      fr="Température initiale combustible pour le calcul du coefficient d'échange") ),
+       BlocHgapFixe    = BLOC (condition = "CoefficientEchangeJeuPastilleGaine=='FIXE'",
+                                 Hgap = SIMP (typ='R',statut='o',defaut=5850.,fr="Valeur imposée du coefficient d'échange") ),
+       ConductiviteCombustible = SIMP (typ='TXM',defaut='HGAP_88',into=('STORA','WESTINGHOUSE','HGAP_88','COMETHE'),statut='f',
+                                                       fr="Option du Coefficient de conductivité du combustible"),
+       CapaciteCalorifiqueCombustible = SIMP (typ='TXM',defaut='UO2_FRAMATOME',into=('UO2_BATES','UO2_FRAMATOME','UO2_THYC'),statut='f',
+                                                       fr="Option du Coefficient de conductivité du combustible"),
+       MateriauGaine = SIMP (typ='TXM',defaut='ZIRCALOY_CYRANO',into=('ZIRCALOY_CYRANO', 'ZIRCALOY_THYC', 'INCOLOY_800',
+                                                                    'CHROMESCO_3', 'INOX_16', 'INOX_321', 'INOX_347', 'INOX_347_OXYDE',
+                                                                    'INCONEL_600', 'NICKEL_75', 'PLATINE'),statut='f',
+                           fr="Materiau de la gaine pour le calcul du roCp de la gaine et de sa conductivite"),
+       FluxCritique = SIMP (typ='R',defaut=180.E4,fr="Valeur du flux critique en W/m2"),
+       FractionPuissanceCombustible = SIMP (typ='R',defaut=0.974,fr="Fraction de la puissance degagee dans le combustible"),
+       Creusement = SIMP (typ='TXM',defaut='Uniforme',statut='f',into=('Uniforme','Runnals','Framatome','Twinkle','Mox','EDF','Specifique')),
+       BlocCreusement  = BLOC (condition = "Creusement=='Specifique'", 
+                           RayonsCreusement = SIMP (typ='R',statut='o',fr="Rayons de definition du creusement de puissance (nz)"),
+                           IrradiationsCreusement = SIMP (typ='R',statut='o',fr="Irradiations de definition du creusement de puissance (nbu)"),
+                           EnrichissementsCreusement = SIMP (typ='R',statut='o',fr="Enrichissements de definition du creusement de puissance (nen)"),
+                           PuissancesUO2 = SIMP (typ='R',max='**',statut='f',fr="Valeurs des creusements de puissance P(nz,nbu,nen) dans une pastille UO2"),
+                           PuissancesMOX = SIMP (typ='R',statut='f',fr="Valeurs des creusements de puissance P(nz,nbu,nen) dans une pastille MOX") ),
+       DiscretisationPastilleCombustible = SIMP (typ='I',defaut=4,statut='f',fr="Nombre de points de discretisation radiale de la pastille combustible"),
+       DiscretisationGaine = SIMP (typ='I',defaut=2,statut='f',fr="Nombre de points de discretisation radiale de la gaine de la pastille combustible"),
+       PrecisionCalculThermique = SIMP (typ='R',defaut=0.1,fr="Precision en Celsius du calcul thermique radiale du crayon"),
+       PrecisionCalculThermohydraulique = SIMP (typ='R',defaut=0.01,fr="Precision en Celsius du calcul thermohydraulique de la temperature du moderateur"),
+       MaxIterationsThermique = SIMP (typ='I',defaut=100,statut='f',fr="Nombre maximum d'iterations du calcul de thermique"),
+       MaxIterationsThermohydraulique = SIMP (typ='I',defaut=100,statut='f',fr="Nombre maximum d'iterations du calcul de thermohydraulique"),
+       MethodeIntegrationThermohydraulique = SIMP (typ='TXM',defaut='Gauss',statut='f',into=('Gauss','NonGauss'),fr="Methode d'integration thermohydraulique"),
+       PerteDeCharge = SIMP (typ='TXM',defaut='Non',statut='f',into=('Non','Oui'),fr="Prise en compte ou non de la perte de charge axiale"),
+       TableEau = SIMP (typ='TXM',defaut='Thetis',statut='f',into=('Thetis','Interne'),
+                        fr="Calcul des caracteristiques du moderateur par THETIS ou par des tables internes") ),
+#  ----------------------------------------------------------------------------------------------------------------------------------
+   OptionsContreReactions = FACT (
+       ContreReactions = SIMP (typ='TXM',defaut='Oui',into=('Oui','Non'),fr="Prise en compte des contre-reactions ou non"),
+       PrecisionPuissance = SIMP (typ='R',defaut=1.E-4,fr="Precision sur la puissance a la fin des iterations de contre-reactions"),
+       PrecisionKeff = SIMP (typ='R',defaut=1.E-5,fr="Precision sur keff a la fin des iterations de contre-reactions"),
+       MethodeCalculSection = SIMP (typ='TXM',defaut='Spline1D',into=('Spline1D','SplinenD','Tabulation'),
+                                    fr="Methode de calcul des sections efficaces avec Contre-reactions") )
+ ) ; # Fin OPTIONS_CODES
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DONNEES_GENERALES_ETUDE :     Classe de definition des caracteristiques globales de l'etude
+#                                       Definition de la centrale (site, numero de tranche) et numero de campagne d'irradiation
+#                                       Ces caracteristiques  d'environnement de l'etude doivent permettre de recuperer l'ensemble 
+#                                       des parametres de fonctionnement nominales du reacteur sujet de l'etude (creation de
+#                                       bibliotheques ou calcul de coeur)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DONNEES_GENERALES_ETUDE = OPER (nom="DONNEES_GENERALES_ETUDE",op=0,sd_prod=DonneesGeneralesEtude,
+
+  fr                     = "Definition de la centrale sujet de l'etude et des options globales de l'etude",
+  ang = "Definition of the power plant and of the global options",
+  TypeCode              = SIMP (typ='TXM',defaut='Reseau',into=('Reseau','Coeur'),statut='o'),
+  SiteNucleaire          = SIMP (typ=SiteNucleaire,defaut='TRICASTIN',statut='o'),
+  BlocCoeur              = BLOC (condition = "TypeCode=='Coeur'",
+                           NumeroTranche          = SIMP (typ='I',defaut=1,statut='f'),
+                           NumeroCampagne         = SIMP (typ='I',defaut=1,statut='f'),
+                           IdentificateurCampagne = SIMP (typ='TXM',defaut='TN101',statut='f'),
+                           DatesCampagne          = SIMP (typ=DateClesCampagne,statut='f'),
+                           TypeGestion            = SIMP (typ    = 'TXM',
+                                                          defaut = '370Q',
+                                                          statut = 'f',
+                                                          into   = ('310Q','310T','325T','325Q','340Q','345AL',
+                                                                    '370Q','370T','400T','HMOX','MOXNT','TMOX')),
+                           TypeSchemaGrappe       = SIMP (typ    = 'TXM',
+                                                          defaut = '900CPYUO2',
+                                                          statut = 'f',
+                                                          into   = ('900CP0','900CPYUO2INITIAL','900CPYUO2',
+                                                                    '900CPYUO2AL','900CPYMOX','1300','N4')),
+                           PositionGrappe        = SIMP (typ=PositionGrappesCommande,statut='f'),
+                           TypeEvaluationSurete  = SIMP (typ='TXM',defaut='900STD',statut='f',
+                                                         into=('900STD','900GARANCE','1300STD','1300GEMMES','N4STD')),
+                           ModePilotage          = SIMP (typ='TXM',defaut='G',statut='f',into=('A','G','X')),
+                           PlanChargement        = SIMP (typ=Reseau,statut='f'),
+                           CodeCalcul            = SIMP (typ='TXM',defaut='SNCODE',statut='f')),
+  BlocReseau            = BLOC (condition = "TypeCode=='Reseau'",
+                           Assemblage            = SIMP (typ=AssemblageType,statut='f'),
+                           ContreReactions       = SIMP (typ=EspaceVariations,statut='f'),
+                           CodeCalcul            = SIMP (typ='TXM',defaut='SUNSET',statut='f')),
+  ConditionsMoyennes    = SIMP (typ=ConditionsFonctionnementMoyennes,statut='f'),
+  Options               = SIMP (typ=OptionsCodes,statut='f'),
+  PasIrradiation        = SIMP (typ=DonneesEvolutionIrradiation,statut='f'),
+# ConditionLimite       = SIMP (typ=ConditionLimiteGenerale,statut='o'),
+  TypeCalcul            = SIMP (typ='TXM',max='**',defaut='Evolution',
+                                into=('Evolution','EvolutionMicroscopique','Reprise','Statique','Cinetique',
+                                      'BoreImpose','BoreCritique'),statut='f')
+ ) ;
+class resultat(TObjet): pass
+class resultat2(resultat): pass
+
+CALCUL=OPER(nom="CALCUL",op=10,sd_prod=resultat,
+             materiau=SIMP(typ=Materiau),
+            PRESSION=SIMP(defaut=10000.,typ="R")
+           );
+
+CALCUL2=OPER(nom="CALCUL2",op=11,sd_prod=resultat2,
+             donnee=SIMP(typ=resultat),
+             materiau=SIMP(typ=Materiau),
+            );
+
diff --git a/Descartes/cata_descartes_new.py b/Descartes/cata_descartes_new.py
new file mode 100755 (executable)
index 0000000..bd36059
--- /dev/null
@@ -0,0 +1,3084 @@
+# debut entete
+
+import Accas
+from Accas import *
+#
+
+JdC = JDC_CATA(code='DESCARTES',
+               execmodul=None,
+               niveaux=(NIVEAU(nom='Isotopes',label='Donnees des Isotopes ou molecules et Bibliotheques associees'),
+                        NIVEAU(nom='ChaineFiliationIsotopique',label='Chaines de filiation isotopique'),
+                        NIVEAU(nom='MaillagesEnergie',label='Maillages en energie'),
+                        NIVEAU(nom='DonneesNucleaires',label='Bibliotheques de donnees nucleaires et Fichiers'),
+                        NIVEAU(nom='Materiaux',label='Materiaux'),
+                        NIVEAU(nom='ElementsGeometriques',label='Elements geometriques elementaires'),
+                        NIVEAU(nom='Geometries',label='Geometries globales'),
+                        NIVEAU(nom='MaillagesSpatiaux',label='Maillages en espace'),
+                        NIVEAU(nom='ElementsTechnologiquesAssemblages',label='Elements technologiques des assemblages combustibles'),
+                        NIVEAU(nom='ElementsTechnologiquesReacteur',label='Elements technologiques des reacteurs'),
+                        NIVEAU(nom='AssemblagesReels',label='Assemblages combustibles reels'),
+                        NIVEAU(nom='ConditionsLimites',label='Conditions aux limites'),
+                        NIVEAU(nom='ParametresCalcul',label='Parametres des calculs'),
+                        NIVEAU(nom='SectionsEfficaces',label ='Bibliotheques de sections efficaces'),
+                        NIVEAU(nom='OptionsCodesCalcul',label='Options des codes de calcul'),
+                        NIVEAU(nom='ConfigurationInformatique',label='Choix des ressources informatiques'),
+                        NIVEAU(nom='DonneesDesAccidents',label ='Donnees des etudes d_accidents'),
+                        NIVEAU(nom='DonneesPilotage',label ='Donnees de pilotage du reacteur'),
+                        NIVEAU(nom='DonneesEtude',label ='Donnees des cas de l etude'),
+                        NIVEAU(nom='Operateurs',label ='Definition des operateurs de calcul'),
+                        NIVEAU(nom='Resultats',label ='Resultats des calculs'),
+                        NIVEAU(nom='ResultatsExperimentaux',label ='Resultats issus de mesures experimentales'),
+                        NIVEAU(nom='ResultatsAccidents',label ='Resultats issus de la simulation des accidents'),
+                        NIVEAU(nom='EtudeGenerale',label ="Cas d'etude et resultats")
+                       )
+              )
+
+import string
+#import lcm
+
+class TObjet(ASSD):
+  def __init__(self,**args):
+    apply(ASSD.__init__,(self,),args)
+    name=string.ljust(self.__class__.__name__[:12],12)
+
+  def __getitem__(self,attrname):
+    return self.etape[attrname]
+
+  def db(self):
+    if hasattr(self,'_dbsun'):return self._dbsun
+    else:
+      self._dbsun={'t':1}
+      return self._dbsun
+
+  def putdb(self,o):
+    self._dbsun=o
+
+#
+# Definition des types d'objet qui seront produits par les commandes
+# Il suffit de declarer une classe qui derive de la classe mere TObjet
+# qui derive elle meme de la classe ASSD utilisee dans EFICAS
+#
+#     Isotopes
+class Isotope                          (TObjet):pass
+#     ChaineFiliationIsotopique
+class ChaineFiliation                  (TObjet):pass
+#     MaillagesEnergie
+class BornesEnergie                    (TObjet):pass
+#     DonneesNucleaires
+class FichierBibliothequeIsotopes      (TObjet):pass
+#     Materiaux
+class Materiau                         (TObjet):pass
+#     MaillagesSpatiaux
+class Maillage1D                       (TObjet):pass
+#     ElementsGeometriques
+class Point                            (TObjet):pass
+class Vecteur                          (TObjet):pass
+class Droite                           (TObjet):pass
+class Segment                          (TObjet):pass
+class ArcCercle                                (TObjet):pass
+class SecteurDisque                    (TObjet):pass
+class Conique                          (TObjet):pass
+class Triangle                         (TObjet):pass
+class Rectangle                                (TObjet):pass
+class Carre                            (TObjet):pass
+class Hexagone                         (TObjet):pass
+class Polygone                         (TObjet):pass
+class Sphere                           (TObjet):pass
+class BoiteRectangulaire               (TObjet):pass
+class BoiteGenerale                    (TObjet):pass
+class CylindreX                                (TObjet):pass
+class CylindreY                                (TObjet):pass
+class CylindreZ                                (TObjet):pass
+class Cylindre                         (TObjet):pass
+class Cone                             (TObjet):pass
+class PrismeHexagonal                  (TObjet):pass
+class Tore                             (TObjet):pass
+class Plan                             (TObjet):pass
+class PlanX                            (TObjet):pass
+class PlanY                            (TObjet):pass
+class PlanZ                            (TObjet):pass
+class Polyedre                         (TObjet):pass
+class Quadrique                                (TObjet):pass
+class Orientation                      (TObjet):pass
+class FormePositionnee                 (TObjet):pass
+#     Geometries
+class Cellule                          (TObjet):pass
+class Cluster                          (TObjet):pass
+class GeometrieSurfacique              (TObjet):pass
+class GeometrieCombinatoire            (TObjet):pass
+class Reseau                           (TObjet):pass
+class DecompositionDomaines            (TObjet):pass
+#     ElementsTechnologiquesAssemblages
+class GrilleAssemblage                         (TObjet):pass
+class PartieInferieureAssemblageCombustible    (TObjet):pass
+class PartieSuperieureAssemblageCombustible    (TObjet):pass
+class AssemblageType                           (TObjet):pass
+class ElementBarre                             (TObjet):pass
+class ElementsGrappeCommande                   (TObjet):pass
+class ElementsAbsorbantsFixes                  (TObjet):pass
+class GrappeBouchonAssemblage                  (TObjet):pass
+#     AssemblagesReels
+class AssemblageCombustibleReel                (TObjet):pass
+class ReparationAssemblage             (TObjet):pass
+class PenaliteAssemblage               (TObjet):pass
+#class SystemeUnitesMesure             (TObjet):pass
+#     ConditionsLimites
+class Vide                             (TObjet):pass
+class ReflexionIsotrope                        (TObjet):pass
+class ReflexionSpeculaire              (TObjet):pass
+class Albedo                           (TObjet):pass
+class Translation                      (TObjet):pass
+class Rotation                         (TObjet):pass
+class SpecialeConditionLimite          (TObjet):pass
+class GeneraleConditionLimite          (TObjet):pass
+#     ElementsTechnologiquesReacteur
+class CorrespondanceReperePositionReseau(TObjet):pass
+class PositionAssemblageCombustible    (TObjet):pass
+class PositionInstrumentationInterne   (TObjet):pass
+class ImplantationGrappesCommande      (TObjet):pass
+class StructuresInternesReacteur       (TObjet):pass
+class PompePrimaire                    (TObjet):pass
+class Pressuriseur                     (TObjet):pass
+class GenerateurVapeur                 (TObjet):pass
+class CaracteristiquesPalier           (TObjet):pass
+class SiteNucleaire                    (TObjet):pass
+#     ParametresCalcul
+class EspaceVariations                 (TObjet):pass
+class DonneesIrradiation               (TObjet):pass
+class ConditionsFonctionnementMoyennes (TObjet):pass
+class ConditionsTransitoire            (TObjet):pass
+class PositionAxialeGrappesCommande    (TObjet):pass
+class ParametresCalculGestion          (TObjet):pass
+#     SectionsEfficaces
+class Macrolib                         (TObjet):pass
+class SectionsReflecteur               (TObjet):pass
+#     OptionsCodesCalcul
+class OptionsAutoprotection            (TObjet):pass
+class OptionsCodes                     (TObjet):pass
+class OptionsCodeReseau                        (TObjet):pass
+class OptionsCodeCoeurStatique         (TObjet):pass
+class OptionsCodeCoeurCinetique                (TObjet):pass
+class OptionsThermiqueThermohydraulique        (TObjet):pass
+class OptionsContreReactionsCoeur      (TObjet):pass
+#     ConfigurationInformatique
+class RessourcesInformatiques          (TObjet):pass
+#     DonneesDesAccidents
+class AccidentDilution                 (TObjet):pass
+class AccidentRTV                      (TObjet):pass
+class AccidentChuteGrappe              (TObjet):pass
+class AccidentEjection                 (TObjet):pass
+class CriteresSurete                   (TObjet):pass
+class DonneesAccidents                 (TObjet):pass
+#     DonneesPilotage
+class ProlongationCampagne             (TObjet):pass
+class DonneesPilotageGeneral           (TObjet):pass
+class CalibrageGroupes                 (TObjet):pass
+#     DonneesEtude
+class DatesClesCampagne                        (TObjet):pass
+class DonneesCasEtude                  (TObjet):pass
+class DonneesAjustement                        (TObjet):pass
+#     Resultats
+class ResultatsGlobauxCoeur            (TObjet):pass
+class ResultatFlux                     (TObjet):pass
+class ResultatPuissances               (TObjet):pass
+class ResultatIrradiations             (TObjet):pass
+class ResultatActivites                        (TObjet):pass
+class ResultatRadial                   (TObjet):pass
+class ResultatAxial                    (TObjet):pass
+class ResultatsCalculGestion           (TObjet):pass
+class ResultatsEtude                   (TObjet):pass
+#     ResultatsAccidents
+class AccidentDilutionResultat         (TObjet):pass
+class AccidentChuteGrappeResultat      (TObjet):pass
+class AccidentEjectionResultat         (TObjet):pass
+class AccidentsResultats               (TObjet):pass
+#     ResultatsExperimentaux
+class ActivitesExperimentales          (TObjet):pass
+#     EtudeGenerale
+class DictionnaireCasEtude             (TObjet):pass
+# fin entete
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ISOTOPE : Classe de definition d'un isotope ou d'une molecule
+#                   Caracteristiques elementaires des isotopes ou molecules et liens avec les bibliotheques de donnees nucleaires
+#                   Ces caracteristiques elementaires ne devraient pas apparaître dans ce type d'objet, mais etre recuperees directement
+#                   dans la bibliotheque de donnees de base. La structure des APOLLIB n'etant pas simple d'acces, la solution
+#                   adoptee permet de mettre a disposition ces informations de maniere simple. A revoir ulterieurement
+#                   apres redefinition du contenu d'une bibliotheque de base.
+#                   La decomposition en éléments chimiques simples est utile pour les calculs de type TRIPOLI, les données nucléaires
+#                   étant définies parfois pour chaque élément et non pour la molécule (cas de l'eau par exemple)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ISOTOPE = OPER (nom="ISOTOPE", sd_prod=Isotope, op=0, niveau = 'Isotopes',
+  fr  = "Definition d'un isotope ou d'une molecule et de ses bibliotheques",
+  ang = "Isotope or Molecule definition and data libraries",
+  Symbole                = SIMP (typ='TXM',statut='o',fr="Symbole de l'isotope ou de la molecule"),
+  MasseAtomique          = SIMP (typ='R',  statut='o',fr="Masse atomique en uma"),
+  NombreDeCharge         = SIMP (typ='I',  statut='o',fr="Nombre de charge atomique Z"),
+  NombreDeMasse          = SIMP (typ='I',  statut='o',fr="Nombre de masse atomique A"),
+  Type                   = SIMP (typ='TXM',statut='f',into=('Standard','Detecteur','Structure','Poison'),fr="Type de l'isotope"),
+  NomsBibliotheque       = NUPL (max = '**', statut = 'o',fr="Association Procedure Bibliotheque et Nom isotope dans le Fichier",
+                                 elements = ( SIMP (typ='TXM',fr="Identificateur Procedure Bibliotheque"),
+                                              SIMP (typ='TXM',fr="Identifiant de l'isotope dans la bibliotheque"))),
+  NomsBiblioAutoprotegee = NUPL (max = '**', statut = 'f',
+                                 elements = ( SIMP (typ='TXM',fr="Identificateur Procedure Bibliotheque"),
+                                              SIMP (typ='TXM',fr="Identifiant Bibliotheque autoprotegee de l'isotope"))),
+  ComposantsElementaires = SIMP (typ=Isotope, max = '**', statut = 'f',
+                                 fr="Liste des elements chimiques composant la molecule")
+ ) ;
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe BORNES_ENERGIE : Classe de definition des limites en energie d'un maillage multigroupe
+#                          Objets utilises pour la définition du maillage des bibliothèques de base
+#                          ou des macro-groupes d'énergie de condensation des sections efficaces sur le flux détaillé
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+BORNES_ENERGIE = OPER (nom="BORNES_ENERGIE", sd_prod=BornesEnergie, op=0, niveau = 'MaillagesEnergie',
+    fr  = "Definition d'une discretisation de l'espace energetique",
+    ang = "Definition of an energy discretisation",
+    NbMacrogroupes     = SIMP (statut='o',typ='I',         fr="Nombre de macrogroupes du maillage energetique"),
+    BornesEnergetiques = SIMP (statut='o',typ='R',max='**',fr="Bornes en energie (MeV) du maillage energetique"),
+ ) ; # Fin BORNES_ENERGIE
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe MAILLAGE_1D : Classe de definition d'un maillage spatial 1D : 4 possiblilites de definition :
+#  1 et 2) Equidistant et Equivolumique : Largeur totale a fournir
+#       3) Liste des dimensions des mailles
+#       4) Abscisse initiale et couples (Nb sous-pas, Abscisse suivante)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+MAILLAGE_1D = OPER (nom="MAILLAGE_1D", sd_prod=Maillage1D, op=0, niveau = 'MaillagesSpatiaux',
+    fr  = "Definition d'une discretisation d'un espace 1D",
+    ang = "Definition of a 1D spatial discretisation",
+    ModeDefinition  = SIMP (typ='TXM',statut='o',defaut='LargeurMaille',into=('Equidistant','Equivolumique','LargeurMaille','SousMaille'),
+                            fr="Mode de definition du maillage"),
+    NbMailles       = SIMP (typ='I',statut='o',fr="Nombre de mailles de discretisation"),
+    BlocEqui        = BLOC (condition = "ModeDefinition=='Equidistant' or ModeDefinition=='Equivolumique'",
+                            DimensionTotale = SIMP (typ='R',statut='o',fr="Largeur totale du maillage en cm")
+                            ),
+    BlocMailles     = BLOC (condition = "ModeDefinition=='LargeurMaille'",
+                            LargeursMailles = SIMP (typ='R',max='**',statut='o',fr="Largeurs des mailles en cm")
+                             ),
+    BlocSousMailles = BLOC (condition = "ModeDefinition=='SousMaille'",
+                            SousMailles = SIMP (typ=('I','R'),max='**',statut='o',fr="Abscisse initiale et couples (Nb sous-pas, Abscisse suivante)")
+                            )
+    ) ; # Fin MAILLAGE_1D
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe FICHIER_BIBLIOTHEQUE_ISOTOPES : Classe de definition des fichiers des bibliotheques des donnees nucleaires d'isotopes ou de molecules
+#                                         Noms et formats des fichiers d'isotopes suivant le systeme d'exploitation
+#                                         Dans le cas de TRIPOLI 4, on fournit le nom du dictionnaire ou se trouve la description des
+#                                         isotopes disponibles pour le code et le chemin d'accès aux fichiers de sections de ces isotopes
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+FICHIER_BIBLIOTHEQUE_ISOTOPES = OPER (nom="FICHIER_BIBLIOTHEQUE_ISOTOPES", sd_prod=FichierBibliothequeIsotopes, op=0, niveau = 'DonneesNucleaires',
+  fr  = "Definition d'une bibliotheque de donnees nucleaires des isotopes",
+  ang = "Definition of a nuclear data isotope library",
+  Description = SIMP (typ='TXM',statut='o',fr="Identificateur Bibliotheque ou Dictionnaire"),
+  Fichiers    = FACT (max='**', statut='o',fr="Donnee des fichiers associes a la bibliotheque et du maillage energetique",
+                      SystemeExploitation  = SIMP (typ='TXM',statut='o',fr="Systeme d'exploitation du reseau informatique"),
+                      NomFichier           = SIMP (typ='TXM',statut='o',fr="Nom du fichier de la bibliotheque de donnees de base"),
+                      FormatFichier        = SIMP (typ='TXM',statut='o',fr="Format du fichier"),
+                      BornesEnergetiques   = SIMP (typ=BornesEnergie,statut='o',fr="Bornes en MeV du maillage en energie")
+                     )
+  ) ; # Fin FICHIER_BIBLIOTHEQUE_ISOTOPES
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CHAINE_FILIATION : Classe de definition des filiations isotopiques dues aux transmutations
+#                            sous irradiation neutronique.
+#                            Description textuelle sous format (APOLLO2, SUNSET ou DARWIN)
+#                            ou description particuliere des filiations.
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CHAINE_FILIATION = OPER (nom="CHAINE_FILIATION", op=0, sd_prod=ChaineFiliation, niveau = 'ChaineFiliationIsotopique',
+  fr              = "Definition d'une chaine de filiation isotopique sous irradiation",
+  ang             = "Definition of a depletion chain",
+  NombreIsotopes  = SIMP (typ='I'  ,statut='o',fr="Nombre d'isotopes decrits dans la chaine"),
+  ChaineAPOLLO2   = SIMP (typ='TXM',statut='f',fr="Description de la chaine sous format APOLLO2"),
+  ChaineSUNSET    = SIMP (typ='TXM',statut='f',fr="Description de la chaine sous format SUNSET"),
+  ChaineDARWIN    = SIMP (typ='TXM',statut='f',fr="Nom du fichier contenant la description DARWIN de la chaine"),
+  ListeIsotopes   = FACT (max = '**',statut = 'f',
+                          Isotope = SIMP (typ=Isotope,fr="Nom de l'isotope",statut='o'),
+                          Peres   = FACT (max = '**',statut = 'o',
+                                          IsotopePere        = SIMP (statut='o',typ=Isotope,fr="Nom de l'isotope pere"),
+                                          TypeReaction       = SIMP (statut='o',typ='TXM'  ,fr="Type de reaction nucleaire",
+                                                                     into=('nGamma','n2n','n3n','n4n','np','nalpha')),
+                                          RapportBranchement = SIMP (statut='o',typ='R'    ,fr="Rapport de branchement",defaut=1.)
+                                         )
+                         )
+ ) ; # Fin CHAINE_FILIATION
+# regles = (UN_PARMI ('ChaineAPOLLO2','ChaineSUNSET','ChaineDARWIN','ListeIsotopes'),),
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe MATERIAU : Classe de définition d'un matériau à partir de mélange d'isotopes ou de matériaux.
+#                    Définition alternative par donnée des enrichissements (Possibilités limitées aux combustibles UO2, MOX, Gd)
+#                    Caractéristiques fournies a 20 C.
+#                    Proprietes thermiques et thermomécaniques éventuelles
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+MATERIAU = OPER(nom="MATERIAU", op=0, sd_prod=Materiau, niveau = 'Materiaux',
+  fr  = "Definition d'un materiau",
+  ang = "Definition of a mixture",
+  TypeDefinition       = SIMP (typ='TXM',statut='o',defaut="Isotopique",into=("Isotopique","Enrichissement")),
+  TypeMateriau         = SIMP (statut = 'o', typ = 'TXM',     
+                               into   = ('Combustible','Absorbant','Melange','ModerateurInterne','ModerateurExterne','Detecteur',
+                                         'Grille','Gaine','Tube','Poison','PoisonConsommable','AbsorbantIntegre',
+                                         'CoucheCorrosion','Solide','Liquide','Gaz','MateriauVide'),
+                               defaut = 'Combustible'),
+  BlocIsotopique       = BLOC (condition = "TypeDefinition=='Isotopique'",
+                               MethodeMelange = SIMP (statut   = 'o',typ='TXM',into=('Isotopique','Massique','Concentration'),defaut='Massique'),
+                               Constituants   = NUPL (statut   = 'o', max = '**',
+                                                      fr       = "Couples (Isotope ou Materiau) et (Pourcentage ou Concentration)",
+                                                      elements = (SIMP (typ=(Isotope,Materiau),fr="Isotope ou Materiau constituant"),
+                                                                  SIMP (typ='R',fr="Pourcentage % ou Concentration 10E24 de l'isotope ou du materiau"))
+                                                      )
+                               ),
+  BlocEnrichissement   = BLOC (condition = "TypeDefinition=='Enrichissement'",
+        Type                 = SIMP (typ='TXM',into=('UO2','MOX','UO2Gadolinium','MOXGadolinium'),statut='o',defaut='UO2',fr="Type de combustible"),
+        U235Enrichissement   = SIMP (typ='R',defaut=3.7,statut='o',val_min=0.,val_max=100.,
+                                     fr="Enrichissement % en U235 du combustible"),
+        TeneurU234Naturel    = SIMP (typ='R',defaut=110.,statut='f',fr="Teneur (ppm) en U234 de l'uranium naturel"),
+        DonneesGado          = BLOC (condition = "Type=='UO2Gadolinium' or Type=='MOXGadolinium'",
+                                     EnrichissementGado   = SIMP (typ=('R','TXM'),defaut=8.,statut='o',fr="Enrichissement % en Gd2O3 du combustible")),
+        DonneesMOX           = BLOC (condition = "Type=='MOX' or Type=='MOXGadolinium'",
+                                     PuEnrichissement     = SIMP (typ=('R','TXM'),defaut=5.3,statut='o',val_min=0.,val_max=100.,
+                                                                  fr="Enrichissement % en plutonium du combustible"),
+                                     VecteurPu            = FACT (statut='o',fr="Definition du vecteur isotopique du plutonium",
+                                                                 Pu238PourcentageMassique = SIMP (typ='R',statut='o',fr="Pourcentage Massique en Pu238"),
+                                                                 Pu239PourcentageMassique = SIMP (typ='R',statut='o',fr="Pourcentage Massique en Pu239"),
+                                                                 Pu240PourcentageMassique = SIMP (typ='R',statut='o',fr="Pourcentage Massique en Pu240"),
+                                                                 Pu241PourcentageMassique = SIMP (typ='R',statut='o',fr="Pourcentage Massique en Pu241"),
+                                                                 Pu242PourcentageMassique = SIMP (typ='R',statut='o',fr="Pourcentage Massique en Pu242"),
+                                                                 Am241PourcentageMassique = SIMP (typ='R',statut='o',fr="Pourcentage Massique en Am241"),
+                                                                ),
+                                     DateReference        = SIMP (typ='I',min=3,max=3,statut='o',fr="Date J M A de reference du combustible"),
+                                     DateDivergence       = SIMP (typ='I',min=3,max=3,statut='o',fr="Date J M A de divergence du reacteur ou ce combustible est charge"),
+                                     VieillissementJours  = SIMP (typ='R',defaut = 0.,statut = 'f',
+                                                                 fr = "Nbre de jours de vieillissement du combustible, calculable si on donne DateDivergence")
+                                     )
+                              ),
+  TauxEvidement        = SIMP (statut='f',typ='R',fr="Taux % d'evidement du materiau"),
+  TauxPorosite         = SIMP (statut='f',typ='R',fr="Taux % de porosite du materiau"),
+  Temperature          = SIMP (statut='f',typ='R',fr="Temperature en Celsius du materiau"),
+  PlenumGaz            = SIMP (statut='f',typ=(Isotope,Materiau),defaut='HE4',fr="Gaz de remplissage des evidements du materiau solide et dans le plenum"),
+# PlenumGaz            = SIMP (statut='f',typ=(Isotope,Materiau),fr="Gaz de remplissage des evidements du materiau solide et dans le plenum"),
+  PressionPlenumGaz    = SIMP (statut='f',typ='R',defaut=32.,fr="Pression en bars du gaz de remplissage des evidements et dans le plenum"),
+  Chaine              = SIMP (statut='f',typ=ChaineFiliation,defaut='ChaineSaturee',fr="Chaine de filiation isotopique associee au materiau"),
+  TauxImpuretes        = SIMP (statut='f',typ='R',fr="Taux % d'impuretes"),
+  ChaleurSpecifiquePressionCte  = SIMP (statut='f',typ='R',fr="Chaleur Specifique a Pression Constante J/(kg.C)"),
+  ConductiviteThermique = SIMP (statut='f',typ='R',fr="Conductivite Thermique W/(cm.C)"),
+  MateriauGazBloc       = BLOC (condition = "TypeMateriau=='Gaz'",
+                                GazLongueurExtrapolation = SIMP (statut='f',typ='R',fr="Longueur Extrapolation en cm"),
+                                GazPression              = SIMP (statut='f',typ='R',fr="Pression du gaz en bars")
+                               ),
+  MateriauLiquideBloc   = BLOC (condition = "TypeMateriau in ('Liquide','ModerateurInterne','ModerateurExterne')",
+                                RoLiquide             = SIMP (statut='f',typ='R',fr="Masse volumique theorique du liquide g/cm3"),
+                                PressionLiquide       = SIMP (statut='f',typ='R',fr="Pression du liquide en bars"),
+                                EbullitionTemperature = SIMP (statut='f',typ='R',fr="Temperature Ebullition en Celsius"),
+                                EbullitionPression    = SIMP (statut='f',typ='R',fr="Pression Ebullition en bars")
+                               ),
+  MateriauSolideBloc    = BLOC (condition = "TypeMateriau not in ('Liquide','ModerateurInterne','ModerateurExterne','Gaz','MateriauVide')",
+                                RoSolide           = SIMP (statut='f',typ='R',fr="Masse volumique theorique du materiau g/cm3"),
+                                DilatationLineaire = SIMP (statut='f',typ='R',fr="Coefficient de dilatation thermique lineaire cm/C du materiau"),
+                                LimiteElastique    = SIMP (statut='f',typ='R',fr="Limite Elastique en Pa"),
+                                Fluence            = SIMP (statut='f',typ='R',fr="Fluence subie par le materiau en n/cm2"),
+                                Emissivite         = SIMP (statut='f',typ='R',fr="Valeur d'emissivite"),
+                                ModuleYoung        = SIMP (statut='f',typ='R',fr="Module d'Young en Pa"),
+                                CoefficientPoisson = SIMP (statut='f',typ='R',fr="Coefficient de Poisson"),
+                                RugositeSurface    = SIMP (statut='f',typ='R',fr="Rugosite de Surface en cm")
+                               )
+ ) ; # Fin MATERIAU
+# ==================================================================================================================================
+#                                    Definition des Classes elementaires pour la geometrie
+# ==================================================================================================================================
+#  Classe POINT : Classe de definition d'un point de l'espace
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POINT = OPER (nom="POINT", op=0, sd_prod=Point, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un point de l'espace",
+  ang = "Definition of a point in space",
+  Coordonnees = SIMP (typ='R',min=2,max=3,statut='o',fr="Coordonnees du point dans l'espace")
+ ) ;# Fin POINT
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe VECTEUR : Classe de definition d'un vecteur dans l'espace
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+VECTEUR = OPER (nom="VECTEUR", op=0, sd_prod=Vecteur, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un vecteur dans l'espace",
+  ang = "Definition of a vector in space",
+  regles = (UN_PARMI ('Composantes','Points'),),
+  Composantes = SIMP (typ='R'  ,min=2,max=3,statut='f',fr="Composantes du vecteur en 2D ou 3D"),
+  Points      = SIMP (typ=Point,min=2,max=2,statut='f',fr="Vecteur defini par deux points")
+ ) ; # Fin VECTEUR
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DROITE : Classe de definition d'une droite
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DROITE = OPER (nom="DROITE", op=0, sd_prod=Droite, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une droite par 2 POINTs, 1 POINT et 1 VECTEUR, ou Equation ax + by + cz + d = 0",
+  ang = "Definition of a straight line by 2 POINTs or through an Equation ax + by + cz + d = 0",
+  regles   = (UN_PARMI ('Points','Equation','VecteurOrigine'),),
+  Points   = SIMP (typ=Point,min=2,max=2,statut='f',fr="Deux points de definition de la droite"),
+  Equation = SIMP (typ='R'  ,min=2,max=4,statut='f',fr="Coefficients successifs abcd de l'equation d'une droite"),
+  VecteurOrigine = FACT (statut='f',
+                         Vecteur  = SIMP (typ=Vecteur,statut='o',fr="Donnee du vecteur directeur de la droite"),
+                         Origine  = SIMP (typ=Point  ,statut='o',fr="Donnee d'un point de passage de la droite"))
+ ) ; # Fin DROITE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe SEGMENT : Classe de definition d'un segment (Idem DROITE + Longueur et Origine)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+SEGMENT = OPER (nom="SEGMENT", op=0, sd_prod=Segment, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un segment 2 Points ou Origine + ((Longueur + Equation ax + by + d = 0) ou vecteur)",
+  ang = "Definition of a segment ax + by + cz + d = 0",
+  regles   = (UN_PARMI ('Points','Equation','Vecteur'),),
+  Points   = SIMP (typ=Point,min=2,max=2,statut='f',fr="Deux points de definition du segment"),
+  Equation = FACT (statut='f',fr="Donnee du segment par son equation, sa longueur et son origine",
+                   Coefficients = SIMP (typ='R'  ,min=2,max=4,statut='o',fr="Coefficients successifs abcd de l'equation de la droite"),
+                   Longueur     = SIMP (typ='R',             statut='o',fr="Longueur du segment en cm"),
+                   Origine      = SIMP (typ=Point,           statut='o',fr="Donnee de l'origine du segment")
+                   ),
+  Vecteur  = FACT (statut='f',fr="Donnee du segment par un vecteur, sa longueur et son origine",
+                   Vecteur      = SIMP (typ=Vecteur,min=2,max=4,statut='o',fr="Coefficients successifs abcd de l'equation de la droite"),
+                   Longueur     = SIMP (typ='R',               statut='o',fr="Longueur du segment en cm"),
+                   Origine      = SIMP (typ=Point,             statut='o',fr="Donnee de l'origine du segment")
+                   )
+ ) ; # Fin SEGMENT
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ARC_CERCLE : Classe de definition d'un arc de cercle
+#                      Angles donnes en degres
+#                      Dans le cas 2D on peut positionner l'arc de cercle en donnant l'angle du debut de l'arc par rapport a l'axe Ox
+#                      Dans le cas 3D on donne en plus la hauteur et l'axe directeur de l'arc
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ARC_CERCLE = OPER (nom="ARC_CERCLE", op=0, sd_prod=ArcCercle, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un arc de cercle",
+  ang = "Definition of a circular arc",
+  Type       = SIMP (typ='TXM'  ,statut='o',defaut='2D',into=('2D','3D'), fr="Type d'arc 2D ou 3D"),
+  Rayon      = SIMP (typ='R'    ,statut='o',                              fr="Rayon de l'arc de cercle en cm"),
+  Angles     = SIMP (typ='R'    ,statut='f',max=2,defaut=(360.,0.),       fr="Angles en degres de l'arc : Total et Debut"),
+  VecteurAxe = SIMP (typ=Vecteur,statut='f',                              fr="Vecteur directeur de l'axe de l'arc")
+ ) ; # Fin ARC_CERCLE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe SECTEUR_DISQUE : Classe de definition d'un disque ou d'un secteur d'une couronne circulaire
+#                          Angle du secteur donne en degres (360° par defaut)
+#                          Dans le cas 2D on peut positionner le secteur en donnant l'angle du debut de secteur par rapport a l'axe Ox
+#                          Dans le cas 3D on donne en plus la hauteur et l'axe directeur du secteur
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+SECTEUR_DISQUE = OPER (nom="SECTEUR_DISQUE", op=0, sd_prod=SecteurDisque, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un disque ou d'un secteur d'une couronne",
+  ang = "Definition of a circular sector",
+  Type       = SIMP (typ='TXM'  ,statut='o',into=('2D','3D'),defaut='2D',fr="Type de secteur 2D ou 3D"),
+  Rayons     = SIMP (typ='R'    ,statut='o',min=2,max=2,                fr="Rayons interne et externe de la couronne en cm"),
+  Angles     = SIMP (typ='R'    ,statut='f',max=2,defaut=(360.,0.),     fr="Angles en degres du secteur"),
+  Hauteur    = SIMP (typ='R'    ,statut='f',defaut=0.,                  fr="Hauteur du secteur en cm"),
+  VecteurAxe = SIMP (typ=Vecteur,statut='f',defaut=0.,                  fr="Vecteur directeur de l'axe du secteur")
+ ) ;  # Fin SECTEUR_DISQUE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CONIQUE : Classe de definition d'une conique 2D
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CONIQUE = OPER (nom="CONIQUE", op=0, sd_prod=Conique, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une conique 2D ax2+by2+cxy+dx+ey+f=0",
+  ang = "Definition of a 2D quadratic curve ax2+by2+cxy+dx+ey+f=0",
+  Equation = SIMP (typ='R',min=2,max=6,statut='o',fr="Coefficients successifs abcdef de l'equation d'une conique")\r
+  ) ; # Fin CONIQUE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe TRIANGLE : Classe de definition d'un triangle
+#                    Angles donnes en degres par rapport a l'axe Ox horizontal
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+TRIANGLE = OPER (nom="TRIANGLE", op=0, sd_prod=Triangle, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un triangle",
+  ang = "Definition of a triangle",
+  regles = (UN_PARMI ('Points','AngleCotes'),),
+  Points     = SIMP (typ=Point,min=3,max=3,statut='f',fr="Donnee des 3 sommets du triangle"),
+  AngleCotes = SIMP (typ='R'  ,min=3,max=3,statut='f',fr="Donnee d'un Angle en degres et Longueurs de deux cotes en cm")
+ ) ;  # Fin TRIANGLE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe RECTANGLE : Classe de definition d'un rectangle
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RECTANGLE = OPER (nom="RECTANGLE", op=0, sd_prod=Rectangle, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un rectangle",
+  ang = "Definition of a rectangle",
+  regles = (UN_PARMI ('Points','Cotes'),),
+  Points = SIMP (typ=Point,min=3,max=3,statut='f',fr="Definition du rectangle par trois points"),
+  LongueursCotes  = SIMP (typ='R'  ,min=2,max=2,statut='f',fr="Donnee de la longueur de deux cotes en cm")
+   ) ; # Fin RECTANGLE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CARRE : Classe de definition d'un carre
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CARRE = OPER (nom="CARRE", op=0, sd_prod=Carre, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un carre",
+  ang = "Definition of a square",
+  regles = (UN_PARMI ('Points','Cote'),),
+  Points = SIMP (typ=Point,min=2,max=2, statut='f',fr="Definition du carre par deux points"),
+  LongueurCote   = SIMP (typ='R',      statut='f',fr="Donnee de la longueur du cote du carre en cm")
+ ) ;  # Fin CARRE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe HEXAGONE : Classe de definition d'un hexagone
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+HEXAGONE = OPER (nom="HEXAGONE", op=0, sd_prod=Hexagone, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un hexagone",
+  ang = "Definition of an hexagon",
+  Rayon = SIMP (typ='R',statut='f',fr="Rayon du cercle inscrit dans l'hexagone en cm")
+ ) ;  # Fin HEXAGONE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe POLYGONE : Classe de definition d'un polygone
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POLYGONE = OPER (nom="POLYGONE", op=0, sd_prod=Polygone, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un polygone",
+  ang = "Definition of a polygon",
+  Points = SIMP (typ=Point,max='**',statut='f',fr="Definition d'un polygone par tous ses points")
+ ) ;   # Fin POLYGONE
+# ==================================================================================================================================
+#            Definition des Classes pour une geometrie 3D : Elements geometriques combinatoires ou surfaciques
+# L'utilisation de certaines classes de combinatoire en surfacique consiste a simplement specifier la position de l'objet
+# ou a eliminer certaines surfaces limites de la classe
+# Pour une sphere : donnee du centre de la sphere
+# Pour un cylindre : Pas de donnee de la hauteur, mais donnee d'un point de l'axe du cylindre
+# ==================================================================================================================================
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe SPHERE : Classe de definition d'une sphere (ou d'une sphere sectorisee ou decoupee en rondelles)
+#                  Des portions de la sphere peuvent etre selectionnees en donnant leurs cotes limites sur un axe de la sphere
+#                  (origine de l'axe au centre de la sphere, donc cotes comprises entre -R, +R si R est le rayon de la sphere)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+SPHERE = OPER (nom="SPHERE", op=0, sd_prod=Sphere, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une forme spherique",
+  ang = "Definition of a spherical form",
+  Rayon           = SIMP (typ='R',statut='o',fr="Rayon de la sphere en cm"),
+  Secteur         = SIMP (typ='R',statut='f',fr="Angle du secteur de la sphere en degre"),
+  TranchesAxiales = NUPL (max = '**', statut = 'f', fr = "Limites des tranches axiales de la sphere sectorisee",
+                          elements = ( SIMP (typ='R',statut = 'o', fr="Cote depart de la tranche"),
+                                        SIMP (typ='R',statut = 'o', fr="Cote finale de la tranche")))
+ ) ;  # Fin SPHERE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe BOITE_RECTANGULAIRE : Classe de definition d'une forme parallelepipedique de cotes paralleles aux axes de reference
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+BOITE_RECTANGULAIRE = OPER (nom="BOITE_RECTANGULAIRE", op=0, sd_prod=BoiteRectangulaire, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une d'une forme parallelepipedique rectangulaire",
+  ang = "Definition of a rectangular box form",
+  Cotes = SIMP (typ='R',min=3,max=3,statut='o',fr="Longueurs des Cotes de la boite rectangulaire en cm")
+ ) ;  # Fin BOITE_RECTANGULAIRE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe BOITE_GENERALE : Classe de definition d'une forme parallelepipedique quelconque
+#        Le plan de base de la boite doit etre le plan xOy. On donne donc uniquement les 2 vecteurs **normaux**
+#        aux 2 autres plans, et les 3 longueurs des aretes principales.
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+BOITE_GENERALE = OPER (nom="BOITE_GENERALE", op=0, sd_prod=BoiteGenerale, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une forme parallelepipedique quelconque",
+  ang = "Definition of a general box form",
+  VecteursDirecteurs = SIMP (typ=Vecteur,min=2,max=2,statut='o',fr="Vecteurs normaux aux faces non horizontales de la boite"),
+  Cotes              = SIMP (typ='R'    ,min=3,max=3,statut='o',fr="Longueurs des Cotes de la boite en cm")
+ ) ;  # Fin BOITE_GENERALE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CYLINDRE_X : Classe de definition d'une forme cylindrique d'axe parallele a Ox
+#         Pour tous les cylindres, la donnee de deux rayons transforme le cylindre circulaire en cylindre elliptique
+#         La donnee d'un angle limite le cylindre a ce secteur
+#         Pour un secteur d'un cylindre elliptique, il est necessaire de donner en plus l'angle de depart du secteur
+#         par rapport a l'axe majeur de l'ellipse
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CYLINDRE_X = OPER (nom="CYLINDRE_X", op=0, sd_prod=CylindreX, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une forme cylindrique d'axe parallele a Ox",
+  ang = "Definition of a right cylinder form // Ox",
+  Rayons  = SIMP (typ='R', max=2, statut='o', fr="Rayons mineur et majeur du cylindre X en cm"),
+  Hauteur = SIMP (typ='R',        statut='f', fr="Hauteur du cylindre X en cm"),
+  Angles  = SIMP (typ='R', max=2, statut='f', fr="Angles du secteur du cylindre X en degres")
+ ) ;  # Fin CYLINDRE_X
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CYLINDRE_Y : Classe de definition d'une forme cylindrique d'axe parallele a Oy
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CYLINDRE_Y = OPER (nom="CYLINDRE_Y", op=0, sd_prod=CylindreY, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une forme cylindrique d'axe parallele a Oy",
+  ang = "Definition of a right cylinder form // Oy",
+  Rayons  = SIMP (statut='o',typ='R',max=2,fr="Rayons mineur et majeur du cylindre Y en cm"),
+  Hauteur = SIMP (statut='f',typ='R',      fr="Hauteur du cylindre Y en cm"),
+  Angles  = SIMP (statut='f',typ='R',max=2,fr="Angles du secteur du cylindre Y en degres")
+ ) ;  # Fin CYLINDRE_Y
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CYLINDRE_Z : Classe de definition d'une forme cylindrique d'axe parallele a Oz
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CYLINDRE_Z = OPER (nom="CYLINDRE_Z", op=0, sd_prod=CylindreZ, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une forme cylindrique d'axe parallele a Oz",
+  ang = "Definition of a right cylinder form // Oz",
+  Rayons  = SIMP (statut='o',typ='R',max=2,fr="Rayons mineur et majeur du cylindre Z en cm"),
+  Hauteur = SIMP (statut='f',typ='R',      fr="Hauteur du cylindre Z en cm"),
+  Angles  = SIMP (statut='f',typ='R',max=2,fr="Angles du secteur du cylindre Z en degres")
+ ) ;  # Fin CYLINDRE_Z
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CYLINDRE : Classe de definition d'une forme cylindrique quelconque
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CYLINDRE = OPER (nom="CYLINDRE", op=0, sd_prod=Cylindre, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une forme cylindrique quelconque",
+  ang = "Definition of a general cylinder form",
+  Rayons     = SIMP (statut='o',typ='R',max=2,fr="Rayons mineur et majeur du cylindre en cm"),
+  VecteurAxe = SIMP (statut='o',typ=Vecteur,  fr="Vecteur directeur de l'axe du cylindre"),
+  Hauteur    = SIMP (statut='f',typ='R',      fr="Hauteur du cylindre en cm"),
+  Angles     = SIMP (statut='f',typ='R',max=2,fr="Angles du secteur du cylindre en degres")
+ ) ;  # Fin CYLINDRE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CONE : Classe de definition d'un forme conique
+#           Une portion de cone peut etre definie en donnant les cotes axiales (origine de l'axe du cone au sommet du cone) de
+#           la zone retenue
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CONE = OPER (nom="CONE", op=0, sd_prod=Cone, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une forme conique",
+  ang = "Definition of a conic form",
+  DemiAngleSommet = SIMP (statut='o',typ='R',            fr="Demi-angle au sommet en degres"),
+  LimitesAxiales  = SIMP (statut='f',typ='R',min=2,max=2,fr="Limites axiales du cone"),
+  VecteurAxe      = SIMP (statut='o',typ=Vecteur,        fr="Vecteur directeur de l'axe du cone")
+ ) ;  # Fin CONE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PRISME_HEXAGONAL : Classe de definition d'une forme de prisme hexagonal 3D
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PRISME_HEXAGONAL = OPER (nom="PRISME_HEXAGONAL",op=0,sd_prod=PrismeHexagonal,
+                           niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une forme de prisme hexagonal 3D",
+  ang = "Definition of a 3D hexagonal form",
+  Rayon      = SIMP (statut='o',typ='R',    fr="Rayon du cercle circonscrit (=cote de l'hexagone) en cm"),
+  Hauteur    = SIMP (statut='f',typ='R',    fr="Hauteur de l'hexagone en cm"),
+  VecteurAxe = SIMP (statut='o',typ=Vecteur,fr="Vecteur directeur de l'axe de l'hexagone")
+ ) ;  # Fin PRISME_HEXAGONAL
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe TORE : Classe de definition d'une forme toroidale
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+TORE = OPER (nom="TORE",op=0,sd_prod=Tore,
+               niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une forme toroidale",
+  ang = "Definition of a toroidal form",
+  Rayons = SIMP (typ='R',min=2,max=2,statut='o',
+                 fr="Rayons du tore : 1/2 distance a l'axe et rayon de la section du tore en cm")
+ ) ;  # Fin TORE
+# ==================================================================================================================================
+#               Definition des Classes pour une geometrie 3D : Elements geometriques surfaciques
+# ==================================================================================================================================
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PLAN : Classe de definition d'un plan
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PLAN = OPER (nom="PLAN", op=0, sd_prod=Plan, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un plan ax + by + cz + d = 0",
+  ang = "Definition of a plane surface ax + by + cz + d = 0",
+  regles = (UN_PARMI ('Points','Equation'),),
+  Points   = SIMP (typ=Point,min=3,max=3,statut='f',fr="Donnee de 3 points non alignes"),
+  Equation = SIMP (typ='R'  ,min=2,max=4,statut='f',fr="Coefficients successifs abcd de l'equation du plan")
+ ) ;  # Fin PLAN
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PLAN_X : Classe de definition d'un plan perpendiculaire a l'axe Ox
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PLAN_X = OPER (nom="PLAN_X", op=0, sd_prod=PlanX, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un plan perpendiculaire a Ox",
+  ang = "Definition of a plane surface perpendicular to Ox",
+  Cote = SIMP (typ='R',statut='o',fr="Cote du plan // OyOz")
+ ) ;  # Fin PLAN_X
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PLAN_Y : Classe de definition d'un plan perpendiculaire a l'axe Oy
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PLAN_Y = OPER (nom="PLAN_Y", op=0, sd_prod=PlanY, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un plan perpendiculaire a Oy",
+  ang = "Definition of a plane surface perpendicular to Oy",
+  Cote = SIMP (typ='R',statut='o',fr="Cote du plan // OxOz")
+ ) ;  # Fin PLAN_Y
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PLAN_Z : Classe de definition d'un plan perpendiculaire a l'axe Oz
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PLAN_Z = OPER (nom="PLAN_Z", op=0, sd_prod=PlanZ, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'un plan perpendiculaire a Oz",
+  ang = "Definition of a plane surface perpendicular to Oz",
+  Cote = SIMP (typ='R',statut='o',fr="Cote du plan // OxOy")
+ ) ;  # Fin PLAN_Z
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe POLYEDRE : Classe de definition d'une forme polyhedrique 3D quelconque (N faces, N > 4)
+#                    Definition surfacique : Donnee des N plans et du choix du cote positif ou negatif
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POLYEDRE = OPER (nom="POLYEDRE", op=0, sd_prod=Polyedre, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une forme polyhedrique 3D quelconque ",
+  ang = "Definition of a 3D polyhedron form with N > 4 plane faces",
+  Plans = NUPL (min = 5, max = '**', statut = 'o', fr = "Surfaces planes limites du polyedre",
+      elements = (SIMP (typ=(Plan,PlanX,PlanY,PlanZ)   ,fr="Plans limites du polyedre"),
+                  SIMP (typ='TXM',into=('Plus','Moins'),fr="Choix du cote positif ou negatif de l'espace")))
+  ) ;  # Fin POLYEDRE
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe QUADRIQUE : Classe de definition d'une quadrique 3D
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+QUADRIQUE = OPER (nom="QUADRIQUE", op=0, sd_prod=Quadrique, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une quadrique 3D ax2+by2+cz2+dxy+eyz+fxz+gx+hy+iz+j=0",
+  ang = "Definition of a quadratic curve 3D ax2+by2+cz2+dxy+eyz+fxz+gx+hy+iz+j=0",
+  Equation = SIMP (typ='R',min=2,max=10,statut='o',fr="Coefficients successifs abcdefghij de l'equation d'une quadrique")
+ ) ;  # Fin QUADRIQUE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#   Classe CELLULE : Classe de definition d'une cellule (ensemble elementaire  de regions annulaires et sectorisees)
+#   Apres la hauteur de la cellule, entree des donnees par listes successives pour l'ensemble des couronnes de la
+#   cellule, la zone externe etant decrite a part dans l'attribut FormeTechnologique :
+#   - Liste des materiaux
+#   - Liste des rayons des couronnes correspondantes
+#   - Liste des sous-couronnes : - Numero de couronne a discretiser (Numero 1 a partir du centre),
+#                                - Nombre de sous-couronnes,
+#                                - Mot-cle Equivolumique si decoupage en sections transverses egales,
+#                                - Rayons des couronnes intermediaires ou proportions volumiques si mot-cle Proportions indique anterieurement.
+#   - Liste des sectorisations : - Nom de couronne a sectoriser ,
+#                                - Nombre de secteurs,
+#                                - Mot-cle Equivolumique si decoupage en secteurs egaux et positionnement du premier
+#                                  secteur par rapport a l'axe x, et pas de changement de composition du secteur,
+#                                - Mot-cle alternatif Angle si on veut modifier ou positionner les secteurs dans la
+#                                  couronne : on donne alors des triplets de donnees pour chaque secteur :
+#                                - nom du materiau composant le le secteur,
+#                                - position trigonometrique en degres du debut du secteur
+#                                - et angle en degres du secteur.
+#     Le trace des secteurs sont definis en partant du centre de la couronne.
+#     Pour la sectorisation de la forme externe, deux cas se presentent :
+#     - soit pas de couronnes internes : les secteurs se tracent alors en partant du centre de la forme externe,
+#     - dans le cas contraire, les secteurs partent du centre des couronnes.
+#     Les secteurs peuvent ne pas couvrir l'ensemble de la couronne.
+#   - Pour la zone peripherique, on doit definir les cotes de la cellule (cas cartesien), son materiau, sa
+#     discretisation, et le decentrage du centre des couronnes par rapport au centre de ce contour peripherique
+#     (Coordonnees x,y du centre des couronnes / au centre du contour)
+#   - Pour le moment, limitation a 2D, sauf la donnee optionnelle des positions axiales des couronnes
+#   - Une cellule peut etre definie a partir d'une cellule d'un autre assemblage antérieurement calcule
+#   - Cette classe sert aussi a definir des microstructures (double heterogeneite) a inclure dans des regions
+#     d'autres cellules d'ou les attributs relatifs aux microstructures (une microstructure étant une petite cellule
+#     cylindrique ou spherique a disseminer dans des regions particulieres d'une cellule de taille plus importante
+#     dans des proportions fixees par l'attribut ProportionsMicroStructures
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CELLULE = OPER (nom="CELLULE", op=0, sd_prod=Cellule, niveau = 'Geometries',
+  fr  = "Definition d'une cellule elementaire",
+  ang = "Definition of a basic cell",
+  regles = (UN_PARMI ('Couronnes', 'CelluleIrradiee'),),
+  Type = SIMP (typ='TXM',defaut='Combustible',
+               into=( 'Combustible','BarreGrise','BarreNoire','BarreAcier','BarreAic','BarreB4c',
+                      'Detecteur','Trou','TubeGuide','Postiche','Pyrex','ExPyrex','Gadolinium',
+                      'CellType1','CellType2','CellType3'),statut='o'),
+  HauteurTotale  = SIMP (typ='R',defaut=1.,statut='o',fr="Hauteur totale de la cellule"),
+  Cluster        = SIMP (typ=Cluster,statut='f',fr="Cluster a integrer dans la cellule de base en cm"),
+  TypeGeometrie  = SIMP (typ='TXM',defaut='Cylindrique',statut='o',into=('Cylindrique','Spherique'),fr="Type de geometrie de la cellule"),
+  Couronnes      = FACT (statut='f',fr="Definition des couronnes cylindriques physiques de materiaux",
+        NomsSymboliques = SIMP (typ='TXM',    max='**',statut='o',fr="Liste des noms arbitraires des couronnes"),
+        Materiaux       = SIMP (typ=Materiau, max='**',statut='o',fr="Liste des materiaux des couronnes"),
+        Temperatures    = SIMP (typ='R',      max='**',statut='f',fr="Liste des temperatures des couronnes en Celsius"),
+        PressionGaz     = SIMP (typ='R',               statut='f',fr="Valeur de pression de gaz (en bars)"),
+        Rayons          = SIMP (typ='R',      max='**',statut='o',fr="Liste des rayons des couronnes en cm"),
+        RayonsMineurs   = SIMP (typ='R',      max='**',statut='f',fr="Liste des rayons mineurs des couronnes elliptiques en cm"),
+        Hauteurs        = SIMP (typ='R',      max='**',statut='f',fr="Liste des hauteurs des couronnes en cm"),
+        AxialPositions  = SIMP (typ='R',     max='**',statut='f',
+                                fr="Positions axiales de la base des couronnes en cm / au zero de la hauteur maximum")
+                         ),
+  MicroStructures  = FACT (max = '**', statut = 'f',fr="Chargement de la double heterogeneite dans chaque couronne",
+        NomCouronne     = SIMP (typ='TXM',statut='o',fr="Nom symbolique de la couronne ou inserer des microstructures"),
+        MicroStructures = SIMP (typ=Cellule,max='**',statut='o',fr="Liste des microstructures dans la couronne"),
+        ProportionsMicroStructures = SIMP (typ='R',max='**',statut='o',fr="Proportions des microstructures dans la couronne")
+                         ),
+  SousCouronnes  = FACT (max = '**', statut = 'f',fr="Discretisation des couronnes de la cellule",
+        NomCouronne        = SIMP (typ='TXM',statut='o',fr="Nom symbolique de la couronne"),
+        NbSousCouronnes    = SIMP (typ='I'  ,statut='o',fr="Nombre de sous-couronnes de discretisation"),
+        TypeDiscretisation = SIMP (typ='TXM',defaut='Equivolumique',statut='o',into=('Equivolumique','Proportions','Equidistant')),
+        BlocProportions    = BLOC (condition = "TypeDiscretisation=='Proportions'",
+                             ProportionsVolumiques = SIMP (typ='R',statut='o',max='**',fr="Proportions volumiques des sous-couronnes")),
+        ProfilTemperature  = SIMP (typ='R',max='**',statut='f',fr="Profil de temperature")
+                         ),
+  Homogeneisation = FACT (max = '**', statut = 'f', fr="Homogeneisation de couronnes de la cellule",
+        NomCouronne    = SIMP (typ='TXM'          , fr="Nom arbitraire de la couronne homogeneisee"),
+        ListeCouronnes = SIMP (typ='TXM',max='**' , fr="Liste des noms des couronnes jointives a homogeneiser")
+                          ),
+  Secteurs     = FACT (max = '**', statut = 'f', fr="Sectorisation des couronnes de la cellule",
+        NomCouronne       = SIMP (typ='TXM',statut='o',fr="Nom de la couronne ou de la forme externe a sectoriser"),
+        NbSecteurs        = SIMP (typ='I'  ,statut='o',fr="Nombre de secteurs de la couronne"),
+        TypeSectorisation = SIMP (typ='TXM',statut='o',defaut='Coins',into=('Equivolumique','Angle','Coins','MilieuxCotes')),
+        AngleDepart       = SIMP (typ='R'  ,statut='o',defaut=0.,fr="Angle en degres de depart des secteurs (Origine 0 sur l'axe Ox)"),
+        Sectorisation     = FACT (statut       = 'f',
+                                  Materiaux    = SIMP (typ=Materiau,       max='**',statut='f',fr="Materiau des secteurs"),
+                                  Temperatures = SIMP (typ=('R','I','TXM'),max='**',statut='f',fr="Temperature des secteurs en Celsius"),
+                                  Angles       = SIMP (typ='R',            max='**',statut='f',fr="Angles en degres des secteurs")
+                                                )
+                       ),
+  FormeExterne = FACT (statut='f',fr="Definition de la region externe au systeme cylindrique interne",
+        NomSymbolique = SIMP (typ='TXM',statut='f',fr="Nom arbitraire de la zone externe"),
+        Type          = SIMP (typ    = (ArcCercle,Carre,Rectangle,Hexagone,Triangle,Polygone),
+                              statut = 'f',  # la donnee est facultative si la cellule est inserree dans un reseau
+                              fr     = "Forme geometrique exterieure"),
+        Materiau      = SIMP (typ=(Materiau,Cellule),fr="Materiau de la forme externe"),
+        MicroStructures = SIMP (typ=Cellule,max='**',statut='f',fr="Microstructures de la region externe"),
+        ProportionsMicroStructures = SIMP (typ='R',max='**',statut='f',
+                                           fr="Proportions des microstructures dans la region externe"),
+        Temperature   = SIMP (typ='R',fr="Temperature en Celsius du materiau de la forme externe"),
+        PressionGaz   = SIMP (typ='R',statut='f',fr="Valeur de pression de gaz (en bars)"),
+        Decentrement  = SIMP (typ    = 'R',
+                              min    = 2,
+                              max    = 3,
+#                             defaut = (0.,0.,0.),
+                              statut = 'f',
+                              fr     = "Coordonnees xyz du centre des couronnes / barycentre du contour") ),
+  CelluleIrradiee = FACT (statut='f',fr="Utilisation d'une cellule irradiee d'un assemblage existant",
+        AssemblageOrigine  = SIMP (typ=(AssemblageType,AssemblageCombustibleReel),statut='o',
+                                   fr="Assemblage d'origine de la cellule a extraire"),
+        IrradiationMoyenne = SIMP (typ='R',statut='o',fr="Irradiation moyenne MWj/t de l'assemblage d'origine"),
+        Position           = SIMP (typ='I', min=2, max=2, statut='o',
+                                   fr="Coordonnees entieres ix,jy du crayon a extraire de l'assemblage") )
+ ) ;  # Fin CELLULE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CLUSTER : Classe de definition d'un cluster de cellules
+#                   Un cluster est defini comme une superposition centree de cadrans telephoniques (a l'ancienne mode), chaque
+#                   cadran ayant des trous de tailles differentes, l'ensemble devant etre dispose ensuite dans une cellule de forme
+#                   quelconque.
+#                   Donnees de Positionnement des couronnes de canaux, chaque canal etant une CELLULE predefinie,
+#                   Pour chaque type de cellule, on donne :
+#                   - le nombre de cellules a positionner (de maniere uniformement repartie sur le cercle)
+#                   - le rayon du cercle sur lequel on les positionne
+#                   - l'angle / Ox du centre de la premiere cellule (en degres)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CLUSTER = OPER (nom="CLUSTER", op=0, sd_prod=Cluster, niveau = 'Geometries',
+  fr  = "Definition d'un cluster de cellules cylindriques",
+  ang = "Definition of a cylindrical cell cluster",
+  Hauteur          = SIMP (typ='R',defaut=1.,statut='f',fr="Hauteur du cluster"),
+  Couronnes        = FACT (statut='o',fr="Definition des couronnes de cellules",min=1,
+      Cellules   = SIMP (typ=Cellule,max='**',statut='o',fr="Liste des types de cellules sur chaque cercle"),
+      NbCellules = SIMP (typ='I'    ,max='**',statut='o',fr="Liste des nombres de cellules de chaque type sur chaque cercle"),
+      Rayons     = SIMP (typ='R'    ,max='**',statut='o',fr="Liste des rayons des cercles correspondants en cm"),
+      Angles     = SIMP (typ='R'    ,max='**',statut='o',fr="Liste des angles de positionnement / Ox de la premiere cellule de chaque type"))
+ ) ;  # Fin CLUSTER
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ORIENTATION :         Classe de definition d'une orientation angulaire dans un plan 2D apres symetrie eventuelle / Ox
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ORIENTATION = OPER (nom="ORIENTATION", op=0, sd_prod=Orientation, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une orientation d'un reseau ou d'une cellule",
+  ang = "Definition of a cell or lattice orientation",
+  Symetrie       = SIMP (typ=(Plan,PlanX,PlanY,PlanZ),statut='f',
+                         fr="Indication d'une operation de symetrie / Plan, avant rotation"),
+  AngleRotation  = SIMP (typ='R'    ,statut='f',fr="Angle de rotation en degres",defaut=0.),
+  CentreRotation = SIMP (typ=Point  ,statut='f',fr="Centre de rotation"),
+  AxeRotation    = SIMP (typ=Vecteur,statut='f',fr="Vecteur de l'axe de rotation")
+ ) ;  # Fin ORIENTATION
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe FORME_POSITIONNEE :   Classe de definition d'une forme geometrique positionnee
+#                               La position est definie a l'aide du centre de la forme geometrique,
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+FORME_POSITIONNEE = OPER (nom="FORME_POSITIONNEE", op=0, sd_prod=FormePositionnee, niveau = 'ElementsGeometriques',
+  fr  = "Definition d'une forme positionnee",
+  ang = "Definition of a shape and its position",
+  Forme = SIMP (
+      typ    = (Sphere,BoiteRectangulaire,BoiteGenerale,CylindreX,CylindreY,CylindreZ,Cylindre,SecteurDisque,Cone,
+                Carre,Rectangle,Triangle,Hexagone,Polygone,PrismeHexagonal,Tore,Polyedre,Cellule,Cluster),
+      statut = 'o',
+      fr     = "Forme geometrique de base a positionner"),
+  PositionCentre   = SIMP (typ=Point      ,statut='o',fr="Coordonnees du centre de la forme geometrique"),
+  OrientationForme = SIMP (typ=Orientation,statut='f',fr="Orientation de la forme")
+ ) ;  # Fin FORME_POSITIONNEE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe GEOMETRIE_SURFACIQUE : Classe de definition d'une geometrie surfacique
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+GEOMETRIE_SURFACIQUE = OPER (nom="GEOMETRIE_SURFACIQUE", op=0, sd_prod=GeometrieSurfacique, niveau = 'Geometries',
+  fr  = "Definition d'une geometrie surfacique",
+  ang = "Definition of a surfacic geometry",
+  MateriauRemplissage = SIMP (typ=Materiau,statut='o',fr="Materiau de remplissage de la geometrie surfacique"),
+  Surfaces      = NUPL (
+      max      = '**',
+      statut   = 'o',
+      fr       = "Serie de couples (Surface,Plus ou Moins) definissant les surfaces limites de la geometrie",
+      elements = (
+          SIMP (typ=(PlanX,PlanY,PlanZ,Plan,CylindreX,CylindreY,CylindreZ,Cylindre,Sphere,Cone,Conique,Quadrique)),
+          SIMP (typ='TXM',into=('Plus','Moins'))))
+ ) ;  # Fin GEOMETRIE_SURFACIQUE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe GEOMETRIE_COMBINATOIRE : Classe de definition d'une geometrie combinatoire
+#                                  Ecrasement : Constitution par ecrasements successifs (dans l'ordre des donnees) de la
+#                                               Geometrie Initiale, la frontiere externe etant celle de la geometrie initiale
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+GEOMETRIE_COMBINATOIRE = OPER (nom="GEOMETRIE_COMBINATOIRE", op=0, sd_prod=GeometrieCombinatoire, niveau = 'Geometries',
+  fr  = "Definition d'une geometrie combinatoire",
+  ang = "Definition of a combinatorial geometry",
+  GeometriePremierPlan  = SIMP (typ=FormePositionnee,statut='o',fr="Geometrie se trouvant au premier plan"),
+  GeometrieEcrasee      = SIMP (typ=FormePositionnee,max='**',statut='f',
+                                fr="Geometries ecrasées et surchargées par la GeometriePremierPlan"),
+  GeometrieUnion        = SIMP (typ=FormePositionnee,max='**',statut='f',
+                                fr="Geometries a reunir a la GeometriePremierPlan en gardant les interfaces, les intersections etant des volumes particuliers"),
+  GeometrieReunion      = SIMP (typ=FormePositionnee,max='**',statut='f',
+                                fr="Geometries a reunir a la GeometriePremierPlan pour former un volume unique"),
+  GeometrieIntersection = SIMP (typ=FormePositionnee,max='**',statut='f',
+                                fr="Geometries a intersecter avec la GeometriePremierPlan")
+ ) ;   # Fin GEOMETRIE_COMBINATOIRE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CORRESPONDANCE_REPERE_POSITION_RESEAU :
+#  Classe de definition des reperes alphanumeriques des cases d'un reseau
+#  Reperes (bataille navale ou autre) et Coordonnees cartesiennes entieres des cases dans un systeme i,j du reseau
+#  Origine des coordonnees en bas a gauche d'un systeme en xy
+#  Ceci n'a d'interet que pour l'utilisateur ou pour se conformer aux reperes industriels habituels dans le cas des REP
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CORRESPONDANCE_REPERE_POSITION_RESEAU = OPER (nom="CORRESPONDANCE_REPERE_POSITION_RESEAU",op=0,sd_prod=CorrespondanceReperePositionReseau,
+                                              niveau = 'Geometries',
+  fr  = "Correspondance entre reperes alphanumeriques et cases d'un reseau",
+  ang = "Alphanumeric identificators and lattice coordinates",
+  Positions = NUPL (max='**',statut='o',
+                    elements=(SIMP (typ='TXM',fr="Repere alphanumerique arbitraire d'une case du reseau"),
+                              SIMP (typ='I'  ,fr="Premiere Coordonnee entiere dans le systeme i,j du reseau"),
+                              SIMP (typ='I'  ,fr="Seconde Coordonnee entiere dans le systeme i,j du reseau")))
+ ) ;  # Fin CORRESPONDANCE_REPERE_POSITION_RESEAU
+# -----------------------------------------------------------------------------------------------------------------------------------
+# Classe RESEAU :
+#   Classe de definition d'un reseau de juxtapositions de cellules ou de reseaux
+#   Assemblage de cellules ou de reseaux dans une grille rectangulaire ou hexagonale
+#   Les positions des cellules et des reseaux dans le nouveau reseau sont a fournir sur les mailles
+#   du reseau sans tenir compte des symetries,
+#   Le reseau peut etre charge :
+#     - de maniere uniforme : un seul type de CELLULE ou de RESEAU
+#     - de maniere complete : a chaque maille doit etre affecte un reseau ou une cellule et optionnellement son
+#       orientation, l'ordre des donnees dans le plan radial etant celui obtenu en partant de l'element le plus
+#       bas a gauche, et dans le sens axial ensuite (eventuellement si 3D)
+#     - de maniere partielle : liste des cellules et reseaux charges et leur position xyz dans le nouveau reseau
+#       et orientations correspondantes de ces cellules et reseaux
+#   Des reperes alphanumeriques arbitraires peuvent etre associes a chaque maille du reseau, ce qui permet
+#   si necessaire de manipuler ces elements du reseau par l'intermediaire de ces symboles (exemple des
+#   reperes bataille navale des assemblages dans le reseau d'un coeur REP).
+#   Le reseau peut etre entoure de zones peripheriques homogenes ou heterogenes.
+#     - Le cas Homogene peut s'appliquer aux reseaux hexagonaux ou cartesiens ;
+#     - Dans le cas Heterogene, la reflexion s'est uniquement portee sur la situation cartesienne et particulierement en donnant la
+#       la possibilite de decrire un assemblage bouillant (avec croix de contrôle et instrumentation)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RESEAU = OPER (nom="RESEAU", op=0, sd_prod=Reseau, niveau = 'Geometries',
+  fr  = "Definition d'un reseau compose de juxtapositions de cellules, de reseaux ou d'assemblages",
+  ang = "Definition of a lattice",
+  Identificateur          = SIMP (typ='TXM',statut='o',fr="Identificateur arbitraire du reseau"),
+  ReseauReference         = SIMP (typ='TXM',statut='f',fr="Identificateur du reseau de reference dans le cas d'une composition de reseaux de reseau"),
+  DifferenciationCellules = SIMP (typ='I',defaut=0,statut='f',fr="Nombre de couches de cellules a differencier autour du reseau de reference"),
+  TypeGeometrie           = SIMP (typ='TXM',into=('cartesienne','hexagonale'),defaut='cartesienne',statut='f'),
+  NbMaillesX              = SIMP (typ='I',defaut=17,statut='o',fr="Nbre de mailles sur le premier axe du reseau"),
+  NbMaillesY              = SIMP (typ='I',defaut=17,statut='f',fr="Nbre de mailles sur le second axe du reseau"),
+  NbMaillesZ              = SIMP (typ='I',defaut=1 ,statut='f',fr="Nbre de mailles sur l'axe vertical du reseau"),
+  PasReseau               = SIMP (typ='R',defaut=1.26 ,statut='f',max=2,fr="Pas du reseau en X et Y (en cm)"),
+  MateriauRemplissage     = SIMP (typ=Materiau,defaut='ModExt',statut='f',fr="Materiau de remplissage du reseau"),
+  TypeDefinition          = SIMP (typ='TXM',statut='f',defaut="Complet",into=("Uniforme","Complet","Partiel"),fr="Mode de chargement du reseau"),
+  ReseauUniforme          = BLOC (condition = "TypeDefinition=='Uniforme'",fr="Chargement uniforme du reseau",
+       ElementGeomU       = SIMP (typ=(Cellule,Reseau,Cluster,GeometrieCombinatoire,AssemblageCombustibleReel,AssemblageType),statut='o',
+                                  fr = "Remplissage uniforme du nouveau reseau par un element particulier"),
+       OrientationU       = SIMP (typ=Orientation,fr="Orientation de l'element geometrique de base",statut='f')),
+  ReseauComplet           = BLOC (condition = "TypeDefinition=='Complet'",fr="Chargement complet du reseau",
+        ElementsGeomC     = NUPL (max='**', statut='o',
+                                  fr="Liste des couples (ElementGeometrique,SigleTextuel) les sigles textuels servant ensuite au chargement complet du reseau",
+                elements  =(SIMP (typ=(Cellule, Reseau, GeometrieCombinatoire, GeometrieSurfacique, AssemblageCombustibleReel,AssemblageType),
+                                  fr="Element geometrique a associer au sigle"),
+                            SIMP (typ='TXM',fr="Sigle alphanumerique associe a l'element geometrique"))),
+        ChargementC       = SIMP (typ='TXM',statut='o',max='**',
+                                  fr="Affectation des sigles aux cases geometriques du reseau"),
+        RegroupementC     = SIMP (typ='I',statut='f',max='**',
+                                  fr="Numeros des cellules de calcul en approximation multicellule dans chaque case du reseau"),
+        OrientationC      = SIMP (typ=Orientation,max='**',statut='f',fr="Orientation des elements geometriques dans les cases du reseau"),
+        ReperesC          = SIMP (typ='TXM',max='**',statut='f',fr="Reperes arbitraires des cases geometriques"),
+                                ),
+  ReseauPartiel           = BLOC (condition = "TypeDefinition=='Partiel'",fr="Chargement partiel du reseau",
+        ChargementP       = FACT (max='**',fr="Chargement partiel du reseau",
+                regles = (UN_PARMI ('ElementsPositionnesP', 'ElementsReperesP'),),
+                ElementsPositionnesP = NUPL (max='**', statut='f',fr="Donnee des Positions des elements geometriques dans le systeme des coordonnees du reseau",
+                        elements=(SIMP (typ=(Cellule, Reseau, GeometrieCombinatoire, GeometrieSurfacique, AssemblageCombustibleReel,AssemblageType),
+                                        fr="Element geometrique a positionner"),
+                                  SIMP (typ='I',min=2,max=2,fr="Coordonnees i j de l'element geometrique dans le reseau"))),
+                ElementsReperesP    = NUPL (max='**', statut='f',fr="Donnee des reperes positionnels des elements geometriques",
+                        elements=(SIMP (typ=(Cellule, Reseau, GeometrieCombinatoire, GeometrieSurfacique, AssemblageCombustibleReel,AssemblageType),
+                                        fr="Element geometrique a positionner"),
+                                  SIMP (typ='TXM',fr="Repere alphanumerique de l'element geometrique"))),
+                CorrespondanceReperePositions = SIMP (typ=CorrespondanceReperePositionReseau,
+                                                      statut='f',
+                                                      fr="Correspondance entre Repere alphanumerique et coordonnees dans le reseau"),
+                OrientationP = SIMP (typ=Orientation,max='**',statut='f',fr="Orientation des elements geometriques du chargement partiel"),
+                             )),
+  ZonesPeripheriquesHomogenes      = FACT (statut='f',fr="Zones homogenes peripheriques au reseau",
+        Epaisseurs      = SIMP (typ='R'     ,max='**',statut='o',fr="Liste des epaisseurs (cm) des couches peripheriques"),
+        Materiaux       = SIMP (typ=Materiau,max='**',statut='f',fr="Liste des materiaux des couches peripheriques"),
+        MateriauExterne = SIMP (typ=Materiau         ,statut='f',fr="Materiau de remplissage de la zone externe du reseau hexagonal")),
+  ZonesPeripheriquesHeterogenes  = FACT (max='**',statut='f',fr="Zones heterogenes peripheriques au reseau",
+        DimensionsExternes = SIMP (typ='R',min=2,max=2,        statut='o',
+                                   fr=" Dimensions (cm) externes X et Y zone peripherique comprise"),
+        Decentrement = SIMP (typ='R',min=2,max=2,      statut='f',
+                             fr=" Coordonnees (cm) X et Y du centre de la zone peripherique / au centre du réseau"),
+        MateriauRemplissage = SIMP (typ=Materiau,      statut='f',
+                                    fr="Materiau de remplissage de la zone"),
+        Boitier = FACT (statut='f',fr="Definition d'un boitier",
+                Epaisseur = SIMP (typ='R',statut='o',fr= "Epaisseur (cm) du boitier dans sa partie lineaire"),
+                LongueurPartieLineaire  = SIMP (typ='R',statut='o',fr= "Longueur (cm) de la partie lineaire du boitier"),
+                RayonExterneCoinBoitier = SIMP (typ='R',statut='o',fr= "Rayon externe (cm) du coin arrondi du boitier"),
+                MateriauExterne = SIMP (typ=Materiau,statut='f',fr="Materiau de remplissage de la zone externe au boitier"),
+                PositionBoitier = SIMP (typ='TXM',statut='o',defaut='Exterieure',into=('Exterieure','Interieure'),
+                                        fr="Position du boitier dans la zone")),
+        CroixControle = FACT (statut='f',fr="Definition d'une croix de controle",
+                Epaisseur = SIMP (typ='R',statut='o',fr= "Epaisseur (cm) des branches de la croix de controle"),
+                EpaisseurEnveloppe = SIMP (typ='R',statut='o',fr= "Epaisseur (cm) de l'enveloppe de la croix de controle"),
+                DemiLongueurCroixCentrale = SIMP (typ='R',statut='o',
+                                                  fr= "Demi-longueur (cm) de la partie homogene au centre de la croix de controle"),
+                NombreBarres   = SIMP (typ='I',statut='o',fr= "Nombre de barres dans une aile de la croix de controle"),
+                CellulesBarres = SIMP (typ=Cellule,max='**',statut='o',
+                                       fr= "Liste des cellules correspondant aux barres de la croix de contrôle, en partant du centre de la croix"),
+                MateriauCroix = SIMP (typ=Materiau,statut='o',fr="Materiau de la croix de controle"),
+                BranchesCroix = SIMP (typ='TXM',statut='o',defaut='NordOuest',into=('NordOuest','NordEst','SudOuest','SudEst'),
+                                      fr="Choix des deux branches de la croix de contrôle decrites"),
+                PositionCroix = SIMP (typ='TXM',statut='o',defaut='AxeExterieure',into=('AxeExterieure','Exterieure','Interieure'),
+                                      fr="Position de la croix dans la zone")),
+        Instrumentation = FACT (statut='f',fr="Definition de l'instrumentation",
+                Cellule  = SIMP (typ=Cellule,statut='o',fr= "Cellule decrivant la geometrie de l'instrumentation"),
+                Position = SIMP (typ='TXM',statut='o',defaut='SudEst',into=('NordOuest','NordEst','SudOuest','SudEst'),
+                                 fr="Choix du coin ou sera centree la cellule"))
+                                )
+ ) ;  # Fin RESEAU
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DECOMPOSITION_DOMAINES : Classe de definition de domaines de calcul
+#                                  Pour le moment, on ne considere qu'une partition en 2D d'un reseau
+#                                  (a completer ulterieurement pour une geometrie generale)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DECOMPOSITION_DOMAINES = OPER (nom="DECOMPOSITION_DOMAINES", op=0, sd_prod=DecompositionDomaines, niveau = 'Geometries',
+  fr  = "Decomposition en domaines d'un reseau",
+  ang = "Domain decomposition of a lattice",
+  NbDomainesOx          = SIMP (statut='o', typ='I',           fr="Nombre de domaines sur l'axe Ox"),
+  NbDomainesOy          = SIMP (statut='o', typ='I',           fr="Nombre de domaines sur l'axe Oy"),
+  OxRepartitionDomaines = SIMP (statut='o', typ='I', max='**', fr="Nombre de mailles du reseau pour chaque domaine de l'axe Ox"),
+  OyRepartitionDomaines = SIMP (statut='o', typ='I', max='**', fr="Nombre de mailles du reseau pour chaque domaine de l'axe Oy")
+ ) ;  # Fin DECOMPOSITION_DOMAINES
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe GRILLE_ASSEMBLAGE : Classe de definition des grilles composant le squelette des assemblages combustibles
+#                             Caracteristiques  technologiques (dimension, materiaux de composition) et positionnement simplifie
+#                             des materiaux dans les canaux de l'assemblage pour dilution homogene a 2D dans le milieu peripherique.
+#                               - Materiaux fournis sous forme de couples (nom de materiau et masse en g)
+#                               - Repartition decrite en donnant pour une liste de materiaux (faisant partie des materiaux
+#                                 precedemment indiques) la liste des types de cellules (precedee du mot-cle TypeCellule) et des
+#                                 types de materiaux (precedes du mot-cle TypeMateriau) devant etre modifies par la presence des
+#                                 grilles
+#                                                    < liste de MATERIAU >,
+#                                       TypeCellule  < liste de types de cellule >,
+#                                       TypeMateriau < liste de types de materiau >
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+GRILLE_ASSEMBLAGE = OPER (nom="GRILLE_ASSEMBLAGE", op=0, sd_prod=GrilleAssemblage, niveau = 'ElementsTechnologiquesAssemblages',
+  fr  = "Definition d'une grille d'assemblage",
+  ang = "Definition of an elementary assembly grid",
+  TypeGrille     = SIMP (typ='TXM',defaut='GrilleMelange',statut='f',fr="Type de grille de structure assemblage"),
+  Hauteur        = SIMP (typ='R',defaut=3.3,statut='f',fr="Hauteur de la grille de structure assemblage en cm"),
+  Largeur        = SIMP (typ='R',defaut=21.338,statut='f',fr="Largeur de la grille de structure assemblage en cm"),
+  MateriauxMasse = NUPL (max = '**', statut = 'o',
+                         elements = (SIMP (typ=Materiau),SIMP (typ='R')),
+                         fr       = "Serie de couples (Materiau,masse en g) de composition de la grille"),
+  Repartition    = FACT (max = '**', statut = 'o',fr="Repartition des materiaux par type de cellule ou par type de materiau",\r
+                         regles = (AU_MOINS_UN ('TypeCellule', 'TypeMateriau'),),
+                         MateriauGrille = SIMP (typ=Materiau,fr="Nom du materiau a repartir",statut='o'),
+                         TypeCellule    = SIMP (typ='TXM',max='**',statut='f',fr="Liste des types de cellule ou est reparti le materiau"),
+                         TypeMateriau   = SIMP (typ='TXM',max='**',statut='f',fr="Liste des types de materiaux  ou est reparti le materiau") ),
+  CoefficientsThermohydrauliques = FACT (statut = 'f',fr="Donnees de thermohydraulique",
+      CoeffPerteCharge  = SIMP (typ='R',statut='f',
+                                fr="Coefficient Cn de perte de charge au sens monodimensionnel de la singularite"),
+      CoeffRedressement = SIMP (typ='R',statut='f',val_min=0,
+                                fr="Coefficient R de redressement de l'ecoulement au passage de la singularite"),
+      CoeffCkg          = SIMP (typ='R',statut='f',
+                                fr="Coefficient lie au type de grille et de geometrie")),
+  Ailettes = FACT (statut = 'f',fr="Donnees des ailettes de melange",
+      PerteChargeSansAilettes       = SIMP (typ='R',statut='f',fr="Coefficient Cn de perte de charge monodimensionnel sans ailettes"),
+      PerteChargeAvecAilettes       = SIMP (typ='R',statut='f',fr="Coefficient Cn de perte de charge avec ailettes"),
+      CoeffRedressementSansAilettes = SIMP (typ='R',statut='f',val_min=0,
+                                            fr="Coefficient R de redressement de l'ecoulement sans ailettes"),
+      CoeffCkg                      = SIMP (typ='R',statut='f',fr="Coefficient lie au type de grille et de geometrie"),
+      AngleOrientation              = SIMP (typ='R',statut='f',fr="Angle d'orientation des ailettes"),
+      Repartition                   = SIMP (typ='TXM',max='**',into=('Rien','Droite','Gauche','Haut','Bas'),statut='f',
+        fr="Positionnement des ailettes dans chaque quart de sous-canal (soit 4 donnees par sous-canal)"))
+ ) ;  # Fin GRILLE_ASSEMBLAGE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PARTIE_INFERIEURE_ASSEMBLAGE_COMBUSTIBLE  :   Classe de definition de l'embout inferieur d'un assemblage combustible REP
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PARTIE_INFERIEURE_ASSEMBLAGE_COMBUSTIBLE = OPER (nom="PARTIE_INFERIEURE_ASSEMBLAGE_COMBUSTIBLE",op=0,sd_prod=PartieInferieureAssemblageCombustible,
+                                                 niveau = 'ElementsTechnologiquesAssemblages',
+  fr  = "Definition de la partie inferieure d'un assemblage combustible REP",
+  ang = "Definition of the bottom part of a PWR fuel assembly",
+  MateriauEmbout                            = SIMP (typ=Materiau,statut='f',fr="Materiau de l'embout inferieur",defaut='ACIER'),
+  MasseBouchonInferieurCrayonCombustible    = SIMP (typ='R'     ,statut='o',fr="Masse (g) du bouchon inferieur du crayon combustible"),
+  HauteurBouchonInferieurCrayonCombustible  = SIMP (typ='R'     ,statut='o',fr="Hauteur (cm) du bouchon inferieur du crayon combustible"),
+  MateriauBouchonInferieurCrayonCombustible = SIMP (typ=Materiau,statut='f',fr="Materiau du bouchon inferieur du crayon combustible",defaut='ZIRCALOY'),
+  MasseEmbout                               = SIMP (typ='R'     ,statut='o',fr="Masse (g) de l'embout inferieur"),
+  EpaisseurPlaqueAdaptatrice                = SIMP (typ='R'     ,statut='o',fr="Epaisseur (cm) de la plaque adaptatrice de l'embout inferieur en cm"),
+  LargeurPlaqueAdaptatrice                  = SIMP (typ='R'     ,statut='o',fr="Largeur (cm) de la plaque adaptatrice de l'embout inferieur"),
+  TrousPlaqueAdaptatrice                    = NUPL (fr="Dimensions des trous de la plaque adaptatrice",
+      max      = '**',
+      statut   = 'o',
+      elements = ( SIMP (typ='I'  ,statut='o',fr="Nombre de trous de taille definie ci-apres"),
+                   SIMP (typ='TXM',statut='o',into=('Rayon','Cotes'),fr="Choix de la forme des trous, elliptique ou rectangulaire"),
+                   SIMP (typ='R'  ,statut='o',min=2,max=2,fr="Rayons ou cotes (cm) des trous"),
+                   SIMP (typ='TXM',statut='o',defaut='Hauteur',into=('Hauteur','Epaisseur'),fr="Mot-cle au choix"),
+                   SIMP (typ='R'  ,statut='o',fr="Hauteur  (cm) des trous dans la plaque adaptatrice"))),
+  JeuBouchonCombustiblePlaque = SIMP (typ='R',      statut='o',fr="Hauteur (cm) du jeu entre bouchon combustible et plaque adaptatrice"),
+  HauteurPied                 = SIMP (typ='R',      statut='o',fr="Hauteur (cm) du pied de l'embout inferieur"),
+  CapuchonRint                = SIMP (typ='R',      statut='f',fr="Rayon interne (cm) du capuchon"),
+  CapuchonRext                = SIMP (typ='R',      statut='f',fr="Rayon externe (cm) du capuchon"),
+  HauteurVisEpaulee           = SIMP (typ='R',      statut='f',fr="Hauteur des vis epaulees des tubes guides en cm"),
+  MasseVisEpaulee             = SIMP (typ='R',      statut='f',fr="Masse totale des vis epaulees des tubes guides en g"),
+  RintVisEpaulee              = SIMP (typ='R',      statut='f',fr="Rayon interne (cm) d'une vis epaulee"),
+  RextVisEpaulee              = SIMP (typ='R',      statut='f',fr="Rayon externe (cm) d'une vis epaulee"),
+  MasseFiltre                 = SIMP (typ='R',      statut='f',fr="Masse (g) du filtre anti-debris"),
+  MateriauFiltre              = SIMP (typ=Materiau, statut='f',fr="Materiau du filtre anti-debris", defaut='INCONEL'),
+  HauteurCale                 = SIMP (typ='R',      statut='f',fr="Hauteur (cm) de la cale dans le crayon combustible"),
+  MateriauCale                = SIMP (typ=Materiau, statut='f',fr="Materiau de la cale dans le crayon combustible",defaut='ACIER'),
+  RayonPionCentrage           = SIMP (typ='R',      statut='f',fr="Rayon externe des pions de centrage de la plaque inferieure coeur en cm"),
+  HauteurPionCentrage         = SIMP (typ='R',      statut='f',fr="Hauteur des pions de centrage de la plaque inferieure coeur en cm"),
+  HauteurOgivePionCentrage    = SIMP (typ='R',      statut='f',fr="Hauteur de l'ogive des pions de centrage de la plaque inferieure coeur en cm"),
+  MateriauPionCentrage        = SIMP (typ=Materiau, statut='f',fr="Materiau des pions de centrage de la plaque inferieure coeur",defaut='ACIER'),
+  BouchonTubGHauteur          = SIMP (typ='R',      statut='f',fr="Hauteur des bouchons des tubes guides en cm"),
+  BouchonTubGMateriau         = SIMP (typ=Materiau, statut='f',fr="Materiau des bouchons des tubes guides",defaut='ACIER')
+  ) ;  # Fin PARTIE_INFERIEURE_ASSEMBLAGE_COMBUSTIBLE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PARTIE_SUPERIEURE_ASSEMBLAGE_COMBUSTIBLE :    Classe de definition de l'embout superieur d'un assemblage combustible REP
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PARTIE_SUPERIEURE_ASSEMBLAGE_COMBUSTIBLE = OPER (nom="PARTIE_SUPERIEURE_ASSEMBLAGE_COMBUSTIBLE",op=0,sd_prod=PartieSuperieureAssemblageCombustible,
+                                                   niveau = 'ElementsTechnologiquesAssemblages',
+  fr  = "Definition de la partie superieure d'un assemblage combustible REP",
+  ang = "Definition of the top part of a PWR fuel assembly",
+  MateriauEmbout                             = SIMP (typ=Materiau, statut='f',fr="Materiau  de l'embout superieur",defaut='ACIER'),
+  MasseBouchonSuperieurCrayonCombustible     = SIMP (typ='R',      statut='o',fr="Masse du bouchon superieur du crayon combustible en g"),
+  HauteurBouchonSuperieurCrayonCombustible   = SIMP (typ='R',      statut='o',fr="Hauteur du bouchon superieur du crayon combustible en cm"),
+  MateriauBouchonSuperieurCrayonCombustible  = SIMP (typ=Materiau, statut='f',fr="Materiau du bouchon superieur du crayon combustible",defaut='ZIRCALOY'),
+  RessortCrayonCombustible                   = SIMP (typ='R',      statut='o',fr="Masse du ressort du crayon combustible en g"),
+  ForceRessortCrayonCombustible              = SIMP (typ='R',      statut='f',fr="Force du ressort du crayon combustible en N"),
+  HauteurChambreExpansion                    = SIMP (typ='R',      statut='o',fr="Hauteur de la chambre d'expansion en cm"),
+  MasseEmbout                                = SIMP (typ='R',      statut='o',fr="Masse de l'embout superieur en g"),
+  HauteurEmbout                              = SIMP (typ='R',      statut='o',fr="Hauteur de l'embout superieur en cm"),
+  MasseRessortsEmbout                        = SIMP (typ='R',      statut='o',fr="Masse des ressorts de l'embout superieur en g"),
+  MateriauRessortsEmbout                     = SIMP (typ=Materiau, statut='f',fr="Materiau des ressorts de l'embout superieur", defaut='INCONEL'),
+  EpaisseurPlaqueAdaptatrice                 = SIMP (typ='R',      statut='o',fr="Epaisseur de la plaque adaptatrice en cm"),
+  LargeurPlaqueAdaptatrice                   = SIMP (typ='R',      statut='o',fr="Largeur de la plaque adaptatrice en cm"),
+  TrousPlaqueAdaptatrice                     = NUPL (fr="Dimensions des trous de la plaque adaptatrice",
+      max      = '**',
+      statut   = 'o',
+      elements = (      SIMP (typ='I',                                 fr="Nombre de trous d'un type donne"),
+                        SIMP (typ='TXM',into=('Rayon','Cotes'),                fr="Mot indiquant la donnee des rayons ou cotes des trous"),
+                        SIMP (typ='R'  ,min=2,max=2,                   fr="Rayons mineur et majeur ou Cotes du trou en cm"),
+                        SIMP (typ='TXM',into=('Hauteur','Epaisseur'),  fr="Mot cle introduisant la hauteur des trous"),
+                        SIMP (typ='R',                                 fr="Hauteur du trou en cm"))),
+  JeuBouchonCombustiblePlaque = SIMP (typ='R',      statut='o',fr="Hauteur du jeu entre Bouchon combustible et Plaque adaptatrice en cm"),
+  EpaisseurJupe               = SIMP (typ='R',      statut='o',fr="Epaisseur de la jupe de l'embout superieur en cm"),
+  HauteurJupe                 = SIMP (typ='R',      statut='f',fr="Hauteur de la jupe de l'embout superieur en cm"),
+  RayonPionCentrage           = SIMP (typ='R',      statut='f',fr="Rayon des pions de centrage superieurs en cm"),
+  HauteurPionCentrage         = SIMP (typ='R',      statut='f',fr="Hauteur des pions de centrage superieurs en cm"),
+  HauteurOgivePionCentrage    = SIMP (typ='R',      statut='f',fr="Hauteur de l'ogive des pions de centrage superieurs en cm"),
+  MateriauPionCentrage        = SIMP (typ=Materiau, statut='f',fr="Materiau des pions de centrage superieurs",defaut='ACIER'),
+  RayonInterneManchon         = SIMP (typ='R',      statut='f',fr="Rayon interne des manchons des tubes guides en cm"),
+  RayonExterneManchon         = SIMP (typ='R',      statut='f',fr="Rayon externe des manchons des tubes guides en cm"),
+  HauteurManchon              = SIMP (typ='R',      statut='f',fr="Hauteur des manchons des tubes guides en cm"),
+  MasseManchon                = SIMP (typ='R',      statut='f',fr="Masse d'un manchon des tubes guides en g")
+ ) ;  # Fin PARTIE_SUPERIEURE_ASSEMBLAGE_COMBUSTIBLE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ASSEMBLAGE_TYPE : Classe de definition d'un type d'assemblage (ensemble de crayons ou de reseaux quelconques)
+#                           Rajout des structures grilles et embouts (dans le cas des REP)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ASSEMBLAGE_TYPE = OPER (nom="ASSEMBLAGE_TYPE",op=0,sd_prod=AssemblageType,
+                          niveau = 'ElementsTechnologiquesAssemblages',
+  fr  = "Definition d'un assemblage type et des elements associes eventuels",
+  ang = "Definition of an assembly type and its associated elements",
+  Geometrie         = SIMP (typ=(Cellule,Reseau,GeometrieCombinatoire),statut='o',max='**',
+                            fr="Liste des geometries composant l'assemblage"),
+  GrillesStructure  = NUPL (max = '**', statut = 'f',fr="Positions axiales des grilles",
+                            elements = ( SIMP (typ=GrilleAssemblage,fr="Type de grille"),
+                                         SIMP (typ='R',max='**',
+                                               fr="Positions axiales des milieux des grilles (en cm) / a la limite inferieure du pied de l'assemblage"))),
+  PartieInferieure  = SIMP (typ=PartieInferieureAssemblageCombustible,statut='f',fr="Type d'embout inferieur"),
+  PartieSuperieure  = SIMP (typ=PartieSuperieureAssemblageCombustible,statut='f',fr="Type d'embout superieur"),
+  ElementsAssocies  = SIMP (typ=(ElementsGrappeCommande,ElementsAbsorbantsFixes,GrappeBouchonAssemblage),max='**',statut='f',fr="Liste des elements technologiques associes")
+ ) ;  # Fin ASSEMBLAGE_TYPE
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ELEMENT_BARRE :       Classe de définition d'une barre element d'un assemblage
+#                         Definition des barres des grappes de commande (barre et gaine, et composants axiaux)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ELEMENT_BARRE = OPER (nom="ELEMENT_BARRE", op=0, sd_prod=ElementBarre, niveau = 'ElementsTechnologiquesAssemblages',
+  fr  = "Definition d'une barre element d'un assemblage",
+  ang = "Definition of an assembly rod element",
+  MateriauInferieur    = SIMP (typ=Materiau,defaut='ACIER' ,statut='o',fr="Materiau composant la partie inferieure de la barre"),
+  MateriauSuperieur    = SIMP (typ=Materiau,defaut='ACIER' ,statut='o',fr="Materiau composant la partie superieure de la barre"),
+  HauteurBarre         = SIMP (typ='R'                     ,statut='o',fr="Hauteur (cm) de la barre"),
+  HauteurInferieure    = SIMP (typ='R'                     ,statut='f',fr="Hauteur (cm) de la partie inferieure de la barre"),
+  HauteurSuperieure    = SIMP (typ='R'                     ,statut='f',fr="Hauteur (cm) de la partie superieure de la barre"),
+  RintPartieInferieure = SIMP (typ='R'     ,defaut=0.      ,statut='f',fr="Rayon Interne (cm) de la partie inferieure de la barre"),
+  RintPartieSuperieure = SIMP (typ='R'     ,defaut=0.      ,statut='f',fr="Rayon Interne (cm) de la partie superieure de la barre"),
+  RextPartieInferieure = SIMP (typ='R'                     ,statut='o',fr="Rayon Externe (cm) de la partie inferieure de la barre"),
+  RextPartieSuperieure = SIMP (typ='R'                     ,statut='f',fr="Rayon Externe (cm) de la partie superieure de la barre"),
+  MasseRessort         = SIMP (typ='R'                     ,statut='o',fr="Masse (g) du ressort de la barre"),
+  MateriauRessort      = SIMP (typ=Materiau                ,statut='o',fr="Materiau du ressort de la barre"),
+  HauteurRessort       = SIMP (typ='R'                     ,statut='o',fr="Hauteur (cm) du ressort de la barre"),
+  BouchonInfHauteur    = SIMP (typ='R'     ,defaut=0.      ,statut='f',fr="Hauteur (cm) du bouchon inferieur de la barre"),
+  BouchonSupHauteur    = SIMP (typ='R'     ,defaut=0.      ,statut='f',fr="Hauteur (cm) du bouchon superieur de la barre"),
+  BouchonInfRayon      = SIMP (typ='R'     ,defaut=0.      ,statut='f',fr="Rayon externe (cm) du bouchon inferieur de la barre"),
+  BouchonSupRayon      = SIMP (typ='R'     ,defaut=0.      ,statut='f',fr="Rayon externe (cm) du bouchon superieur de la barre"),
+  MateriauGaine        = SIMP (typ=Materiau,defaut='ACIER' ,statut='o',fr="Materiau de la gaine externe de la barre"),
+  RayonInterneGaine    = SIMP (typ='R'     ,defaut=0.      ,statut='f',fr="Rayon Interne (cm) de la gaine externe de la barre"),
+  RayonExterneGaine    = SIMP (typ='R'     ,defaut=0.      ,statut='f',fr="Rayon Externe (cm) de la gaine externe de la barre")
+ ) ;  # Fin ELEMENT_BARRE
+#----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ELEMENTS_GRAPPE_COMMANDE : Classe de définition des éléments des grappes de commande
+#                                    Association avec les différents types de barres absorbantes
+#                                    Description simplifiée de l'araignée et du bouchon des barres
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ELEMENTS_GRAPPE_COMMANDE = OPER (nom="ELEMENTS_GRAPPE_COMMANDE",op=0,sd_prod=ElementsGrappeCommande,niveau = 'ElementsTechnologiquesAssemblages',
+  fr  = "Définition des éléments des grappes de commande",
+  ang = "Definition of control rod cluster components",
+  ElementsBarre        = SIMP (typ= ElementBarre, max='**',statut='o',fr="Liste des barres absorbantes associees"),
+  HauteurPasInsertion  = SIMP (typ='R',defaut=1.5875      ,statut='o',fr="Hauteur (cm) d'un pas d'insertion des grappes"),
+  CourseTotalePossible = SIMP (typ='R',defaut=361.8       ,statut='o',fr="Course totale possible (cm) d'insertion d'une grappe"),
+  CoteInferieureGrappe = SIMP (typ='R',defaut=8.5705      ,statut='o',fr="Cote inferieure (cm) d'une grappe / zone active ?"),
+  VitesseDeplacement   = SIMP (typ='R',defaut=72.         ,statut='o',fr="Vitesse de deplacement d'une grappe en pas/mn"),
+  NbPasInsertion       = SIMP (typ='I',defaut=225         ,statut='o',fr="Nombre maximum de pas d'insertion "),
+  Araignee16Phauteur   = SIMP (typ='R',defaut=0.          ,statut='o',fr="Hauteur (cm) d'une des 16 petites tiges d'accrochage des barres"),
+  Araignee4Mhauteur    = SIMP (typ='R',defaut=0.          ,statut='o',fr="Hauteur (cm) d'une des 4 tiges moyennes d'accrochage des barres"),
+  Araignee4Ghauteur    = SIMP (typ='R',defaut=0.          ,statut='o',fr="Hauteur (cm) d'une des 4  grandes tiges d'accrochage des barres"),
+  HauteurPommeau       = SIMP (typ='R',defaut=0.          ,statut='o',fr="Hauteur (cm) du pommeau d'accrochage de la grappe"),
+  RayonPommeau         = SIMP (typ='R',defaut=0.          ,statut='o',fr="Rayon (cm) du pommeau d'accrochage de la grappe")
+ ) ;  # Fin ELEMENTS_GRAPPE_COMMANDE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ELEMENTS_ABSORBANTS_FIXES :   Classe de definition des elements des grappes d'absorbants fixes
+#                                       Description des pyrex uniquement pour le moment
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ELEMENTS_ABSORBANTS_FIXES = OPER (nom="ELEMENTS_ABSORBANTS_FIXES",op=0,sd_prod=ElementsAbsorbantsFixes,
+                          niveau = 'ElementsTechnologiquesAssemblages',
+  fr  = "Definition des elements des grappes d'absorbants fixes",
+  ang = "Definition of non movable absorber control rod cluster elements",
+# Limitation a 12 caracteres
+# HBouchInfPyrex        = SIMP (typ='R',statut='f'),
+# RBouchInfPyrex        = SIMP (typ='R',statut='f'),
+# HZoneVidePyrex        = SIMP (typ='R',statut='f'),
+# HBouchSupPyrex        = SIMP (typ='R',statut='f'),
+# RBouchSupPyrex        = SIMP (typ='R',statut='f'),
+# MatBouchonPyrex       = SIMP (typ=Materiau, statut='f')
+  BIPyrexHauteur        = SIMP (typ='R',      statut='o',fr="Hauteur en cm du bouchon inferieur du crayon pyrex"),
+  BIPyrexRayon          = SIMP (typ='R',      statut='o',fr="Rayon en cm du bouchon inferieur du crayon pyrex"),
+  PyrexZoneVideHauteur  = SIMP (typ='R',      statut='o',fr="Hauteur en cm de la zone vide dans le crayon pyrex"),
+  BSPyrexHauteur        = SIMP (typ='R',      statut='o',fr="Hauteur en cm du bouchon superieur du crayon pyrex"),
+  BSPyrexRayon          = SIMP (typ='R',      statut='o',fr="Rayon en cm du bouchon superieur du crayon pyrex"),
+  PyrexMateriauBouchon  = SIMP (typ=Materiau, statut='o',fr="Materiau du bouchon du crayon pyrex")
+ ) ;  # Fin ELEMENTS_ABSORBANTS_FIXES
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe GRAPPE_BOUCHON_ASSEMBLAGE : Classe de definition d'une grappe bouchon REP
+#  Rappel : Les grappes bouchons se trouvent dans le cas des REP inseres dans la partie embout superieur de tous les assemblages
+#           ne comportant pas de grappe d'absorbant.
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+GRAPPE_BOUCHON_ASSEMBLAGE = OPER (nom="GRAPPE_BOUCHON_ASSEMBLAGE",op=0,sd_prod=GrappeBouchonAssemblage,
+                          niveau = 'ElementsTechnologiquesAssemblages',
+  fr  = "Definition d'une grappe bouchon d'assemblage combustible",
+  ang = "Definition d'une grappe bouchon d'assemblage combustible",
+  HauteurPartieBasseBouchon           = SIMP (typ='R'     ,statut='o',fr="Hauteur en cm de la partie basse du bouchon"),
+  RayonPartieBasseBouchon             = SIMP (typ='R'     ,statut='o',fr="Rayon en cm de la partie basse du bouchon"),
+  Hauteur1PartieIntermediaire1Bouchon = SIMP (typ='R'     ,statut='o',fr="Hauteur en cm de la 1ere partie intermédiaire du bouchon"),
+  Rayon1PartieIntermediaire1Bouchon   = SIMP (typ='R'     ,statut='o',fr="Rayon en cm de la 1ere partie intermédiaire du bouchon"),
+  Hauteur2PartieIntermediaire2Bouchon = SIMP (typ='R'     ,statut='o',fr="Hauteur en cm de la 2eme partie intermédiaire du bouchon"),
+  Rayon2PartieIntermediaire2Bouchon   = SIMP (typ='R'     ,statut='o',fr="Rayon en cm de la 2eme partie intermédiaire du bouchon"),
+  RegionSousPlaqueHauteurBouchon      = SIMP (typ='R'     ,statut='o',fr="Hauteur en cm de la region sous plaque"),
+  RegionSurPlaqueHauteurBouchon       = SIMP (typ='R'     ,statut='o',fr="Hauteur en cm de la region au-dessus de la plaque"),
+  Rayon3BouchonRegionPlaque           = SIMP (typ='R'     ,statut='o',fr="Rayon en cm du bouchon au niveau de la plaque"),
+  HauteurSupport                      = SIMP (typ='R'     ,statut='o',fr="Hauteur en cm du support des bouchons"),
+  MasseGrappe                         = SIMP (typ='R'     ,statut='o',fr="Masse en g de la grappe bouchon"),
+  Materiau                            = SIMP (typ=Materiau,statut='o',fr="Materiau de la grappe bouchon",defaut='ACIER')
+ ) ;  # Fin GRAPPE_BOUCHON_ASSEMBLAGE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ELEMENTS_ASSEMBLAGE : Classe de définition des éléments associes a l'assemblage combustible REP
+#
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#ELEMENTS_ASSEMBLAGE = OPER (nom="ELEMENTS_ASSEMBLAGE",op=0,sd_prod=ElementsAssemblage,
+#
+#  fr  = "Definition des elements associes a l'assemblage",
+#  ang = "Definition of the fuel assembly associated elements",
+#  GrappeBouchon         = SIMP (typ=GrappeBouchonAssemblage,statut='o'),
+#  CrayonsAbsorbants     = SIMP (typ=ElementsAbsorbants,statut='o'),
+#  GrappesCommande       = SIMP (typ=ElementsGrappeCommande,statut='o')
+# ) ;
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classes CONDITION_LIMITE elementaires :     Classes de definition de Conditions limites elementaires
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+VIDE = OPER (nom="VIDE",op=0,sd_prod=Vide,   niveau = 'ConditionsLimites',
+             fr  = "Condition aux limites de vide",
+             ang = "Void boundary condition" ) ;
+REFLEXION_ISOTROPE = OPER (nom="REFLEXION_ISOTROPE",op=0,sd_prod=ReflexionIsotrope, niveau = 'ConditionsLimites',
+                           fr  = "Condition aux limites de reflexion isotrope",
+                           ang = "Isotropic Reflexion boundary condition" ) ;
+REFLEXION_SPECULAIRE = OPER (nom="REFLEXION_SPECULAIRE",op=0,sd_prod=ReflexionSpeculaire, niveau = 'ConditionsLimites',
+                             fr  = "Condition aux limites de reflexion speculaire",
+                             ang = "Specular Reflexion boundary condition" ) ;
+ALBEDO  = OPER (nom="ALBEDO",op=0,sd_prod=Albedo,   niveau = 'ConditionsLimites',
+                fr  = "Condition aux limites d'albedo",
+                ang = "Albedo boundary condition",
+                albedo = SIMP (typ='R',statut='o',max='**',fr="Valeurs des albedos") ) ;
+TRANSLATION = OPER (nom="TRANSLATION",op=0,sd_prod=Translation, niveau = 'ConditionsLimites',
+                    fr  = "Condition aux limites de translation",
+                    ang = "Translation boundary condition",
+                    Vecteur = SIMP (typ=Vecteur,statut='o',fr="Axe de translation") ) ;
+ROTATION = OPER (nom="ROTATION",op=0,sd_prod=Rotation,   niveau = 'ConditionsLimites',
+                fr  = "Condition aux limites de rotation",
+                ang = "Rotational boundary condition",
+                Centre  = SIMP (typ=Point  ,statut='o',fr="Centre de la rotation"),
+                Vecteur = SIMP (typ=Vecteur,statut='o',fr="Axe de rotation"),
+                Angle   = SIMP (typ='R'    ,statut='o',fr="Angle de rotation",defaut=90.) ) ;
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CONDITION_LIMITE_SPECIALE :  Classe de definition de Conditions limites sur les surfaces elementaires de la geometrie
+#                                      modifiant la CL generale
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CONDITION_LIMITE_SPECIALE = OPER (nom="CONDITION_LIMITE_SPECIALE",op=0,sd_prod=SpecialeConditionLimite,
+                                    niveau = 'ConditionsLimites',
+  fr  = "Condition limite particuliere qui sera plaquee sur la geometrie",
+  ang = "Special boundary condition added to the geometry",
+  Type = SIMP (typ=(Vide,ReflexionIsotrope,ReflexionSpeculaire, Albedo, Translation, Rotation),statut='o',
+               fr="Type de condition limite a appliquer aux surfaces listees"),
+  ZonesApplication = SIMP (typ=(Segment,ArcCercle,Conique),max='**',statut='o',
+                           fr="Liste des segments ou surfaces sur lesquels porte la condition limite")
+ ) ;  # Fin CONDITION_LIMITE_SPECIALE
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CONDITION_LIMITE_GENERALE : Classe de definition des conditions limites de l'objet geometrique complet
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CONDITION_LIMITE_GENERALE = OPER (nom="CONDITION_LIMITE_GENERALE",op=0,sd_prod=GeneraleConditionLimite,
+                                    niveau = 'ConditionsLimites',
+  fr  = "Condition limite a la surface externe de la geometrie complete",
+  ang = "Boundary condition for the complete geometry",
+  ZoneCalculee              = NUPL (statut='f',min=2,max=2,fr="Droites ou plans delimitant la zone de calcul",
+                                    elements = (SIMP (typ=(Droite,Plan)), SIMP (typ='TXM',into=('Plus','Moins')))),
+  ParDefautCondition        = SIMP (typ=(Vide, ReflexionIsotrope, ReflexionSpeculaire, Albedo),
+                                    defaut=ReflexionIsotrope,
+                                    statut='f',
+                                    fr="Condition limite par defaut"),
+  ParticulieresConditions   = NUPL (fr       = "Conditions particulieres modifiant localement la condition limite par defaut",
+                                    statut   = 'f', max = '**',
+                                    elements = (SIMP (typ='TXM',into=('X-','X+','Y-','Y+','Z-','Z+','R+','X','Y','Z')),
+                                                SIMP (typ=(Vide,ReflexionIsotrope,ReflexionSpeculaire, Albedo, Translation, Rotation)))),
+  SupplementairesConditions = SIMP (typ    = SpecialeConditionLimite,
+                                    statut = 'f', max = '**',
+                                    fr     = "Conditions limites non exprimables avec les donnees precedentes")
+ ) ;  # Fin CONDITION_LIMITE_GENERALE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe POSITION_ASSEMBLAGE_COMBUSTIBLE : Classe de definition de la position des assemblages combustibles dans un REP
+#                                           Reperes (bataille navale ou autre) et
+#                                           Coordonnees cartesiennes entieres des assemblages combustibles pour un type de palier
+#                                           Origine des coordonnees en bas a gauche d'un systeme en xy
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POSITION_ASSEMBLAGE_COMBUSTIBLE = OPER (nom="POSITION_ASSEMBLAGE_COMBUSTIBLE",op=0,sd_prod=PositionAssemblageCombustible,
+        niveau = 'ElementsTechnologiquesReacteur',
+  fr  = "Position des assemblages combustibles",
+  ang = "Position of fuel assemblies",
+  NbAssemblagesCombustibles = SIMP (typ='I',statut='o',defaut=157,fr="Nombre d'assemblages combustibles positionnes"),
+  regles = (UN_PARMI('PositionReseau', 'Positions'),),
+  PositionReseau = SIMP (typ=CorrespondanceReperePositionReseau,statut="f",fr="Objet donnant la correspondance entre Repere et Coordonnees entieres des assemblages"),
+  Positions      = NUPL (max='**',statut='f',
+                         elements=(SIMP (typ='TXM',fr="Repere alphanumerique arbitraire de l'assemblage"),
+                                   SIMP (typ='I'  ,fr="Premiere Coordonnee entiere de l'assemblage"),
+                                   SIMP (typ='I'  ,fr="Seconde  Coordonnee entiere de l'assemblage")))
+ ) ;  # Fin POSITION_ASSEMBLAGE_COMBUSTIBLE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe POSITION_INSTRUMENTATION_INTERNE : Classe de definition de la position des assemblages instrumentes dans le c\9cur d'un REP
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POSITION_INSTRUMENTATION_INTERNE = OPER (nom="POSITION_INSTRUMENTATION_INTERNE",op=0,sd_prod=PositionInstrumentationInterne,
+        niveau = 'ElementsTechnologiquesReacteur',
+  fr  = "Definition de la position des assemblages instrumentes",
+  ang = "Definition of neutron flux detector position",
+# TypePalier                = SIMP (typ='TXM',max='**',statut='o'),
+  NbAssemblagesInstrumentes = SIMP (typ='I',statut='o',fr="Nombre d'assemblages instrumentes"),
+  Positions                 = NUPL (
+      max      = '**',
+      statut   = 'o',
+      elements = (SIMP (typ='TXM',fr= "Type d'instrumentation (CFM, Collectron, ou Autre)"),
+                  SIMP (typ='I',min=2,max=2,fr= "Coordonnees entieres de l'assemblage instrumente dans le reseau")))
+ ) ;  # Fin POSITION_INSTRUMENTATION_INTERNE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe IMPLANTATION_GRAPPES_COMMANDE : Classe de definition de l'implantation des grappes de commande pour un type de schema de grappe (REP)
+#                                         Donnees de la position (coordonnees entieres en xy), du type de grappe et du groupe d'appartenance
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+IMPLANTATION_GRAPPES_COMMANDE = OPER (nom="IMPLANTATION_GRAPPES_COMMANDE", op=0, sd_prod=ImplantationGrappesCommande,
+        niveau = 'ElementsTechnologiquesReacteur',
+  fr  = "Position radiale des grappes de commande pour un schema d'implantation particulier",
+  ang = "Control rod cluster radial positions and types",
+  TypeSchema      = SIMP (typ='TXM',statut='o',fr="Identificateur arbitraire du type de schema"),
+  NbTotalGrappes  = SIMP (typ='I'  ,statut='o',fr="Nombre total de grappes du schema"),
+  PositionsEtType = NUPL (max='**' ,statut='o',
+                          elements=(SIMP (typ='TXM',statut='o',fr="Nom du groupe de grappes"),
+                                    SIMP (typ='I'  ,statut='o',fr="Nombre de grappes du groupe"),
+                                    SIMP (typ='TXM',statut='o',fr="Type de grappes (exemple : '8B', '12B', '24B')"),
+                                    SIMP (typ='I'  ,statut='o',max='**',fr="Coordonnees entieres des grappes dans le reseau coeur")))
+ ) ;  # Fin IMPLANTATION_GRAPPES_COMMANDE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe STRUCTURES_INTERNES_REACTEUR : Classe de definition des structures internes d'un coeur de REP
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+STRUCTURES_INTERNES_REACTEUR = OPER (nom="STRUCTURES_INTERNES_REACTEUR", op=0, sd_prod=StructuresInternesReacteur,
+        niveau = 'ElementsTechnologiquesReacteur',
+  fr  = "Definition des structures internes d'un c\9cur REP",
+  ang = "Definition of a PWR core internal structures",
+  PlaqueInferieureCoeur   = FACT (
+      Epaisseur = SIMP (typ='R',statut='o',fr="Epaisseur de la plaque inferieure du coeur en cm"),
+      Materiau  = SIMP (typ=Materiau,statut='f',defaut='ACIER',fr="Materiau de la plaque inferieure du coeur"),
+      Trous     = NUPL (
+          max      = '**',
+          elements = (
+              SIMP (typ='I',                               fr="Nombre de trous dont on donne les dimensions"),
+              SIMP (typ='TXM',into=('Rayon','Cotes'),      fr="Mot-cle indiquant si on donne le rayon ou les cotes"),
+              SIMP (typ='R',min=2,max=2,                   fr="Rayons ou cotes des trous en cm"),
+              SIMP (typ='TXM',into=('Hauteur','Epaisseur'),fr="Mot-cle indiquant l'entree de la hauteur du trou"),
+              SIMP (typ='R',                               fr="Hauteur du trou en cm")))),
+  PlaqueSuperieureCoeur   = FACT (
+      Epaisseur = SIMP (typ='R',                               fr="Epaisseur de la plaque superieure du coeur en cm"),
+      Materiau  = SIMP (typ=Materiau,statut='f',defaut='ACIER',fr="Materiau  de la plaque superieure du coeur"),
+      Trous     = NUPL (
+          max      = '**',
+          elements = (
+              SIMP (typ='I',                               fr="Nombre de trous dont on donne les dimensions"),
+              SIMP (typ='TXM',into=('Rayon','Cotes'),      fr="Mot-cle indiquant si on donne le rayon ou les cotes"),
+              SIMP (typ='R',min=2,max=2,                   fr="Rayons ou cotes des trous en cm"),
+              SIMP (typ='TXM',into=('Hauteur','Epaisseur'),fr="Mot-cle indiquant l'entree de la hauteur du trou"),
+              SIMP (typ='R',                               fr="Hauteur du trou en cm")))),
+  CloisonnementCoeur      = FACT (
+      Epaisseur             = SIMP (typ='R',                                fr="Epaisseur du cloisonnement du coeur"),
+      Materiau              = SIMP (typ=Materiau,statut='f',defaut='ACIER', fr="Materiau  du cloisonnement du coeur"),
+      DimensionsInterieures = NUPL (
+          max      = '**',
+          elements = (
+              SIMP (typ='I',                                      fr="Nombre d'assemblages dans la rangee"),
+              SIMP (typ='TXM',into=('Assemblages','Assemblies'),  fr="Mot-cle suivant le nombre d'assemblages"),
+              SIMP (typ='TXM',into=('Largeur','Cote'),            fr="Mot-cle precedant la largeur interieure du cloisonnement"),
+              SIMP (typ='R',                                      fr="Largeur interieure du cloisonnement en cm"),
+              SIMP (typ='TXM',into=('NbJeuCloisonGrille','NbJeu'),fr="Mot-cle precedant le nombre de jeux CloisonGrille"),
+              SIMP (typ='I',                                      fr="Nombre de jeux CloisonGrille"))),
+      TrousDepressurisation = NUPL (elements=(SIMP (typ='I',      fr="Nombre de trous de depressurisation"),
+                                              SIMP (typ='TXM',into=('Rayon','Radius'),fr="Mot-cle precedant la valeur du rayon des trous"),
+                                              SIMP (typ='R',fr="Rayon des trous de depressurisation en cm"))),
+      TemperatureMoyenne    = SIMP (typ='R',fr="Temperature Moyenne du cloisonnement en Celsius")),
+  RenfortsInternes        = FACT (statut='f',
+      Nombre                      = SIMP (typ='I',max='**',statut='o',fr="Liste des nombres de chaque type de renfort interne"),
+      Epaisseur                   = SIMP (typ='R',max='**',statut='o',fr="Nombre de renforts internes pour chaque type de renfort"),
+      Materiau                    = SIMP (typ=Materiau,max='**',statut='f',defaut='ACIER',fr="Materiau de chaque type de renfort"),
+      NbTrousDepressurisation     = SIMP (typ='I',max='**',statut='o',fr="Nombre de trous dans chaque type de renfort"),
+      RayonsTrousDepressurisation = SIMP (typ='R',max='**',statut='o',fr="Rayons des trous dans chaque type de renfort en cm"),
+      TemperatureMoyenne          = SIMP (typ='R',statut='f',fr="Temperature moyenne des renforts internes en Celsius")),
+  EnveloppeVirole        = FACT (statut='f',
+      RayonInterne       = SIMP (typ='R',statut='o',fr="Rayon interne de l'enveloppe du coeur en cm"),
+      RayonExterne       = SIMP (typ='R',statut='o',fr="Rayon externe de l'enveloppe du coeur en cm"),
+      Materiau           = SIMP (typ=Materiau,statut='f',defaut='ACIER',fr="Materiau de l'enveloppe du coeur"),
+      TemperatureMoyenne = SIMP (typ='R',statut='f',fr="Temperature moyenne de l'enveloppe du coeur en Celsius")),
+  Boucliers              = FACT (statut='f',
+      RayonInterne       = SIMP (typ='R',statut='o',fr="Rayon interne des boucliers thermiques du coeur en cm"),
+      RayonExterne       = SIMP (typ='R',statut='o',fr="Rayon externe des boucliers thermiques du coeur en cm"),
+      Materiau           = SIMP (typ=Materiau,statut='f',defaut='ACIER',fr="Materiau des boucliers thermiques du coeur"),
+      Secteurs           = NUPL (max='**',statut='f',elements=(
+                                 SIMP (typ='R',statut='o',fr="Angle en degres du debut du secteur du bouclier / axe Ox"),
+                                 SIMP (typ='R',statut='o',fr="Angle en degres du secteur du bouclier"))),
+      TemperatureMoyenne = SIMP (typ='R',statut='f',fr="Temperature moyenne en Celsius des boucliers du coeur")),
+  Cuve                   = FACT (statut='f',
+      RayonInterne       = SIMP (typ='R',statut='o',fr="Rayon interne de la cuve en cm"),
+      RayonExterne       = SIMP (typ='R',statut='o',fr="Rayon externe de la cuve en cm"),
+      Materiau           = SIMP (typ=Materiau,statut='f',defaut='ACIER',fr="Materiau de la cuve"),
+      TemperatureMoyenne = SIMP (typ='R',statut='f',fr="Temperature moyenne en Celsius de la cuve"))
+ ) ; # Fin STRUCTURES_INTERNES_REACTEUR
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PRESSURISEUR : Classe de definition d'un pressuriseur REP (Valeurs par defaut pour un CP2 900)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PRESSURISEUR = OPER (nom="PRESSURISEUR", op=0, sd_prod=Pressuriseur, niveau = 'ElementsTechnologiquesReacteur',
+  fr  = "Donnees d'un pressuriseur REP",
+  ang = "Definition of a PWR pressurizor",
+  TmNominale            = SIMP (typ='R',statut='o',defaut=345.0  ,fr="Temperature nominale en Celsius dans le pressuriseur"),
+  Volume                = SIMP (typ='R',statut='o',defaut=39.865 ,fr="Volume total du pressuriseur en m3"),
+  VolumeHaut            = SIMP (typ='R',statut='o',defaut=37.196 ,fr="Volume d'eau au niveau haut du pressuriseur en m3"),
+  VolumeBas             = SIMP (typ='R',statut='o',defaut=2.597  ,fr="Volume d'eau au niveau bas du pressuriseur en m3"),
+  DiametreExterne       = SIMP (typ='R',statut='o',defaut=235.   ,fr="Diametre externe du pressuriseur en cm"),
+  Hauteur               = SIMP (typ='R',statut='o',defaut=1280.  ,fr="Hauteur du pressuriseur en cm"),
+  Pression              = SIMP (typ='R',statut='o',defaut=172.37 ,fr="Pression de calcul du pressuriseur en bars"),
+  CapaciteChaufferette  = SIMP (typ='R',statut='o',defaut=1440.  ,fr="Capacite des chaufferettes du pressuriseur en kW"),
+  NbChaufferettes       = SIMP (typ='I',statut='o',defaut=60     ,fr="Nombre de chaufferettes du pressuriseur"),
+  MasseAVide            = SIMP (typ='R',statut='o',defaut=78.    ,fr="Masse a vide du pressuriseur en tonnes"),
+  MasseEnService        = SIMP (typ='R',statut='o',defaut=95.    ,fr="Masse du pressuriseur en service normal en tonnes"),
+  PressionDecharge      = SIMP (typ='R',statut='o',defaut=162.   ,fr="Pression d'ouverture de la decharge du pressuriseur en bars"),
+  PressionSoupape       = SIMP (typ='R',statut='o',defaut=171.5  ,fr="Pression de tarage des soupapes de surete du pressuriseur en bars"),
+  VolumeDecharge        = SIMP (typ='R',statut='o',defaut=37.    ,fr="Volume total du reservoir de decharge du pressuriseur en m3"),
+  VolumeliquideDecharge = SIMP (typ='R',statut='o',defaut=25.5   ,fr="Volume de liquide du reservoir de decharge du pressuriseur en fct normal en m3")
+ ) ;  # Fin PRESSURISEUR
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe GENERATEUR_VAPEUR : Classe de definition d'un generateur de vapeur REP (Valeurs par defaut pour un CP2 900) 
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+GENERATEUR_VAPEUR = OPER (nom="GENERATEUR_VAPEUR", op=0, sd_prod=GenerateurVapeur, niveau = 'ElementsTechnologiquesReacteur',
+  fr  = "Donnees d'un generateur de vapeur REP",
+  ang = "Definition of a PWR Steam Generator",
+  HauteurTotale         = SIMP (typ='R',statut='o',defaut=2064.8 ,fr="Hauteur totale d'un GV en cm"),
+  DiametreMaximum       = SIMP (typ='R',statut='o',defaut=446.8  ,fr="Diametre maximum d'un GV en cm"),
+  DiametreMinimum       = SIMP (typ='R',statut='o',defaut=343.4  ,fr="Diametre minimum d'un GV en cm"),
+  NbTubes               = SIMP (typ='I',statut='o',defaut=3330   ,fr="Nombre de tubes d'un GV"),
+  TubeDiametre          = SIMP (typ='R',statut='o',defaut=2.222  ,fr="Diametre des tubes d'un GV en cm"),
+  TubeEpaisseur         = SIMP (typ='R',statut='o',defaut=0.127  ,fr="Epaisseur des tubes d'un GV en cm"),
+  PasReseau             = SIMP (typ='R',statut='o',defaut=3.254  ,fr="Pas du reseau des tubes d'un GV en cm"),
+  LongueurTube          = SIMP (typ='R',statut='o',defaut=963.7  ,fr="Longueur droite des tubes d'un GV en cm"),
+  SurfaceEchange        = SIMP (typ='R',statut='o',defaut=4700.  ,fr="Surface d'échange d'un GV en m2"),
+  PlaqueEpaisseur       = SIMP (typ='R',statut='o',defaut=53.4   ,fr="Epaisseur de la plaque tubulaire d'un GV en cm"),
+  PlaqueDiametre        = SIMP (typ='R',statut='o',defaut=345.4  ,fr="Diametre de la plaque tubulaire d'un GV en cm"),
+  NbEntretoises         = SIMP (typ='I',statut='o',defaut=8          ,fr="Nombre de plaques entretoises d'un GV"),
+  MasseAVide            = SIMP (typ='R',statut='o',defaut=300.   ,fr="Masse a vide d'un GV en tonnes"),
+  MasseFctNormal        = SIMP (typ='R',statut='o',defaut=364.   ,fr="Masse en fonctionnement normal d'un GV en tonnes"),
+  MasseFaisceau         = SIMP (typ='R',statut='o',defaut=51.5   ,fr="Masse du faisceau tubulaire d'un GV en tonnes"),
+  ViroleSupEpaisseur    = SIMP (typ='R',statut='o',defaut=9.4    ,fr="Epaisseur de la virole superieure d'un GV en cm"),
+  ViroleInfEpaisseur    = SIMP (typ='R',statut='o',max=3,defaut=(8.4,7.4),fr="Epaisseur(s) de la virole inferieure d'un GV en cm"),
+  MateriauEntretroises  = SIMP (typ=Materiau,statut='o',defaut='ACIER'  ,fr="Materiau des plaques entretoises d'un GV"),
+  MateriauTube          = SIMP (typ=Materiau,statut='o',defaut='INCONEL',fr="Materiau des tubes du faisceau d'un GV"),
+  GeomReseau            = SIMP (typ='TXM',statut='o',defaut='Carre',into=('Carre','Triangulaire'),
+                                fr="Type de geometrie du reseau des tubes d'un GV")
+ ) ;  # Fin GENERATEUR_VAPEUR
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe POMPE_PRIMAIRE : Classe de definition d'une pompe primaire REP (Valeurs par defaut pour un CP2 900)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POMPE_PRIMAIRE = OPER (nom="POMPE_PRIMAIRE", op=0, sd_prod=PompePrimaire, niveau = 'ElementsTechnologiquesReacteur',
+  fr  = "Donnees d'une pompe primaire REP",
+  ang = "Definition of a PWR primary pomp",
+  Type                = SIMP (typ='TXM',statut='o', defaut='93-D7'     ,fr="Type de pompe"),
+  TensionNominale     = SIMP (typ='R'  ,statut='o', defaut=6600.       ,fr="Tension nominale en Volts d'une pompe primaire"),
+  VitesseRotation     = SIMP (typ='I'  ,statut='o', defaut=1485                ,fr="Vitesse de rotation tours/mn ? d'une pompe primaire"),
+  DebitConception     = SIMP (typ='R'  ,statut='o', defaut=21250.      ,fr="Debit de conception m3/h d'une pompe primaire"),
+  HauteurManometrique = SIMP (typ='R'  ,statut='o', defaut=90.7                ,fr="Hauteur manometrique ds pompes en mCE"),
+  PuissanceFroid      = SIMP (typ='R'  ,statut='o', defaut=6600.       ,fr="Puissance absorbee a froid sur l'arbre de la pompe en kW"),
+  PuissanceChaud      = SIMP (typ='R'  ,statut='o', defaut=5000.       ,fr="Puissance absorbee a chaud sur l'arbre de la pompe en kW"),
+  PuissanceNominale   = SIMP (typ='R'  ,statut='o', defaut=5300.       ,fr="Puissance absorbee nominale par moteur en kW"),
+  TensionMinimale     = SIMP (typ='R'  ,statut='o', defaut=0.75                ,fr="Tension minimale de démarrage en fraction de la tension nominale"),
+  Masse               = SIMP (typ='R'  ,statut='o', defaut=93.9                ,fr="Masse d'une pompe primaire en tonnes avec huile et eau"),
+  HauteurTotale       = SIMP (typ='R'  ,statut='o', defaut=8.1         ,fr="Hauteur totale d'une pompe primaire en cm"),
+  Inertie             = SIMP (typ='R'  ,statut='o', defaut=3730.       ,fr="Inertie des pieces tournantes en kg.m2"),
+  DebitInjection      = SIMP (typ='R'  ,statut='o', defaut=1800.       ,fr="Debit d'injection aux joints en l/h")
+ ) ;  # Fin POMPE_PRIMAIRE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CARACTERISTIQUES_PALIER : Classe de definition des donnees generales d'un type de palier de reacteur
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CARACTERISTIQUES_PALIER = OPER (nom="CARACTERISTIQUES_PALIER",op=0,sd_prod=CaracteristiquesPalier,
+        niveau = 'ElementsTechnologiquesReacteur',
+  fr  = "Donnees generales pour un type de palier de reacteur",
+  ang = "General data for a particular type of nuclear reactor",
+  TypePalier                     = SIMP (typ='TXM',statut='o',fr="Identificateur du type de palier"),
+  PositionCombustible            = SIMP (typ=PositionAssemblageCombustible ,statut='o',
+                                         fr="Objet definissant la position des assemblages dans le coeur"),
+  PositionDetecteur              = SIMP (typ=PositionInstrumentationInterne,statut='o',
+                                         fr="Objet definissant la position des assemblages instrumentes"),
+  StructuresInternes             = SIMP (typ=StructuresInternesReacteur    ,statut='o',
+                                         fr="Objet definissant les structures internes du reacteur"),
+  Pressuriseur                   = SIMP (typ=Pressuriseur                  ,statut='f',
+                                         fr="Objet contenant les caracteristiques du pressuriseur du reacteur"),
+  Generateur                     = SIMP (typ=GenerateurVapeur              ,statut='f',
+                                         fr="Objet contenant les caracteristiques des GV du reacteur"),
+  Pompes                         = SIMP (typ=PompePrimaire                 ,statut='f',
+                                         fr="Objet contenant les caracteristiques des pompes primaires du reacteur"),
+  CoeurPElectriqueNominle        = SIMP (typ='R',statut='o',defaut= 900.,
+                                         fr="Puissance electrique nominale de coeur en MW"),
+  CoeurPThermiqueNominale        = SIMP (typ='R',statut='o',defaut=2775.,
+                                         fr="Puissance thermique nominale de coeur en MWth"),
+  ChaudierePThermiqueNominale    = SIMP (typ='R',statut='o',defaut=2785.,
+                                         fr="Puissance thermique nominale de la chaudiere MWth"),
+  ChaudierePmaxThermique         = SIMP (typ='R',statut='o',defaut=2905.,
+                                         fr="Puissance thermique maximum de la chaudiere MWth"),
+  NbBouclesPrimaires             = SIMP (typ='I',statut='o',defaut=3,
+                                         fr="Nombre de boucles primaires"),
+  ProportionDebitCoeurCuve       = SIMP (typ='R',statut='o',defaut=0.97,
+                                         fr="Rapport du debit coeur / debit cuve"),
+  PressionNominalePrimaire       = SIMP (typ='R',statut='o',defaut=155.,
+                                         fr="Pression nominale du circuit primaire en bars"),
+  PerteChargeCoeurNominale       = SIMP (typ='R',statut='o',defaut=1.24,
+                                         fr="Perte de charge nominale dans le coeur en bars"),
+  PerteChargeCuveNominale        = SIMP (typ='R',statut='o',defaut=2.34,
+                                         fr="Perte de charge nominale dans la cuve en bars"),
+  TmNomSortieCuveEntreeGV        = SIMP (typ='R',statut='o',defaut=323.2,
+                                         fr="Temperature nominale sortie Cuve / Entree GV en Celsius"),
+  TmNomSortieGVEntreePPrimaire   = SIMP (typ='R',statut='o',defaut=285.8,
+                                         fr="Temperature nominale sortie GV / Entree Pompe primaire en Celsius"),
+  TmNomSortiePPrimaireEntreeCuve = SIMP (typ='R',statut='o',defaut=286.,
+                                         fr="Temperature nominale sortie Pompe primaire / Entree Cuve en Celsius"),
+  TmEntreeCoeurPnulle            = SIMP (typ='R',statut='o',defaut=286.0,
+                                         fr="Temperature en Celsius du moderateur a puissance nulle a l'entree du coeur"),
+  TmEntreeCoeurPnom              = SIMP (typ='R',statut='o',defaut=286.4,
+                                         fr="Temperature en Celsius du moderateur a puissance nominale a l'entree du coeur"),
+  TmSortieCoeurPnom              = SIMP (typ='R',statut='o',defaut=324.7,
+                                         fr="Temperature en Celsius du moderateur a puissance nominale a l'entree du coeur"),
+  TmMoyenneCoeurPnom             = SIMP (typ='R',statut='o',defaut=305.3,
+                                         fr="Temperature moyenne en Celsius du moderateur dans le coeur actif"),
+  TmMoyenneCuvePnom              = SIMP (typ='R',statut='o',defaut=305.0,
+                                         fr="Temperature moyenne en Celsius du moderateur dans la cuve"),
+  TmMoyenneReflecteurPnom        = SIMP (typ='R',statut='o',defaut=296.0,
+                                         fr="Temperature moyenne en Celsius du reflecteur radial"),
+  TcMoyennePnom                  = SIMP (typ='R',statut='o',defaut=600.0,
+                                         fr="Temperature moyenne en Celsius du combustible dans le coeur"),
+  TcCentrePnom                   = SIMP (typ='R',statut='o',defaut=1830.,
+                                         fr="Temperature au centre Pastille en Celsius en fct nominal"),
+  SectionEcoulementCoeur         = SIMP (typ='R',statut='o',defaut=3.86,
+                                         fr="Section d'ecoulement du moderateur dans le coeur en m2"),
+  SurfaceEchangeCoeur            = SIMP (typ='R',statut='o',defaut=4520.,
+                                         fr="Surface d'échange dans le coeur en m2"),
+  VolumeEauCuve                  = SIMP (typ='R',statut='o',defaut=105.8,
+                                         fr="Volume d'eau primaire m3 dans la cuve (coeur et internes en place)"),
+  VolumeEauPrimaire              = SIMP (typ='R',statut='o',defaut=215.,
+                                         fr="Volume total d'eau primaire m3)"),
+  VolumeBallonRCV                = SIMP (typ='R',statut='o',defaut=7.,
+                                         fr="Volume du ballon RCV m3)"),
+  DebitThermohConception         = SIMP (typ='R',statut='o',defaut=63325.,
+                                         fr="Debit thermohydraulique de conception dans la cuve en m3/h"),
+  DebitMecaniqueConception       = SIMP (typ='R',statut='o',defaut=70920.,
+                                         fr="Debit mecanique de conception dans la cuve en m3/h"),
+  BypassConception               = SIMP (typ='R',statut='o',defaut=7.,
+                                         fr="Pourcentage de debit Conception dans le contournement du coeur en %"),
+  BypassSpin                     = SIMP (typ='R',statut='o',defaut=4.5,
+                                         fr="Pourcentage de debit dans le contournement du coeur en % utilise dans le SPIN"),
+  DebitBestEstimateBoucle        = SIMP (typ='R',statut='o',defaut=21075.,
+                                         fr="Debit best-estimate par boucle en m3/h"),
+  DebitMassiqueNominal           = SIMP (typ='R',statut='o',defaut=47675.,
+                                         fr="Debit massique nominal best-estimate dans la cuve en t/h"),
+  DebitEffMassiqueNominal        = SIMP (typ='R',statut='o',defaut=45530.,
+                                         fr="Debit massique effectif du coeur en t/h"),
+  FluxMoyenChaleurCoeur          = SIMP (typ='R',statut='o',defaut=60.,
+                                         fr="Flux de chaleur moyen dans le coeur W/cm2"),
+  FluxMaxChaleurCoeur            = SIMP (typ='R',statut='o',defaut=128.,
+                                         fr="Flux de chaleur maximal dans le coeur W/cm2"),
+  PlinMoyen                      = SIMP (typ='R',statut='o',defaut=178.,
+                                         fr="Puissance lineique Moyenne en W/cm"),
+  PlinMax                        = SIMP (typ='R',statut='o',defaut=382.,
+                                         fr="Puissance lineique Maximum en W/cm"),
+  FacteurFQN                     = SIMP (typ='R',statut='o',defaut=2.69,
+                                         fr="Facteur de point chaud de conception FQN"),
+  FacteurFDH                     = SIMP (typ='R',statut='o',defaut=1.55,
+                                         fr="Facteur total d'élévation d'enthalpie FDH de conception"),
+  RECMinimalNominal              = SIMP (typ='R',statut='o',defaut=1.78,
+                                         fr="REC minimal en fonctionnement nominal"),
+  VitesseMoyenneModerCoeur       = SIMP (typ='R',statut='o',defaut=4.72,
+                                         fr="Vitesse moyenne dans le coeur en m/s"),
+  VitesseMassiqueModerCoeur      = SIMP (typ='R',statut='o',defaut=328.,
+                                         fr="Vitesse massique moyenne dans le coeur en g/s.cm2"),
+  VitesseRechaufRefroid          = SIMP (typ='R',statut='o',defaut=28.,
+                                         fr="Vitesse normale maximale de rechauffage ou de refroidissementnormal en Celsius/h"),
+  VitesseMaxRechaufRefroid       = SIMP (typ='R',statut='o',defaut=56.,
+                                         fr="Vitesse maximale de rechauffage ou de refroidissementnormal en Celsius/h")
+ ) ;  # Fin CARACTERISTIQUES_PALIER
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe SITE_NUCLEAIRE_EDF : Classe de definition d'un site nucleaire EDF (Tranches, paliers et numero EPN)
+#  Le numero EPN correspond au code de la tranche, cette donnee figure dans le fichier ASN transmis par la Division Combustible
+#  decrivant chaque recharge combustible (et identifie donc la tranche a laquelle elle est destinee)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+SITE_NUCLEAIRE = OPER (nom="SITE_NUCLEAIRE", op=0, sd_prod=SiteNucleaire, niveau = 'ElementsTechnologiquesReacteur',
+  fr  = "Definition d'un site nucleaire EDF et de ses tranches",
+  ang = "Definition of a nuclear power plant site",
+  NomSite  = SIMP (typ='TXM',statut='o',fr="Nom du site nucleaire",defaut='TRICASTIN'),
+  Tranches = NUPL (max='**',elements=( SIMP (typ='I'  ,statut='o',fr="Numero de la tranche nucleaire"),
+                                       SIMP (typ='TXM',statut='o',fr="Trigramme de la tranche nucleaire"),
+                                       SIMP (typ=CaracteristiquesPalier,statut='o',fr="Type de palier"),
+                                       SIMP (typ='I'  ,statut='o',fr="Numero EPN de la tranche")))
+ ) ;   # Fin SITE_NUCLEAIRE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ESPACE_VARIATIONS :  Classe de definition de l'espace des parametres variables et sa discretisation.
+#                              De manière generale, un parametre peut valoriser un attribut quelconque de plusieurs objets. L'association
+#                              Parametre-Attributs se fait par l'attribut ObjetsVariations de la classe definie ci-dessous
+#                              de maniere purement textuelle sous la forme 'NomObjet.NomAttribut(.NomSousAttribut)[Index]'.
+#                              L'attribut variable peut etre un objet, auquel cas les valeurs de variation sont les noms textuels
+#                              des objets a remplacer successivement dans chaque calcul elementaire.
+#                              Il n'y a pas de verification de coherence au niveau de la saisie des donnees mais immediatement apres
+#                              lors de l'interpretation de l'ensemble de l'objet DonneesCasEtude .
+#                              Definition de la methode de balayage de cet espace (Suite d'options complementaires) :
+#                              1) ParametresIndependants :     Calculs independants en donnant successivement a chacun
+#                                                               des parametres leurs valeurs individuelles
+#                              2) CoinsDomaine :               Rajout des calculs aux limites extremes du domaine
+#                              3) BordsDomaine :               Rajout des calculs aux bords du domaine
+#                              4) Grilles2D :                  Rajout des calculs sur les grilles 2D
+#                                                               passant par un point de reference
+#                              5) CasParticuliers :            Rajout de points specifiques de calcul
+#                              6) EspaceComplet :              Balayage complet du domaine des parametres
+#                              Par defaut, le cas de reference est le premier cas defini soit dans CasParticuliers si les cas sont fournis
+#                              de cette façon, soit par les premieres valeurs rentrees pour chacun des paramètres,
+#                              sauf entree explicite de l'attribut CasReference
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ESPACE_VARIATIONS = OPER (nom="ESPACE_VARIATIONS", op=0, sd_prod=EspaceVariations, niveau = 'ParametresCalcul',
+  fr  = "Definition de l'espace des parametres et de leurs variations",
+  ang = "Definition of feedback or variable parameters",
+  regles = (AU_MOINS_UN ('Variations', 'CasParticuliers'),),
+  Variations       = NUPL (max='**',statut='f',
+                           elements=( SIMP (typ='TXM',statut='o',fr="Nom arbitraire du parametre a faire varier"),
+                                      SIMP (typ=('R','I','TXM'),max='**',statut='o',fr="Valeurs discretes de variation du parametre"))),
+  ObjetsVariations = NUPL (max='**',statut='o',fr="Association Parametre et attributs des objets du modele de donnees",
+                           elements=( SIMP (typ='TXM',statut='o',fr="Nom arbitraire du parametre a faire varier"),
+                                      SIMP (typ='TXM',max='**',statut='o',fr="Objets, attributs et index associes au parametre"))),
+  MethodeBalayage = SIMP (
+      typ    = 'TXM',
+      max    = '**',
+      defaut = 'ParametresIndependants',
+      into   = ('ParametresIndependants','CoinsDomaine','BordsDomaine','Grilles2D','CasParticuliers','EspaceComplet'),
+      statut = 'o'),
+  TypeVariation   = SIMP (typ='TXM',defaut='Absolu',into=('Relatif','Absolu'),statut='o'),
+  CasParticuliers = NUPL (max='**',statut='f',fr="Liste des couples (Parametre, Valeur du parametre) pour les cas particuliers",
+                          elements=(SIMP (typ='TXM',fr="Nom arbitraire du parametre a faire varier"),
+                                    SIMP (typ=('I','R','TXM'),fr="Valeur du parametre"))),
+  CasReference    = NUPL (max='**',statut='f',fr="Liste des couples (Parametre, Valeur du parametre) pour le cas de reference",
+                          elements=(SIMP (typ='TXM',fr="Nom arbitraire du parametre a faire varier"),
+                                    SIMP (typ=('I','R','TXM'),fr="Valeur du parametre")))
+ ) ;   # Fin ESPACE_VARIATIONS
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DONNEES_IRRADIATION : Classe de definition des valeurs d'irradiation intervenant dans les phases de calcul ou d'edition
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DONNEES_IRRADIATION = OPER (nom="DONNEES_IRRADIATION",op=0,sd_prod=DonneesIrradiation,
+        niveau = 'ParametresCalcul',
+  fr  = "Definition des donnees d'irradiation",
+  ang = "Definition of burnup values",
+  regles = (AU_MOINS_UN ('Irradiations', 'Refroidissement','InsertionGrappeX'),),
+  Unite           = SIMP (typ='TXM',defaut='MWj/t',into=('MWj/t','Jours'),statut='o',fr="Unite pour les irradiations"),
+  Minimum         = SIMP (typ='R',defaut=0.,statut='f',fr="Irradiation du debut de calcul"),
+  Maximum         = SIMP (typ='R',defaut=100000.,statut='f',fr="Irradiation maximum des calculs"),
+  Irradiations    = SIMP (typ='R',max='**',defaut=0.,statut='f',fr="Liste previsionnelle des irradiations"),
+  Refroidissement = FACT (statut='f',fr="Definition de la periode de refroidissement",
+                          Instants = SIMP (typ='R',max='**',fr="Irradiations MWj/t de debut de refroidissement du combustible"),
+                          Duree    = SIMP (typ=('R','I'),max='**',fr="Nombre de jours de refroidissement correspondant aux instants de refroidissement")
+                         ),
+  InsertionGrappeX     = FACT (statut='f',fr="Simulation d'une insertion de grappe dans un assemblage seul (Mode X)",
+       TypeGrappe            = SIMP (typ='TXM',     statut='o',fr="Type de grappe inseree"),
+       IrradiationInsertion  = SIMP (typ=('R','I'), statut='o',max='**',fr="Irradiations MWj/t de debut d'insertion de la grappe"),
+       IrradiationExtraction = SIMP (typ=('R','I'), statut='o',max='**',fr="Irradiations MWj/t d'extraction de la grappe"),
+       CoteAxiale            = SIMP (typ='R',       statut='f',fr="Cote axiale (cm) de la limite inferieure de la grappe aux instants d'insertion")
+                               )
+ ) ;  # Fin DONNEES_IRRADIATION
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CONDITIONS_FONCTIONNEMENT_MOYENNES : Classe de definition des conditions de fonctionnement Reacteur pour une campagne donnee
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CONDITIONS_FONCTIONNEMENT_MOYENNES = OPER (nom="CONDITIONS_FONCTIONNEMENT_MOYENNES",op=0,sd_prod=ConditionsFonctionnementMoyennes,
+        niveau = 'ParametresCalcul',
+  fr  = "Definition des conditions de fonctionnement moyennes pour une campagne donnee",
+  ang = "Definition of a campaign operating conditions ",
+  IdentificateurCampagne       = SIMP (typ='TXM',statut='f',fr="Identificateur de la campagne"),
+  DescriptifFonctionnement     = SIMP (typ='TXM',statut='f',fr="Descriptif textuel arbitraire du mode de fonctionnement"),
+  regles = (UN_PARMI ('PuissanceThermiqueCoeur', 'PuissanceRelativeCoeur'),),
+  PuissanceThermiqueCoeur      = SIMP (typ='R',statut='o',defaut=2775.,fr="Puissance thermique du reacteur en MWth"),
+  PuissanceRelativeCoeur       = SIMP (typ='R',statut='o',defaut=100. ,fr="Puissance relative du reacteur en %"),
+  FluxSurfaciquePn             = SIMP (typ='R',statut='o',defaut=59.74 ,fr="Flux a la surface du crayon en W/cm2"),
+  PressionEntreePrimaire       = SIMP (typ='R',statut='o',defaut=155.1,fr="Pression du moderateur en bars a l'entree du coeur actif"),
+  PressionSortiePrimaire       = SIMP (typ='R',statut='o',defaut=155.1,fr="Pression moyenne du moderateur en bars en sortie du coeur actif"),
+  TitreMoyenBore               = SIMP (typ='R',statut='o',defaut= 500.,fr="Titre moyen en ppm en bore dans le moderateur"),
+#
+  TmEntreePnulle               = SIMP (typ='R',statut='o',defaut=286.0,fr="Temperature en Celsius du moderateur a puissance nulle a l'entree du coeur"),
+  TmEntreePnom                 = SIMP (typ='R',statut='o',defaut=286.4,fr="Temperature en Celsius du moderateur a puissance nominale a l'entree du coeur"),
+  DeltaTmEntreeSortiePnom      = SIMP (typ='R',statut='o',defaut= 39.0,fr="Ecart en Celsius de temperature entre entree et sortie du coeur a puissance nominale"),
+  TmMoyenneCoeurPnom           = SIMP (typ='R',statut='o',defaut=305.3,fr="Temperature moyenne en Celsius du moderateur dans le coeur actif"),
+  TmMoyenneCuvePnom            = SIMP (typ='R',statut='f',defaut=305.0,fr="Temperature moyenne en Celsius du moderateur dans la cuve"),
+  TmMoyenneReflecteurPnom      = SIMP (typ='R',statut='f',defaut=296.0,fr="Temperature moyenne en Celsius du reflecteur radial"),
+  TcMoyennePnom                = SIMP (typ='R',statut='f',defaut=600.0,fr="Temperature moyenne en Celsius du combustible dans le coeur"),
+#
+  PositionGrappeHaute          = SIMP (typ='I',statut='f',defaut=225  ,fr="Position haute des grappes, en nombre de pas extraits"),
+  DebitMesureParBoucle         = FACT (statut='f',max='**',fr="Debit primaire mesure sur chaque boucle en m3/h",
+                                       DateEssai = SIMP (typ='I',min=3,max=3,fr="Date J M A de l'essai"),
+                                       Debits    = SIMP (typ='R',min=3,max=4,fr="Valeurs des debits primaire par boucle en m3/h")
+                                       ),
+  NbTubesGVBouches             = SIMP (typ='I',statut='f',min=3,max=4,fr="Nombre de tubes bouches pour chaque GV")
+ ) ; # Fin CONDITIONS_FONCTIONNEMENT_MOYENNES
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CONDITIONS_TRANSITOIRE : Classe de definition des conditions de fonctionnement Reacteur pour une campagne donnee en transitoire
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CONDITIONS_TRANSITOIRE = OPER (nom="CONDITIONS_TRANSITOIRE", op=0, sd_prod=ConditionsTransitoire, niveau = 'ParametresCalcul',
+  fr  = "Definition des conditions de fonctionnement en transitoire pour une campagne donnee",
+  ang = "Definition of a campaign dynamic operating conditions ",
+  IdentificateurCampagne          = SIMP (typ='TXM',max='**',statut='f',fr="Identificateur de la campagne"),
+  NeutroniqueDiscretisation       = SIMP (typ='R',max='**',statut='f',fr="Liste des pas de temps successifs pour le calcul neutronique (en s)"),
+  ThermohydrauliqueDiscretisation = SIMP (typ='R',statut='f',fr="Liste des pas de temps successifs pour le calcul thermohydraulique (en s)"),
+  DureeTransitoire                = SIMP (typ='R',statut='o',fr="Duree totale en s du transitoire a simuler"),
+  PuissanceThermiqueRelative      = SIMP (typ='R',max='**',statut='f',fr="Couples (Instant en s, Puissance thermique relative du reacteur en %)"),
+  PressionPrimaireEntree          = SIMP (typ='R',max='**',statut='f',fr="Couples (Instant en s, Pression du moderateur en bars a l'entree du coeur actif)"),
+  TitreBore                       = SIMP (typ='R',max='**',statut='f',fr="Couples (Instant en s, Titre en bore dans le moderateur (en ppm))"),
+  DebitPrimaire                   = SIMP (typ='R',max='**',statut='f',fr="Couples (Instant en s, Debit primaire dans le coeur en m3/h)")
+# PositionsGrappes                = SIMP (typ=PositionAxialeGrappesCommande,statut='f')
+# PositionsGrappes                = FACT (max='**',statut='f',
+#                                         RepereGrappeouGroupe = SIMP (typ='TXM',fr="Repere du groupe de grappes ou de la grappe"),
+#                                         Positions            = SIMP (typ='R',max='**',
+#                                                                      fr="Couples (Instant en s, Position dans le coeur en nombre de pas extraits)"))
+ ) ;  # Fin CONDITIONS_TRANSITOIRE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe POSITION_AXIALE_GRAPPES_COMMANDE : Classe de definition des positions axiales des grappes de commande
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+POSITION_AXIALE_GRAPPES_COMMANDE = OPER (nom="POSITION_AXIALE_GRAPPES_COMMANDE",op=0,sd_prod=PositionAxialeGrappesCommande,
+        niveau = 'ParametresCalcul',
+  fr  = "Positions axiales des grappes de commande pour une campagne donnee ou pour un transitoire",
+  ang = "Control rod cluster axial positions for a campaign or for a static or dynamic calculation",
+  TypeDonnee    = SIMP (typ='TXM',statut='o',defaut='Statique',into=('Statique','Cinetique','Campagne'),
+                        fr="Indication de dependance ou non d'un parametre Temps ou Irradiation"),
+  UnitePosition = SIMP (typ='TXM',statut='o',defaut='PasExtrait',into=('PasExtrait', 'cm', 'Recouvrement')),
+  BlocStatique  = BLOC (condition = "TypeDonnee=='Statique'",
+                        PositionStatique = NUPL (max='**',statut='o',elements =(
+                                          SIMP (typ='TXM',fr="Nom du groupe de grappes ou de la grappe"),
+                                          SIMP (typ=('R','I'),fr="Position axiale"))
+                                          )
+                       ),
+  BlocCinetique  = BLOC (condition = "TypeDonnee=='Cinetique'",
+                         PositionCinetique = FACT (max='**',statut='o',
+                                           NomGrappeouGroupe = SIMP (typ='TXM',fr="Nom du groupe de grappes ou de la grappe"),
+                                           CotesAxiales      = SIMP (typ=('R','I'),max='**',
+                                                                     fr="Liste des Couples (Instant en s, Position axiale)")
+                                           )
+                        ),
+  BlocCampagne  = BLOC (condition = "TypeDonnee=='Campagne'",
+                        PositionCampagne = FACT (max='**',statut='o',
+                                          NomGrappeouGroupe = SIMP (typ='TXM',fr="Nom du groupe de grappes ou de la grappe"),
+                                          CotesAxiales      = SIMP (typ=('R','I'),max='**',
+                                                                    fr="Liste des Couples (Irradiation MWj/t, Position axiale)")
+                                          )
+                        )
+  ) ;  # Fin POSITION_AXIALE_GRAPPES_COMMANDE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DATES_CLES_CAMPAGNE : Classe de definition des dates cles d'une campagne et de sa longueur
+#  Definition des attributs :
+#  LongueurNaturelleExperimentaleMWj_t : Irradiation moyenne coeur depuis le debut de la campagne jusqu'au moment du passage en
+#                                        prolongation de campagne (valeur experimentale transmise par le site). En cas d'anticipation,
+#                                        c'est la valeur recalee qui y est stockee.
+#  LongueurNaturelleRecaleeMWj_t : Longueur naturelle previsionnelle estimee en cours de campagne (par le suivi du bore,
+#                                  a chaque carte de flux)
+#  LongueurNaturelleTheoriqueMWj_t : Longueur naturelle estimee par le code de coeur
+#  LongueurAnticipationJepp : Longueur d'anticipation de campagne en Jours Equivalents Pleine Puissance
+#  LongueurProlongationJepp : Longueur de prolongation de campagne en Jours Equivalents Pleine Puissance
+#  LongueurTotaleExperimentaleMWj_t : Longueur totale de la campagne en MWj/t (Donnee transmise par le site)
+#  TypePlanChargement : Type de plan pour la fluence cuve : Determine par les irradiations des assemblages places sur les axes medians
+#                      et sur les diagonales
+#                      - 3 Assemblages neufs aux bouts des deux axes : Plan Standard
+#                      - 3 Assemblages (Irradie, Neuf, Irradie) ou (Neuf, Irradie, Neuf) sur les axes : Fluence reduite (REP 900 ou N4)
+#                      - 2 assemblages irradies aux bouts des diagonales : Fluence reduite (REP 1300)
+#                      - 3 Assemblages irradies aux bouts des deux axes : Fluence Faible (REP 900 ou N4)
+#                      - 3 Assemblages irradies aux bouts des deux axes et
+#                        2 assemblages irradies aux bouts des diagonales : Faible Fluence Generalisee
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DATES_CLES_CAMPAGNE = OPER (nom="DATES_CLES_CAMPAGNE", op=0, sd_prod=DatesClesCampagne, niveau = 'DonneesEtude',
+  fr  = "Definition des dates cles d'une campagne et de ses longueurs caracteristiques",
+  ang = "Definition of the campaign dates and lengths",
+  IdentificateurCampagne         = SIMP (typ='TXM',statut='o',defaut='CZ101',fr="Identificateur de la campagne"),
+  TypePlanChargement             = SIMP (typ='TXM',statut='f',defaut='FluenceFaible',
+                                         into=('Standard','FluenceReduite','FluenceFaible','FaibleFluenceGeneralisee')),
+  DateDDC                        = SIMP (typ='I',min=3,max=3,statut='o',fr="Date J M A de debut de campagne"),
+  regles                               = (ENSEMBLE ('DatePnom','IrradiationDatePnom'),
+                                   ENSEMBLE ('DateCouplage','IrradiationDateCouplage'),
+                                   ENSEMBLE ('DatePassageEnProlongation','LongueurNaturelleExperimentale'),),
+  DatePnom                       = SIMP (typ='I',min=3,max=3,statut='o',fr="Date J M A d'atteinte de la puissance nominale"),
+  IrradDatePnom                  = SIMP (typ='R',           statut='f',fr="Irradiation de la campagne a la date d'atteinte de la puissance nominale"),
+  DateCouplage                   = SIMP (typ='I',min=3,max=3,statut='o',fr="Date J M A de couplage au reseau"),
+  IrradDateCouplage              = SIMP (typ='R',           statut='f',fr="Irradiation de la campagne atteinte a la date de couplage au reseau"),
+  DateFDC                        = SIMP (typ='I',min=3,max=3,statut='o',fr="Date J M A de fin de campagne reelle"),
+  LNatTheorique                  = SIMP (typ='R',           statut='f',fr="Longueur naturelle theorique calculee de la campagne en MWj/t"),
+  LNatRecalee                    = SIMP (typ='R',           statut='f',fr="Longueur naturelle recalee calculee de la campagne en MWj/t"),
+  DatePassageEnProlongation      = SIMP (typ='I',min=3,max=3,statut='o',fr="Date J M A de passage en prolongation de campagne"),
+  LnatExperimentale              = SIMP (typ='R',           statut='f',fr="Longueur naturelle mesuree de la campagne en MWj/t"),
+  LongueurAnticipationJepp       = SIMP (typ='R',           statut='f',fr="Nombre de JEPP d'anticipation"),
+  LongueurProlongationJepp       = SIMP (typ='R',           statut='f',fr="Nombre de JEPP de prolongation"),
+  LongueurTotaleExperimentale    = SIMP (typ='R',           statut='f',fr="Longueur totale de la campagne en MWj/t")
+ ) ;  # Fin DATES_CLES_CAMPAGNE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe OPTIONS_AUTOPROTECTION : Classe de definition des donnees d'autoprotection du code de reseau
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+OPTIONS_AUTOPROTECTION = OPER (nom="OPTIONS_AUTOPROTECTION",op=0,sd_prod=OptionsAutoprotection,
+        niveau = 'OptionsCodesCalcul',
+  fr  = "Definition des donnees d'autoprotection des resonances",
+  ang = "Definition of resonance self shielding data",
+  TypeCombustible          = SIMP (typ='TXM',max='**',statut='o',
+                             fr="Type de combustible auquel s'appliquent ces options d'autoprotection"),
+  MethodeAutoprotection    = SIMP (typ='TXM',into=('SanchezCoste','SousGroupes'),defaut='SanchezCoste',statut='f'),
+  EnergieSupAutoprotection = SIMP (typ='R',defaut=55.5952,statut='f',
+                                   fr="Energie superieure eV du premier groupe d'autoprotection, gpe 38 dans le cas a 99 groupes"),
+  IsotopesAutoproteges  = NUPL (
+      max      = '**',
+      elements = (SIMP (typ=Isotope,statut='o',fr="Nom de l'isotope a autoproteger"),
+                   SIMP (typ='TXM',into=('Moyenne','Detaillee','Couronne'),statut='o'),
+                   SIMP (typ='TXM',into=('Materiaux','Cellules'),statut='f',
+                         fr="Choix d'autoprotection sur les materiaux ou les cellules"),
+                   SIMP (typ='TXM',max='**',statut='f',fr="Liste des types de materiaux ou de cellules concernes"))),
+  Irradiations  = SIMP (typ='R',max='**',statut='f',fr="Irradiations ou se font les calculs d'autoprotection"),
+  PoisonIrradiations  = SIMP (typ='R',max='**',statut='f',
+                        fr="Irradiations ou se font les calculs d'autoprotection des poisons integres au combustible")
+  ) ;   # Fin OPTIONS_AUTOPROTECTION
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe OPTIONS_CODE_RESEAU : Classe de definition des options du code de reseau
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+OPTIONS_CODE_RESEAU = OPER (nom="OPTIONS_CODE_RESEAU", op=0, sd_prod=OptionsCodeReseau, niveau = 'OptionsCodesCalcul',
+  fr  = "Definition des options des codes de calcul de reseau",
+  ang = "Definition of lattice code options",
+  MethodeCalcul             = SIMP (typ='TXM',defaut='Multicellule',statut='o',
+                                    into=('Multicellule','Pij','Caracteristiques','Monte-Carlo/TRIPOLI','Monte-Carlo/MCNP'),
+                                    fr="Methode de calcul"),
+  ProcedureBibliothequeBase = SIMP (typ='TXM',defaut='CEA93_G99_V5',statut='o',
+                                    into=('CEA93_G99_V0','CEA93_G99_V2','CEA93_G99_V3','CEA93_G99_V4',
+                                          'CEA93_G99_V5','CEA93_G99_V6','CEA93_G172_V4'),
+                                    fr="Nom de la procedure Bibliotheque"),
+  CorrectionTransport       = SIMP (typ='TXM',defaut='APOLLO',statut='o',into=('APOLLO','WIMS','Non'),
+                                    fr="Demande ou non de correction de transport (de type APOLLO ou WIMS)"),
+  TypeBibliothequeBase      = SIMP (typ='TXM',defaut='APOLLIB_2',statut='o',
+                                    into=('APOLLIB_1','APOLLIB_2','DRAGON','NJOY_89','NJOY_91','WIMS_D4','WIMS_AECL'),
+                                    fr="Format de la bibliotheque de donnees nucleaires multigroupes"),
+  TableProbabilites         = SIMP (typ='TXM',defaut='CALENDF',statut='o',into=('CALENDF','SUBG','Non'),
+                                    fr="Calcul des tables de probabilites mathematiques CALENDF ou physiques SUBG"),
+  RegionPeripheriqueCellule = SIMP(typ='R',defaut=0.,statut='o',
+                                    fr="Proportion de Volume de la zone peripherique des cellules cylindrisees"),
+  OptionMulticellule        = SIMP (typ='TXM',defaut='ROTH',statut='o',into=('ROTH','MULTICELLULE'),
+                                    fr="Option du calcul multicellule"),
+  OptionPij                 = SIMP (typ='TXM',defaut='&UP0 &ROTH',statut='o',into=('&UP0 &ROTH','&UP0 &HETE','&UP1 &HETE'),
+                                    fr="Option du calcul des Pij"),
+  ParametresIntegration     = SIMP (typ='TXM',defaut='MAIL_INT 7 7 7 7',statut='f',
+                                    fr="Donnees du maillage d'integration en heterogene"),
+  ProportionNoyauxParDefaut = SIMP (typ='R',defaut=1.E-12,statut='o',
+                                    fr="Valeur initiale des concentrations des noyaux lourds non definis"),
+  OptionLaplacienB2         = SIMP (typ='TXM',defaut='CRITIQUE',statut='o',into=('CRITIQUE','NUL','IMPOSE'),
+                                    fr="Option du calcul des fuites homogenes"),
+  LaplacienB2               = SIMP (typ='R',defaut=0.,statut='o',fr="Valeur initiale du laplacien du calcul des fuites"),
+  OrdreAnisotropie          = SIMP (typ='I',defaut=1 ,statut='o',fr="Ordre d'anisotropie des sections de transfert"),
+  Autoprotection            = SIMP (typ='TXM',defaut='Oui',statut='o',into=('Oui','Non'),
+                                    fr="Calcul d'autoprotection ou non"),
+  BlocAutoprotection  = BLOC (condition = "Autoprotection=='Oui'",
+        DonneesAutoprotection     = SIMP (typ=OptionsAutoprotection,statut='f',max='**',
+                                    fr="Nom des objets decrivant les isotopes a autoproteger et les options associees"),
+        RecalculAutoprotection    = SIMP (typ='TXM',defaut='Oui',statut='o',into=('Oui','Non'),
+                                    fr="Demande ou non de recalcul de l'autoprotection")),
+  Equivalence               = SIMP (typ='TXM',defaut='Non',statut='o',into=('Oui','Non'),
+                                    fr="Demande ou non de calcul d'equivalence"),
+  NbGroupesEquivalence      = SIMP (typ='I',max='**',defaut=(2,6,16),statut='o',
+                                    fr="Liste des nombres de groupes des calculs d'equivalence"),
+  EditionSaphyb             = SIMP (typ='TXM',defaut='Non',statut='o',into=('Oui','Non'),
+                                    fr="Demande d'edition des bibliotheques de type Saphyb"),
+  EditionAssemblage         = SIMP (typ='TXM',defaut='Oui',statut='o',into=('Oui','Non'),
+                                    fr="Demande d'edition des sections efficaces homogeneisees sur l'ensemble du domaine"),
+  EditionCellule            = SIMP (typ='TXM',defaut='Oui',statut='o',into=('Oui','Non'),
+                                    fr="Demande d'edition des sections efficaces homogeneisees par cellule"),
+  EditionFluxDetaille       = SIMP (typ='TXM',defaut='Oui',statut='o',into=('Oui','Non'),
+                                    fr="Demande d'edition des flux moyens sur l'ensemble du domaine sur la maillage multigroupe detaille"),
+  EditionMilieu             = SIMP (typ='TXM',defaut='Oui',statut='o',into=('Oui','Non'),
+                                    fr="Demande d'edition des compositions isotopiques detaillees sur tous les milieux de calcul"),
+  EditionTrimaran           = SIMP (typ='TXM',defaut='Non',statut='o',into=('Oui','Non'),
+                                    fr="Demande d'edition des sections efficaces pour TRIPOLI multigroupe"),
+  SpectreNeutrons           = SIMP (typ='TXM',defaut='Prompt',statut='o',into=('Prompt','Retarde'),
+                                    fr="Type de spectre de neutrons pour le calcul de transport"),
+  ListeIsotopesEdites       = SIMP (typ='TXM',statut='f',max='**',fr="Liste des initiales des symboles des isotopes a editer"),
+  FichierBickley            = SIMP (typ='TXM',statut='f',fr="Nom du fichier des fonctions Bickley"),
+  EditionIsotopeHomogene    = SIMP (typ='TXM',defaut='Non',statut='o',into=('Oui','Non'),
+                                    fr="Demande d'edition de constitution d'isotopes homogeneises sous forme APOLLIB"),
+  BlocHomoge  = BLOC (condition = "EditionIsotopeHomogene=='Oui'",
+        RepertoireHomoge          = SIMP (typ='TXM',statut='f',
+                                    fr="Nom du repertoire du fichier des isotopes homogenes sous forme APOLLIB"),
+        FichierHomoge             = SIMP (typ='TXM',statut='f',fr="Nom du fichier des isotopes homogenes sous forme APOLLIB")),
+  Executable                = NUPL (statut   = 'f', elements = (
+                                    SIMP (typ='TXM',fr="Systeme d'exploitation"),
+                                    SIMP (typ='TXM',fr="Nom du fichier executable"))),
+  ProceduresApollo2         = FACT (statut='f',
+                                    OptionsListing  = SIMP (typ='TXM',statut='f',fr="Commandes Gibiane des options d'edition listing"),
+                                    Evolution       = SIMP (typ='TXM',statut='f',fr="Procedure d'evolution"),
+                                    Reprise         = SIMP (typ='TXM',statut='f',fr="Procedure de reprise"),
+                                    Equivalence     = SIMP (typ='TXM',statut='f',fr="Procedure d'equivalence"),
+                                    EditionCellule  = SIMP (typ='TXM',statut='f',fr="Procedure d'edition par cellule"),
+                                    EditionHomoge   = SIMP (typ='TXM',statut='f',fr="Procedure d'edition des isotopes Homoge")
+                                    ),
+  ProceduresSunset          = FACT (statut='f',
+                                    Evolution       = SIMP (typ='TXM',statut='f',fr="Procedure d'evolution"),
+                                    Reprise         = SIMP (typ='TXM',statut='f',fr="Procedure de reprise")
+                                    )
+  ) ;  # Fin OPTIONS_CODE_RESEAU
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe OPTIONS_CODE_COEUR_STATIQUE : Classe de definition des options du code de coeur en statique
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+OPTIONS_CODE_COEUR_STATIQUE = OPER (nom="OPTIONS_CODE_COEUR_STATIQUE", op=0, sd_prod=OptionsCodeCoeurStatique, niveau = 'OptionsCodesCalcul',
+  fr  = "Definition des options des codes de calcul de coeur en statique",
+  ang = "Definition of core code static options",
+  DeltaReactivite = SIMP (typ='TXM',statut='o',defaut='DeltaRo',into=('DeltaRo','LogKeff'),
+                          fr="Methode de calcul de variation de reactivite entre deux etats"),
+  OxMaillageFlux = SIMP (typ=Maillage1D,statut='o',fr="Maillage du calcul de flux suivant l'axe x d'un assemblage"),
+  OyMaillageFlux = SIMP (typ=Maillage1D,statut='o',fr="Maillage du calcul de flux suivant l'axe y d'un assemblage"),
+  OzMaillageFlux = SIMP (typ=Maillage1D,statut='o',fr="Maillage du calcul de flux suivant l'axe z d'un assemblage"),
+  ReactiviteVisee           = SIMP (typ='R',defaut=  0.,statut='o',fr="Valeur en pcm de la reactivite visee en calcul critique"),
+  EfficaciteBoreEstimee     = SIMP (typ='R',defaut= -6.,statut='o',fr="Valeur estimee en pcm/ppm de l'efficacite du bore"),
+  TitreBoreInitiale         = SIMP (typ='R',defaut=600.,statut='o',fr="Valeur estimee en ppm du titre en bore du moderateur"),
+  Factorisation             = SIMP (typ='TXM',defaut='Non',statut='o',into=('Coeur2D','Assemblage','Non'),
+                                    fr="Option ou non de factorisation par le flux fin Coeur ou Assemblage"),
+  AxialTypeReflecteurs      = SIMP (typ='TXM',defaut='Equivalent',statut='o',into=('Equivalent','Homogeneise')),
+  RadialTypeReflecteurs     = SIMP (typ='TXM',defaut='Equivalent',statut='o',into=('Equivalent','Homogeneise')),
+  ReflAxiauxEquivalents     = BLOC (condition = "TypeReflecteursAxiaux=='Equivalent'",
+                                    ReflecteurInferieur = SIMP (typ=SectionsReflecteur,statut='o'),
+                                    MaillageInferieur   = SIMP (typ=Maillage1D,statut='o'),
+                                    ReflecteurSuperieur = SIMP (typ=SectionsReflecteur,statut='o'),
+                                    MaillageSuperieur   = SIMP (typ=Maillage1D,statut='o')
+                                    ),
+  ReflAxiauxHomogeneises = BLOC (condition = "TypeReflecteursAxiaux=='Homogeneise'",
+                                 AxialAbscisses = SIMP (typ='R'     ,statut='o',max='**'),
+                                 AxialMateriaux = SIMP (typ=Materiau,statut='o',max='**')
+                                 ),
+  ReflRadialEquivalent    = BLOC (condition = "TypeReflecteurRadial=='Equivalent'",
+                                  ReflecteurRadial = SIMP (typ=SectionsReflecteur,statut='o'),
+                                  Epaisseur        = SIMP (typ='R'     ,statut='o')
+                                  ),
+  ReflRadialHomogeneise   = BLOC (condition = "TypeReflecteurRadial=='Homogeneise'",
+                                  RadialAbscisses = SIMP (typ='R'     ,statut='o',max='**'),
+                                  RadialMateriaux = SIMP (typ=Materiau,statut='o',max='**')
+                                  ),
+  ApproximationMigration    = SIMP (typ='TXM',defaut='SPn',statut='o',into=('SPn','Sn','Diffusion')),
+  BlocSPn = BLOC (condition = "ApproximationTransport=='SPn'",
+                        SPnOrdreApproximation = SIMP (typ='I'  ,defaut=1,statut='o',fr="Ordre n impair de la methode SPn"),
+                        SPnElementFini        = SIMP (typ='TXM',defaut='RTN0',statut='o',into=('RTN0','RTN1'),fr="Type d'element fini"),
+                        SPnMaxIterDiffusion   = SIMP (typ='I'  ,defaut=1,into=(1,2,3,4,5),statut='o',
+                                                      fr="Nombre maximal d'iterations de diffusion")
+                       ),
+  BlocSn = BLOC (condition = "ApproximationTransport=='Sn'",
+                        SnOrdreApproximation = SIMP (typ='I'  ,defaut=4,statut='o',fr="Ordre n pair de la methode Sn"),
+                        SnElementFini        = SIMP (typ='TXM',defaut='RTN',statut='o',into=('RTN','BDM'),fr="Type d'element fini"),
+                        SnAcceleration       = SIMP (typ='TXM',defaut='Oui',statut='o',into=('Oui','Non'),fr="Acceleration par la diffusion"),
+                        SnMaxIterDiffusion   = SIMP (typ='I'  ,defaut=20,statut='o',fr="Nombre maximal d'iterations de calcul de diffusion")
+                       ),
+  BlocDiff = BLOC (condition = "ApproximationTransport=='Diffusion'",
+                        MaxIterFlux     = SIMP (typ='I',defaut= 5       ,statut='o',fr="Maximum d'iterations du calcul de flux"),
+                        MaxIterKeff     = SIMP (typ='I',defaut=50       ,statut='o',fr="Maximum d'iterations du calcul de keff"),
+                        PrecPuissance   = SIMP (typ='R',defaut=0.005    ,statut='o',fr="Precision sur la puissance"),
+                        PrecKeff        = SIMP (typ='R',defaut=0.0001   ,statut='o',fr="Precision sur keff")
+                       ),
+  PrecisionValeurPropre       = SIMP (typ='R',defaut=1.E-5,statut='o',fr="Precision sur la valeur propre"),
+  PrecisionFlux               = SIMP (typ='R',defaut=1.E-3,statut='o',fr="Precision sur le flux"),
+  PrecisionMultigroupe        = SIMP (typ='R',defaut=1.E-6,statut='o',fr="Precision de la resolution multigroupe"),
+  PrecisionIterTermeDiffusion = SIMP (typ='R',defaut=1.E-6,statut='o',fr="Precision des iterations sur le terme de diffusion"),
+  MaxIterEnergie              = SIMP (typ='I',defaut=1,statut='o',
+                                      fr="Nombre maximal d'iterations pour la resolution Gauss Seidel en energie"),
+  MaxIterTermeDiffusion       = SIMP (typ='I',defaut=1,statut='o',fr="Nombre maximal d'iterations sur le terme de diffusion"),
+  MaxIterDecompositionDomaine = SIMP (typ='I',defaut=1,statut='o',fr="Nombre d'iterations de decomposition de domaine"),
+  MaxIterKeffAvantCR          = SIMP (typ='I',defaut=1,statut='o',fr="Nombre de calculs de keff avant appel aux contre-reactions")
+  ) ;  # Fin OPTIONS_CODE_COEUR_STATIQUE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe OPTIONS_CODE_COEUR_CINETIQUE : Classe de definition des options du code de coeur en cinetique
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+OPTIONS_CODE_COEUR_CINETIQUE = OPER (nom="OPTIONS_CODE_COEUR_CINETIQUE", op=0, sd_prod=OptionsCodeCoeurCinetique, niveau = 'OptionsCodesCalcul',
+  fr  = "Definition des options des codes de calcul de coeur en cinetique",
+  ang = "Definition of core code kinetic options",
+  NombrePrecurseurs              = SIMP (typ='I',defaut=6,statut='o',fr="Nombre de groupes de precurseurs"),
+  GestionAutomatiquePasCinetique = SIMP (typ='TXM',defaut='Oui',into=('Oui','Non'),statut='o',
+                                         fr="Gestion automatique du pas de temps du calcul cinetique"),
+  BlocSansGestionPas             = BLOC (condition = "GestionAutomatiquePasCinetique=='Non'",
+                                         DefinitionPasDeTemps = SIMP (typ='R',max='**',statut='o',
+                                         fr="Liste de couples (pas de temps, limite superieure de validite du pas de temps)"),
+                                               ),
+  PrecisionIterationFluxPrecurseurs    = SIMP (typ='R',defaut=1.E-6,statut='o',fr="Precision sur les iterations Flux Precurseurs"),
+  PrecisionParametreGestionAutomatique = SIMP (typ='R',defaut=0.0008,statut='o',fr="Precision sur les iterations Flux Precurseurs"),
+  MaxIterationsFluxPrecurseurs         = SIMP (typ='I',defaut=50,statut='o',fr="Nombre maximal d'iterations Flux Precurseurs"),
+  ThetaSchemaCinetique                 = SIMP (typ='R',defaut=0.5,statut='o',fr="Valeur du parametre theta du schema cinetique")
+  ) ;  # Fin OPTIONS_CODE_COEUR_CINETIQUE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe OPTIONS_THERMIQUE_THERMOHYDRAULIQUE : Classe de definition des options du code de coeur en cinetique
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+OPTIONS_THERMIQUE_THERMOHYDRAULIQUE = OPER (nom="OPTIONS_THERMIQUE_THERMOHYDRAULIQUE", op=0, sd_prod=OptionsThermiqueThermohydraulique, niveau = 'OptionsCodesCalcul',
+  fr  = "Definition des options des modules de calcul de coeur thermique et thermohydraulique simplifiees",
+  ang = "Definition of thermohydraulic and thermic module options",
+  HGaineFluide                        = SIMP (typ='TXM',defaut='DITTUS_BOELTER',into=('FLICA','DITTUS_BOELTER'),statut='o',
+                                              fr="Option du Coefficient d'echange gaine-fluide (flux < au flux critique)"),
+  HGaineFluideEbullition              = SIMP (typ='TXM',defaut='BST',into=('BST','TONG'),statut='o',
+                                              fr="Option du Coefficient d'echange gaine-fluide (Ebullition en film)"),
+  OptionHGapConstantTransitoire       = SIMP (typ='TXM',defaut='Non',into=('Non','Oui'),statut='o',
+                                                                     fr="Option de constance du coefficient d'echange JeuPastilleGaine"),
+  OptionHGap                          = SIMP (typ='TXM',defaut='HGAP_88',into=('EJECTION','TUO2','PLIN_BU','FIXE','HGAP_88'),statut='o',
+                                              fr="Option de calcul du Coefficient d'echange du jeu pastille-gaine"),
+  BlocHgapTuo2                        = BLOC (condition = "CoefficientEchangeJeuPastilleGaine=='TUO2'",
+                                              Tuo2Initiale = SIMP (typ='R',statut='o',
+                                                                   fr="Temperature initiale combustible pour le calcul du coefficient d'echange") ),
+  BlocHgapFixe                        = BLOC (condition = "CoefficientEchangeJeuPastilleGaine=='FIXE'",
+                                              Hgap = SIMP (typ='R',statut='o',defaut=5850.,fr="Valeur imposée du coefficient d'echange") ),
+  ConductiviteCombustible             = SIMP (typ='TXM',defaut='HGAP_88',into=('STORA','WESTINGHOUSE','HGAP_88','COMETHE'),statut='o',
+                                                       fr="Option du Coefficient de conductivite du combustible"),
+  CapaciteCalorifiqueCombustible      = SIMP (typ='TXM',defaut='UO2_FRAMATOME',into=('UO2_BATES','UO2_FRAMATOME','UO2_THYC'),statut='o',
+                                                       fr="Option du Coefficient de conductivite du combustible"),
+  MateriauGaine                       = SIMP (typ='TXM',defaut='ZIRCALOY_CYRANO',into=('ZIRCALOY_CYRANO', 'ZIRCALOY_THYC', 'INCOLOY_800',
+                                                               'CHROMESCO_3', 'INOX_16', 'INOX_321', 'INOX_347', 'INOX_347_OXYDE',
+                                                               'INCONEL_600', 'NICKEL_75', 'PLATINE'),statut='o',
+                                              fr="Materiau de la gaine pour le calcul du roCp de la gaine et de sa conductivite"),
+  FluxCritique                        = SIMP (typ='R',defaut=180.E4,statut='o',fr="Valeur du flux critique en W/m2"),
+  FractionPuissanceCombustible        = SIMP (typ='R',defaut=0.974,statut='o',fr="Fraction de la puissance degagee dans le combustible"),
+  Creusement                          = SIMP (typ='TXM',defaut='Uniforme',statut='o',
+                                              into=('Uniforme','Runnals','Framatome','Twinkle','Mox','EDF','Specifique')),
+  BlocCreusement                      = BLOC (condition = "Creusement=='Specifique'",
+                                              RayonsCreusement = SIMP (typ='R',statut='o',fr="Rayons de definition du creusement de puissance (nz)"),
+                                              IrradiationsCreusement = SIMP (typ='R',statut='o',fr="Irradiations de definition du creusement de puissance (nbu)"),
+                                              EnrichissementsCreusement = SIMP (typ='R',statut='o',fr="Enrichissements de definition du creusement de puissance (nen)"),
+                                              PuissancesUO2 = SIMP (typ='R',max='**',statut='f',fr="Valeurs des creusements de puissance P(nz,nbu,nen) dans une pastille UO2"),
+                                              PuissancesMOX = SIMP (typ='R',statut='f',fr="Valeurs des creusements de puissance P(nz,nbu,nen) dans une pastille MOX") ),
+  PastilleDiscretisation              = SIMP (typ='I',defaut=4,statut='o',fr="Nombre de points de discretisation radiale de la pastille combustible"),
+  GaineDiscretisation                 = SIMP (typ='I',defaut=2,statut='o',
+                                              fr="Nombre de points de discretisation radiale de la gaine de la pastille combustible"),
+  ThermiquePrecision                  = SIMP (typ='R',defaut=0.1,statut='o',fr="Precision en Celsius du calcul thermique radiale du crayon"),
+  ThermohydrauliquePrecision          = SIMP (typ='R',defaut=0.01,statut='o',
+                                              fr="Precision en Celsius du calcul thermohydraulique de la temperature du moderateur"),
+  MaxIterThermique                    = SIMP (typ='I',defaut=100,statut='o',
+                                              fr="Nombre maximum d'iterations du calcul de thermique"),
+  MaxIterThermohydraulique            = SIMP (typ='I',defaut=100,statut='o',
+                                              fr="Nombre maximum d'iterations du calcul de thermohydraulique"),
+  MethodeIntegrationThermohydraulique = SIMP (typ='TXM',defaut='Gauss',statut='o',into=('Gauss','NonGauss'),
+                                              fr="Methode d'integration thermohydraulique"),
+  PerteDeCharge                       = SIMP (typ='TXM',defaut='Non',statut='o',into=('Non','Oui'),
+                                              fr="Prise en compte ou non de la perte de charge axiale"),
+  TableEau                            = SIMP (typ='TXM',defaut='Thetis',statut='o',into=('Thetis','Interne'),
+                                              fr="Calcul des caracteristiques du moderateur par THETIS ou par des tables internes")
+ ) ;  # Fin OPTIONS_THERMIQUE_THERMOHYDRAULIQUE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe OPTIONS_CONTRE_REACTIONS_COEUR : Classe de definition des options du code de coeur en cinetique
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+OPTIONS_CONTRE_REACTIONS_COEUR = OPER (nom="OPTIONS_CONTRE_REACTIONS_COEUR", op=0, sd_prod=OptionsContreReactionsCoeur, niveau = 'OptionsCodesCalcul',
+  fr  = "Definition des options des modules de calcul de contre-reactions coeur",
+  ang = "Definition of feedback module options",
+  Iter2dCRN            = SIMP (typ='I',defaut=30,statut='o',fr="Nombre maximal d'iterations de contre-reactions en 2D, si 0 pas de CRN"),
+  Iter3dCRN            = SIMP (typ='I',defaut=15,statut='o',fr="Nombre maximal d'iterations de contre-reactions en 3D, si 0 pas de CRN"),
+  CoeffAttenuation     = SIMP (typ='R',defaut=0.8,statut='o',fr="Coefficient d'attenuation des contre-reactions"),
+  PrecisionPuissance   = SIMP (typ='R',defaut=1.E-4,statut='o',fr="Precision sur la puissance a la fin des iterations de contre-reactions"),
+  PrecisionKeff        = SIMP (typ='R',defaut=1.E-5,statut='o',fr="Precision sur keff a la fin des iterations de contre-reactions"),
+  MethodeCalculSection = SIMP (typ='TXM',defaut='TabulationLineaire',into=('Spline1D','SplinenD','TabulationLineaire'),statut='o',
+                               fr="Methode d'interpolation des sections efficaces avec Contre-reactions"),
+  FigerCRN             = SIMP (typ='TXM',statut='f',max='**',fr="Liste des parametres de contre-reactions a figer")
+ ) ;  # Fin OPTIONS_CONTRE_REACTIONS_COEUR
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe OPTIONS_CODES : Classe de definition des options generales et du type de calcul demande
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+OPTIONS_CODES = OPER (nom="OPTIONS_CODES", op=0, sd_prod=OptionsCodes, niveau = 'OptionsCodesCalcul',
+  fr  = "Definition des options des codes de calcul",
+  ang = "Definition of calculation code options",
+  regles = (AU_MOINS_UN('OptionsReseau', 'OptionsStatiqueCoeur', 'OptionsCinetiqueCoeur','OptionsThermo', 'OptionsCRNCoeur'),),
+  OptionsReseau         = SIMP (typ=OptionsCodeReseau                ,statut='f', fr="Options du code de reseau"),
+  OptionsStatiqueCoeur  = SIMP (typ=OptionsCodeCoeurStatique         ,statut='f', fr="Options du code de coeur en statique"),
+  OptionsCinetiqueCoeur = SIMP (typ=OptionsCodeCoeurCinetique        ,statut='f', fr="Options du code de coeur en cinetique"),
+  OptionsThermo         = SIMP (typ=OptionsThermiqueThermohydraulique,statut='f', fr="Options des modules de thermique et thermohydraulique simplifiées)"),
+  OptionsCRNCoeur       = SIMP (typ=OptionsContreReactionsCoeur      ,statut='f', fr="Prise en compte des contre-reactions ou non")
+ ) ;  # Fin OPTIONS_CODES
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe RESSOURCES_INFORMATIQUES : Classe de definition des ressources de calcul informatiques
+#                                    Cette classe est liee aux possibilites du gestionnaire du traitement par lots et pour le moment
+#                                    les attributs affiches sont dependants de LSF :
+#                                       si on donne un type   de serveur       : bsub -R "type=USPARC" monjob
+#                                       si on donne un modele de serveur       : bsub -R "model=HPK640" monjob
+#                                       si on donne un type   de ressource     : bsub -R "Solaris" monjob
+#                                       si on donne des machines particulieres : bsub -m " Nommachine1 NomMachine2 " monjob
+#                                   Dans le cas des machines particulieres, il est necessaire de fournir aussi le systeme d'exploitation
+#                                   associe (ceci pour distinguer les fichiers necessaires en entree, leurs noms devant contenir
+#                                   le nom du systeme d'exploitation (les fichiers etant differents a priori suivant l'OS utilise
+#                                   et de format non portable)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RESSOURCES_INFORMATIQUES = OPER (nom="RESSOURCES_INFORMATIQUES",sd_prod=RessourcesInformatiques,op=0,niveau = 'ConfigurationInformatique',
+  fr    = "Definition des systemes d'exploitation et des calculateurs de l'etude",
+  ang   = "Software operating system and computers used",
+  regles = (UN_PARMI('TypesServeursCibles', 'ModelesServeursCibles','OSCible','CalculateursCibles'),),
+  TypesServeursCibles   = SIMP (typ='TXM',statut='f',max='**',defaut='USPARC' ,into=('SPARC', 'USPARC', 'PWR2', 'HPPA20', 'ALPHA'),
+                                fr="Liste des types de serveurs cibles pour la soumission des calculs"),
+  ModelesServeursCibles = SIMP (typ='TXM',statut='f',max='**',defaut='U2200'  ,into=('SS1000E','U2200','IBM3BT','HPK460','DEC5400','U1140'),
+                                fr="Liste des modeles de serveurs cibles pour la soumission des calculs"),
+  OSCible               = SIMP (typ='TXM',statut='f',         defaut='solaris',into=('solaris','aix','usparc','alpha','hpux'),
+                                fr="Type de ressource cible pour la soumission des calculs"),
+  CalculateursCibles    = NUPL (statut='f',max='**',fr="Liste des noms des calculateurs cibles pour la soumission des calculs",
+                                elements = (SIMP (typ='TXM',statut='o',fr="Nom du calculateur cible"),
+                                            SIMP (typ='TXM',statut='o',fr="Systeme d'exploitation de la machine cible",
+                                                  defaut='solaris',into=('solaris','aix','usparc','alpha','hpux')))
+                                )
+ ) ;  # Fin RESSOURCES_INFORMATIQUES
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DONNEES_CAS_ETUDE :     Classe de definition des caracteristiques globales d'un cas de l'etude
+#                                       Definition de la centrale (site, numero de tranche) et numero de campagne d'irradiation
+#                                       Ces caracteristiques  d'environnement de l'etude doivent permettre de recuperer l'ensemble
+#                                       des parametres de fonctionnement nominales du reacteur sujet de l'etude (creation de
+#                                       bibliotheques ou calcul de coeur)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DONNEES_CAS_ETUDE = OPER (nom="DONNEES_CAS_ETUDE", op=0, sd_prod=DonneesCasEtude, niveau = 'DonneesEtude',
+  fr  = "Definition de la centrale sujet du cas de l'etude et des options globales du cas",
+  ang = "Definition of the power plant and of the global options of the calculation case",
+  TypeCode               = SIMP (typ='TXM',defaut='Reseau',into=('Reseau','Coeur'),statut='o'),
+  SiteNucleaire          = SIMP (typ=SiteNucleaire,defaut='TRICASTIN',statut='o'),
+  BlocCoeur              = BLOC (condition = "TypeCode=='Coeur'",
+                           NumeroTranche          = SIMP (typ='I',defaut=1,statut='o',fr="Numero de la tranche nucleaire"),
+                           NumeroCampagne         = SIMP (typ='I',defaut=1,statut='o',fr="Numero de la campagne d'irradiation"),
+                           IdentificateurCampagne = SIMP (typ='TXM',defaut='TN101',statut='o',fr="Identificateur de la campagne"),
+                           DatesCampagne          = SIMP (typ=DatesClesCampagne,statut='f',fr="Dates cles de la campagne"),
+                           TypeGestion            = SIMP (typ    = 'TXM',
+                                                          defaut = '370Q',
+                                                          statut = 'f', fr="Type de gestion du combustible",
+                                                          into   = ('310Q','310T','325T','325Q','340Q','345AL',
+                                                                    '370Q','370T','400T','HMOX','MOXNT','TMOX')),
+                           TypeSchemaGrappe       = SIMP (typ    = 'TXM',
+                                                          defaut = '900CPYUO2',
+                                                          statut = 'f',fr="Type de schema d'implantation des grappes",
+                                                          into   = ('900CP0','900CPYUO2INITIAL','900CPYUO2',
+                                                                    '900CPYUO2AL','900CPYMOX','1300','N4')),
+                           TypeEvaluationSurete  = SIMP (typ='TXM',defaut='900STD',statut='f',fr="Type d'evaluation de surete",
+                                                         into=('900STD','900GARANCE','1300STD','1300GEMMES','N4STD')),
+                           ModePilotage          = SIMP (typ='TXM',defaut='G',statut='f',into=('A','G','X'),fr="Mode de pilotage de la tranche"),
+                           ImplantationGrappe    = SIMP (typ=ImplantationGrappesCommande,statut='f',fr="Schema d'implantation des grappes de commande dans le coeur"),
+                           PositionAxialeGrappes = SIMP (typ=PositionAxialeGrappesCommande,statut='f',fr="Positions axiales des grappes de commande"),
+                           PlanChargement        = SIMP (typ=Reseau,statut='o',fr="Plan de chargement du reseau coeur"),
+                           Penalites             = SIMP (typ=PenaliteAssemblage,statut='f',max='**',fr="Liste des objets PenalitesAssemblage"),
+                           ActivitesMesurees     = SIMP (typ=ActivitesExperimentales,statut='f',fr="Carte d'activite experimentale"),
+#                          OptionsStatique       = SIMP (typ=OptionsCodeCoeurStatique,statut='f'),
+#                          OptionsCinetique      = SIMP (typ=OptionsCodeCoeurCinetique,statut='f'),
+                           CodeCalculC           = SIMP (typ='TXM',defaut='CodeSn',statut='o',fr="Type de code de coeur a utiliser")),
+  BlocReseau            = BLOC (condition = "TypeCode=='Reseau'",
+                           Assemblage            = SIMP (typ=(AssemblageType,ReparationAssemblage),statut='o',fr="Objet Assemblage a reparer et a calculer"),
+#                          Options               = SIMP (typ=OptionsCodeReseau,statut='f'),
+                           CodeCalculR           = SIMP (typ='TXM',defaut='SUNSET',statut='o',fr="Code de reseau a utiliser")),
+  Domaines              = SIMP (typ=DecompositionDomaines            ,statut='f',fr="Objet definissant la decomposition de domaines"),
+  ConditionsMoyennes    = SIMP (typ=ConditionsFonctionnementMoyennes ,statut='f',fr="Objet definissant les conditions de fonctionnement moyennes"),
+  Transitoire           = SIMP (typ=ConditionsTransitoire            ,statut='f',fr="Objet contenant les conditions du transtoire"),
+  Variations            = SIMP (typ=EspaceVariations                 ,statut='f',fr="Objet definissant l'espace de variations des parametres d'une etude parametrique"),
+  Irradiations          = SIMP (typ=DonneesIrradiation               ,statut='f',fr="Objet definissant les irradiations du calcul"),
+  Gestion               = SIMP (typ=ParametresCalculGestion              ,statut='f',fr="Parametres du calcul de gestion"),
+  Ajustement            = SIMP (typ=DonneesAjustement                ,statut='f',fr="Parametres d'ajustement du calcul"),
+  Accidents             = SIMP (typ=DonneesAccidents                 ,statut='f',fr="Donnees des calculs d'accidents"),
+  Pilotage              = SIMP (typ=DonneesPilotageGeneral           ,statut='f',fr="Donnees generales de pilotage du reacteur"),
+  Calibrage             = SIMP (typ=CalibrageGroupes                 ,statut='f',fr="Donnees de calibrage des groupes de commande du reacteur"),
+  Stretch               = SIMP (typ=ProlongationCampagne             ,statut='f',fr="Objet definissant la prolongation de campagne"),
+  Bibliotheques         = SIMP (typ=FichierBibliothequeIsotopes      ,statut='f',fr="Fichiers des bibliotheques de donnees de base"),
+  Ressources            = SIMP (typ=RessourcesInformatiques              ,statut='f',fr="Objet definissant les ressources informatiques a utiliser"),
+  ConditionLimite       = SIMP (typ=GeneraleConditionLimite              ,statut='o',fr="Objet definissant les conditions limites"),
+  Options               = SIMP (typ=OptionsCodes                     ,statut='o',fr="Options des codes impliques dans le calcul"),
+  TypeCalcul            = SIMP (typ='TXM',max='**',defaut='Evolution',statut='o',
+                                into=('Evolution','EvolutionMicroscopique','EvolutionRefroidissement','Reprise','Statique','Cinetique',
+                                      'BoreImpose','BoreCritique')     ,fr="Type de calcul demande")
+ ) ;  # Fin DONNEES_CAS_ETUDE
+class resultat(TObjet): pass
+class resultat2(resultat): pass
+CALCUL=OPER(nom="CALCUL",op=10,sd_prod=resultat,
+            niveau = 'Operateurs',
+            materiau=SIMP(typ=Materiau),
+            PRESSION=SIMP(defaut=10000.,typ="R")
+           );
+CALCUL2=OPER(nom="CALCUL2",op=11,sd_prod=resultat2,
+             niveau = 'Operateurs',
+             donnee=SIMP(typ=resultat),
+             materiau=SIMP(typ=Materiau),
+            );
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe SECTIONS_REFLECTEUR : Classe de definition des sections efficaces multigroupes des reflecteurs
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+SECTIONS_REFLECTEUR = OPER (nom="SECTIONS_REFLECTEUR",sd_prod=SectionsReflecteur,op=0,niveau = 'SectionsEfficaces',
+  fr  = "Definition des sections efficaces equivalentes d'un reflecteur",
+  ang = "Equivalent reflector cross sections",
+  NbGroupesEnergie     = SIMP (typ='I'  ,statut='o',defaut=2,fr="Nombre de groupes d'energie"),
+  LimitesEnergie       = SIMP (typ='R'  ,statut='o',defaut=(0.,0.0625,1.E7),max='**',fr="Limites des groupes d'energie"),
+  DeltaLethargie       = SIMP (typ='R'  ,statut='o',max='**',fr="Largeur en lethargie des groupes d'energie"),
+  Sections = FACT (min=1, max='**', statut='o',      
+                   TypeSection  = SIMP (typ='TXM',fr="Type de section efficace",statut='o',
+                                        into=( 'Totale','CorrectionTransport',
+                                               'Absorption','Capture','N2N',
+                                               'CoefficientDiffusionHomogene','CoefficientsDiffusionOrientes',
+                                               'SectionDiffusionTotale','Transfert')),
+                   Valeurs = SIMP (typ='R',min=1,max='**',statut='o',
+                                   fr="Valeurs des sections efficaces pour le reflecteur")
+                   )
+  ) ;  # Fin SECTIONS_REFLECTEUR
+# ----------------------------------------------------------------------------------------------------------------------------------
+#  Classe MACROLIB : Classe de definition des sections efficaces multigroupes
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+MACROLIB = OPER (nom="MACROLIB",sd_prod=Macrolib,op=0,niveau = 'SectionsEfficaces',
+  fr  = "Definition d'une macrolib",
+  ang = "Macrolib Definition",
+  Signature            = SIMP (typ='TXM',statut='o',defaut="MACROLIB",fr="Signature de l'objet MACROLIB"),
+  NbMateriaux          = SIMP (typ='I'  ,statut='o',defaut=1,fr="Nombre de materiaux"),
+  NomsMateriaux        = SIMP (typ='TXM',statut='o',max='**',fr="Noms des materiaux"),
+  OrdreAnisotropieMax  = SIMP (typ='I'  ,statut='o',defaut=1,fr="Ordre d'anisotropie"),
+  MaxIsotopesFissiles  = SIMP (typ='I'  ,statut='o',fr="Nombre maximum d'isotopes fissiles"),
+  NbTypesSections      = SIMP (typ='I'  ,statut='o',fr="Nombre de sections efficaces definies"),
+  CorrectionTransport  = SIMP (typ='TXM',statut='o',defaut='Non',into=('Oui','Non'),fr="Indication de Correction de transport"),
+  NbGroupesPrecurseurs = SIMP (typ='I'  ,statut='o',defaut=6,fr="Nombre de groupes de precurseurs de neutrons retardes"),
+  NbGroupesEnergie     = SIMP (typ='I'  ,statut='o',defaut=2,fr="Nombre de groupes d'energie"),
+  LimitesEnergie       = SIMP (typ='R'  ,statut='o',defaut=(0.,0.0625,1.E7),max='**',fr="Limites des groupes d'energie"),
+  DeltaLethargie       = SIMP (typ='R'  ,statut='o',max='**',fr="Largeur en lethargie des groupes d'energie"),
+  ListeSections        = SIMP (typ='TXM',statut='o',max='**',fr="Liste des sections efficaces decrites dans la Macrolib",
+                               into=('Totale','CorrectionTransport','Spectre','Vitesse',
+                                     'Production','Fission','Energie','Absorption','Capture','N2N',
+                                     'CoefficientDiffusionHomogene','CoefficientsDiffusionOrientes',
+                                     'CoefficientEquivalence','ProductionRetardee','SpectreRetarde',
+                                     'SectionDiffusionTotale','Transfert')),
+  ModeEntreeSections   = SIMP (typ='TXM',statut='o',defaut='ParGroupe',into=('ParGroupe','ParMilieu'),
+                               fr="Choix du mode d'entree des sections par groupe ou par milieu"),
+  SectionsParGroupe    = BLOC (condition = "ModeEntreeSections=='ParGroupe'",
+             SectionsG = FACT (min=1, max='**', statut='o',
+                TypeSectionG = SIMP (typ='TXM',fr="Type de section efficace",statut='o',
+                             into=('Totale','CorrectionTransport','Spectre','Vitesse',
+                                   'Production','Fission','Energie','Absorption','Capture','N2N',
+                                   'CoefficientDiffusionHomogene','CoefficientsDiffusionOrientes',
+                                   'CoefficientEquivalence','ProductionRetardee','SpectreRetarde',
+                                   'SectionDiffusionTotale','Transfert')),
+                Groupes = BLOC (condition = "TypeSection=='Transfert'",
+                        NumerosGroupes = SIMP (typ='I',min=2,max=2,statut='o',
+                                               fr="Numeros des groupes de depart et d'arrivee")),
+                Groupe = BLOC (condition = "TypeSection!='Transfert'",
+                        NumeroGroupe = SIMP (typ='I',statut='o',fr="Numero de groupe d'energie")),
+                BlocAnisotropie = BLOC (condition = "TypeSection=='Transfert' or TypeSection== 'SectionDiffusionTotale'",
+                        OrdreAnisotropie = SIMP (typ='I',statut='o',defaut=1,
+                                                 fr="Ordre d'anisotropie de la section de transfert")),
+                Valeurs = SIMP (typ='R',min=1,max='**',statut='o',
+                                fr="Valeurs des sections efficaces pour tous les materiaux")
+        )
+   ),
+  SectionsParMateriau     = BLOC (condition = "ModeEntreeSections=='ParMateriau'",
+        Materiau  = SIMP (typ='TXM',statut='o',fr="Nom du materiau dont on valorise les sections efficaces"),
+        SectionsM = FACT (min=1, max='**', statut='o',fr="Entree des valeurs de chaque type de section efficace",     
+                TypeSectionM  = SIMP (typ='TXM',fr="Type de section efficace definie",statut='o',
+                                     into=('Totale','CorrectionTransport','Spectre','Vitesse',
+                                           'Production','Fission','Energie','Absorption','Capture','N2N',
+                                           'CoefficientDiffusionHomogene','CoefficientsDiffusionOrientes',
+                                           'CoefficientEquivalence','ProductionRetardee','SpectreRetarde',
+                                           'SectionDiffusionTotale','Transfert')),
+                BlocPasTransfert = BLOC (condition = "TypeSection not in ('Transfert','SectionDiffusionTotale')",
+                                         ValeursS = SIMP (typ='R',min=1,max='**',statut='o',
+                                                          fr="Valeurs des sections efficaces pour tous les groupes")),
+                BlocDiffusion = BLOC (condition = "TypeSection=='SectionDiffusionTotale'",
+                        OrdreAnisotropieD = SIMP (typ='I',statut='o',defaut=1,
+                                                 fr="Ordre d'anisotropie de la section de diffusion totale"),
+                        ValeursD = SIMP (typ='R',min=1,max='**',statut='o',
+                                         fr="Valeurs des sections de diffusion totale pour tous les groupes")),
+                BlocTransfert = BLOC (condition = "TypeSection=='Transfert'",
+                        OrdreAnisotropieT = SIMP (typ='I',statut='o',defaut=1,
+                                                 fr="Ordre d'anisotropie de la section de transfert"),
+                        ValeursT = NUPL (min=1,max='**',statut='o',
+                                        elements=(SIMP (typ='I',min=2,max=2,fr="Groupes de depart et d'arrivee"),
+                                                  SIMP (typ='R',fr="Valeur de la section de transfert")))
+                 )
+         )
+   )
+ ) ;  # Fin MACROLIB
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ASSEMBLAGE_COMBUSTIBLE_REEL : Classe de definition d'un assemblage combustible reel charge ou decharge d'un coeur REP
+#  DefautFabrication     : Champ texte indicateur precisant si l'assemblage appartient a un lot de fabrication
+#                          ayant un defaut impactant les resultats neutroniques
+#  CleControle           : Donnee fournie par la Division Combustible (Fichier ASN) et calculee a partir du nom de l'assemblage
+#  IdentificateurInitial : En cas de remplacement de la structure de l'assemblage, ce dernier  change de nom
+#                         (donnee transmise par le site)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ASSEMBLAGE_COMBUSTIBLE_REEL = OPER (nom="ASSEMBLAGE_COMBUSTIBLE_REEL",op=0,sd_prod=AssemblageCombustibleReel,
+                                        niveau = 'AssemblagesReels',
+  fr  = "Definition d'un assemblage combustible a charger, charge en reacteur, ou decharge en coeur, en piscine ou pour retraitement",
+  ang = "Definition of a core loaded fuel assembly",
+  regles        = (ENSEMBLE('Identificateur','CampagneResquelettage'),
+                   ENSEMBLE('ProgrammeExperimental','NatureElementExperimental'),),
+  IdentInitial                = SIMP (typ='TXM',statut='o',fr="Code d'identification initial de l'assemblage combustible en cas de resquelettage"),
+  Identificateur              = SIMP (typ='TXM',statut='f',fr="Code d'identification de l'assemblage combustible apres resquelettage"),
+  CampagneResquelettage       = SIMP (typ='I',statut='f',fr="Numero de la campagne de rechargement de l'assemblage resquelette"),
+  Constructeur                = SIMP (typ='TXM',statut='o',into=('FRAMATOME','SIEMENS','ABB','ENUSA','WESTINGHOUSE','CEA','KWU','EXXON','ANF'),
+                                      fr="Constructeur de l'assemblage combustible"),
+  TypeTechnologique           = SIMP (typ='TXM',defaut='AFA2GE',statut='o',
+                                      into=('ABB-97','AB-DEMOS','AB-LFA','AEF-XL',
+                                            'AFA','AFA-XL','AFA-XL-N4','AFA2G','AFA2GE','AFA2GL','AFA2GLE','AFA3G','AA3GL','AGI','AGI-XL',
+                                            'AKA','ALIX','BM','CEA','DEMONSTRATIONS','ENUSA-LFA','HTP','KWU','X1'),
+                                      fr="Type technologique de l'assemblage"),
+  TypeAssemblage              = SIMP (typ=AssemblageType,statut='o',fr="Type de l'assemblage"),
+  CleControle                 = SIMP (typ='TXM',statut='o',fr="Cle de controle de l'assemblage"),
+  Engagement                  = SIMP (typ='TXM',statut='o',fr="Engagement de l'assemblage"),
+  NumeroLot                   = SIMP (typ='I', statut='o',fr="Numero du lot de combustible"),
+  TypeCombustibleDuLot        = SIMP (typ='TXM',statut='f',fr="Type combustible et nom du lot (exemple 'MOX FMO1')"),
+  U235EnrichissementTheorique = SIMP (typ='R', statut='o',fr="Enrichissement theorique en U235 du combustible en %"),
+  PuEnrichissementTheorique   = SIMP (typ='R', statut='o',fr="Enrichissement theorique en Pu du combustible en %",defaut=0.),
+  MasseTheoriqueNL            = SIMP (typ='R', statut='o',fr="Masse theorique en g des noyaux lourds  Z > 89 de l'assemblage"),
+  MasseInitialeNL             = SIMP (typ='R', statut='o',fr="Masse initiale reelle en g des noyaux lourds de l'assemblage a la date de reference"),
+  U232MasseInitiale           = SIMP (typ='R', statut='o',fr="Masse initiale reelle en g d'uranium 232",defaut=0.),
+  U234MasseInitiale           = SIMP (typ='R', statut='o',fr="Masse initiale reelle en g d'uranium 234",defaut=0.),
+  U235MasseInitiale           = SIMP (typ='R', statut='o',fr="Masse initiale reelle en g d'uranium 235",defaut=0.),
+  U236MasseInitiale           = SIMP (typ='R', statut='o',fr="Masse initiale reelle en g d'uranium 236",defaut=0.),
+  U238MasseInitiale           = SIMP (typ='R', statut='o',fr="Masse initiale reelle en g d'uranium 238",defaut=0.),
+  BlocPu                      = BLOC (condition = "EnrichissementTheoriquePu > 0.",
+                                DateReference      = SIMP (typ='I',min=3,max=3,statut='o',fr="Date de reference Jour, Mois, An du lot MOX"),
+                                DatePrevDivergence = SIMP (typ='I',min=3,max=3,statut='o',
+                                                                     fr="Date de divergence previsionnelle de la tranche chargee de cet assemblage MOX"),
+                                DateDivergence     = SIMP (typ='I',min=3,max=3,statut='o',
+                                                            fr="Date de divergence reelle de la tranche chargee de cet assemblage MOX"),
+                                U235EquivEnrichissement = SIMP (typ='R',statut='f',defaut=3.25,fr="Enrichissement en U235 equivalent"),
+                                Pu239MasseInitiale = SIMP (typ='R',statut='o',fr="Masse reelle initiale en g de plutonium 239 a la date de reference"),
+                                Pu240MasseInitiale = SIMP (typ='R',statut='o',fr="Masse reelle initiale en g de plutonium 240 a la date de reference"),
+                                Pu241MasseInitiale = SIMP (typ='R',statut='o',fr="Masse reelle initiale en g de plutonium 241 a la date de reference"),
+                                Pu24MasseInitiale2 = SIMP (typ='R',statut='o',fr="Masse reelle initiale en g de plutonium 242 a la date de reference"),
+                                Am241MasseInitiale = SIMP (typ='R',statut='o',fr="Masse reelle initiale en g  d'americium 241 a la date de reference")
+                                      ),
+  AbsorbantFixe               = SIMP (typ='TXM',statut='f',fr="Texte caracteristique des absorbants fixes inseres dans l'assemblage"),
+  DefautFabrication           = SIMP (typ='TXM',statut='f',fr="Libelle du defaut de fabrication"),
+  ProgrammeExperimental       = SIMP (typ='TXM',statut='f',fr="Nom du programme experimental s'il s'agit d'un assemblage experimental"),
+  NatureElementExperimental   = SIMP (typ='TXM',statut='f',into=('Combustible','Grille','Structure'),fr="Nature de l'element experimental"),
+  LocalisationAssemblage      = SIMP (typ='TXM',statut='f',into=('BR Coeur','BK Piscine','HAGUE'),fr="Localisation de l'assemblage"),
+  SituationAdministrative     = SIMP (typ='TXM',statut='f',into=('SansParticularite','EnReservePourGestionFuture','EnAttenteReparationExamen',
+                                                                 'aDispositionDAC','AccordCogema','IndisponibleSurSite'),
+                                      fr="Situation administrative de l'assemblage"),
+  EtatGCN                     = SIMP (typ='TXM',statut='f',into=('Evacuable 0','En attente 1','Rechargeable 2','PourAccordCogema 3'),
+                                      fr="Etat de l'assemblage au sens GCN"),
+  ContraintesPhysiques        = NUPL ( max      = '**',
+                                       statut   = 'f',
+                                       elements = ( SIMP (typ='TXM',statut='o',fr="Texte precisant la contrainte",
+                                                             into=('NonRechargeable','NonSain','aExaminer','aReparer',
+                                                                   'Repare','aSubiExtraction','aPenaliser','NonInstrumentable','NonGrappable','Resquelette')),
+                                                    SIMP (typ='TXM',statut='o',fr="Premiere Campagne concernee")
+                                                   )
+                                     ),
+  ContraintesNbCycles        = NUPL (max = '**', statut = 'f',
+                                     fr       = "Liste des contraintes en nombre de cycles",
+                                     elements = ( SIMP (typ='TXM',statut='o',fr="Texte precisant la contrainte",
+                                                        into=('NombreDeCyclesSuccessifsImperatif','NombreMaximumDeCycles')),
+                                                  SIMP (typ='I',statut='o',fr="Nombre de cycles")
+                                                 )
+                                    ),
+  Campagnes                  = NUPL (max = '**', statut = 'o',
+                                     fr       = "Liste des campagnes d'irradiation subies par l'assemblage et etats correspondants",
+                                     elements = ( SIMP (typ='TXM',fr="Identificateur de la campagne"),
+                                                  SIMP (typ='TXM',fr="Etat de l'assemblage")
+                                                 )
+                                     ),
+  BibliothequesNeutroniques = NUPL (statut='f',elements=(SIMP (typ='TXM',
+                                                               fr="Identificateur de non presence d'absorbants (TBH) ou d'insertion (24B, 12B, 8B, 12P, 12P0P, etc)"),
+                                                         SIMP (typ='TXM',fr="Nom du fichier de la bibliotheque neutronique associee"))
+                                    ),
+  TypeDescriptionCalcul = SIMP (typ='TXM',statut='f',defaut='HomogeneAssemblage',into=('HomogeneAssemblage','ParCrayon')),
+  OxMaillageIrradiation = SIMP (typ=Maillage1D,statut='f',fr="Maillage suivant l'axe x de l'assemblage"),
+  OyMaillageIrradiation = SIMP (typ=Maillage1D,statut='f',fr="Maillage suivant l'axe y de l'assemblage"),
+  OzMaillageIrradiation = SIMP (typ=Maillage1D,statut='f',fr="Maillage suivant l'axe z de l'assemblage, Origine en bas de la zone active"),
+  IrradiationHomogene  = FACT (max='**',statut='f',fr="Taux d'irradiation pseudo-experimentale de l'assemblage",
+                                TempsIrradiation   = SIMP (typ='R', statut='o', fr="Temps d'irradiation en s"),
+                                IrradiationMoyenne = SIMP (typ='R', statut='o', fr="Irradiation moyenne MWj/t de l'assemblage"),
+                                IrradiationCycle   = SIMP (typ='R', statut='o', fr="Irradiation moyenne MWj/t de l'assemblage lors du cycle en cours"),
+                                Irradiations       = SIMP (typ='R', max='**', statut='o', fr="Irradiations des mailles (MWj/t) (en partant du bas et a gauche et par plan)")
+                                ),
+  IrradiationCrayon    = FACT (max='**',statut='f',fr="Taux d'irradiation pseudo-experimentale des crayons de l'assemblage",
+                                TempsIrradiation   = SIMP (typ='R', statut='o', fr="Temps d'irradiation en s  de l'assemblage"),
+                                IrradiationMoyenne = SIMP (typ='R', statut='o', fr="Irradiation moyenne MWj/t de l'assemblage"),
+                                Irradiations       = SIMP (typ='R', max='**', statut='o', fr="Irradiations des crayons (MWj/t) (en partant du bas et a gauche et par plan)")
+                                ),
+  FluenceHomogene      = FACT (max='**',statut='f',
+                                TempsIrradiation = SIMP (typ='R', statut='o', fr="Temps d'irradiation en s de l'assemblage"),
+                                FluenceMoyenne   = SIMP (typ='R', statut='o', fr="Fluence moyenne n/kb de l'assemblage"),
+                                Fluences         = SIMP (typ='R', max='**', statut='o', fr="Fluences des mailles (n/kb) (en partant du bas et a gauche et par plan)")
+                                ),
+  FluenceCrayon        = FACT (max='**',statut='f',
+                                TempsIrradiation = SIMP (typ='R', statut='o', fr="Temps d'irradiation en s de l'assemblage"),
+                                FluenceMoyenne   = SIMP (typ='R', statut='o', fr="Fluence moyenne n/kb de l'assemblage"),
+                                Fluences         = SIMP (typ='R', max='**', statut='o', fr="Fluences des crayons (n/kb) (en partant du bas et a gauche et par plan)")
+                                ),
+  CompositionHomogene  = FACT (max='**',statut='f',
+                                TempsIrradiation   = SIMP (typ='R'  , statut='o', fr="Temps d'irradiation en s"),
+                                IrradiationMoyenne = SIMP (typ='R'  , statut='o', fr="Irradiation moyenne MWj/t de l'assemblage"),
+                                FluenceMoyenne     = SIMP (typ='R'  , statut='o', fr="Fluence moyenne n/kb de l'assemblage"),
+                                Isotopes           = SIMP (typ='TXM', statut='o', max='**',fr="Liste des noms des isotopes"),
+                                Concentrations     = SIMP (typ='R'  , statut='o', max='**',
+                                                           fr="Concentrations des isotopes pour chaque maille radiale et pour chaque plan axial")
+                                ),
+  CompositionCrayon    = FACT (max='**',statut='f',
+                                TempsIrradiation   = SIMP (typ='R'  , statut='o', fr="Temps d'irradiation en s de l'assemblage"),
+                                IrradiationMoyenne = SIMP (typ='R'  , statut='o', fr="Irradiation moyenne MWj/t de l'assemblage"),
+                                FluenceMoyenne     = SIMP (typ='R'  , statut='o', fr="Fluence moyenne n/kb"),
+                                Isotopes           = SIMP (typ='TXM', statut='o', max='**',fr="Liste des noms des isotopes"),
+                                Concentrations     = SIMP (typ='R'  , statut='o', max='**',
+                                                           fr="Concentrations des isotopes pour chaque crayon et pour chaque plan axial (du bas vers le haut)")
+                                )
+  ) ;  # Fin ASSEMBLAGE_COMBUSTIBLE_REEL
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe REPARATION_ASSEMBLAGE : Classe de definition des donnees de reparation d'un assemblage
+#                                 Donnee de l'assemblage a reparer et des crayons de remplacement
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+REPARATION_ASSEMBLAGE = OPER (nom="REPARATION_ASSEMBLAGE", op=0, sd_prod=ReparationAssemblage, niveau = 'AssemblagesReels',
+  fr  = "Donnee de reparation ou de restauration d'un assemblage",
+  ang = "Data for an assembly repair",
+  AssemblageInitial  = SIMP (typ=(AssemblageType,AssemblageCombustibleReel),statut='o',fr="Type de l'assemblage a reparer"),
+  IrradiationMoyenne = SIMP (typ='R',statut='o',fr="Taux d'irradiation moyenne MWj/t de l'assemblage a reparer"),
+  CrayonRemplacement = FACT (max='**',statut='o',
+                            Position            = SIMP (typ='I', min=2, max=2, statut='o', fr="Coordonnees x,y du crayon a remplacer dans l'assemblage"),
+                            CelluleRemplacement = SIMP (typ=Cellule, statut='o', fr="Cellule de remplacement")
+                             )
+   ) ; # Fin REPARATION_ASSEMBLAGE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PENALITE_ASSEMBLAGE : Classe de definition des penalites a appliquer aux puissances des crayons d'un assemblage
+#  Trois possibilites :        1) de maniere uniforme
+#                      2) a quelques crayons
+#                      3) a l'ensemble des crayons et en fonction du taux d'irradiation de l'assemblage
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PENALITE_ASSEMBLAGE = OPER (nom="PENALITE_ASSEMBLAGE", op=0, sd_prod=PenaliteAssemblage, niveau = 'AssemblagesReels',
+  fr  = "Penalites dues a la reparation ou a la restauration d'un assemblage",
+  ang = "Penalties applied to a repaired assembly",
+  Assemblage = SIMP (typ=(AssemblageType,AssemblageCombustibleReel),statut='o',fr="Type de l'assemblage concerne par les penalites"),
+  regles = (UN_PARMI('UniformeDeltaP', 'CrayonDeltaP','CarteDeltaP'),),
+  UniformeDeltaP = SIMP (typ='R', statut='f', fr="Penalite en % a appliquer de maniere uniforme sur l'assemblage"),
+  CrayonDeltaP = FACT (statut='f',fr="Liste des penalites pour une liste particuliere de crayons d'un assemblage",
+                 Crayons = SIMP (typ='I', statut='o', max='**', fr="Numeros des crayons de l'assemblage"),
+                 DeltaP  = SIMP (typ='R', statut='o', max='**', fr="Penalites en % a appliquer aux crayons listes")),
+  CarteDeltaP  = FACT (max='**',statut='f',fr="Penalites pour l'ensemble des crayons de l'assemblage",
+                 BuMoyen = SIMP (typ='R', statut='o',fr="Taux d'irradiation MWj/t de l'assemblage a reparer"),
+                 DeltaP  = SIMP (typ='R', statut='o', max='**', fr="Pourcentage de variation de puissance par crayon en %"))
+) ; # Fin PENALITE_ASSEMBLAGE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe RESULTATS_GLOBAUX_COEUR : Classe de stockage des resultats globaux du coeur
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RESULTATS_GLOBAUX_COEUR = OPER (nom="RESULTATS_GLOBAUX_COEUR", op=0, sd_prod=ResultatsGlobauxCoeur, niveau = 'Resultats',
+  fr  = "Resultats globaux du calcul de coeur",
+  ang = "Global Core Calculation Results",
+  ResultatsCoeur = FACT (max='**',statut='o',fr="Resultats globaux du calcul de coeur calcules a un instant et pour une configuration donnee",
+        Configuration       = SIMP (typ='TXM', statut='o', max='**', fr="Configuration du coeur : Liste des groupes ou grappes inseres"),
+        PasInsertion        = SIMP (typ='I'  , statut='o', max='**', fr="Niveau d'insertion des groupes ou grappes inseres en nombre de pas extraits"),
+        IndiceConvergence   = SIMP (typ='I'  , statut='o', fr="Indice de convergence du calcul"),
+        TempsIrradiation    = SIMP (typ='R'  , statut='o', fr="Temps d'irradiation en s"),
+        IrradiationMoyenne  = SIMP (typ='R'  , statut='o', fr="Irradiation moyenne MWj/t"),
+        FluenceMoyenne      = SIMP (typ='R'  , statut='o', fr="Fluence moyenne n/kb"),
+        NiveauPuissance     = SIMP (typ='R'  , statut='o', fr="Niveau de puissance du calcul en %"),
+        TypeDeCalcul        = SIMP (typ='TXM', statut='o', fr="Type de calcul de coeur Critique ou non"),
+        ParametreCritique   = SIMP (typ='TXM', statut='o', fr="Parametre critique du calcul de coeur"),
+        TitreBore           = SIMP (typ='R'  , statut='o', fr="Titre en bore soluble du calcul de coeur en ppm"),
+        EfficaciteBore      = SIMP (typ='R'  , statut='o', fr="Efficacite differentielle du bore soluble pcm/ppm"),
+        Reactivite          = SIMP (typ='R'  , statut='o', fr="Reactivite du calcul en pcm"),
+        B2AxialRapide       = SIMP (typ='R'  , statut='o', fr="Laplacien axial rapide en cm-2"),
+        B2AxialThermique    = SIMP (typ='R'  , statut='o', fr="Laplacien axial thermique en cm-2"),
+        XeAntireactivite    = SIMP (typ='R'  , statut='o', fr="Antireactivite du xenon en pcm"),
+        FxyAssemblage       = SIMP (typ='R'  , statut='o', fr="Fxy Assemblage"),
+        DopplerCoefficient  = SIMP (typ='R'  , statut='o', fr="Coefficient Doppler en pcm/C"),
+        CTModerateur        = SIMP (typ='R'  , statut='o', fr="Coefficient Temperature moderateur en pcm/C"),
+        DopplerPuissance    = SIMP (typ='R'  , statut='o', fr="Coefficient Puissance Doppler seul en pcm/%P"),
+        CoeffPuissance      = SIMP (typ='R'  , statut='o', fr="Coefficient Puissance en pcm/%P"),
+        EfficDiffGrappes    = SIMP (typ='R'  , statut='f', max='**',
+                                    fr="Efficacites differentielles des grappes inserees, Couples de valeurs (Insertion,Efficacite differentielle)"),
+        Bite                = SIMP (typ='R'  , statut='f', fr="Position du bite en cours d'evolution, en nombre de pas extraits"),
+        RMBM                = SIMP (typ='R'  , statut='f', fr="Position Milieu de la bande de manoeuvre du groupe R, en nombre de pas extraits"),
+        FxyCrayon           = SIMP (typ='R'  , statut='f', fr="Fxy Crayon (apres factorisation eventuelle)"),
+        AssemblageChaud     = SIMP (typ='R'  , statut='f', fr="Assemblage portant le crayon chaud"),
+        LotAssemblageChaud  = SIMP (typ='I'  , statut='f', fr="Lot de l'assemblage portant le crayon chaud"),
+        NumeroCrayonChaud   = SIMP (typ='I'  , statut='f', fr="Numero du crayon chaud dans l'assemblage chaud"),
+        TmEntreeCoeur       = SIMP (typ='R'  , statut='o', fr="Temperature entree coeur en Celsius"),
+        TmMoyenneCuve       = SIMP (typ='R'  , statut='o', fr="Temperature moyenne cuve en Celsius"),
+        PressionEntreeCoeur = SIMP (typ='R'  , statut='o', fr="Pression entree coeur en bars"),
+        PressionSortieCoeur = SIMP (typ='R'  , statut='o', fr="Pression sortie coeur en bars"),
+        AOCoeur             = SIMP (typ='R'  , statut='o', fr="Axial Offset Coeur en %"),
+        DeltaICoeur         = SIMP (typ='R'  , statut='o', fr="Desequilibre Axial Coeur"),
+        AOXenon             = SIMP (typ='R'  , statut='o', fr="Axial Offset Xenon Coeur en %"),
+        AOIode              = SIMP (typ='R'  , statut='o', fr="Axial Offset Iode Coeur en %"),
+        FzCoeur             = SIMP (typ='R'  , statut='o', fr="Fz Coeur"),
+        FDH                 = SIMP (typ='R'  , statut='o', fr="Facteur d'elevation d'enthalpie Coeur"),
+        FQ                  = SIMP (typ='R'  , statut='o', fr="Facteur de point chaud Coeur Fq"),
+        FQCote              = SIMP (typ='R'  , statut='o', fr="Cote du Facteur de point chaud Coeur Fq"),
+        FQAssemblage        = SIMP (typ='R'  , statut='o', fr="Repere de l'assemblage portant le facteur de point chaud Fq"),
+        FQCrayon            = SIMP (typ='R'  , statut='o', fr="Numero de crayon de l'assemblage portant le facteur de point chaud Fq"),
+        FQLot               = SIMP (typ='R'  , statut='o', fr="Numero de lot de l'assemblage portant le facteur de point chaud Fq"),
+        TiltRadial4         = SIMP (typ='R'  , statut='o', fr="Desequilibre radial par quart de coeur NE, NO, SO, SE", min=4,max=4),
+        TiltRadial8         = SIMP (typ='R'  , statut='o',
+                                    fr="Desequilibre radial par huitieme de coeur, Origine en Ox et sens trigonometrique", min=8,max=8),
+        BetaTotal           = SIMP (typ='R'  , statut='f', fr="Contribution des neutrons retardes Beta total Coeur"),
+        BetaEffTotal        = SIMP (typ='R'  , statut='f', fr="Contribution des neutrons retardes Beta effectif total Coeur"),
+        ImportanceTotale    = SIMP (typ='R'  , statut='f', fr="Importance totale Coeur"),
+        TempsViePrompt      = SIMP (typ='R'  , statut='f', fr="Temps de vie effectif des neutrons prompts"),
+        ProductionU5        = SIMP (typ='R'  , statut='f', fr="Contribution U235 a la production totale nuSf"),
+        ProductionU8        = SIMP (typ='R'  , statut='f', fr="Contribution U238 a la production totale nuSf"),
+        ProductionPu        = SIMP (typ='R'  , statut='f', fr="Contribution Pu9+Pu0+Pu1+Pu2 a la production totale nuSf"),
+        Lambdai             = SIMP (typ='R'  , statut='f', fr="Constantes de decroissance moyennes des 6 groupes de precurseurs", min=6,max=6),
+        Betai               = SIMP (typ='R'  , statut='f', fr="Contribution des neutrons retardes Beta i des 6 groupes de precurseurs", min=6,max=6),
+        BetaiEff            = SIMP (typ='R'  , statut='f', fr="Contribution des neutrons retardes Beta i effectif des 6 groupes de precurseurs", min=6,max=6),
+        RoNordheim          = FACT (statut='f', fr="Reactivite en fct du temps de doublement par la relation de Nordheim",
+                                  Temps = SIMP (typ='R', statut='o', max='**', fr="Liste des temps de doublement en s"),
+                                  Ro    = SIMP (typ='R', statut='o', max='**', fr="Liste des reactivites correspondantes en pcm"))
+  )
+) ;  # Fin RESULTATS_GLOBAUX_COEUR
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe RESULTAT_FLUX : Classe de stockage des resultats de flux et des courants (a revoir pour ces derniers)
+#  L'edition se fait sur les mailles du reseau associe a l'etude (PlanChargement)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RESULTAT_FLUX = OPER (nom="RESULTAT_FLUX", op=0, sd_prod=ResultatFlux, niveau = 'Resultats',
+  fr  = "Distributions de flux moyens et de courants",
+  ang = "Average Flux and current distributions",
+  NbAssemblages = SIMP (typ='I'  , statut='o', fr="Nombre d'assemblages edites"),
+  OzNbValeurs   = SIMP (typ='I'  , statut='o', fr="Nombre de mailles axiales par assemblage"),
+  OzMaillage    = SIMP (typ=Maillage1D  , statut='o', fr="Maillage axial d'edition"),
+  NbGroupes     = SIMP (typ='I'  , statut='o', fr="Nombre de groupes d'energie"),
+  NbFluxBord    = SIMP (typ='I'  , statut='o', fr="Nombre de flux au bord par assemblage et par groupe d'energie"),
+  NbCourant     = SIMP (typ='I'  , statut='o', fr="Nombre de courants par assemblage et par groupe d'energie"),
+  Flux = FACT (max='**',statut='o',fr="Flux calcules a un instant et pour une configuration donnee",
+        Configuration      = SIMP (typ='TXM', statut='o', fr="Configuration du coeur ou de l'assemblage"),
+        TempsIrradiation   = SIMP (typ='R'  , statut='o', fr="Temps d'irradiation en s"),
+        IrradiationMoyenne = SIMP (typ='R'  , statut='o', fr="Irradiation moyenne MWj/t"),
+        FluenceMoyenne     = SIMP (typ='R'  , statut='o', fr="Fluence moyenne n/kb"),
+        Valeurs            = SIMP (typ='R'  , statut='o', max='**',
+                                   fr="Flux moyens par assemblage (en partant du bas a gauche) et par groupe")
+               ),
+  FluxBord = FACT (max='**',statut='f',fr="Flux moyens au bord des assemblages calcules a un instant et pour une configuration donnee",
+        Configuration      = SIMP (typ='TXM', statut='o', fr="Configuration du coeur ou de l'assemblage"),
+        TempsIrradiation   = SIMP (typ='R'  , statut='o', fr="Temps d'irradiation en s"),
+        IrradiationMoyenne = SIMP (typ='R'  , statut='o', fr="Irradiation moyenne MWj/t"),
+        FluenceMoyenne     = SIMP (typ='R'  , statut='o', fr="Fluence moyenne n/kb"),
+        Valeurs            = SIMP (typ='R'  , statut='o', max='**',
+                                   fr="Flux moyens au bord par assemblage (en partant du bas a gauche) et par groupe")
+                  ),
+  Courant = FACT (max='**',statut='f',fr="Courants calcules a un instant et pour une configuration donnee",
+        Configuration      = SIMP (typ='TXM', statut='o', fr="Configuration du coeur ou de l'assemblage"),
+        TempsIrradiation   = SIMP (typ='R'  , statut='o', fr="Temps d'irradiation en s"),
+        IrradiationMoyenne = SIMP (typ='R'  , statut='o', fr="Irradiation moyenne MWj/t"),
+        FluenceMoyenne     = SIMP (typ='R'  , statut='o', fr="Fluence moyenne n/kb"),
+        Valeurs            = SIMP (typ='R'  , statut='o', max='**',
+                                   fr="Courants detailles par assemblage (en partant du bas a gauche) et par groupe")
+                  )
+  ) ;  # Fin RESULTAT_FLUX
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe RESULTAT_PUISSANCES : Classe de stockage des resultats de puissance
+#  L'edition se fait sur les mailles actives du reseau associe a l'etude (PlanChargement)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RESULTAT_PUISSANCES = OPER (nom="RESULTAT_PUISSANCES", op=0, sd_prod=ResultatPuissances, niveau = 'Resultats',
+  fr  = "Distribution de puissance",
+  ang = "Power distributions",
+  NbAssemblages  = SIMP (typ='I'  , statut='o', fr="Nombre d'assemblages edites"),
+  OzNbValeurs    = SIMP (typ='I'  , statut='o', fr="Nombre de mailles axiales par assemblage"),
+  OzMaillage     = SIMP (typ=Maillage1D  , statut='o', fr="Maillage axial d'edition"),
+  Puissances               = FACT (max='**',statut='o',fr="Puissances calculees a un instant et pour une configuration donnee",
+        Configuration      = SIMP (typ='TXM', statut='o', fr="Configuration du coeur ou de l'assemblage"),
+        TempsIrradiation   = SIMP (typ='R'  , statut='o', fr="Temps d'irradiation en s"),
+        IrradiationMoyenne = SIMP (typ='R'  , statut='o', fr="Irradiation moyenne MWj/t"),
+        FluenceMoyenne     = SIMP (typ='R'  , statut='o', fr="Fluence moyenne n/kb"),
+        Valeurs            = SIMP (typ='R'  , statut='o', max='**',
+                                   fr="Puissances (en partant du bas a gauche) par assemblage")
+  )
+) ;  # Fin RESULTAT_PUISSANCES
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe RESULTAT_RADIAL : Classe de stockage des resultats integres sur une zone axiale particuliere (par defaut, toute la zone active)
+#  L'edition se fait sur les mailles du reseau associe a l'etude (PlanChargement)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RESULTAT_RADIAL = OPER (nom="RESULTAT_RADIAL", op=0, sd_prod=ResultatRadial, niveau = 'Resultats',
+  fr  = "Distribution radiale 2D apres integration axiale d'un type de resultat",
+  ang = "Radial Result Distribution",
+  TypeResultat = SIMP (typ='TXM', statut='o', into=('Puissance','Flux','Activite','Irradiation','IrradiationGradient4','Importance',
+                                                     'FDHmax','FDHcrayon','TauxReaction','TauxReactionParGroupe','SectionEfficace',
+                                                     'SectionEfficaceParGroupe','Kinf','AntireactiviteXenon','AntireactiviteIode',
+                                                     'AOPuissance','Tc','TcMax','Tm','TmMax','RoModerateur','Tgaine'),
+                                                      fr="Type de resultat"),
+# BlocGroupe   = BLOC (condition = "TypeResultat in ['Flux','TauxReactionParGroupe','SectionEfficaceParGroupe']",
+        NumeroGroupe      = SIMP (typ='I'  , statut='o', max=2, fr="Numeros de groupe d'energie associes"),
+# ),
+# BlocSection  = BLOC (condition = "TypeResultat in ['SectionEfficaceParGroupe','TauxReactionParGroupe','SectionEfficace','TauxReaction']",
+        TypeSection       = SIMP (typ='TXM'  , statut='o', fr="Type de section concerne"),
+# ),
+  CotesAxiales  = SIMP (typ='R', statut='f', min=2,max=2, fr="Cotes axiales de la zone moyennee"),
+  Radial = FACT (max='**',statut='o',fr="Distribution radiale 2D calculee a un instant et pour une configuration donnee",
+        Configuration      = SIMP (typ='TXM', statut='o', fr="Configuration du coeur ou de l'assemblage"),
+        TempsIrradiation   = SIMP (typ='R'  , statut='o', fr="Temps d'irradiation en s"),
+        IrradiationMoyenne = SIMP (typ='R'  , statut='o', fr="Irradiation moyenne MWj/t"),
+        FluenceMoyenne     = SIMP (typ='R'  , statut='o', fr="Fluence moyenne n/kb"),
+        Valeurs            = SIMP (typ=('R','I'), statut='o', max='**',
+                                   fr="Valeurs (en partant du bas a gauche) par assemblage")
+  )
+) ;  # Fin RESULTAT_RADIAL
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe RESULTAT_AXIAL : Classe de stockage des resultats moyennes axialement sur l'ensemble du reseau combustible
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RESULTAT_AXIAL = OPER (nom="RESULTAT_AXIAL", op=0, sd_prod=ResultatAxial, niveau = 'Resultats',
+  fr  = "Distribution axiale moyenne coeur",
+  ang = "Average Core Axial Distribution",
+  OzNbValeurs  = SIMP (typ='I', statut='o', fr="Nombre de mailles axiales"),
+  OzMaillage   = SIMP (typ=Maillage1D, statut='o', fr="Maillage axial d'edition"),
+  TypeResultat = SIMP (typ='TXM', statut='o', into=('Puissance','Flux','Xenon','Iode','Courant','Fxy(z)','Q(z)'), fr="Type de resultat"),
+  BlocGroupe   = BLOC (condition = "TypeResultat in ('Flux','Courant')",
+        NumeroGroupe      = SIMP (typ='I'  , statut='o', fr="Numero de groupe d'energie")),
+  Axial = FACT (max='**',statut='o',fr="Distribution axiale a un instant et pour une configuration donnee",
+        Configuration      = SIMP (typ='TXM', statut='o', fr="Configuration du coeur ou de l'assemblage"),
+        TempsIrradiation   = SIMP (typ='R'  , statut='o', fr="Temps d'irradiation en s"),
+        IrradiationMoyenne = SIMP (typ='R'  , statut='o', fr="Irradiation moyenne MWj/t"),
+        FluenceMoyenne     = SIMP (typ='R'  , statut='o', fr="Fluence moyenne n/kb"),
+        Valeurs            = SIMP (typ='R'  , statut='o', max='**',
+                                   fr="Distribution axiale moyenne (en partant du bas)")
+                                )
+  ) ;  # Fin RESULTAT_AXIAL
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe RESULTAT_IRRADIATIONS : Classe de stockage des resultats de taux d'irradiation
+#  L'edition se fait sur les mailles du reseau associe a l'etude (PlanChargement)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RESULTAT_IRRADIATIONS = OPER (nom="RESULTAT_IRRADIATIONS", op=0, sd_prod=ResultatIrradiations, niveau = 'Resultats',
+  fr  = "Distribution de taux d'irradiation",
+  ang = "Burnup distributions",
+  NbAssemblages  = SIMP (typ='I', statut='o', fr="Nombre d'assemblages"),
+  OzNbValeurs    = SIMP (typ='I', statut='o', fr="Nombre de valeurs d'irradiation par assemblage"),
+  OzMaillage     = SIMP (typ=Maillage1D, statut='o', fr="Maillage axial d'edition des irradiations"),
+  Gradient       = SIMP (typ='I', statut='o', defaut=4, fr="Nombre de valeurs d'irradiation par assemblage"),
+  Irradiation              = FACT (max='**',statut='o',fr="Irradiations calculees a un instant et pour une configuration donnee",
+        Configuration      = SIMP (typ='TXM', statut='o', fr="Configuration du coeur ou de l'assemblage"),
+        TempsIrradiation   = SIMP (typ='R'  , statut='o', fr="Temps d'irradiation en s"),
+        IrradiationMoyenne = SIMP (typ='R'  , statut='o', fr="Irradiation moyenne MWj/t"),
+        FluenceMoyenne     = SIMP (typ='R'  , statut='o', fr="Fluence moyenne n/kb"),
+        Valeurs            = SIMP (typ='R'  , statut='o', max='**',
+                                   fr="Irradiations (en partant du bas a gauche) par assemblage")
+  )
+) ;  # Fin RESULTAT_IRRADIATIONS
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe RESULTAT_ACTIVITES : Classe de stockage des resultats d'activite au centre des assemblages instrumentes
+#  L'edition se fait sur une liste particuliere d'assemblages du reseau associe a l'etude (PlanChargement)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RESULTAT_ACTIVITES = OPER (nom="RESULTAT_ACTIVITES", op=0, sd_prod=ResultatActivites, niveau = 'Resultats',
+  fr  = "Distributions d'activite des detecteurs",
+  ang = "Detector Activity distributions",
+  NbAssemblages      = SIMP (typ='I'        , statut='o', fr="Nombre d'assemblages dont on fournit l'activite calculee"),
+  ReperesAssemblages = SIMP (typ='TXM'      , statut='o', fr="Reperes des assemblages dont on fournit l'activite", max='**'),
+  OzNbValeurs        = SIMP (typ='I'        , statut='o', fr="Nombre de valeurs d'activite par assemblage"),
+  OzMaillage         = SIMP (typ=Maillage1D , statut='o', fr="Maillage axial d'edition des activites"),
+  CarteActivite            = FACT (max='**' , statut='o',fr="Activites calculees a un instant et pour une configuration donnee",
+        Configuration      = SIMP (typ='TXM', statut='o', fr="Configuration du coeur ou de l'assemblage"),
+        TempsIrradiation   = SIMP (typ='R'  , statut='o', fr="Temps d'irradiation en s"),
+        IrradiationMoyenne = SIMP (typ='R'  , statut='o', fr="Irradiation moyenne MWj/t"),
+        FluenceMoyenne     = SIMP (typ='R'  , statut='o', fr="Fluence moyenne n/kb"),
+        Valeurs            = SIMP (typ='R'  , statut='o', max='**',
+                                   fr="Activites par assemblage (en partant du bas) dans l'ordre de la liste fournie des assemblages")
+  )
+) ;  # Fin RESULTAT_ACTIVITES
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ACTIVITES_EXPERIMENTALES : Classe de stockage des cartes d'activite mesuree au centre des assemblages instrumentes
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ACTIVITES_EXPERIMENTALES = OPER (nom="ACTIVITES_EXPERIMENTALES", op=0, sd_prod=ActivitesExperimentales, niveau = 'ResultatsExperimentaux',
+  fr  = "Distributions experimentales d'activite mesuree dans les detecteurs mobiles",
+  ang = "Measured Detector Activity distributions",
+  CaracteristiquesCarte       = FACT (statut='o',fr="Caracteristiques de la carte d'Activite mesurees",
+        Site                  = SIMP (typ=SiteNucleaire, statut='o', fr="Site nucleaire de realisation de la carte de flux"),
+        Tranche               = SIMP (typ='I', statut='o', fr="Numero de la tranche nucleaire"),
+        Campagne              = SIMP (typ='I', statut='o', fr="Numero de la campagne d'irradiation"),
+        IrradiationMoyenne    = SIMP (typ='R', statut='o', fr="Irradiation moyenne MWj/t au debut de la carte"),
+        TitreBoreSoluble      = SIMP (typ='I', statut='o', fr="Titre en ppm en bore soluble du moderateur"),
+        EnergieProduite       = SIMP (typ='R', statut='o', fr="Energie produite en MWh"),
+        NumeroCarte           = SIMP (typ='I', statut='o', fr="Numero de la carte de flux"),
+        ValiditeCarte         = SIMP (typ='TXM', statut='o', into=('Oui','Non'),fr="Validite ou non de la carte de flux"),
+        DateHeureCarte        = SIMP (typ='I', min=5, max=5, statut='o', fr="Date (Jour Mois An) et heure (Heure Minute)de realisation de la carte de flux"),
+        PuissanceElectrique   = SIMP (typ='R', statut='o', fr="Puissance electrique MW au debut de la carte de flux"),
+        PuissanceRelative     = SIMP (typ='R', statut='o', fr="Puissance relative % au debut de la carte de flux"),
+        ModePilotage          = SIMP (typ='TXM', statut='o', fr="Mode de pilotage du reacteur"),
+        GroupesInseres        = SIMP (typ='TXM', statut='f', fr="Groupes inseres dans le coeur"),
+        PositionsGroupes      = SIMP (typ='I'  , statut='f', fr="Positions des groupes inseres dans le coeur en nb de pas extraits"),
+        NbPointsAxiaux        = SIMP (typ='I'  , statut='o', fr="Nombre de points mesures par trace axiale"),
+        NbPasses              = SIMP (typ='I'  , statut='o', fr="Nombre de passes de mesures"),
+        NbTracesAxiales       = SIMP (typ='I'  , statut='o', fr="Nombre de traces axiales d'activite mesuree"),
+        NbThermocouples       = SIMP (typ='I'  , statut='o', fr="Nombre de thermocouples"),
+        ReperesThermocouples  = SIMP (typ='TXM', statut='f', max='**', fr="Reperes des thermocouples dans le coeur"),
+        NumerosThermocouples  = SIMP (typ='I'  , statut='f', max='**', fr="Numeros des thermocouples dans le coeur")
+                                ),
+  ActivitesAxiales = FACT (statut='o',max='**',fr="Trace axiale d'activite mesuree",
+        RepereAssemblage   = SIMP (typ='TXM', statut='o', fr="Repere de l'assemblage instrumente"),
+        HeureDeMesure      = SIMP (typ='I', min=5, max=5, statut='o', fr="Date (Jour Mois An) et heure (Heure Minute)de realisation de la carte de flux"),
+        NumeroDetecteur    = SIMP (typ='I', statut='o', fr="Numero du detecteur de mesure"),
+        NumeroFourreau     = SIMP (typ='I', statut='o', fr="Numero de fourreau de mesure"),
+        NumeroPasse        = SIMP (typ='I', statut='o', fr="Numero de la passe de mesure"),
+        PuissanceThermique = SIMP (typ='R', statut='o', fr="Puissance thermique MWth au moment de la passe"),
+        ValeursActivites   = SIMP (typ='R', statut='o', max='**',
+                                                        fr="Trace d'activite dans l'assemblage (en partant du bas)"),
+                          ),
+  ChambresExternes = FACT (statut='f',max='**',fr="Courants mesures dans les chambres externes",
+        NumeroPasse = SIMP (typ='I', statut='o',            fr="Numero de la passe de mesure"),
+        Courants    = SIMP (typ='R', statut='o', max= '**', fr="Valeurs des courants mesures")
+                          ),
+  Thermohydraulique = FACT (statut='f',max='**',fr="Temperatures et pressions mesurees dans les boucles primaires",
+        NumeroPasse       = SIMP (typ='I', statut='o',               fr="Numero de la passe de mesure"),
+        TemperatureEntree = SIMP (typ='R', statut='o', min=3,max= 4, fr="Valeurs des temperatures mesurees en entree des boucles"),
+        TemperatureSortie = SIMP (typ='R', statut='o', min=3,max= 4, fr="Valeurs des temperatures mesurees en sortie des boucles"),
+        DeltaTemperature  = SIMP (typ='R', statut='o', min=3,max= 4, fr="Ecarts de temperature mesurees sur les boucles"),
+        IndiceFctBoucles  = SIMP (typ='I', statut='o', min=3,max= 4, fr="Indices de fonctionnement des boucles")
+                          ),
+  Thermocouples = FACT (statut='f',max='**',fr="Temperatures mesurees par les thermocouples",
+        NumeroPasse = SIMP (typ='I', statut='o', fr="Numero de la passe de mesure"),
+        Temperature = SIMP (typ='R', statut='o', max= '**', fr="Temperatures mesurees par les thermocouples")
+                       )
+  ) ; # Fin ACTIVITES_EXPERIMENTALES
+# -----------------------------------------------------------------------------------------------------------------------------------
+#   Classe RESULTATS_ETUDE : Classe de definition des resultats d'une etude
+#                               Regroupement des resultats d'une etude en fonction des donnees
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+RESULTATS_ETUDE = OPER (nom="RESULTATS_ETUDE", op=0, sd_prod=ResultatsEtude, niveau = 'Resultats',
+  fr  = "Resultats de tous les cas d'une etude",
+  ang = "Cases and associated Results",
+  Resultats = FACT (statut='o',max='**',
+        Donnees          = SIMP (typ=DonneesCasEtude       ,statut='o',fr="Objet DonneesGeneralesEtude auquel sont associes les objets resultats "),
+        Sections         = SIMP (typ=Macrolib              ,statut='f',max='**',fr="Liste des Objets Sections issus du calcul"),
+        Flux             = SIMP (typ=ResultatFlux          ,statut='f',max='**',fr="Liste des Objets Flux issus du calcul"),
+        Puissances       = SIMP (typ=ResultatPuissances    ,statut='f',max='**',fr="Liste des Objets Puissances"),
+        Activites        = SIMP (typ=ResultatActivites     ,statut='f',max='**',fr="Liste des Objets Activites"),
+        Irradiations     = SIMP (typ=ResultatIrradiations  ,statut='f',max='**',fr="Liste des Objets Irradiations"),
+        ResultatsGlobaux = SIMP (typ=ResultatsGlobauxCoeur ,statut='f',max='**',fr="Liste des Objets contenant les resultats globaux"),
+        ResultatsAxiaux  = SIMP (typ=ResultatAxial        ,statut='f',max='**',fr="Liste des Objets contenant les resultats axiaux"),
+        ResultatsRadiaux = SIMP (typ=ResultatRadial       ,statut='f',max='**',fr="Liste des Objets contenant les resultats radiaux"),
+        Accidents        = SIMP (typ=AccidentsResultats,statut='f',         fr="Resultats des calculs d'accidents"),
+        Gestion          = SIMP (typ=ResultatsCalculGestion,statut='f',max='**',fr="Liste des Objets contenant les resultats de calcul de gestion")
+   )
+ ) ;  # Fin RESULTATS_ETUDE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DICTIONNAIRE_CAS_ETUDE : Classe de definition de l'ensemble des resultats d'une etude
+#                                  Regroupement des resultats d'une etude en fonction des donnees
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DICTIONNAIRE_CAS_ETUDE = OPER (nom="DICTIONNAIRE_CAS_ETUDE", op=0, sd_prod=DictionnaireCasEtude, niveau = 'EtudeGenerale',
+  fr  = "Dictionnaire des resultats de tous les cas d'une etude",
+  ang = "Cases and associated Results dictionary",
+  AssociationDonneesResultats = FACT (statut='o',max='**',
+        Donnees   = SIMP (typ=DonneesCasEtude,statut='o',fr="Objet DonneesGeneralesEtude auquel sont associes les objets resultats"),
+        Resultats = SIMP (typ=ResultatsEtude,statut='o',max='**',fr="Liste des Objets regroupement des resultats")
+   )
+ ) ;    # Fin DICTIONNAIRE_CAS_ETUDE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PROLONGATION_CAMPAGNE : Classe de definition des donnees de prolongation de campagne
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PROLONGATION_CAMPAGNE = OPER (nom="PROLONGATION_CAMPAGNE", op=0, sd_prod=ProlongationCampagne, niveau = 'DonneesPilotage',
+  fr  = "Donnees de la prolongation de campagne ",
+  ang = "Stretch out Data",
+  NbPas              = SIMP (typ='I',statut='o',fr="Nombre d'instants (en JEPP) descriptifs de la prolongation de campagne"),
+  Jepp               = SIMP (typ='R',statut='o',max='**',fr="Instants descriptifs de la prolongation de campagne, en JEPP"),
+  Puissance          = SIMP (typ='R',statut='o',max='**',fr="Niveaux de puissance % correspondant aux Jepp de la prolongation de campagne"),
+  Temperature        = SIMP (typ='R',statut='o',max='**',fr="Temperatures Moderateur (Celsius) correspondant aux Jepp de la prolongation de campagne"),
+  PositionRegulation = SIMP (typ='R',statut='o',defaut=221.,fr="Position du groupe de regulation en nombre de pas extraits")
+ ) ;  # Fin PROLONGATION_CAMPAGNE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DONNEES_PILOTAGE_GENERAL : Classe de definition des donnees de pilotage general du reacteur
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DONNEES_PILOTAGE_GENERAL = OPER (nom="DONNEES_PILOTAGE_GENERAL", op=0, sd_prod=DonneesPilotageGeneral, niveau = 'DonneesPilotage',
+  fr  = "Donnees generales de pilotage du reacteur ",
+  ang = "General Reactor Control Data",
+  RegulationGroupe      = SIMP (typ='TXM',statut='o',defaut='R' ,fr="Nom symbolique du groupe de regulation"),
+  PnomDdcLimitInsR      = SIMP (typ='R'  ,statut='o',defaut=180.,fr="Limite d'insertion R a Pnom DDC en nombre de pas extraits"),
+  PnomFdcLimitInsR      = SIMP (typ='R'  ,statut='o',defaut=180.,fr="Limite d'insertion R a Pnom FDC en nombre de pas extraits"),
+  PnulDdcLimitInsR      = SIMP (typ='R'  ,statut='o',defaut=195.,fr="Limite d'insertion R a Pnul DDC en nombre de pas extraits"),
+  PnulFdcLimitInsR      = SIMP (typ='R'  ,statut='o',defaut=195.,fr="Limite d'insertion R a Pnul FDC en nombre de pas extraits"),
+  PuissanceGroupes      = SIMP (typ='TXM',statut='o',max='**',defaut=('G1','G2','N1','N2'),fr="Liste ordonnee des noms symboliques des groupes de compensation de puissance"),
+  Recouvrement          = SIMP (typ='I'  ,statut='o',max='**',defaut=(100,90,90),
+                                fr="Liste ordonnee des valeurs de recouvrement des groupes de compensation de puissance, en nombre de pas d'insertion"),
+  BiteDefinition        = SIMP (typ='R'  ,statut='o',defaut=-2.5, 
+                                fr="Efficacite differentielle minimale de la regulation donnant la definition du bite, en pcm/pas"),
+  BiteFDCPosition       = SIMP (typ='I'  ,statut='o',defaut=225.,      fr="Position imposee du bite en FDC, en nombre de pas extraits"),
+  BiteLimiteBasse       = SIMP (typ='I'  ,statut='o',defaut=207.,      fr="Position limite basse du bite, en nombre de pas extraits"),
+  GrappeExtraite        = SIMP (typ='R'  ,statut='o',defaut=225.,      fr="Position Grappe extraite en nombre de pas extraits"),
+  GrappeInseree         = SIMP (typ='R'  ,statut='o',defaut=5.,                fr="Position Grappe inseree en nombre de pas extraits"),
+  PositionR1ereDiverg   = SIMP (typ='R'  ,statut='o',defaut=170.,      fr="Position du groupe de Regulation R a la 1ere divergence"),
+  BandeManoeuvre        = SIMP (typ='R'  ,statut='o',defaut=24.,       fr="Largeur de la bande de manoeuvre du groupe de Regulation R"),
+  ConfigModeA           = SIMP (typ='TXM',statut='o',defaut=('D','CD','BCD','ABCD'),max='**', fr="Configuration des groupes en mode A"),
+  ConfigModeG           = SIMP (typ='TXM',statut='o',defaut=('G1','G1G2','G1G2N1','G1G2N1N2','R','RG1','RG1G2','RG1G2N1','RG1G2N1N2'),
+                                max='**', fr="Configuration des groupes en mode G"),
+  LimiteDomaineFct      = SIMP (typ='I',statut='o',defaut=0.05,fr="Limite du domaine de fonctionnement"),
+  NbPtsSpin             = SIMP (typ='I',statut='o',defaut=31,fr="Nombre de points SPIN"),
+  SeuilDnbrs            = FACT (statut='o',fr="Seuil DNBRS",
+                                PtsSpin = SIMP (typ='I',max='**',statut='o',fr="Liste des points Spin"),
+                                Seuils  = SIMP (typ='R',max='**',statut='o',fr="Liste des seuils DNBRS")),
+  CritereDNBRL          = SIMP (typ='R',statut='o',                 fr="Critere sur le REC"),
+  AlarmeBasDnbr         = SIMP (typ='R',statut='o',defaut=2.03,            fr="Alarme Bas DNBR"),
+  CsteCalibrage         = SIMP (typ='R',statut='o',defaut=-0.492,   fr="Constante A de calibrage des grappes SPIN"),
+  DebitCalibrage        = SIMP (typ='R',statut='o',defaut=99507.,   fr="Debit QCAL de calibrage de la puissance SPIN, m3/h"),
+  ConfigEpsilon         = SIMP (typ='TXM',statut='o',defaut=('TBH','R','RG1','RG1G2','RG1G2N1','G1G2N1','G1G2','G1'),
+                                max='**', fr="Configurations pour le calcul des epsilon(z)"),
+  IrradEpsilon          = SIMP (typ='R',statut='o',defaut=(150.,20000.),max='**',fr="Irradiations MWj/t du calcul des epsilon(z)")
+  ) ;  # Fin DONNEES_PILOTAGE_GENERAL
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DONNEES_AJUSTEMENT : Classe de definition des donnees d'ajustement des parametres de calcul
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DONNEES_AJUSTEMENT = OPER (nom="DONNEES_AJUSTEMENT", op=0, sd_prod=DonneesAjustement, niveau = 'DonneesEtude',
+  fr  = "Donnees generales d'ajustement",
+  ang = "Adjustment Data",
+  PnomReactivite = SIMP (typ='R',statut='o',defaut=0.,fr="Facteur additif correctif de la reactivite du coeur a Pnom, en pcm"),
+  PnulReactivite = SIMP (typ='R',statut='o',defaut=0.,fr="Facteur additif correctif de la reactivite du coeur a Pnul, en pcm"),
+  SectionsBore   = SIMP (typ='R',statut='o',defaut=1.,fr="Facteur multiplicatif correctif des sections du bore soluble du moderateur"),
+  AlphaIsotherme = SIMP (typ='R',statut='o',defaut=3.,fr="Facteur additif correctif du coefficient de temperature isotherme en pcm/C"),
+  Grappes        = NUPL (max = '**', statut = 'f',
+                         fr = "Liste des ajustements associes aux types de grappes de controle",
+                         elements = (SIMP (typ='TXM',statut='o',fr="Type de grappe 0P 24B 8B 12B etc."),
+                                     SIMP (typ='R'  ,statut='o',max='**',
+                                           fr="Coefficients multiplicatifs des sections d'absorption pour tous les groupes d'energie"))),
+  Configurations = NUPL (max = '**', statut = 'f',
+                         fr = "Liste des ajustements associes aux configurations de groupes de grappes de controle",
+                         elements = (SIMP (typ='TXM',statut='o',fr="Nom de la configuration"),
+                                     SIMP (typ='R'  ,statut='o',max='**',
+                                           fr="Coefficient multiplicatif de l'efficacites de la configuration"))),
+  Samarium       = NUPL (max = '**', statut = 'f',
+                         fr = "Liste des couples (Irradiation, Correction Reactivite due au samarium)",
+                         elements = (SIMP (typ='R',statut='o',fr="Taux d'irradiation en MWj/t"),
+                                     SIMP (typ='R',statut='o',fr="Correction de reactivite en pcm au taux d'irradiation precedent")))
+ ) ;  # Fin DONNEES_AJUSTEMENT
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ACCIDENT_DILUTION : Classe de definition des donnees du calcul d'accident de dilution
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ACCIDENT_DILUTION = OPER (nom="ACCIDENT_DILUTION", op=0, sd_prod=AccidentDilution, niveau = 'DonneesDesAccidents',
+  fr  = "Donnees de la simulation de l'accident de dilution",
+  ang = "Data for dilution accident simulation",
+  ConfigArretChaud            = SIMP (typ='TXM',statut='o',defaut=('R','G1','G2','N1','N2'),max='**',
+                                      fr="Liste des groupes de grappes de la configuration a l'arret a chaud"),
+  ConfigArretFroid            = SIMP (typ='TXM',statut='o',defaut=('G1','G2','N1','N2'),max='**',
+                                      fr="Liste des groupes de grappes de la configuration a l'arret a froid"),
+  ConfigFroidDepassement      = SIMP (typ='TXM',statut='o',defaut=('G1','N1','N2'),max='**',
+                                      fr="Liste des groupes de la configuration a l'arret a froid en cas de depassement du delai"),
+  ConfigChaudDepassement      = SIMP (typ='TXM',statut='o',defaut=('R','G1','N1','N2'),max='**',
+                                      fr="Liste des groupes de la configuration a l'arret a chaud en cas de depassement du delai"),
+  IrradDepassement            = SIMP (typ='TXM',statut='o',max='**',    fr="Liste des irradiations de calcul en cas de depassement du delai"),
+  SousCriticiteArret          = SIMP (typ='R',statut='o', defaut=1000., fr="Sous-criticite a l'arret en pcm"),
+  CbDilutionCorrection        = SIMP (typ='R',statut='o', defaut=100. , fr="Correction du titre en bore de dilution, en ppm"),
+  EfficaciteGrappesCorrection = SIMP (typ='R',statut='o', defaut=10.  , fr="Correction de l'efficacite des grappes en %"),
+  DefautPuissanceCorrection   = SIMP (typ='R',statut='o', defaut=10.  , fr="Correction du defaut de puissance en %"),
+  DecalageGroupes             = SIMP (typ='R',statut='o', defaut=10.  , fr="Decalage des groupes, en nombre de pas extraits"),
+  PerteEfficacite             = SIMP (typ='R',statut='o', defaut=1.   , fr="Perte d'efficacite par pas des groupes, en pcm/pas"),
+  PmaxChaud                   = SIMP (typ='R',statut='o', defaut=35.  , fr="Puissance relative maximum en dilution a chaud, en %"),
+  DebitChaud                  = SIMP (typ='R',statut='o', defaut=31.  , fr="Debit de dilution a chaud en m3/h"),
+  DebitFroid                  = SIMP (typ='R',statut='o', defaut=31.  , fr="Debit de dilution a froid en m3/h"),
+  DebitDilution               = SIMP (typ='R',statut='o', defaut=60.  , fr="Debit de dilution en puissance en m3/h"),
+  RoEauRCV                    = SIMP (typ='R',statut='o', defaut=1.   , fr="Masse volumique de l'eau du ballon RCV en g/cm3"),
+  CRNFroid                    = SIMP (typ='R',statut='o', defaut=250. , fr="Effet des CRN en dilution a froid en pcm"),
+  TiltFroidMn                 = SIMP (typ='R',statut='o', defaut=-2.  , fr="Provision sur le delai operateur due au tilt radial en accident a froid, en mn"),
+  TiltChaudMn                 = SIMP (typ='R',statut='o', defaut=-2.  , fr="Provision sur le delai operateur due au tilt radial en accident a chaud, en mn"),
+  TiltFroidPpm                = SIMP (typ='R',statut='o', defaut=5.,
+                                      fr="Majoration de la teneur en bore a la criticite due au tilt radial en accident a froid, en ppm"),
+  TiltChaudPpm                = SIMP (typ='R',statut='o', defaut=22.,
+                                      fr="Majoration de la teneur en bore a la criticite due au tilt radial en accident a chaud, en ppm"),
+  TiltPnDdc                   = SIMP (typ='R',statut='o', defaut=53., fr="Provision due au tilt radial en accident a Pn DDDC, en pcm"),
+  DelaiOperateur              = SIMP (typ='R',statut='o', defaut=15., fr="Delai d'intervention en accident a froid ou a chaud en mn"),
+  DelaiRechargement           = SIMP (typ='R',statut='o', defaut=20., fr="Delai d'intervention en accident au rechargement en mn")
+ ) ;  # Fin ACCIDENT_DILUTION
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ACCIDENT_DILUTION_RESULTAT : Classe de definition des resultats du calcul d'accident de dilution
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ACCIDENT_DILUTION_RESULTAT = OPER (nom="ACCIDENT_DILUTION_RESULTAT", op=0, sd_prod=AccidentDilutionResultat, niveau = 'ResultatsAccidents',
+  fr  = "Resultats de la simulation de l'accident de dilution",
+  ang = "Results from dilution accident simulation",
+  EtatArret               = SIMP (typ='TXM',statut='o', fr="Etat d'arret",into=('Chaud','Froid','Rechargement')),
+  BlocRechargement        = BLOC (condition = "EtatArret=='Rechargement'",
+        Keff              = SIMP (typ='R'  ,statut='o', fr="Keff au rechargement"),
+        Ebore             = SIMP (typ='R'  ,statut='o', fr="Efficacite du bore au rechargement pcm/ppm")),
+  BlocArret               = BLOC (condition = "EtatArret!='Rechargement'",
+        Configuration     = SIMP (typ='TXM',statut='o', fr="Configuration a l'arret"),
+        Irradiation       = SIMP (typ='R'  ,statut='o', fr="Irradiation de calcul MWj/t"),
+        CbArret           = SIMP (typ='R'  ,statut='o', fr="Titre en bore a l'arret en ppm"),
+        Eb                = SIMP (typ='R'  ,statut='o', fr="Efficacite du bore a l'arret en pcm/ppm"),
+        CbArretUrgence    = SIMP (typ='R'  ,statut='o', fr="Titre en bore a l'arret d'urgence en ppm"),
+        CbCriticite       = SIMP (typ='R'  ,statut='o', fr="Titre en bore a l'instant de criticite en ppm"),
+        EfficaciteAU      = SIMP (typ='R'  ,statut='o', fr="Efficacite de l'arret d'urgence en pcm"),
+        DelaiIntervention = SIMP (typ='R'  ,statut='o', fr="Delai d'intervention en mn"),
+        InstantCriticite  = SIMP (typ='R'  ,statut='f', fr="Instant de criticite en mn"),
+        IrradiationMin    = SIMP (typ='R'  ,statut='f', fr="Irradiation minimum MWj/t ou le delai d'intervention est suffisant"))
+ ) ;  # Fin ACCIDENT_DILUTION_RESULTAT
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ACCIDENT_RTV : Classe de definition des donnees du calcul d'accident de RTV
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ACCIDENT_RTV = OPER (nom="ACCIDENT_RTV", op=0, sd_prod=AccidentRTV, niveau = 'DonneesDesAccidents',
+  fr  = "Donnees de la simulation de l'accident de RTV",
+  ang = "Data for Steam Line Break accident simulation",
+  CodeCalcul            = SIMP (typ='TXM' ,statut='o', defaut='COBRA',into=('COBRA','THYC','FLICA'),fr="Debit primaire en m3/h"),
+  DebitPrimaire         = SIMP (typ='R'   ,statut='o', defaut=70500.     ,fr="Debit primaire en m3/h"),
+  DebitContournement    = SIMP (typ='R'   ,statut='o', defaut=4.5        ,fr="Debit de contournement en % du debit primaire"),
+  PressionPrimaire      = SIMP (typ='R'   ,statut='o', defaut=57.5       ,fr="Pression primaire en bars"),
+  TmMoyenne             = SIMP (typ='R'   ,statut='o', defaut=239.8      ,fr="Temperature moyenne moderateur en Celsius"),
+  TmPnul                = SIMP (typ='R'   ,statut='o', defaut=286.       ,fr="Temperature moderateur a Pnul en Celsius"),
+  TmPnom                = SIMP (typ='R'   ,statut='o', defaut=287.8      ,fr="Temperature moderateur a Pnom en Celsius"),
+  BorePpm               = SIMP (typ='R'   ,statut='o', defaut=21.9       ,fr="Titre en bore du moderateur en ppm"),
+  NiveauPuissance       = SIMP (typ='R'   ,statut='o', defaut=14.1       ,fr="Puissance relative en %"),
+  GrappeCoincee         = SIMP (typ='TXM' ,statut='o', defaut='F14'      ,fr="Repere de la grappe coincee lors de l'accident"),
+  GrappesCorrespondance = SIMP (typ='TXM' ,statut='o', max='**'          ,fr="Correspondance entre grappes coincees lors de l'accident"),
+  AnglesBouclesFroides  = SIMP (typ='R'   ,statut='o', defaut=(0., 120., 240.),max=4,fr="Positions angulaires des boucles froides"),
+  TmBoucles             = SIMP (typ='R'   ,statut='o', defaut=(216.8,250.8,250.8),max=4,fr="Temperatures des boucles"),
+  TmCanaux              = SIMP (typ='R'   ,statut='o', max='**',fr="Temperatures moyennes d'entree des canaux COBRA"),
+  TmAssemblages         = SIMP (typ='R'   ,statut='o', max='**',fr="Temperatures moyennes a l'entree des assemblages du coeur"),
+  OrientationBoucles    = NUPL (max='**'  ,statut='o',fr="Orientation des boucles suivant la grappe coincee",
+               elements = (SIMP (typ='TXM',statut='o', fr="Repere de la grappe"),
+                           SIMP (typ='R'  ,statut='o', fr="Orientation des boucles suivant la grappe coincee, en degres")))
+ ) ;  # Fin ACCIDENT_RTV
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ACCIDENT_CHUTE_GRAPPE : Classe de definition des donnees du calcul d'accident de chute de grappe(s)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ACCIDENT_CHUTE_GRAPPE = OPER (nom="ACCIDENT_CHUTE_GRAPPE", op=0, sd_prod=AccidentChuteGrappe, niveau = 'DonneesDesAccidents',
+  fr  = "Donnees de la simulation de l'accident de chute de grappes",
+  ang = "Data for rod insertion accident simulation",
+  RecMinimum         = SIMP (typ='R',statut='o',defaut=1.225,fr="REC minimum"),
+  RoPenalite         = SIMP (typ='R',statut='f',defaut=10.,fr="Penalite en % a appliquer aux variations de reactivite"),
+  RoPenaliteSupp     = NUPL (statut='f',fr="Penalite supplementaire suivant la grappe chutee",elements = (
+                             SIMP (typ='TXM',statut='o',fr="Repere de la grappe"),
+                             SIMP (typ='R'  ,statut='o',fr="Penalite supplementaire en %"))),
+  DroiteDetection    = SIMP (typ='R',statut='o',min=4,max=4,defaut=(0.92, 50., 1.11, 250.),
+                             fr="Droite de detection de la chute de grappe dans le plan (Tilt,DeltaRo)(2 points a definir tilt1,deltaro1 et tilt2,deltaro2)"),
+  CoeffDesalignement = SIMP (typ='R',statut='o',min=8,max=8,defaut=(1.010,1.040,1.040,1.040,1.110,1.040,1.110,1.000),
+                             fr="Coefficients de desalignements K1 KP1 K2 KP2 K3 K4 K5 E"),
+  DeltaDnbrThermo    = SIMP (typ='R',statut='o',min=2,max=2,defaut=(5.7, 0.),
+                             fr="Variation du REC due aux effets thermohydrauliques, pour les chutes d'1 grappe et de 2 grappes"),
+  DeltaDnbrMax       = SIMP (typ='R',statut='o',min=2,max=2,defaut=(39., 74.),
+                             fr="Variation maximum du REC, pour les chutes d'1 grappe et de 2 grappes"),
+  RecEnveloppe       = SIMP (typ='R',statut='o',defaut=(1., 2., 1.5), min=3, max=3,
+                             fr="Definition du domaine REC pour la determination de l'enveloppe de la flyspeck : RecMin RecMax Pente"),
+  FxyIncertitude     = SIMP (typ='R',statut='o',defaut=(0.,1.03,150.,1.03,2000.,1.061), max='**',
+                             fr="Incertitude sur Fxy en fonction de l'irradiation (Couples (MWj/t, Facteur))")
+ ) ;  # Fin ACCIDENT_CHUTE_GRAPPE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ACCIDENT_CHUTE_GRAPPE_RESULTAT : Classe de definition des resultats du calcul d'accident de chute de grappe(s)
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ACCIDENT_CHUTE_GRAPPE_RESULTAT = OPER (nom="ACCIDENT_CHUTE_GRAPPE_RESULTAT", op=0, sd_prod=AccidentChuteGrappeResultat, niveau='ResultatsAccidents',
+  fr  = "Resultats de la simulation de l'accident de chute de grappes",
+  ang = "Rod insertion accident simulation Results",
+  Irradiation       = SIMP (typ='R'  ,statut='o', fr="Irradiation de calcul MWj/t"),
+  Chute             = FACT (max='**' ,statut='f', fr="Resultats de la chute d'1 ou 2 grappes",
+    Grappes         = SIMP (typ='TXM', statut='o', max=2, fr="Reperes des grappes chutees"),
+    DeltaRo         = SIMP (typ='R',statut='o', fr="Antireactivite introduite par la chute des grappes, en pcm"),
+    DeltaRoPen      = SIMP (typ='R',statut='o', fr="Antireactivite penalisee introduite par la chute des grappes, en pcm"),
+    Keff            = SIMP (typ='R',statut='o', fr="Keff apres chute des grappes"),
+    KeffPen         = SIMP (typ='R',statut='o', fr="Keff penalise apres la chute des grappes"),
+    DeltaFxy        = SIMP (typ='R',statut='o', fr="Rapport Fxy/FxyTBH"),
+    Tilt2emeMinimum = SIMP (typ='R',statut='o', fr="Valeur du 2eme tilt minimum")),
+  ChuteMax          = FACT (statut='f',fr="Valeurs maximales atteintes pour les chutes d'1 ou 2 grappes",
+    FDH             = SIMP (typ='R'  ,statut='o', fr="Facteur d'elevation d'enthalpie"),
+    DeltaRo         = SIMP (typ='R'  ,statut='o', fr="Antireactivite introduite par la chute des grappes, en pcm"),
+    DeltaRoPen      = SIMP (typ='R'  ,statut='o', fr="Antireactivite penalisee introduite par la chute des grappes, en pcm"),
+    Keff            = SIMP (typ='R'  ,statut='o', fr="Keff apres chute des grappes"),
+    KeffPen         = SIMP (typ='R'  ,statut='o', fr="Keff penalise apres la chute des grappes"),
+    DeltaFxy        = SIMP (typ='R'  ,statut='o', fr="Rapport Fxy/FxyTBH"),
+    PositionDeltaRo = SIMP (typ='TXM',statut='o', max=2,fr="Grappes associees a l'antireactivite max"),
+    PositionFxy     = SIMP (typ='TXM',statut='o', max=2,fr="Grappes associees au Fxy/FxyTBH max"))
+ ) ;  # Fin ACCIDENT_CHUTE_GRAPPE_RESULTAT
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ACCIDENT_EJECTION : Classe de definition des donnees du calcul d'accident d'ejection d'une grappe
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ACCIDENT_EJECTION = OPER (nom="ACCIDENT_EJECTION", op=0, sd_prod=AccidentEjection, niveau = 'DonneesDesAccidents',
+  fr  = "Donnees de la simulation de l'accident d'ejection d'une grappe",
+  ang = "Data for rod ejection accident simulation",
+  Recouvrement     = SIMP (typ='R', statut='o', defaut=100., fr="Recouvrement en ejection Mode A, en nombre de pas"),
+  DeltaRoPenalite  = SIMP (typ='R', statut='o', defaut=1.10, fr="Facteur multiplicatif general des efficacites des grappes ejectees"),
+  FqPenalite       = SIMP (typ='R', statut='o', defaut=1.12, fr="Facteur multiplicatif general des Fq"),
+  DeltaRoPenGrappe = FACT (statut='f', fr="Corrections specifiques aux grappes ejectees : Couples RepereGrappe,PenaliteDeltaro",
+        Grappes    = SIMP (typ='TXM', statut='f', max='**', fr="Liste des grappes ejectees"),
+        Penalites  = SIMP (typ='R'  , statut='f', max='**', fr="Corrections des DeltaRo specifiques aux grappes ejectees")),
+  FqPenGrappe      = FACT (statut='f', fr="Corrections specifiques aux grappes ejectees : Couples RepereGrappe,PenaliteFq",
+        Grappes    = SIMP (typ='TXM', statut='f', max='**', fr="Liste des grappes ejectees"),
+        Penalites  = SIMP (typ='R'  , statut='f', max='**', fr="Corrections des Fq specifiques aux grappes ejectees"))
+ ) ;  # Fin ACCIDENT_EJECTION
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ACCIDENT_EJECTION_RESULTAT : Classe de definition des donnees du calcul d'accident d'ejection d'une grappe
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ACCIDENT_EJECTION_RESULTAT = OPER (nom="ACCIDENT_EJECTION_RESULTAT", op=0, sd_prod=AccidentEjectionResultat, niveau = 'ResultatsAccidents',
+  fr  = "Resultats de la simulation de l'accident d'ejection d'une grappe",
+  ang = "Rod ejection accident simulation Results",
+  Ejection     = FACT (statut='o', max='**', fr="Resultats du calcul d'ejection d'une grappe",
+        Irradiation    = SIMP (typ='R'  , statut='o', fr="Irradiation MWj/t du calcul d'ejection"),
+        Puissance      = SIMP (typ='R'  , statut='o', fr="Niveau de du calcul d'ejection"),
+        Configuration  = SIMP (typ='TXM', statut='o', max='**',fr="Configuration d'ejection (liste des groupes inseres)"),
+        Grappe         = SIMP (typ='TXM', statut='o', fr="Repere de la grappe ejectee"),
+        Fxy            = SIMP (typ='R'  , statut='o', fr="Fxy dans la configuration d'ejection"),
+        Efficacite     = SIMP (typ='R'  , statut='o', fr="Efficacite de la grappe ejectee"),
+        Dollar         = SIMP (typ='R'  , statut='o', fr="Rapport DeltaRoEjectee/BetaTot"),
+        Fq             = SIMP (typ='R'  , statut='o', fr="Facteur de point chaud Fq"))
+ ) ;  # Fin ACCIDENT_EJECTION_RESULTAT
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CRITERES_SURETE : Classe de definition des criteres de surete et des valeurs limites des parametres cles des accidents
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CRITERES_SURETE = OPER (nom="CRITERES_SURETE", op=0, sd_prod=CriteresSurete, niveau = 'DonneesDesAccidents',
+  fr  = "Criteres et valeurs limites des parametres cles de surete",
+  ang = "Safety Criteria and Accident Key Parameter Values",
+  FDHConception = SIMP (typ='R',statut='o',defaut=1.55 ,fr="Facteur d'elevation d'enthalpie de conception"),
+  RECMinimal    = SIMP (typ='R',statut='o',defaut=1.225,fr="Valeur minimale du REC"),
+  FxyLimite     = FACT (statut='o',fr="Liste des configurations de groupes et Fxy limites associes",
+                  Configurations  = SIMP (typ='TXM',max='**',statut='o',fr="Liste des configurations de groupes"),
+                  Fxy             = SIMP (typ='R'  ,max='**',statut='o',fr="Valeurs limites de Fxy pour toutes les configurations"))
+ ) ;  # Fin CRITERES_SURETE
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe DONNEES_ACCIDENTS : Agregation des donnees de tous les accidents et des criteres de surete
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+DONNEES_ACCIDENTS = OPER (nom="DONNEES_ACCIDENTS", op=0, sd_prod=DonneesAccidents, niveau = 'DonneesDesAccidents',
+  fr  = "Package des classes des donnees de simulation de tous les accidents",
+  ang = "All Accident Simulation Data",
+  regles = (AU_MOINS_UN('Dilution', 'RTV', 'ChuteGrappe','Ejection', 'CriteresSurete'),),
+  Dilution       = SIMP (typ=AccidentDilution    ,statut='f', fr="Donnees de l'accident de dilution"),
+  RTV            = SIMP (typ=AccidentRTV         ,statut='f', fr="Donnees de l'accident de RTV"),
+  ChuteGrappe    = SIMP (typ=AccidentChuteGrappe ,statut='f', fr="Donnees de l'accident de chute de grappe"),
+  Ejection       = SIMP (typ=AccidentEjection    ,statut='f', fr="Donnees de l'accident d'ejection"),
+  CriteresSurete = SIMP (typ=CriteresSurete      ,statut='f', fr="Criteres de surete")
+ ) ;  # Fin DONNEES_ACCIDENTS
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe ACCIDENTS_RESULTATS : Classe de definition des options generales et du type de calcul demande
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ACCIDENTS_RESULTATS = OPER (nom="ACCIDENTS_RESULTATS", op=0, sd_prod=AccidentsResultats, niveau = 'ResultatsAccidents',
+  fr  = "Package des classes des resultats de simulation de tous les accidents",
+  ang = "All Accident Simulation Results",
+# regles = (AU_MOINS_UN('Dilution', 'RTV', 'ChuteGrappe','Ejection'),),
+  Dilution     = SIMP (typ=AccidentDilutionResultat    ,statut='f', fr="Resultats de la simulation de l'accident de dilution"),
+# RTV          = SIMP (typ=AccidentRTVResultat         ,statut='f', fr="Resultats de la simulation de l'accident de RTV"),
+  ChuteGrappe  = SIMP (typ=AccidentChuteGrappeResultat ,statut='f', fr="Resultats de la simulation de l'accident de chute de grappe"),
+  Ejection     = SIMP (typ=AccidentEjectionResultat    ,statut='f', fr="Resultats de la simulation de l'accident d'ejection")
+ ) ;  # Fin ACCIDENTS_RESULTATS
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe PARAMETRES_CALCUL_GESTION : Classe de definition de parametres de calcul de gestion du coeur
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+PARAMETRES_CALCUL_GESTION = OPER (nom="PARAMETRES_CALCUL_GESTION", op=0, sd_prod=ParametresCalculGestion, niveau = 'ParametresCalcul',
+  fr  = "Parametres divers pour le calcul de gestion du coeur",
+  ang = "Core Management Calculation Parameters",
+  DecalageGroupes   = SIMP (typ='R',statut='o',defaut=0.,fr="Valeur du decalage (en nombre de pas) des groupes a chaque campagne"),
+  ErreurMaxLnat     = SIMP (typ='R',statut='o',defaut=5.,fr="Erreur maximale (MWj/t) du calcul de la longueur naturelle de campagne"),
+  ErreurBite        = SIMP (typ='R',statut='o',defaut=5.,fr="Erreur maximale (en nombre de pas) du calcul de la position du bite en evolution"),
+  LnatCbDdc         = SIMP (typ='R',statut='o',defaut=(7500., 758., 12060., 1300.), min=4, max=4,
+                            fr="Loi lineaire Lnat fonction de CbDDC : 2 points a fournir (MWj/t, Cb)"),
+  TiltBuMax         = SIMP (typ='R',statut='o',defaut=5.,fr="Pourcentage max de desequilibre radial admissible pour les calculs 1/4 coeur"),
+  CalculMarge       = FACT (statut='o',fr="Parametres du calcul de la marge d'antireactivite",
+                    MajorationDefP  = SIMP (typ='R' ,statut='o',defaut= 10.,fr="Majoration % du defaut de puissance"),
+                    Redistribution  = SIMP (typ='R' ,statut='o',defaut=950.,fr="Effet de redistribution en pcm"),
+                    EffetVide       = SIMP (typ='R' ,statut='o',defaut= 50.,fr="Effet de vide en pcm"),
+                    MinorationEFG   = SIMP (typ='R' ,statut='o',defaut= 10.,fr="Minoration de l'efficacite des grappes en %"),
+                    Regulation      = SIMP (typ='R' ,statut='o',defaut=500.,fr="Antireactivite de la regulation en pcm"),
+                    UsureGrappes    = SIMP (typ='R' ,statut='o',defaut=100.,fr="Effet de l'usure des grappes en pcm"),
+                    Calibrage       = SIMP (typ='R' ,statut='o',defaut=280.,fr="Incertitude de calibrage en pcm")),
+  SousCriticiteDdc = SIMP (typ='R',statut='o',defaut=1000.,fr="Sous-criticite initiale en etat d'arret, en pcm"),
+  SousCriticiteFdc = SIMP (typ='R',statut='o',defaut=1770.,fr="Sous-criticite minimale en etat d'arret FDC bore nul, en  pcm"),
+  CritereArChaud   = SIMP (typ='R',statut='o',defaut= 690.,fr="Cb (ppm) de changement de critere sur la sous-criticite minimale en etat d'arret (Ex: 1000 a 1770 pcm)"),
+  MajorCbArret    = SIMP (typ='R',statut='o',defaut= 100.,fr="Majoration (en ppm) des titres en bore en etat d'arret")
+ ) ;  # Fin PARAMETRES_CALCUL_GESTION
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe RESULTATS_CALCUL_GESTION : Classe de stockage des resultats de calcul de gestion
+# -----------------------------------------------------------------------------------------------------------------------------------
+RESULTATS_CALCUL_GESTION = OPER (nom="RESULTATS_CALCUL_GESTION", op=0, sd_prod=ResultatsCalculGestion, niveau = 'Resultats',
+  fr  = "Resultats divers des calculs de gestion du coeur",
+  ang = "Core Management Calculation Results",
+  Cb1ereDivergence = SIMP (typ='R',statut='f',defaut=0.,fr="Titre en bore a la premiere divergence, en ppm"),
+  CTMNegatif = FACT (statut='f',
+    Cbore = SIMP (typ='R',statut='o',fr="Titre en bore (ppm) garantissant un CTM negatif en DDC Pnul"),
+    Irrad = SIMP (typ='R',statut='o',fr="Irradiation MWj/t au-dela de laquelle le CTM est negatif a Pnul"),
+    Pmax  = SIMP (typ='R',statut='o',defaut=100.,fr="Niveau % de puissance limite garantissant un CTM negatif en DDC"),
+    CTMP  = SIMP (typ='R',statut='o',max='**',fr="CTM pcm/C en fonction du niveau de puissance en DDC (Serie de couples Pr, CTM)"),
+    Position = SIMP (typ='R',statut='o',max='**',
+              fr="Chevauchement des groupes conduisant a un CTM nul suivant la puissance (Couples Pr, Chevauchement)"))
+ ) ;  # Fin RESULTATS_CALCUL_GESTION
+# -----------------------------------------------------------------------------------------------------------------------------------
+#  Classe CALIBRAGE_GROUPES : Classe de stockage des positions de calibrage des groupes gris
+# -----------------------------------------------------------------------------------------------------------------------------------
+CALIBRAGE_GROUPES = OPER (nom="CALIBRAGE_GROUPES", op=0, sd_prod=CalibrageGroupes, niveau = 'DonneesPilotage',
+  fr  = "Positions de calibrage des groupes gris et coefficients isothermes associes",
+  ang = "Grey Control Rod Cluster Positions Versus Power Level and Isothermal Coefficients",
+  PasPuissance    = SIMP (typ='R', statut='o', defaut=5.,
+                          fr="Pas en puissance (%) pour la donnee des positions de calibrage"),
+  Calibrage       = FACT (statut='o',max='**',
+     Irradiation  = SIMP (typ='R',statut='o', fr="Irradiation MWj/t"),
+     Positions    = SIMP (typ='I',statut='o',max='**',fr="Positions de calibrage pour tous les niveaux de puissance")),
+  AlphaIso        = FACT (statut='o',max='**',
+     Irradiation  = SIMP (typ='R',statut='o', fr="Irradiation MWj/t"),
+     Coefficients = SIMP (typ='R',statut='o',max='**',fr="Coefficients isothermes pour tous les niveaux de puissance pcm/C")),
+  Chevauchement   = FACT (statut='o',max='**',
+     Irradiation  = SIMP (typ='R',statut='o', fr="Irradiation MWj/t"),
+     Pas          = SIMP (typ='I',statut='o',max='**',fr="Pas de chevauchement des groupes pour tous les niveaux de puissance")),
+  PnulDDCPosition = SIMP (typ='I',statut='o',max='**',fr="Positions de groupes gris dans les conditions d'essai de demarrage")
+ ) ;  # Fin CALIBRAGE_GROUPES
diff --git a/Descartes/editeur.ini b/Descartes/editeur.ini
new file mode 100644 (file)
index 0000000..99f4d63
--- /dev/null
@@ -0,0 +1,23 @@
+import os
+
+import prefs
+
+rep_cata = prefs.REPINI
+
+# Accès à la documentation 
+path_doc              = os.path.join(rep_cata,'..','Doc')
+exec_acrobat    =       "/usr/bin/acroread"
+# Utilisateur/Développeur
+isdeveloppeur   =       "NON"
+path_cata_dev   =       "/tmp/cata"
+# Répertoire temporaire
+rep_travail     =   "/tmp"
+
+# Choix des catalogues
+rep_mat="bidon"
+
+catalogues = (
+              ('DESCARTES','v1',os.path.join(rep_cata,'cata_descartes.py'),'python'),
+              ('DESCARTES','v2',os.path.join(rep_cata,'cata_descartes_new.py'),'python','defaut'),
+             )
+
diff --git a/Descartes/eficas_descartes.py b/Descartes/eficas_descartes.py
new file mode 100755 (executable)
index 0000000..c5368f5
--- /dev/null
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
+"""
+    Ce module sert à lancer EFICAS configuré pour Descartes
+"""
+# Modules Python
+import sys
+
+# Modules Eficas
+import prefs
+sys.path[:0]=[prefs.INSTALLDIR]
+
+import Editeur
+from Editeur import eficas_go
+
+if len(sys.argv) > 1 :
+    # on veut ouvrir un fichier directement au lancement d'Eficas
+    eficas_go.lance_eficas(code='DESCARTES',fichier = sys.argv[1])
+else:
+    # on veut ouvrir Eficas 'vide'
+    eficas_go.lance_eficas(code='DESCARTES')
+
diff --git a/Descartes/prefs.py b/Descartes/prefs.py
new file mode 100644 (file)
index 0000000..c14833e
--- /dev/null
@@ -0,0 +1,25 @@
+import os
+
+# REPINI sert à localiser le fichier editeur.ini
+# Obligatoire
+REPINI=os.path.dirname(os.path.abspath(__file__))
+
+# INSTALLDIR sert à localiser l'installation d'Eficas
+# Obligatoire
+INSTALLDIR=os.path.join(REPINI,'..')
+
+# CODE_PATH sert à localiser Noyau et Validation éventuellement
+# non contenus dans la distribution EFICAS
+# Par défaut on utilise les modules de INSTALLDIR
+# Peut valoir None (defaut)
+CODE_PATH = None
+#CODE_PATH = os.path.join(REPINI,'../../Superv')
+
+# ICONDIR sert à localiser le répertoire contenant les icones
+# Par défaut on utilise le répertoire icons dans Editeur
+ICONDIR=os.path.join(INSTALLDIR,'Editeur','icons')
+
+# lang indique la langue utilisée pour les chaines d'aide : fr ou ang
+lang='fr'
+
+
index 5b320e1931b43267149c7b4e57d2bcfff15d0a77..752a44c711e69634d4effea3b1378f29d2c5e6e5 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF Interp Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 
 import Tkinter,ScrolledText
index 7e9ff7db0f9c00b48af2539b031e00551467ff13..2ee01c7a298a5c94f8b6e5ddddf167f5d0fddc77 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 # import généraux
@@ -294,10 +313,7 @@ class ObjectTreeItem(TreeItem,Delegate):
 
     def get_fr(self):
         """ Retourne le fr de l'objet pointé par self """
-        try:
-           return self.object.get_fr()
-        except:
-           return ''
+        return self.object.get_fr()
 
     def get_docu(self):
         """ Retourne la clé de doc de l'objet pointé par self """
@@ -393,6 +409,12 @@ class SequenceTreeItem(ObjectTreeItem):
     def GetText(self):
       return  "    "
 
+    def additem(self,obj,pos):
+        # XXX Passer par addentite  de MCList ???
+        self.object.insert(pos,obj)
+        item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
+        return item
+
     def suppitem(self,item):
         if not self.object.isMCList():return 1
         try :
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..427090e66888b37840b3c0fa9f2f9ff6792ca7c4 100644 (file)
@@ -0,0 +1,19 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
index b52a564f8d9e21e398f01a1572d12579492b0f6e..2a0d4a0be46d3fe2128d7e6910576732ce5aff62 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF analyse_catalogue Accas  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 from string import split,strip,lowercase,uppercase
 import re,string,cPickle,os
@@ -11,8 +23,8 @@ import re,string,cPickle,os
 from Noyau.N_CR import CR
 
 #
-__Id__="$Id: analyse_catalogue.py,v 1.13.18.3 2001/06/19 12:24:48 iliade Exp $"
-__version__="$Name: FR_28_06_10_00 $"
+__Id__="$Id: analyse_catalogue.py,v 1.2 2002/05/15 15:31:58 eficas Exp $"
+__version__="$Name:  $"
 #
 l_noms_commandes = ['OPER','PROC','MACRO','FORM']
 l_noms_composes=['FACT','BLOC','NUPL','FORM']
@@ -92,15 +104,15 @@ class ENTITE :
                l=[]
                d={}
                if len(self.children)==0:
-                       self.liste = l
-                       self.dico = d
+                       self.ordre_mc = l
+                       self.entites = d
                        return
                try :
                        for child in self.children:
                                l.append(child.nom)
                                d[child.nom]=child
-                       self.liste = l
-                       self.dico = d
+                       self.ordre_mc = l
+                       self.entites = d
                except:
                        print 'erreur :',self.nom,self.__class__
                
@@ -254,8 +266,8 @@ class CATALOGUE_CATA:
                for cmd in self.liste_commandes:
                        l.append(cmd.nom)
                        d[cmd.nom]=cmd
-               self.liste = l
-               self.dico = d
+               self.ordre_mc = l
+               self.entites = d
 
        def report(self):
                """ retourne l'objet rapport du catalogue de commande """
@@ -283,7 +295,7 @@ def make_cata_pickle(fic_cata):
   cata_ordonne = analyse_catalogue(None,fic_cata)
   f = open(fic_cata_p,'w+')
   p = cPickle.Pickler(f)
-  p.dump(cata_ordonne.dico)
+  p.dump(cata_ordonne.entites)
   f.close()
   
 if __name__ == "__main__" :
index f8b031f7a1d5aed6a8ea4dc3b33fb14e213af666..41c1e664a7e82ea6d88d961a13f29765891c0360 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient la classe APPLI qui est la classe mère de
     l'application EFICAS. Elle prend en charge l'organisation générale
@@ -6,6 +25,7 @@
 """
 # Modules Python
 import sys
+import types
 import Pmw
 import Tkinter
 
@@ -13,6 +33,9 @@ import Tkinter
 import splash
 import prefs
 import fontes
+import tooltip
+
+VERSION="EFICAS v1.3"
 
 class APPLI: 
   def __init__ (self,master,code='ASTER',fichier=None) :
@@ -21,7 +44,7 @@ class APPLI:
       self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS)
       self.top.minsize(900,500)
       self.top.geometry("900x500")
-      self.top.title('EFICAS v1.1 pour '+self.code)
+      self.top.title(VERSION + ' pour '+self.code)
       self.top.withdraw()
       self.initializeTk(master)
       Pmw.initialise(master)
@@ -29,7 +52,7 @@ class APPLI:
       self.format_fichier = Tkinter.StringVar()
       self.message=''
       self.cree_composants_graphiques()
-      self.load_extensions()
+      self.load_appli_composants()
       self.affiche_FAQ()
       splash.fini_splash()
 
@@ -69,18 +92,18 @@ class APPLI:
       import statusbar
       self.statusbar=statusbar.STATUSBAR(self.top)
 
-  def load_extensions(self):
-      splash._splash.configure(text = "Chargement des extensions")
-      for mname in self.extensions:
-         self.load_extension(mname)
+  def load_appli_composants(self):
+      splash._splash.configure(text = "Chargement des appli_composants")
+      for mname in self.appli_composants:
+         self.load_appli_composant(mname)
 
-  def load_extension(self,mname):
+  def load_appli_composant(self,mname):
       module=__import__(mname,globals(),locals())
       factory=getattr(module,mname.upper())
-      extension=factory(self,self.top)
-      setattr(self,mname,extension)
-      self.fill_menus(extension,extension.menu_defs)
-      self.toolbar.creer_boutons_extension(extension.button_defs,extension)
+      appli_composant=factory(self,self.top)
+      setattr(self,mname,appli_composant)
+      self.fill_menus(appli_composant,appli_composant.menu_defs)
+      self.toolbar.creer_boutons_appli_composant(appli_composant.button_defs,appli_composant)
 
   def affiche_FAQ(self):
       import faq
@@ -110,6 +133,7 @@ class APPLI:
         root.option_add('*background', 'grey')
         root.option_add('*foreground', 'black')
         root.option_add('*EntryField.Entry.background', 'white')
+       root.option_add('*Entry*background', 'white')
         root.option_add('*Listbox*background', 'white')
         root.option_add('*Listbox*selectBackground', '#00008b')
         root.option_add('*Listbox*selectForeground', 'white')
@@ -127,7 +151,7 @@ class APPLI:
       """
           Retourne un texte d'informations sur la session courante d'EFICAS
       """
-      texte = 'EFICAS v1.1\n\n'
+      texte = VERSION + '\n\n'
       texte = texte + 'EFICAS est un produit développé par \nEDF-Division Stratégie et Développement\n'
       texte = texte + 'Equipe : MTI/MMN\n\n'
       texte = texte + 'Code utilisé : %s\n' %self.code
@@ -150,24 +174,45 @@ class APPLI:
       x=event.x
       y=event.y
       widget=event.widget
-      self.aide = Tkinter.Label(widget ,text = aide,
-                        bg="yellow",relief="ridge",anchor='w')
-      self.aide.place(in_=widget,
-                      relx=0.5,rely=0.5,anchor='center')
-      print aide
-      return
-
-  def fill_menus(self,extension,defs):
+      self.aide=tooltip.TOOLTIP(widget)
+      self.aide.xoffset = 10
+      self.aide.yoffset = - widget.winfo_height()/2
+      self.aide.setText(aide)
+      self.aide._showTip()
+      return 
+
+  def cree_menu(self,menu,itemlist,appli_composant):
+      """
+          Ajoute les items du tuple itemlist
+          dans le menu menu
+      """
+      number_item=0
+      radio=None
+      for item in itemlist:
+         number_item=number_item + 1
+         if not item :
+            menu.add_separator()
+         else:
+            label,method=item
+            if type(method) == types.TupleType:
+               # On a un tuple => on cree une cascade
+               menu_cascade=Tkinter.Menu(menu)
+               menu.add_cascade(label=label,menu=menu_cascade)
+               self.cree_menu(menu_cascade,method,appli_composant)
+            elif method[0] == '&':
+               # On a une chaine avec & en tete => on cree un radiobouton
+               command=getattr(appli_composant,method[1:])
+               menu.add_radiobutton(label=label,command=command)
+               if radio == None:radio=number_item
+            else:
+               command=getattr(appli_composant,method)
+               menu.add_command(label=label,command=command)
+      # Si au moins un radiobouton existe on invoke le premier
+      if radio:menu.invoke(radio)
+
+  def fill_menus(self,appli_composant,defs):
       menudict=self.menubar.menudict
       for mname,itemlist in defs:
           menu=menudict.get(mname)
           if not menu:continue
-          for item in itemlist:
-             if not item :
-                menu.add_separator()
-             else:
-                label,method=item
-                command=getattr(extension,method)
-                menu.add_command(label=label,command=command)
-                
-      
+          self.cree_menu(menu,itemlist,appli_composant)
diff --git a/Editeur/autre_analyse_cata.py b/Editeur/autre_analyse_cata.py
new file mode 100644 (file)
index 0000000..706bf6f
--- /dev/null
@@ -0,0 +1,107 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+"""
+   Ce module sert a retrouver l'ordre des mots cles d'un catalogue de
+   commandes
+"""
+if __name__ == "__main__" :
+   import sys
+   sys.path[:0]=[".."]
+   sys.path[:0]=["../Aster"]
+   sys.path[:0]=["../Saturne"]
+
+from Accas import NUPL
+
+def traite_entiteNUPL(entite):
+   """
+       Fonction speciale pour les nuplets (classe NUPL)
+       Cette fonction ajoute a l'objet entite un attribut de nom ordre_mc
+       qui est une liste vide.
+   """
+   entite.ordre_mc=[]
+
+def traite_entite(entite):
+   """
+       Cette fonction ajoute a l'objet entite un attribut de nom ordre_mc
+       qui est une liste contenant le nom des sous entites dans l'ordre 
+       de leur apparition dans le catalogue.
+       L'ordre d'apparition dans le catalogue est donné par l'attribut _no
+       de l'entite
+       La fonction active le meme type de traitement pour les sous entites
+       de entite
+   """
+   l=[]
+   for k,v in entite.entites.items():
+      if isinstance(v,NUPL):
+         traite_entiteNUPL(v)
+      else:
+         traite_entite(v)
+      l.append((v._no,k))
+   l.sort()
+   entite.ordre_mc=[ item for index, item in l ]
+
+def analyse_niveau(cata_ordonne_dico,niveau):
+   """
+       Analyse un niveau dans un catalogue de commandes
+   """
+   if niveau.l_niveaux == ():
+       # Il n'y a pas de sous niveaux
+       for oper in niveau.entites:
+           traite_entite(oper)
+           cata_ordonne_dico[oper.nom]=oper
+   else:
+       for niv in niveau.l_niveaux:
+           analyse_niveau(cata_ordonne_dico,niv)
+  
+def analyse_catalogue(cata):
+   """
+      Cette fonction analyse le catalogue cata pour construire avec l'aide
+      de traite_entite la structure de données ordre_mc qui donne l'ordre
+      d'apparition des mots clés dans le catalogue
+      Elle retourne un dictionnaire qui contient toutes les commandes
+      du catalogue indexées par leur nom
+   """
+   cata_ordonne_dico={}
+   if cata.JdC.l_niveaux == ():
+       # Il n'y a pas de niveaux
+       for oper in cata.JdC.commandes:
+           traite_entite(oper)
+           cata_ordonne_dico[oper.nom]=oper
+   else:
+       for niv in cata.JdC.l_niveaux:
+           analyse_niveau(cata_ordonne_dico,niv)
+   return cata_ordonne_dico
+
+
+if __name__ == "__main__" :
+   from Cata import cata_STA6
+   dico=analyse_catalogue(cata_STA6)
+   #import cata_saturne
+   #dico=analyse_catalogue(cata_saturne)
+
+   def print_entite(entite,dec='  '):
+       print dec,entite.nom,entite.__class__.__name__
+       for mocle in entite.ordre_mc:
+          print_entite(entite.entites[mocle],dec=dec+'  ')
+
+   for k,v in dico.items():
+      print_entite(v,dec='')
+
+   print dico.keys()
index 0553c6e3a2703e7b7ed59fa44181f1aa4079fdaa..ba5b9eeee65dd4c26995a4518008c534c66bfb51 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 # Modules Python
index 41840842ef8a83092f218a4218cb273bb2192dd6..341ec3f73f966984b57a1c138779be152c4ff5cf 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
    Ce module contient la classe BUREAU qui gere les JDC ouverts
 """
@@ -10,10 +29,12 @@ from tkMessageBox import showinfo,askyesno,showerror
 
 # Modules Eficas
 import splash
+import prefs
 import convert
 import generator
+import AIDE
 from jdcdisplay import JDCDISPLAY
-from utils import extension,stripPath,save_in_file
+from utils import extension_fichier,stripPath,save_in_file
 from widgets import Fenetre,Ask_Format_Fichier
 from fenetre_mc_inconnus import fenetre_mc_inconnus
 
@@ -58,6 +79,14 @@ class BUREAU:
                         ('Delete24',"delete","Supprime l'objet courant",'jdc'),
                         ('Help24',"view_doc","Documentation de l'objet courant",'jdc')
                        )
+   try:
+      menu_defs=prefs.menu_defs['bureau']
+   except:
+      pass
+   try:
+      button_defs=prefs.button_defs['bureau']
+   except:
+      pass
 
    def __init__(self,appli,parent):
       self.parent=parent
@@ -72,7 +101,7 @@ class BUREAU:
 
    def cree_cataitem(self):
       """
-          On récupère dans l'extension readercata les variables 
+          On récupère dans l'appli_composant readercata les variables 
           qui servent par la suite pour la création des JDC
       """
       self.cataitem=self.appli.readercata.cataitem
@@ -108,6 +137,7 @@ class BUREAU:
                          cata_ord_dico=self.cata_ordonne_dico,
                          appli=self.appli)
       self.JDCName=J.nom
+      self.fileName=None
       self.ShowJDC(J,self.JDCName)
       self.appli.toolbar.active_boutons()
 
@@ -196,11 +226,12 @@ class BUREAU:
           Demande à l'utilisateur quel JDC existant il veut ouvrir
       """
       if self.code == 'ASTER':
-          filetypes = ( ("format "+self.appli.format_fichier.get(), ".comm"),)
+          filetypes = ( ("format "+self.appli.format_fichier.get(), ".comm"),("Tous",'*'))
       else:
           filetypes = ( ("format "+self.appli.format_fichier.get(), ".py"),)
       if not hasattr(self,'initialdir'):
-         self.initialdir = self.appli.CONFIGURATION.rep_user
+         #self.initialdir = self.appli.CONFIGURATION.rep_user
+         self.initialdir = self.appli.CONFIGURATION.initialdir
       if not file :
           file = askopenfilename(title="Ouverture d'un fichier de commandes Aster",
                                  defaultextension=".comm",
@@ -208,7 +239,7 @@ class BUREAU:
                                  initialdir = self.initialdir)
       if file != '':
           self.fileName = file
-          e=extension(file)
+          e=extension_fichier(file)
           self.JDCName=stripPath(file)
           self.initialdir = os.path.dirname(file)
       else :
@@ -333,7 +364,8 @@ class BUREAU:
       sauvegarde = asksaveasfilename(title=titre,
                                      defaultextension=defext,
                                      filetypes = filtyp,
-                                     initialdir = self.appli.CONFIGURATION.rep_user)
+                                     initialdir = self.appli.CONFIGURATION.initialdir)
+                                     #initialdir = self.appli.CONFIGURATION.rep_user)
       if sauvegarde != '':
           if not save_in_file(sauvegarde,self.jdc_fini) :
               showinfo("Erreur","Problème à la sauvegarde du fichier "+`sauvegarde`)
@@ -504,12 +536,16 @@ class BUREAU:
       """
       if not hasattr(self,'JDC') : return
       titre = "fichier de commandes utilisateur"
-      texte = self.JDC.procedure
-      if texte == None:
+      #texte = self.JDC.procedure
+      #if texte == None:
+      if self.JDCDisplay_courant.fichier == None:
             self.appli.affiche_infos("Pas de fichier initial")
-            showerror("Impossible de visualiser le fichier initial","EFICAS ne peut visualiser le fichier \
-                       initial.\nIl s'agit d'un nouveau JDC")
+            showerror("Impossible de visualiser le fichier initial",
+                      "EFICAS ne peut visualiser le fichier initial.\nIl s'agit d'un nouveau JDC")
             return
+      f=open(self.JDCDisplay_courant.fichier,'r')
+      texte=f.read()
+      f.close()
       self.visu_texte_JDC = Fenetre(self.appli,titre=titre,texte=texte)
 
    def affichage_fichier_ini(self):
@@ -537,4 +573,8 @@ class BUREAU:
       l_mc = self.JDCDisplay_courant.jdc.get_liste_mc_inconnus()
       o = fenetre_mc_inconnus(l_mc)
       l = o.wait_new_list()
+      #print "mc_inconnus_new_list: ",l
+      #CCAR: Il n' y a pas de retour vers le JDC
 
+   def aideEFICAS(self):
+      AIDE.go(master=self.parent)
index 24535cbcceecf0e323d60a3606a1af89dbfff728..c72cd2c9b24f6f95fb80ba63dcbc169cc5c65e4d 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF catabrowser Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 # Modules Python
 import os
@@ -23,8 +35,8 @@ from Accas import OPER,PROC,MACRO,FORM
 from Accas import FACT,BLOC,SIMP
 
 #
-__version__="$Name: V1_1p1 $"
-__Id__="$Id: catabrowser.py,v 1.1.1.1 2001/12/04 15:38:22 eficas Exp $"
+__version__="$Name:  $"
+__Id__="$Id: catabrowser.py,v 1.2 2002/05/15 15:31:58 eficas Exp $"
 #
 class Tableau:
   incr = 10
@@ -224,8 +236,8 @@ class CATAItem(TreeItem):
   def get_liste_mc_ordonnee(self):
     """ Retourne la liste ordonnée (suivant le catalogue) brute des fils
     de l'entite courante """
-    if hasattr(self.objet_cata_ordonne,'liste'):
-      return self.objet_cata_ordonne.liste
+    if hasattr(self.objet_cata_ordonne,'ordre_mc'):
+      return self.objet_cata_ordonne.ordre_mc
     else :
       l=self.objet_cata_ordonne.keys()
       l.sort()
@@ -248,7 +260,7 @@ class CATAItem(TreeItem):
     l_cles_fils = self.get_liste_mc_ordonnee()
     for k in l_cles_fils :
       if type(self.objet_cata_ordonne) == types.InstanceType :
-        objet_cata = self.objet_cata_ordonne.dico[k]
+        objet_cata = self.objet_cata_ordonne.entites[k]
       else :
         objet_cata = self.objet_cata_ordonne.get(k,None)
       item = make_objecttreeitem(self.appli,k + " : ",self.d_fils[k],
index 5cdbe21154c826d8f01b25aae87e11ff28050f72..b2f30f00e2ddf8ca89bf082b800c72c8ed650738 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF cataediteur Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 # Modules Python
 import os
@@ -26,8 +38,8 @@ from Accas import ASSD,GEOM
 import definition_cata
 
 #
-__version__="$Name: V1_1p1 $"
-__Id__="$Id: cataediteur.py,v 1.1.1.1 2001/12/04 15:38:22 eficas Exp $"
+__version__="$Name:  $"
+__Id__="$Id: cataediteur.py,v 1.2 2002/05/15 15:31:58 eficas Exp $"
 #
 
 Fonte_Niveau = fontes.canvas_gras_italique
@@ -134,7 +146,7 @@ class Panel(Frame) :
       texte_infos = ''
       for e in cmd.entites.keys() :
           if e == name :
-              texte_infos=cmd.entites[e].fr
+              texte_infos=getattr(cmd.entites[e],'fr')
               break
       if texte_infos == '' : texte_infos="Pas d'infos disponibles"
       self.parent.appli.affiche_infos(texte_infos)
@@ -653,7 +665,7 @@ class OPERItem(OBJECTItem):
     for k in l_cles_fils :
       typ = TYPE_COMPLET(dico_fils[k])
       if type(self.objet_cata_ordonne) == types.InstanceType :
-        objet_cata = self.objet_cata_ordonne.dico[k]
+        objet_cata = self.objet_cata_ordonne.entites[k]
       else :
         objet_cata = self.objet_cata_ordonne.get(k,None)
       item = make_objecttreeitem(self.appli,typ + " : ",dico_fils[k],objet_cata_ordonne = objet_cata)
@@ -665,7 +677,7 @@ class OPERItem(OBJECTItem):
     return self.object.get_valeur_attribut('nom')
 
   def get_liste_mc_ordonnee(self):
-    return self.objet_cata_ordonne.liste
+    return self.objet_cata_ordonne.ordre_mc
 
   def GetIconName(self):
     if self.object.isvalid():
@@ -754,7 +766,7 @@ class NIVEAUItem(OPERItem):
     for k in l_cles_fils :
       typ = TYPE_COMPLET(dico_fils[k])
       if type(self.objet_cata_ordonne) == types.InstanceType :
-        objet_cata = self.objet_cata_ordonne.dico[k]
+        objet_cata = self.objet_cata_ordonne.entites[k]
       else :
         objet_cata = self.objet_cata_ordonne.get(k,None)
       item = make_objecttreeitem(self.appli,typ + " : ",dico_fils[k],objet_cata_ordonne = objet_cata)
index 95d9d33b71b21ee409c604230bb90cad95dc27ec..6b80e0d339e9049abd82cf68d2b21499c25b645f 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
    Ce module contient la fonction utilitaire centerwindow
    qui sert à centrer une fenetre
index 085c7d97cb917a292a11d0ab63cd71c336cb8fd5..6f0682a02294d5d857481bed245ae302dd89a3df 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF compobloc Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 from Tkinter import *
 import Pmw
index 194730edd9c3c0de6c4a772bf0dbe4ec93a53326..d31e71dece518327c7c4a1c32578d9b811eda759 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF compocomm Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 from Tkinter import *
 import Pmw
index 8b8c9237b7a6ccc2bb6f88a4dfe9c06612dbf946..cab37e893de20350d252da3d117387cddea6cd64 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF compocommandecomm Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 from Tkinter import *
 import Pmw
index 0b52bbb3cad5f9c78fd98cf28aa990cff429801b..7e0a792780070b09dc6fc111cae6a5a52794f794 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF compofact Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 import Pmw
 import Objecttreeitem
index b2d640f90dc59633ffbaf0cedd848ecc0a2d04e6..345bacc737f193b233b7f3d596e02426080ccbc7 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF compoformule Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 """
 Ce module contient les classes permettant de définir les objets graphiques
index 6446174909c2c4664902d6f13eecb61de34fded6..f331c6127f312d27f55718037066a926fdb56ba2 100644 (file)
@@ -1,17 +1,27 @@
-#@ MODIF compojdc Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
-#XXX est ce utile ?from Tkinter import *
 import Pmw
 import Objecttreeitem
 import panels
 
 from widgets import ListeChoix
-# XXX temporairement supprimé :from Accas import commentaire 
 
 class JDCPanel(panels.OngletPanel):
   def init(self):
index ce439f5d8529eed2895ad69dc0000493c001595b..edbf840c603b4fab38f13852a50075040a886eee 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF compomacro Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 # Modules Python
 import os,sys,string
@@ -23,8 +35,8 @@ import convert
 from widgets import Fenetre
 
 #
-__version__="$Name: V1_1p1 $"
-__Id__="$Id: compomacro.py,v 1.1.1.1 2001/12/04 15:38:22 eficas Exp $"
+__version__="$Name:  $"
+__Id__="$Id: compomacro.py,v 1.4 2002/05/15 15:31:58 eficas Exp $"
 #
 
 class MACROPanel(panels.OngletPanel):
@@ -39,7 +51,7 @@ class MACROPanel(panels.OngletPanel):
       nb.add('Concept', tab_text='Nommer concept')
     if ficini == 1:
       nb.add('Fichierinit',tab_text = 'Fichier %s' %self.node.item.get_nom())
-    nb.add('Commande', tab_text='Insérer Commande')
+    nb.add('Commande', tab_text='Nouvelle Commande')
     nb.add('Commentaire',tab_text='Paramètre/Commentaire')
     panneau=Pmw.PanedWidget(nb.page("Mocles"),
                             orient='horizontal')
@@ -187,6 +199,11 @@ class MACROTreeItem(compooper.EtapeTreeItem):
       Ce nom dépend de la validité de l'objet
       """
       if self.object.isactif():
+        if self.object.state != 'unchanged':
+           # Si des modifications ont eu lieu on force le calcul des concepts de sortie
+           # et celui du contexte glissant
+           self.object.get_type_produit(force=1)
+           self.object.parent.reset_context()
         if self.object.isvalid():
           return "ast-green-square"
         else:
@@ -230,6 +247,7 @@ class MACROTreeItem(compooper.EtapeTreeItem):
       # item.object = MCSIMP, MCFACT, MCBLOC ou MCList 
       if item.object.isoblig() :
           self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
+         print "Impossible de supprimer un mot-clé obligatoire"
           return 0
       else :
           self.object.suppentite(item.object)
@@ -274,10 +292,6 @@ class MACROTreeItem(compooper.EtapeTreeItem):
   def verif_condition_bloc(self):
       return self.object.verif_condition_bloc()
 
-  def nomme_sd(self,nom):
-      """ Lance la méthode de nommage de la SD """
-      return self.object.nomme_sd(nom)
-
   def get_noms_sd_oper_reentrant(self):
       return self.object.get_noms_sd_oper_reentrant()
 
index 74f5254ea96babcde67d2a0d070171f2f8404c04..e1ba88e43fdbcde816a8664e3dc1fc10c2d681b7 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF compomclist Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 from Tkinter import *
 import Pmw
@@ -39,7 +51,35 @@ class MCListTreeItem(Objecttreeitem.SequenceTreeItem):
         Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
         """
         return 0
-    
+
+    def isMCList(self):
+        """
+        Retourne 1 si l'objet pointé par self est une MCList, 0 sinon
+        """
+        return 1
+       
+    def additem(self,obj,pos):
+        """
+       Ajoute un objet MCFACT à la MCList (self.object) à la position pos
+       """
+       self.object.init_modif()
+       obj.verif_existence_sd()
+       obj.reparent(self.object.parent)
+       self.object.insert(pos,obj)
+        item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
+        return item  
+
+    def suppitem(self,item):
+        """
+       Retire un objet MCFACT de la MCList (self.object) 
+       """
+        self.object.init_modif()
+        self.object.remove(item.object)
+        # la liste peut être retournée vide !
+        message = "Mot-clé " + item.object.nom + " supprimé"
+        self.appli.affiche_infos(message)
+        return 1
+           
 import Accas
 treeitem = MCListTreeItem
 objet = Accas.MCList    
index 67ed0df170eeea15b26de6de8df35b6e31fffe4a..f16c2c13d98fc8cf035d3477facbc42191c7ab11 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF componiveau Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 
 from Tkinter import *
index d4e76fb921b78404b7167d60b7ee39d7b566a49e..04d11082c8be666a6bc1ea48a0db004d4c52ffd6 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF componuplet Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 # Modules Python
 import types
@@ -17,8 +29,8 @@ import Objecttreeitem
 import panels
 
 #
-__version__="$Name: V1_1p1 $"
-__Id__="$Id: componuplet.py,v 1.1.1.1 2001/12/04 15:38:22 eficas Exp $"
+__version__="$Name:  $"
+__Id__="$Id: componuplet.py,v 1.1.1.1 2002/03/26 09:08:46 eficas Exp $"
 #
 
 myrepr = Repr()
index eceb5cf8b635c05c07cc33bbda02164134bb73f9..154aa2abf98d5a70067e4091ce1c9e930ff2e95c 100644 (file)
@@ -1,12 +1,25 @@
-#@ MODIF compooper Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 from Tkinter import *
 import Pmw
+import traceback
 import Objecttreeitem
 import panels
 import fontes
@@ -68,7 +81,8 @@ class OPERPanel(panels.OngletPanel):
           choix = self.listbox.getcurselection()[0]
           self.valeur_choisie.set(choix)
       except:
-          pass
+          traceback.print_exc()
+         
 
   def choose_valeur_from_list(self,command):
       try:
@@ -76,7 +90,7 @@ class OPERPanel(panels.OngletPanel):
           self.valeur_choisie.set(choix)
           apply(command,(),{})
       except:
-          pass
+          traceback.print_exc()
 
 class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
   panel = OPERPanel
@@ -189,7 +203,9 @@ class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
 
   def nomme_sd(self,nom):
       """ Lance la méthode de nommage de la SD """
-      return self.object.nomme_sd(nom)
+      test,mess= self.object.nomme_sd(nom)
+      if test:self.object.parent.reset_context()
+      return test,mess
 
   def is_reentrant(self):
       return self.object.is_reentrant()
@@ -218,6 +234,16 @@ class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
       commande_comment.jdc = commande_comment.parent = self.object.jdc
       return commande_comment
 
+  def replace_child(self,old_item,new_item):
+     """
+     Remplace old_item.object par new_item.object dans les fils de self.object
+     """
+     index = self.object.mc_liste.index(old_item.object)
+     self.object.init_modif()
+     self.object.mc_liste.remove(old_item.object)
+     self.object.mc_liste.insert(index,new_item.object)
+     self.object.fin_modif()
+     
 import Accas
 treeitem = EtapeTreeItem
 objet = Accas.ETAPE    
index cd247e05b01dc325d57b9430e3c301b6f9219b5d..b533146698997379ef77110eb5ab681562e02ecd 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF compoparam Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 """
    Ce module contient les classes permettant de définir les objets graphiques
index 13bb98bada0078eef34a9daa1ceb4d30421d579c..2fa34a60baa4fab2cf12712ba76a04113e9168ef 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF compoparameval Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 """
 Ce module contient les classes permettant de définir les objets graphiques
index 7cbc5edf476b9426f7aeb01d64685c36b63ce363..881888167303a088b3e1910f262c4db1c7b6989e 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF compoproc Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 from Tkinter import *
 import Pmw
@@ -19,7 +31,7 @@ class PROCPanel(panels.OngletPanel):
     nb.pack(fill = 'both', expand = 1)
     self.nb=nb
     nb.add('Mocles', tab_text='Ajouter mots-clés')
-    nb.add('Commande', tab_text='Insérer Commande')
+    nb.add('Commande', tab_text='Nouvelle Commande')
     nb.add('Commentaire',tab_text='Paramètre/Commentaire')
     panneau=Pmw.PanedWidget(nb.page("Mocles"),
                             orient='horizontal')
@@ -130,10 +142,6 @@ class ProcEtapeTreeItem(compooper.EtapeTreeItem):
   def verif_condition_bloc(self):
     return self.object.verif_condition_bloc()
 
-  def nomme_sd(self,nom):
-      """ Lance la méthode de nommage de la SD """
-      return self.object.nomme_sd(nom)
-
   def get_noms_sd_oper_reentrant(self):
       return self.object.get_noms_sd_oper_reentrant()        
 
index d7ec659b34d9dabd7c1fc975b464499dd2c7f7d4..57e7c505957555764a3eccf3befef43a0ac6af1d 100644 (file)
@@ -1,17 +1,32 @@
-#@ MODIF composimp Editeur  DATE 05/09/2001   AUTEUR DURAND C.DURAND 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
+# Modules Python
 import string,types,os
 from Tkinter import *
 import Pmw
 from tkFileDialog import *
 from tkMessageBox import showinfo
 from copy import copy,deepcopy
+import traceback
 
+# Modules Eficas
 import Objecttreeitem
 import prefs
 import panels
@@ -51,7 +66,8 @@ class newSIMPPanel(panels.OngletPanel):
 
   def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
       """
-      Enregistre  val comme valeur de self.node.item.object SANS faire de test de validité
+          Enregistre  val comme valeur de self.node.item.object SANS 
+          faire de test de validité
       """
       if self.parent.modified == 'n' : self.parent.init_modif()
       if name != None:
@@ -67,9 +83,9 @@ class newSIMPPanel(panels.OngletPanel):
           self.node.racine.verif_all()
       else :
           self.node.parent.verif()
+      self.node.update()
       if self.node.item.isvalid():
           self.node.parent.select()
-      self.node.update()
 # ----------------------------------------------------------------------------------------
 #   Méthodes utlisées pour la manipulation des items dans les listes de choix
 # ----------------------------------------------------------------------------------------
@@ -196,18 +212,18 @@ class PLUSIEURS_Panel(newSIMPPanel):
       self.record_valeur(valeur)
       if self.node.item.isvalid():
           self.node.parent.select()
-      # fermeture de la fenêtre de sélection\r
-      if self.ajout_valeurs:\r
-          self.ajout_valeurs.quit()\r
+      # fermeture de la fenêtre de sélection
+      if self.ajout_valeurs:
+          self.ajout_valeurs.quit()
           
   def annule_modifs_valeur(self):
       """
       RAZ de la liste des valeurs (annule toutes les valeurs saisies par l'utilisateur)
       """
       self.node.select()
-      # fermeture de la fenêtre de sélection\r
-      if self.ajout_valeurs:\r
-          self.ajout_valeurs.quit()\r
+      # fermeture de la fenêtre de sélection
+      if self.ajout_valeurs:
+          self.ajout_valeurs.quit()
           
   def traite_reel(self,valeur):
       """
@@ -305,7 +321,7 @@ class PLUSIEURS_INTO_Panel(PLUSIEURS_Panel):
       """
       Génère la page de saisie de plusieurs valeurs parmi un ensemble discret
       de possibles
-      """\r
+      """
       self.ajout_valeurs = None
       # On récupère la bulle d'aide du panneau, l'objet, min et max (cardinalité de la liste),
       # la liste des choix et la liste des valeurs
@@ -424,12 +440,12 @@ class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
       # Création de l'entry ou de la liste des SD
       self.label = Label(self.frame_choix,text="Valeur :")
       self.make_entry(frame = self.frame_choix,command = self.add_valeur_sans_into)
-      self.label.place(relx=0.05,rely=0.5)\r
-      # Création d'un bouton "Importer ..." sur le panel.\r
-      bouton_valeurs_fichier = Button(self.frame_choix,\r
-                                      text="Importer ...",\r
-                                      command=self.select_in_file)\r
-      bouton_valeurs_fichier.place(relx=0.28,rely=0.7,relwidth=0.6)\r
+      self.label.place(relx=0.05,rely=0.5)
+      # Création d'un bouton "Importer ..." sur le panel.
+      bouton_valeurs_fichier = Button(self.frame_choix,
+                                      text="Importer ...",
+                                      command=self.select_in_file)
+      bouton_valeurs_fichier.place(relx=0.28,rely=0.7,relwidth=0.6)
       self.ajout_valeurs = None
       # boutons Ajouter et Supprimer
       bouton_add = Button(self.frame_boutons_fleches,
@@ -441,10 +457,12 @@ class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
       bouton_add.place(relx=0.3,rely=0.35)
       bouton_sup.place(relx=0.3,rely=0.65)
       # affichage de l'aide
+      self.frame_aide.update()
       self.aide = Label(self.frame_aide,
                         text = aide,
                         justify='center',
-                        anchor='center')
+                        anchor='center',
+                       wraplength=int(self.frame_aide.winfo_width()*0.8))
       self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
       self.Liste_valeurs.affiche_liste()
       # boutons Accepter et Annuler
@@ -456,21 +474,24 @@ class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
                               command = self.annule_modifs_valeur)
       for but in (bouton_accepter,bouton_annuler):
           but.pack(side='left',padx=5)
-\r
-  def select_in_file(self):\r
-      """ Permet d'ouvrir un fichier choisi par l'utilisateur. """\r
-      nom_fichier = askopenfilename(title="Choix fichier :")\r
-      if nom_fichier == "":\r
-          return\r
-      try:\r
-          f = open(nom_fichier, "rb")\r
-          selection_texte = f.read()\r
-          f.close()\r
-          self.ajout_valeurs = FenetreDeSelection(self, self.node.item,\r
-                                         titre="Sélection de valeurs",\r
-                                         texte=selection_texte)\r
-      except:\r
-          showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)\r
+
+  def select_in_file(self):
+      """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
+      nom_fichier = askopenfilename(title="Choix fichier :")
+      if nom_fichier == "":
+          return
+      try:
+          f = open(nom_fichier, "rb")
+          selection_texte = f.read()
+          f.close()
+          self.ajout_valeurs = FenetreDeSelection(self, 
+                                                 self.node.item,
+                                                 self.parent.appli,
+                                                 titre="Sélection de valeurs",
+                                                 texte=selection_texte)
+      except:
+          traceback.print_exc()
+          showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
           
   def get_bulle_aide(self):
       """
@@ -700,22 +721,20 @@ class UNIQUE_Panel(newSIMPPanel):
       if not test :
           mess = "impossible d'évaluer : %s " %`valeur`
           self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
-          return
       elif self.node.item.isvalid() :
           self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+         if self.node.item.get_position()=='global':
+              self.node.etape.verif_all()
+         elif self.node.item.get_position()=='global_jdc':
+              self.node.racine.verif_all()
+         else :
+              self.node.parent.verif()
+         self.node.update()
           self.node.parent.select()
       else :
           cr = self.node.item.get_cr()
           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
           self.record_valeur(anc_val,mess=mess)
-          return
-      if self.node.item.get_position()=='global':
-          self.node.etape.verif_all()
-      elif self.node.item.get_position()=='global_jdc':
-          self.node.racine.verif_all()
-      else :
-          self.node.parent.verif()
-      self.node.update()
 
 class UNIQUE_INTO_Panel(UNIQUE_Panel):
   """
@@ -878,7 +897,7 @@ class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
       self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
       # affichage du bouton 'Nouveau concept'
       self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ",
-                                 items = ('OUI','NON'),menubutton_width=10)
+                                 items = ('NON','OUI'),menubutton_width=10)
       self.b_co.configure(command = lambda e,s=self : s.ask_new_concept())
       self.b_co.place(relx=0.05,rely=0.6,anchor='w')
       self.label_co = Label(self.frame_valeur,text='Nom du nouveau concept :')
@@ -888,9 +907,12 @@ class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
       self.l_resu = Label(self.frame_valeur,text='Structure de donnée choisie :')
       self.valeur_choisie = StringVar()
       self.label_valeur = Label(self.frame_valeur,textvariable=self.valeur_choisie)
-      self.aide = Label(self.frame_valeur, text = aide)
+      self.frame_valeur.update()
+      self.aide = Label(self.frame_valeur,
+                        text = aide,
+                       wraplength=int(self.frame_valeur.winfo_width()*0.8),
+                       justify='center')
       self.aide.place(relx=0.5,rely=0.85,anchor='n')
-      self.b_co.invoke('NON')
       # affichage de la valeur courante
       self.display_valeur()
       
@@ -902,13 +924,66 @@ class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
       pour valoriser le mot-clé simple courant ou cliquez sur NOUVEAU CONCEPT pour
       entrer le nom d'un concept non encore existant"""
 
+  def valid_valeur(self):
+      """
+      Teste si la valeur fournie par l'utilisateur est une valeur permise :
+      - si oui, l'enregistre
+      - si non, restaure l'ancienne valeur
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      valeur = self.get_valeur()
+      self.erase_valeur()
+      anc_val = self.node.item.get_valeur()
+      test_CO=self.node.item.is_CO(anc_val)
+      test = self.node.item.set_valeur(valeur)
+      if not test :
+          mess = "impossible d'évaluer : %s " %`valeur`
+          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
+          return
+      elif self.node.item.isvalid() :
+          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+          if test_CO:
+             # il faut egalement propager la destruction de l'ancien concept
+             self.node.item.delete_valeur_co(valeur=anc_val)
+             # et on force le recalcul des concepts de sortie de l'etape
+             self.node.item.object.etape.get_type_produit(force=1)
+             # et le recalcul du contexte
+             self.node.item.object.etape.parent.reset_context()
+          self.node.parent.select()
+      else :
+          cr = self.node.item.get_cr()
+          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
+          self.record_valeur(anc_val,mess=mess)
+          return
+      if self.node.item.get_position()=='global':
+          self.node.etape.verif_all()
+      elif self.node.item.get_position()=='global_jdc':
+          self.node.racine.verif_all()
+      else :
+          self.node.parent.verif()
+      self.node.update()
+
   def valid_nom_concept_co(self,event=None):
       """
       Lit le nom donné par l'utilisateur au concept de type CO qui doit être
       la valeur du MCS courant et stocke cette valeur
       """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      anc_val = self.node.item.get_valeur()
       nom_concept = self.entry_co.get()
-      self.node.item.set_valeur_co(nom_concept)
+      test,mess=self.node.item.set_valeur_co(nom_concept)
+      if not test:
+          # On n'a pas pu créer le concept
+          self.parent.appli.affiche_infos(mess)
+          return
+      elif self.node.item.isvalid() :
+          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+          self.node.parent.select()
+      else :
+          cr = self.node.item.get_cr()
+          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
+          self.record_valeur(anc_val,mess=mess)
+          return
       if self.node.item.get_position()=='global':
           self.node.etape.verif_all()
       elif self.node.item.get_position()=='global_jdc':
@@ -932,6 +1007,9 @@ class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
           self.label_valeur.place_forget()
           self.entry_co.focus()
       elif new_concept == 'NON':
+          # On est passe de OUI à NON, on supprime la valeur
+          self.node.item.delete_valeur_co()
+          self.record_valeur(name=None,mess="Suppression CO enregistrée")
           self.label_co.place_forget()
           self.entry_co.place_forget()
           self.l_resu.place(relx=0.05,rely=0.7)
@@ -942,14 +1020,40 @@ class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
       Affiche la valeur de l'objet pointé par self
       """
       valeur = self.node.item.get_valeur()
-      if valeur == None : return # pas de valeur à afficher ...
+      if valeur == None or valeur == '': 
+         self.valeur_choisie.set('')
+         return # pas de valeur à afficher ...
       # il faut configurer le bouton si la valeur est un objet CO
       # sinon afficher le nom du concept dans self.valeur_choisie
-      if valeur.__class__.__name__ != 'CO':
-          self.valeur_choisie.set(valeur.nom)
-      else:
+      if self.node.item.is_CO():
           self.b_co.invoke('OUI')
           self.entry_co.insert(0,valeur.nom)
+      else:
+          self.valeur_choisie.set(valeur.nom)
+
+  def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
+      """
+      Enregistre  val comme valeur de self.node.item.object SANS faire de test de validité
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      if name != None:
+          valeur =name
+      else :
+          self.entry_co.delete(0,END)
+          valeur= self.entry_co.get()
+      self.node.item.set_valeur_co(valeur)
+      self.parent.appli.affiche_infos(mess)
+      # On met a jour le display dans le panneau
+      self.display_valeur()
+      if self.node.item.get_position()=='global':
+          self.node.etape.verif_all()
+      elif self.node.item.get_position()=='global_jdc':
+          self.node.racine.verif_all()
+      else :
+          self.node.parent.verif()
+      if self.node.item.isvalid():
+          self.node.parent.select()
+      self.node.update()
 
 
 class UNIQUE_BASE_Panel(UNIQUE_Panel):
@@ -980,7 +1084,11 @@ class UNIQUE_BASE_Panel(UNIQUE_Panel):
       self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
       self.entry.focus()
       # aide associée au panneau
-      self.aide = Label(self.frame_valeur, text = aide)
+      self.frame_valeur.update()
+      self.aide = Label(self.frame_valeur, 
+                        text = aide,
+                       wraplength=int(self.frame_valeur.winfo_width()*0.8),
+                       justify='center')
       self.aide.place(relx=0.5,rely=0.7,anchor='n')
       # affichage de la valeur du MCS
       self.display_valeur()
@@ -1047,7 +1155,11 @@ class UNIQUE_COMP_Panel(UNIQUE_Panel):
       self.entry1.place(relx=0.27,rely = 0.5,relwidth=0.35)
       self.entry2.place(relx=0.65,rely = 0.5,relwidth=0.35)
       self.entry1.focus()
-      self.aide = Label(self.frame_valeur, text = aide)
+      self.frame_valeur.update()
+      self.aide = Label(self.frame_valeur,
+                        text = aide,
+                        wraplength=int(self.frame_valeur.winfo_width()*0.8),
+                       justify='center')
       self.aide.place(relx=0.5,rely=0.7,anchor='n')
 
   def get_bulle_aide(self):
@@ -1135,7 +1247,6 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
                   else:
                       # on attend un entier, un réel ou une string
                       self.panel = UNIQUE_BASE_Panel
-
       
   def SetText(self, text):
     try:
@@ -1158,7 +1269,8 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
     Retourne le texte à afficher dans l'arbre représentant la valeur de l'objet
     pointé par self 
     """
-    return self.object.GetText()
+    text= self.object.GetText()
+    return text
 
   def wait_co(self):
       """
@@ -1218,42 +1330,47 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
   def GetMinMax(self):
       """ Retourne les valeurs min et max de la définition de object """
       return self.object.get_min_max()
-\r
-  def GetMultiplicite(self):\r
-      """ A préciser.\r
-          Retourne la multiplicité des valeurs affectées à l'objet\r
-          représenté par l'item. Pour le moment retourne invariablement 1.\r
-      """\r
-      return 1\r
-\r
-  def GetType(self):\r
-      """ Retourne le type de valeur attendu par l'objet représenté par l'item.\r
-      """\r
-      return self.object.get_type()\r
-\r
-  def GetIntervalle(self):\r
-      """ Retourne le domaine de valeur attendu par l'objet représenté par l'item.\r
-      """\r
-      return self.object.getintervalle()\r
-\r
-  def IsInIntervalle(self,valeur):\r
-      """ Retourne 1 si la valeur est dans l'intervalle permis par\r
-          l'objet représenté par l'item.\r
-      """\r
-      return self.object.isinintervalle(valeur)\r
+
+  def GetMultiplicite(self):
+      """ A préciser.
+          Retourne la multiplicité des valeurs affectées à l'objet
+          représenté par l'item. Pour le moment retourne invariablement 1.
+      """
+      return 1
+
+  def GetType(self):
+      """ 
+          Retourne le type de valeur attendu par l'objet représenté par l'item.
+      """
+      return self.object.get_type()
+
+  def GetIntervalle(self):
+      """ 
+           Retourne le domaine de valeur attendu par l'objet représenté 
+           par l'item.
+      """
+      return self.object.getintervalle()
+
+  def IsInIntervalle(self,valeur):
+      """ 
+          Retourne 1 si la valeur est dans l'intervalle permis par
+          l'objet représenté par l'item.
+      """
+      return self.object.isinintervalle(valeur)
 
   def set_valeur_co(self,nom_co):
       """
       Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
       """
-      self.object.set_valeur_co(nom_co)
+      return self.object.set_valeur_co(nom_co)
       
   def get_sd_avant_du_bon_type(self):
       """
       Retourne la liste des noms des SD présentes avant l'étape qui contient
       le MCS pointé par self et du type requis par ce MCS
       """
-      return self.object.jdc.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
+      return self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,
+                                                               self.object.definition.type)
     
   def GetListeValeurs(self) :
       """ Retourne la liste des valeurs de object """
@@ -1272,6 +1389,34 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
         - retourne 'valeur' (chaîne de caractères) sinon """
       return self.object.eval_valeur(valeur)
 
+  def is_CO(self,valeur=None):
+      """
+         Indique si valeur est un concept produit de la macro
+         Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
+         Si valeur vaut None on teste la valeur du mot cle
+      """
+      # Pour savoir si un concept est un nouveau concept de macro
+      # on regarde s'il est présent dans l'attribut sdprods de l'étape
+      # ou si son nom de classe est CO.
+      # Il faut faire les 2 tests car une macro non valide peut etre
+      # dans un etat pas tres catholique avec des CO pas encore types
+      # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
+      if not valeur:valeur=self.object.valeur
+      if valeur in self.object.etape.sdprods:return 1
+      if type(valeur) is not types.ClassType:return 0
+      if valeur.__class__.__name__ == 'CO':return 1
+      return 0
+
+  def delete_valeur_co(self,valeur=None):
+      """
+           Supprime la valeur du mot cle (de type CO)
+           il faut propager la destruction aux autres etapes
+      """
+      if not valeur : valeur=self.object.valeur
+      # XXX faut il vraiment appeler del_sdprod ???
+      #self.object.etape.parent.del_sdprod(valeur)
+      self.object.etape.parent.delete_concept(valeur)
+
 import Accas
 treeitem = SIMPTreeItem
 objet = Accas.MCSIMP
index 7a191d577b0045aa457c5b086405461d13dcb90c..703ec6d490c5a3f25687cd0bbca83b561432fd14 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module sert pour charger les paramètres de configuration d'EFICAS
 """
@@ -55,8 +74,9 @@ class CONFIG:
          print string.join(l[2:])
          sys.exit()
       for attr in self.l_nom_param:
-          nom_attr,statut = attr
-          valeur = d.get(nom_attr,None)
+          nom_attr,statut,defaut = attr
+          #valeur = d.get(nom_attr,None)
+          valeur = d.get(nom_attr,defaut)
           if not valeur and statut=='o':
               showerror("Erreur","Une erreur s'est produite dans la relecture du fichier de configuration : "
                        + self.fic_ini+"\n EFICAS va vous demander les nouveaux paramètres")
@@ -81,7 +101,7 @@ class CONFIG:
           traceback.print_exc()
           return
       for attr in self.l_nom_param:
-          nom_attr,statut = attr
+          nom_attr,statut,defaut = attr
           valeur = d.get(nom_attr,None)
           if valeur :
               setattr(self,nom_attr,valeur)
@@ -94,6 +114,14 @@ class CONFIG:
       (label,nature,nom_var,defaut)
       """
       self.l_param=[]
+      # répertoire initial pour OPEN/SAVE des fichiers de commande
+      # Par defaut, EFICAS utilise le repertoire utilisateur $HOME/Eficas_install
+      # Il est possible de specifier dans editeur.ini ou eficas.ini un autre chemin
+      # Ce peut etre un chemin absolu ou le repertoire courant (os.curdir)
+      if hasattr(self,'initialdir'):
+          self.l_param.append(("Répertoire initial pour Open/save des fichiers de commande",'rep','initialdir',self.initialdir))
+      else:
+          self.l_param.append(("Répertoire initial pour Open/save des fichiers de commande",'rep','initialdir',self.rep_user))
       # répertoire de travail
       if hasattr(self,'rep_travail'):
           self.l_param.append(("Répertoire de travail",'rep','rep_travail',self.rep_travail))
@@ -135,11 +163,10 @@ class CONFIG:
       self.l_nom_param=[]
       statut='o'
       for tup in self.l_param:
-          #self.l_nom_param.append((tup[2],statut))
           if tup[1] == 'YesNo':
               # les paramètres suivant tup sont facultatifs ...
               statut='f'
-          self.l_nom_param.append((tup[2],statut))
+          self.l_nom_param.append((tup[2],statut,tup[3])) # nom,statut,defaut
 
   def affichage_fichier_ini(self):
       """
index d48429806a7077943fbe981aab867ca886ae0dba..eeed14105fd01d5a17e8472e39b9c6e9d7a43644 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF definition_cata Accas  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 # Modules Python
 import types
index c1d683c19fd9b026b3bbbbc89029c4a207b19f6f..14419aae87c3948cb8c8ea3e9024fbe4969e000b 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient la classe EFICAS qui est l'application
     proprement dite. Elle est dérivée de la classe APPLI
@@ -17,7 +36,10 @@ from widgets import Fenetre
 
 class EFICAS(appli.APPLI):
 
-  extensions=['readercata','bureau','browser','options']
+  try:
+     from prefs import appli_composants
+  except:
+     appli_composants=['readercata','bureau','browser','options']
 
   def get_texte_infos(self):
      texte=appli.APPLI.get_texte_infos(self)
index 71f4bd09835a1f1946df4b8c55850898549b40cf..3f4df08b35236d725c6e4faf1928ba3c55a438dd 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module permet de lancer l'application EFICAS en affichant
     un ecran Splash pour faire patentier l'utilisateur
index 8caa7ef958219541f6d46e83e50d58f237666ed3..d480fe22f00e7ed5dbbe859bbf3513b9f4f115c0 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
    Ce module sert a afficher le texte du FAQ EFICAS
    et à attendre l'acquittement par l'utilisateur
index 113ec4e4e808353f7fa42101598a924e238a9171..e2b4cf7815802916c2fbaa9d0ab97a939e2bdf25 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 # Modules Python
@@ -46,17 +65,13 @@ class fenetre_mc_inconnus :
        self.frame1.place(relx=0,rely=0,relheight=0.2,relwidth=1)
        self.frame2.place(relx=0,rely=0.2,relheight=0.6,relwidth=1)
        self.frame3.place(relx=0,rely=0.8,relheight=0.2,relwidth=1)
-       self.frame21 = Frame(self.frame2)
-       self.frame22 = Frame(self.frame2)
-       self.frame21.place(relx=0,rely=0,relwidth=0.6,relheight=1)
-       self.frame22.place(relx=0.6,rely=0,relwidth=0.4,relheight=1)
     
     def init_label(self):
        """
        Affichage du label dans la zone concernée
        """
        txt = " Un ou plusieurs mots-clés inconnus ont été trouvés dans le fichier de commandes."
-       txt = txt + "En cliquant sur leur nom, vous pourrez soit corriger l'orthographe soit supprimer ce mot-clé"
+       #txt = txt + "En cliquant sur leur nom, vous pourrez soit corriger l'orthographe soit supprimer ce mot-clé"
        self.fenetre.update_idletasks()
        Label(self.frame1,
              text = txt,
@@ -68,19 +83,24 @@ class fenetre_mc_inconnus :
        """
        Affiche les mots-clés à modifier ou supprimer  
        """
+       i=0
+       self.widgets=[]
        for mc in self.l_mc :
            # mc est une liste :
            # mc contient comme premiers arguments l'étape et éventuellement les blocs, mcfact ...
           # et contient comme 2 derniers éléments le nom du mot-clé et sa valeur
           path_mc = self.get_path(mc[0:-2])
           nom_mc  = mc[-2]
-          Label(self.frame21,text = path_mc).pack(side='left')
-          e = Entry(self.frame22)
-          e.pack(side='left')
+          lab=Label(self.frame2,text = path_mc)
+          lab.grid(row=i,column=1,sticky=W)
+          e = Entry(self.frame2)
+          e.grid(row=i,column=0,sticky=W)
           e.insert(END,nom_mc)
-          e.bind("<Button-1>",lambda event,en=e,m=mc,s=self : s.select_mc(m,en))
-          e.bind("<Return>",lambda e,s=self : s.modifie_mc())
+          #e.bind("<Button-1>",lambda event,en=e,m=mc,s=self : s.select_mc(m,en))
+          #e.bind("<Return>",lambda e,s=self : s.modifie_mc())
           e.configure(relief='flat',state='disabled')
+           self.widgets.append((e,lab))
+           i=i+1
 
     def init_boutons(self):
         """
@@ -100,9 +120,10 @@ class fenetre_mc_inconnus :
        self.b_quit = Button(self.frame3,
                            text = "Fermer",
                            command = self.quit)
-       self.b_mod.place(relx=0.25,rely=0.5,anchor='center')
-       self.b_sup.place(relx=0.50,rely=0.5,anchor='center')
-       self.b_quit.place(relx=0.75,rely=0.5,anchor='center')
+       #self.b_mod.place(relx=0.25,rely=0.5,anchor='center')
+       #self.b_sup.place(relx=0.50,rely=0.5,anchor='center')
+       #self.b_quit.place(relx=0.75,rely=0.5,anchor='center')
+       self.b_quit.place(relx=0.50,rely=0.5,anchor='center')
                            
     def wait_new_list(self):
         """
@@ -120,7 +141,6 @@ class fenetre_mc_inconnus :
        """
        txt = ''
        for o in l_o :
-           print o
           txt = txt + o.nom+'/'
        # on enlève le dernier slash en trop
        txt = txt[0:-1]
@@ -156,6 +176,9 @@ class fenetre_mc_inconnus :
        """
        index = self.l_mc.index(self.mc_courant)
        self.new_l_mc[index] = None
+        e,lab=self.widgets[index]
+        e.grid_remove()
+        lab.grid_remove()
        self.desactive_boutons()
        self.desactive_entry()  
        
index 013f6d2edfb6918a438e0d8c49d7960c101126fc..997e77fe08dde33af66172c85c3fc4d2fe6a3795 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 standard = ("Times",10)
 standard_italique = ("Times",10,'italic')
 standard_gras = ("Times",10,'bold')
index 31f8e2e29f26c995d070799669f91be8721c5d93..e586d5ba47a662ff88dec6b9cc7f2dc3ddf6722f 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module joue le role de cache pour les images stockées
     dans le repertoire ICONDIR
index 1152f1b7f5a3ef020c05da1a804621c0652d9574..4d05e34373b7d77e140bfd4e4165b8c0adb4ea62 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module réalise toutes les mises à jour du chemin pour 
     les imports de modules Python
index d85ab06ae9fa1a5ff29fda315af99b7e63da2d7d..05f591ecefc63e1dde68e4907c0c3a5b7c7bf013 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
    Ce module contient la classe JDCDISPLAY qui réalise l'affichage
    du jeu de commandes sous la forme d'un arbre et de panneaux qui portent
@@ -25,6 +44,7 @@ class JDCDISPLAY:
       self.jdc=jdc
       self.nom_jdc=nom_jdc
       self.fichier=None
+      self.panel_courant=None
 
       if not appli:
          class Appli:
@@ -52,8 +72,8 @@ class JDCDISPLAY:
       self.modified='n'
 
       self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
-      self.pane.add('treebrowser',min=0.5)
-      self.pane.add('selected',min=0.5)
+      self.pane.add('treebrowser',min=0.4,size=0.5)
+      self.pane.add('selected',min=0.4)
       self.pane.pack(expand=1,fill='both')
       self.tree=TREEITEMINCANVAS(jdc,nom_jdc,self.pane.pane('treebrowser'),
                  self.appli,self.select_node)
@@ -78,13 +98,32 @@ class JDCDISPLAY:
          Lance la génération du panneau contextuel de l'objet sélectionné 
          dans l'arbre
       """
+      if self.panel_courant:
+          # On detruit le panneau
+          self.panel_courant.destroy()
+          o=self.panel_courant
+          self.panel_courant=None
+          # Mettre à 1 pour verifier les cycles entre objets
+          # pour les panneaux
+          withCyclops=0
+          if withCyclops:
+             from Misc import Cyclops
+             z = Cyclops.CycleFinder()
+             z.register(o)
+             del o
+             z.find_cycles()
+             z.show_stats()
+             z.show_cycles()
+
+
       if node.item.isactif():
           if hasattr(node.item,"panel"):
-              return node.item.panel(self,self.pane.pane('selected'),node)
+              self.panel_courant=node.item.panel(self,self.pane.pane('selected'),node)
           else:
               raise Exception("Le noeud sélectionné n'a pas de panel associé")
       else:
-          return panels.Panel_Inactif(self,self.pane.pane('selected'),node)
+          self.panel_courant = panels.Panel_Inactif(self,self.pane.pane('selected'),node)
+      return self.panel_courant
 
    def init_modif(self):
       """
@@ -148,7 +187,7 @@ class JDCDISPLAY:
       Ne permet que la copie d'objets de type Commande ou MCF
       """
       objet_a_copier = self.appli.noeud_a_editer.item.get_copie_objet()
-      if objet_a_copier.__class__.__name__ in ('ETAPE','PROC_ETAPE','MACRO_ETAPE'):
+      if objet_a_copier.__class__.__name__ in ('ETAPE','PROC_ETAPE','MACRO_ETAPE','FORM_ETAPE'):
           self.doPaste_Commande(objet_a_copier)
       elif objet_a_copier.__class__.__name__ == "MCFACT":
           self.doPaste_MCF(objet_a_copier)
@@ -159,14 +198,16 @@ class JDCDISPLAY:
 
    def doPaste_Commande(self,objet_a_copier):
       """
-      Réalise la copie de l'objet passé en argument qui est nécessairement une commande
+          Réalise la copie de l'objet passé en argument qui est nécessairement 
+          une commande
       """
       # il faut vérifier que le noeud sélectionné (noeud courant) est bien
       # une commande ou un JDC sinon la copie est impossible ...
       if self.node_selected.item.isCommande() :
           child = self.node_selected.append_brother(objet_a_copier,retour='oui')
       elif self.node_selected.item.isJdc() :
-          child = self.node_selected.append_child(objet_a_copier,retour='oui')
+          child = self.node_selected.append_child(objet_a_copier,pos='first',
+                                                     retour='oui')
       else:
           showinfo("Copie impossible",
                    "Vous ne pouvez coller la commande copiée à ce niveau de l'arborescence !")
@@ -195,10 +236,17 @@ class JDCDISPLAY:
           child = self.node_selected.append_child(objet_a_copier,retour='oui')
       elif self.node_selected.item.isMCList() :
           # le noeud courant est une MCList
-          child = self.node_selected.parent.append_child(objet_a_copier,retour='oui')
+          child = self.node_selected.parent.append_child(objet_a_copier,pos='first',retour='oui')
       elif self.node_selected.item.isMCFact():
           # le noeud courant est un MCFACT
-          child = self.node_selected.parent.append_child(objet_a_copier,retour='oui')
+          if self.node_selected.parent.item.isMCList():
+             # le noeud selectionne est un MCFACT dans une MCList
+             child = self.node_selected.parent.append_child(objet_a_copier,
+                                                            pos=self.node_selected.item,
+                                                            retour='oui')
+          else:
+             # le noeud MCFACT selectionne n'est pas dans une MCList
+             child = self.node_selected.parent.append_child(objet_a_copier,retour='oui')
       else:
           showinfo("Copie impossible",
                    "Vous ne pouvez coller le mot-clé facteur copié à ce niveau de l'arborescence !")
index ad2366e86733ba96bf9993b9241f270d414b7069..89c74406d5e76c032298497e354d8ed1185812c1 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 from Tkinter import Menu
@@ -12,7 +31,10 @@ class MENUBAR:
       self.parent.configure(menu=self.menubar)
       self.init()
 
-   labels= ('Fichier','Edition','Jeu de commandes','Catalogue','Browsers','Options')
+   try:
+      from prefs import labels
+   except:
+      labels= ('Fichier','Edition','Jeu de commandes','Catalogue','Browsers','Options')
 
    def init(self):
       self.menudict={}
@@ -21,11 +43,3 @@ class MENUBAR:
          self.menudict[label]=menu
          self.menubar.add_cascade(label=label,menu=menu)
 
-      #self.optionmenu.add_command(label='Catalogue développeur',command=self.choix_cata_developpeur)
-
-      #self.browsermenu.add_command(label='Browser catalogue',command = self.browser_catalogue)
-      #self.browsermenu.add_command(label='Shell',command = self.shell)
-      #self.browsermenu.add_command(label='Editeur catalogue',command = self.edite_catalogue)
-
-
-
index 0101dd05e78338cc1f0e7cf5fdcde0b8e1183b85..db1d1b6f81cfbc5b375fc6a5b85bf096adabd964 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 # Modules Python
@@ -6,14 +25,17 @@ from tkFileDialog import *
 
 # Modules Eficas
 
+# l'option affichage_commandes peut prendre les valeurs "groupes" ou "alphabetic"
+affichage_commandes="alphabetic"
 
 class OPTIONS:
 
    menu_defs=[
-              ('Options',[
-                           ("Catalogue développeur",'choix_cata_developpeur'),
-                         ]
-              )
+        ('Options',[
+                   ("Affichage commandes",(("alphabétique",'&affichage_alpha'),("groupes",'&affichage_grp'))),
+                   # ("Catalogue développeur",'choix_cata_developpeur'),
+                   ]
+        )
              ]
 
    button_defs=[]
@@ -22,6 +44,14 @@ class OPTIONS:
       self.appli=appli
       self.parent=parent
 
+   def affichage_grp(self):
+      global affichage_commandes
+      affichage_commandes="groupes"
+
+   def affichage_alpha(self):
+      global affichage_commandes
+      affichage_commandes="alphabetic"
+
    def choix_cata_developpeur(self):
       """ 
           Cette méthode demande à l'utilisateur-développeur d'indiquer quel catalogue
index 8338308aeecce7a4acaf109a3f37967a8275ae6c..c442939d20fc3e2ad44bb22efbcd8a2a830cd7f4 100644 (file)
@@ -1,16 +1,32 @@
-#@ MODIF panels Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 import string
 import os
 from Tkinter import *
 import Pmw
+import time
 
 from widgets import ListeChoix
+from widgets import ListeChoixParGroupes
+import prefs
+import options
 
 SEPARATEUR = '-'*30
 
@@ -29,6 +45,32 @@ class Panel(Frame) :
       self.creer_boutons()
       self.init()
 
+  def destroy(self):
+      Frame.destroy(self)
+      self.panneau=None
+      self.parent=None
+      # Because on herite de Frame
+      self.master=None
+      # On supprime explicitement les references aux objets Tk
+      self.nb=None
+      self.fr_but=None
+      self.bouton_cata=None
+      self.bouton_doc=None
+      self.bouton_com=None
+      self.bouton_sup=None
+      self.frame_eval=None
+      self.label=None
+      self.frame_boutons=None
+      self.frame_comment=None
+      self.frame_param=None
+      # On termine la suppression de facon brutale (objets Tk et non Tk)
+      for k in self.__dict__.keys():
+         # il est plus prudent de ne pas détruire le lien sur le Node
+        # si on voulait mettre l'attribut node à None, il faudrait
+        # que tous les appels à node.parent.select() apparaissent après
+        # toutes les autres actions liées au panel (node.item.isglobal(), ...)
+         if k != 'node' : setattr(self,k,None)
+
   def creer_boutons(self):
       """
       Méthode créant les boutons se trouvant dans la partie contextuelle d'EFICAS
@@ -152,7 +194,6 @@ class Panel(Frame) :
       if self.parent.modified == 'n' : self.parent.init_modif()
       pere = self.node.parent
       self.node.delete()
-      pere.select()
       
   def affiche(self):
       """ Force l'affichage des fenêtres en cours """
@@ -164,10 +205,9 @@ class Panel(Frame) :
       texte_infos = ''
       for e in cmd.entites.keys() :
           if e == name :
-              texte_infos=cmd.entites[e].fr
+              texte_infos=getattr(cmd.entites[e],prefs.lang)
               break
       if texte_infos == '' : texte_infos="Pas d'infos disponibles"
-      #EFICAS.affiche_infos(texte_infos)
       self.parent.appli.affiche_infos(texte_infos)
 
   def defMC(self,name):
@@ -182,9 +222,8 @@ class Panel(Frame) :
   def selectCmd(self,name):
       """ On retrouve la commande sous le curseur pour affichage du fr """
       if name != 'COMMENTAIRE' and name != SEPARATEUR:
-          #EFICAS.affiche_infos(self.parent.appli.cataitem.d_fils[name].fr)
-          #self.parent.appli.affiche_infos(self.parent.appli.cataitem.d_fils[name].fr)
-          self.parent.appli.affiche_infos(self.parent.jdc.get_cmd(name).fr)
+          texte_infos=getattr(self.parent.jdc.get_cmd(name),prefs.lang)
+          self.parent.appli.affiche_infos(texte_infos)
           
   def defCmd(self,name):
       """
@@ -280,17 +319,28 @@ class OngletPanel(Panel) :
       but_apres.grid(column = 1,row =3)
       
   def makeCommandePage(self,page):
+      """
+         Cree l'onglet
+      """
       frame1 = Frame(page,height = 20)
       frame1.pack(side='top',fill='x')
       label = Label(frame1,text ="La commande choisie sera ajoutée\n APRES la commande courante")
       label.pack(side='top')
       frame2 = Frame(page)
       frame2.pack(side='top',fill='both',expand=1)
-      liste_cmd = self.get_liste_cmd()
       liste_commandes = (("<Enter>",self.selectCmd),
                          ("<Leave>",self.deselectCmd),
                          ("<Double-Button-1>",self.defCmd))
-      Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes,filtre='oui',titre = "Commandes")
+      if options.affichage_commandes == "alphabetic":
+         liste_cmd = self.get_liste_cmd()
+         Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes,
+                                   filtre='oui',titre = "Commandes")
+      else:
+         liste_groupes=self.node.item.object.niveau.definition.liste_groupes
+         dict_groupes=self.node.item.object.niveau.definition.dict_groupes
+         Liste = ListeChoixParGroupes(self,frame2,liste_groupes,dict_groupes,
+                                      liste_commandes = liste_commandes,
+                                      filtre='oui',titre = "Commandes")
       Liste.affiche_liste()
       # aide associée au panneau
       bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
@@ -301,11 +351,19 @@ class OngletPanel(Panel) :
       """
       Crée la page correspondant à un objet de type JDC
       """
-      liste_cmd = self.get_liste_cmd()
       liste_commandes = (("<Enter>",self.selectCmd),
                          ("<Leave>",self.deselectCmd),
                          ("<Double-Button-1>",self.defCmdFirst))
-      Liste = ListeChoix(self,page,liste_cmd,liste_commandes = liste_commandes,filtre='oui',titre = "Commandes")
+      if options.affichage_commandes == "alphabetic":
+         liste_cmd = self.get_liste_cmd()
+         Liste = ListeChoix(self,page,liste_cmd,liste_commandes = liste_commandes,
+                            filtre='oui',titre = "Commandes")
+      else:
+         liste_groupes=self.node.item.object.niveau.definition.liste_groupes
+         dict_groupes=self.node.item.object.niveau.definition.dict_groupes
+         Liste = ListeChoixParGroupes(self,page,liste_groupes,dict_groupes,
+                                      liste_commandes = liste_commandes,
+                                      filtre='oui',titre = "Commandes")
       Liste.affiche_liste()
        # aide associée au panneau
       bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
index 47667a09bb71911e3851bdb139a94ba91d2cd5fb..1a9f1db3a84c02630fe1ead7673ada20006890f7 100644 (file)
@@ -1,9 +1,29 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module sert à lire un catalogue et à construire
     un objet CataItem pour Eficas.
     Il s'appuie sur la classe READERCATA
 """
 # Modules Python
+import time
 import os,sys,py_compile
 import traceback
 import cPickle
@@ -17,8 +37,11 @@ import fontes
 import analyse_catalogue
 from Noyau.N_CR import CR
 from widgets import Fenetre
+from utils import init_rep_cata_dev
 
 #import catabrowser
+import autre_analyse_cata
+import uiinfo
 
 class READERCATA:
 
@@ -37,12 +60,7 @@ class READERCATA:
       self.code=self.appli.code
       self.appli.format_fichier.set('python')
       self.OpenCata()
-
       self.cataitem=None
-      #XXX CCAR : Pour le moment je ne construis pas le CATAItem
-      #self.cataitem = catabrowser.CATAItem(self,"Catalogue "+self.code,
-                                           #self.cata,
-                                           #objet_cata_ordonne = self.cata_ordonne_dico)
 
    def OpenCata(self):
       """ 
@@ -77,18 +95,35 @@ class READERCATA:
       # détermination de fic_cata_c et fic_cata_p
       self.fic_cata_c = self.fic_cata + 'c'
       self.fic_cata_p = os.path.splitext(self.fic_cata)[0]+'_pickled.py'
+      print "Debut compil cata: ",time.clock()
       # compilation éventuelle du catalogue
       test = self.compile_cata(self.fic_cata,self.fic_cata_c)
+      print "Fin compil cata: ",time.clock()
       if not test : showerror("Compilation catalogue","Impossible de compiler le catalogue %s" %self.fic_cata)
       # import du catalogue
+      print "Debut import_cata: ",time.clock()
       self.cata = self.import_cata(self.fic_cata)
+      print "Fin import_cata: ",time.clock()
       if not self.cata : showerror("Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
+      #
       # analyse du catalogue (ordre des mots-clés)
-      #XXX A priori ceci fait double emploi. Il faut d'abord calculer l'ordre
-      # puis fabriquer le CATAItem
-      #CCAR :self.catalo = catabrowser.CATAItem(self,"Catalogue",self.cata)
-      self.Retrouve_Ordre_Cata_Standard()
+      #
+      print "Debut Retrouve_Ordre: ",time.clock()
+      # Retrouve_Ordre_Cata_Standard fait une analyse textuelle du catalogue
+      # remplacé par Retrouve_Ordre_Cata_Standard_autre qui utilise une numerotation
+      # des mots clés à la création
+      #self.Retrouve_Ordre_Cata_Standard()
+      self.Retrouve_Ordre_Cata_Standard_autre()
+      print "Fin Retrouve_Ordre: ",time.clock()
+      #
+      # analyse des données liées à l'IHM : UIinfo
+      #
+      print "Debut UIinfo: ",time.clock()
+      uiinfo.traite_UIinfo(self.cata)
+      print "Fin UIinfo: ",time.clock()
+      #
       # chargement et analyse des catalogues développeur (le cas échéant)
+      #
       if self.appli.CONFIGURATION.isdeveloppeur == 'OUI' :
           init_rep_cata_dev(self.fic_cata,self.appli.CONFIGURATION.path_cata_dev)
           fic_cata_dev = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
@@ -101,7 +136,8 @@ class READERCATA:
                   self.cata = (self.cata,)
               else:
                   self.cata_dev =self.import_cata(fic_cata_dev)
-                  self.Retrouve_Ordre_Cata_Developpeur()
+                  #self.Retrouve_Ordre_Cata_Developpeur()
+                  self.Retrouve_Ordre_Cata_Developpeur_autre()
                   self.cata = (self.cata,self.cata_dev)
           else:
               self.cata = (self.cata,)
@@ -125,6 +161,15 @@ class READERCATA:
           traceback.print_exc()
           return 0
 
+   def Retrouve_Ordre_Cata_Standard_autre(self):
+      """ 
+          Construit une structure de données dans le catalogue qui permet
+          à EFICAS de retrouver l'ordre des mots-clés dans le texte du catalogue.
+          Pour chaque entité du catlogue on crée une liste de nom ordre_mc qui
+          contient le nom des mots clés dans le bon ordre
+      """ 
+      self.cata_ordonne_dico=autre_analyse_cata.analyse_catalogue(self.cata)
+
    def Retrouve_Ordre_Cata_Standard(self):
       """ 
           Retrouve l'ordre des mots-clés dans le catalogue, cad :
@@ -146,6 +191,37 @@ class READERCATA:
           self.Get_Ordre_Cata(mode='cata')
       self.appli.affiche_infos("Catalogue standard chargé")
 
+   def Retrouve_Ordre_Cata_Developpeur(self):
+      """ 
+          Retrouve l'ordre des mots-clés dans le catalogue, cad :
+          - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
+            l'ordre des mots-clés dans le catalogue
+          - s'il n'a pas été modifié, relie le fichier pickle 
+      """
+      if self.code != 'ASTER' : return
+      fic_cata = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
+      message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
+      splash._splash.configure(text = message,barre='oui')
+      cata_dev_ordonne = analyse_cata.analyse_catalogue(self,self.fic_cata)
+      self.cata_dev_ordonne_cr = cata_dev_ordonne.cr
+      cata_dev_ordonne_dico = cata_dev_ordonne.entites
+      self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
+      self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
+
+   def Retrouve_Ordre_Cata_Developpeur_autre(self):
+      """
+          Retrouve l'ordre des mots-clés dans le catalogue, cad :
+          - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
+            l'ordre des mots-clés dans le catalogue
+          - s'il n'a pas été modifié, relie le fichier pickle
+      """
+      if self.code != 'ASTER' : return
+      message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
+      splash._splash.configure(text = message,barre='oui')
+      cata_dev_ordonne_dico = autre_analyse_cata.analyse_catalogue(self.cata_dev)
+      self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
+      self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
+
    def Get_Ordre_Cata(self,mode='pickle'):
       """ 
           Retrouve l'ordre du catalogue :
@@ -167,7 +243,7 @@ class READERCATA:
           splash._splash.configure(text = "Analyse du catalogue",barre='oui')
           cata_ordonne = analyse_catalogue.analyse_catalogue(self,self.fic_cata)
           self.cata_ordonne_cr = cata_ordonne.cr
-          self.cata_ordonne_dico = cata_ordonne.dico
+          self.cata_ordonne_dico = cata_ordonne.entites
           splash._splash.configure(text = "Sauvegarde des informations sur le catalogue")
           f = open(self.fic_cata_p,'w+')
           p = cPickle.Pickler(f)
@@ -252,7 +328,7 @@ class READERCATA:
       if time1 > time2:
           try:
               # le catalogue doit être recompilé avant d'être importé
-              splash._splash.configure(text="Compilation du catalogue\nCela peut prendre une trentaine de secondes ...")
+              splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
               py_compile.compile(cata)
           except:
               return 0
index c3e5339d185a5cecd8e6476205f6b7739e4fcdac..3002d3759dbd322e9f3ddfee626b526da5c072eb 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module permet de créer, mettre à jour et détruire
     un écran Splash
index 6c0687a1750bf91def8885feb5794fed2cae7469..604025a8bd9dab1558ca1cc35edd3eecf14198af 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 # Modules Python
index e99a56de3109de28f874a400cc4cea0059c27ffc..938d47fab653d275fe75be6e60df594fd527393b 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 # Modules Python
@@ -137,7 +156,7 @@ class TOOLBAR:
       """
       self.fen_infos.destroy()
 
-  def creer_boutons_extension(self,l_boutons,extension):
+  def creer_boutons_appli_composant(self,l_boutons,appli_composant):
       for bouton in l_boutons :
           if not bouton :
               # on veut afficher un bouton vide (=espace entre boutons)
@@ -146,7 +165,7 @@ class TOOLBAR:
                      relief = 'flat').pack(side='left')
               continue
           nom_fic,commande,texte,statut = bouton
-          commande=getattr(extension,commande)
+          commande=getattr(appli_composant,commande)
           b = Button(self.barreboutons,
                      image = images.get_image(nom_fic),
                      command = commande,
index d43992c93be2911d58a8257a08696f9112989869..752a57b77c86dac80d50095a18d06024648d42af 100644 (file)
@@ -1,9 +1,50 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module propose la classe TOOLTIP pour
     mettre en oeuvre les bulles d'aide
 """
 
 import Tkinter
+import types
+
+def destruct(obj):
+    # assist in breaking circular references
+    if obj is not None:
+        assert type(obj) is types.InstanceType
+        for k in obj.__dict__.keys():
+            obj.__dict__[k] = None
+            ##del obj.__dict__[k]
+
+def after(widget, ms, func, *args):
+    timer = apply(widget.after, (ms, func) + args)
+    command = widget._tclCommands[-1]
+    return (timer, command, widget)
+
+def after_cancel(t):
+    if t is not None:
+        t[2].after_cancel(t[0])
+        try:
+            t[2].deletecommand(t[1])
+        except Tkinter.TclError:
+            pass
 
 class TOOLTIP:
     def __init__(self,widget):
@@ -76,3 +117,16 @@ class TOOLTIP:
         self.tooltip.wm_geometry("%+d%+d" % (x, y))
         self.tooltip.wm_deiconify()
 
+if __name__ == "__main__":
+   root=Tkinter.Tk()
+
+   def aide(event):
+      tp=TOOLTIP(root)
+      tp.setText("texte d'aide")
+      tp._showTip()
+
+   label = Tkinter.Label(root, text="coucou")
+   label.bind("<ButtonPress>", aide)
+   label.pack()
+   root.mainloop()
+
index 5ec26438ba59c5c6d55ee64af3c6097b064e2daf..2a1c45acc8697129fcbf3a1d05bb9a6f32353e35 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 # Modules Python
@@ -25,7 +44,7 @@ class TREEITEMINCANVAS:
       self.parent=parent
 
       self.item=Objecttreeitem.make_objecttreeitem(self.appli,self.nom,self.object)
-      self.canvas=Pmw.ScrolledCanvas(self.parent,borderframe=1)
+      self.canvas=Pmw.ScrolledCanvas(self.parent,borderframe=1,canvas_background='gray95')
       self.canvas.pack(padx=10,pady=10,fill = 'both', expand = 1)
       if not sel:
          def sel(event=None):
index a0d6554eacc6172e053c382649c465fd5ada1c63..fe6e4d2847c66c9069eaf398cde5f50fba70e1d3 100644 (file)
@@ -1,11 +1,23 @@
-#@ MODIF treewidget Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
-import os,sys,string,re,types
+import os,sys,string,re,types,traceback
 from Tkinter import *
 
 
@@ -13,8 +25,8 @@ import fontes
 import images
 
 #
-__version__="$Name: V1_1p1 $"
-__Id__="$Id: treewidget.py,v 1.1.1.1 2001/12/04 15:38:23 eficas Exp $"
+__version__="$Name:  $"
+__Id__="$Id: treewidget.py,v 1.6 2002/09/09 10:39:06 eficas Exp $"
 #
 
 Fonte_Standard = fontes.standard
@@ -468,6 +480,7 @@ class Node :
         try:
             self.canvas.addtag_overlapping('move',bbox1[0],self.y +10,bbox1[2],bbox1[3])
         except:
+           print "Erreur dans move :"
             print self
             print self.item
             print self.item.object
@@ -493,6 +506,7 @@ class Node :
             try:
                 child.trace_ligne()
             except:
+               print "Erreur dans trace_ligne :"
                 print child
                 print child.item.object
 
@@ -521,21 +535,23 @@ class Node :
         
     def full_creation(self,name,pos=None):
         """
-        Interface avec ACCAS : création de l'objet de nom name et
-        du noeud associé. Retourne le noeud fils ainsi créé
+            Interface avec ACCAS : création de l'objet de nom name et
+            du noeud associé. Retourne le noeud fils ainsi créé
         """
         item = self.item.additem(name,pos)
         if item == None or item == 0:
             # impossible d'ajouter le noeud de nom : name
             return 0
         nature = item.get_nature()
-        #if nature =="COMMANDE" or nature == "OPERATEUR" or nature == "PROCEDURE":
         if nature in ("COMMANDE","OPERATEUR","PROCEDURE","COMMENTAIRE",
                       "PARAMETRE","COMMANDE_COMMENTARISEE","PARAMETRE_EVAL"):
             # on veut ajouter une commande ou un commentaire ou un paramètre
             # il ne faut pas rechercher un même objet déjà existant
             # à modifier : il faut tester l'attribut 'repetable' 
             enfant = None
+        elif self.item.object.isMCList():
+            # Dans ce cas on ne fait pas de remplacement. On ne cherche pas un objet de meme nom
+            enfant=None
         else :
             enfant = self.get_node_fils(item.get_nom())
         if enfant :
@@ -611,6 +627,9 @@ class Node :
             # on donne la position depuis l'extérieur
             # (appel de append_child par append_brother par exemple)
             index = pos
+        elif type(pos) == types.InstanceType:
+            # pos est un item. Il faut inserer name apres pos
+            index = self.item.get_index(pos) +1
         else :
             if type(name) == types.InstanceType:
                 index = self.item.get_index_child(name.nom)
@@ -676,6 +695,7 @@ class Node :
                 print 'Erreur dans la destruction de ',self.item.get_nom(),' dans delete'
             nbnew = pere.get_nb_children()
         pere.redraw(nbnew-nbold)
+       pere.select()
 
     def copynode(self,node,pos) :
         """ node est le noeud à copier à la position pos de self ( = parent de node) """
@@ -690,15 +710,16 @@ class Node :
             try :
                 child.item.object.mc_liste = objet_copie.mc_liste
             except:
-                pass
+                traceback.print_exc()
     #--------------------------------------------------------------
     # Méthodes de vérification du contexte et de validité du noeud
     #--------------------------------------------------------------
-    def traite_mclist(self):
+    def traite_mclist_OLD(self):
         """ Dans le cas d'une MCList il faut vérifier qu'elle n'est pas vide
             ou réduite à un seul élément suite à une destruction
         """
         # self représente une MCList
+       print "on passe par traite_mclist ",len(self.item)
         if len(self.item) == 0 :
             # la liste est vide : il faut la supprimer
             self.delete()
@@ -709,6 +730,8 @@ class Node :
             noeud = self.children[0]
             if self.parent.delete_child(self):
                 self.parent.append_node_child(noeud.item,pos=index,verif='non')
+            else:
+               print "destruction de self impossible !"
             #if self.parent.delete_child(self):
             #    self.parent.copynode(self.children[0],index)
             #else :
@@ -716,6 +739,26 @@ class Node :
         else :
             return
 
+    def traite_mclist(self):
+        """ Dans le cas d'une MCList il faut vérifier qu'elle n'est pas vide
+            ou réduite à un seul élément suite à une destruction
+        """
+        # self représente une MCList
+        if len(self.item) == 0 :
+            # la liste est vide : il faut la supprimer
+            self.delete()
+        elif len(self.item) == 1:
+            # il ne reste plus qu'un élément dans la liste
+            # il faut supprimer la liste et créer directement l'objet
+            index = self.parent.children.index(self)
+            noeud = self.children[0]
+           noeud.parent = self.parent
+           self.parent.delete_node_child(self)
+            self.parent.item.replace_child(self.item,noeud.item)
+           self.parent.children.insert(index,noeud)
+        else :
+            return
+           
     def verif_all(self):
         self.verif_all_children()
             
diff --git a/Editeur/uiinfo.py b/Editeur/uiinfo.py
new file mode 100644 (file)
index 0000000..d2fa8ba
--- /dev/null
@@ -0,0 +1,113 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+"""
+   Ce module sert à construire les structures de données porteuses 
+   des informations liées aux groupes de commandes
+"""
+import types
+
+class UIINFO:
+   """
+       Pour le moment la classe UIINFO ne sait traiter que des infos
+       portant sur la definition des groupes de commandes
+       Les autres informations sont ignorées
+   """
+   def __init__(self,parent,groupes=None,**args):
+      """
+         Initialiseur de la classe UIINFO.
+         Initialise a partir du dictionnaire UIinfo passé à
+         un objet ENTITE les attributs de la classe
+      """
+      # L'attribut parent stocke le lien vers l'objet ENTITE relié à UIINFO
+      self.parent=parent
+      self.groupes=groupes
+      if groupes == None:
+         # L'entite n'a pas de groupe associé. On lui associe le groupe "DEFAUT"
+         self.groupes=("DEFAUT",)
+      if type(self.groupes) != types.TupleType:
+         self.groupes=(self.groupes,)
+
+def traite_commande(commande,niveau):
+    """
+        Cette fonction cree l'attribut UI de l'objet commande
+        à partir des informations contenues dans UIinfo
+    """
+    uiinfo=commande.UIinfo or {}
+    UI=UIINFO(commande,**uiinfo)
+    commande.UI=UI
+    if "CACHE" in UI.groupes:
+        # La commande est cachee aux utilisateurs
+        #niveau.dict_groupes["CACHE"].append(commande.nom)
+        pass
+    else:
+        # On ajoute la commande dans tous les groupes specifies
+        for grp in UI.groupes:
+            if not niveau.dict_groupes.has_key(grp): niveau.dict_groupes[grp]=[]
+            niveau.dict_groupes[grp].append(commande.nom)
+
+def traite_niveau(niveau):
+   if niveau.l_niveaux == ():
+       # Il n'y a pas de sous niveaux. niveau.entites ne contient que des commandes
+       niveau.dict_groupes={}
+       for oper in niveau.entites:
+           traite_commande(oper,niveau)
+       # A la fin les cles du dictionnaire dict_groupes donnent la liste des groupes
+       # sans doublon
+       niveau.liste_groupes=niveau.dict_groupes.keys()
+       # On ordonne les listes alphabétiquement
+       niveau.liste_groupes.sort()
+       for v in niveau.dict_groupes.values():v.sort()
+       #print niveau.liste_groupes
+       #print niveau.dict_groupes
+   else:
+       for niv in niveau.l_niveaux:
+           traite_niveau(niv)
+
+def traite_UIinfo(cata):
+   """
+      Cette fonction parcourt la liste des commandes d'un catalogue (cata)
+      construit les objets UIINFO à partir de l'attribut UIinfo de la commande
+      et construit la liste complète de tous les groupes présents
+   """
+   #dict_groupes["CACHE"]=[]
+   #XXX Ne doit pas marcher avec les niveaux
+   if cata.JdC.l_niveaux == ():
+       # Il n'y a pas de niveaux
+       # On stocke la liste des groupes et leur contenu dans le JdC
+       # dans les attributs liste_groupes et dict_groupes
+       cata.JdC.dict_groupes={}
+       for commande in cata.JdC.commandes:
+           traite_commande(commande,cata.JdC)
+       # A la fin les cles du dictionnaire dict_groupes donnent la liste des groupes
+       # sans doublon
+       cata.JdC.liste_groupes=cata.JdC.dict_groupes.keys()
+       # On ordonne les listes alphabétiquement
+       cata.JdC.liste_groupes.sort()
+       for v in cata.JdC.dict_groupes.values():v.sort()
+       #print cata.JdC.liste_groupes
+       #print cata.JdC.dict_groupes
+   else:
+       # Le catalogue de commandes contient des définitions de niveau
+       for niv in cata.JdC.l_niveaux:
+          traite_niveau(niv)
+
+
+
+
index 9f09ecd4e4efd31257e0e9adbb5e0abb0c5f62c9..5fe39483c26eb2a1b31899736a2d5f72f90048f7 100644 (file)
@@ -1,7 +1,28 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient des utilitaires divers
 """
-import os
+import os,re
+import glob
+import traceback
 
 def substract_list(liste1,liste2):
   """ 
@@ -69,7 +90,7 @@ def save_in_file(file,text):
   except:
     return 0
 
-def extension(pathAndFile):
+def extension_fichier(pathAndFile):
     """ Return ext if path/filename.ext is given """
     return os.path.splitext(pathAndFile)[1][1:]
 
@@ -77,3 +98,49 @@ def stripPath(pathAndFile):
     """ Return filename.ext if path/filename.ext is given """
     return os.path.split(pathAndFile)[1]
 
+def init_rep_cata_dev(fic_cata,rep_goal):
+  """ 
+      Initialise le répertoire des catalogues développeurs (chemin d'accès donné
+      dans le fichier eficas.ini cad :
+      - le crée s'il n'existe pas encore
+      - copie dedans les 3 fichiers nécessaires :
+          * __init__.py (pour que ce répertoire puisse être interprété comme un package)
+          * entete.py (pour réaliser les import nécessaires à l'interprétation des catalogues)
+          * declaration_concepts.py (idem)
+      - crée le fichier cata_developpeur.py qui sera par la suite importé
+  """
+  try :
+    if not os.path.isdir(rep_goal) :
+      os.mkdir(rep_goal)
+    texte_entete = get_entete_cata(fic_cata)
+    # rep_goal doit contenir les catalogues du développeur sous la forme *.capy
+    # il faut créer le catalogue développeur par concaténation de entete,declaration_concepts
+    # et de tous ces fichiers
+    cur_dir = os.getcwd()
+    os.chdir(rep_goal)
+    l_cata_dev = glob.glob('*.capy')
+    if os.path.isfile('cata_developpeur.py') : os.remove('cata_developpeur.py')
+    if len(l_cata_dev) :
+      # des catalogues développeurs sont effectivement présents : on crée cata_dev.py dans rep_goal
+      str = ''
+      str = str + texte_entete+'\n'
+      for file in l_cata_dev :
+        str = str + open(file,'r').read() +'\n'
+      open('cata_developpeur.py','w+').write(str)
+    os.chdir(cur_dir)
+  except:
+    traceback.print_exc()
+    print "Impossible de transférer les fichiers requis dans :",rep_goal
+
+def get_entete_cata(fic_cata):
+  """ Retrouve l'entete du catalogue """
+  l_lignes = open(fic_cata,'r').readlines()
+  txt = ''
+  flag = 0
+  for ligne in l_lignes :
+    if re.match("# debut entete",ligne) : flag = 1
+    if re.match("# fin entete",ligne) : break
+    if not flag : continue
+    txt = txt + ligne
+  return txt
+
index 5b5d4ea299d7234c3ca40d54e7f7969628d48723..2eefd4b2f9520f6220b91e78bfe4f73b1c9d9d23 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF widgets Editeur  DATE 05/09/2001   AUTEUR DURAND C.DURAND 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 # ----------------------------------------------------------
 #   Cette classe sert à définir les widgets utilisés par
@@ -98,7 +110,8 @@ class Fenetre :
         """ Permet de sauvegarder le texte dans un fichier dont on a demandé le nom
         à l'utilisateur """
         file = asksaveasfilename(defaultextension = '.comm',
-                               initialdir = self.appli.CONFIGURATION.rep_user,
+                               #initialdir = self.appli.CONFIGURATION.rep_user,
+                               initialdir = self.appli.CONFIGURATION.initialdir,
                                title="Sauvegarde du "+self.titre)
         if file != '':
             if not save_in_file(file,self.texte) :
@@ -554,7 +567,8 @@ class ListeChoix :
           elif type(objet) in (types.StringType,types.IntType):
               mot = objet
           elif type(objet) == types.FloatType :
-              mot = repr_float(objet)
+              #mot = repr_float(objet)
+              mot = str(objet)
           else:
               mot=`objet`
           label = Label(self.MCbox,
@@ -806,3 +820,100 @@ class BARRE_K2000(Toplevel):
         
     def quit(self):
         self.quit = 1        
+
+class ListeChoixParGroupes(ListeChoix) :
+    """ 
+        Cette classe est utilisée pour afficher une liste de commandes classées par
+        groupes. L'utilisateur peut réaliser des actions de selection
+        qui déclenchent des actions spécifiées par les bindings contenus dans liste_commandes
+    """
+    def __init__(self,parent,page,liste_groupes,dict_groupes,liste_commandes=[],liste_marques =[],
+                      active ='oui',filtre='non',titre=''):
+        self.parent = parent
+        self.page = page
+        self.liste_groupes = liste_groupes
+        self.dict_groupes = dict_groupes
+        self.dico_labels={}
+        self.selection = None
+        self.liste_commandes = liste_commandes
+        self.liste_marques = liste_marques
+        self.arg_selected=''
+        self.active = active
+        self.titre = titre
+        self.filtre = filtre
+        self.init()
+
+    def affiche_liste(self):
+        """ Affiche la liste dans la fenêtre"""
+        i=0
+        self.MCbox.config(state=NORMAL)
+        self.MCbox.delete(1.0,END)
+        for grp in self.liste_groupes:
+           # On itère sur les groupes
+           if grp == "CACHE":continue
+           liste_commandes=self.dict_groupes[grp]
+           text="GROUPE<<<<<<<< "+grp+" "
+           text=text+">"*max(0,30-len(text))
+           label = Label(self.MCbox,
+                        text = text,
+                        fg = 'black',bg = 'gray95',justify = 'left')
+           # On stocke la relation entre le nom de la commande et le label
+           self.dico_labels[grp]=label
+           self.MCbox.window_create(END,
+                                   window=label,
+                                   stretch = 1)
+           self.MCbox.insert(END,'\n')
+           for cmd in liste_commandes:
+              label = Label(self.MCbox,
+                        text = cmd,
+                        fg = 'black',bg = 'gray95',justify = 'left')
+              # On stocke la relation entre le nom de la commande et le label
+              self.dico_labels[cmd]=label
+              self.MCbox.window_create(END,
+                                   window=label,
+                                   stretch = 1)
+              self.MCbox.insert(END,'\n')
+              if self.active == 'oui':
+                  label.bind(self.liste_commandes[0][0],
+                         lambda e,s=self,c=self.liste_commandes[0][1],x=cmd,l=label : s.selectitem(x,l,c))
+                  label.bind(self.liste_commandes[1][0],
+                         lambda e,s=self,c=self.liste_commandes[1][1],x=cmd,l=label : s.deselectitem(l,x,c))
+                  label.bind(self.liste_commandes[2][0],
+                         lambda e,s=self,c=self.liste_commandes[2][1],x=cmd,l=label : s.chooseitem(x,l,c))
+              # On marque les items specifies dans liste_marques
+              #if i in self.liste_marques : self.markitem(label)
+              i=i+1
+        self.MCbox.config(state=DISABLED)
+        self.selection = None
+
+    def entry_changed(self,event=None):
+        """ 
+            Cette méthode est invoquée chaque fois que l'utilisateur modifie le contenu
+            de l'entry et frappe <Return>
+        """
+        if self.arg_selected != '' : self.deselectitem(self.dico_labels[self.arg_selected])
+        filtre = self.entry.get()+"*"
+        FILTRE = string.upper(filtre)
+        #
+        # On cherche d'abord dans les noms de groupe
+        # puis dans les noms de commande groupe par groupe
+        #
+        for grp in self.liste_groupes:
+            if fnmatch.fnmatch(grp,filtre) or fnmatch.fnmatch(grp,FILTRE) :
+                index = self.MCbox.index(self.dico_labels[grp])
+                self.MCbox.see(index)
+                # On ne selectionne pas le groupe
+                #self.arg_selected = grp
+                # On a trouve un groupe on arrete la recherche
+                return
+
+        for grp in self.liste_groupes:
+           for cmd in self.dict_groupes[grp] :
+              if fnmatch.fnmatch(cmd,filtre) or fnmatch.fnmatch(cmd,FILTRE) :
+                 self.highlightitem(self.dico_labels[cmd])
+                 index = self.MCbox.index(self.dico_labels[cmd])
+                 self.MCbox.see(index)
+                 self.arg_selected = cmd
+                 # On a trouve une commande  on arrete la recherche
+                 return
+
index 01553ea1adc671741f028e3bebd9748244cad2fc..62a3baceaea464f19a19e4b0f8275bbec4242d37 100644 (file)
@@ -2,3 +2,5 @@ Ce r
 dans des sous-répertoires de nom exNNN où NNN est le numéro
 de l'exemple
 
+ex18 :
+  Cet exemple test met en oeuvre le convertisseur asterV5
index 08352a34858e1f7a9db7e7e52bb0e4adea461970..942472b588d0b31a13c0447d463c8b19a04013f0 100644 (file)
@@ -28,6 +28,16 @@ class concept:
       """ Retourne 1 si sd est du bon type par rapport à la classe """
       return 0
 
+class cata:
+   def __init__(self):
+      CONTEXT.unset_current_cata()
+      CONTEXT.set_current_cata(self)
+
+   def enregistre(self,commande):
+      return
+
+c=cata()
+
 OP1 = OPER(nom='OP1',op=1,sd_prod=concept,reentrant='f',
            a=SIMP(typ='I'),
            c=SIMP(typ='I',position='global'),
index 3e8f1fa0672cad4a853d6fe31e2c9b5423ac1aeb..43097feea984234709907e0a6b78a1d7e19660d7 100644 (file)
@@ -5,7 +5,8 @@ sys.path[:0]=['../..','../../..']
 import convert
 
 p=convert.plugins['asterv5']()
-p.readfile('totalmod.comm')
+p.readfile('torsion.comm')
+#p.readfile('totalmod.comm')
 if not p.cr.estvide():
    print p.cr
    sys.exit(0)
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..427090e66888b37840b3c0fa9f2f9ff6792ca7c4 100644 (file)
@@ -0,0 +1,19 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
index 68bd102d9c075aefa5f569fcc16be80ed98a9661..28b91a3be0f8d8a5d48a29b750cc765aeb7aea73 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF commande_comm Accas  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 import os,traceback,string
 
@@ -30,6 +42,7 @@ class COMMANDE_COMM:
         self.definition=self
         self.nom = ''
         self.niveau = self.parent.niveau
+        self.actif=1
         #self.appel = N_utils.callee_where(niveau=2)
         if reg=='oui' : self.register()
             
@@ -216,3 +229,19 @@ class COMMANDE_COMM:
       """
       return []
 
+    def reparent(self,parent):
+      """
+          Cette methode sert a reinitialiser la parente de l'objet
+      """
+      self.parent=parent
+      self.jdc=parent.get_jdc_root()
+      self.etape=self
+
+    def verif_existence_sd(self):
+      """
+         Vérifie que les structures de données utilisées dans self existent bien dans le contexte
+        avant étape, sinon enlève la référence à ces concepts
+        --> sans objet pour les commandes commentarisées
+      """
+      pass
+       
index 733a20164431d0cb432afd1d93df6c62ee9aa67c..993fda4331b8e6c84e2a19ace6fe877411514b45 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
    Ce module contient la classe COMMENTAIRE qui sert dans EFICAS
    pour gérer les commentaires dans un JDC
@@ -145,5 +164,18 @@ class COMMENTAIRE :
     """
     return []
 
+  def get_sdprods(self,nom_sd):
+     """
+         Retourne les concepts produits par la commande
+     """
+     return None
 
+  def verif_existence_sd(self):
+     pass
+
+  def get_fr(self):
+    """
+    Retourne le commentaire lui meme tronque a la 1ere ligne
+    """
+    return self.valeur.split('\n',1)[0]
 
index 31c7c20a3a2a9682790d94ca158fb60fffcdcf2d..675fb6b83b3db9b86e99c0c9a2cd88a5dd9de06f 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient la classe ETAPE_NIVEAU qui sert à 
     concrétiser les niveaux au sein d'un JDC
@@ -5,6 +24,7 @@
 import traceback
 
 from Noyau import N_OBJECT
+import prefs
 
 class ETAPE_NIVEAU(N_OBJECT.OBJECT):
 
@@ -109,3 +129,12 @@ class ETAPE_NIVEAU(N_OBJECT.OBJECT):
     self.jdc.suppentite(etape)
 
 
+  def get_fr(self):
+     """
+        Retourne le texte d'aide dans la langue choisie
+     """
+     try :
+        return getattr(self.definition,prefs.lang)
+     except:
+        return ''
+
index 7e2dbdf9086ce918c43c4d7475239a4b27b60ecb..4d1b93d4cc7a1e854b991afeaafd012811bab0d4 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF interpreteur_formule Accas  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 import string,re,sys,exceptions,types
 
@@ -145,6 +157,8 @@ class Interpreteur_Formule:
             texte = [texte,]
         for text_arg in texte:
             text_arg = string.replace(text_arg,'\n','')
+            # Enleve les espaces
+            text_arg = string.replace(text_arg,' ','')
             try:
                 self.l_operateurs.append(self.split_operateurs(text_arg))
             except InterpreteurException,e:
index 8b7cdf29f5d1ea9710daa111566b85a8a2f87785..313ec0434913f8b326beae0260ca9e992d0cc2ba 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
    Ce module contient la classe mixin qui porte les méthodes
    pour traiter les niveaux au sein d'un JDC
index da997b6d90d6bb32ddf928c4aa311c694f3e44cf..310c981de6881889473491699a25d8f7ec656d26 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 # Modules Python
@@ -32,6 +51,7 @@ class MCNUPLET(V_MCCOMPO.MCCOMPO,N_MCCOMPO.MCCOMPO):
          self.niveau = None
          self.etape = None
       self.state = 'undetermined'
+      self.actif=1
       self.mc_liste=self.build_mc()
 
    def build_mc(self):
@@ -57,6 +77,8 @@ class MCNUPLET(V_MCCOMPO.MCCOMPO,N_MCCOMPO.MCCOMPO):
           #XXX et global_jdc ??
         mc_liste.append(objet)
         k=k+1
+      # Un nuplet n'a pas de mots inconnus
+      self.reste_val={}
       return mc_liste
 
    def isvalid(self,cr='non'):
@@ -168,5 +190,14 @@ class MCNUPLET(V_MCCOMPO.MCCOMPO,N_MCCOMPO.MCCOMPO):
    def isoblig(self):
       return self.definition.statut=='o'
 
+   def get_fr(self):
+     """
+        Retourne le texte d'aide dans la langue choisie
+     """
+     try :
+        return getattr(self.definition,prefs.lang)
+     except:
+        return ''
+
 
 
index b5df8fdfe8026c1e2619d6d91aa5f486dd9547ea..8b6f0822793f04668d79b281a1fe6be97039b8a1 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient la classe NIVEAU qui sert à définir
     des groupes de commandes dans le catalogue
index 63da3689ce905b89c39ddf5bee9293224573440f..f5208fb37ad424552516beba8b3bf23b24c9251c 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient la classe de définition pour les nuplets NUPL
 """
@@ -6,9 +25,10 @@ import types
 
 # Modules Eficas
 from Noyau import N_ENTITE,N_MCLIST,N_CR
+from Ihm import I_ENTITE
 import mcnuplet
 
-class NUPL(N_ENTITE.ENTITE):
+class NUPL(N_ENTITE.ENTITE,I_ENTITE.ENTITE):
    """
    """
    class_instance = mcnuplet.MCNUPLET
@@ -19,6 +39,7 @@ class NUPL(N_ENTITE.ENTITE):
    def __init__(self,fr="",ang="",docu="",statut='f',defaut=None,min=0,max=1,
                     elements=None):
       N_ENTITE.ENTITE.__init__(self)
+      I_ENTITE.ENTITE.__init__(self)
       self.fr=fr
       self.ang=ang
       self.docu=docu
index 94f028f09670863b254bb4911f10d44f58913010..20455bfe99009452b5b84bf32eff742d7697829d 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient la classe PARAMETRE qui sert à définir
     des objets paramètres qui sont compréhensibles et donc affichables
@@ -33,6 +52,7 @@ class PARAMETRE :
     self.definition=self
     self.jdc = self.parent = CONTEXT.get_current_step()
     self.niveau=self.parent.niveau
+    self.actif=1
     self.register()
 
   def interprete_valeur(self,val):
@@ -249,7 +269,8 @@ class PARAMETRE :
     """
     return []
 
-
+  def verif_existence_sd(self):
+     pass
 
 
 
index 73bf9bd6189b872f4b07b7f3b6d9b42064b97278..b45546d90f8db2455eff47e23d96bf5e2399ce5a 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 Ce module contient la classe PARAMETRE_EVAL qui sert à définir
 des objets paramètres qui sont compréhensibles et donc affichables
@@ -36,6 +55,7 @@ class PARAMETRE_EVAL(parametre.PARAMETRE) :
     self.jdc = self.parent = CONTEXT.get_current_step()
     self.definition=self
     self.niveau = self.parent.niveau
+    self.actif=1
     # Ceci est-il indispensable ???
     #self.appel = N_utils.callee_where(niveau=2)
     self.register()
@@ -60,6 +80,8 @@ class PARAMETRE_EVAL(parametre.PARAMETRE) :
     """
     if not val : return None
     d={}
+    val = string.strip(val)
+    if val[-1] == ';' : val = val[0:-1]
     d['EVAL'] = Accas.EVAL
     try:
         valeur = eval(val,{},d)
index 659027d201ab78ba43d9122a9a281f5db168cb86..378500c07a493627f9010d52a17fe123908f1871 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient le chargeur dynamique de plugins (emprunté à HappyDoc)
 """
diff --git a/Ihm/I_ASSD.py b/Ihm/I_ASSD.py
new file mode 100644 (file)
index 0000000..004d0b8
--- /dev/null
@@ -0,0 +1,23 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
+class ASSD:
+   def __repr__(self):
+      return "concept %s de type %s" % (self.get_name(),self.__class__.__name__)
index 16853f5f7475b671f56588f4961d62be75b4ab36..e1f19ca54b5e4a2da6a8ae98c80bc7f52e97dbc2 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 
index 3a070e1ce065f00f0caa325240ed065373cec56d..11add723af8190aecabfdbc84bfadf2defe78f28 100644 (file)
@@ -1,4 +1,37 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+_no=0
+
+def number_entite(entite):
+   """
+      Fonction qui attribue un numero unique a tous les objets du catalogue
+      Ce numero permet de conserver l'ordre des objets
+   """
+   global _no
+   _no=_no+1
+   entite._no=_no
+
 class ENTITE:
+  def __init__(self):
+     number_entite(self)
+    
   def get_docu(self):
     if hasattr(self,'docu') :
       if self.docu != "" : return self.docu
index 8937c11075bb2ada199d240c0f0bc11f03c87c29..33a517b78a9fd85dc5d35bbdeb96b75f72f9b215 100644 (file)
@@ -1,29 +1,43 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 # Modules Python
 import string,types
 from copy import copy
 
+# import rajoutés suite à l'ajout de Build_sd --> à résorber
+import traceback
+import Noyau
+from Noyau import N_Exception
+from Noyau.N_Exception import AsException
+# fin import à résorber
+
 # Modules EFICAS
 import I_MCCOMPO
 
 class ETAPE(I_MCCOMPO.MCCOMPO):
 
-   def __init__(self):
-      self.niveau=self.jdc
-
    def ident(self):
       return self.nom
 
-   def get_fr(self):
-      """ 
-         Retourne l'attribut fr de self.definition 
-      """
-      try:
-         return self.definition.fr
-      except:
-         return ''
-
    def get_sdname(self):
       if CONTEXT.debug : print "SDNAME ",self.reuse,self.sd,self.sd.get_name()
       if self.reuse != None:
@@ -63,7 +77,8 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
       """
       if self.isvalid() :
          if type(self.definition.op_init) == types.FunctionType :
-            apply(self.definition.op_init,(self,self.master.g_context))   
+            # XXX Normalement en mode editeur g_context ne peut pas etre utilisé
+            apply(self.definition.op_init,(self,self.parent.g_context))   
       self.state = 'modified'
     
    def nomme_sd(self,nom) :
@@ -79,59 +94,87 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
       if len(nom) > 8 and self.jdc.definition.code == 'ASTER':
         return 0,"Nom de concept trop long (maxi 8 caractères)"
       self.init_modif()
-      # Cas particulier des opérateurs réentrants
       if not self.isvalid(sd='non') : return 0,"Nommage du concept refusé : l'opérateur n'est pas valide"
+      #
+      # Cas particulier des opérateurs obligatoirement réentrants
+      #
       if self.definition.reentrant == 'o':
-        self.sd = self.reuse = self.jdc.get_sdprod(nom)
+        # FR : appel à get_sdprod incorrect : il faut appeler get_sd_avant_etape
+        #self.sd = self.reuse = self.jdc.get_sdprod(nom)
+       self.sd = self.reuse = self.jdc.get_sd_avant_etape(nom,self)
         if self.sd != None :
+          self.sdnom=self.sd.nom
           return 1,"Concept existant"
         else:
           return 0,"Opérateur réentrant mais concept non existant"
+      #
+      # Cas particulier des opérateurs facultativement réentrants
+      #
+      old_reuse=None
       if self.definition.reentrant == 'f' :
         sd = self.jdc.get_sd_avant_etape(nom,self)
         if sd != None :
-          self.sd = self.reuse = sd
-          return 1,"Opérateur facultativement réentrant et concept existant trouvé"
+         # FR : il faut tester que la sd trouvée est du bon type !!!!!!!!!!!!!!!!!
+         if isinstance(sd,self.get_type_produit()) :
+             self.sd = self.reuse = sd
+             self.sdnom = sd.nom
+             return 1,"Opérateur facultativement réentrant et concept existant trouvé"
+         else:
+            return 0,"Concept déjà existant et de mauvais type"
         else :
-          # il faut éventuellement enlever le lien vers une SD existante car si on passe ici
+          # il faut enlever le lien vers une SD existante car si on passe ici
          # cela signifie que l'opérateur n'est pas utilisé en mode réentrant.
-         # Si on ne fait pas cela, le nom de l'opérateur réutilisé est aussi modifié
-         # et on ne peut plus modifier la SD de l'opérateur
+         # Si on ne fait pas cela, on risque de modifier une SD produite par un autre opérateur
          if self.reuse :
-            self.sd = self.reuse = None
-      # l'opérateur n'est pas réentrant ou facultativement reentrant mais pas dans ce cas
+             old_reuse=self.reuse
+            self.sd = self.reuse = self.sdnom = None
+      #
+      # On est dans le cas ou l'opérateur n'est pas réentrant ou est facultativement reentrant
+      # mais est utilisé en mode non réentrant
+      #
       if self.sd == None :
           if self.parent.get_sd_autour_etape(nom,self):
+            # Un concept de ce nom existe dans le voisinage de l'etape courante
             # On force self.valid a 0 car l appel a isvalid precedent l a mis a 1
             # mais ceci indique seulement une validité partielle
             # isvalid ne devrait peut etre pas mettre l attribut valid à 1 si sd == 'non'
             self.valid=0
-            return 0,"Nommage du concept refuse : un concept de meme nom existe deja"
-          # Il n'existe pas de sd de nom sdnom. On peut donc créer le concept retourné.
-          # Il est créé sans nom mais enregistré dans la liste des concepts existants
-          self.get_sd_prod()
-          self.sd.nom = nom
-          return 1,"Nommage du concept effectué"
-      else :
-        old_nom=self.sd.nom
-        if string.find(old_nom,'sansnom') :
-           # Dans le cas où old_nom == sansnom, isvalid retourne 0 alors que ...
-          # par contre si le concept existe et qu'il s'appelle sansnom c'est que l'étape est valide
-          # on peut donc le nommer sans test préalable
-          self.sd.nom=nom
-           return 1,"Nommage du concept effectué"
-        if self.isvalid() :
-          # Normalement l appel de isvalid a mis a jour le concept produit (son type)
-          # Il suffit de spécifier l attribut nom de sd pour le nommer si le nom n est pas
-          # deja attribué
-          if self.parent.get_sd_autour_etape(nom,self):
+            # On retablit l'ancien concept reentrant s'il existait
+            if old_reuse:
+               self.sd=self.reuse=old_reuse
+               self.sdnom=old_reuse.nom
             return 0,"Nommage du concept refuse : un concept de meme nom existe deja"
           else:
-            self.sd.nom=nom
+            # Il n'existe pas de concept de ce nom dans le voisinage de l'etape courante
+            # On peut donc créer le concept retourné.
+            # Il est créé sans nom mais enregistré dans la liste des concepts existants
+            self.get_sd_prod()
+            # Il suffit de changer son attribut nom pour le nommer
+            self.sd.nom = nom
+            self.sdnom=nom
             return 1,"Nommage du concept effectué"
-        else:
-          # Normalement on ne devrait pas passer ici
-          return 0,'Normalement on ne devrait pas passer ici'
+      else :
+          old_nom=self.sd.nom
+          if string.find(old_nom,'sansnom') :
+            # Dans le cas où old_nom == sansnom, isvalid retourne 0 alors que ...
+           # par contre si le concept existe et qu'il s'appelle sansnom c'est que l'étape est valide
+           # on peut donc le nommer sans test préalable
+           self.sd.nom=nom
+            self.sdnom=nom
+            return 1,"Nommage du concept effectué"
+          if self.isvalid() :
+            # Normalement l appel de isvalid a mis a jour le concept produit (son type)
+            # Il suffit de spécifier l attribut nom de sd pour le nommer si le nom n est pas
+            # deja attribué
+            if self.parent.get_sd_autour_etape(nom,self):
+              return 0,"Nommage du concept refuse : un concept de meme nom existe deja"
+            else:
+              self.sd.nom=nom
+              self.sdnom=nom
+              return 1,"Nommage du concept effectué"
+          else:
+            # Normalement on ne devrait pas passer ici
+            return 0,'Normalement on ne devrait pas passer ici'
 
    def get_sdprods(self,nom_sd):
       """ 
@@ -206,6 +249,7 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
          Initialise les attributs jdc, id, niveau et réalise les
          enregistrements nécessaires
          Pour EFICAS, on tient compte des niveaux
+         Surcharge la methode make_register du package Noyau
       """
       if self.parent :
          self.jdc = self.parent.get_jdc_root()
@@ -234,9 +278,11 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
       etape.state = 'modified'
       etape.reuse = None
       etape.sdnom = None
+      etape.etape=etape
       etape.mc_liste=[]
       for objet in self.mc_liste:
         new_obj = objet.copy()
+        new_obj.reparent(etape)
         etape.mc_liste.append(new_obj)
       return etape
 
@@ -270,3 +316,104 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
         l.extend(child.get_sd_utilisees())
       return l
 
+   def get_genealogie(self):
+      """ 
+          Retourne la liste des noms des ascendants de l'objet self
+          en s'arretant à la première ETAPE rencontrée
+      """
+      return [self.nom]
+
+   def reparent(self,parent):
+     """
+         Cette methode sert a reinitialiser la parente de l'objet
+     """
+     self.parent=parent
+     self.jdc=parent.get_jdc_root()
+     self.etape=self
+     for mocle in self.mc_liste:
+        mocle.reparent(self)
+
+   def verif_existence_sd(self):
+     """
+        Vérifie que les structures de données utilisées dans self existent bien dans le contexte
+       avant étape, sinon enlève la référence à ces concepts
+     """
+     for motcle in self.mc_liste :
+         motcle.verif_existence_sd()
+     
+   def Build_sd(self,nom):
+      """
+         Construit le concept produit de l'opérateur. Deux cas 
+         peuvent se présenter :
+        
+         - le parent n'est pas défini. Dans ce cas, l'étape prend en charge la création 
+           et le nommage du concept.
+
+         - le parent est défini. Dans ce cas, l'étape demande au parent la création et 
+           le nommage du concept.
+
+      """
+      if not self.isactif():return
+      # FR : attention cette méthode ne devrait pas se trouver là car elle surcharge celle qui 
+      # se trouve dans N_ETAPE.py et elle est partie intégrante du noyau, mais, suite à l'absence de 
+      # test de validité de l'opérateur avant d'essayer de déterminer la sd produite, on n'arrivait
+      # pas à relire avec EFICAS un fichier contenant une étape encore incomplète du style :
+      #  sansnom = AFFE_CHAR_CINE(MODELE=None)
+      # Suite à la stabilisation du noyau d'Aster, je n'ai pas eu d'autre solution que de surcharger
+      # cette méthode ici en rajoutant le test manquant ...
+      # CCAR : cette modification ne corrige le probleme qu'en partie. Il faudrait probablement
+      # supprimer les erreurs fatales (exception ) et retourner systematiquement un objet produit
+      # meme en cas d'erreur et reporter l'emission du message d'erreur a la phase de validation
+      if not self.isvalid(sd='non') : return
+      else:self.state='undetermined'
+      self.sdnom=nom
+      try:
+         if self.parent:
+            sd= self.parent.create_sdprod(self,nom)
+            if type(self.definition.op_init) == types.FunctionType: 
+               apply(self.definition.op_init,(self,self.parent.g_context))
+         else:
+            sd=self.get_sd_prod()
+            # On n'utilise pas self.definition.op_init car self.parent 
+            # n'existe pas
+            if sd != None and self.reuse == None:
+               # On ne nomme le concept que dans le cas de non reutilisation 
+               # d un concept
+               sd.nom=nom
+         if self.jdc and self.jdc.par_lot == "NON" :
+            self.Execute()
+         return sd
+      except AsException,e:
+         raise AsException("Etape ",self.nom,'ligne : ',self.appel[0],
+                              'fichier : ',self.appel[1],e)
+      except EOFError:
+         # XXX Normalement le contexte courant doit etre le parent.
+         # Il n'y a pas de raison de remettre le contexte au parent
+         #self.reset_current_step()
+         raise
+      except :
+         l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
+         raise AsException("Etape ",self.nom,'ligne : ',self.appel[0],
+                           'fichier : ',self.appel[1]+'\n',
+                            string.join(l))
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+        
+     
index e53ead8e682fad7c0774c8f9a8f7680760426256..844d61f0736abd8f7226162618eae4662735331c 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 
@@ -13,7 +32,8 @@ class EXCLUS(I_REGLE.REGLE):
      if not regle_active : return liste_a_purger
 
      for mc in self.mcs:
-        if mc in liste_a_purger:
+        # Il ne faut pas purger un mot cle present. Sa cardinalite est verifiee par ailleurs
+        if mc in liste_a_purger and mc not in liste_mc_presents:
            liste_a_purger.remove(mc)
      return liste_a_purger
 
diff --git a/Ihm/I_FONCTION.py b/Ihm/I_FONCTION.py
new file mode 100644 (file)
index 0000000..b708dee
--- /dev/null
@@ -0,0 +1,41 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+from I_ASSD import ASSD
+
+class FONCTION(ASSD):
+  def __init__(self,etape=None,sd=None,reg='oui'):
+    #ASSD.__init__(self,etape=etape,sd=sd,reg=reg)
+    if reg=='oui':
+      self.jdc.register_fonction(self)
+
+  def get_formule(self):
+    """
+    Retourne une formule décrivant self sous la forme d'un tuple :
+    (nom,type_retourne,arguments,corps)
+    """
+    if hasattr(self.etape,'get_formule'):
+      # on est dans le cas d'une formule Aster
+      return self.etape.get_formule()
+    else:
+      # on est dans le cas d'une fonction
+      return (self.nom,'REEL','(REEL:x)','''bidon''')
+
+class fonction(FONCTION) : pass
+
index 51100165d7c079f0a968678c5125bc582ab4dea1..80689be47b094e2a2a9f7cb867c448fded02386b 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 import string,traceback
@@ -56,6 +75,15 @@ class FORM_ETAPE(MACRO_ETAPE):
         else:
             return ''
 
+    def get_formule(self):
+        """
+        Retourne un tuple décrivant la formule :
+        (nom,type_retourne,arguments,corps)
+        """
+        t,a,c = self.analyse_formule()
+        n = self.get_nom()
+        return (n,t,a,c)
+
     def verif_arguments(self,arguments = None):
         """
         Vérifie si les arguments passés en argument (si aucun prend les arguments courants)
index 2c26ab8e653adb28a2595a0b9ac955ee3a1bfeac..125fb617ae512bee9e742dffefc287744122cf89 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 # Modules Python
@@ -6,9 +25,8 @@ import string,linecache
 
 # Modules Eficas
 import I_OBJECT
-from Noyau.N_ASSD import assd
+from Noyau.N_ASSD import ASSD
 from Noyau.N_ETAPE import ETAPE
-from Noyau.N_CO import CO
 from Noyau.N_Exception import AsException
 from Extensions import commentaire,parametre,parametre_eval
 
@@ -21,6 +39,7 @@ class JDC(I_OBJECT.OBJECT):
       self.niveau=self
       self.params=[]
       self.fonctions=[]
+      self._etape_context=None
 
    def get_cmd(self,nomcmd):
       """
@@ -38,20 +57,32 @@ class JDC(I_OBJECT.OBJECT):
       l=[]
       for k,v in d.items():
         if type(v) != types.InstanceType : continue
-        if assd in types_permis or CO in types_permis :
-          l.append(k)
-          continue
-        for type_ok in types_permis:
-          if type_ok in ('R','I','C','TXM') and v in self.params : l.append(k)
-          elif type_ok == 'R' and v.__class__.__name__ == 'reel' : l.append(k)
-          elif type_ok == 'I' and v.__class__.__name__ == 'entier' : l.append(k)
-          elif type_ok == 'C' and v.__class__.__name__ == 'complexe' : l.append(k)
-          elif type_ok == 'TXM' and v.__class__.__name__ == 'chaine' : l.append(k)
-          elif type(type_ok) != types.ClassType : continue
-          elif v.__class__ == type_ok or issubclass(v.__class__,type_ok): l.append(k)
+        # On considère que seul assd indique un type quelconque pas CO
+        elif self.assd in types_permis :
+           l.append(k)
+        elif self.est_permis(v,types_permis):
+           l.append(k)
       l.sort()
       return l
 
+   def est_permis(self,v,types_permis):
+      for type_ok in types_permis:
+          if type_ok in ('R','I','C','TXM') and v in self.params : 
+             return 1
+          elif type_ok == 'R' and v.__class__.__name__ == 'reel' : 
+             return 1
+          elif type_ok == 'I' and v.__class__.__name__ == 'entier' : 
+             return 1
+          elif type_ok == 'C' and v.__class__.__name__ == 'complexe' : 
+             return 1
+          elif type_ok == 'TXM' and v.__class__.__name__ == 'chaine' : 
+             return 1
+          elif type(type_ok) != types.ClassType : 
+             continue
+          elif v.__class__ == type_ok or issubclass(v.__class__,type_ok):
+             return 1
+      return 0
+
    def addentite(self,name,pos):
       """
           Ajoute une entite :
@@ -83,6 +114,7 @@ class JDC(I_OBJECT.OBJECT):
         if pos == None : pos = 0
         self.etapes.insert(pos,objet)
         self.editmode=0
+        self.reset_context()
         self.active_etapes()
         return objet
       elif name == "PARAMETRE_EVAL":
@@ -93,6 +125,7 @@ class JDC(I_OBJECT.OBJECT):
         if pos == None : pos = 0
         self.etapes.insert(pos,objet)
         self.editmode=0
+        self.reset_context()
         self.active_etapes()
         return objet
       elif type(name)==types.InstanceType:
@@ -100,10 +133,8 @@ class JDC(I_OBJECT.OBJECT):
         # existante (par copie donc)
         # on est donc nécessairement en mode editeur ...
         objet = name
-        objet.jdc = objet.parent = self
-        #XXX current_step n'existe plus. A priori le parent devrait etre self
-        # ainsi que le step courant.
-        #objet.parent = self.current_step
+        # Il ne faut pas oublier de reaffecter le parent d'obj (si copie)
+        objet.reparent(self)
         self.set_current_step()
         if isinstance(objet,ETAPE):
           if objet.nom_niveau_definition == 'JDC':
@@ -115,8 +146,12 @@ class JDC(I_OBJECT.OBJECT):
             objet.parent.dict_niveaux[objet.nom_niveau_definition].register(objet)
             objet.niveau = objet.parent.dict_niveaux[objet.nom_niveau_definition]
         self.etapes.insert(pos,objet)
+       # il faut vérifier que les concepts utilisés par objet existent bien
+       # à ce niveau d'arborescence
+       objet.verif_existence_sd()
         self.active_etapes()
         self.editmode=0
+        self.reset_context()
         return objet
       else :
         # On veut ajouter une nouvelle commande
@@ -125,11 +160,13 @@ class JDC(I_OBJECT.OBJECT):
           cmd=self.get_cmd(name)
           # L'appel a make_objet n'a pas pour effet d'enregistrer l'étape
           # auprès du step courant car editmode vaut 1
+          # Par contre elle a le bon parent grace a set_current_step
           e=cmd.make_objet()
           if pos == None : pos = 0
           self.etapes.insert(pos,e)
           self.reset_current_step()
           self.editmode=0
+          self.reset_context()
           self.active_etapes()
           return e
         except:
@@ -151,13 +188,15 @@ 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(self,nom_sd,etape):
+   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)
-      for e in self.etapes[ietap+1:]:
+      if avec == 'non':ietap=ietap+1
+      for e in self.etapes[ietap:]:
         sd=e.get_sdprods(nom_sd)
         if sd:
           if hasattr(e,'reuse'):
@@ -165,16 +204,17 @@ class JDC(I_OBJECT.OBJECT):
               return sd
       return None
 
-   def get_sd_autour_etape(self,nom_sd,etape):
+   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
            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
       """
       sd=self.get_sd_avant_etape(nom_sd,etape)
       if sd:return sd
-      return self.get_sd_apres_etape(nom_sd,etape)
+      return self.get_sd_apres_etape(nom_sd,etape,avec)
 
    def active_etapes(self):
       """
@@ -267,6 +307,12 @@ class JDC(I_OBJECT.OBJECT):
       """
       self.params.append(param)
 
+   def register_fonction(self,fonction):
+      """
+          Cette méthode sert à ajouter une fonction dans la liste des fonctions
+      """
+      self.fonctions.append(fonction)
+
    def delete_param(self,param):
       """
           Supprime le paramètre param de la liste des paramètres
@@ -297,6 +343,14 @@ class JDC(I_OBJECT.OBJECT):
         nom = form.nom
         if not nom : continue
         if d.has_key(nom): l_fonctions.append(form.get_formule())
+
+      # on ajoute les concepts produits par DEFI_VALEUR
+      # XXX On pourrait peut etre faire plutot le test sur le type
+      # de concept : entier, reel, complexe, etc.
+      for k,v in d.items():
+         if hasattr(v,'etape') and v.etape.nom in ('DEFI_VALEUR',):
+            l_constantes.append(k)
+
       # on retourne les deux listes
       return l_constantes,l_fonctions
 
@@ -373,3 +427,69 @@ class JDC(I_OBJECT.OBJECT):
       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
+          jusqu'à la première ETAPE parent.
+      """
+      return []
+
+   def NommerSdprod(self,sd,sdnom):
+      """
+          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 une indication de l'étape
+      # traitée. Pour le moment, il n'y a pas de moyen de le faire : ajouter 
+      # un attribut dans le JDC ???
+      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.g_context.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.g_context[sdnom]=sd
+      sd.nom=sdnom
+
+   def set_etape_context(self,etape):
+      """
+          Positionne l'etape qui sera utilisee dans NommerSdProd pour
+          decider si le concept passé pourra etre  nommé
+      """
+      self._etape_context=etape
+
+   def reset_context(self):
+      """ 
+          Cette methode reinitialise le contexte glissant pour pouvoir
+          tenir compte des modifications de l'utilisateur : création
+          de commandes, nommage de concepts, etc.
+      """
+      self.current_context={}
+      self.index_etape_courante=0
+
+   def del_param(self,param):
+      """
+          Supprime le paramètre param de la liste des paramètres
+          et du contexte gobal
+      """
+      if param in self.params : self.params.remove(param)
+      if self.g_context.has_key(param.nom) : 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 self.g_context.has_key(fonction.nom) : del self.g_context[fonction.nom]
+
index 945ced80984827904d625b9651155c93982695cf..751cacda98d6a0eb8ef6fc3cae024ec5281f9555 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from Noyau import N_JDC_CATA
 
 class JDC_CATA:
index be318d25fbf2c096767eb7c6ee8f483e9ab13758..fbe6e46158d0d47a179bc9e993b03e460c82f5f2 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 # Modules Python
@@ -7,10 +26,18 @@ import traceback,types,string
 import I_ETAPE
 from Noyau.N_ASSD import ASSD
 
+# import rajoutés suite à l'ajout de Build_sd --> à résorber
+import Noyau
+from Noyau import N_Exception
+from Noyau.N_Exception import AsException
+# fin import à résorber
+
 class MACRO_ETAPE(I_ETAPE.ETAPE):
 
   def __init__(self):
-      I_ETAPE.ETAPE.__init__(self)
+      # XXX CCAR : ne suis pas certain que typret doive etre 
+      # initialise à None (a verifier)
+      self.typret=None
 
   def get_sdprods(self,nom_sd):
     """ 
@@ -61,6 +88,10 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
                              context_ini = context_ini,
                              appli=self.jdc.appli)
        j.analyse()
+       # XXX en passant par un jdc auxiliaire, on risque de rendre les etapes inactives
+       # on les force dans l'etat actif
+       for etape in j.etapes:
+          etape.active()
     except:
        traceback.print_exc()
        return None
@@ -146,3 +177,52 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
       # On met g_context à blanc
       self.g_context={}
          
+  def Build_sd(self,nom):
+     """
+        Construit le concept produit de l'opérateur. Deux cas 
+        peuvent se présenter :
+
+        - le parent n'est pas défini. Dans ce cas, l'étape prend en charge 
+          la création et le nommage du concept.
+
+        - le parent est défini. Dans ce cas, l'étape demande au parent la 
+          création et le nommage du concept.
+
+     """
+     if not self.isactif():return
+     # CCAR : meme modification que dans I_ETAPE
+     if not self.isvalid(sd='non') : return
+     else:self.state='undetermined'
+     self.sdnom=nom
+     try:
+        # On positionne la macro self en tant que current_step pour que les 
+        # étapes créées lors de l'appel à sd_prod et à op_init aient la macro
+        #  comme parent 
+        self.set_current_step()
+        if self.parent:
+           sd= self.parent.create_sdprod(self,nom)
+           if type(self.definition.op_init) == types.FunctionType: 
+              apply(self.definition.op_init,(self,self.parent.g_context))
+        else:
+           sd=self.get_sd_prod()
+           if sd != None and self.reuse == None:
+              # On ne nomme le concept que dans le cas de non reutilisation 
+              # d un concept
+              sd.nom=nom
+        self.reset_current_step()
+        if self.jdc and self.jdc.par_lot == "NON" :
+           self.Execute()
+        return sd
+     except AsException,e:
+        self.reset_current_step()
+        raise AsException("Etape ",self.nom,'ligne : ',self.appel[0],
+                             'fichier : ',self.appel[1],e)
+     except EOFError:
+        #self.reset_current_step()
+        raise
+     except :
+        self.reset_current_step()
+        l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
+        raise AsException("Etape ",self.nom,'ligne : ',self.appel[0],
+                          'fichier : ',self.appel[1]+'\n',
+                           string.join(l))
index 7b8281d872fab575b79ce8a89f4cba03af9c9705..7b5482259e08551346a64bdb8b219c54c6e45c63 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 import I_MCCOMPO
 class MCBLOC(I_MCCOMPO.MCCOMPO):
   def makeobjet(self):
index 24f71ccabc4688572d99453a42d6ecdc94cf52b9..d7e828ff7cc44971750f221e745a62b22601fd39 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 import string,types
@@ -25,24 +44,6 @@ class MCCOMPO(I_OBJECT.OBJECT):
     else:
       return self.nom
 
-  def get_genealogie(self):
-    """ 
-        Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC
-        ou ETAPE) de self jusqu'au premier objet etape rencontré
-    """
-    l=[]
-    objet = self
-    while objet.definition.label != 'JDC' :
-      if not objet.isMCList() :
-        l.append(string.strip(objet.nom))
-      else :
-        pass
-      # Si objet.etape == etape c'est que objet est l'étape origine de la généalogie
-      if objet.etape == objet: break
-      objet = objet.parent
-    l.reverse()
-    return l
-
   def get_liste_mc_ordonnee(self,liste,dico):
     """
        Retourne la liste ordonnée (suivant le catalogue) des mots-clés
@@ -61,8 +62,8 @@ class MCCOMPO(I_OBJECT.OBJECT):
     """
     for arg in liste:
         objet_cata = dico[arg]
-        dico=objet_cata.dico
-    return objet_cata.liste
+        dico=objet_cata.entites
+    return objet_cata.ordre_mc
 
   def filtre_liste_mc(self,liste_brute):
     """ 
@@ -113,6 +114,20 @@ class MCCOMPO(I_OBJECT.OBJECT):
           liste.remove(k)
         if self.definition.entites[k].label=='BLOC':
           liste.remove(k)
+    # Pour corriger les exces qui pourraient etre commis dans la methode purge_liste
+    # des regles, on essaie de compenser comme suit :
+    # on ajoute les mots cles facteurs presents dont l'occurence n'est pas atteinte
+    for k in liste_mc_presents:
+      if k in liste:continue
+      objet = self.get_child(k,restreint = 'oui')
+      if isinstance(objet,MCFACT):
+          # un mot-clé facteur ne peut pas être répété plus de self.max fois
+          if objet.definition.max > 1:
+             liste.append(k)
+      elif isinstance(objet,MCList):
+          nb_occur_maxi = objet[0].definition.max
+          if len(objet) < nb_occur_maxi:
+              liste.append(k)
     return liste
 
   def liste_mc_presents(self):
@@ -178,6 +193,7 @@ class MCCOMPO(I_OBJECT.OBJECT):
       """
       self.init_modif()
       if type(name)==types.StringType :
+        # on est en mode création d'un motcle 
         if self.ispermis(name) == 0 : return 0
         objet=self.definition.entites[name](val=None,nom=name,parent=self)
         if hasattr(objet.definition,'position'):
@@ -186,7 +202,9 @@ class MCCOMPO(I_OBJECT.OBJECT):
           elif objet.definition.position == 'global_jdc' :
             self.append_mc_global_jdc(objet)
       else :
+        # dans ce cas on est en mode copie d'un motcle
         objet = name
+       objet.verif_existence_sd()
       # si un objet de même nom est déjà présent dans la liste
       # et si l'objet est répétable
       # il faut créer une MCList et remplacer l'objet de la liste
@@ -219,6 +237,8 @@ class MCCOMPO(I_OBJECT.OBJECT):
             new_obj.init(objet.nom,self)
             new_obj.append(old_obj)
             new_obj.append(objet)
+            # Il ne faut pas oublier de reaffecter le parent d'obj
+            objet.reparent(self)
             self.mc_liste.remove(old_obj)
             self.mc_liste.insert(index,new_obj)
             self.fin_modif()
@@ -227,12 +247,16 @@ class MCCOMPO(I_OBJECT.OBJECT):
             # une liste d'objets de même type existe déjà
             #print "une liste d'objets de même type existe déjà"
             old_obj.append(objet)
+            # Il ne faut pas oublier de reaffecter le parent d'obj
+            objet.reparent(self)
             self.fin_modif()
             return old_obj
       if pos == None :
         self.mc_liste.append(objet)
       else :
         self.mc_liste.insert(pos,objet)
+      # Il ne faut pas oublier de reaffecter le parent d'obj (si copie)
+      objet.reparent(self)
       self.fin_modif()
       return objet
 
@@ -304,11 +328,18 @@ class MCCOMPO(I_OBJECT.OBJECT):
   def copy(self):
     """ Retourne une copie de self """
     objet = self.makeobjet()
+    # FR : attention !!! avec makeobjet, objet a le même parent que self
+    # ce qui n'est pas du tout bon dans le cas d'une copie !!!!!!!
+    # FR : peut-on passer par là autrement que dans le cas d'une copie ???
+    # FR --> je suppose que non
+    # XXX CCAR : le pb c'est qu'on vérifie ensuite quel parent avait l'objet
+    # Il me semble preferable de changer le parent a la fin quand la copie est acceptee
     objet.valeur = copy(self.valeur)
     objet.val = copy(self.val)
     objet.mc_liste=[]
     for obj in self.mc_liste:
       new_obj = obj.copy()
+      new_obj.reparent(objet)
       objet.mc_liste.append(new_obj)
     return objet
 
@@ -333,9 +364,9 @@ class MCCOMPO(I_OBJECT.OBJECT):
      for child in self.mc_liste :
         if child.isvalid() : continue
         l_child = child.get_liste_mc_inconnus()
-       if l_child :
+        for mc in l_child:
           l = [self]
-          l.extend(l_child)
+          l.extend(mc)
           l_mc.append(l)
      return l_mc
 
@@ -351,9 +382,9 @@ class MCCOMPO(I_OBJECT.OBJECT):
     liste_retraits = []
     dict = self.cree_dict_valeurs(self.mc_liste)
     for k,v in self.definition.entites.items():
-      #dict = self.cree_dict_valeurs(self.mc_liste)
       if v.label=='BLOC' :
-        if v.verif_presence(dict) :
+        globs= self.jdc and self.jdc.condition_context or {}
+        if v.verif_presence(dict,globs):
           # le bloc doit être présent
           if not self.get_child(k,restreint = 'oui'):
             # le bloc n'est pas présent et il doit être créé
@@ -365,3 +396,20 @@ class MCCOMPO(I_OBJECT.OBJECT):
             liste_retraits.append(k)
     return liste_ajouts,liste_retraits
 
+  def reparent(self,parent):
+     """
+         Cette methode sert a reinitialiser la parente de l'objet
+     """
+     self.parent=parent
+     self.jdc=parent.get_jdc_root()
+     self.etape=parent.etape
+     for mocle in self.mc_liste:
+        mocle.reparent(self)
+
+  def verif_existence_sd(self):
+     """
+        Vérifie que les structures de données utilisées dans self existent bien dans le contexte
+       avant étape, sinon enlève la référence à ces concepts
+     """
+     for motcle in self.mc_liste :
+         motcle.verif_existence_sd()
index 08ab1f16697ac2aa26d5d4a0b5ad1656435bf7e3..396703642f722d078096035332ced5c5612fe9a6 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 import I_MCCOMPO
 class MCFACT(I_MCCOMPO.MCCOMPO):
   def isrepetable(self):
index c08a383493db0b9448b6767c156833671b4396d2..b9529e3321600342dbf14841d7838ac75894b889 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 from copy import copy
 
 class MCList:
@@ -28,9 +47,13 @@ class MCList:
         return 0
 
   def isoblig(self):
-    for i in self.data:
-      if i.isoblig():return 1
-    return 0
+     """
+     Une MCList n'est jamais obligatoire (même si le MCFACT qu'elle représente l'est
+     """
+     return 0
+     #for i in self.data:
+     #  if i.isoblig():return 1
+     #return 0
 
   def liste_mc_presents(self):
     return []
@@ -49,11 +72,17 @@ class MCList:
       child.delete_concept(sd)
 
   def copy(self):
+    """
+       Réalise la copie d'une MCList
+    """
     liste = self.data[0].definition.list_instance()
-    # XXX Pas de parent ??
-    liste.init(self.nom)
+    # FR -->Il faut spécifier un parent pour la méthode init qui attend 2 arguments ...
+    liste.init(self.nom,self.parent)
     for objet in self:
       new_obj = objet.copy()
+      # Pour etre coherent avec le constructeur de mots cles facteurs N_FACT.__call__
+      # dans lequel le parent de l'element d'une MCList est le parent de la MCList
+      new_obj.reparent(self.parent)
       liste.append(new_obj)
     return liste
 
@@ -68,10 +97,10 @@ class MCList:
      for mcfact in self.data :
         if mcfact.isvalid() : continue
         l_child = mcfact.get_liste_mc_inconnus()
-       if l_child :
-          l = [self]
-          l.extend(l_child)
-          l_mc.append(l)
+        for mc in l_child:
+           l = [self]
+           l.extend(mc)
+           l_mc.append(l)
      return l_mc
 
   def verif_condition_regles(self,liste_presents):
@@ -93,3 +122,82 @@ class MCList:
     # Sans objet pour une liste de mots clés facteurs
     return [],[]
 
+  def init_modif(self):
+    """
+       Met l'état de l'objet à modified et propage au parent
+       qui vaut None s'il n'existe pas
+    """
+    self.state = 'modified'
+    if self.parent:
+      self.parent.init_modif()
+
+  def get_etape(self):
+     """
+        Retourne l'étape à laquelle appartient self
+        Un objet de la catégorie etape doit retourner self pour indiquer que
+        l'étape a été trouvée
+        XXX double emploi avec self.etape ???
+     """
+     if self.parent == None: return None
+     return self.parent.get_etape()
+
+  def get_genealogie(self):
+     """
+         Retourne la liste des noms des ascendants.
+         Un objet MCList n'est pas enregistré dans la genealogie.
+         XXX Meme si le MCFACT fils ne l'est pas lui non plus ????
+     """
+     if self.parent: 
+        return self.parent.get_genealogie()
+     else:
+        return []
+
+  def get_liste_mc_ordonnee_brute(self,liste,dico):
+     """
+         Retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
+         d'une entité composée dont le chemin complet est donné sous forme
+         d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
+     """
+     for arg in liste:
+        objet_cata = dico[arg]
+        dico=objet_cata.entites
+     return objet_cata.ordre_mc
+
+  def reparent(self,parent):
+     """
+         Cette methode sert a reinitialiser la parente de l'objet
+     """
+     self.parent=parent
+     self.jdc=parent.jdc
+     self.etape=parent.etape
+     for mcfact in self.data:
+        mcfact.reparent(parent)
+
+  def verif_existence_sd(self):
+     """
+        Vérifie que les structures de données utilisées dans self existent bien dans le contexte
+       avant étape, sinon enlève la référence à ces concepts
+     """
+     for motcle in self.data :
+         motcle.verif_existence_sd()
+
+  def get_sd_utilisees(self):
+    """
+        Retourne la liste des concepts qui sont utilisés à l'intérieur de self
+        ( comme valorisation d'un MCS)
+    """
+    l=[]
+    for motcle in self.data:
+      l.extend(motcle.get_sd_utilisees())
+    return l
+
+  def get_fr(self):
+     """
+         Retourne la chaine d'aide contenue dans le catalogue
+         en tenant compte de la langue
+     """
+     try :
+        return self.data[0].get_fr()
+     except:
+        return ''
+
index 96fe6ccd23bd8b39c79f43da88674b21723d8618..ca1bafa3822235bdb54327d4b8200bdbabcc4a1e 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 import types,string
 import traceback
 from copy import copy
@@ -7,10 +26,21 @@ myrepr.maxstring = 100
 myrepr.maxother = 100
 
 from Noyau.N_utils import repr_float
+
+# Attention : les classes ASSD,.... peuvent etre surchargées
+# dans le package Accas. Il faut donc prendre des précautions si
+# on utilise les classes du Noyau pour faire des tests (isxxxx, ...)
+# Si on veut créer des objets comme des CO avec les classes du noyau
+# ils n'auront pas les conportements des autres packages (pb!!!)
+# Il vaut mieux les importer d'Accas mais problème d'import circulaire,
+# on ne peut pas les importer au début.
+# On fait donc un import local quand c'est nécessaire (peut occasionner
+# des pbs de prformance).
 from Noyau.N_ASSD import ASSD,assd
 from Noyau.N_GEOM import GEOM,geom
 from Noyau.N_CO import CO
-from Noyau.N_EVAL import EVAL
+# fin attention
+
 from Extensions import parametre
 import I_OBJECT
 
@@ -23,13 +53,17 @@ class MCSIMP(I_OBJECT.OBJECT):
     if self.valeur == None : 
       return None
     elif type(self.valeur) == types.FloatType : 
-      txt = repr_float(self.valeur)
+      #txt = repr_float(self.valeur)
+      # Normalement str fait un travail correct
+      txt = str(self.valeur)
     elif type(self.valeur) in (types.ListType,types.TupleType) :
       txt='('
       i=0
       for val in self.valeur:
         if type(val) == types.FloatType : 
-           txt=txt + i*',' + repr_float(val)
+           # Normalement str fait un travail correct
+           #txt=txt + i*',' + repr_float(val)
+           txt=txt + i*',' + str(val)
         elif type(val) == types.InstanceType and isinstance(val,ASSD): 
            txt = txt + i*',' + val.get_name()
         else: 
@@ -43,8 +77,16 @@ class MCSIMP(I_OBJECT.OBJECT):
         if isinstance(txt,parametre.PARAMETRE):
           return str(txt)
       return repr(txt)
-    # il faut tronquer txt au delà d'un certain nombre de caractères
-    # et avant tout retour chariot (txt peut être une chaîne de caractères
+    # txt peut etre une longue chaine sur plusieurs lignes.
+    # Il est possible de tronquer cette chaine au premier \n et 
+    # de limiter la longueur de la chaine a 30 caracteres. Cependant
+    # ceci provoque une perte d'information pour l'utilisateur
+    # Pour le moment on retourne la chaine telle que
+    return txt
+
+    # Partie de code inaccessible (pour memoire)
+    # txt est tronquee au dela d'un certain nombre de caractères
+    # et avant tout retour chariot (txt peut etre une chaine de caractères
     # sur plusieurs lignes (ex:shell)
     txt = string.split(txt,'\n')[0]
     if len(txt) < 30 :
@@ -82,7 +124,8 @@ class MCSIMP(I_OBJECT.OBJECT):
     """
     for typ in self.definition.type:
       if type(typ) == types.ClassType :
-        if typ is CO : return 1
+        if issubclass(typ,CO) :
+           return 1
     return 0
 
   def wait_assd(self):
@@ -104,7 +147,7 @@ class MCSIMP(I_OBJECT.OBJECT):
     """
     for typ in self.definition.type:
       if type(typ) == types.ClassType :
-        if typ in (GEOM,ASSD,geom,assd) or issubclass(typ,GEOM) :
+        if typ.__name__ in ("GEOM","ASSD","geom","assd") or issubclass(typ,GEOM) :
           return 1
     return 0
 
@@ -165,6 +208,8 @@ class MCSIMP(I_OBJECT.OBJECT):
         # type de nom new_valeur
         if self.wait_co():
           try:
+            # Pour avoir la classe CO avec tous ses comportements
+            from Accas import CO
             self.valeur=CO(new_valeur)
           except:
             traceback.print_exc()
@@ -204,6 +249,8 @@ class MCSIMP(I_OBJECT.OBJECT):
       return sd,1
     else:
       d={}
+      # On veut EVAL avec tous ses comportements. On utilise Accas. Perfs ??
+      from Accas import EVAL
       d['EVAL']=EVAL
       try :
         objet = eval(new_valeur,d)
@@ -238,9 +285,13 @@ class MCSIMP(I_OBJECT.OBJECT):
   def copy(self):
     """ Retourne une copie de self """
     objet = self.makeobjet()
-    #XXX est ce utile ??
-    objet.valeur = copy(self.valeur)
-    objet.val = copy(self.val)
+    # il faut copier les listes et les tuples mais pas les autres valeurs
+    # possibles (réel,SD,...)
+    if type(self.valeur) in (types.ListType,types.TupleType):
+       objet.valeur = copy(self.valeur)
+    else:
+       objet.valeur = self.valeur
+    objet.val = objet.valeur
     return objet
 
   def makeobjet(self):
@@ -257,3 +308,100 @@ class MCSIMP(I_OBJECT.OBJECT):
       if issubclass(self.valeur.__class__,ASSD) : l.append(self.valeur)
     return l
 
+
+  def set_valeur_co(self,nom_co):
+      """
+          Affecte à self l'objet de type CO et de nom nom_co
+      """
+      step=self.etape.parent
+      if nom_co == None or nom_co == '':
+         new_objet=None
+      else:
+         # Pour le moment on importe en local le CO de Accas.
+         # Si problème de perfs, il faudra faire autrement
+         from Accas import CO
+         # Avant de créer un concept il faut s'assurer du contexte : step 
+         # courant
+         sd= step.get_sd_autour_etape(nom_co,self.etape,avec='oui')
+         if sd:
+            # Si un concept du meme nom existe deja dans la portée de l'étape
+            # on ne crée pas le concept
+            return 0,"un concept de meme nom existe deja"
+         # Il n'existe pas de concept de meme nom. On peut donc le créer 
+         # Il faut néanmoins que la méthode NommerSdProd de step gère les 
+         # contextes en mode editeur
+         # Normalement la méthode  du Noyau doit etre surchargée
+         # On déclare l'étape du mot clé comme etape courante pour NommerSdprod
+         cs= CONTEXT.get_current_step()
+         CONTEXT.unset_current_step()
+         CONTEXT.set_current_step(step)
+         step.set_etape_context(self.etape)
+         new_objet = CO(nom_co)
+         CONTEXT.unset_current_step()
+         CONTEXT.set_current_step(cs)
+      self.valeur = new_objet
+      self.val = new_objet
+      self.init_modif()
+      step.reset_context()
+      # On force l'enregistrement de new_objet en tant que concept produit 
+      # de la macro en appelant get_type_produit avec force=1
+      self.etape.get_type_produit(force=1)
+      return 1,"Concept créé"
+       
+  def reparent(self,parent):
+     """
+         Cette methode sert a reinitialiser la parente de l'objet
+     """
+     self.parent=parent
+     self.jdc=parent.jdc
+     self.etape=parent.etape
+
+  def verif_existence_sd(self):
+     """
+        Vérifie que les structures de données utilisées dans self existent bien dans le contexte
+       avant étape, sinon enlève la référence à ces concepts
+     """
+     l_sd_avant_etape = self.jdc.get_contexte_avant(self.etape).values()  
+     if type(self.valeur) in (types.TupleType,types.ListType) :
+       l=[]
+       for sd in self.valeur:
+         if isinstance(sd,ASSD) :
+           if sd in l_sd_avant_etape :
+              l.append(sd)
+        else:
+           l.append(sd)
+       self.valeur=l
+       self.init_modif()
+     else:
+       if isinstance(self.valeur,ASSD) :
+         if self.valeur not in l_sd_avant_etape :
+            self.valeur = None
+             self.init_modif()
+  def get_min_max(self):
+     """
+     Retourne les valeurs min et max admissibles pour la valeur de self
+     """
+     return self.definition.min,self.definition.max
+
+
+  def get_type(self):
+     """
+     Retourne le type attendu par le mot-clé simple
+     """
+     return self.definition.type
index 559ebcd5736f9283db4634b0ae1db4487d2ecad2..23feeefc50f8747d5329ba8b6e89f951a09e6a21 100644 (file)
@@ -1,7 +1,33 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
+import string
+
+import prefs
+import Noyau
 
 class OBJECT:
+  from Noyau.N_CO import CO
+  from Noyau.N_ASSD import assd
+
   def isMCList(self):
     """ 
         Retourne 1 si self est une MCList (liste de mots-clés), 
@@ -80,4 +106,33 @@ class OBJECT:
     """
     return [],[]
 
+  def get_genealogie(self):
+    """ 
+        Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC
+        ou ETAPE) de self jusqu'au premier objet etape rencontré
+    """
+    if self.parent:
+       l=self.parent.get_genealogie()
+       l.append(string.strip(self.nom))
+       return l
+    else:
+       return [string.strip(self.nom)]
+
+  def reparent(self,parent):
+     """
+         Cette methode sert a reinitialiser la parente de l'objet
+     """
+     self.parent=parent
+     self.jdc=parent.jdc
+
+  def get_fr(self):
+     """
+         Retourne la chaine d'aide contenue dans le catalogue
+         en tenant compte de la langue
+     """
+     try :
+        return getattr(self.definition,prefs.lang)
+     except:
+        return ''
+
 
index 5ddd4a80155a359a3f8a61ad50cd273bd6ce3603..796d777a6c018dad574d222ac2c8b3eced68b336 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 
@@ -9,8 +28,9 @@ class PRESENT_ABSENT(I_REGLE.REGLE):
      if self.mcs[0] in liste_mc_presents:regle_active=1
      if not regle_active : return liste_a_purger
 
-     for mc in self.mcs:
-        if mc in liste_a_purger:
+     # Il ne faut pas purger le mot cle present
+     for mc in self.mcs[1:]:
+        if mc in liste_a_purger :
            liste_a_purger.remove(mc)
      return liste_a_purger
 
index e6a841e3b3d66c6b82578c1463d2dd59eb254638..fbd6f681619745d774a3e44fb0f9393285b82723 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 
index ddfdabebda3044c9d036704b58a4fbd12caff4d8..81d6c8107fb6e5076e842992d32db7ffeba6f612 100644 (file)
@@ -1,4 +1,32 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 import I_ETAPE
+
+
+# import rajoutés suite à l'ajout de Build_sd --> à résorber
+import traceback,types
+import Noyau
+from Noyau import N_Exception
+from Noyau.N_Exception import AsException
+# fin import à résorber
+
 class PROC_ETAPE(I_ETAPE.ETAPE):
    def get_sdname(self):
       return ""
@@ -24,3 +52,30 @@ class PROC_ETAPE(I_ETAPE.ETAPE):
       for child in self.mc_liste :
         child.delete_concept(sd)
 
+   def Build_sd(self):
+      """
+          Cette methode applique la fonction op_init au contexte du parent
+          et lance l'exécution en cas de traitement commande par commande
+          Elle doit retourner le concept produit qui pour une PROC est toujours None
+          En cas d'erreur, elle leve une exception : AsException ou EOFError
+      """
+      if not self.isactif():return
+      try:
+         if self.parent:
+            if type(self.definition.op_init) == types.FunctionType: 
+               apply(self.definition.op_init,(self,self.parent.g_context))
+         else:
+            pass
+         if self.jdc.par_lot == "NON" :
+            self.Execute()
+      except AsException,e:
+        raise AsException("Etape ",self.nom,'ligne : ',self.appel[0],
+                              'fichier : ',self.appel[1],e)
+      except EOFError:
+        self.reset_current_step()
+        raise
+      except :
+        l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
+        raise AsException("Etape ",self.nom,'ligne : ',self.appel[0],
+                          'fichier : ',self.appel[1]+'\n',
+                          string.join(l))
index 1ff738f37bcbc0d07d75a5e18ca761fc5dbe42b1..52a0c47a61be5c607aa2218fd23384091ab1ce1c 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 import string
index a600514d16713cf690cf78390f41688a1fa5b4eb..bd1ef701bde03a596dda0ffbc73e8d5206810d6e 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
 """
 
@@ -14,8 +33,9 @@ class UN_PARMI(I_REGLE.REGLE):
      if not regle_active : return liste_a_purger
 
      # Si un des mots clés est présent, on les enlève tous
+     # sauf celui ci
      for mc in self.mcs:
-        if mc in liste_a_purger:
+        if mc in liste_a_purger and mc not in liste_mc_presents:
            liste_a_purger.remove(mc)
      return liste_a_purger
 
index a2c6164b38dd9551c3d48d8e3212a47df423cc65..f12fbf81c63536dd71765cc17beed0a2e664efdf 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce package contient les fonctionnalités supplémentaires nécessaires
     pour l'éditeur graphique EFICAS
diff --git a/Installation/Doc_technique_install.doc b/Installation/Doc_technique_install.doc
new file mode 100755 (executable)
index 0000000..285a354
Binary files /dev/null and b/Installation/Doc_technique_install.doc differ
diff --git a/Installation/README b/Installation/README
new file mode 100755 (executable)
index 0000000..4a575ba
--- /dev/null
@@ -0,0 +1,30 @@
+
+
+       =================================================
+               Procédure d'installation d'EFICAS
+       =================================================
+
+Pré-requis :
+------------
+
+       - Python 2.1 ou supérieur avec Tkinter
+       - PMW 8.0.5 ou supérieur
+
+Installation :
+--------------
+
+1°) copiez le fichier eficas.tar.gz dans un répertoire temporaire
+
+2°) Décompressez ce fichier comme suit :
+
+       gunzip eficas.tar.gz
+       tar xvf eficas.tar
+
+3°) Vous devriez désormais voir 4 éléments :
+
+       - 1 fichier README_install
+       - 1 fichier install.py
+       - 1 fichier code_aster.gif
+       - 1 répertoire /Eficas
+
+4°) Reportez-vous au fichier README_install pour la suite des actions à entreprendre.
diff --git a/Installation/README_install b/Installation/README_install
new file mode 100755 (executable)
index 0000000..081d942
--- /dev/null
@@ -0,0 +1,40 @@
+\r
+\r
+       =================================================\r
+           Procédure d'installation d'EFICAS \r
+       =================================================\r
+\r
+Pour lancer la procédure d'installation, tapez :\r
+\r
+       python install.py\r
+\r
+Vous pouvez remplacer 'python' par le chemin d'accès de votre interpréteur Python.\r
+\r
+La procédure d'installation commence par vérifier que votre système contient bien les\r
+pré-requis pour EFICAS (cf README)\r
+\r
+La procédure va vous demander un certain nombre de chemins d'accès nécessaires à l'établissement du\r
+fichier de configuration d'EFICAS qui s'appelle editeur.ini et qui se trouvera, une fois EFICAS,\r
+installé, dans le répertoire Eficas/Aster\r
+\r
+- Répertoire d'installation    : répertoire dans lequel vous voulez installer Eficas\r
+- Répertoire de travail        : répertoire de travail temporaire d'EFICAS\r
+- Répertoire matériaux                 : répertoire dans lequel se trouvent les catalogues matériaux d'ASTER\r
+- Répertoire doc Aster                 : répertoire dans lequel se trouve le manuel U4 de la doc Aster (format pdf)\r
+                                       ex : /logiciels/aster/NEW6/doc/pdf/u4\r
+- Exécutable Acrobat Reader    : chemin d'accès complet à l'exécutable Acrobat Reader\r
+\r
+\r
+Catalogues Aster   :   EFICAS installe par défaut le catalogue Aster v6 qui se trouve en\r
+                       Eficas/Aster/Cata.\r
+                       Si vous voulez en installer d'autres, il faut qu'ils se trouvent dans ce même répertoire\r
+                       ou qu'il y ait un lien dans ce répertoire vers le fichier.\r
+                       Pour ajouter d'autres catalogues, il faut aller modifier directement le fichier editeur.ini\r
+\r
+       \r
+\r
+Lancement d'EFICAS :   le fichier à lancer est Eficas/Aster/eficas_aster.py\r
+                       il faut le lancer précédé du chemin d'accès à l'interpréteur Python comme\r
+                       pour la procédure d'installation.\r
+\r
+\r
diff --git a/Installation/install.py b/Installation/install.py
new file mode 100755 (executable)
index 0000000..dbe14e3
--- /dev/null
@@ -0,0 +1,949 @@
+SUCCES,ECHEC = 1,0\r
+OUI,NON = 1,0\r
+\r
+## constantes pour les tests de versions \r
+\r
+python_min = 20\r
+tcl_min = 83\r
+tk_min  = 83\r
+pmw_min = 85\r
+test = 0\r
+\r
+try:\r
+    import sys,string,re,types,traceback\r
+    import os,commands\r
+except Exception,e:\r
+    print "Mauvaise installation de Python"\r
+    print str(e)\r
+\r
+REPERTOIRE = os.path.abspath(os.curdir)\r
+\r
+def strip_points(chaine):\r
+    """\r
+    Enlève les caractères autres que les chiffres des chaînes\r
+    """\r
+    x=""\r
+    for i in range(len(chaine)):\r
+        try:\r
+            dummy = float(chaine[i])\r
+            x=x+chaine[i]\r
+        except:\r
+            pass\r
+    return x\r
+\r
+class Test_Environnement :\r
+    def __init__(self):\r
+        self.l_errors = []\r
+\r
+    def test_plate_forme(self):\r
+        """\r
+        Teste que la plate-forme est bien supportée\r
+        """\r
+        if os.name not in ('nt','posix'):\r
+            self.l_errors.append("La plate-forme %s n'est pas supportée" %os.name)\r
+            \r
+    def test_version_python(self):\r
+        """\r
+        Test de la version de python\r
+        """\r
+        version = sys.version\r
+        n = string.index(version,"(") - 1\r
+        vpyt = strip_points(version[0:n])[0:2]     ## recupere les 2 premiers caracteres\r
+        if int(vpyt)<python_min :\r
+            self.l_errors.append("La version %s de python n'est plus supportée" %version[0:n])\r
+\r
+    def test_tcl_tk(self):\r
+        """\r
+        Test des versions de tcl et tk\r
+        """\r
+        try:\r
+            import Tkinter\r
+            vtcl = Tkinter.tkinter.TCL_VERSION\r
+            vtk  = Tkinter.tkinter.TK_VERSION\r
+            # version tcl\r
+            x = strip_points(vtcl)\r
+            if int(x)<tcl_min :\r
+                self.l_errors.append("La version %s de tcl n'est plus supportée" %vtcl)\r
+            # version tk\r
+            x = strip_points(vtk)\r
+            if int(x)<tk_min :\r
+                self.l_errors.append("La version %s de tk n'est plus supportée" %vtk)\r
+        except Exception,e:\r
+            self.l_errors.append("Tkinter n'est pas installé")\r
+            print str(e)\r
+\r
+    def test_Pmw(self):\r
+        """\r
+        Test de la version de Pmw\r
+        """\r
+        try:\r
+            import Pmw\r
+            vpmw = Pmw._version\r
+            x = strip_points(vpmw)\r
+            if int(x)<pmw_min :\r
+                self.l_errors.append("La version %s de Pmw n'est plus supportée" %vpmw)\r
+        except:\r
+            self.l_errors.append("Pmw n'est pas installé")\r
+\r
+    def test(self):\r
+        """\r
+        Active les tests de version Python, versions Tcl/Tk et Pmw\r
+        """\r
+        self.test_plate_forme()\r
+        self.test_version_python()\r
+        self.test_tcl_tk()\r
+        self.test_Pmw()\r
+        if not len(self.l_errors):\r
+            print "Environnement Ok"\r
+            return 1\r
+        else :\r
+            print "Il manque des prérequis"\r
+            print "EFICAS ne peut pas être installé"\r
+            print "Erreurs : ",string.join(self.l_errors)\r
+            return 0\r
+\r
+class Slider:\r
+    def __init__(self, master=None, orientation="horizontal", min=0, max=100,\r
+                 width=100, height=25, autoLabel="true", appearance="sunken",\r
+                 fillColor="blue", background="black", labelColor="yellow",\r
+                 labelText="", labelFormat="%d%%", value=50, bd=2):\r
+        # preserve various values\r
+        self.master=master\r
+        self.orientation=orientation\r
+        self.min=min\r
+        self.max=max\r
+        self.width=width\r
+        self.height=height\r
+        self.autoLabel=autoLabel\r
+        self.fillColor=fillColor\r
+        self.labelColor=labelColor\r
+        self.background=background\r
+        self.labelText=labelText\r
+        self.labelFormat=labelFormat\r
+        self.value=value\r
+        self.frame=Tkinter.Frame(master, relief=appearance, bd=bd)\r
+        self.canvas=Tkinter.Canvas(self.frame, height=height, width=width, bd=0,\r
+                                   highlightthickness=0, background=background)\r
+        self.scale=self.canvas.create_rectangle(0, 0, width, height,\r
+                                                fill=fillColor)\r
+        self.label=self.canvas.create_text(self.canvas.winfo_reqwidth() / 2,\r
+                                           height / 2, text=labelText,\r
+                                           anchor="c", fill=labelColor)\r
+        self.update()\r
+        self.canvas.pack(side='top', fill='x', expand='no')\r
+\r
+    def update(self):\r
+        # Trim the values to be between min and max\r
+        value=self.value\r
+        if value > self.max:\r
+            value = self.max\r
+        if value < self.min:\r
+            value = self.min\r
+        # Preserve the new value\r
+        c=self.canvas\r
+        # Adjust the rectangle\r
+        if self.orientation == "horizontal":\r
+            c.coords(self.scale,0, 0,float(value) / self.max * self.width, self.height)\r
+        else:\r
+            c.coords(self.scale,0, self.height - (float(value) / self.max*self.height),self.width, self.height)\r
+        # Now update the colors\r
+        c.itemconfig(self.scale, fill=self.fillColor)\r
+        c.itemconfig(self.label, fill=self.labelColor)\r
+        # And update the label\r
+        if self.autoLabel=="true":\r
+            c.itemconfig(self.label, text=self.labelFormat % value)\r
+        else:\r
+            c.itemconfig(self.label, text=self.labelFormat % self.labelText)\r
+        c.update_idletasks()\r
+try :\r
+    import Tkinter\r
+    import Pmw\r
+    from tkMessageBox import showinfo,askyesno,showerror,askretrycancel\r
+except:\r
+    pass\r
+\r
+class SplashScreen(Tkinter.Toplevel):\r
+    """ Provides a splash screen. Usage:\r
+        Subclass and override 'CreateWidgets()'\r
+        In constructor of main window/application call\r
+        - S = SplashScreen(main=self)        (if caller is Toplevel)\r
+        - S = SplashScreen(main=self.master) (if caller is Frame)\r
+        - S.quit()  after you are done creating your widgets etc.\r
+    """\r
+    def __init__(self, master,**args):\r
+        Tkinter.Toplevel.__init__(self, master, relief='groove',borderwidth=5)\r
+        self.protocol("WM_DELETE_WINDOW",lambda x=0: x+x  )       # pour ne pas détruire la fenêtre en pleine copie de fichiers\r
+        self.main = master\r
+        if self.main != None :\r
+            self.main.withdraw()\r
+        self.frame = Tkinter.Frame(self)\r
+        self.frame.pack(expand=1,fill='both')\r
+        self.init(args)\r
+        self.geometry("300x200")\r
+        self.resizable(0,0)\r
+        self.CreateWidgets()\r
+\r
+    def init(self,args={}):\r
+        self.text = Tkinter.StringVar()\r
+        self.text.set('')\r
+        self.icone = 'Editeur/icons/logo_edf.gif'\r
+        self.barre = 'non'\r
+        if args == {} : return\r
+        if args.has_key('text'):\r
+            self.text.set(args['text'])\r
+        if args.has_key('titre'):\r
+            self.title(args['titre'])\r
+        if args.has_key('code'):\r
+            self.code = args['code']\r
+        else:\r
+            self.code = 'inconnu'\r
+        if self.code == 'ASTER' :\r
+            self.icone = 'Editeur/icons/code_aster.gif'\r
+        \r
+    def CreateWidgets(self):\r
+        fic_image = os.path.join("./", self.icone)\r
+        if os.path.exists(fic_image):\r
+            self.catIcon = Tkinter.PhotoImage(file=os.path.join("./", self.icone))\r
+            Tkinter.Label(self.frame, image=self.catIcon).pack(side=Tkinter.TOP)\r
+        else:\r
+            Tkinter.Label(self.frame, text = "EFICAS pour Code_Aster").pack(side=Tkinter.TOP)\r
+        self.label = Tkinter.Label(self.frame, textvariable=self.text)\r
+        self.label.pack(side=Tkinter.TOP,expand=1,fill='both')\r
+        self.progress = Slider(self.frame,value=0,max=100,orientation='horizontal',\r
+                               fillColor='blue',width=200,height=30,\r
+                               background='white',labelColor='red')\r
+\r
+    def update_barre(self,event=None):\r
+        """ Permet de faire avancer la barre de progression """\r
+        try:\r
+            self.progress.value = self.progress.value+self.increment\r
+            self.progress.update()\r
+            #self.after(100,self.update_barre)\r
+        except:\r
+            pass\r
+\r
+    def configure_barre(self):\r
+        """ Calcule l'incrément de progression de la barre en fonction\r
+        du nombre d'opérations à effectuer afin que le compteur\r
+        soit à 100% à la fin des opérations"""\r
+        self.increment = 100./self.ratio\r
+        self.progress.update()\r
+\r
+    def configure(self,**args):\r
+        if args.has_key('text'):\r
+            self.text.set(args['text'])\r
+        if args.has_key('titre'):\r
+            self.title(args['titre'])\r
+        if args.has_key('barre'):\r
+            old = self.barre\r
+            self.barre = args['barre']\r
+            if self.barre == 'oui' and old == 'non':\r
+                self.progress.frame.pack(in_=self.frame,side='top')\r
+            elif self.barre == 'non' and old == 'oui':\r
+                self.progress.frame.pack_forget()\r
+        if args.has_key('ratio'):\r
+            self.ratio = args['ratio']\r
+            self.configure_barre()\r
+        self.update()\r
+        \r
+    def quit(self):\r
+        self.progress = None\r
+        self.withdraw()\r
+        self.main.update()\r
+        self.main.deiconify()\r
+\r
+def centerwindow(window,parent = 'avec'):\r
+    if parent =='avec':\r
+        parent = window.winfo_parent()\r
+        if type(parent) == types.StringType:\r
+            try:\r
+                parent = window._nametowidget(parent)\r
+            except:\r
+                parent = window\r
+    # Find size of window.\r
+    window.update_idletasks()\r
+    width = window.winfo_width()\r
+    height = window.winfo_height()\r
+    if width == 1 and height == 1:\r
+        # If the window has not yet been displayed, its size is\r
+        # reported as 1x1, so use requested size.\r
+        width = window.winfo_reqwidth()\r
+        height = window.winfo_reqheight()\r
+    # Place in centre of screen:\r
+    if parent =='avec' :\r
+        x = (window.winfo_screenwidth() - width) / 2 - parent.winfo_vrootx()\r
+        y = (window.winfo_screenheight() - height) / 3 - parent.winfo_vrooty()\r
+    else:\r
+        x = (window.winfo_screenwidth() - width) / 2 \r
+        y = (window.winfo_screenheight() - height) / 3\r
+    if x < 0:\r
+        x = 0\r
+    if y < 0:\r
+        y = 0\r
+    window.geometry('+%d+%d' % (x, y))\r
+    \r
+class config_item:\r
+    """\r
+    Classe utilisée pour représenter chaque option de configuration\r
+    """\r
+    def __init__(self, pere, nom):\r
+        self.nom = nom\r
+        self.pere = pere\r
+        self.entree_value = None\r
+        self.default = None\r
+        self.test = None\r
+        self.pere.register_item(self)\r
+\r
+    def get_valeur(self):\r
+        return os.path.abspath(self.entree.get())\r
+    \r
+    def set_entree(self,entree):\r
+        self.entree = entree\r
+        self.pere.register_entree(entree)\r
+\r
+class Config(Tkinter.Toplevel):\r
+    """\r
+    Classe principale : une instance de Config est utilisée pour\r
+    créer l'interface. Toutes les actions (création de répertoire, copie\r
+    de fichiers ...) sont réalisées par des méthodes de Config ou de ses\r
+    composants\r
+    """\r
+    pat_rep = re.compile(r'^(rep_)([\w_]*)')             # expression réguliere pour reconnaitre les\r
+                                                         # les options qui désignent des répertoires\r
+    def __init__(self, parent):\r
+        self.master = parent\r
+        Tkinter.Toplevel.__init__(self,None)\r
+        parent.withdraw()\r
+        self.title("Installation d'EFICAS")\r
+        self.geometry("500x320+0+0")\r
+        centerwindow(self)\r
+        self.install_running = 0\r
+        #évite que la fenêtre puisse être détruite en pleine copie de fichiers\r
+        self.protocol("WM_DELETE_WINDOW",self.exit  )\r
+        # création des frames\r
+        self.frame_gen = Tkinter.Frame(self,bd=1,relief='groove')\r
+        self.frame_gen.place(relx=0,rely=0,relwidth=1,relheight=0.9 )\r
+        self.frame_but = Tkinter.Frame(self,bd=1,relief='groove')\r
+        self.frame_but.place(relx=0,rely=0.9 ,relheight=0.1 ,relwidth=1)\r
+        # création des items de configuration\r
+        self.make_items_config()\r
+        # remplissage de la frame générale\r
+        self.make_frame_gen()\r
+        # remplissage de la frame boutons\r
+        self.make_frame_but()\r
+        # création boîtes de dialogue\r
+        self.init_complementaire()\r
+        # init système\r
+        self.init_systeme()\r
+        \r
+    def make_items_config(self):\r
+        """\r
+        Création des objets Config_item\r
+        """\r
+        self.items = []\r
+        self.items_a_creer = []\r
+        self.liste_rep_crees = []\r
+        self.entrees = []\r
+        # designation, texte d'invite , option par defaut(unix), option par defaut(windows), flag obligatoire/facultatif\r
+        self.l_tx_items = (('rep_install'   ,\r
+                            "Répertoire d'installation :",\r
+                            '',\r
+                            '',\r
+                            'o'),\r
+                           ('rep_travail'   ,\r
+                            'Répertoire de travail :',\r
+                            'tmp',\r
+                            'tmp',\r
+                            'f'),\r
+                           ('rep_mat'       ,\r
+                            'Répertoire matériaux :',\r
+                            None,\r
+                            None,\r
+                            'f'),\r
+                           ('rep_docaster'  ,\r
+                            "Chemin d'accès à la doc Aster :" ,\r
+                            None,\r
+                            None,\r
+                            'f'\r
+                            ),\r
+                           ('acrobat'       ,\r
+                            'Exécutable Acrobat Reader :',\r
+                            '/usr/bin/acroread',\r
+                            'acrobat.exe',\r
+                            'o')\r
+                           )\r
+\r
+        for item in self.l_tx_items:\r
+            nom_item = item[0]\r
+            setattr(self,nom_item,config_item(self,nom_item))\r
+\r
+    def make_frame_gen(self):\r
+        """\r
+        Création des zones de saisie des paramètres généraux\r
+        """\r
+        # Création du label titre de la frame\r
+        self.information = Tkinter.Label(self.frame_gen,text="CONFIGURATION D'EFICAS")\r
+        self.information.pack(side="top",pady=10)\r
+        # création des widgets de saisie des items\r
+        for txt in self.l_tx_items:\r
+            nom_item = txt[0]\r
+            txt_item = txt[1]\r
+            if os.name == 'nt':\r
+                default_value = txt[3]\r
+            else:\r
+                default_value = txt[2]\r
+            item = getattr(self,nom_item)\r
+            wdg_item = Pmw.EntryField(self.frame_gen,\r
+                                      labelpos = 'w',\r
+                                      label_text = txt_item,\r
+                                      command = lambda s=self,i=item : s.select_next_entry(i.entree))\r
+            item.default_value = default_value\r
+            item.statut = txt[4]\r
+            item.set_entree(wdg_item)\r
+        # on affiche les entrées\r
+        for entree in self.entrees:\r
+            entree.pack(fill='x', expand=1, padx=10, pady=5)\r
+        Pmw.alignlabels(self.entrees)\r
+        self.entrees[0].focus_set()\r
+        #self.rep_cata_dev.entree.configure(entry_state = 'disabled')\r
+        self.display_defaults()\r
+        \r
+    def make_frame_but(self):\r
+        """\r
+        Création des boutons de commande Installer et Annuler\r
+        """\r
+        self.validButton    = Tkinter.Button(self.frame_but, text = 'Installer', command = self.run_install)\r
+        self.exitButton     = Tkinter.Button(self.frame_but,\r
+                                             text = 'Annuler',\r
+                                             command = lambda s=self : s.exit(annule='oui'))\r
+        self.exitButton.place(relx=0.35,rely=0.5,anchor='center')\r
+        self.validButton.place(relx=0.65,rely=0.5,anchor='center')\r
+\r
+    def init_complementaire(self):\r
+        """\r
+        Création de widgets complémentaires (boîtes de dialogue ...)\r
+        """\r
+        self.erreur_dialog = Pmw.Dialog(self,\r
+                                        buttons = ('Modifier', 'Annuler'),\r
+                                        defaultbutton = 'Modifier',\r
+                                        title = 'Erreur',\r
+                                        command = self.erreur_exec)\r
+        self.erreur_dialog.withdraw()\r
+        self.fatale_dialog = Pmw.Dialog(self,\r
+                                        buttons = ('Annuler',),\r
+                                        title = 'Fatal',\r
+                                        command = self.fatale_exec)\r
+        self.fatale_dialog.withdraw()\r
+        self.info_dialog = Pmw.Dialog(self,\r
+                                        buttons = ('Ok',),\r
+                                        title = 'Attention')\r
+        self.info_dialog.configure(command=self.info_dialog.withdraw())\r
+        self.info_dialog.withdraw()\r
+        self.attente = SplashScreen(None,code="ASTER")\r
+        self.attente.withdraw()\r
+\r
+    def init_systeme(self):\r
+        """\r
+        Détermine les commandes à exécuter en fonction de l'OS\r
+        """\r
+        self.d_commandes = {}\r
+        if os.name == 'nt':\r
+            self.d_commandes['decompress'] = "unzip.exe "\r
+            self.d_commandes['copy'] = "copy "\r
+            self.d_commandes['delete'] = "del "\r
+        elif os.name == 'posix':\r
+            self.d_commandes['decompress'] = "gunzip "\r
+            self.d_commandes['copy'] = "cp "\r
+            self.d_commandes['delete'] = "rm "\r
+\r
+    def run_install(self):\r
+        """\r
+        Lance l'installation proprement dite d'EFICAS\r
+        """\r
+        self.install_running = 1\r
+        self.afficher_splash()\r
+        self.deactivate_entries()           #  Les entrees et les boutons sont desactivees\r
+        self.deactivate_buttons()           #  pendant les operations d'installation\r
+        #self.decompress_archive()\r
+        #if not os.path.exists(os.path.join(REPERTOIRE,'Eficas')):\r
+        #    self.afficher_fatale("Il manque des fichiers d'EFICAS")\r
+        #    self.install_running = 0\r
+        #    return\r
+        self.nb_fichiers = self.compte_fichiers(REPERTOIRE)\r
+        if self.nb_fichiers == 0:\r
+            self.afficher_fatale("Il manque des fichiers d'EFICAS")\r
+            self.install_running = 0\r
+            return\r
+        # essaie de creer les repertoires.\r
+        try:\r
+            if self.make_dirs() == ECHEC :                             \r
+                self.activate_entries()                               \r
+                self.activate_buttons()                               \r
+                self.install_running = 0\r
+                return\r
+        except:\r
+            self.install_running = 0\r
+            self.afficher_fatale("Impossible de créer certains répertoires")\r
+            \r
+        # affiche la fenêtre avec la barre de progression\r
+        self.afficher_copie_fichiers()          \r
+        # essaie de copier les fichiers d'EFICAS\r
+        try:\r
+            if  self.move_files() == ECHEC:                           \r
+                self.afficher_echec("Impossible de copier les fichiers d'EFICAS")\r
+                self.activate_buttons()\r
+                self.install_running = 0\r
+                return\r
+        except :\r
+           traceback.print_exc()\r
+            self.install_running = 0\r
+            self.afficher_fatale("Impossible de copier certains fichiers")\r
+\r
+        #self.rm_temp_dirs()                     # efface les répertoires temporaires\r
+        try:\r
+            self.creer_fic_conf()                   # crée le fichier eficas.conf\r
+        except:\r
+            afficher_info("Impossible de créer le fichier de configuration\n Il est possible de le faire a la main")\r
+#        self.install_running = 0\r
+        self.afficher_install_terminee()        # A ce stade tout est fait et il ne reste plus qu'à attendre\r
+                                                # un clic de souris pour sortir\r
+\r
+    def display_defaults(self):\r
+        """\r
+        Affiche les valeurs par défaut dans les zones de saisie\r
+        """\r
+        # racine indique la racine de l'arborescence\r
+        if os.name == 'nt':\r
+            racine = 'C:\\'\r
+        else:\r
+            racine = os.environ['HOME']\r
+        # remplit les zones de saisie avec les options par défaut\r
+        for item in self.items:\r
+            if item.default_value == None : continue\r
+            item.default_value = os.path.join(racine,item.default_value)\r
+            item.entree.insert(0,item.default_value)\r
+\r
+    def register_item(self,item):\r
+        """\r
+        Enregistre l'item dans la liste des items et éventuellement\r
+        dans la liste des items à créer (répertoires)\r
+        """\r
+        self.items.append(item)\r
+        if self.pat_rep.match(item.nom) :\r
+            self.items_a_creer.append(item)\r
+\r
+    def register_entree(self,entree):\r
+        """\r
+        Enregistre la zone de saisie dans la liste des zones\r
+        """\r
+        self.entrees.append(entree)\r
+\r
+    def select_next_entry(self,entree):\r
+        """\r
+        Place le focus dans l'entry suivant celle passée en argument\r
+        """\r
+        index = self.entrees.index(entree)+1\r
+        if index != len(self.entrees):\r
+            self.entrees[index].component('entry').focus()\r
+\r
+    def activate_entries(self):\r
+        """\r
+        Active les entrées. Les zones de saisie deviennent éditables.\r
+        """\r
+        for item in self.entrees:\r
+            item.configure(entry_state='normal')\r
+\r
+    def deactivate_entries(self):\r
+        """\r
+        Désactive les entrées. Les zones ne sont plus éditables.\r
+        """\r
+        for item in self.entrees:                                #  Les entrees sont desactivees\r
+            item.configure(entry_state='disabled')               #  pendant les operations d'installation\r
+\r
+    def activate_buttons(self):\r
+        """\r
+        active les boutons valider et annuler\r
+        """\r
+        self.validButton.configure(state = 'normal')\r
+        self.exitButton.configure(state = 'normal')\r
+\r
+    def deactivate_buttons(self):\r
+        """\r
+        désactive des boutons valider de annuler\r
+        """\r
+        self.validButton.configure(state = 'disabled')\r
+        self.exitButton.configure(state = 'disabled')\r
+\r
+    def erreur_exec(self, result):\r
+        """\r
+        Callback exécuté lorsque l'utilisateur clique sur un des boutons\r
+        Modifier/Annuler de la fenêtre de dialogue qui lui présente les erreurs\r
+        """\r
+        self.erreur_dialog.deactivate(result)\r
+        self.removedir()\r
+        if result == 'Annuler':\r
+            self.install_running = 0\r
+            self.exit(annule='non')\r
+\r
+    def fatale_exec(self, result):\r
+        """\r
+        Callback exécuté lorsque l'utilisateur clique sur le bouton\r
+        Quitter de la fenêtre de dialogue qui lui présente les erreurs fatales\r
+        Seule solution : sortir de l'installation\r
+        """\r
+        self.fatale_dialog.deactivate(result)\r
+        self.install_running = 0\r
+        self.exit(annule='oui')\r
+        \r
+    def test_confirmation(self,flag,nom):\r
+        """\r
+        Callback activé par le clic sur bouton fenêtre demandant confirmation\r
+        avant création répertoire facultatif\r
+        """\r
+        if flag == 'NON':\r
+            self.confirmation.destroy()\r
+            self.TEST_confirmation_avant_creation = NON\r
+            return \r
+        else :\r
+            self.confirmation.destroy()\r
+            self.TEST_confirmation_avant_creation = OUI            \r
+            \r
+    def afficher_fatale(self, message):\r
+        """\r
+        Affiche les erreurs fatales\r
+        """\r
+        self.attente.withdraw()\r
+        w = Tkinter.Label(self.fatale_dialog.interior(),text = message, pady = 5)\r
+        w.pack(expand = 1, fill = 'both', padx = 4, pady = 4)\r
+        self.fatale_dialog.configure(deactivatecommand = w.destroy)\r
+        self.fatale_dialog.activate()\r
+\r
+    def afficher_echec(self, message):\r
+        """\r
+        Affiche un message d'erreur\r
+        Par construction, dès que l'on passe par cette méthode, on sort de l'installation\r
+        en passant le flag install_running à 0\r
+        """\r
+        self.attente.withdraw()\r
+        w = Tkinter.Label(self.erreur_dialog.interior(),text = message, pady = 5)\r
+        w.pack(expand = 1, fill = 'both', padx = 4, pady = 4)\r
+        self.erreur_dialog.configure(deactivatecommand = w.destroy)\r
+        self.erreur_dialog.activate()\r
+\r
+    def confirmation_avant_creation(self,repertoire):\r
+        """\r
+        Affiche une boite de dialogue pour confirmer la création\r
+        d'un répertoire facultatif.\r
+        """\r
+        self.attente.withdraw()\r
+        self.confirmation = Pmw.Dialog(self,\r
+                                       buttons = ('OUI', 'NON'),\r
+                                       defaultbutton = 'OUI',\r
+                                       title = "Répertoire inexistant",\r
+                                       command = lambda f,s=self,r=repertoire : s.test_confirmation(f,r))\r
+        self.confirmation.withdraw()\r
+        Tkinter.Label(self.confirmation.interior(),\r
+                      text="Le répertoire %s n'existe pas \n Voulez-vous le créer ?" %repertoire).pack(side='top')\r
+        self.confirmation.activate(geometry='centerscreenalways')\r
+        return self.TEST_confirmation_avant_creation\r
+  \r
+    def afficher_splash(self):\r
+        """\r
+        Afficher la boite de message \r
+        """\r
+        self.attente.deiconify()\r
+        self.attente.tkraise()\r
+        centerwindow(self.attente)\r
+        self.attente.configure(titre="Installation d'EFICAS",\r
+                               text="Vérification intégrité sources Eficas",\r
+                               barre="non")\r
+        \r
+    def afficher_info(self,message):\r
+        """\r
+        Afficher une boite de warning\r
+        """\r
+        w = Tkinter.Label(self.info_dialog.interior(),text = message, pady = 5)\r
+        w.pack(expand = 1, fill = 'both', padx = 4, pady = 4)\r
+        self.info_dialog.configure(deactivatecommand = w.destroy)\r
+        self.info_dialog.activate()\r
+        \r
+    def afficher_copie_fichiers(self):\r
+        """\r
+        Afficher la boite de message avec la barre de progression\r
+        """\r
+        self.attente.deiconify()\r
+        self.attente.tkraise()\r
+        self.attente.configure(titre="Installation d'EFICAS",\r
+                               text="copie des fichiers",\r
+                               barre="oui")\r
+        self.attente.ratio = self.nb_fichiers\r
+        self.attente.configure_barre()\r
+\r
+    def afficher_install_terminee(self):\r
+        """\r
+        Afficher le message Installation terminée\r
+        """\r
+        self.withdraw()\r
+        self.attente.configure(titre="Installation d'EFICAS",\r
+                               text="Installation terminée",\r
+                               barre="non")\r
+        self.exitButton.place_forget()\r
+        self.validButton.place_forget()\r
+        self.validButton = Tkinter.Button(self.attente.frame,\r
+                                          text = 'Quitter',\r
+                                          command = self.exit)\r
+        self.validButton.pack(side='top',pady=5)\r
+        self.install_running = 0\r
+\r
+    def decompress_archive(self) :\r
+        """\r
+        Décompresse l'archive d'EFICAS dans un répertoire temporaire (.)\r
+        """\r
+        print "decompress_archive"\r
+        #try:\r
+        commande = os.path.join(REPERTOIRE,self.d_commandes['decompress'])\r
+        fichier = os.path.join(REPERTOIRE,"eficas.zip")\r
+        print 'commande =',commande\r
+        print 'fichier =',fichier\r
+        os.execv(commande,("eficas.zip",))\r
+        #except:\r
+        #    self.affiche_echec("Erreur dans la décompression")\r
+\r
+    def normaliser_chemin(self, nom):\r
+        """\r
+        Retourne le chemin d'accès complet à nom\r
+        """\r
+        return os.path.abspath(os.path.expanduser(nom))\r
+\r
+    def discriminer_noms(self):\r
+        """\r
+        Emet un message d'alerte si des zones de saisie ne sont pas remplies\r
+        ou si des noms de répertoires à créer sont identiques.\r
+        """\r
+        liste_noms = []\r
+        for item in self.items_a_creer:\r
+            nom = item.entree.get()\r
+            if nom == self.rep_install.entree.get():        # il faut ajouter 'Eficas' au chemin du repertoire\r
+                nom = os.path.join(nom,"Eficas")            # d'installation\r
+            liste_noms.append(nom)\r
+\r
+        test = SUCCES\r
+        for item in self.items_a_creer:\r
+            nom = item.entree.get()\r
+            if len(nom) == 0 :\r
+                test = ECHEC\r
+                message = "attention : certains répertoires n'ont pas de nom"\r
+                self.afficher_echec(message)\r
+            item.entree.component('entry').focus()\r
+            break\r
+\r
+        if test == ECHEC :\r
+            return test\r
+\r
+        for item in self.items_a_creer:\r
+            nom = item.entree.get()\r
+            if liste_noms.count(nom) >1 :\r
+                test = ECHEC\r
+                message = "attention : certains répertoires ont le même nom"\r
+                self.afficher_echec(message)\r
+            item.entree.component('entry').focus()\r
+            break\r
+\r
+        return test\r
+\r
+    def compte_fichiers(self,path):\r
+        """\r
+        Dénombre les fichiers présents dans le répertoire Eficas (et ses sous-répertoires)\r
+        """\r
+        nb = 0\r
+        l_fic = os.listdir(path)\r
+        l_rep = []\r
+        for fic in l_fic :\r
+            if os.path.isdir(os.path.join(path,fic)):\r
+                l_rep.append(fic)\r
+            else:\r
+                nb = nb+1\r
+        for rep in l_rep :\r
+            nb = nb + self.compte_fichiers(os.path.join(path,rep))\r
+        return nb\r
+\r
+    def creer_fic_conf(self):\r
+        """\r
+        Crée le fichier editeur.ini a partir des données saisies\r
+        par l'administrateur.\r
+        """\r
+        fichier_conf = os.path.join(self.normaliser_chemin(self.rep_install.get_valeur()),"Eficas/Aster/editeur.ini")\r
+        f = open(fichier_conf,'w')\r
+        f.write("path_doc        =    "+'"'+self.normaliser_chemin(self.rep_docaster.get_valeur())+'"\n')\r
+        f.write("exec_acrobat    =    "+'"'+self.normaliser_chemin(self.acrobat.get_valeur())+'"\n')\r
+        f.write('isdeveloppeur   =    "NON"\n')\r
+        f.write("rep_travail     =    "+'"'+self.normaliser_chemin(self.rep_travail.get_valeur())+'"\n')\r
+        f.write("rep_cata        =    "+'"'+os.path.join(self.normaliser_chemin(self.rep_install.get_valeur()),"Eficas/Aster/Cata/")+'"\n') # attention au dernier slash\r
+        f.write("rep_mat         =    "+'"'+self.normaliser_chemin(self.rep_mat.get_valeur())+'"\n')\r
+        cata = """catalogues = (('ASTER','v6',rep_cata + 'cata_STA6.py','python','defaut'),)\n"""\r
+        f.write(cata)\r
+        f.close()\r
+       \r
+\r
+    def move_files(self):\r
+        """\r
+        Déplace les fichiers Eficas du répertoire temporaire vers\r
+        leur répertoire de destination\r
+        """\r
+        # création du répertoire Eficas\r
+        rep_eficas = os.path.join(self.rep_install.get_valeur(),'Eficas')\r
+        self.copy_rep(REPERTOIRE,rep_eficas)\r
+\r
+    def copy_rep(self,rep_dep,rep_arr):\r
+        """\r
+        Copie le répertoire path_dep et ses sous-répertoires dans path_arr\r
+        """\r
+        l_fichiers = os.listdir(rep_dep)\r
+        if not os.path.exists(rep_arr) :\r
+            # création du répertoire d'arrivée quand il n'existe pas \r
+            self.mkdirs(rep_arr)\r
+        for fic in l_fichiers :\r
+            nom_complet_dep = os.path.join(rep_dep,fic)\r
+            nom_complet_arr = os.path.join(rep_arr,fic)\r
+            if os.path.isfile(nom_complet_dep):\r
+                commande_copie = self.d_commandes['copy']+nom_complet_dep+' '+nom_complet_arr\r
+                commande_delete= self.d_commandes['delete']+nom_complet_dep\r
+                try:\r
+                    os.system(commande_copie)\r
+                    #os.system(commande_delete)\r
+                    self.attente.update_barre()\r
+                except Exception,e:\r
+                    pass\r
+            elif os.path.isdir(nom_complet_dep):\r
+                self.copy_rep(nom_complet_dep,nom_complet_arr)\r
+\r
+    def rm_temp_dirs(self):\r
+        """\r
+        Détruit le répertoire temporaire de l'archive d'Eficas\r
+        """\r
+        rep_arch = os.path.join(REPERTOIRE,'Eficas')\r
+        self.rm_r(rep_arch)\r
+\r
+    def make_dirs(self):\r
+        """\r
+        Crée les répertoires d'accueil des fichiers d'EFICAS\r
+        """\r
+        # création des répertoires dont l'utilisateur a donné le nom\r
+        if self.discriminer_noms() == ECHEC:\r
+            return ECHEC\r
+        for item in self.items_a_creer:\r
+            if not item.entree.get():\r
+                continue\r
+            nom = item.get_valeur()\r
+            if nom == self.normaliser_chemin(self.rep_install.entree.get()):        # il faut ajouter 'Eficas' au chemin du repertoire\r
+                nom = os.path.join(nom,"Eficas")            # d'installation\r
+            item.test = self.essai_creer(nom,item.statut)\r
+            if item.test == ECHEC :\r
+                item.entree.component('entry').focus()\r
+                return ECHEC\r
+        return SUCCES\r
+\r
+    def essai_creer(self, nom, statut):\r
+        """\r
+        Essaie de créer le répertoire nom s'il n'existe pas déjà.\r
+        Si statut == 'f' et si le fichier n'existe pas, demande\r
+        confirmation avant création\r
+        """\r
+        repertoire = self.normaliser_chemin(nom)                # repertoire = chemin absolu de nom\r
+        if os.path.exists(repertoire):\r
+            if statut == 'o' :\r
+                self.afficher_echec("Un fichier ou répertoire de nom "+ repertoire+ " existe déjà !\n"+\r
+                                "L'installation ne peut continuer")\r
+                return ECHEC\r
+            else:\r
+                return SUCCES\r
+\r
+        if statut == 'f' :\r
+            # on demande confirmation de création à l'utilisateur\r
+            test = self.confirmation_avant_creation(repertoire)\r
+            if test == NON:\r
+                return SUCCES\r
+\r
+        try:\r
+            test = self.mkdirs(repertoire)\r
+            return SUCCES\r
+        except Exception,e:\r
+            message = "La création de "+repertoire+" a échoué :\n %s \n Vérifiez vos droits d'écriture"  %str(e)  # message d'erreur\r
+            self.afficher_echec(message)\r
+            return ECHEC\r
+\r
+    def mkdirs(self,rep):\r
+        """\r
+        Création récursive des répertoires d'installation.\r
+        Les noms des répertoires crées sont stockés dans\r
+        une liste dont se sert la méthode removedir pour\r
+        restaurer l'environnement initial en cas d'annulation.\r
+        """\r
+        if rep==os.path.dirname(rep):\r
+            return SUCCES\r
+\r
+        if os.path.exists(os.path.dirname(rep)):\r
+            os.mkdir(rep)\r
+            self.liste_rep_crees.append(rep)\r
+            return SUCCES\r
+        else:\r
+            test = self.mkdirs(os.path.dirname(rep))\r
+            if test == SUCCES:\r
+                os.mkdir(rep)\r
+                self.liste_rep_crees.append(rep)\r
+                return SUCCES\r
+            else:\r
+                return ECHEC\r
+\r
+    def rm_r(self,path):\r
+        """\r
+        Detruit récursivement path\r
+        """\r
+        if not os.path.exists(path):\r
+            return\r
+        try:\r
+            if len(os.listdir(path))!=0:\r
+                for entree in os.listdir(path):\r
+                    entree = os.path.join(path,entree)\r
+                    self.rm_r(entree)\r
+            os.rmdir(path)\r
+        except Exception,e:\r
+            self.afficher_info("Impossible de détruire le répertoire : "+path+"\n"+"\n"+str(e)+"\n L'installation continue néanmoins")\r
+\r
+    def removedir(self):\r
+        """\r
+        Destruction des répertoires déja crées (en cas d'annulation)\r
+        """\r
+        for rep in self.liste_rep_crees:\r
+            self.rm_r(rep)\r
+        self.liste_rep_crees = []\r
+\r
+    def exit(self,annule='non'):\r
+        """\r
+        Tente de sortir de l'application.\r
+        Echoue si installation en cours\r
+        """\r
+        if self.install_running :\r
+            # l'installation est en cours --> on interdit la sortie\r
+            self.afficher_info("Impossible de quitter tant que l'installation est en cours\n Veuillez patienter")\r
+        else:\r
+            if annule == 'oui' : self.removedir()\r
+            self.master.quit()\r
+\r
+if __name__ == '__main__':\r
+    test = Test_Environnement().test()\r
+    if not test :\r
+        # environnement incomplet --> on sort de la procédure d'installation\r
+        sys.exit()\r
+    else:\r
+        import Tkinter\r
+        import Pmw\r
+        root = Tkinter.Tk()\r
+        Pmw.initialise(root)\r
+        try:\r
+            principal = Config(root)\r
+            root.mainloop()\r
+        except Exception,e:\r
+            print "Erreur non prévue rencontrée : ",str(e)\r
+            print "Veuillez prévenir la maintenance"\r
+            sys.exit()\r
index 40975a2d96f828b5e65a94c32a69d7ade8a240d1..4c742a6a6d30900d7add31652f4334c729efdfd8 100755 (executable)
@@ -3,6 +3,8 @@
 import Accas
 from Accas import *
 
+#CONTEXT.debug=1
+
 import ops
 
 JdC = JDC_CATA(code='SATURNE',
@@ -11,13 +13,21 @@ JdC = JDC_CATA(code='SATURNE',
                          AU_MOINS_UN('FIN'),
                          A_CLASSER(('DEBUT','POURSUITE'),'FIN')
                         )
-              );
+              )
 
 # P. RASCLE MMN
 # remarques diverses sur le catalogue Saturne
 # - dans les blocs, il faut au moins un mot clé de statut obligatoire
 # probleme de rafraichissement des blocs dépendants quand la valeur d'un mot cle global (ITURB) passe de 1 à 0
 
+# Type le plus general
+class entier  (ASSD):pass
+class reel    (ASSD):pass
+class complexe(ASSD):pass
+class liste   (ASSD):pass
+class chaine  (ASSD):pass
+
+
 class sonde(ASSD):pass
 class varsca(ASSD):pass
 class flusca(ASSD):pass
@@ -36,7 +46,35 @@ class tsr23(ASSD):pass
 class resti(ASSD):pass
 
 class maillage(ASSD):pass
-class listr8          (ASSD):pass
+class modele(ASSD):pass
+class matr_asse(ASSD):pass
+class cham_elem_sief_r(ASSD):pass
+class theta_geom(ASSD):pass
+class cham_mater(ASSD):pass
+class cara_elem(ASSD):pass
+class char_ther(ASSD):pass
+class char_meca(ASSD):pass
+class nume_ddl(ASSD):pass
+class char_acou(ASSD):pass
+class listr8 (ASSD):pass
+class matr_elem(ASSD):pass
+class matr_elem_depl_c(matr_elem):pass
+class matr_elem_depl_r(matr_elem):pass
+class matr_elem_pres_c(matr_elem):pass
+class matr_elem_temp_r(matr_elem):pass
+
+# matr_asse :
+#--------------------------------
+class matr_asse(ASSD):pass
+class matr_asse_depl_c(matr_asse):pass
+class matr_asse_depl_r(matr_asse):pass
+class matr_asse_gene_r(matr_asse):pass
+class matr_asse_gene_c(matr_asse):pass
+class matr_asse_pres_c(matr_asse):pass
+class matr_asse_pres_r(matr_asse):pass
+class matr_asse_temp_c(matr_asse):pass
+class matr_asse_temp_r(matr_asse):pass
+
 
 # fin entete
 
@@ -101,6 +139,33 @@ FORMULE = FORM( nom='FORMULE',op=-5,sd_prod=fonction,
                 COMPLEXE = SIMP(typ = 'shell',max=1),
 ) ;
 
+AFFE_MODELE=OPER(nom="AFFE_MODELE",op=18,sd_prod=modele,docu="U4.41.01-f1",
+                 fr="Affectation des éléments finis sur le maillage",reentrant='n',
+         MAILLAGE        =SIMP(statut='o',typ=(maillage) ),
+         INFO            =SIMP(statut='f',typ='I',defaut=1,into=(1,2) ),
+         VERIF           =SIMP(statut='f',typ='TXM',max=2,into=("MAILLE","NOEUD") ),
+                );
+NUME_DDL=OPER(nom="NUME_DDL",op=11,sd_prod=nume_ddl,docu="U4.61.11-f",reentrant='n',
+              fr="Etablissement de la numérotation des ddl avec ou sans renumérotation et du stockage de la matrice",
+         MATR_RIGI       =SIMP(statut='f',typ=(matr_elem_depl_r ,matr_elem_depl_c,
+                                               matr_elem_temp_r,matr_elem_pres_c),max=100 ),
+         MODELE          =SIMP(statut='f',typ=modele ),
+         b_modele        =BLOC(condition = "MODELE != None",
+           CHARGE     =SIMP(statut='f',max='**',typ=(char_meca,char_ther,char_acou, ),),
+         ),
+         METHODE         =SIMP(statut='f',typ='TXM',defaut="MULT_FRONT",into=("MULT_FRONT","LDLT","GCPC") ),
+         b_mult_front    =BLOC(condition="METHODE=='MULT_FRONT'",fr="paramètres associés à la méthode multifrontale",
+           RENUM           =SIMP(statut='f',typ='TXM',into=("MD","MDA","METIS"),defaut="METIS" ),
+         ),
+         b_ldlt          =BLOC(condition="METHODE=='LDLT'",fr="paramètres associés à la méthode LDLT",
+           RENUM           =SIMP(statut='f',typ='TXM',into=("RCMK","SANS"),defaut="RCMK"  ),
+         ),
+         b_gcpc          =BLOC(condition="METHODE=='GCPC'",fr="paramètres associés à la méthode gradient conjugué",
+           RENUM           =SIMP(statut='f',typ='TXM',into=("RCMK","SANS"),defaut="RCMK"  ),
+         ),
+         INFO            =SIMP(statut='f',typ='I',into=(1,2)),
+)  ;
+
 DEFI_SONDE = OPER(nom="DEFI_SONDE",op= 1,sd_prod=sonde,
      docu="U2D1",
      fr="définition d'une sonde historique avec ses coordonnées",
@@ -1229,3 +1294,258 @@ FIN=PROC(nom="FIN",op=9999,repetable='n',fr="Fin d'une 
 )  ;
 
 
+def macro_matr_asse_ops(self,MODELE,CHAM_MATER,CARA_ELEM,MATR_ASSE,
+                        SOLVEUR,NUME_DDL,CHARGE,INST,**args):
+  """
+     Ecriture de la macro MACRO_MATR_ASSE
+  """
+  ier=0
+  # On met le mot cle NUME_DDL dans une variable locale pour le proteger
+  numeddl=NUME_DDL
+  # On importe les definitions des commandes a utiliser dans la macro
+  # Le nom de la variable doit etre obligatoirement le nom de la commande
+  CALC_MATR_ELEM=self.get_cmd('CALC_MATR_ELEM')
+  NUME_DDL      =self.get_cmd('NUME_DDL')
+  ASSE_MATRICE  =self.get_cmd('ASSE_MATRICE')
+  # La macro compte pour 1 dans la numerotation des commandes
+  self.icmd=1
+
+  if SOLVEUR:
+    methode=SOLVEUR['METHODE']
+    if methode=='LDLT':
+      if SOLVEUR['RENUM']:
+         renum=SOLVEUR['RENUM']
+      else:
+         renum='RCMK'
+      if renum not in ('SANS','RCMK'):
+        ier=ier+1
+        self.cr.fatal("Avec methode LDLT, RENUM doit etre SANS ou RCMK.")
+        return ier
+    elif methode=='MULT_FRONT':
+      if SOLVEUR['RENUM']:
+         renum=SOLVEUR['RENUM']
+      else:
+         renum='MDA'
+      if renum not in ('MDA','MD','METIS'):
+        ier=ier+1
+        self.cr.fatal("Avec methode MULT_FRONT, RENUM doit etre MDA, MD ou RCMK.")
+        return ier
+    elif methode=='GCPC':
+      if SOLVEUR['RENUM']:
+         renum=SOLVEUR['RENUM']
+      else:
+         renum='SANS'
+      if renum not in ('SANS','RCMK'):
+        ier=ier+1
+        self.cr.fatal("Avec methode GCPC, RENUM doit etre SANS ou RCMK.")
+        return ier
+  else:
+    methode='MULT_FRONT'
+    renum  ='MDA'
+
+  if numeddl in self.sdprods:
+    # Si le concept numeddl est dans self.sdprods
+    # il doit etre  produit par la macro
+    # il faudra donc appeler la commande NUME_DDL
+    lnume = 1
+  else:
+    lnume = 0
+  lrigel = 0
+  lmasel = 0
+
+  iocc=0
+  for m in MATR_ASSE:
+    iocc=iocc+1
+    option=m['OPTION']
+    if iocc == 1 and lnume == 1 and option not in ('RIGI_MECA','RIGI_MECA_LAGR',
+                                                   'RIGI_THER','RIGI_ACOU')      :
+      ier=ier+1
+      self.cr.fatal("LA PREMIERE OPTION DOIT ETRE RIGI_MECA OU RIGI_THER OU RIGI_ACOU OU RIGI_MECA_LAGR")
+      return ier
+
+    if m['SIEF_ELGA']!=None and option!='RIGI_GEOM':
+      ier=ier+1
+      self.cr.fatal("SIEF_ELGA N EST ADMIS QU AVEC L OPTION RIGI_GEOM")
+      return ier
+
+    if m['MODE_FOURIER']!=None and option not in ('RIGI_MECA','RIGI_FLUI_STRU','RIGI_THER'):
+      ier=ier+1
+      self.cr.fatal("MODE_FOURIER N EST ADMIS QU AVEC UNE DES OPTIONS RIGI_MECA RIGI_FLUI_STRU RIGI_THER")
+      return ier
+
+    if (m['THETA']!=None or m['PROPAGATION']!=None) and option!='RIGI_MECA_LAGR':
+      ier=ier+1
+      self.cr.fatal("PROPAGATION ET,OU THETA NE SONT ADMIS QU AVEC L OPTION RIGI_MECA_LAGR")
+      return ier
+    motscles={'OPTION':option}
+    if option == 'AMOR_MECA':
+       if (not lrigel or not lmasel):
+          ier=ier+1
+          self.cr.fatal("""POUR CALCULER AMOR_MECA, IL FAUT AVOIR CALCULE
+                           RIGI_MECA ET MASS_MECA AUPARAVANT (DANS LE MEME APPEL)""")
+          return ier
+       if CHAM_MATER != None:
+          motscles['RIGI_MECA']   =rigel
+          motscles['MASS_MECA']   =masel
+    if CHARGE     != None:
+       if option[0:9] not in ('MASS_THER','RIGI_GEOM','MASS_ID_M'):
+                           motscles['CHARGE']      =CHARGE
+    if CHAM_MATER != None: motscles['CHAM_MATER']  =CHAM_MATER
+    if CARA_ELEM  != None: motscles['CARA_ELEM']   =CARA_ELEM
+    if INST       != None: motscles['INST']        =INST
+    if m['SIEF_ELGA']   :  motscles['SIEF_ELGA']   =m['SIEF_ELGA']
+    if m['MODE_FOURIER']:  motscles['MODE_FOURIER']=m['MODE_FOURIER']
+    if m['THETA']       :  motscles['THETA']       =m['THETA']
+    if m['PROPAGATION'] :  motscles['PROPAGATION'] =m['PROPAGATION']
+    __a=CALC_MATR_ELEM(MODELE=MODELE,**motscles)
+
+    if option == 'RIGI_MECA':
+      rigel  = __a
+      lrigel = 1
+    if option == 'MASS_MECA':
+      masel  = __a
+      lmasel = 1
+
+    if lnume and option in ('RIGI_MECA','RIGI_THER','RIGI_ACOU','RIGI_MECA_LAGR'):
+      self.DeclareOut('num',numeddl)
+      # On peut passer des mots cles egaux a None. Ils sont ignores
+      num=NUME_DDL(MATR_RIGI=__a,METHODE=methode,RENUM=renum)
+    else:
+      num=numeddl
+
+    self.DeclareOut('mm',m['MATRICE'])
+    mm=ASSE_MATRICE(MATR_ELEM=__a,NUME_DDL=num)
+  return ier
+
+def macro_matr_asse_prod(self,NUME_DDL,MATR_ASSE,**args):
+  if not MATR_ASSE:  raise AsException("Impossible de typer les concepts resultats")
+  if not NUME_DDL:  raise AsException("Impossible de typer les concepts resultats")
+  self.type_sdprod(NUME_DDL,nume_ddl)
+  for m in MATR_ASSE:
+    opti=m['OPTION']
+
+    if opti in ( "RIGI_MECA","RIGI_FLUI_STRU","RIGI_MECA_LAGR" ,
+       "MASS_MECA" , "MASS_FLUI_STRU" ,"RIGI_GEOM" ,"RIGI_ROTA",
+       "AMOR_MECA","IMPE_MECA","MASS_ID_MDEP_R","MASS_ID_MDNS_R",
+       "ONDE_FLUI","MASS_MECA_DIAG" ) : t=matr_asse_depl_r
+
+    if opti in ( "RIGI_ACOU","MASS_ACOU","AMOR_ACOU",) : t=matr_asse_pres_c
+
+    if opti in ( "RIGI_THER","MASS_THER","RIGI_THER_CONV" ,
+       "RIGI_THER_CONV_D","MASS_ID_MTEM_R","MASS_ID_MTNS_R",) : t=matr_asse_temp_r
+
+    if opti == "RIGI_MECA_HYST"   : t= matr_asse_depl_c
+
+    self.type_sdprod(m['MATRICE'],t)
+  return None
+
+MACRO_MATR_ASSE=MACRO(nom="MACRO_MATR_ASSE",op=macro_matr_asse_ops,docu="U4.61.21-c",
+                      sd_prod=macro_matr_asse_prod,
+                      fr="Calcul des matrices assemblées (matr_asse_gd) par exemple de rigidité, de masse ",
+         MODELE          =SIMP(statut='o',typ=modele),
+         CHAM_MATER      =SIMP(statut='f',typ=cham_mater),
+         CARA_ELEM       =SIMP(statut='f',typ=cara_elem),
+         CHARGE          =SIMP(statut='f',typ=(char_meca,char_ther,char_acou)),
+         INST            =SIMP(statut='f',typ='R'),
+         NUME_DDL        =SIMP(statut='o',typ=(nume_ddl,CO)),
+         SOLVEUR         =FACT(statut='d',min=01,max=01,
+           METHODE         =SIMP(statut='f',typ='TXM',defaut="MULT_FRONT",
+                                 into=("LDLT","MULT_FRONT","GCPC")),
+           RENUM           =SIMP(statut='f',typ='TXM',into=("SANS","RCMK","MD","MDA","METIS")),
+         ),
+         MATR_ASSE       =FACT(statut='o',min=01,max='**',
+           MATRICE         =SIMP(statut='o',typ=(matr_asse,CO)),
+           OPTION          =SIMP(statut='o',typ='TXM',
+                                 into=("RIGI_MECA","MASS_MECA","MASS_MECA_DIAG",
+                                       "AMOR_MECA","RIGI_MECA_HYST","IMPE_MECA",
+                                       "ONDE_FLUI","RIGI_FLUI_STRU","MASS_FLUI_STRU",
+                                       "RIGI_ROTA","RIGI_GEOM","RIGI_MECA_LAGR",
+                                       "RIGI_THER","MASS_THER",
+                                       "RIGI_ACOU","MASS_ACOU","AMOR_ACOU",
+                                       "MASS_ID_MTEM_R","MASS_ID_MTNS_R","MASS_ID_MDEP_R","MASS_ID_MDNS_R",)
+                                 ),
+           SIEF_ELGA       =SIMP(statut='f',typ=cham_elem_sief_r),
+           MODE_FOURIER    =SIMP(statut='f',typ='I'),
+           THETA           =SIMP(statut='f',typ=theta_geom),
+           PROPAGATION     =SIMP(statut='f',typ='R'),
+         ),
+         TITRE           =SIMP(statut='f',typ='TXM',max='**'),
+         INFO            =SIMP(statut='f',typ='I',defaut=1,into=(1,2)),
+)  ;
+
+
+def defi_valeur_prod(self,IS=None,R8=None,TX=None,C8=None,LS=None):
+  if IS != None  : return entier
+  if R8 != None  : return reel
+  if TX != None  : return chaine
+  if C8 != None  : return complexe
+  if LS != None  : return liste
+  raise AsException("type de concept resultat non prevu")
+
+DEFI_VALEUR=MACRO(nom="DEFI_VALEUR",op=-4,sd_prod=defi_valeur_prod,
+                 fr="Affectation d une valeur à une variable Superviseur",
+                 docu="U4.31.04-e1",reentrant='f',
+         regles=(UN_PARMI('IS','R8','TX','C8','LS'),),
+         IS              =SIMP(statut='f',typ='I',max='**'),
+         R8              =SIMP(statut='f',typ='R',max='**'),
+         TX              =SIMP(statut='f',typ='TXM',max='**'),
+         C8              =SIMP(statut='f',typ='C',max='**'),
+         LS              =SIMP(statut='f',typ='L',max='**'),
+)  ;
+
+def macro2_prod(self,MODELE,**args):
+   return maillage
+
+MACRO2 =MACRO(nom="MACRO2",op= -5 ,docu="U4.61.21-c",
+                      sd_prod=macro2_prod,
+                      fr="Calcul des matrices assemblées (matr_asse_gd) par exemple de rigidité, de masse ",
+         MODELE          =SIMP(statut='o',typ=modele),
+);
+
+class concept(ASSD):pass
+
+def op1_prod(x,**args):
+   if x == 0:return concept
+   if x == 1:return concept
+   raise AsException("type de concept resultat non prevu")
+
+OP1 = OPER(nom='OP1',op=1,sd_prod=op1_prod,reentrant='f',
+           a=SIMP(statut='o',typ='I',into=(0,1,2)),
+           b=SIMP(typ=concept),
+           ccc=FACT(statut='d',d=SIMP(typ='I'),e=SIMP(typ='I')),
+           b_1=BLOC(condition="a==0",
+                    x=SIMP(statut='o',typ='I',into=(0,1)),
+                    c=FACT(d=SIMP(typ='I'),e=SIMP(typ='I')),
+                   ),
+           b_2=BLOC(condition="a==1",
+                    x=SIMP(statut='o',typ='I',into=(0,1)),
+                    b_2=BLOC(condition="1",
+                             cc=FACT(d=SIMP(typ='I'),e=SIMP(typ='I')),
+                             c=FACT(d=SIMP(typ='I'),e=SIMP(typ='I')),
+                            ),
+                   ),
+          );
+
+
+def op2_prod(self,x,**args):
+   if x == 0:return concept
+   if x == 1:return concept
+   raise AsException("type de concept resultat non prevu")
+
+OP2 = MACRO(nom='OP2',op=1,sd_prod=op2_prod,reentrant='f',
+           a=SIMP(statut='o',typ='I',into=(0,1,2)),
+           b=SIMP(typ=concept),
+           ccc=FACT(statut='d',d=SIMP(typ='I'),e=SIMP(typ='I')),
+           b_1=BLOC(condition="a==0",
+                    x=SIMP(statut='o',typ='I',into=(0,1)),
+                    c=FACT(d=SIMP(typ='I'),e=SIMP(typ='I')),
+                   ),
+           b_2=BLOC(condition="a==1",
+                    x=SIMP(statut='o',typ='I',into=(0,1)),
+                    b_2=BLOC(condition="1",
+                             cc=FACT(d=SIMP(typ='I'),e=SIMP(typ='I')),
+                             c=FACT(d=SIMP(typ='I'),e=SIMP(typ='I')),
+                            ),
+                   ),
+          );
+
index c8a97ac187baac5665176a2de6b5a8cfec4eb320..281ccc8ef1b5c3ae9e328d667e0ce3b8c1047336 100755 (executable)
@@ -3,19 +3,44 @@
     Ce module sert à lancer EFICAS configuré pour Code_Mini
 """
 # Modules Python
-import sys
+import sys,os
 
 # Modules Eficas
 import prefs
 sys.path[:0]=[prefs.INSTALLDIR]
 
+args=sys.argv[1:]
+for a in args:
+   if a == "-display":
+      os.environ['DISPLAY']=args[args.index("-display")+1]
+
 import Editeur
 from Editeur import eficas_go
 
-if len(sys.argv) > 1 :
-    # on veut ouvrir un fichier directement au lancement d'Eficas
-    eficas_go.lance_eficas(code='SATURNE',fichier = sys.argv[1])
+def main():
+   if len(sys.argv) > 1 :
+       # on veut ouvrir un fichier directement au lancement d'Eficas
+       eficas_go.lance_eficas(code='SATURNE',fichier = sys.argv[1])
+   else:
+       # on veut ouvrir Eficas 'vide'
+       eficas_go.lance_eficas(code='SATURNE')
+
+def hidez():
+   from Misc import Cyclops
+   z = Cyclops.CycleFinder()
+   z.run(main)
+   z.find_cycles()
+   z.show_stats()
+   z.show_cycles()
+   # z.show_cycleobjs()
+   # z.show_sccs()
+   z.show_arcs()
+
+withCyclops=0
+
+if withCyclops:
+   hidez()
 else:
-    # on veut ouvrir Eficas 'vide'
-    eficas_go.lance_eficas(code='SATURNE')
+   main()
+
 
index f3d82ae82ca0c1fd12e7aeb21ce229035306274d..57be183f0c7f654bf8753a15cc7cf77f19768a4d 100644 (file)
@@ -14,8 +14,13 @@ INSTALLDIR=os.path.join(REPINI,'..')
 # Peut valoir None (defaut)
 CODE_PATH = None
 #CODE_PATH = os.path.join(REPINI,'../../Superv')
+#CODE_PATH = "/home01/chris/projet_Eficas/Devel/SUPER6_3/Aster6_3/bibpyt"
 
 # ICONDIR sert à localiser le répertoire contenant les icones
 # Par défaut on utilise le répertoire icons dans Editeur
 ICONDIR=os.path.join(INSTALLDIR,'Editeur','icons')
 
+# lang indique la langue utilisée pour les chaines d'aide : fr ou ang
+lang='fr'
+
+
index 5aa383619b4c8d702ed3e75f47c156807b45569d..c02c26f8280ce548f0a24c9a6c5ce4acfb28cd54 100644 (file)
@@ -85,7 +85,7 @@ class MACRO(N_ENTITE.ENTITE):
    nommage = nommage
 
    def __init__(self,nom,op,sd_prod=None,reentrant='n',repetable='o',fr="",ang="",
-                docu="",regles=(),op_init=None,niveau = None,fichier_ini=0,**args):
+                docu="",regles=(),op_init=None,niveau = None,fichier_ini=0,UIinfo=None,**args):
       """
          Méthode d'initialisation de l'objet MACRO. Les arguments sont utilisés pour initialiser
          les attributs de meme nom
@@ -125,6 +125,7 @@ class MACRO(N_ENTITE.ENTITE):
       else:
          self.niveau=current_cata.get_niveau(niveau)
          self.niveau.enregistre(self)
+      self.UIinfo=UIinfo
       self.affecter_parente()
 
    def __call__(self,reuse=None,**args):
index dd9812e839474d17733fb2d80524e6c4f78e7c8c..2f71378786122ff8ce1e4ac50f7d2eaec20a28a2 100644 (file)
@@ -85,7 +85,7 @@ class OPER(N_ENTITE.ENTITE):
    nommage = nommage
 
    def __init__(self,nom,op,sd_prod,reentrant='n',repetable='o',fr="",ang="",
-                docu="",regles=(),op_init=None,niveau = None,**args):
+                docu="",regles=(),op_init=None,niveau = None,UIinfo=None,**args):
       """
          Méthode d'initialisation de l'objet OPER. Les arguments sont utilisés pour initialiser
          les attributs de meme nom
@@ -112,6 +112,7 @@ class OPER(N_ENTITE.ENTITE):
       else:
          self.niveau=current_cata.get_niveau(niveau)
          self.niveau.enregistre(self)
+      self.UIinfo=UIinfo
       self.affecter_parente()
 
    def __call__(self,reuse=None,**args):
index 173070fb25fe7d4c5ad5394c6e0016d4420b6d2a..e80106633b8f23a931c65e8811a37a170cfffd1e 100644 (file)
@@ -79,7 +79,7 @@ class PROC(N_ENTITE.ENTITE):
    label = 'PROC'
 
    def __init__(self,nom,op,reentrant='n',repetable='o',fr="",ang="",
-                docu="",regles=(),op_init=None,niveau = None,**args):
+                docu="",regles=(),op_init=None,niveau = None,UIinfo=None,**args):
       """
          Méthode d'initialisation de l'objet PROC. Les arguments sont utilisés pour initialiser
          les attributs de meme nom
@@ -105,6 +105,7 @@ class PROC(N_ENTITE.ENTITE):
       else:
          self.niveau=current_cata.get_niveau(niveau)
          self.niveau.enregistre(self)
+      self.UIinfo=UIinfo
       self.affecter_parente()
 
    def __call__(self,**args):
index ed24d3cfe26df6594861f3418a062f1a395f63c3..c14833ec50d9aa0ccf268fc2c7dc1fefc3b9e3e0 100644 (file)
@@ -19,4 +19,7 @@ CODE_PATH = None
 # Par défaut on utilise le répertoire icons dans Editeur
 ICONDIR=os.path.join(INSTALLDIR,'Editeur','icons')
 
+# lang indique la langue utilisée pour les chaines d'aide : fr ou ang
+lang='fr'
+
 
diff --git a/Syrthes/cata_syrthes.py b/Syrthes/cata_syrthes.py
new file mode 100755 (executable)
index 0000000..43113e9
--- /dev/null
@@ -0,0 +1,243 @@
+# debut entete
+import Accas
+from Accas import *
+#
+JdC = JDC_CATA(code='SYRTHES',
+               execmodul=None,
+               niveaux=(NIVEAU(nom='generalites',label='Généralités',valide_vide=0),
+                        NIVEAU(nom='gest_calc',label='Gestion du calcul',valide_vide=0,actif="generalites == 1"),
+                        NIVEAU(nom='gest_sort',label='Gestion des sorties'),
+                        NIVEAU(nom='choix_num',label='Choix numériques',valide_vide=0),\r
+                        NIVEAU(nom='prop_phys',label='Propriétés physiques',valide_vide=0,actif='choix_num==1'),\r
+                        NIVEAU(nom='cond_init',label='Conditions initiales',valide_vide=0,actif='prop_phys==1'),\r
+                        NIVEAU(nom='cond_limi',label='Conditions aux limites',valide_vide=0,actif='cond_init==1'),\r
+                        NIVEAU(nom='flux_volu',label='Flux volumiques',valide_vide=0,actif='cond_limi==1'),\r
+                        NIVEAU(nom='soli_mouv',label='Solides en mouvement'),\r
+                        NIVEAU(nom='couplages',label='Couplages'),\r
+                        NIVEAU(nom='rayonnement',label='Rayonnement',valide_vide=0,actif='flux_volu==1'),\r
+                        NIVEAU(nom='cond_lim_ray',label='Conditions limites rayonnement',valide_vide=0,actif='rayonnement==1'),\r
+                        NIVEAU(nom='in_out_ray',label='Entrées/Sorties rayonnement',valide_vide=0,actif='rayonnement==1'),\r
+                        NIVEAU(nom='fichiers',label='Fichiers pour le calcul'))
+               )
+
+
+GENERALITES = PROC(nom='GENERALITES',op=10,\r
+                   fr="Définition des principales options du calcul",\r
+                   niveau='generalites',
+                   TYPE_DE_CALCUL=SIMP(typ='TXM',\r
+                                       statut='o',\r
+                                       into=('Syrthes thermique solide seule','Syrthes couplé'),\r
+                                       defaut='Syrthes thermique solide seule',\r
+                                       position='global_jdc'),
+                   TITRE = SIMP(statut='f',typ='TXM'),
+                   DIMENSION = SIMP(statut='o',\r
+                                    typ='I',\r
+                                    into=(2,3),\r
+                                    defaut=2,\r
+                                    position='global_jdc'),
+                   b_axys = BLOC(condition="TYPE_DE_CALCUL=='Syrthes thermique solide seule'",\r
+                                 AXE_SYMETRIE = SIMP(statut='o',\r
+                                                     typ='TXM',\r
+                                                     into=('AUCUN','OX','OY'),\r
+                                                     defaut='AUCUN')));\r
+\r
+GESTION_DU_CALCUL = PROC(nom='GESTION_DU_CALCUL',op=10,\r
+                         fr="Gestion des pas de temps et éventuellement du couplage fluide/solide",\r
+                         niveau='gest_calc',\r
+                         CALCUL_SYRTHES_SEUL = BLOC(condition="TYPE_DE_CALCUL == 'Syrthes thermique solide seule'",\r
+                                                    PAS_DE_TEMPS_SOLIDE = SIMP(typ='I',statut='o'),\r
+                                                    NB_PAS_DE_TEMPS = SIMP(typ='I',statut='o'),\r
+                                                    SUITE_DE_CALCUL = SIMP(typ='TXM',statut='o',into=('OUI','NON'),defaut='NON')),\r
+                         CALCUL_SYRTHES_COUPLE = BLOC(condition="TYPE_DE_CALCUL =='Syrthes couplé'",\r
+                                                      CORRESPONDANCE_MAILLAGES_F_S = SIMP(statut='o',\r
+                                                                                          typ='TXM',\r
+                                                                                          into=('calcul','lecture sur fichier','calcul et écriture sur fichier'),\r
+                                                                                          defaut='calcul et écriture sur fichier'),\r
+                                                      PAS_DE_TEMPS_SOLIDE = SIMP(typ='TXM',\r
+                                                                                 statut='o',\r
+                                                                                 into=('fixé indépendamment','égal à celui du fluide'),\r
+                                                                                 defaut='égal à celui du fluide'),\r
+                                                      CHOIX_FREQUENCE_CALCUL_SOLIDE = SIMP(typ='TXM',\r
+                                                                                     statut='o',\r
+                                                                                     into=('calcul solide à chaque pas de temps',\r
+                                                                                           'calcul solide tous les n pas de temps fluide',\r
+                                                                                           'calcul fluide tous les n pas de temps solide'),\r
+                                                                                     defaut='calcul solide à chaque pas de temps'),\r
+                                                      frequence_calcul = BLOC(condition="CHOIX_FREQUENCE_CALCUL_SOLIDE != 'calcul solide à chaque pas de temps'",\r
+                                                                              FREQUENCE = SIMP(statut='o',\r
+                                                                                               typ='I')))\r
+                                                      \r
+                       );\r
+\r
+GESTION_DES_SORTIES = PROC(nom="GESTION_DES_SORTIES",op=10,\r
+                           fr="Gestion des résultats du code",\r
+                           niveau='gest_sort',\r
+                           IMPRESSIONS_SOLIDE=SIMP(statut='o',typ='TXM',\r
+                                                   into=('aucune','minimales','normales','détaillées'),\r
+                                                   defaut='normales'),\r
+                           RESULTATS_DOMAINE_SOLIDE=FACT(statut='o',\r
+                                                         FICHIER_CHRONOLOGIQUE=SIMP(typ='TXM',statut='o',\r
+                                                                                    into=('aucune sortie','tous les n pas de temps'),\r
+                                                                                    defaut='aucune sortie'),\r
+                                                         pas_de_temps=BLOC(condition="FICHIER_CHRONOLOGIQUE=='tous les n pas de temps'",\r
+                                                                           PAS_DE_TEMPS=SIMP(statut='o',typ='I')),\r
+                                                         FICHIER_LISTING=SIMP(statut='o',typ='TXM',\r
+                                                                              into=('aucune sortie',),\r
+                                                                              defaut='aucune sortie'),\r
+                                                         HISTORIQUE_SOLIDE=SIMP(statut='o',typ='TXM',\r
+                                                                                into=('OUI','NON'),\r
+                                                                                defaut='NON'),\r
+                                                         historique=BLOC(condition="HISTORIQUE_SOLIDE=='OUI'",\r
+                                                                         NOMBRE_CAPTEURS=SIMP(statut='o',typ='I'),\r
+                                                                         FREQUENCE_ECRITURE=SIMP(statut='o',typ='I',defaut=1),\r
+                                                                         LISTE_NOEUDS = FACT(statut='o',max='**',\r
+                                                                                             NOEUDS=SIMP(statut='o',max='**',typ='I'),\r
+                                                                                             COMMENTAIRE=SIMP(statut='o',typ='TXM',defaut=""))),\r
+                                                         ),\r
+                           RESULTATS_DOMAINE_FLUIDE=BLOC(condition="TYPE_DE_CALCUL=='Syrthes couplé'",\r
+                                                         ECRITURE_MAILLAGE_PEAU_FLUIDE=SIMP(statut='o',into=('OUI','NON'),\r
+                                                                                            defaut='NON',typ='TXM'),\r
+                                                         ECRITURE_RESULTATS_PEAU_FLUIDE=SIMP(statut='o',into=('OUI','NON'),\r
+                                                                                             defaut='NON',typ='TXM'),\r
+                                                         ECRITURE_CHRONO_PEAU_FLUIDE=SIMP(statut='o',into=('OUI','NON'),\r
+                                                                                          defaut='NON',typ='TXM'))\r
+                           );\r
+\r
+CHOIX_NUMERIQUES=PROC(nom="CHOIX_NUMERIQUES",op=10,\r
+                      fr="Modification des options du solveur",\r
+                      niveau='choix_num',\r
+                      SOLVEUR_SOLIDE = FACT(statut='o',\r
+                                            NOMBRE_ITERATIONS=SIMP(statut='o',typ='I'),\r
+                                            PRECISION=SIMP(statut='o',typ='R'))\r
+                      );\r
+\r
+PROPRIETES_PHYSIQUES=PROC(nom="PROPRIETES_PHYSIQUES",op=10,\r
+                          fr="Définition des propriétés physiques des matériaux",\r
+                          niveau='prop_phys',\r
+                          DEFINITION_PAR = SIMP(statut='o',typ='TXM',into=('NOEUD','ELEMENT','NOEUD PAR ELEMENT'),\r
+                                                defaut='ELEMENT'),\r
+                          ISOTROPIE = SIMP(statut='o', typ='TXM', into=('Matériaux isotropes',\r
+                                                                        'Matériaux anisotropes',\r
+                                                                        'Matériaux orthotropes'),\r
+                                           defaut='Matériaux isotropes'),\r
+                          proprietes_des_materiaux_isotropes = BLOC(condition="ISOTROPIE=='Mat\351riaux isotropes'",                          \r
+                              DEFINITION_MASSE_VOLUMIQUE=FACT(statut='o',max='**',\r
+                                                          MASSE_VOLUMIQUE = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM')),\r
+                              DEFINITION_CHALEUR_SPECIFIQUE=FACT(statut='o',max='**',\r
+                                                          CHALEUR_SPECIFIQUE = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM')),\r
+                              DEFINITION_CONDUCTIVITE_THERMIQUE=FACT(statut='o',max='**',\r
+                                                          CONDUCTIVITE_THERMIQUE = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM'))\r
+                                                                    ),\r
+                          proprietes_des_materiaux_orthotropes_2D = BLOC(condition="ISOTROPIE=='Mat\351riaux orthotropes' and DIMENSION==2",\r
+                              DEFINITION_MASSE_VOLUMIQUE=FACT(statut='o',max='**',\r
+                                                          MASSE_VOLUMIQUE = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM')),\r
+                              DEFINITION_CHALEUR_SPECIFIQUE=FACT(statut='o',max='**',\r
+                                                          CHALEUR_SPECIFIQUE = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM')),\r
+                              DEFINITION_CONDUCTIVITE_THERMIQUE=FACT(statut='o',max='**',\r
+                                                          CONDUCTIVITE_EN_X = SIMP(statut='o',typ='R'),\r
+                                                          CONDUCTIVITE_EN_Y = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM'))\r
+                                                                         ),\r
+                          proprietes_des_materiaux_orthotropes_3D = BLOC(condition="ISOTROPIE=='Mat\351riaux orthotropes' and DIMENSION==3",\r
+                              DEFINITION_MASSE_VOLUMIQUE=FACT(statut='o',max='**',\r
+                                                          MASSE_VOLUMIQUE = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM')),\r
+                              DEFINITION_CHALEUR_SPECIFIQUE=FACT(statut='o',max='**',\r
+                                                          CHALEUR_SPECIFIQUE = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM')),\r
+                              DEFINITION_CONDUCTIVITE_THERMIQUE=FACT(statut='o',max='**',\r
+                                                          CONDUCTIVITE_EN_X = SIMP(statut='o',typ='R'),\r
+                                                          CONDUCTIVITE_EN_Y = SIMP(statut='o',typ='R'),\r
+                                                          CONDUCTIVITE_EN_Z = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM'))\r
+                                                                         ),\r
+                          proprietes_des_materiaux_anisotropes_2D = BLOC(condition="ISOTROPIE=='Mat\351riaux anisotropes' and DIMENSION==2",\r
+                              DEFINITION_MASSE_VOLUMIQUE=FACT(statut='o',max='**',\r
+                                                          MASSE_VOLUMIQUE = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM')),\r
+                              DEFINITION_CHALEUR_SPECIFIQUE=FACT(statut='o',max='**',\r
+                                                          CHALEUR_SPECIFIQUE = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM')),\r
+                              DEFINITION_CONDUCTIVITE_THERMIQUE=FACT(statut='o',max='**',\r
+                                                          CONDUCTIVITE_EN_X = SIMP(statut='o',typ='R'),\r
+                                                          CONDUCTIVITE_EN_Y = SIMP(statut='o',typ='R'),\r
+                                                          ANGLE_SUIVANT_Z = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM'))\r
+                                                                         ),\r
+                          proprietes_des_materiaux_anisotropes_3D = BLOC(condition="ISOTROPIE=='Mat\351riaux anisotropes' and DIMENSION==3",\r
+                              DEFINITION_MASSE_VOLUMIQUE=FACT(statut='o',max='**',\r
+                                                          MASSE_VOLUMIQUE = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM')),\r
+                              DEFINITION_CHALEUR_SPECIFIQUE=FACT(statut='o',max='**',\r
+                                                          CHALEUR_SPECIFIQUE = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM')),\r
+                              DEFINITION_CONDUCTIVITE_THERMIQUE=FACT(statut='o',max='**',\r
+                                                          CONDUCTIVITE_EN_X = SIMP(statut='o',typ='R'),\r
+                                                          CONDUCTIVITE_EN_Y = SIMP(statut='o',typ='R'),\r
+                                                          CONDUCTIVITE_EN_Z = SIMP(statut='o',typ='R'),\r
+                                                          ANGLE_SUIVANT_X = SIMP(statut='o',typ='R'),\r
+                                                          ANGLE_SUIVANT_Y = SIMP(statut='o',typ='R'),\r
+                                                          ANGLE_SUIVANT_Z = SIMP(statut='o',typ='R'),\r
+                                                          REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                          COMMENTAIRES=SIMP(statut='f',typ='TXM'))\r
+                                                                         ),\r
+                          );\r
+\r
+CONDITIONS_INITIALES=PROC(nom="CONDITIONS_INITIALES",op=10,\r
+                          fr="Définition des conditions initiales",\r
+                          niveau='cond_init',\r
+                          Temperature_initiale = FACT(statut='o',max='**',\r
+                                                      TEMPERATURE = SIMP(typ='R',statut='o',defaut=20),\r
+                                                      REFERENCES = SIMP(statut='o',typ='I',max='**',defaut=-1),\r
+                                                      COMMENTAIRES = SIMP(statut='f',typ='TXM')\r
+                                                      )\r
+                          );\r
+\r
+\r
+CONDITIONS_LIMITES = PROC(nom='CONDITIONS_LIMITES',op=10,\r
+                          niveau='cond_limi',\r
+                          fr="Définition des conditions aux limites",\r
+                          NOEUD_OU_FACE = SIMP(statut='o',typ='TXM',into=('NOEUD','FACE'),defaut='FACE'),\r
+                          FLUX_SURFACIQUE=FACT(max='**',\r
+                                               FLUX=SIMP(statut='o',typ='R',defaut=0),\r
+                                               REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                               COMMENTAIRES = SIMP(statut='f',typ='TXM')\r
+                                               ),\r
+                          DIRICHLET=FACT(max='**',\r
+                                         TEMPERATURE=SIMP(statut='o',typ='R',defaut=20),\r
+                                         REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                         COMMENTAIRES = SIMP(statut='f',typ='TXM')\r
+                                         ),\r
+\r
+                          COEFFICIENT_ECHANGE=FACT(max='**',\r
+                                                   TEMPERATURE=SIMP(statut='o',typ='R',defaut=20),\r
+                                                   COEFFICIENT = SIMP(statut='o',typ='R',defaut=0),\r
+                                                   REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                   COMMENTAIRES = SIMP(statut='f',typ='TXM')\r
+                                                  ),\r
+                          RESISTANCE_CONTACT=FACT(max='**',\r
+                                                  RESISTANCE = SIMP(statut='o',typ='R',defaut=0),\r
+                                                  REFERENCES = SIMP(statut='o',typ='I',max='**'),\r
+                                                  COMMENTAIRES = SIMP(statut='f',typ='TXM')\r
+                                                 ),\r
+                         );
+
diff --git a/Syrthes/editeur.ini b/Syrthes/editeur.ini
new file mode 100644 (file)
index 0000000..b7ac132
--- /dev/null
@@ -0,0 +1,22 @@
+import os
+
+import prefs
+
+rep_cata = prefs.REPINI
+
+# Accès à la documentation 
+path_doc              = os.path.join(rep_cata,'..','Doc')
+exec_acrobat    =       "/usr/bin/acroread"
+# Utilisateur/Développeur
+isdeveloppeur   =       "NON"
+path_cata_dev   =       "/tmp/cata"
+# Répertoire temporaire
+rep_travail     =   "/tmp"
+
+# Choix des catalogues
+rep_mat="bidon"
+
+catalogues = (
+              ('SYRTHES','v1',os.path.join(rep_cata,'cata_syrthes.py'),'python','defaut'),
+             )
+
diff --git a/Syrthes/eficas_syrthes.py b/Syrthes/eficas_syrthes.py
new file mode 100755 (executable)
index 0000000..7017644
--- /dev/null
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+"""
+    Ce module sert à lancer EFICAS configuré pour Syrthes
+"""
+# Modules Python
+import sys
+
+# Modules Eficas
+import prefs
+sys.path[:0]=[prefs.INSTALLDIR]
+
+import Editeur
+from Editeur import eficas_go
+
+if len(sys.argv) > 1 :
+    # on veut ouvrir un fichier directement au lancement d'Eficas
+    eficas_go.lance_eficas(code='SYRTHES',fichier = sys.argv[1])
+else:
+    # on veut ouvrir Eficas 'vide'
+    eficas_go.lance_eficas(code='SYRTHES')
+
diff --git a/Syrthes/prefs.py b/Syrthes/prefs.py
new file mode 100644 (file)
index 0000000..c14833e
--- /dev/null
@@ -0,0 +1,25 @@
+import os
+
+# REPINI sert à localiser le fichier editeur.ini
+# Obligatoire
+REPINI=os.path.dirname(os.path.abspath(__file__))
+
+# INSTALLDIR sert à localiser l'installation d'Eficas
+# Obligatoire
+INSTALLDIR=os.path.join(REPINI,'..')
+
+# CODE_PATH sert à localiser Noyau et Validation éventuellement
+# non contenus dans la distribution EFICAS
+# Par défaut on utilise les modules de INSTALLDIR
+# Peut valoir None (defaut)
+CODE_PATH = None
+#CODE_PATH = os.path.join(REPINI,'../../Superv')
+
+# ICONDIR sert à localiser le répertoire contenant les icones
+# Par défaut on utilise le répertoire icons dans Editeur
+ICONDIR=os.path.join(INSTALLDIR,'Editeur','icons')
+
+# lang indique la langue utilisée pour les chaines d'aide : fr ou ang
+lang='fr'
+
+
index 0366cee664334a2b3652d8c6e8f33e7b76a54f3c..c060d83394e96c5668775f4eb0ed934212ed0ffb 100644 (file)
@@ -1,8 +1,20 @@
-#@ MODIF __init__ Tools DATE 15/02/2001    AUTEUR YESSAYAN A.YESSAYAN
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 __all__=['foztools']
index 66ddd27c032117c95d0666cb905a47cbdf54530b..4cab28d511f64375c0bcac0696d52509b6d6edf4 100644 (file)
@@ -1,3 +1,23 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
 #!/bin/env python -d
 #!/tools/net/app/Python-1.5.2/bin/python1.5
 
index 96e6d4d337f6ab48896434c6428e6ec05ba0a59b..21ab883aaaed7a8add117f9a1db0b805c6ee8864 100644 (file)
@@ -1,3 +1,23 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
 try:
    import mx.TextTools
    import sys
index 8f9621c277e65c9768180ebc8b4d1f149eff4d78..646aef38f0195911663307df136fc8c59f6e956b 100644 (file)
@@ -1,17 +1,30 @@
-#@ MODIF conv Parsers  DATE 17/10/2001   AUTEUR DURAND C.DURAND 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
+
 import sys,string
 import TextTools
 from tables import ERRORS
 
 #
-__version__="$Name: V1_1p1 $"
-__Id__="$Id: conv.py,v 1.1.1.1 2001/12/04 15:38:23 eficas Exp $"
+__version__="$Name:  $"
+__Id__="$Id: conv.py,v 1.2 2002/05/15 15:32:00 eficas Exp $"
 #
 
 Keywords=('MAILLE_1','MAILLE_2','MAILLE_ESCL','MAILLE_FOND','MAILLE_MAIT','MAILLE_ORIG','MAILLE',
@@ -446,6 +459,8 @@ def format_errs(text,tags):
 def conver(text):
    from tables import aster_script
    import re
+   # On ajoute un '\n' en fin au cas ou il serait absent
+   text=text+'\n'
    text=string.upper(text)
    result, taglist, next = TextTools.tag(text,aster_script)
    # Pour vérifier les résultats intermédiaires décommenter la ligne suivante
index 513b001180fe9c4e735ad9197f4741e9a4b15307..b258354d0ead6d692f8e67a153ed6c9437317d6e 100644 (file)
@@ -1,4 +1,23 @@
-#@ MODIF tables Parsers DATE 15/02/2001    AUTEUR YESSAYAN A.YESSAYAN
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
 """
     Ce fichier définit une table de tags à utiliser avec le package
     mxTextTools pour décoder un fichier au format Asterv5.
@@ -10,7 +29,7 @@ from TextTools import *
 
 #
 __version__="$Name:  $"
-__Id__="$Id: tables.tag,v 1.11.18.1 2001/06/15 17:20:24 iliade Exp $"
+__Id__="$Id: tables.tag,v 1.1.1.1 2002/03/26 09:08:45 eficas Exp $"
 #
 
 err0='ERR0 , erreur non identifiee : '
@@ -24,9 +43,10 @@ err7='ERR7 , mot cle facteur errone : '
 err8='ERR8 , signe = ou ( attendu : '
 err9='ERR9 , ( attendue : '
 err10='ERR10 , vexpr attendue : '
+err11='ERR11 , ) attendue : '
 
 ERRORS=(err0,err1,err2,err3,err4,err5,err6,err7,err8,err9,
-        err10)
+        err10,err11)
 
 white_set=set(whitespace)
 
@@ -170,6 +190,16 @@ t_complexe = \
     (err7,Table,t_err,MatchFail,MatchOk),
   ))
 
+# Table pour identifier le keyword PI
+
+t_PI = \
+    ('PI',Table,(
+      (None,Word,'PI',MatchFail),
+      (None,IsIn,alpha+'_'+number,MatchOk,+1),
+      (None,Skip,-1),
+      (None,Jump,To,MatchFail),
+    ))
+
 t_vexpr = (
     ('par',Is,'(',+5,+1),
       commespaces     + (+1,),
@@ -181,7 +211,7 @@ t_vexpr = (
     ('sign',IsIn,'+-',+3,+1),
       commespaces     + (+1,),
       ('vexpr',Table,ThisTable,+19,+10),
-    ("PI",Word,'PI',+1,+9),
+    t_PI            + (+1,+9),
     t_ident         + (MatchFail,),
     commespaces     + (+1,),
     ('listpar',Is,'(',+6,+1), # on peut avoir une liste de parametres
@@ -307,9 +337,9 @@ t_formule = \
     commespaces     + (+1,),
     ('vexpr',Table,t_vexpr,+9),
     commespaces     + (+1,),
-    (None,Is,')',+8),
+    (None,Is,')',+9),
     commespaces     + (+1,),
-    (None,Is,')',+6),
+    (None,Is,')',+7),
     commespaces     + (+1,),
     (None,Is,';',+3),
     (None,AllNotIn,'\n',+1),
@@ -318,6 +348,8 @@ t_formule = \
     (err0,Table,t_err,MatchFail,MatchOk),
     # <err9>
     (err9,Table,t_err,MatchFail,MatchOk),
+    # <err11>
+    (err11,Table,t_err,MatchFail,MatchOk),
   ))
 
 t_nom_ope = \
index 2a28f0720dcf636f6029d6f39f064dcd28fecc52..309dd4977c393d539464e2318b5a95f858ead61b 100755 (executable)
@@ -1,4 +1,23 @@
-#@ MODIF tables Parsers DATE 15/02/2001    AUTEUR YESSAYAN A.YESSAYAN
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
+
 """
     Ce fichier définit une table de tags à utiliser avec le package
     mxTextTools pour décoder un fichier au format Asterv5.
@@ -10,7 +29,7 @@ from TextTools import *
 
 #
 __version__="$Name:  $"
-__Id__="$Id: tables.tag,v 1.11.18.1 2001/06/15 17:20:24 iliade Exp $"
+__Id__="$Id: tables.tag,v 1.1.1.1 2002/03/26 09:08:45 eficas Exp $"
 #
 
 err0='ERR0 , erreur non identifiee : '
@@ -24,9 +43,10 @@ err7='ERR7 , mot cle facteur errone : '
 err8='ERR8 , signe = ou ( attendu : '
 err9='ERR9 , ( attendue : '
 err10='ERR10 , vexpr attendue : '
+err11='ERR11 , ) attendue : '
 
 ERRORS=(err0,err1,err2,err3,err4,err5,err6,err7,err8,err9,
-        err10)
+        err10,err11)
 
 white_set=set(whitespace)
 
@@ -158,6 +178,15 @@ t_complexe is:
     <err>
     err7 = Table t_err F:MatchFail T:MatchOk
 
+# Table pour identifier le keyword PI
+
+t_PI is:
+    'PI' = Table is:
+      Word 'PI' F:MatchFail
+      IsIn alpha+'_'+number F:MatchOk T:next
+      Skip back
+      Jump To MatchFail
+
 t_vexpr = Table is:
     'par' = Is '(':
       commespaces F:next
@@ -169,7 +198,7 @@ t_vexpr = Table is:
     'sign' = IsIn '+-':
       commespaces F:next
       'vexpr' = Table ThisTable F:<err10> T:<op>
-    "PI" = Word 'PI' F:next T:<op>
+    t_PI              F:next T:<op>
     t_ident F:MatchFail
     commespaces F:next
     'listpar' = Is '(': # on peut avoir une liste de parametres
@@ -287,9 +316,9 @@ t_formule is:
     commespaces F:next
     'vexpr' = Table t_vexpr F:<err>
     commespaces F:next
-    Is ')' F:<err9>
+    Is ')' F:<err11>
     commespaces F:next
-    Is ')' F:<err9>
+    Is ')' F:<err11>
     commespaces F:next
     Is ';' F:<err>
     AllNotIn '\n' F:next
@@ -298,6 +327,8 @@ t_formule is:
     err0 = Table t_err F:MatchFail T:MatchOk
     <err9>
     err9 = Table t_err F:MatchFail T:MatchOk
+    <err11>
+    err11 = Table t_err F:MatchFail T:MatchOk
     
 t_nom_ope is:
     'nom_ope' = Table is:
index c6d52220576ad7ac4fbf36c54603b3134d7fc685..e731b26d3c70770e6bad2fdce79416df74c76792 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
    Ce package contient tous les convertisseurs de formats d'entrée
    en objets compréhensibles par EFICAS.
index 780626d8230974fc5fe114fd769330e09560aed3..e025eec22eb6f564c7ed8ddfb854b361a895590d 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient le plugin convertisseur de fichier
     au format asterv5 pour EFICAS.
index aa32a725c60ff54bae7170ab52a1c7e8b8de0ad6..811bc6a5b3021470e784160bfcb6cced07fdb52c 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient le plugin convertisseur de fichier
     au format ini pour EFICAS.
index 30f3b28a330082f77ca2fbd9979d7787206d98aa..b408ff215f5378f2180d856f69ce742656fcfe08 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient le plugin convertisseur de fichier
     au format python pour EFICAS.
index a5a69cb216917fe1060050ace2ee35ca1e47c737..cfe54a6a7c80c1ee352784cd67df0cd8046e55be 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient le plugin convertisseur de fichier
     au format python pour EFICAS.
index b999b6ba43044f72c0d059031f11988c8e96756e..b5a458973b2590ca6152374dc9a670479a715893 100644 (file)
@@ -1,9 +1,21 @@
-#@ MODIF parseur_python Parsers  DATE 05/09/2001   AUTEUR DURAND C.DURAND 
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
-#              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
-#              REDISTRIBUTION OF THIS FILE.
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
 # ======================================================================
 import sys,string,re
 
index d54d464cff17e2e5a829847b114863fc016c51ab..aaa531a5d0cb58638bd50111ede8c40190dd7077 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient la classe Formatage qui permet le formatage d'une 
     liste de chaines de caractères dans une syntaxe représentative d'un
index 89d4cb408e5c12ae06d2f30bf306a8472fd2307d..39110152d7d98beb78aacc647eadfb7c0ebeff1a 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
    Ce package contient tous les générateurs de formats de sortie
    à partir des objets d' EFICAS.
index c12b6dacce712f3454e4d227adec941f544f8753..25c3265f04e7f290ad9c40fbceb30bbaaf3e2ec7 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient le plugin generateur de fichier au format 
     aplat pour EFICAS.
@@ -268,7 +287,7 @@ class AplatGenerator:
       text = ''
       init = self.init + self.sep + obj.nom
       old_init=self.init
-      for data in self.data :
+      for data in obj.data :
         i=i+1
         self.init = init + self.sep + "occurrence n°"+`i`
         text = text + self.generator(data)
@@ -283,7 +302,7 @@ class AplatGenerator:
       if type(obj.valeur) in (types.TupleType,types.ListType) :
          # On est en présence d'une liste de valeur
          rep = '('
-         for val in self.valeur:
+         for val in obj.valeur:
            if type(val) == types.InstanceType :
              rep = rep + self.generator(val) +','
            else:
index fa3b94993c178ac786eb4f0427f7c4603d437b2d..08c178afed240d191f82b0970e47f100a3982ead 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient le plugin generateur de fichier au format asterv5 pour EFICAS.
 
@@ -347,7 +366,8 @@ class AsterGenerator:
           elif self.wait_geom(obj):
             s = s + val
           elif type(val) == types.FloatType :
-            s = s + self.repr_float(val)
+            #s = s + self.repr_float(val)
+            s = s + str(val)
           else :
             s = s + `val`
         s = s + ')'
@@ -364,7 +384,8 @@ class AsterGenerator:
         elif self.wait_geom(obj):
             s = obj.valeur
         elif type(obj.valeur) == types.FloatType :
-            s = self.repr_float(obj.valeur)
+            #s = self.repr_float(obj.valeur)
+            s = str(obj.valeur)
         else :
           s = `obj.valeur`
         s=obj.nom+':'+s+' '
index 64b5bfd851bc1241c22b91e20ba82e131295bb43..2e2ac93b0fc31a6ce05cc625298ff93d9c8be6fc 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient le plugin generateur de fichier
     au format ini pour EFICAS.
index 6d911224ae24843e58f373fc8d3660539215b9b5..34fa5cf726ec904a876bc5172d9278f18683971e 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient le plugin generateur de fichier au format pyth pour EFICAS.
 
index 6220c818ad9a0e74ff0d2bcd7815be2127cda33c..fe631f22fcca3b88ea7cb8711e5e3fc0adceef02 100644 (file)
@@ -1,3 +1,22 @@
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
+# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM 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
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+#
+#
+# ======================================================================
 """
     Ce module contient le plugin generateur de fichier au format 
     python pour EFICAS.
@@ -393,7 +412,7 @@ class PythonGenerator:
            for arg in liste :
              l.append(arg)
          else:
-           # on est en présence d'un MCSIMP : on récupère une string
+           # on est en présence d'un MCSIMP : on récupère une string
            text =self.generator(v)
            l.append(v.nom+'='+text)
       # il faut être plus subtil dans l'ajout de la virgule en différenciant 
@@ -453,6 +472,8 @@ class PythonGenerator:
             if hasattr(obj.etape,'sdprods'):
                if val in obj.etape.sdprods :
                   s = s + "CO('"+ self.generator(val) +"')"
+               elif val.__class__.__name__ == 'CO':
+                  s = s + "CO('"+ self.generator(val) +"')"
                else:
                   s = s + self.generator(val)
             elif isinstance(val,PARAMETRE):
@@ -461,6 +482,10 @@ class PythonGenerator:
                s = s + val.nom
             else:
                s = s + self.generator(val)
+          elif type(val) == types.FloatType :
+            # Pour un flottant on utilise str qui a une precision de
+            # "seulement" 12 chiffres : evite les flottants du genre 0.599999999999998
+            s = s + str(val)
           else :
             s = s + `val`
           s = s + ','
@@ -472,6 +497,8 @@ class PythonGenerator:
           if hasattr(obj.etape,'sdprods'):
              if val in obj.etape.sdprods :
                 s = "CO('"+ self.generator(val) +"')"
+             elif val.__class__.__name__ == 'CO':
+                s = "CO('"+ self.generator(val) +"')"
              else:
                 s = self.generator(val)
           elif isinstance(val,PARAMETRE):
@@ -481,9 +508,8 @@ class PythonGenerator:
           else:
              s = self.generator(val)
         elif type(val) == types.FloatType :
-          # Pour un réel on fait un formattage spécial
-          # XXX bizarrement ce n'est pas fait pour une liste
-          s = repr_float(val)
+          #s = repr_float(val)
+          s = str(val)
         else :
           s = `val`
         s= s + ','