From d31e5cc5dcda7a2006e1f29b37ace1ecddc1a91c Mon Sep 17 00:00:00 2001 From: eficas <> Date: Mon, 9 Sep 2002 10:39:06 +0000 Subject: [PATCH] CCAR: evolution demandee dans la fiche EO2001-066 : on peut specifier dans editeur.ini ou eficas.ini un repertoire d'ouverture pour le browser de fichiers avec la variable de configuration initialdir. Cette variable vaut $HOME/Eficas_install par defaut. On peut donner un nom absolu de repertoire ou os.curdir ('.') pour le repertoire de lancement d'EFICAS. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Evolution EO2001-064 réalisée : Scrollbar horizontal lorsque les listes sont longues. On ne tronque plus les listes trop longues. Dans la foulée, float_repr a été remplacé par str pour l'affichage des flottants. Correction d'un probleme avec isdeveloppeur = "OUI" Anomalie AO2001-474 "corrigée". Elle l'était déja probablement en 1.2 Evolution EO2001-111 traitée : la chaine fr ou an (selon la langue) s'affiche maintenant dans la fenetre info pour tous les objets : commandes, mots clés simples facteurs ... Adaptation d'EFICAS à l'évolution du noyau sur les commandes avec reuse --- Aster/editeur.ini | 2 + Aster/prefs.py | 5 ++- Editeur/Objecttreeitem.py | 5 +-- Editeur/appli.py | 39 ++++++++--------- Editeur/bureau.py | 12 +++--- Editeur/compomacro.py | 4 +- Editeur/compoproc.py | 2 +- Editeur/composimp.py | 3 +- Editeur/configuration.py | 18 +++++--- Editeur/eficas.py | 4 +- Editeur/jdcdisplay.py | 4 +- Editeur/readercata.py | 8 ++++ Editeur/toolbar.py | 4 +- Editeur/tooltip.py | 35 +++++++++++++++ Editeur/treewidget.py | 4 +- Editeur/utils.py | 50 +++++++++++++++++++++- Editeur/widgets.py | 3 +- Extensions/commentaire.py | 6 +++ Extensions/mcnuplet.py | 9 ++++ Ihm/I_ETAPE.py | 89 ++++++++++++++++++++++----------------- Ihm/I_MCCOMPO.py | 4 +- Ihm/I_MCLIST.py | 10 +++++ Ihm/I_MCSIMP.py | 20 +++++++-- Ihm/I_OBJECT.py | 11 +++++ 24 files changed, 259 insertions(+), 92 deletions(-) diff --git a/Aster/editeur.ini b/Aster/editeur.ini index d1774e59..d455d048 100644 --- a/Aster/editeur.ini +++ b/Aster/editeur.ini @@ -32,6 +32,8 @@ 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" diff --git a/Aster/prefs.py b/Aster/prefs.py index 816b25ca..7b70f11c 100644 --- a/Aster/prefs.py +++ b/Aster/prefs.py @@ -39,12 +39,15 @@ 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 an +lang='fr' + labels= ('Fichier','Edition','Jeu de commandes', # 'Catalogue','Browsers','Options' 'Aide', ) -extensions=['readercata','bureau', +appli_composants=['readercata','bureau', # 'browser','options' ] diff --git a/Editeur/Objecttreeitem.py b/Editeur/Objecttreeitem.py index 3a4d23b3..2ee01c7a 100644 --- a/Editeur/Objecttreeitem.py +++ b/Editeur/Objecttreeitem.py @@ -313,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 """ diff --git a/Editeur/appli.py b/Editeur/appli.py index 58cea476..1fce87ce 100644 --- a/Editeur/appli.py +++ b/Editeur/appli.py @@ -32,6 +32,7 @@ import Tkinter import splash import prefs import fontes +import tooltip VERSION="EFICAS v1.3" @@ -50,7 +51,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() @@ -90,18 +91,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 @@ -172,14 +173,14 @@ 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 fill_menus(self,appli_composant,defs): menudict=self.menubar.menudict for mname,itemlist in defs: menu=menudict.get(mname) @@ -189,7 +190,7 @@ class APPLI: menu.add_separator() else: label,method=item - command=getattr(extension,method) + command=getattr(appli_composant,method) menu.add_command(label=label,command=command) diff --git a/Editeur/bureau.py b/Editeur/bureau.py index cbbf0194..341ec3f7 100644 --- a/Editeur/bureau.py +++ b/Editeur/bureau.py @@ -34,7 +34,7 @@ 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 @@ -101,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 @@ -230,7 +230,8 @@ class BUREAU: 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", @@ -238,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 : @@ -363,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`) diff --git a/Editeur/compomacro.py b/Editeur/compomacro.py index 84f723e1..edbf840c 100644 --- a/Editeur/compomacro.py +++ b/Editeur/compomacro.py @@ -36,7 +36,7 @@ from widgets import Fenetre # __version__="$Name: $" -__Id__="$Id: compomacro.py,v 1.3 2002/04/05 06:32:38 eficas Exp $" +__Id__="$Id: compomacro.py,v 1.4 2002/05/15 15:31:58 eficas Exp $" # class MACROPanel(panels.OngletPanel): @@ -51,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') diff --git a/Editeur/compoproc.py b/Editeur/compoproc.py index 0fa5647d..88188816 100644 --- a/Editeur/compoproc.py +++ b/Editeur/compoproc.py @@ -31,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') diff --git a/Editeur/composimp.py b/Editeur/composimp.py index 9168f2d9..57e7c505 100644 --- a/Editeur/composimp.py +++ b/Editeur/composimp.py @@ -1269,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): """ diff --git a/Editeur/configuration.py b/Editeur/configuration.py index f63634c0..703ec6d4 100644 --- a/Editeur/configuration.py +++ b/Editeur/configuration.py @@ -74,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") @@ -100,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) @@ -113,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)) @@ -154,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): """ diff --git a/Editeur/eficas.py b/Editeur/eficas.py index a4da8d29..14419aae 100644 --- a/Editeur/eficas.py +++ b/Editeur/eficas.py @@ -37,9 +37,9 @@ from widgets import Fenetre class EFICAS(appli.APPLI): try: - from prefs import extensions + from prefs import appli_composants except: - extensions=['readercata','bureau','browser','options'] + appli_composants=['readercata','bureau','browser','options'] def get_texte_infos(self): texte=appli.APPLI.get_texte_infos(self) diff --git a/Editeur/jdcdisplay.py b/Editeur/jdcdisplay.py index 7c706069..0dba7773 100644 --- a/Editeur/jdcdisplay.py +++ b/Editeur/jdcdisplay.py @@ -72,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) + 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) diff --git a/Editeur/readercata.py b/Editeur/readercata.py index 0472c3f7..81423762 100644 --- a/Editeur/readercata.py +++ b/Editeur/readercata.py @@ -23,6 +23,7 @@ Il s'appuie sur la classe READERCATA """ # Modules Python +import time import os,sys,py_compile import traceback import cPickle @@ -36,6 +37,7 @@ import fontes import analyse_catalogue from Noyau.N_CR import CR from widgets import Fenetre +from utils import init_rep_cata_dev #import catabrowser @@ -96,17 +98,23 @@ 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) + print "Debut Retrouve_Ordre: ",time.clock() self.Retrouve_Ordre_Cata_Standard() + print "Fin Retrouve_Ordre: ",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) diff --git a/Editeur/toolbar.py b/Editeur/toolbar.py index bd93737a..938d47fa 100644 --- a/Editeur/toolbar.py +++ b/Editeur/toolbar.py @@ -156,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) @@ -165,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, diff --git a/Editeur/tooltip.py b/Editeur/tooltip.py index 18d03d58..752a57b7 100644 --- a/Editeur/tooltip.py +++ b/Editeur/tooltip.py @@ -23,6 +23,28 @@ """ 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): @@ -95,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("", aide) + label.pack() + root.mainloop() + diff --git a/Editeur/treewidget.py b/Editeur/treewidget.py index d7f63044..60a4c63a 100644 --- a/Editeur/treewidget.py +++ b/Editeur/treewidget.py @@ -26,7 +26,7 @@ import images # __version__="$Name: $" -__Id__="$Id: treewidget.py,v 1.4 2002/04/05 06:32:39 eficas Exp $" +__Id__="$Id: treewidget.py,v 1.5 2002/05/15 15:31:59 eficas Exp $" # Fonte_Standard = fontes.standard @@ -342,6 +342,8 @@ class Node : self.dehighlight() self.text_id = self.canvas.create_window(textx, texty,anchor="w", window=self.text) self.id.append(self.text_id) + # Redefinit la region de scroll du canvas pour inclure tous les items créés + self.tree.scrolledcanvas.resizescrollregion() def highlight(self,event=None): """ Met en surbrillance self""" diff --git a/Editeur/utils.py b/Editeur/utils.py index b3980a63..50a4797f 100644 --- a/Editeur/utils.py +++ b/Editeur/utils.py @@ -20,7 +20,9 @@ """ Ce module contient des utilitaires divers """ -import os +import os,re +import glob +import traceback def substract_list(liste1,liste2): """ @@ -88,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:] @@ -96,3 +98,47 @@ 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 + diff --git a/Editeur/widgets.py b/Editeur/widgets.py index 0c02a3c8..bcdbdc3d 100644 --- a/Editeur/widgets.py +++ b/Editeur/widgets.py @@ -110,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) : diff --git a/Extensions/commentaire.py b/Extensions/commentaire.py index db79f3f7..6bcb8842 100644 --- a/Extensions/commentaire.py +++ b/Extensions/commentaire.py @@ -173,3 +173,9 @@ class COMMENTAIRE : def verif_existence_sd(self): pass + def get_fr(self): + """ + Retourne le commentaire lui meme + """ + return self.valeur + diff --git a/Extensions/mcnuplet.py b/Extensions/mcnuplet.py index 6db18fda..c11d0cb7 100644 --- a/Extensions/mcnuplet.py +++ b/Extensions/mcnuplet.py @@ -188,5 +188,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 '' + diff --git a/Ihm/I_ETAPE.py b/Ihm/I_ETAPE.py index 85dc9a33..d902f6c0 100644 --- a/Ihm/I_ETAPE.py +++ b/Ihm/I_ETAPE.py @@ -41,15 +41,6 @@ class ETAPE(I_MCCOMPO.MCCOMPO): 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: @@ -106,65 +97,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': # 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 : # 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): """ diff --git a/Ihm/I_MCCOMPO.py b/Ihm/I_MCCOMPO.py index e392d1b0..3c6e8c9e 100644 --- a/Ihm/I_MCCOMPO.py +++ b/Ihm/I_MCCOMPO.py @@ -382,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éé diff --git a/Ihm/I_MCLIST.py b/Ihm/I_MCLIST.py index 7e1f6e0d..4da0f20f 100644 --- a/Ihm/I_MCLIST.py +++ b/Ihm/I_MCLIST.py @@ -191,3 +191,13 @@ class MCList: 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 '' + diff --git a/Ihm/I_MCSIMP.py b/Ihm/I_MCSIMP.py index 4fa441de..ca1bafa3 100644 --- a/Ihm/I_MCSIMP.py +++ b/Ihm/I_MCSIMP.py @@ -53,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: @@ -73,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 : diff --git a/Ihm/I_OBJECT.py b/Ihm/I_OBJECT.py index ee6a848d..23feeefc 100644 --- a/Ihm/I_OBJECT.py +++ b/Ihm/I_OBJECT.py @@ -21,6 +21,7 @@ """ import string +import prefs import Noyau class OBJECT: @@ -124,4 +125,14 @@ class OBJECT: 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 '' + -- 2.30.2