import os
-import prefs
+from Aster import prefs
rep_cata = os.path.join(prefs.REPINI,'Cata')
rep_Pmw = os.path.join(prefs.REPINI,'../Pmw')
# Modules Eficas
import prefs
-from Editeur import eficas_go
+from InterfaceTK import eficas_go
eficas_go.lance_eficas()
# Par défaut on utilise les modules de INSTALLDIR
# Peut valoir None (defaut)
CODE_PATH = None
-#CODE_PATH = os.path.join(REPINI,'../../Superv')
# la variable code donne le nom du code a selectionner
code="ASTER"
-# 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'
# Codage des strings qui accepte les accents (en remplacement de 'ascii')
encoding='iso-8859-1'
-labels= ('Fichier','Edition','Jeu de commandes',
- 'Options',
- 'Aide',
- 'Traduction',
- )
-appli_composants=['readercata','bureau',
-# 'browser',
- 'options',
- ]
+EditeurDir=INSTALLDIR+"/Editeur"
+sys.path[:0]=[EditeurDir]
+sys.path[:0]=[INSTALLDIR]
-menu_defs={ 'bureau': [
- ('Fichier',[
- ('Nouveau','newJDC','<Control-n>','Ctrl+N'),
- ('Nouvel INCLUDE','newJDC_include'),
- ('Ouvrir','openJDC','<Control-o>','Ctrl+O'),
- ('Enregistrer','saveJDC','<Control-s>','Ctrl+S'),
- ('Enregistrer sous','saveasJDC','<Control-e>','Ctrl+E'),
- None,
- ('Fermer','closeJDC','<Control-w>','Ctrl+W'),
- ('Quitter','exitEFICAS','<Control-q>','Ctrl+Q'),
- ]
- ),
- ('Edition',[
- ('Copier','copy','<Control-c>','Ctrl+C'),
- ('Couper','cut','<Control-x>','Ctrl+X'),
- ('Coller','paste','<Control-v>','Ctrl+V'),
- ]
- ),
- ('Jeu de commandes',[
- ('Rapport de validation','visuCRJDC','<Control-r>','Ctrl+R'),
- ('Fichier source','visu_txt_brut_JDC','<Control-b>','Ctrl+B'),
- #('Paramètres Eficas','affichage_fichier_ini'),
- ]
- ),
- ('Traduction',[
- ('Traduction v7 en v8','TraduitFichier','<Control-t>','Ctrl+T'),
- ]
- ),
- ('Aide',[
- ('Aide EFICAS','aideEFICAS','<Control-a>','Ctrl+A'),
- ]
- ),
- ]
- }
+# Imports pour l IHM TK
+from InterfaceTK import prefsTK
+ICONDIR=os.path.join(INSTALLDIR,'Editeur','icons')
+# Preference
if os.name == 'nt':
userprefs = os.sep.join( [ os.environ['HOMEDRIVE'], os.environ['HOMEPATH'], 'Eficas_install', 'prefs.py' ])
else :
userprefs=os.path.expanduser("~/Eficas_install/prefs.py")
+
if os.path.isfile(userprefs):
try:
execfile(userprefs)
except:
pass
-
-sys.path[:0]=[INSTALLDIR]
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 Tkinter,ScrolledText
-import os, sys, string, traceback
-import code
-
-sys.ps1 = ">>> "
-sys.ps2 = "... "
-
-class PythonInterpreter( code.InteractiveConsole):
- def __init__( self, text, namespace = None):
- code.InteractiveConsole.__init__( self, namespace)
- self.text = text
-
- def showtraceback( self):
- start = self.text.pos + " - 1 lines"
- code.InteractiveConsole.showtraceback( self)
- end = self.text.pos
- self.text.tag_add( "exception", start, end)
-
-class InterpWindow(Tkinter.Toplevel):
- def __init__(self,namespace, parent=None):
- Tkinter.Toplevel.__init__(self,parent)
- self._initTkWidgets()
- self.stdout = self.stderr = self
- self.pos = '1.0'
- self.history = [ '' ]
- self.hpos = 0
- self.tabCount = 0
- self.shell = PythonInterpreter( self,namespace)
- self.write("Python %s on %s\n%s\n(%s)\n" %
- (sys.version, sys.platform, sys.copyright,
- self.__class__.__name__))
- self.write( sys.ps1)
- self.text.focus_set()
-
- def _initTkWidgets( self):
- self.text = ScrolledText.ScrolledText( self, bg = "white",fg="black", wrap="word")
- self.text.pack( fill='both', expand = 1)
- self.text.bind( '<KeyPress>', self.clearMsg)
- self.text.bind( '<Return>', self.inputhandler)
- self.text.bind( '<KP_Enter>', self.inputhandler)
- self.text.bind( '<Up>', self.uphistory)
- self.text.bind( '<Down>', self.downhistory)
- self.text.bind( '<Control-a>', self.goto_sol)
- self.text.bind( '<Control-d>', self.sendeof)
- self.text.tag_config("exception", foreground = "red")
-
- def swapStdFiles(self):
- sys.stdout,self.stdout = self.stdout,sys.stdout
- sys.stderr,self.stderr = self.stderr,sys.stderr
-
- def write(self, data):
- self.text.insert("end", data)
- self.pos = self.text.index("end - 1 char")
- self.text.yview_pickplace("end")
-
- def tag_add( self, tag, start, end):
- self.text.tag_add( tag, start, end)
-
- def inputhandler(self, *args):
- # Remove any extraneous stuff
- self.text.delete( self.pos + " lineend", "end")
- # Now get the line
- line = self.text.get(self.pos, "end - 1 char")
- self.text.insert("end", "\n")
- self.pos = self.text.index("end")
- self.addHistory( line)
- self.swapStdFiles()
- if self.shell.push( line):
- self.write(sys.ps2)
- else:
- self.write(sys.ps1)
- self.swapStdFiles()
- self.text.mark_set("insert", "end")
- return "break"
-
- def addHistory( self, line):
- if line:
- self.history.insert( len( self.history) - 1, line)
- self.hpos = len( self.history) - 1
-
- def sendeof(self, *args):
- self.destroy()
- return "break"
-
- def uphistory(self, event=None):
- if not self.history: return "break"
-
- if self.hpos > 0:
- self.hpos = self.hpos - 1
-
- line = self.history[ self.hpos]
- self.text.delete( self.pos, "end")
- self.text.insert( self.pos, line)
-
- return "break"
-
- def downhistory( self, event=None):
- if not self.history: return "break"
-
- if self.hpos < (len( self.history) - 1):
- self.hpos = self.hpos + 1
-
- line = self.history[ self.hpos]
- self.text.delete( self.pos, "end")
- self.text.insert( self.pos, line)
-
- return "break"
-
- def goto_sol( self, event=None):
- """
- Met en mode edition la ligne courante
- """
- self.text.mark_set( 'insert', 'insert linestart + 4 chars')
- return "break"
-
- def clearMsg( self, event=None):
- index = self.text.index( "insert")
- self.text.delete( "insert lineend", "end")
- self.tabCount = 0
-
-if __name__ == "__main__":
- app = Tkinter.Tk()
- d={'a':1}
-
- def go():
- InterpWindow(d,parent=app)
-
- Tkinter.Button(app,text="Interp",command=go).pack()
- Tkinter.Button(app,text="Quit",command=app.destroy).pack()
-
- app.mainloop()
-
# import du chargeur de composants
from comploader import make_objecttreeitem
-import treewidget
+from InterfaceTK import treewidget
from Ihm import CONNECTOR
myrepr = Repr()
-
DEBUT(CODE=_F(NOM='VIDE',
NIV_PUB_WEB='INTERNET',),);
-#
-MA=LIRE_MAILLAGE();
+#
+MA1=LIRE_MAILLAGE();
FIN();
+
#
+
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 3Dpilote qui va creer les ordres
- de pilotage de l idl PAL pour un element de structure
-"""
-import generator
-
-class TroisDPilote:
-
- def __init__(self,node,appli,parent):
- self.node=node
- self.appli=appli
- self.parent=parent
-
- def envoievisu(self):
- """
- """
- format="vers3DSalome"
- if generator.plugins.has_key(format):
- # Le generateur existe on l'utilise
- g=generator.plugins[format]()
- g.init_jdc(self.node.get_jdc())
- texte=g.gener(self.node)
- else:
- print "Le generateur n a pas ete trouvé"
- print "Erreur ! Erreur!"
- return ""
- self.appli.envoievisu(texte)
-
#
#
# ======================================================================
+"""
+ Ce package contient les fonctionnalités COMMUNES nécessaires
+ aux deux éditeurs graphiques QT et TK
+"""
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
- des composants graphiques et l'initialisation Tk
- L'aspect applicatif doit etre pris en charge par la classe dérivée
-"""
-# Modules Python
-import os
-import string
-import sys
-import types
-import Pmw
-import Tkinter
-from widgets import showerror
-
-# Modules Eficas
-import splash
-import prefs
-import styles
-from styles import style
-import fontes
-import tooltip
-import properties
-import convert,generator
-import comploader
-from utils import extension_fichier,stripPath
-
-from widgets import Fenetre
-from Misc import MakeNomComplet
-import session
-import listeFichiers
-import listePatrons
-
-VERSION="EFICAS v1.12"
-
-class APPLI:
- def __init__ (self,master,code=prefs.code,fichier=None,test=0) :
- self.code=code
- self.top=master
- self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS)
-
- #dimensionnement de la fenetre principale
- #aspect ratio de l'ecran
- aspect=float(self.top.winfo_screenwidth())/float(self.top.winfo_screenheight())
- #resolution (pixels par point). On utilise le fait qu'on a "normalement" 72 points par inch
- resolution= self.top.winfo_screenwidth()/(self.top.winfo_screenmmwidth()/25.4*72)
- DDY=max(20,resolution*(fontes.standard[1]+4)) #largeur d'un caractere fonte standard en pixel
- x=int(45*DDY) #largeur d'ouverture de 45 caracteres de fonte standard
- y=int(25*DDY) #hauteur d'ouverture de 25 caracteres de fonte standard
- minx=x*8/10 #largeur min (80 pour cent de largeur)
- miny=y*8/10 #hauteur min (80 pour cent de hauteur)
- self.top.minsize(minx,miny)
- self.top.geometry('%dx%d' % (x,y))
-
- self.top.title(VERSION + ' pour '+self.code)
- self.titre=VERSION + ' pour '+self.code
- self.top.withdraw()
- self.initializeTk(master)
- Pmw.initialise(master)
-
- self.dict_reels={}
- self.liste_simp_reel=[]
- # L'attribut test permet d'activer les panneaux de splash et d'erreur (test=0)
- # Si test est different de 0, les panneaux ne sont pas activés
- self.test=test
-
- # Lecture des parametres de configuration (fichier global editeur.ini
- # et utilisateur eficas.ini)
- self.lecture_parametres()
-
- self.format_fichier = Tkinter.StringVar()
- self.message=''
- # Avant la creation du bureau qui lit le catalogue
- self.version_code=session.d_env.cata
-
- # Creation de la menubar, toolbar, messagebar
- self.cree_composants_graphiques()
- # Creation des autres composants graphiques dont le bureau (parametrable par prefs.py)
- self.load_appli_composants()
- self.listeFichiers=listeFichiers.listeFichiers(self)
- self.listePatrons=listePatrons.listePatrons(self)
- self.dir=None
-
- # Fermer le splash et deiconifier la fenetre principale si on n'est pas en test
- if (self.test == 0):
- splash.fini_splash()
- #self.affiche_FAQ()
-
- # Ouverture des fichiers de commandes donnes sur la ligne de commande
- cwd=os.getcwd()
- self.dir=cwd
- for study in session.d_env.studies:
- os.chdir(cwd)
- d=session.get_unit(study,self)
- self.bureau.openJDC(file=study["comm"],units=d)
-
-
- def send_message(self,message):
- self.message=message
-
- def exitEFICAS(self):
- self.quit()
-
- def quit(self):
- self.top.quit()
-
- def lecture_parametres(self):
- """
- Active la lecture des paramètres standards et utilisateur
- """
- if (self.test == 0):
- splash._splash.configure(text = "Chargement des paramètres utilisateur")
- import configuration
- self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
- self.CONFIGStyle = configuration.make_config_style(self,prefs.REPINI)
-
- def cree_composants_graphiques(self):
- """
- Cree les constituants graphiques fixes de l'application :
- - menubar
- - toolbar
- - statusbar
- """
- if (self.test == 0):
- splash._splash.configure(text = "Chargement de l'IHM")
- splash._splash.configure(text = "Chargement de la menubar")
- import menubar
- self.menubar=menubar.MENUBAR(self,self.top)
- if (self.test == 0):
- splash._splash.configure(text = "Chargement de la toolbar")
- import toolbar
- self.toolbar=toolbar.TOOLBAR(self,self.top)
- if (self.test == 0):
- splash._splash.configure(text = "Chargement de la statusbar")
- import statusbar
- self.statusbar=statusbar.STATUSBAR(self.top,styles.style.statusfont)
-
- def load_appli_composants(self):
- """
- Cree les autres constituants graphiques de l'application :
- - bureau
- - readercata
- - ...
- Cette creation est parametrable par fichier prefs.py
- """
- if (self.test == 0):
- splash._splash.configure(text = "Chargement des appli_composants")
- for mname in self.appli_composants:
- self.load_appli_composant(mname)
-
- def load_appli_composant(self,mname):
- module=__import__(mname,globals(),locals())
- factory=getattr(module,mname.upper())
- 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
- faq.affiche(self.top)
-
- def affiche_infos(self,message):
- self.statusbar.affiche_infos(message)
- return
-
- def initializeTk(self, root):
- """
- Initialize platform specific options
- """
- if sys.platform == 'mac':
- self.initializeTk_mac(root)
- elif sys.platform == 'win32':
- self.initializeTk_win32(root)
- else:
- self.initializeTk_unix(root)
-
- def initializeTk_win32(self, root):
- root.option_add('*Font', fontes.standard)
- root.option_add('*EntryField.Entry.Font', fontes.standard)
- root.option_add('*Listbox*Font',fontes.standard)
-
- def initializeTk_colors_common(self, root):
- root.option_add('*background', style.background)
- root.option_add('*foreground', style.foreground)
- root.option_add('*EntryField.Entry.background', style.entry_background)
- root.option_add('*Entry*background', style.entry_background)
- root.option_add('*Listbox*background', style.list_background)
- root.option_add('*Listbox*selectBackground', style.list_select_background)
- root.option_add('*Listbox*selectForeground', style.list_select_foreground)
-
- def initializeTk_mac(self, root):
- self.initializeTk_colors_common(root)
-
- def initializeTk_unix(self, root):
- root.option_add('*Font', fontes.standard)
- root.option_add('*EntryField.Entry.Font',fontes.standard )
- root.option_add('*Listbox*Font', fontes.standard)
- self.initializeTk_colors_common(root)
-
- def get_texte_infos(self):
- """
- Retourne un texte d'informations sur la session courante d'EFICAS
- """
- texte = VERSION + '\n\n'
- texte = texte + 'EFICAS est un produit développé par \nEDF-R&D\n'
- texte = texte + 'Equipe : SINETICS\n\n'
- texte = texte + 'Code utilisé : %s version %s\n' % (self.code,properties.version)
- return texte
-
- def efface_aide(self,event):
- """
- Efface la bulle d'aide d'un panneau
- """
- try:
- self.aide.destroy()
- except:
- pass
- return
-
- def affiche_aide(self,event,aide):
- """
- Affiche l'aide concernant un panneau
- """
- x=event.x
- y=event.y
- widget=event.widget
- 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
- raccourci_label=""
- if not item :
- #menu.add_separator()
- pass
- else:
- if len(item)==3:
- raccourci=item[2]
- raccourci_label=" "+raccourci
- newitem=(item[0],item[1])
- else :
- if len(item)==4:
- raccourci=item[2]
- raccourci_label=" "+item[3]
- newitem=(item[0],item[1])
- else :
- raccourci=""
- newitem=item
- item=newitem
- 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,accelerator=raccourci_label,command=command)
- if raccourci != "" :
- self.top.bind(raccourci,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
- self.cree_menu(menu,itemlist,appli_composant)
-
- def update_jdc_courant(self):
- self.bureau.update_jdc_courant()
-
- def affiche_alerte(self,titre,message):
- f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
- f.wait()
-
-
-class valeur:
- def __init__(self,v=None):
- self.v=v
- def set(self,v):
- self.v=v
- def get(self):
- return self.v
-
-class STANDALONE(APPLI):
- def __init__ (self,code=prefs.code,fichier=None,version='v8.2') :
- self.code=code
- self.top=None
- self.format_fichier=valeur()
-
- self.dict_reels={}
- self.liste_simp_reel=[]
- # L'attribut test doit valoir 1 si on ne veut pas creer les fenetres
- self.test=1
- self.titre="STANDALONE POUR TEST"
-
- # Lecture des parametres de configuration (fichier global editeur.ini
- # et utilisateur eficas.ini)
- self.lecture_parametres()
-
- self.message=''
- # Avant la creation du bureau qui lit le catalogue
- self.version_code=version
- import readercata
- self.readercata=readercata.READERCATA(self,None)
-
- self.dir=None
-
- def affiche_infos(self,message):
- return
-
- def get_text_JDC(self,JDC,format):
- if generator.plugins.has_key(format):
- # Le generateur existe on l'utilise
- g=generator.plugins[format]()
- jdc_formate=g.gener(JDC,format='beautifie')
- return jdc_formate
- else:
- # Il n'existe pas c'est une erreur
- return
-
- def newJDC(self):
- CONTEXT.unset_current_step()
- J=self.readercata.cata[0].JdC(procedure="",
- appli=self,
- cata=self.readercata.cata,
- cata_ord_dico=self.readercata.cata_ordonne_dico,
- rep_mat=self.CONFIGURATION.rep_mat,
- )
- J.analyse()
- return J
-
- def openJDC(self,file):
- self.fileName = file
- e=extension_fichier(file)
- self.JDCName=stripPath(file)
- self.initialdir = os.path.dirname(os.path.abspath(file))
- format=self.format_fichier.get()
- # Il faut convertir le contenu du fichier en fonction du format
- if convert.plugins.has_key(format):
- # Le convertisseur existe on l'utilise
- p=convert.plugins[format]()
- p.readfile(file)
- text=p.convert('exec',self)
- if not p.cr.estvide():
- raise ValueError(str(p.cr))
-
- # On se met dans le repertoire ou se trouve le fichier de commandes
- # pour trouver les eventuels fichiers include ou autres
- # localises a cote du fichier de commandes
- os.chdir(self.initialdir)
- CONTEXT.unset_current_step()
- J=self.readercata.cata[0].JdC(procedure=text,
- appli=self,
- cata=self.readercata.cata,
- cata_ord_dico=self.readercata.cata_ordonne_dico,
- nom=self.JDCName,
- rep_mat=self.CONFIGURATION.rep_mat,
- )
- J.analyse()
- txt= J.cr.get_mess_exception()
- if txt:raise ValueError(txt)
- return J
-
- def openTXT(self,text):
- self.JDCName="TEXT"
- CONTEXT.unset_current_step()
- J=self.readercata.cata[0].JdC(procedure=text,
- appli=self,
- cata=self.readercata.cata,
- cata_ord_dico=self.readercata.cata_ordonne_dico,
- nom=self.JDCName,
- rep_mat=self.CONFIGURATION.rep_mat,
- )
- J.analyse()
- txt= J.cr.get_mess_exception()
- if txt:raise ValueError(txt)
- return J
-
- def create_item(self,obj):
- return comploader.make_objecttreeitem(self,getattr(obj,"nom","item"),obj)
-
- def get_file(self,unite=None,fic_origine = ''):
- """
- Retourne le nom du fichier correspondant a l unite logique unite (entier)
- ou d'un fichier poursuite
- """
- f,ext=os.path.splitext(fic_origine)
- if unite :
- #include
- finclude=f+".%d" % unite
- else:
- #poursuite
- n=ext[-1]
- if n == '0':
- ext=".comm"
- else:
- ext=".com%d" % (string.atoi(n)-1)
- if ext == '.com0' and not os.path.isfile(f+".com0"):
- ext=".comm"
- finclude=f+ext
- ff=open(finclude)
- text=ff.read()
- ff.close()
- return finclude,text
-
- def affiche_alerte(self,titre,message):
- print titre+ "\n\n" + message
+++ /dev/null
-class STYLE:
- background='gray90'
- foreground='black'
- entry_background='white'
- list_background='white'
- list_select_background='#00008b'
- list_select_foreground='grey'
- tooltip_background="yellow"
-
- standard = ("Helvetica",12)
- standard_italique = ("Helvetica",12,'italic')
- standard_gras = ("Helvetica",12,'bold')
- standard_gras_souligne = ("Helvetica",12,'bold','underline')
-
- canvas = ('Helvetica',10)
- canvas_italique = ('Helvetica',10,'italic')
- canvas_gras = ("Helvetica",10,'bold')
- canvas_gras_italique = ("Helvetica",12,'bold','italic')
-
- standard12 = ("Helvetica",14)
- standard12_gras = ("Helvetica",14,'bold')
- standard12_gras_italique = ( "Helvetica",14,'bold','italic')
-
- standardcourier10 = ("Courier",14)
- statusfont = ("Helvetica",16)
-
-style=STYLE()
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 os,string
-
-# Modules Eficas
-import Interp
-import catabrowser
-import cataediteur
-
-class BROWSER:
-
- menu_defs=[
- ('Browsers',[
- ('Browser catalogue','browser_catalogue'),
- ('Editeur catalogue','edite_catalogue'),
- ('Shell','shell'),
- ]
- )
- ]
-
- button_defs=[]
-
- def __init__(self,appli,parent):
- self.appli=appli
- self.parent=parent
- self.cataitem = catabrowser.CATAItem(self,"Catalogue "+self.appli.readercata.code,
- self.appli.readercata.cata,
- objet_cata_ordonne = self.appli.readercata.cata_ordonne_dico)
-
- def shell(self,event=None):
- if not hasattr(self.appli.bureau.JDCDisplay_courant,'jdc'):return
- d={'j':self.appli.bureau.JDCDisplay_courant.jdc}
- Interp.InterpWindow(d,parent=self.parent)
-
- def browser_catalogue(self,event=None):
- catabrowser.CataBrowser(parent=self.parent,appli=self.appli,
- cata = self.appli.readercata.cata,
- item = self.cataitem)
-
- def edite_catalogue(self,event=None):
- cataediteur.CataEditeur(parent=self.parent,appli=self.appli,cata=self.appli.readercata.cata)
-
-
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-"""
-# Modules Python
-import os,string,sys
-import traceback
-import Pmw
-from widgets import askopenfilename,asksaveasfilename
-from widgets import showinfo,askyesno,showerror
-
-# Modules Eficas
-import splash
-import prefs
-import convert
-import generator
-import AIDE
-import os
-from jdcdisplay import JDCDISPLAY
-from utils import extension_fichier,stripPath,save_in_file
-from widgets import Fenetre,Ask_Format_Fichier,FenetreSurLigneWarning
-from fenetre_mc_inconnus import fenetre_mc_inconnus
-from Ihm import CONNECTOR
-from Traducteur import traduitV7V8
-
-import comploader
-
-class BUREAU:
- menu_defs=[
- ('Fichier',[
- ('Nouveau','newJDC','<Control-n>'),
- ('Ouvrir','openJDC','<Control-o>'),
- ('Enregistrer','saveJDC','<Control-e>'),
- ('Enregistrer sous','saveasJDC','<Control-s>'),
- None,
- ('Fermer','closeJDC','<Control-f>'),
- ('Quitter','exitEFICAS','<Control-q>'),
- ]
- ),
- ('Edition',[
- ('Copier','copy','<Control-c>'),
- ('Couper','cut','<Control-x>'),
- ('Coller','paste','<Control-v>'),
- ]
- ),
- ('Jeu de commandes',[
- ('Rapport de validation','visuCRJDC','<Control-r>'),
- ('Fichier à plat','visu_a_plat','<Control-p>'),
- ('Fichier .py','visuJDC_py'),
- ('Fichier source','visu_txt_brut_JDC','<Control-b>'),
- ('Paramètres Eficas','affichage_fichier_ini'),
- ('Mots-clés inconnus','mc_inconnus'),
- ]
- ),
- ('Traduction',[
- ('Traduction v7 en v8','TraduitFichier','<Control-t>','Ctrl+T')
- ]
- ),
- ('Aide',[
- ('Aide EFICAS','aideEFICAS'),
- ]
- ),
- ]
-
- button_defs = (('New24',"newJDC","Création d'un nouveau fichier",'always'),
- ('Open24',"openJDC","Ouverture d'un fichier existant",'always'),
- ('Save24',"saveJDC","Sauvegarde du fichier courant",'always'),
- ('Fermer24',"closeJDC","Fermeture du fichier courant",'always'),
- ('Zoom24',"visuJDC","Visualisation du fichier de commandes",'always'),
- None,
- ('Copy24',"copy","Copie l'objet courant",'jdc'),
- ('Cut24',"cut","Coupe l'objet courant",'jdc'),
- ('Paste24',"paste","Colle l'objet copié après l'objet courant",'jdc'),
- None,
- ('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
- self.appli=appli
- if self.appli.test == 0 :
- splash._splash.configure(text = "Création du bureau")
- self.nb = Pmw.NoteBook(self.parent,raisecommand=self.selectJDC)
- self.nb.pack(fill='both',expand=1)
- self.JDCDisplay_courant=None
- self.fileName=None
- self.liste_JDCDisplay=[]
- comploader.charger_composants()
- self.cree_cataitem()
- self.text_reel=""
- self.initialdir = self.appli.CONFIGURATION.initialdir
-
- def cree_cataitem(self):
- """
- 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
- self.cata=self.appli.readercata.cata
- self.cata_ordonne_dico=self.appli.readercata.cata_ordonne_dico
- self.code=self.appli.readercata.code
- self.version_code=self.appli.readercata.version_code
- self.fic_cata=self.appli.readercata.fic_cata
-
- def selectJDC(self,event=None):
- """
- Cette méthode est appelée chaque fois que l'on sélectionne
- l'onglet d'un JDC dans le NoteBook des JDC.
- Elle permet de stocker dans les variable self.JDC et
- self.JDCDisplay_courant les valeurs concernant le JDC courant
- """
- if len(self.liste_JDCDisplay) == 0 : return
- #if self.JDCDisplay_courant : self.JDCDisplay_courant.jdc.unset_context()
- numero_jdc = self.nb.index(self.nb.getcurselection())
- self.JDCDisplay_courant.unselect()
- self.JDCDisplay_courant = self.liste_JDCDisplay[numero_jdc]
- self.JDC = self.JDCDisplay_courant.jdc
- self.JDCName = self.JDC.nom
- self.JDCDisplay_courant.select()
- #print "selectJDC",numero_jdc,self.JDCDisplay_courant,self.JDCName
-
-
- def newJDC_include(self,event=None):
- """
- Initialise un nouveau JDC include vierge
- """
- import Extensions.jdc_include
- JdC_aux=Extensions.jdc_include.JdC_include
-
- self.appli.statusbar.reset_affichage_infos()
-
- CONTEXT.unset_current_step()
- jaux=self.cata[0].JdC(procedure="",appli=self.appli,
- cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
- rep_mat=self.appli.CONFIGURATION.rep_mat,
- )
- jaux.analyse()
-
- J=JdC_aux(procedure="",appli=self.appli,
- cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
- jdc_pere=jaux,
- rep_mat=self.appli.CONFIGURATION.rep_mat,
- )
- J.analyse()
- self.JDCName=J.nom
- self.fileName=None
- self.ShowJDC(J,self.JDCName)
- self.appli.toolbar.active_boutons()
- return J
-
- def newJDC(self,event=None):
- """
- Initialise un nouveau JDC vierge
- """
- self.appli.statusbar.reset_affichage_infos()
-
- CONTEXT.unset_current_step()
- J=self.cata[0].JdC(procedure="",appli=self.appli,
- cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
- rep_mat=self.appli.CONFIGURATION.rep_mat,
- )
- J.analyse()
- self.JDCName=J.nom
- self.fileName=None
- self.ShowJDC(J,self.JDCName)
- self.appli.toolbar.active_boutons()
- return J
-
- def ShowJDC(self,JDC,nom,label_onglet=None,JDCDISPLAY=JDCDISPLAY,enregistre="non"):
- """
- Lance l'affichage du JDC cad création du JDCDisplay
- Rajoute le JDCDisplay à la liste des JDCDisplay si label_onglet == None cad si on crée
- bien un nouveau JDCDisplay et non si on remplace (renommage de l'onglet)
- """
- self.JDC=JDC
- self.JDCName = self.JDC.nom = nom
- if label_onglet == None :
- # On veut un nouvel onglet
- label_onglet = self.GetLabelJDC()
- self.nb.add(label_onglet,tab_text = nom,tab_width=20)
- new = 'oui'
- else :
- new = 'non'
- self.JDCDisplay_courant=JDCDISPLAY(self.JDC,nom,appli=self.appli,parent=self.nb.page(label_onglet))
- if new == 'oui':
- self.liste_JDCDisplay.append(self.JDCDisplay_courant)
- self.JDCDisplay_courant.modified='n'
- if enregistre != "non" :
- self.JDCDisplay_courant.fichier=self.fileName
- else :
- self.initialdir = self.appli.CONFIGURATION.rep_user
- self.nb.selectpage(label_onglet)
- self.nb.setnaturalsize()
- self.nb.bind_all("<Key-Next>",lambda e,s=self:s.selectArbreDown())
- self.nb.bind_all("<Key-Prior>",lambda e,s=self:s.selectArbreUp())
- self.nb.bind_all("<Insert>",lambda e,s=self:s.deplieReplieNode())
- texte = "Jeu de commandes :" + self.JDCName+" ouvert"
- CONNECTOR.Connect(JDC,"close",self.onClose,(self.JDCDisplay_courant,))
- self.appli.affiche_infos(texte)
-
- def onClose(self,jdcdisplay):
- #print "onClose",jdcdisplay
- self.closeJDCDISPLAY(jdcdisplay)
-
- def closeJDCDISPLAY(self,jdc):
- """
- Ferme le jdcdisplay spécifié par l'argument jdc
- """
- if jdc is self.JDCDisplay_courant:
- # on ferme le jdcdisplay courant
- self.closeSelectedJDC()
- else:
- # on ferme un autre jdcdisplay que le courant
- old_JDCDisplay=self.JDCDisplay_courant
- old_page=self.nb.getcurselection()
-
- self.JDCDisplay_courant=jdc
- self.JDC=jdc.jdc
- numero_jdc=self.liste_JDCDisplay.index(jdc)
- self.nb.selectpage(numero_jdc)
- #print numero_jdc
-
- self.closeSelectedJDC()
- self.JDCDisplay_courant=old_JDCDisplay
- self.JDC=old_JDCDisplay.jdc
- self.nb.selectpage(old_page)
-
- def closeJDC (self,event=None) :
- """
- Ferme le JDC associé au JDCDISPLAY selectionné
- """
- if self.JDCDisplay_courant :
- self.JDCDisplay_courant.jdc.close()
-
- def closeSelectedJDC (self) :
- """
- Ferme le JDC courant et détruit l'onglet associé dans le notebook self.nb
- """
- if self.JDCDisplay_courant.modified == 'o' :
- message = "Voulez-vous sauvegarder le jeu de commandes "+self.JDC.nom+" courant ?"
- reponse = askyesno(title="Sauvegarde du jdc courant",
- message=message)
- if reponse :
- test = self.saveJDC()
- if test == 0 :
- self.appli.affiche_infos("Sauvegarde impossible")
- return
-
- CONNECTOR.Disconnect(self.JDCDisplay_courant.jdc,"close",self.onClose,(self.JDCDisplay_courant,))
- self.JDCDisplay_courant.supprime()
- self.JDCDisplay_courant.jdc.supprime()
- self.liste_JDCDisplay.remove(self.JDCDisplay_courant)
- # Active le mecanisme de selection du notebook (selectJDC)
- self.nb.delete(self.nb.getcurselection())
-
- try:
- index = self.nb.index(self.nb.getcurselection())
- self.JDCDisplay_courant = self.liste_JDCDisplay[index]
- self.JDC = self.JDCDisplay_courant.jdc
- except:
- self.JDC = None
- self.JDCDisplay_courant = None
- self.appli.toolbar.inactive_boutons()
-
- def visuCRJDC(self,event=None):
- return self.visuCR(mode='JDC')
-
- def visuCR(self,mode):
- """
- Méthode permettant l'affichage du rapport de validation
- """
- if mode == 'JDC':
- if not hasattr(self,'JDC') : return
- if self.JDC == None : return
- titre="rapport de validation du jeu de commandes courant"
- cr = self.JDC.report()
- #self.update_jdc_courant()
- elif mode == 'CATA':
- from Noyau.N_CR import CR
- cr = CR()
- cr.debut = "Début rapport de validation du catalogue"
- cr.fin = "Fin rapport de validation du catalogue"
- titre="rapport de validation du catalogue"
- if hasattr(self,'cata_ordonne_cr') :
- cr.add(self.cata_ordonne_cr)
- if hasattr(self,'cata_dev_ordonne_cr') :
- cr.add(self.cata_dev_ordonne_cr)
- for cata in self.cata:
- if hasattr(cata,'JdC'):
- cr.add(cata.JdC.report())
- texte_cr = str(cr)
- self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
-
- def openJDC(self,event=None,file=None,units=None,enregistre="oui"):
- """
- Demande à l'utilisateur quel JDC existant il veut ouvrir
- """
- if self.code == 'ASTER':
- filetypes = ( ("format "+self.appli.format_fichier.get(), ".com*"),("Tous",'*'))
- elif self.code == 'HOMARD' :
- filetypes = ( ("format "+self.appli.format_fichier.get(), ".py"),("Tous",'*'))
- else:
- filetypes = ( ("format "+self.appli.format_fichier.get(), ".py"),)
- if not hasattr(self,'initialdir'):
- self.initialdir = self.appli.CONFIGURATION.initialdir
-
- if not file :
- file = askopenfilename(title="Ouverture d'un fichier de commandes Aster",
- defaultextension=".comm",
- filetypes = filetypes,
- initialdir = self.initialdir)
- if file :
- self.fileName = file
- e=extension_fichier(file)
- self.JDCName=stripPath(file)
- self.initialdir = os.path.dirname(os.path.abspath(file))
- else :
- return
-
- format=self.appli.format_fichier.get()
- # Il faut convertir le contenu du fichier en fonction du format
- if convert.plugins.has_key(format):
- # Le convertisseur existe on l'utilise
- p=convert.plugins[format]()
- p.readfile(file)
- text=p.convert('exec',self.appli)
- if not p.cr.estvide():
- self.appli.affiche_infos("Erreur à la conversion")
- Fenetre(self.appli,
- titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
- texte = str(p.cr)).wait()
- return
- if enregistre == "oui" :
- self.appli.listeFichiers.aOuvert(file)
- else:
- # Il n'existe pas c'est une erreur
- self.appli.affiche_infos("Type de fichier non reconnu")
- showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
- return
-
- # On se met dans le repertoire ou se trouve le fichier de commandes
- # pour trouver les eventuels fichiers include ou autres
- # localises a cote du fichier de commandes
- os.chdir(self.initialdir)
- CONTEXT.unset_current_step()
- J=self.cata[0].JdC(procedure=text,appli=self.appli,
- cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
- nom = self.JDCName,
- rep_mat=self.appli.CONFIGURATION.rep_mat,
- )
- if units is not None:
- J.recorded_units=units
- J.old_recorded_units=units
-
- J.analyse()
- txt_exception = J.cr.get_mess_exception()
- if txt_exception :
- # des exceptions ont été levées à la création du JDC
- # --> on affiche les erreurs mais pas le JDC
- self.JDC=J
- self.appli.affiche_infos("Erreur fatale au chargement de %s" %file)
- if self.appli.test == 0 :
- showerror("Erreur fatale au chargement d'un fichier",txt_exception)
- else:
- self.ShowJDC(J,self.JDCName,enregistre=enregistre)
- self.appli.toolbar.active_boutons()
- # si le JDC ne contient rien (vide), on retourne ici
- if len(self.JDC.etapes) == 0 : return
- # dans le cas où le JDC est invalide, on affiche son CR
- if not self.JDC.isvalid():
- self.appli.top.update()
- self.visuCR(mode='JDC')
- return J
-
- def deplieReplieNode(self):
- self.JDCDisplay_courant.tree.tree.deplieReplieNode()
-
- def selectArbreDown(self):
- self.JDCDisplay_courant.tree.tree.canvas.focus_set()
- self.JDCDisplay_courant.tree.tree.mot_down_force()
-
- def selectArbreUp(self):
- self.JDCDisplay_courant.tree.tree.canvas.focus_set()
- self.JDCDisplay_courant.tree.tree.mot_up_force()
-
- def GetLabelJDC(self,nb_jdc = 'absent'):
- """
- Retourne le label de l'onglet du NoteBook associé au JDC à afficher
- """
- if nb_jdc == 'absent':
- nb_jdc = len(self.nb.pagenames())
- nb_jdc = nb_jdc+1
- label_onglet = 'JDC'+`nb_jdc`
- if label_onglet not in self.nb.pagenames() :
- return label_onglet
- else :
- return self.GetLabelJDC(nb_jdc)
-
- def saveasJDC(self,event=None):
- """
- Sauvegarde le JDC courant en demandant impérativement à l'utilisateur de
- donner le nom du fichier de sauvegarde
- """
- self.saveJDC(echo='oui')
-
- def saveJDC(self,echo='non'):
- """
- Sauvegarde le JDC courant.
- Retourne 1 si la sauvegarde s'est bien faite, 0 sinon.
-
- - Si echo = 'oui' : interactif (l'utilisateur donne le nom sous lequel il
- veut sauver le JDC
- - Si echo = 'non' : muet (sauvegarde le JDC dans JDC.procedure)
- """
- ok = 0
- if not hasattr(self,'JDC') : return 0
- format=self.appli.format_fichier.get()
- if generator.plugins.has_key(format):
- # Le generateur existe on l'utilise
- g=generator.plugins[format]()
- jdc_formate=g.gener(self.JDC,format='beautifie')
- if format == 'homard':
- self.jdc_homard=g.get_homard()
- if not g.cr.estvide():
- self.appli.affiche_infos("Erreur à la generation")
- showerror("Erreur à la generation","EFICAS ne sait pas convertir ce JDC")
- return
- else:
- # Il n'existe pas c'est une erreur
- self.appli.affiche_infos("Format %s non reconnu" % format)
- showerror("Format %s non reconnu" % format,"EFICAS ne sait pas convertir le JDC")
- return
- self.jdc_fini = string.replace(jdc_formate,'\r\n','\n')
-
- if echo =='oui' or self.JDCDisplay_courant.fichier == None:
- ok = self.asknomsauvegardeJDC()
- elif self.JDCDisplay_courant.fichier != None :
- # le JDC a déjà un nom : on sauvegarde directement sans demander
- # un autre nom au développeur
- if not save_in_file(self.JDCDisplay_courant.fichier,self.jdc_fini,self.appli.dir) :
- showinfo("Erreur","Problème à la sauvegarde du fichier :" + `self.JDCDisplay_courant.fichier`)
- #return 0
- ok = 0
- else :
- if self.appli.format_fichier.get() == 'homard':
- self.save_homard(self.JDCDisplay_courant.fichier,self.jdc_homard)
- self.JDCDisplay_courant.stop_modif()
- self.appli.affiche_infos("sauvegarde de "+`self.JDCDisplay_courant.fichier`+" effectuée")
- ok = 1
-
- if ok and hasattr( self.appli, 'salome'):
- # eficas a été lancé à partir deSalome
- #1)ajout dans l'arbre d'étude du nom du jdc
- ok, msg = self.appli.addJdcInSalome( self.JDCDisplay_courant.fichier )
-
- #2)CS_pbruno ??
- from panelsSalome import SALOME_UNIQUE_BASE_Panel
- if len(SALOME_UNIQUE_BASE_Panel.dict_fichier_unite) > 0 :
- print 'CS_pbruno if len(SALOMchier_unite) > 0 :???????'
- self.appli.creeConfigTxt( self.appli.CONFIGURATION.initialdir, SALOME_UNIQUE_BASE_Panel.dict_fichier_unite )
-
- #3)création/mise à jours d'un maillage dans Salome
- self.appli.createOrUpdateMesh()
- return ok
-
- def asknomsauvegardeJDC(self):
- """ Demande à l'utilsateur le nom sous lequel il veut sauvegarder le JDC courant """
- titre = "Sauvegarde d'un fichier de commandes "+self.code
- if self.code == 'ASTER':
- defext = ".comm"
- filtyp = ( ("ASTER", ".comm"),)
- else :
- defext = ".py"
- filtyp = ( (self.code, ".py"),)
- sauvegarde = asksaveasfilename(title=titre,
- defaultextension=defext,
- filetypes = filtyp,
- initialdir = self.initialdir)
- #initialdir = self.appli.CONFIGURATION.initialdir)
- #initialdir = self.appli.CONFIGURATION.rep_user)
- if sauvegarde :
- if not save_in_file(sauvegarde,self.jdc_fini,None) :
- showinfo("Erreur","Problème à la sauvegarde du fichier "+`sauvegarde`)
- return 0
- else :
- if self.appli.format_fichier.get() == 'homard':
- self.save_homard(sauvegarde,self.jdc_homard)
- self.JDCDisplay_courant.stop_modif()
- self.appli.affiche_infos("Sauvegarde effectuée")
- if sauvegarde != self.JDCDisplay_courant.fichier :
- # l'utilisateur a sauvegardé le JDC sous un autre nom
- self.JDCDisplay_courant.fichier = sauvegarde
- self.JDCName = self.JDC.nom = stripPath(sauvegarde)
- self.JDC.changefichier(sauvegarde)
- self.changeNomPage()
- return 1
- else :
- return 0
-
- def changeNomPage(self):
- """ Change le nom de l'onglet contenant le JDC courant : en fait détruit l'actuel
- et recrée un autre onglet à la même place avec le bon nom
- """
- nom = self.JDCName
- self.JDCDisplay_courant.jdc.nom = nom
- nom_page = self.nb.getcurselection()
- num_page = self.nb.index(nom_page)
- tab = self.nb.tab(num_page)
- tab.configure(text = nom)
-
- def exitEFICAS(self,event=None):
- """
- Permet de sortir d'EFICAS en demandant à l'utilisateur
- s'il veut sauvegarder les modifications en cours
- """
- liste = self.GetListeJDCaSauvegarder()
- if liste != [] :
- # Certains fichiers n'ont pas été sauvegardés ...
- if askyesno("Enregistrer modifications","Enregistrer les modifications ?") :
- test = self.saveall(liste)
- if test != 1 :
- return
- if askyesno ("Quitter","Voulez-vous vraiment quitter l'application ?") :
- for JDCDisplay in self.liste_JDCDisplay:
- JDCDisplay.jdc.supprime()
- self.appli.quit()
- return
-
- def GetListeJDCaSauvegarder(self) :
- """ Retourne parmi la liste de tous les JDC ouverts la liste de ceux qui ont été modifiés """
- if not self.JDCDisplay_courant : return []
- if len(self.liste_JDCDisplay) == 0 : return l
- l = []
- for JDCDisplay in self.liste_JDCDisplay:
- if JDCDisplay.modified == 'o' :
- l.append(JDCDisplay)
- return l
-
- def copy(self,event=None):
- """
- Lance la copie sur le JDC courant
- """
- if self.JDCDisplay_courant : self.JDCDisplay_courant.doCopy()
-
- def paste(self,event=None):
- """
- Lance le collage sur le JDC courant
- """
- if self.JDCDisplay_courant : self.JDCDisplay_courant.doPaste()
-
- def cut(self,event=None):
- """
- Lance le cut sur le JDC courant
- """
- if self.JDCDisplay_courant: self.JDCDisplay_courant.doCut()
-
- def delete(self):
- """
- Lance la suppression du noeud courant
- """
- if not self.JDCDisplay_courant : return
- self.JDCDisplay_courant.init_modif()
- self.JDCDisplay_courant.node_selected.delete()
-
- def visuJDC_py(self,event=None):
- """
- Méthode permettant d'afficher dans une fenêtre à part l'écho au
- format python du jdc courant
- """
- if not hasattr(self,'JDC') : return
- jdc_fini = self.get_text_JDC('python')
- if jdc_fini == None : return
- Fenetre(self.appli,
- titre = 'fichier '+ self.JDCName + ' à la syntaxe Python',
- texte = jdc_fini)
-
- def visuJDC(self):
- """
- Méthode permettant d'afficher dans une fenêtre à part l'écho au
- format .comm ou .py du jdc courant
- """
- if not hasattr(self,'JDC') : return
- titre = 'fichier '+ self.JDCName + ' à la syntaxe '+ self.code
- format=self.appli.format_fichier.get()
- self.jdc_fini = self.get_text_JDC(format)
- if self.jdc_fini == None : return
- self.visu_fichier_cmd = Fenetre(self.appli,titre=titre,texte = self.jdc_fini)
-
- def get_text_JDC(self,format):
- if generator.plugins.has_key(format):
- # Le generateur existe on l'utilise
- g=generator.plugins[format]()
- jdc_formate=g.gener(self.JDC,format='beautifie')
- if not g.cr.estvide():
- self.appli.affiche_infos("Erreur à la generation")
- showerror("Erreur à la generation","EFICAS ne sait pas convertir ce JDC")
- return
- else:
- return jdc_formate
- else:
- # Il n'existe pas c'est une erreur
- self.appli.affiche_infos("Format %s non reconnu" % format)
- showerror("Format %s non reconnu" % format,"EFICAS ne sait pas convertir le JDC en format %s "% format)
- return
-
- def view_doc(self):
- """
- Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
- - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
- - indication du chemin d'accès aux fichiers pdf à revoir : trop statique
- """
- if not self.JDCDisplay_courant : return
- try:
- cle_doc = self.JDCDisplay_courant.node_selected.item.get_docu()
- if cle_doc == None : return
- cle_doc = string.replace(cle_doc,'.','')
- cle_doc = string.replace(cle_doc,'-','')
- commande = self.appli.CONFIGURATION.exec_acrobat
- nom_fichier = cle_doc+".pdf"
- fichier = os.path.abspath(os.path.join(self.appli.CONFIGURATION.path_doc,nom_fichier))
- if os.name == 'nt':
- os.spawnv(os.P_NOWAIT,commande,(commande,fichier,))
- elif os.name == 'posix':
- script ="#!/usr/bin/sh \n%s %s&" %(commande,fichier)
- pid = os.system(script)
- except AttributeError:
- traceback.print_exc()
- pass
-
- def visu_a_plat(self,event=None):
- """
- Méthode permettant d'afficher dans une fenêtre à part l'écho 'à plat' du jdc courant
- """
- if not hasattr(self,'JDC') : return
- titre = 'fichier '+ self.JDCName + ' à plat '
- self.jdc_fini = self.get_text_JDC('aplat')
- if self.jdc_fini == None : return
- self.visu_fichier_cmd = Fenetre(self.appli,titre=titre,texte = self.jdc_fini)
-
- def visu_txt_brut_JDC(self,event=None):
- """
- Méthode permettant d'afficher le jeu de commandes tel qu'il a été passé au JDC
- """
- if not hasattr(self,'JDC') : return
- titre = "fichier de commandes utilisateur"
- #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")
- return
- os.chdir(self.appli.dir)
- 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):
- """
- Affichage des valeurs des paramètres relus par Eficas
- """
- self.appli.CONFIGURATION.affichage_fichier_ini()
-
- def saveall(self,liste):
- """
- Sauvegarde tous les JDC contenus dans liste
- """
- test = 1
- for JDCDisplay in liste :
- self.JDCDisplay_courant=JDCDisplay
- self.JDC = JDCDisplay.jdc
- test = test * self.saveJDC(echo = 'non')
- return test
-
- def save_homard(self,nom,texte):
- file_homard=nom+'.conf_homard'
- try:
- f=open(file_homard,'w')
- for ligne in texte:
- f.write(ligne)
- f.write('\n')
- f.close()
- except:
- print "Pb a la sauvegarde sous le format homard"
- if hasattr( self.appli, 'salome'):
- import eficasEtude
- self.appli.salome.rangeInStudy(file_homard,"_CONF")
-
-# ---------------------------------------------------------------------------
-# Méthodes liées aux mots-clés inconnus
-# ---------------------------------------------------------------------------
-
- def mc_inconnus(self):
- 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,event=None):
- AIDE.go(master=self.parent)
-
- def update_jdc_courant(self):
- self.JDCDisplay_courant.update()
-
- def TraduitFichier(self):
- directory = self.appli.CONFIGURATION.rep_user
- FichieraTraduire = askopenfilename(title="Nom du Fichier à Traduire",
- defaultextension=".comm",
- initialdir = directory
- )
- if (FichieraTraduire == "" or FichieraTraduire == () ) : return
- i=FichieraTraduire.rfind(".")
- Feuille=FichieraTraduire[0:i]
- FichierTraduit=Feuille+"v8.comm"
- log=self.initialdir+"/convert.log"
- os.system("rm -rf "+log)
- os.system("rm -rf "+FichierTraduit)
- Pmw.showbusycursor()
- traduitV7V8.traduc(FichieraTraduire,FichierTraduit,log)
- Pmw.hidebusycursor()
- Entete="Fichier Traduit : "+FichierTraduit +"\n\n"
- titre = "conversion de "+ FichieraTraduire
-
- if os.stat(log)[6] != 0L :
- f=open(log)
- texte_cr= f.read()
- f.close()
- else :
- texte_cr = Entete
- commande="diff "+FichieraTraduire+" "+FichierTraduit+" >/dev/null"
- try :
- if os.system(commande) == 0 :
- texte_cr = texte_cr + "Pas de difference entre le fichier V7 et le fichier traduit"
- except :
- pass
-
- cptrendu = FenetreSurLigneWarning(self.appli,titre=titre,texte=texte_cr)
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 os
-import sys
-import types
-import string
-import Pmw
-from Tkinter import *
-
-# Modules Eficas
-import fontes
-from treewidget import Tree
-from Objecttreeitem import TreeItem
-from Accas import AsException
-from Noyau.N_CR import justify_text
-from Accas import OPER,PROC,MACRO,FORM
-from Accas import FACT,BLOC,SIMP
-
-#
-__version__="$Name: $"
-__Id__="$Id: catabrowser.py,v 1.3 2002/09/10 15:59:37 eficas Exp $"
-#
-class Tableau:
- incr = 10
- def __init__(self,parent,colonnes):
- self.parent = parent
- self.colonnes = colonnes
- self.init()
-
- def init(self):
- # recherche du nombre maxi de lignes et de colonnes....
- for col in self.colonnes :
- nb_l = 0
- if len(col) > nb_l : nb_l = len(col)
- self.nb_lignes = nb_l
- self.nb_colonnes = len(self.colonnes)
- # initialisation des coordonnées dans le canvas
- self.x0 = self.incr
- self.y0 = self.incr
- self.x = self.x0 + self.incr
- self.y = self.y0 + self.incr
-
- def affiche(self):
- self.scrolledcanvas=Pmw.ScrolledCanvas(self.parent,
- hull_width=1.,
- hull_height=1.,
- borderframe=1)
- Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
- self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
- self.canvas = self.scrolledcanvas.component('canvas')
- self.affiche_colonnes()
-
- def affiche_colonnes(self):
- for i in range(self.nb_lignes):
- self.affiche_ligne(i)
- self.aligne_colonnes()
- self.trace_traits()
- self.scrolledcanvas.resizescrollregion()
-
- def get_xy_max(self):
- try:
- x0,y0,xmax,ymax = self.canvas.bbox(ALL)
- return xmax,ymax
- except:
- return None,None
-
- def trace_traits(self):
- xmax,ymax = self.get_xy_max()
- if not xmax : return
- xmax = xmax+self.incr
- ymax = ymax+self.incr
- # trace les traits horizontaux
- for i in range(self.nb_lignes):
- tag_lig = 'ligne_'+`i`
- l_id = self.canvas.find_withtag(tag_lig)
- x0,y0,x1,y1 = self.bbox(l_id)
- self.canvas.create_line(x0-self.incr,y0-self.incr,xmax,y0-self.incr)
- self.canvas.create_line(self.x0,ymax,xmax,ymax)
- # trace les traits verticaux
- for j in range(self.nb_colonnes):
- tag_col = 'colonne_'+`j`
- l_id = self.canvas.find_withtag(tag_col)
- x0,y0,x1,y1 = self.bbox(l_id)
- self.canvas.create_line(x0-self.incr,y0-self.incr,x0-self.incr,ymax)
- self.canvas.create_line(xmax,self.y0,xmax,ymax)
-
- def bbox(self,l_id):
- x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
- for id in l_id[1:]:
- x2,y2,x3,y3 = self.canvas.bbox(id)
- x0 = min(x2,x0)
- y0 = min(y2,y0)
- x1 = max(x3,x1)
- y1 = max(y3,y1)
- return x0,y0,x1,y1
-
- def affiche_ligne(self,num_lig):
- tag_lig = 'ligne_'+`num_lig`
- num_col = 0
- for col in self.colonnes:
- tag_col = 'colonne_'+`num_col`
- x = 100*num_col+self.x
- id = self.canvas.create_text(x,self.y,
- text = justify_text(col[num_lig],cesure=60),
- tag=(tag_lig,tag_col),
- anchor='nw',
- font = fontes.canvas)
- x0,y0,x1,y1 = self.canvas.bbox(id)
- num_col = num_col+1
- l_id = self.canvas.find_withtag(tag_lig)
- x0,y0,x1,y1 = self.bbox(l_id)
- self.y = y1 + 2*self.incr
-
- def aligne_colonnes(self):
- num_col = 0
- for col in self.colonnes:
- tag_col = 'colonne_'+`num_col`
- l_id = self.canvas.find_withtag(tag_col)
- if not l_id : continue
- x0,y0,x1,y1 = self.bbox(l_id)
- self.move(x1+self.incr,self.colonnes[num_col+1:],num_col+1)
- num_col = num_col+1
-
- def move(self,x,colonnes,num):
- num_col = num
- for col in colonnes:
- tag_col = 'colonne_'+`num_col`
- l_id = self.canvas.find_withtag(tag_col)
- if not l_id : continue
- x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
- self.canvas.move(tag_col,x+self.incr-x0,0)
- num_col = num_col+1
-
-class CATAPanel(Frame) :
- """ Classe servant à créer le panneau représentant l'objet sélectionné dans l'arbre"""
- def __init__(self,parent,panneau,node) :
- self.parent=parent
- self.panneau = panneau
- self.node=node
- Frame.__init__(self,self.panneau)
- self.place(x=0,y=0,relheight=1,relwidth=1)
- self.init()
-
- def init(self):
- # création du label initial
- label = Label(self,
- text = 'Attributs de '+self.node.item.labeltext,
- font = fontes.standard_gras_souligne)
- label.pack(side='top',pady=10)
- # création des listes correspondant aux colonnes du tableau à afficher
- colonne1,colonne2 = self.get_listes()
- # affichage du tableau
- self.tableau = Tableau(self,(colonne1,colonne2))
- self.tableau.affiche()
-
- def get_listes(self):
- self.node.item.get_dico_attributs()
- l_cles_attributs = self.node.item.d_attributs.keys()
- l_cles_attributs.sort()
- ind=0
- liste1 = []
- liste2=[]
- for nom_attr in l_cles_attributs :
- valeur = self.node.item.d_attributs[nom_attr]
- if type(valeur) == types.TupleType:
- texte =''
- for elem in valeur:
- if type(elem) == types.ClassType:
- texte = texte + elem.__name__
- else:
- texte = texte + str(elem)
- elif type(valeur) == types.ClassType :
- texte = valeur.__name__
- else:
- texte = str(valeur)
- liste1.append(nom_attr)
- liste2.append(texte)
- return liste1,liste2
-
-class CATAItem(TreeItem):
- panel = CATAPanel
- def __init__(self,appli,labeltext,object,setfunction=None,objet_cata_ordonne = None):
- self.appli = appli
- self.labeltext = labeltext
- self.object=object
- self.setfunction = setfunction
- self.objet_cata_ordonne = objet_cata_ordonne
-
- def get_dico_fils(self):
- d_fils = {}
- if type(self.object) != types.TupleType:
- for e in dir(self.object):
- cmd = getattr(self.object,e)
- if isCMD(cmd) :
- d_fils[string.strip(cmd.nom)] = cmd
- else:
- for obj in self.object :
- for e in dir(obj):
- cmd = getattr(obj,e)
- if isCMD(cmd) :
- d_fils[string.strip(cmd.nom)] = cmd
- self.d_fils = d_fils
-
- def get_dico_attributs(self):
- d_attributs ={}
- if type(self.object) == types.TupleType :
- self.d_attributs = d_attributs
- return
- l_noms_attributs = ['nom','op','sd_prod','reentrant','repetable','fr','docu','into','valide_vide','actif',
- 'regles','op_init','niveau','definition','code','niveaux','statut',
- 'defaut','min','max','homo','position','val_min','val_max','condition']
- for nom_attribut in l_noms_attributs :
- if hasattr(self.object,nom_attribut):
- attr = getattr(self.object,nom_attribut)
- d_attributs[nom_attribut] = attr
- self.d_attributs = d_attributs
-
- 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,'ordre_mc'):
- return self.objet_cata_ordonne.ordre_mc
- else :
- l=self.objet_cata_ordonne.keys()
- l.sort()
- return l
-
- def GetLabelText(self):
- return self.labeltext,None,None
-
- def get_fr(self):
- return ''
-
- def isMCList(self):
- return 0
-
- def GetSubList(self):
- sublist=[]
- if not hasattr(self,'d_fils'):
- self.get_dico_fils()
- # on classe les fils dans l'odre du catalogue ...
- 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.entites[k]
- else :
- objet_cata = self.objet_cata_ordonne.get(k,None)
- item = make_objecttreeitem(self.appli,k + " : ",self.d_fils[k],
- objet_cata_ordonne = objet_cata)
- sublist.append(item)
- return sublist
-
- def GetIconName(self):
- return 'ast-green-square'
-
- def isactif(self):
- return 1
-
-class CMDItem(CATAItem):
-
- def get_dico_fils(self):
- self.d_fils = self.object.entites
-
-class SIMPItem(CATAItem):
- d_fils={}
- d_attributs={}
-
- def GetIconName(self):
- return 'ast-green-ball'
-
- def IsExpandable(self):
- return 0
-
-class FACTItem(CMDItem):
- def GetIconName(self):
- return 'ast-green-los'
-
-class BLOCItem(FACTItem): pass
-
-class ATTRIBUTItem(SIMPItem):
- def get_dico_attributs(self):
- self.d_attributs = {}
-
- def GetSubList(self):
- return []
-
- def IsExpandable(self):
- return 0
-
- def GetText(self):
- return self.object
-
- def GetIconName(self):
- return 'aucune'
-
-class CataBrowser:
- def __init__(self,parent,appli,cata,item = None):
- self.parent = parent
- self.cata = cata
- self.appli = appli
- self.item = item
- self.init()
-
- def close(self):
- self.top.destroy()
-
- def init(self):
- self.nodes={}
- self.top = Pmw.Dialog(self.parent,
- title = "Visualisation d'un catalogue",
- buttons=('OK',),
- command = self.quit)
- self.pane = Pmw.PanedWidget(self.top.component('dialogchildsite'),
- hull_width = 800,
- hull_height = 500,
- orient = 'horizontal')
- self.pane.add('canvas',min = 0.4, max = 0.6, size = 0.5)
- self.pane.add('panel',min = 0.4, max = 0.6, size = 0.5)
- self.pane.pack(expand =1, fill = 'both')
- self.scrolledcanvas = Pmw.ScrolledCanvas(self.pane.pane('canvas'),
- hull_width=1.,
- hull_height=1.,
- borderframe=1)
- Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
- self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
- if self.item == None :
- self.item = CATAItem(self.appli,"Catalogue",self.cata)
- self.tree = Tree(self.appli,self.item,self.scrolledcanvas,command = self.select_node)
- self.tree.draw()
- self.node = self.tree.node_selected
-
- def select_node(self,node):
- self.nodes[node]=self.create_panel(node)
-
- def create_panel(self,node):
- if hasattr(node.item,"panel"):
- return getattr(node.item,"panel")(self,self.pane.pane('panel'),node)
-
- def quit(self,nom_bouton) :
- self.top.destroy()
-
- def settitle(self):
- self.top.wm_title("Browser de catalogue " )
- self.top.wm_iconname("CataBrowser")
-
-
-dispatch = {
- OPER : CMDItem,
- PROC : CMDItem,
- MACRO : CMDItem,
- SIMP : SIMPItem,
- FACT : FACTItem,
- BLOC : BLOCItem,
-}
-
-def TYPE(o):
- if isinstance(o,OPER):return OPER
- elif isinstance(o,PROC):return PROC
- elif isinstance(o,MACRO):return MACRO
- elif isinstance(o,FORM):return MACRO
- elif isinstance(o,SIMP):return SIMP
- elif isinstance(o,FACT):return FACT
- elif isinstance(o,BLOC):return BLOC
- else:return type(o)
-
-def make_objecttreeitem(appli,labeltext, object, setfunction=None,objet_cata_ordonne=None):
- t = TYPE(object)
- if dispatch.has_key(t):
- c = dispatch[t]
- else:
- #print 'on a un objet de type :',t,' ',object
- c = ATTRIBUTItem
- return c(appli,labeltext, object, setfunction = setfunction,objet_cata_ordonne=objet_cata_ordonne)
-
-def isCMD(cmd):
- return isinstance(cmd,OPER) or isinstance(cmd,PROC) or isinstance(cmd,MACRO) or isinstance(cmd,FORM)
-
-
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 os
-import sys
-import types
-import string
-import Pmw
-from widgets import showinfo
-from Tkinter import *
-
-# Modules Eficas
-import fontes
-from widgets import *
-from treewidget import Tree
-from Objecttreeitem import TreeItem
-from Accas import AsException
-from Noyau.N_CR import justify_text
-
-from Accas import ASSD,GEOM
-import definition_cata
-
-#
-__version__="$Name: $"
-__Id__="$Id: cataediteur.py,v 1.8 2005/11/29 11:14:14 eficas Exp $"
-#
-
-Fonte_Niveau = fontes.canvas_gras_italique
-
-class Panel(Frame) :
- """ Classe servant de classe mère à toutes celles représentant les
- panneaux à afficher en fonction de la nature de l'objet en cours
- Elle est toujours dérivée."""
- def __init__(self,parent,panneau,node) :
- self.parent=parent
- self.panneau = panneau
- self.node=node
- Frame.__init__(self,self.panneau)
- self.place(x=0,y=0,relheight=1,relwidth=1)
- #self.creer_boutons()
- self.init()
-
- def creer_boutons(self):
- """ Méthode créant les boutons se trouvant dans la partie contextuelle d'EFICAS
- (à droite sous les onglets ) """
- self.fr_but = Frame(self,height=30)
- self.fr_but.pack(side='bottom',fill='x')
- self.bouton_com = Button(self.fr_but,
- text = 'Commentaire',
- command = self.ajout_commentaire,
- width=14)
- self.bouton_sup = Button(self.fr_but,
- text = "Supprimer",
- command=self.supprimer,
- width=14)
- self.bouton_doc = Button(self.fr_but,
- text="Documentation",
- command=self.visu_doc,
- width=14)
- self.bouton_cata = Button(self.fr_but,
- text = "Catalogue",
- command = self.show_catalogue,
- width=14)
- if self.parent.appli.CONFIGURATION.isdeveloppeur == 'OUI':
- self.bouton_sup.place(relx=0.25,rely = 0.5,relheight = 0.8,anchor='w')
- self.bouton_cata.place(relx=0.5,rely = 0.5,relheight = 0.8,anchor='w')
- self.bouton_doc.place(relx=0.75,rely = 0.5,relheight = 0.8,anchor='w')
- else:
- self.bouton_sup.place(relx=0.3,rely = 0.5,relheight = 0.8,anchor='w')
- self.bouton_doc.place(relx=0.7,rely = 0.5,relheight = 0.8,anchor='w')
-
- def show_catalogue(self):
- try:
- genea = self.node.item.get_genealogie()
- self.parent.appli.browser_catalogue_objet(genea)
- except Exception,e:
- traceback.print_exc()
-
- def efface(self):
- self.node.efface()
-
- def ajout_commentaire(self,ind='after'):
- """ Ajoute un commentaire à l'intérieur du JDC, par défaut après le noeud en cours"""
- if self.parent.modified == 'n' : self.parent.init_modif()
- return self.node.append_brother("COMMENTAIRE",ind)
-
- def ajout_commentaire_first(self):
- """ Ajoute un commentaire en début de JDC"""
- if self.parent.modified == 'n' : self.parent.init_modif()
- return self.node.append_child("COMMENTAIRE",'first')
-
- def visu_doc(self):
- """ Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
- - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
- - indication du chemin d'accès aux fichiers pdf à revoir : trop statique"""
- cle_doc = self.parent.appli.get_docu(self.node)
- if cle_doc == None : return
- cle_doc = string.replace(cle_doc,'.','')
- commande = self.parent.appli.CONFIGURATION.exec_acrobat
- nom_fichier = cle_doc+".doc"
- rep_fichier = cle_doc[0:2]
- fichier = os.path.abspath(os.path.join(self.parent.appli.CONFIGURATION.path_doc,rep_fichier,nom_fichier))
- print 'commande =',commande
- print 'fichier =',fichier
- print 'existe =',os.path.isfile(fichier)
- if os.name == 'nt':
- os.spawnv(os.P_NOWAIT,commande,(commande,fichier))
- elif os.name == 'posix':
- script ="#!/usr/bin/sh \n%s %s" %(commande,nom_fichier)
- pid = os.system(script)
-
- def supprimer(self):
- """ Suppression du noeud courant """
- 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 """
- self.tkraise()
-
- def selectMC(self,name):
- """ On retrouve le mot-clé sous le curseur pour affichage du fr """
- cmd=self.node.item.get_definition()
- texte_infos = ''
- for e in cmd.entites.keys() :
- if e == name :
- texte_infos=getattr(cmd.entites[e],'fr')
- break
- if texte_infos == '' : texte_infos="Pas d'infos disponibles"
- self.parent.appli.affiche_infos(texte_infos)
-
- def defMC(self,name):
- """ On ajoute un mot-clé à la commande : subnode """
- if name == SEPARATEUR:return
- if self.parent.modified == 'n' : self.parent.init_modif()
- if name != "COMMENTAIRE":
- self.node.append_child(name)
- else :
- self.ajout_commentaire()
-
- def selectFilsCmd(self,name):
- pass
-
- def defFilsCmd(self,name):
- pass
-
- def defCmdFirst(self,name):
- """ On ajoute une commande ou un commentaire au début du fichier de commandes """
- if name == SEPARATEUR:return
- if self.parent.modified == 'n' : self.parent.init_modif()
- if name != "COMMENTAIRE":
- new_node = self.node.append_child(name,'first')
- else :
- new_node = self.ajout_commentaire_first()
-
- def add_commande_avant(self,event=None):
- pass
-
- def add_commande_apres(self,event=None):
- pass
-
-class OngletPanel(Panel) :
- """ Cette classe est virtuelle et doit être dérivée
- Elle contient les principales méthodes d'affichage des différents onglets"""
-
- def raisecmd(self,page):
- self.nb.page(page).focus_set()
- if page == 'Concept': self._any.focus()
-
- def affiche(self):
- page=self.nb.getcurselection()
- self.nb.page(page).focus_set()
- if page == 'Concept':self._any.component('entry').focus_set()
- self.tkraise()
-
- def makeConceptPage(self,page):
- """ Crée la page de saisie du nom du concept """
- self.label = Label(page,text='Nom du concept :')
- self.label.place(relx=0.1,rely=0.4)
- self._any = Entry(page,relief='sunken')
- self._any.place(relx=0.35,rely=0.4,relwidth=0.5)
- self._any.bind("<Return>",lambda e,s=self:s.execConcept())
- self._any.bind("<KP_Enter>",lambda e,s=self:s.execConcept())
- self._any.insert(0,self.node.item.GetText())
- type_sd = self.node.item.object.get_type_sd_prod()
- if type_sd :
- txt = "L'opérateur courant retourne un objet de type %s" %type_sd
- self.label = Label(page, text = txt)
- self.label.place(relx=0.5,rely=0.55,anchor='n')
- self._any.focus()
-
- def makeCommandePage(self,page):
- """ Affiche la page d'ajout d'une commande relativement à l'objet commande sélectionné """
- titre = "Où voulez-vous insérer une commande par rapport à %s" %self.node.item.object.nom
- Label(page,text=titre).place(relx=0.5,rely=0.2,anchor='w')
- b_avant = Button(page,text='AVANT',
- command = self.node.item.add_commande_avant)
- b_apres = Button(page,text='APRES',
- command = self.node.item.add_commande_apres)
- b_avant.place(relx=0.35,rely=0.5,anchor='w')
- b_apres.place(relx=0.65,rely=0.5,anchor='w')
-
- def deselectMC(self,name):
- self.parent.appli.affiche_infos('')
-
- def get_liste_cmd(self):
- listeCmd = self.node.item.object.niveau.definition.get_liste_cmd()
- return listeCmd
-
- def get_liste_fils_cmd(self):
- return ['Mot-clé simple','Mot-clé facteur','Bloc']
-
- def makeMoclesPage(self,page):
- frame1 = Frame(page,height = 20)
- frame1.pack(side='top',fill='x')
- label = Label(frame1,text ="Le mot-clé choisi sera ajouté à la fin du catalogue")
- label.pack(side='top')
- frame2 = Frame(page)
- frame2.pack(side='top',fill='both',expand=1)
- liste_cmd = self.get_liste_fils_cmd()
- liste_commandes = (("<Enter>",self.selectFilsCmd),
- ("<Leave>",self.deselectFilsCmd),
- ("<Double-Button-1>",self.defFilsCmd))
- Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes,titre = "Mots-clés")
- Liste.affiche_liste()
-
- def deselectFilsCmd(self,name):
- pass
-
- def makeJDCPage(self,page):
- 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")
- Liste.affiche_liste()
-
- def makeReglesPage(self,page) :
- regles = []
- regles = self.node.item.get_regles()
- dictionnaire = self.node.item.get_mc_presents()
- texte_regles = []
- l_regles_en_defaut=[]
- if len(regles) > 0:
- i = 0
- for regle in regles :
- texte_regles.append(regle.gettext())
- texte,test = regle.verif(dictionnaire)
- if test == 0 : l_regles_en_defaut.append(i)
- i = i+1
- Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
- Liste.affiche_liste()
- #self.afficheListe(page,texte_regles,self.selectRegle,self.execRegle)
-
- def execConcept(self):
- """ Nomme le concept SD retourné par l'étape """
- if self.parent.modified == 'n' : self.parent.init_modif()
- nom = self._any.get()
- # Pourquoi node.etape ???
- #test,mess = self.node.etape.item.nomme_sd(nom)
- test,mess = self.node.item.nomme_sd(nom)
- self.parent.appli.affiche_infos(mess)
- self.node.racine.update()
-
- def changed(self):
- pass
-
- def makeAttributsPage(self,page):
- l_attributs=self.node.item.object.attributs
- d_defauts = self.node.item.object.attributs_defauts
- for attribut in l_attributs :
- attr = self.node.item.object.entites_attributs.get(attribut,None)
- if attr.valeur is d_defauts[attribut] :
- texte = attribut+' = '+repr(attr.valeur)+' (defaut)'
- else:
- texte = attribut+' = '+repr(attr.valeur)
- Label(page,text=texte).pack(side='top')
-
- def makeSimpPage(self,page):
- texte = "Où voulez-vous ajouter un mot-clé simple ?"
- Label(page,text=texte).place(relx=0.5,rely=0.3,anchor='center')
- b1 = Button(page,text='AVANT '+self.node.item.object.nom,command=self.add_simp_avant)
- b2 = Button(page,text='APRES '+self.node.item.object.nom,command=self.add_simp_apres)
- b1.place(relx=0.5,rely=0.5,anchor='center')
- b2.place(relx=0.5,rely=0.6,anchor='center')
-
- def add_simp_avant(self,event=None):
- """
- Ajoute un mot-clé simple avant celui courant
- """
- self.node.append_brother('new_simp','before')
- self.node.update()
-
- def add_simp_apres(self,event=None):
- """
- Ajoute un mot-clé simple après celui courant
- """
- self.node.append_brother('new_simp','after')
- self.node.update()
-
-class TYPEPanel(Frame):
- def __init__(self,parent,panneau,node) :
- self.parent=parent
- self.panneau = panneau
- self.node=node
- Frame.__init__(self,self.panneau)
- self.place(x=0,y=0,relheight=1,relwidth=1)
- self.creer_texte()
-
- def creer_texte(self):
- texte = "Le noeud sélectionné correspond à un type\n"
- self.label = Label(self,text=texte)
- self.label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
-
-class OPERPanel(OngletPanel):
- def init(self):
- nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-
- nb.pack(fill = 'both', expand = 1)
- self.nb=nb
- nb.add('Mocles', tab_text='Ajouter mots-clés')
- nb.add('Commandes',tab_text='Ajouter une commande')
- self.makeMoclesPage(nb.page("Mocles"))
- self.makeCommandePage(nb.page("Commandes"))
- nb.tab('Mocles').focus_set()
- nb.setnaturalsize()
- self.affiche()
-
-class SIMPPanel(OngletPanel):
- def init(self):
- nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
- nb.pack(fill = 'both', expand = 1)
- self.nb=nb
- nb.add('generaux', tab_text='Données générales')
- nb.add('ihm',tab_text='Données IHM')
- nb.add('mocle',tab_text='Ajouter un mot-cle simple')
- self.makeAttributsGenerauxPage(nb.page("generaux"))
- self.makeAttributsIHMPage(nb.page("ihm"))
- self.makeSimpPage(nb.page('mocle'))
- nb.tab('generaux').focus_set()
- nb.setnaturalsize()
- self.affiche()
-
- def makeAttributsGenerauxPage(self,page):
- fr1 = Frame(page,bd=1,relief='raised')
- fr2 = Frame(page,bd=1,relief='raised')
- fr3 = Frame(page,bd=1,relief='raised')
- fr4 = Frame(page,bd=1,relief='raised')
- fr5 = Frame(page,bd=1,relief='raised')
- fr1.place(relheight=0.14,relwidth=1,rely=0)
- fr2.place(relheight=0.14,relwidth=1,rely=0.14)
- fr3.place(relheight=0.29,relwidth=1,rely=0.28)
- fr4.place(relheight=0.14,relwidth=1,rely=0.57)
- fr5.place(relheight=0.28,relwidth=1,rely=0.71)
- # nom du mot-clé
- Label(fr1,text = 'Nom :').place(relx=0.05,rely=0.3,anchor='w')
- self.e_nom = Entry(fr1)
- self.e_nom.place(relx=0.35,rely=0.3,relwidth=0.3,anchor='w')
- self.e_nom.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('nom',None))
- self.e_nom.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('nom',None))
- self.e_nom.insert(0,self.get_valeur_attribut('nom'))
- # Statut
- Label(fr1,text='Statut : ').place(relx=0.05,rely=0.7,anchor='w')
- self.statut=StringVar()
- valeurs_statut=[('obligatoire','o'),
- ('facultatif','f'),
- ('caché','c')
- ]
- self.statut.set(self.node.item.object.get_valeur_attribut('statut'))
- i=0
- for text,mode in valeurs_statut:
- b=Radiobutton(fr1,text=text,variable=self.statut,value=mode,
- command = lambda s=self,m=mode : s.set_valeur_attribut('statut',m))
- b.place(relx=0.25+i*0.25,rely=0.7,anchor='w')
- i=i+1
- # Type ...
- Label(fr2,text='Type de la valeur : ').place(relx=0.05,rely=0.5,anchor='w')
- self.e_type = Entry(fr2)
- self.e_type.place(relx=0.35,rely=0.5,relwidth=0.5,anchor='w')
- self.e_type.insert(0,self.node.item.object.get_valeur_attribut('type'))
- # Domaine de validité
- Label(fr3,text='Domaine de validité : ').place(relx=0.05,rely=0.2,anchor='w')
- self.domaine = StringVar()
- self.domaine.set(self.node.item.object.get_valeur_attribut('domaine_validité'))
- b1=Radiobutton(fr3,text='continu',variable=self.domaine,value='continu',
- command=lambda s=self,f=fr3 :s.change_domaine(f))
- b2=Radiobutton(fr3,text='discret',variable=self.domaine,value='discret',
- command=lambda s=self,f=fr3 :s.change_domaine(f))
- b1.place(relx=0.35,rely=0.2,anchor='w')
- b2.place(relx=0.65,rely=0.2,anchor='w')
- self.change_domaine(fr3)
- # Défaut ...
- if self.domaine.get() == 'continu':
- # le développeur peut donner la valeur qu'il souhaite, moyennant la vérification de type...
- Label(fr4,text='Valeur par défaut : ').place(relx=0.05,rely=0.5,anchor='w')
- self.e_defaut = Entry(fr4)
- self.e_defaut.place(relx=0.35,rely=0.5,relwidth=0.5,anchor='w')
- if self.node.item.object.get_valeur_attribut('defaut') :
- self.e_defaut.insert(0,self.node.item.object.get_valeur_attribut('defaut'))
- self.e_defaut.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('defaut',None))
- self.e_defaut.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('defaut',None))
- else :
- # dans le cas discret, la valeur par défaut doit être dans l'ensemble des valeurs possibles (into)
- liste = self.node.item.object.get_valeur_attribut('into')
- if self.node.item.object.get_valeur_attribut('defaut') :
- self.set_valeur_attribut('defaut',self.node.item.object.get_valeur_attribut('defaut'))
- if liste == None : liste = []
- self.e_defaut = Pmw.OptionMenu(fr4,labelpos='w',label_text = "Valeur par défaut : ",
- items = self.node.item.object.get_valeur_attribut('into'),
- menubutton_width=30)
- self.e_defaut.configure(command = lambda e,s=self : s.set_valeur_attribut('defaut',None))
- self.e_defaut.place(relx=0.05,rely=0.5,anchor='w')
- # Liste de valeurs ?
- Label(fr5,text='Liste de valeurs : ').place(relx=0.05,rely=0.2,anchor='w')
- self.liste_valeurs = BooleanVar()
- liste_valeurs = [('OUI',1),('NON',0)]
- self.liste_valeurs.set(0)
- i=0
- for text,mode in liste_valeurs:
- b=Radiobutton(fr5,text=text,variable=self.liste_valeurs,value=mode,
- command=lambda s=self,f=fr5 :s.change_liste_valeurs(f))
- b.place(relx=0.35+i*0.2,rely=0.2,anchor='w')
- i=i+1
- self.change_liste_valeurs(fr5)
-
- def makeAttributsIHMPage(self,page):
- fr1 = Frame(page,height=100,bd=1,relief='raised')
- fr2 = Frame(page,height=50,bd=1,relief='raised')
- fr1.pack(side='top',fill='x')
- fr2.pack(side='top',fill='x')
- # Champ fr ...
- Label(fr1,text='Champ fr : ').place(relx=0.05,rely=0.35,anchor='w')
- self.e_fr = Entry(fr1)
- self.e_fr.place(relx=0.35,rely=0.35,relwidth=0.6,anchor='w')
- self.e_fr.insert(0,self.node.item.object.get_valeur_attribut('fr'))
- # Champ ang ...
- Label(fr1,text='Champ ang : ').place(relx=0.05,rely=0.70,anchor='w')
- self.e_ang = Entry(fr1)
- self.e_ang.place(relx=0.35,rely=0.70,relwidth=0.6,anchor='w')
- self.e_ang.insert(0,self.node.item.object.get_valeur_attribut('ang'))
- # Clé documentaire ...
- Label(fr2,text='Clé documentaire : ').place(relx=0.05,rely=0.50,anchor='w')
- self.e_docu = Entry(fr2)
- self.e_docu.place(relx=0.35,rely=0.50,relwidth=0.6,anchor='w')
- self.e_docu.insert(0,self.node.item.object.get_valeur_attribut('docu'))
-
- def detruit_widgets(self,l_widgets):
- for nom_widg in l_widgets :
- try:
- widg = getattr(self,nom_widg)
- widg.place_forget()
- delattr(self,nom_widg)
- except:
- pass
-
- def change_liste_valeurs(self,fr5):
- valeur = self.liste_valeurs.get()
- if valeur == 0 :
- # pas de liste de valeurs
- l_widgets=['l_homo','b1_homo','b2_homo','l_min','e_min','l_max','e_max']
- self.detruit_widgets(l_widgets)
- elif valeur == 1:
- # pas de widgets à détruire ...
- if hasattr(self,'l_homo') :
- # on est déjà en mode 'liste' --> rien à faire
- return
- # homo
- self.l_homo = Label(fr5,text='Liste homogène : ')
- self.l_homo.place(relx=0.05,rely=0.4,anchor='w')
- self.homo = BooleanVar()
- self.homo.set(self.node.item.object.get_valeur_attribut('homo'))
- self.b1_homo=Radiobutton(fr5,text='OUI',variable=self.homo,value=1)
- self.b2_homo=Radiobutton(fr5,text='NON',variable=self.homo,value=0)
- self.b1_homo.place(relx=0.35,rely=0.4,anchor='w')
- self.b2_homo.place(relx=0.65,rely=0.4,anchor='w')
- # min ...
- self.l_min = Label(fr5,text='Longueur minimale : ')
- self.l_min.place(relx=0.05,rely=0.6,anchor='w')
- self.e_min = Entry(fr5)
- self.e_min.place(relx=0.4,rely=0.6,relwidth=0.3,anchor='w')
- self.e_min.insert(0,self.node.item.object.get_valeur_attribut('min'))
- # max ...
- self.l_max = Label(fr5,text='Longueur maximale : ')
- self.l_max.place(relx=0.05,rely=0.8,anchor='w')
- self.e_max = Entry(fr5)
- self.e_max.place(relx=0.4,rely=0.8,relwidth=0.3,anchor='w')
- self.e_max.insert(0,self.node.item.object.get_valeur_attribut('max'))
-
- def change_domaine(self,fr3):
- valeur = self.domaine.get()
- if valeur == 'discret' :
- l_widgets = ['l_val_min','l_val_max','e_val_min','e_val_max']
- self.detruit_widgets(l_widgets)
- # into
- #self.l_into = Label(fr3,text='Ensemble de valeurs : ')
- #self.l_into.place(relx=0.2,rely=0.5,anchor='w')
- self.e_into = Pmw.ScrolledListBox(fr3,
- items=self.node.item.object.get_valeur_attribut('into'),
- labelpos='w',
- label_text= 'Ensemble de valeurs : ',
- listbox_height = 3,
- dblclickcommand = self.change_into)
- self.e_into.place(relx=0.05,rely=0.6,relwidth=0.9,anchor='w')
- #self.e_into.insert(0,self.node.item.object.get_valeur_attribut('into'))
- elif valeur == 'continu':
- l_widgets = ['l_into','e_into']
- self.detruit_widgets(l_widgets)
- if hasattr(self,'l_val_min'):
- # on est déjà en mode 'continu' --> rien à faire
- return
- # val_min
- self.l_val_min = Label(fr3,text='Valeur minimale : ')
- self.l_val_min.place(relx=0.05,rely=0.5,anchor='w')
- self.e_val_min = Entry(fr3)
- self.e_val_min.place(relx=0.35,rely=0.5,relwidth=0.5,anchor='w')
- self.e_val_min.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('val_min',None))
- self.e_val_min.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('val_min',None))
- self.set_valeur_attribut('val_min',self.get_valeur_attribut('val_min'))
- # val_max
- self.l_val_max = Label(fr3,text='Valeur maximale : ')
- self.l_val_max.place(relx=0.05,rely=0.8,anchor='w')
- self.e_val_max = Entry(fr3)
- self.e_val_max.place(relx=0.35,rely=0.8,relwidth=0.5,anchor='w')
- self.e_val_max.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('val_max',None))
- self.e_val_max.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('val_max',None))
- self.set_valeur_attribut('val_max',self.get_valeur_attribut('val_max'))
-
-# ------------------------------------------------------------------
-# Méthodes de validation des entrées faites par l'utilisateur
-# ------------------------------------------------------------------
-
- def get_valeur_attribut(self,nom_attr):
- """
- Demande à l'item de retourner la valeur de l'attribut nom_attr
- """
- return self.node.item.get_valeur_attribut(nom_attr)
-
- def set_valeur_attribut(self,nom_attr,new_valeur):
- """
- Affecte la valeur new_valeur à l'attribut nom_attr
- Vérifie si celle-ci est valide, sinon restaure l'ancienne
- """
- if new_valeur is None :
- widget = getattr(self,'e_'+nom_attr)
- if hasattr(widget,'getcurselection'):
- new_valeur = widget.getcurselection()
- else:
- new_valeur = widget.get()
- print "on affecte %s a %s" %(str(new_valeur),nom_attr)
- self.node.item.set_valeur_attribut(nom_attr,new_valeur)
- self.node.update()
-
- def change_into(self):
- """
- Méthode activée par double clic sur la ListBox d'affichage des valeurs discrètes possibles :
- permet de changer la liste de ces valeurs
- """
- showinfo("Fonction non encore disponible",
- "Vous ne pouvez pas encore modifier la liste into par cette IHM")
-
-class OBJECTItem(TreeItem):
- def __init__(self,appli,labeltext,object,setfunction=None,objet_cata_ordonne = None):
- self.appli = appli
- self.labeltext = labeltext
- self.object=object
- self.setfunction = setfunction
- self.objet_cata_ordonne = objet_cata_ordonne
-
- def GetLabelText(self):
- return self.labeltext,None,None
-
- def get_fr(self):
- return ''
-
- def isMCList(self):
- return 0
-
- def isactif(self):
- return 1
-
- def add_commande_avant(self):
- pass
-
- def add_commande_apres(self):
- pass
-
- def set_valeur_attribut(self,nom_attr,new_valeur):
- """
- Affecte la valeur new_valeur à l'attribut nom_attr
- Vérifie si celle-ci est valide, sinon restaure l'ancienne
- """
- old_valeur = self.object.get_valeur_attribut(nom_attr)
- self.object.set_valeur_attribut(nom_attr,new_valeur)
- verificateur = 'verif_'+nom_attr
- if hasattr(self.object,verificateur):
- if not getattr(self.object,verificateur)():
- # la nouvelle valeur de nom_attr n'est pas valide : on restaure l'ancienne (sans vérification)
- self.object.set_valeur_attribut(nom_attr,old_valeur)
- print 'changement de valeur refuse'
- return
- print 'changement de valeur accepte'
- self.object.init_modif()
-
- def get_valeur_attribut(self,nom_attr):
- """
- Retourne la valeur de l'attribut nom_attr
- """
- return self.object.get_valeur_attribut(nom_attr)
-
-class CATAItem(OBJECTItem):
- def GetSubList(self):
- sublist=[]
- for fils in self.object.entites_fils:
- item = make_objecttreeitem(self.appli,fils.objet.label + " : ",fils,objet_cata_ordonne=self.objet_cata_ordonne)
- sublist.append(item)
- return sublist
-
- def GetIconName(self):
- if self.object.isvalid():
- return 'ast-green-square'
- else:
- return 'ast-red-square'
-
- def GetText(self):
- return "Catalogue %s" %self.appli.code
-
- def add_commande_avant(self):
- pass
-
- def add_commande_apres(self):
- pass
-
-
-def transforme_liste_dico(liste):
- d={}
- for item in liste :
- d[item.nom]=item
- return d
-
-class OPERItem(OBJECTItem):
- panel = OPERPanel
- def GetSubList(self):
- sublist=[]
- # on classe les fils dans l'ordre du catalogue ...
- l_cles_fils = self.get_liste_mc_ordonnee()
- # on crée les items fils ...
- dico_fils = transforme_liste_dico(self.object.entites_fils)
- 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.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)
- sublist.append(item)
- return sublist
-
- def GetText(self):
- #return self.object.nom
- return self.object.get_valeur_attribut('nom')
-
- def get_liste_mc_ordonnee(self):
- return self.objet_cata_ordonne.ordre_mc
-
- def GetIconName(self):
- if self.object.isvalid():
- return 'ast-green-square'
- else:
- return 'ast-red-square'
-
- def additem(self,name,pos):
- if isinstance(name,TreeItem) :
- cmd=self.object.addentite(name.getObject(),pos)
- else :
- cmd = self.object.addentite(name,pos)
- typ = TYPE_COMPLET(cmd)
- item = make_objecttreeitem(self.appli,typ + " : ", cmd)
- return item
-
- def get_attribut(self,nom):
- if nom == 'nature': return 'OPERATEUR'
-
- def get_liste_mc_presents(self):
- return []
-
- def verif_condition_regles(self,liste):
- return []
-
-class PROCItem(OPERItem):
- panel = OPERPanel
-
-class MACROItem(OPERItem):
- panel = OPERPanel
-
-class SIMPItem(OPERItem):
- panel = SIMPPanel
-
- def GetIconName(self):
- if self.object.isvalid():
- return 'ast-green-ball'
- else:
- return 'ast-red-ball'
-
- def IsExpandable(self):
- return 0
-
- def GetSubList(self):
- return []
-
-class FACTItem(OPERItem):
- def GetIconName(self):
- if self.object.isvalid():
- return 'ast-green-los'
- else:
- return 'ast-red-los'
-
-class BLOCItem(FACTItem): pass
-
-class TYPEItem(SIMPItem):
- panel = TYPEPanel
- def get_dico_attributs(self):
- self.d_attributs = {}
-
- def GetSubList(self):
- return []
-
- def IsExpandable(self):
- return 0
-
- def GetText(self):
- return self.object.nom
-
-class NIVEAUItem(OPERItem):
- def IsExpandable(self):
- return 1
-
- def get_liste_mc_ordonnee(self):
- l=[]
- for fils in self.object.entites_fils:
- l.append(fils.nom)
- return l
-
- def GetSubList(self):
- sublist=[]
- # on classe les fils dans l'ordre du catalogue ...
- l_cles_fils = self.get_liste_mc_ordonnee()
- # on crꥠles items fils ...
- dico_fils = transforme_liste_dico(self.object.entites_fils)
- 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.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)
- sublist.append(item)
- return sublist
-
- def GetLabelText(self):
- """ Retourne 3 valeurs :
- - le texte à afficher dans le noeud représentant l'item
- - la fonte dans laquelle afficher ce texte
- - la couleur du texte
- """
- return self.labeltext,Fonte_Niveau,'#00008b'
-
- def GetIconName(self):
- if self.object.isvalid():
- return "ast-green-text"
- else:
- return 'ast-red-text'
-
- def additem(self,name,pos):
- if isinstance(name,TreeItem) :
- cmd=self.object.addentite(name.getObject(),pos)
- else :
- cmd = self.object.addentite(name,pos)
- typ = TYPE_COMPLET(obj)
- item = make_objecttreeitem(self.appli,typ+ " : ", cmd)
- return item
-
- def suppitem(self,item) :
- # item = item de l'ETAPE à supprimer du JDC
- # item.getObject() = ETAPE ou _C
- # self.object = JDC
- itemobject=item.getObject()
- if self.object.suppentite(itemobject):
- if isinstance(itemobject,_C):
- message = "Commentaire supprimé"
- else :
- message = "Commande " + itemobject.nom + " supprimée"
- self.appli.affiche_infos(message)
- return 1
- else:
- self.appli.affiche_infos("Pb interne : impossible de supprimer cet objet")
- return 0
-
- def GetText(self):
- return ''
-
-class ATTRIBUTItem(SIMPItem):
- def get_dico_attributs(self):
- self.d_attributs = {}
-
- def GetSubList(self):
- return []
-
- def IsExpandable(self):
- return 0
-
- def GetText(self):
- return self.object
-
- def GetIconName(self):
- return 'aucune'
-
-class CataEditeur:
- def __init__(self,parent,appli,cata):
- self.parent = parent
- self.cata = definition_cata.CATALOGUE(cata)
- self.appli = appli
- self.top = Toplevel()
- self.top.geometry("800x500")
- self.top.title("Edition d'un catalogue")
- self.init()
-
- def close(self):
- self.top.destroy()
-
- def init(self):
- self.nodes={}
- self.creerbarremenus()
- self.pane = Pmw.PanedWidget(self.top,
- hull_width = 800,
- hull_height = 500,
- orient = 'horizontal')
- self.pane.add('canvas',min = 0.4, max = 0.6, size = 0.45)
- self.pane.add('panel',min = 0.4, max = 0.6, size = 0.55)
- self.pane.pack(expand =1, fill = 'both')
- self.scrolledcanvas = Pmw.ScrolledCanvas(self.pane.pane('canvas'),
- hull_width=1.,
- hull_height=1.,
- borderframe=1)
- Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
- self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
- self.item = CATAItem(self.appli,"Catalogue",
- self.cata,
- objet_cata_ordonne = self.appli.readercata.cata_ordonne_dico)
-
- self.tree = Tree(self.appli,self.item,self.scrolledcanvas,command = self.select_node)
- self.tree.draw()
- self.node = self.tree.node_selected
-
- def creerbarremenus(self) :
- self.menubar=Menu(self.top)
- self.filemenu=Menu(self.menubar,tearoff=0)
- self.filemenu.add_command(label='Quitter',command=self.quit)
-
- self.editmenu=Menu(self.menubar,tearoff=0)
- #self.editmenu.add_command(label='Copier',command=self.copy)
- #self.editmenu.add_command(label='Couper',command=self.cut)
- #self.editmenu.add_command(label='Coller',command=self.paste)
-
- self.affichagemenu=Menu(self.menubar,tearoff=0)
- self.affichagemenu.add_command(label='Rapport de validation',
- command = self.visuCR)
- self.affichagemenu.add_command(label='shell',command = self.shell)
- #self.affichagemenu.add_command(label='Fichier ࡰlat',command=self.visu_a_plat)
- #self.affichagemenu.add_command(label='Fichier .py',command =self.visuJDC_py)
- #self.affichagemenu.add_command(label='Fichier source',command = self.visu_txt_brut_JDC)
- #self.affichagemenu.add_command(label='Param鵲es Eficas',command=self.affichage_fichier_ini)
-
- #self.optionmenu=Menu(self.menubar,tearoff=0)
- #self.optionmenu.add_command(label='Catalogue d귥loppeur',command=self.choix_cata_developpeur)
-
- self.menubar.add_cascade(label='Fichier',menu=self.filemenu)
- self.menubar.add_cascade(label='Edition',menu=self.editmenu)
- self.menubar.add_cascade(label='Jeu de commandes',menu=self.affichagemenu)
- #self.menubar.add_cascade(label='Browsers',menu=self.browsermenu)
- #self.menubar.add_cascade(label='Catalogue',menu=self.cataloguemenu)
- #self.menubar.add_cascade(label='Options',menu=self.optionmenu)
- self.top.configure(menu=self.menubar)
- self.top.protocol("WM_DELETE_WINDOW",self.quit)
- self.top.minsize(900,500)
- self.top.geometry("900x500")
-
- def shell(self,event=None):
- import Interp
- d={'j':self.tree.item.getObject()}
- Interp.InterpWindow(d,parent=self.parent)
-
- def visuCR(self,mode='Cata'):
- txt = str(self.cata.report())
- titre="Rapport de validation du catalogue"
- Fenetre(self.appli,titre=titre,texte=txt)
-
- def select_node(self,node):
- self.nodes[node]=self.create_panel(node)
-
- def create_panel(self,node):
- if hasattr(node.item,"panel"):
- return getattr(node.item,"panel")(self,self.pane.pane('panel'),node)
-
- def quit(self) :
- self.top.destroy()
-
- def settitle(self):
- self.top.wm_title("Browser de catalogue " )
- self.top.wm_iconname("CataBrowser")
-
-
-dispatch = {
- 'OPER' : OPERItem,
- 'PROC' : PROCItem,
- 'MACRO' : MACROItem,
- 'SIMP' : SIMPItem,
- 'FACT' : FACTItem,
- 'BLOC' : BLOCItem,
- 'TYPE' : TYPEItem,
- 'NIVEAU' : NIVEAUItem
-}
-
-def TYPE(o):
- if isinstance(o,definition_cata.OPER_CATA):return 'OPER'
- elif isinstance(o,definition_cata.PROC_CATA):return 'PROC'
- elif isinstance(o,definition_cata.MACRO_CATA):return 'MACRO'
- elif isinstance(o,definition_cata.SIMP_CATA):return 'SIMP'
- elif isinstance(o,definition_cata.FACT_CATA):return 'FACT'
- elif isinstance(o,definition_cata.BLOC_CATA):return 'BLOC'
- elif isinstance(o,definition_cata.TYPE_CATA):return 'TYPE'
- elif isinstance(o,definition_cata.NIVEAU_CATA) : return 'NIVEAU'
- else:return type(o)
-
-def TYPE_COMPLET(o):
- if isinstance(o,definition_cata.OPER_CATA):return "OPERATEUR"
- elif isinstance(o,definition_cata.PROC_CATA):return "PROCEDURE"
- elif isinstance(o,definition_cata.MACRO_CATA):return "MACRO"
- elif isinstance(o,definition_cata.SIMP_CATA):return "Mot-clé SIMPLE"
- elif isinstance(o,definition_cata.FACT_CATA):return "Mot-clé FACTEUR"
- elif isinstance(o,definition_cata.BLOC_CATA):return "BLOC"
- elif isinstance(o,definition_cata.TYPE_CATA):return "Type"
- elif isinstance(o,definition_cata.NIVEAU_CATA):return "Niveau"
- else: return "Inconnu ("+`type(o)`+")"
-
-def make_objecttreeitem(appli,labeltext, object, setfunction=None,objet_cata_ordonne=None):
- t = TYPE(object)
- if dispatch.has_key(t):
- c = dispatch[t]
- else:
- print 'on a un objet de type :',type(object),' ',object
- c = ATTRIBUTItem
- return c(appli,labeltext, object, setfunction = setfunction,objet_cata_ordonne=objet_cata_ordonne)
-
-
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-"""
-import types
-
-def centerwindow(window,parent = 'avec'):
- if parent =='avec':
- parent = window.winfo_parent()
- if type(parent) == types.StringType:
- parent = window._nametowidget(parent)
- # Find size of window.
- window.update_idletasks()
- width = window.winfo_width()
- height = window.winfo_height()
- if width == 1 and height == 1:
- # If the window has not yet been displayed, its size is
- # reported as 1x1, so use requested size.
- width = window.winfo_reqwidth()
- height = window.winfo_reqheight()
- # Place in centre of screen:
- if parent =='avec' :
- x = (window.winfo_screenwidth() - width) / 2 - parent.winfo_vrootx()
- y = (window.winfo_screenheight() - height) / 3 - parent.winfo_vrooty()
- else:
- x = (window.winfo_screenwidth() - width) / 2
- y = (window.winfo_screenheight() - height) / 3
- if x < 0:
- x = 0
- if y < 0:
- y = 0
- window.geometry('+%d+%d' % (x, y))
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-"""
-# Modules Python
-import sys
-import os
-
-# Modules Eficas
-import import_code
-import session
-import prefs
-import convert
-import generator
-import string
-from utils import extension_fichier,stripPath, save_in_file
-
-class DUP :
-
- def __init__(self,code):
- """
- """
- self.format_fichier="python"
- self.version_code=None
- self.code=code
-
- self.top=None
- self.test=2
- import configuration
- self.CONFIGURATION=configuration.make_config(self,prefs.REPINI)
-
- self.load_readercata()
- self.cata=self.readercata.cata
-
- self.JDC=None
- self.JDCName=""
- self.J2=None
-
- def load_readercata(self):
- mname='readercata'
- module=__import__(mname,globals(),locals())
- factory=getattr(module,mname.upper())
- appli_composant=factory(self,self.top)
- setattr(self,mname,appli_composant)
-
-
- def openJDC(self,fichier):
- if fichier :
- self.fichier = fichier
- e=extension_fichier(fichier)
- self.JDCName=stripPath(fichier)
- self.initialdir = os.path.dirname(os.path.abspath(fichier))
- else :
- return
-
- format=self.format_fichier
- # Il faut convertir le contenu du fichier en fonction du format
- if convert.plugins.has_key(format):
- # Le convertisseur existe on l'utilise
- p=convert.plugins[format]()
- p.readfile(fichier)
- text=p.convert('exec',self)
- if not p.cr.estvide():
- print ("Erreur à la conversion")
- print str(p.cr)
- return
-
- # On se met dans le repertoire ou se trouve le fichier de commandes
- # pour trouver les eventuels fichiers include ou autres
- # localises a cote du fichier de commandes
- os.chdir(self.initialdir)
- CONTEXT.unset_current_step()
- J=self.cata[0].JdC(procedure=text,appli=self,
- cata=self.cata,cata_ord_dico=self.readercata.cata_ordonne_dico,
- nom = self.JDCName,
- rep_mat=self.CONFIGURATION.rep_mat,
- )
-
- J.analyse()
-
- txt_exception = J.cr.get_mess_exception()
- if txt_exception :
- # des exceptions ont été levées à la création du JDC
- # --> on affiche les erreurs mais pas le JDC
- self.JDC=J
- print("Erreur fatale au chargement de %s" %file)
- else :
- self.JDC=J
-
- def modifieJDC(self,texte):
- if texte == None or texte == "" : return
- format="python"
- lignes=string.split(texte,";")
- textedecoup=""
- for l in lignes :
- textedecoup=textedecoup+l+'\n'
- if convert.plugins.has_key(format):
- p=convert.plugins[format]()
- p.settext(textedecoup)
- text=p.convert('exec',self)
- print text
- if not p.cr.estvide():
- print ("Erreur à la conversion")
- print str(p.cr)
- return
- self.J2=self.cata[0].JdC(procedure=text,appli=self,
- cata=self.cata,
- cata_ord_dico=self.readercata.cata_ordonne_dico,
- nom = self.JDCName+"2",
- rep_mat=self.CONFIGURATION.rep_mat,
- )
- self.J2.definition.code = "MODIF"
- self.J2.analyse()
-
-
- def saveJDC(self,fichierSortie):
- """
- Sauvegarde le JDC courant.
- Retourne 1 si la sauvegarde s'est bien faite, 0 sinon.
- """
- if not hasattr(self,'JDC') : return 0
-
- format="Modif"
-
- if generator.plugins.has_key(format):
- g=generator.plugins[format]()
- jdc_formate=g.genermodifparam(self.JDC,self.J2)
- if not g.cr.estvide():
- self.affiche_infos("Erreur à la generation")
- return 0
- else:
- self.affiche_infos("Format %s non reconnu" % format)
- return 0
-
- self.jdc_fini = string.replace(jdc_formate,'\r\n','\n')
-
- if not save_in_file(fichierSortie,self.jdc_fini) :
- self.affiche_infos("Problème à la sauvegarde du fichier")
- return 0
- else :
- self.affiche_infos("sauvegarde effectuée")
- return 1
-
-
- def affiche_infos(self,mess):
- print mess
-
# Ce dictionnaire est renseigné par la méthode charger_composants
composants = {}
-def charger_composants():
+def charger_composants(Ihm="TK"):
"""
Cette fonction a pour but de charger tous les modules composants graphiques
(fichiers compo*.py dans le même répertoire que ce module )
et de remplir le dictionnaire composants utilisé par make_objecttreeitem
"""
- repertoire=os.path.dirname(__file__)
+ reper=os.path.dirname(__file__)
+ if Ihm == "TK" :
+ repertoire=reper+"/../InterfaceTK"
+ else :
+ repertoire=reper+"/../InterfaceQT"
listfich=glob.glob(os.path.join(repertoire, "compo*.py"))
for fichier in listfich:
m= os.path.basename(fichier)[:-3]
+++ /dev/null
-import Objecttreeitem
-treeitem = Objecttreeitem.ObjectTreeItem
-objet = None
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 *
-import Pmw
-
-import Objecttreeitem
-import compofact
-
-
-class BLOCTreeItem(compofact.FACTTreeItem):
- panel = compofact.FACTPanel
-
- def get_objet(self,name) :
- for v in self.object.mc_liste:
- if v.nom == name : return v
- return None
-
- def iscopiable(self):
- return 0
-
-
-import Accas
-treeitem = BLOCTreeItem
-objet = Accas.MCBLOC
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 *
-import Pmw
-import string
-
-import Objecttreeitem
-import panels
-import fontes
-
-Fonte_Commentaire = fontes.standard_italique
-
-class COMMPanel(panels.OngletPanel):
-
- def init(self):
- """
- Initialise les frame des panneaux contextuels relatifs à un COMMENTAIRE
- """
- nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
- nb.pack(fill = 'both', expand = 1)
- self.nb=nb
- nb.add('TexteComm', tab_text='Texte Commentaire')
- nb.add('Commande', tab_text='Nouvelle Commande')
- nb.add('Commentaire',tab_text='Paramètre/Commentaire')
- self.makeCOMMPage(nb.page("TexteComm"))
- self.makeCommandePage(nb.page("Commande"))
- self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
- nb.tab('TexteComm').focus_set()
- self.enlevebind()
- self.creebind()
- nb.setnaturalsize()
-
- def makeCOMMPage(self,page):
- """
- Crée la page qui permet d'afficher et d'éditer le texte du commentaire
- """
- self.frame_valeur = Frame(page)
- self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
- self.widget_text = Pmw.ScrolledText(self.frame_valeur,
- borderframe=1,
- labelpos='n',
- label_text = 'Texte du commentaire\n ')
- self.widget_text.pack(side='top',expand=1,fill='both')
- self.widget_text.configure(hscrollmode='dynamic',
- vscrollmode='dynamic')
- self.make_buttons()
- self.display_valeur()
-
- def make_buttons(self):
- """
- Crée les boutons du panneau
- """
- #self.bouton_sup.place_forget()
- #self.bouton_doc.place_forget()
- #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
- #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
-
- #self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
- #self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
- #self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
-
- self.bouton_sup.pack_forget()
- self.bouton_doc.pack_forget()
- self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
- self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
-
- self.bouton_val.pack(side='left',padx=5, pady=5)
- self.bouton_ann.pack(side='left',padx=5, pady=5)
- self.bouton_sup.pack(side='right',padx=5, pady=5)
-
- def change_valeur(self):
- """
- Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du commentaire
- """
- if self.parent.modified == 'n' : self.parent.init_modif()
- new_valeur = self.widget_text.get()
- self.node.item.set_valeur(new_valeur)
- self.node.update()
-
- def display_valeur(self):
- """
- Affiche dans self.widget_text la valeur de l'objet commentaire
- (annule d'éventuelles modifications faite par l'utilisateur)
- """
- t=self.node.item.get_valeur()
- try:
- self.widget_text.settext(unicode(t))
- except:
- # Si probleme avec unicode
- self.widget_text.settext(t)
-
-class COMMTreeItem(Objecttreeitem.ObjectTreeItem):
- panel = COMMPanel
-
- def init(self):
- self.setfunction = self.set_valeur
-
- def GetIconName(self):
- """
- Retourne le nom de l'icône associée au noeud qui porte self,
- dépendant de la validité de l'objet
- NB : un commentaire est toujours valide ...
- """
- return "ast-white-percent"
-
- def GetLabelText(self):
- """ Retourne 3 valeurs :
- - le texte à afficher dans le noeud représentant l'item
- - la fonte dans laquelle afficher ce texte
- - la couleur du texte
- """
- return 'commentaire',Fonte_Commentaire,None
-
- def get_valeur(self):
- """
- Retourne la valeur de l'objet Commentaire cad son texte
- """
- return self.object.get_valeur() or ''
-
- def GetText(self):
- texte = self.object.valeur
- texte = string.split(texte,'\n')[0]
- if len(texte) < 25 :
- return texte
- else :
- return texte[0:24]
-
- def set_valeur(self,valeur):
- """
- Afefcte valeur à l'objet COMMENTAIRE
- """
- self.object.set_valeur(valeur)
-
- def GetSubList(self):
- """
- Retourne la liste des fils de self
- """
- return []
-
-
- def get_objet_commentarise(self):
- """
- La méthode get_objet_commentarise() de la classe compocomm.COMMTreeItem
- surcharge la méthode get_objet_commentarise de la classe Objecttreeitem.ObjectTreeItem
- elle a pour but d'empecher l'utilisateur final de commentariser un commentaire.
- """
- raise Exception( 'Citoyen : tu peux "commentariser" une commande MAIS PAS UN COMMENTAIRE' )
-
-import Extensions
-treeitem =COMMTreeItem
-objet = Extensions.commentaire.COMMENTAIRE
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 traceback
-from Tkinter import *
-import Pmw
-import string
-from widgets import showerror
-
-import Objecttreeitem
-import panels
-import fontes
-
-Fonte_Commentaire = fontes.standard_italique
-
-class COMMANDE_COMMPanel(panels.OngletPanel):
- """
- Classe servant à définir le panel associé à une commande commentarisée
- """
- def init(self):
- """
- Initialise les frame des panneaux contextuels relatifs à une commande commentarisée
- """
- panneau=Frame(self)
- panneau.pack(expand=1,fill='both')
- self.make_buttons()
- self.makeCOMMPage(panneau)
- self.enlevebind()
-
- def makeCOMMPage(self,page):
- """
- Crée la page qui permet d'afficher et d'éditer le texte de la commande commentarisée
- """
- self.frame_valeur = Frame(page)
- self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
- self.widget_text = Pmw.ScrolledText(self.frame_valeur,
- borderframe=1,
- labelpos='n',
- label_text = 'Texte de la commande\n ')
- self.widget_text.pack(side='top',expand=1,fill='both')
- self.widget_text.configure(hscrollmode='dynamic',
- vscrollmode='dynamic')
- self.display_valeur()
-
- def make_buttons(self):
- """
- Crée les boutons du panneau
- """
- #self.bouton_sup.place_forget()
- #self.bouton_doc.place_forget()
- #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
- #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
- #self.bouton_unc = Button(self.fr_but,text='Décommentariser',command=self.uncomment,width=14)
-
- #self.bouton_val.place(relx=0.1,rely=0.5,relheight=1,relwidth=0.20,anchor='center')
- #self.bouton_ann.place(relx=0.30,rely=0.5,relheight=1,relwidth=0.20,anchor='center')
- #self.bouton_sup.place(relx=0.50,rely=0.5,relheight=1,relwidth=0.20,anchor='center')
- #self.bouton_unc.place(relx=0.75,rely=0.5,relheight=1,relwidth=0.25,anchor='center')
-
- self.bouton_sup.pack_forget()
- self.bouton_doc.pack_forget()
- self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
- self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
- self.bouton_unc = Button(self.fr_but,text='Décommentariser',command=self.uncomment)
- self.bouton_val.pack(side='left',padx=5, pady=5)
- self.bouton_ann.pack(side='left',padx=5, pady=5)
- self.bouton_sup.pack(side='left',padx=5, pady=5)
- self.bouton_unc.pack(side='right',padx=5, pady=5)
-
- def change_valeur(self):
- """
- Stocke la nouvelle valeur donnée par l'utilisateur comme valeur de la commande commentarisée
- """
- if self.parent.modified == 'n' : self.parent.init_modif()
- new_valeur = self.widget_text.get()
- self.node.item.set_valeur(new_valeur)
- self.node.update()
-
- def display_valeur(self):
- """
- Affiche dans self.widget_text la valeur de la commande commentarisée
- (annule d'éventuelles modifications faite par l'utilisateur)
- """
- self.widget_text.settext(self.node.item.get_valeur())
-
- def uncomment(self):
- """
- Réalise la décommentarisation de self
- """
- try:
- pos=self.node.parent.children.index(self.node)
- commande,nom = self.node.item.uncomment()
- self.node.parent.children[pos].select()
- except Exception,e:
- showerror("Erreur !",str(e))
- return
- #self.parent.appli.bureau.JDCDisplay_courant.ReplaceObjectNode(self.node,commande,nom)
-
-class COMMANDE_COMMTreeItem(Objecttreeitem.ObjectTreeItem):
- panel = COMMANDE_COMMPanel
-
- def init(self):
- self.setfunction = self.set_valeur
-
- def GetIconName(self):
- """
- Retourne le nom de l'icône associée au noeud qui porte self,
- dépendant de la validité de l'objet
- NB : une commande commentarisée est toujours valide ...
- """
- if self.isvalid():
- return "ast-green-percent"
- else:
- return "ast-red-percent"
-
- def GetLabelText(self):
- """ Retourne 3 valeurs :
- - le texte à afficher dans le noeud représentant l'item
- - la fonte dans laquelle afficher ce texte
- - la couleur du texte
- """
- return 'commande commentarisée',Fonte_Commentaire,None
-
- def get_valeur(self):
- """
- Retourne la valeur de la commande commentarisée cad son texte
- """
- return self.object.get_valeur() or ''
-
- def GetText(self):
- texte = self.object.valeur
- texte = string.split(texte,'\n')[0]
- if len(texte) < 25 :
- return texte
- else :
- return texte[0:24]
-
- def set_valeur(self,valeur):
- """
- Afefcte valeur à l'objet commande commentarisée
- """
- self.object.set_valeur(valeur)
-
- def GetSubList(self):
- """
- Retourne la liste des fils de self
- """
- return []
-
- def uncomment(self):
- """
- Demande à l'objet commande commentarisée de se décommentariser.
- Si l'opération s'effectue correctement, retourne l'objet commande
- et éventuellement le nom de la sd produite, sinon lève une exception
- """
- try:
- commande,nom = self.object.uncomment()
- except Exception,e:
- traceback.print_exc()
- raise e
- return commande,nom
-
-import Accas
-treeitem =COMMANDE_COMMTreeItem
-objet = Accas.COMMANDE_COMM
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-from Tkinter import Label,Button
-
-#Modules Eficas
-from Noyau.N_OBJECT import ErrorObj
-import Objecttreeitem
-import panels
-
-class ERRORPanel(panels.Panel_Inactif):
- def creer_texte(self):
- texte = """Le noeud sélectionné correspond à un objet erroné """
- label = Label(self,text=texte,justify='center')
- label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
- bouton = Button(self,text = "Supprimer", command=self.supprimer)
- bouton.place(relx=0.5,rely=0.5,anchor='center')
-
-class ERRORTreeItem(Objecttreeitem.AtomicObjectTreeItem):
- panel = ERRORPanel
- def GetIconName(self):
- return "ast-red-ball"
-
-
-treeitem =ERRORTreeItem
-objet = ErrorObj
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 Pmw
-import Objecttreeitem
-import panels
-
-class FACTPanel(panels.OngletPanel) :
- def init(self) :
- nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
- nb.pack(fill = 'both', expand = 1)
- self.nb=nb
- nb.add('Mocles', tab_text='Ajouter mots-clés')
- panneau=Pmw.PanedWidget(nb.page("Mocles"),
- orient='horizontal')
- panneau.add('left',min=0.4,max=0.6,size=0.5)
- panneau.add('right',min=0.4,max=0.6,size=0.5)
- panneau.pack(expand=1,fill='both')
- self.makeMoclesPage(panneau.pane('left'))
- self.makeReglesPage(panneau.pane('right'))
- nb.tab('Mocles').focus_set()
- nb.setnaturalsize()
- self.enlevebind()
- self.creebind()
- self.affiche()
-
-import treewidget
-class Node(treewidget.Node):
- def doPaste(self,node_selected):
- objet_a_copier = self.item.get_copie_objet()
- child=node_selected.doPaste_MCF(objet_a_copier)
- return child
-
- def doPaste_MCF(self,objet_a_copier):
- child = self.parent.append_child(objet_a_copier,
- pos=self.item,
- retour='oui')
- return child
-
-
-class FACTTreeItem(Objecttreeitem.ObjectTreeItem):
- panel = FACTPanel
- itemNode=Node
-
- def IsExpandable(self):
- return 1
-
- def GetText(self):
- return ''
-
- def GetLabelText(self):
- """ Retourne 3 valeurs :
- - le texte à afficher dans le noeud représentant l'item
- - la fonte dans laquelle afficher ce texte
- - la couleur du texte
- """
- # None --> fonte et couleur par défaut
- return self.object.getlabeltext(),None,None
-
- def isvalid(self):
- return self.object.isvalid()
-
- def iscopiable(self):
- return 1
-
- def GetIconName(self):
- if self.object.isvalid():
- return "ast-green-los"
- elif self.object.isoblig():
- return "ast-red-los"
- else:
- return "ast-yel-los"
-
- def keys(self):
- keys=self.object.mc_dict.keys()
- return keys
-
- def GetSubList(self):
- """
- Reactualise la liste des items fils stockes dans self.sublist
- """
- liste=self.object.mc_liste
- sublist=[None]*len(liste)
- # suppression des items lies aux objets disparus
- for item in self.sublist:
- old_obj=item.getObject()
- if old_obj in liste:
- pos=liste.index(old_obj)
- sublist[pos]=item
- else:
- pass # objets supprimes ignores
- # ajout des items lies aux nouveaux objets
- pos=0
- for obj in liste:
- if sublist[pos] is None:
- # nouvel objet : on cree un nouvel item
- def setfunction(value, object=obj):
- object.setval(value)
- item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
- sublist[pos]=item
- pos=pos+1
-
- self.sublist=sublist
- return self.sublist
-
- def additem(self,name,pos):
- #print "compofact.additem",name,pos
- objet = self.object.addentite(name,pos)
- return objet
-
- def suppitem(self,item) :
- """
- Cette methode a pour fonction de supprimer l'item passé en argument
- des fils de l'item FACT qui est son pere
- - item = item du MOCLE à supprimer du MOCLE père
- - item.getObject() = MCSIMP ou MCBLOC
- """
- itemobject=item.getObject()
- if itemobject.isoblig() :
- self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
- return 0
-
- if self.object.suppentite(itemobject):
- message = "Mot-clé " + itemobject.nom + " supprimé"
- self.appli.affiche_infos(message)
- return 1
- else:
- self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
- return 0
-
-import Accas
-objet = Accas.MCFACT
-treeitem = FACTTreeItem
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 les classes permettant de définir les objets graphiques
-représentant un objet de type FORMULE, cad le panneau et l'item de l'arbre
-d'EFICAS
-"""
-
-# import modules Python
-from Tkinter import *
-import Pmw
-import string
-
-# import modules EFICAS
-import widgets
-import panels
-import fontes
-import compooper
-
-Fonte_TITRE = fontes.standard_gras_souligne
-
-
-class FORMULEPanel(panels.OngletPanel):
- """
- Classe servant à construire le panneau associé à un paramètre.
- C'est au moyen de ce panneau que l'utilisateur peut accéder
- aux nom et valeur du paramètre en vue éventuellement de les
- modifier.
- """
-
- def init(self):
- nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
- nb.pack(fill = 'both', expand = 1)
- self.nb=nb
- nb.add('Formule', tab_text='Définition Formule')
- nb.add('Commande', tab_text='Nouvelle Commande')
- nb.add('Commentaire',tab_text='Paramètre/Commentaire')
- self.makeFormulePage(nb.page("Formule"))
- self.makeCommandePage(nb.page("Commande"))
- self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
- nb.tab('Formule').focus_set()
- self.enlevebind()
- self.creebind()
- nb.setnaturalsize()
-
- def makeFormulePage(self,page):
- """
- Crée la page qui permet d'afficher et d'éditer le texte de la FORMULE
- """
- self.frame_valeur = Frame(page)
- self.frame_valeur.pack(fill='both',expand=1)
- #self.frame_valeur.place(relwidth=0.95,relheight=0.95,relx=0.05,rely=0.05,anchor='nw')
- #self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
- # affichage du titre du panneau
- self.titre = StringVar()
- self.titre.set("FORMULE "+self.node.item.get_nom())
-
- self.entry_nom = Entry(self.frame_valeur)
- #Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.,anchor='n')
- Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).grid(row=0,columnspan=2,padx=5,pady=5)
- # création des labels et entries associés aux nom, type retourné, arguments et corps de la FORMULE
-
- #Label(self.frame_valeur,text= 'Nom de la formule : ').place(relx=0.,rely=0.1)
- Label(self.frame_valeur,text= 'Nom de la formule : ').grid(row=1,sticky=W,padx=5,pady=5)
- #Label(self.frame_valeur,text= 'Arguments : ').place(relx=0.,rely=0.40)
- Label(self.frame_valeur,text= 'Arguments : ').grid(row=2,sticky=W,padx=5,pady=5)
- self.entry_arg = Entry(self.frame_valeur)
- #Label(self.frame_valeur,text= 'Expression : ').place(relx=0.,rely=0.65)
- Label(self.frame_valeur,text= 'Expression : ').grid(row=4,sticky=W,padx=5,pady=5)
- self.entry_exp = Entry(self.frame_valeur)
-
- # binding sur les entries
- self.entry_nom.bind("<Return>",self.verif_nom)
- self.entry_nom.bind("<KP_Enter>",self.verif_nom)
- self.entry_arg.bind("<Return>",self.verif_arguments)
- self.entry_arg.bind("<KP_Enter>",self.verif_arguments)
- self.entry_exp.bind("<Return>",self.verif_corps)
- self.entry_exp.bind("<KP_Enter>",self.verif_corps)
- # affichage des entries
- #self.entry_nom.place(relx=0.35,rely=0.10,relwidth=0.2)
- self.entry_nom.grid(row=1,column=1,sticky=W,padx=5,pady=5)
- #self.entry_arg.place(relx=0.35,rely=0.40,relwidth=0.4)
- self.entry_arg.grid(row=2,column=1,sticky=W,padx=5,pady=5)
-
- # affichage d'une phrase d'aide pour les arguments
- aide = """Entrer les arguments sous la forme
-de VARIABLES séparées par des virgules (,)
-Exemple X,Y,Z """
- #Label(self.frame_valeur,text=aide, justify="l").place(relx=0.5,rely=0.47,anchor='n')
- Label(self.frame_valeur,text=aide, justify="l").grid(row=3,columnspan=2,padx=5,pady=5)
-
- #self.entry_exp.place(relx=0.35,rely=0.65,relwidth=0.60)
- self.entry_exp.grid(row=4,column=1,sticky=W,padx=5,pady=5)
- # affichage d'une phrase d'aide pour l'expression
- aide = """Un retour de chariot dans une zone de saisie vous permet de vérifier si
-la valeur que vous avez entrée est valide.
-Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
-valeurs seront effectivement prises en compte."""
- #Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.75,anchor='n')
- Label(self.frame_valeur,text=aide).grid(row=5,columnspan=2,padx=5,pady=5)
- self.frame_valeur.columnconfigure(1,weight=1)
-
- # affichage des nom, type retourné, arguments et corps de la FORMULE
- self.display_valeur()
- # affichage des boutons
- self.make_buttons()
- # entry_nom prend le focus
- self.entry_nom.focus()
-
- def make_buttons(self):
- """
- Crée les boutons du panneau
- """
- #self.bouton_sup.place_forget()
- #self.bouton_doc.place_forget()
- #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
- #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
-
- #self.bouton_val.place(relx=0.15,rely=0.5,relheight=0.8,anchor='center')
- #self.bouton_ann.place(relx=0.40,rely=0.5,relheight=0.8,anchor='center')
- #self.bouton_sup.place(relx=0.65,rely=0.5,relheight=0.8,anchor='center')
- #self.bouton_doc.place(relx=0.90,rely=0.5,relheight=0.8,anchor='center')
-
- self.bouton_sup.pack_forget()
- self.bouton_doc.pack_forget()
- self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
- self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
-
- self.bouton_val.pack(side='left',padx=5, pady=5)
- self.bouton_ann.pack(side='left',padx=5, pady=5)
- self.bouton_sup.pack(side='left',padx=5, pady=5)
- self.bouton_doc.pack(side='right',padx=5, pady=5)
-
- def change_valeur(self):
- """
- Stocke la nouvelle FORMULE décrite par l'utilisateur
- """
- if self.parent.modified == 'n' : self.parent.init_modif()
- # on récupère les nouveaux nom, type retourné, arguments et corps de la FORMULE
- new_nom = self.entry_nom.get()
- new_typ="REEL"
- new_arg = self.entry_arg.get()
- new_exp = self.entry_exp.get()
- self.verif_arguments()
- self.verif_corps()
- # on essaie de les stocker
- test,erreur = self.node.item.save_formule(new_nom,new_typ,new_arg,new_exp)
- if test :
- # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
- self.node.update()
- self.display_valeur()
- self.parent.appli.affiche_infos("FORMULE %s modifiée" %self.node.item.get_nom())
- else:
- # la formule est incorrecte : on affiche les erreurs
- widgets.showerror("Formule incorrecte",erreur)
- self.parent.appli.affiche_infos("FORMULE %s non modifiée" %self.node.item.get_nom())
-
- def display_valeur(self):
- """
- Affiche dans self.widget_text de la valeur de l'objet FORMULE
- (annule d'éventuelles modifications faite par l'utilisateur)
- """
- # on efface tout texte affiché dans les entries
- self.entry_nom.delete(0,END)
- self.entry_arg.delete(0,END)
- self.entry_exp.delete(0,END)
- # on rafraîchit le titre du panneau
- self.titre.set('FORMULE '+self.node.item.get_nom())
- # on insére les nouveaux nom, type retourné, arguments et corps de la FORMULE
- nom = self.node.item.get_nom()
- if nom != '':
- self.entry_nom.insert(END,nom)
- args = self.node.item.get_args()
- if args:
- texte_args=""
- for i in args :
- if texte_args != "" :
- texte_args = texte_args +","
- texte_args=texte_args + i
- self.entry_arg.insert(END,texte_args)
- corps = self.node.item.get_corps()
- if corps :
- self.entry_exp.insert(END,self.node.item.get_corps())
-
- def verif_nom(self,event=None):
- """
- Lance la vérification du nom présent dans entry_nom
- """
- nom = self.entry_nom.get()
- if nom == '':
- test,erreur = 0,"Aucun nom fourni !"
- else:
- test,erreur = self.node.item.verif_nom(nom)
- if not test:
- widgets.showerror("Nom invalide",erreur)
- self.entry_nom.focus()
- self.entry_nom.selection_range(0,END)
- self.parent.appli.affiche_infos("%s n'est pas un nom valide pour une FORMULE" %nom)
- else:
- self.parent.appli.affiche_infos("%s est un nom valide pour une FORMULE" %nom)
- self.entry_arg.focus()
-
- def verif_arguments(self,event=None):
- """
- Lance la vérification des arguments présents dans entry_arg
- """
- arguments = self.entry_arg.get()
- if arguments == '' :
- test,erreur = 0,"Aucun argument fourni"
- else:
- test,erreur = self.node.item.verif_arguments(arguments)
- if not test:
- widgets.showerror("Argument(s) invalide(s)",erreur)
- self.entry_arg.focus()
- self.entry_arg.selection_range(0,END)
- self.parent.appli.affiche_infos("Argument(s) invalide(s) pour une FORMULE")
- else:
- self.parent.appli.affiche_infos("Argument(s) valide(s) pour une FORMULE")
- self.entry_exp.focus()
-
- def verif_corps(self,event=None):
- """
- Lance la vérification du corps de formule présent dans entry_exp
- """
- new_nom = self.entry_nom.get()
- new_typ="REEL"
- new_arg = self.entry_arg.get()
- new_exp = self.entry_exp.get()
- if new_exp == '':
- test,erreur = 0,"Aucune expression fournie !"
- else:
- test,erreur = self.node.item.verif_formule_python((new_nom,new_typ,new_arg,new_exp))
-
- if not test:
- widgets.showerror("Corps de FORMULE invalide",erreur)
- self.entry_exp.focus()
- self.entry_exp.selection_range(0,END)
- self.parent.appli.affiche_infos("Corps de FORMULE invalide")
- else:
- self.parent.appli.affiche_infos("Corps de FORMULE valide")
-
-class FORMULETreeItem(compooper.EtapeTreeItem):
- """
- Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
- qui représente la FORMULE
- """
- panel = FORMULEPanel
-
- def init(self):
- self.setfunction = self.set_valeur
-
-# ---------------------------------------------------------------------------
-# API de FORMULE pour l'arbre
-# ---------------------------------------------------------------------------
- def GetSubList(self):
- """
- Retourne la liste des fils de self
- On considère que FORMULE n'a pas de fils
- --> modification par rapport à MACRO classique
- """
- # dans EFICAS on ne souhaite pas afficher les mots-clés fils de FORMULE
- # de façon traditionnelle
- return []
-
- def GetIconName(self):
- """
- Retourne le nom de l'icône à afficher dans l'arbre
- Ce nom dépend de la validité de l'objet
- """
- if self.object.isactif():
- self.object.state="modified"
- if self.object.isvalid():
- return "ast-green-square"
- else:
- return "ast-red-square"
- else:
- return "ast-white-text"
-
- def GetLabelText(self):
- """ Retourne 3 valeurs :
- - le texte à afficher dans le noeud représentant l'item
- - la fonte dans laquelle afficher ce texte
- - la couleur du texte
- """
- if self.object.isactif():
- # None --> fonte et couleur par défaut
- return self.labeltext,None,None
- else:
- return self.labeltext,fontes.standard_italique,None
-
-# ---------------------------------------------------------------------------
-# Méthodes permettant la modification et la lecture des attributs
-# du paramètre = API graphique de la FORMULE pour Panel et EFICAS
-# ---------------------------------------------------------------------------
-
- def get_nom(self):
- """
- Retourne le nom de la FORMULE
- """
- return self.object.get_nom()
-
- def get_type(self):
- """
- Retourne le type de la valeur retournée par la FORMULE
- """
- return self.object.type_retourne
-
- def get_args(self):
- """
- Retourne les arguments de la FORMULE
- """
- args=""
- for mot in self.object.mc_liste:
- if mot.nom == 'NOM_PARA':
- args=mot.valeur
- break
- if args :
- if args[0] == "(" and args[-1] ==")":
- args=args[1:-1]
- # transforme en tuple si ce n est pas déjà le casa
- try :
- args=string.split(args,',')
- except :
- pass
- return args
-
- def get_corps(self):
- """
- Retourne le corps de la FORMULE
- """
- corps=""
- for mot in self.object.mc_liste:
- if mot.nom == 'VALE':
- corps=mot.valeur
- break
- return corps
-
-
- def get_liste_types_autorises(self):
- """
- Retourne la liste des types autorises pour les valeurs de sortie
- d'une FORMULE
- """
- return self.object.l_types_autorises
-
- def save_formule(self,new_nom,new_typ,new_arg,new_exp):
- """
- Vérifie si (new_nom,new_typ,new_arg,new_exp) définit bien une FORMULE
- licite :
- - si oui, stocke ces paramètres comme nouveaux paramètres de la
- FORMULE courante et retourne 1
- - si non, laisse les paramètres anciens de la FORMULE inchangés et
- retourne 0
- """
- test,erreur = self.object.verif_formule_python(formule=(new_nom,new_typ,new_arg,
- new_exp))
- if test :
- # la formule est bien correcte : on sauve les nouveaux paramètres
- test=self.object.update_formule_python(formule=(new_nom,new_typ,new_exp,new_arg))
- return test,erreur
-
-# ---------------------------------------------------------------------------
-# Accès aux méthodes de vérification de l'objet FORM_ETAPE
-# ---------------------------------------------------------------------------
-
- def verif_nom(self,nom):
- """
- Lance la vérification du nom passé en argument
- """
- return self.object.verif_nom(nom)
-
- def verif_arguments(self,arguments):
- """
- Lance la vérification des arguments passés en argument
- """
- return self.object.verif_arguments('('+arguments+')')
-
- def verif_formule(self,formule):
- """
- Lance la vérification de FORMULE passée en argument
- """
- return self.object.verif_formule(formule=formule)
-
-
- def verif_formule_python(self,formule):
- """
- Lance la vérification de FORMULE passée en argument
- """
- return self.object.verif_formule_python(formule=formule)
-
-import Accas
-treeitem =FORMULETreeItem
-objet = Accas.FORM_ETAPE
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 Pmw
-import Objecttreeitem
-import panels
-
-from widgets import ListeChoix
-
-class JDCPanel(panels.OngletPanel):
- def init(self):
- """ Initialise les frame des panneaux contextuels relatifs à un JDC """
- panneau=Pmw.PanedWidget(self,orient='horizontal')
- panneau.add('left',min=0.4,max=0.6,size=0.5)
- panneau.add('right',min=0.4,max=0.6,size=0.5)
- panneau.pack(expand=1,fill='both')
- self.bouton_com.pack_forget()
- self.makeJDCPage(panneau.pane('left'))
- self.makeReglesPage(panneau.pane('right'))
- self.enlevebind()
-
- def makeReglesPage(self,page) :
- regles = []
- regles = self.node.item.get_regles()
- texte_regles = []
- l_regles_en_defaut=[]
- if len(regles) > 0:
- l_noms_etapes = self.node.item.get_l_noms_etapes()
- i = 0
- for regle in regles :
- texte_regles.append(regle.gettext())
- texte,test = regle.verif(l_noms_etapes)
- if test == 0 : l_regles_en_defaut.append(i)
- i = i+1
- Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
- Liste.affiche_liste()
- # aide associée au panneau
- bulle_aide="""Ce panneau contient la liste des règles qui s'appliquent à l'objet
- en cours d'édition.
- - en noir : règles valides
- - en rouge : règles violées"""
- Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
-import treewidget
-class Node(treewidget.Node):
- def doPaste_Commande(self,objet_a_copier):
- """
- Réalise la copie de l'objet passé en argument qui est nécessairement
- une commande
- """
- #child = self.item.append_child(objet_a_copier,pos='first')
- child = self.append_child(objet_a_copier,pos='first',retour='oui')
- #if child is None : return 0
- return child
-
-
-class JDCTreeItem(Objecttreeitem.ObjectTreeItem):
- panel = JDCPanel
- itemNode=Node
-
- def IsExpandable(self):
- return 1
-
- def GetText(self):
- return " "
-
- def GetLabelText(self):
- # None --> fonte et couleur par défaut
- return self.object.nom,None,None
-
- def get_jdc(self):
- """
- Retourne l'objet pointé par self
- """
- return self.object
-
- def GetIconName(self):
- if self.object.isvalid():
- return "ast-green-square"
- else:
- return "ast-red-square"
-
- def keys(self):
- if self.object.etapes_niveaux != []:
- return range(len(self.object.etapes_niveaux))
- else:
- return range(len(self.object.etapes))
-
- def additem(self,name,pos):
- cmd = self._object.addentite(name,pos)
- return cmd
-
- def suppitem(self,item) :
- # item = item de l'ETAPE à supprimer du JDC
- # item.getObject() = ETAPE ou COMMENTAIRE
- # self.object = JDC
- itemobject=item.getObject()
- if self.object.suppentite(itemobject):
- if itemobject.nature == "COMMENTAIRE" :
- message = "Commentaire supprimé"
- else :
- message = "Commande " + itemobject.nom + " supprimée"
- self.appli.affiche_infos(message)
- return 1
- else:
- self.appli.affiche_infos("Pb interne : impossible de supprimer cet objet")
- return 0
-
- def GetSubList(self):
- """
- Retourne la liste des items fils de l'item jdc.
- Cette liste est conservee et mise a jour a chaque appel
- """
- if self.object.etapes_niveaux != []:
- liste = self.object.etapes_niveaux
- else:
- liste = self.object.etapes
- sublist=[None]*len(liste)
- # suppression des items lies aux objets disparus
- for item in self.sublist:
- old_obj=item.getObject()
- if old_obj in liste:
- pos=liste.index(old_obj)
- sublist[pos]=item
- else:
- pass # objets supprimes ignores
- # ajout des items lies aux nouveaux objets
- pos=0
- for obj in liste:
- if sublist[pos] is None:
- # nouvel objet : on cree un nouvel item
- item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj)
- sublist[pos]=item
- pos=pos+1
-
- self.sublist=sublist
- return self.sublist
-
- def get_l_noms_etapes(self):
- """ Retourne la liste des noms des étapes de self.object"""
- return self.object.get_l_noms_etapes()
-
- def get_liste_cmd(self):
- #print "get_liste_cmd",self.object.niveau.definition
- listeCmd = self.object.niveau.definition.get_liste_cmd()
- return listeCmd
-
-import Accas
-treeitem =JDCTreeItem
-objet = Accas.JDC
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 os,sys,string
-import types
-import Tkinter
-import Pmw
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import panels
-import fontes
-import compooper
-import convert
-from widgets import askopenfilename
-from widgets import Fenetre,FenetreYesNo
-from widgets import showinfo,showerror
-
-#
-__version__="$Name: $"
-__Id__="$Id: compomacro.py,v 1.25.10.1 2006/11/15 17:59:30 cchris Exp $"
-#
-
-class MACROPanel(panels.OngletPanel):
- def init(self):
- nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
- nb.pack(fill = 'both', expand = 1)
- self.nb=nb
- nb.add('Mocles', tab_text='Ajouter mots-clés')
- typsd=self.node.item.object.get_type_produit()
- ficini = self.node.item.wait_fichier_init()
- if typsd != None:
- 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='Nouvelle Commande')
- nb.add('Commentaire',tab_text='Paramètre/Commentaire')
- panneau=Pmw.PanedWidget(nb.page("Mocles"),
- orient='horizontal')
- panneau.add('left',min=0.4,max=0.6,size=0.5)
- panneau.add('right',min=0.4,max=0.6,size=0.5)
- panneau.pack(expand=1,fill='both')
- self.makeCommandePage(nb.page("Commande"))
- if typsd != None:
- self.makeConceptPage(nb.page("Concept"))
- if ficini == 1 :
- self.makeFichierPage(nb.page('Fichierinit'))
- self.makeMoclesPage(panneau.pane('left'))
- self.makeReglesPage(panneau.pane('right'))
- self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
- nb.tab('Mocles').focus_set()
- nb.setnaturalsize()
- self.enlevebind()
- self.creebind()
- self.affiche()
-
- def makeFichierPage(self,page):
- """
- Affiche la page d'onglet correspondant au changement du fichier
- dont a besoin la macro
- """
- titre = Tkinter.Label(page,text="La commande %s requiert un fichier " %self.node.item.get_nom())
- titre.place(relx=0.5,rely=0.2,anchor='center')
- frameMain=Tkinter.Frame(page)
- frameMain.place(relx=0.5,rely=0.4,anchor='center',relwidth=1.)
- Tkinter.Label(frameMain,text="Fichier :").pack(side='left',padx=5)
- self.entry = Tkinter.Entry(frameMain,relief='sunken',bg='white')
- self.entry.pack(side='left',padx=5,fill='x',expand=1)
- frameButtons=Tkinter.Frame(page)
- but1=Tkinter.Button(frameButtons,text='Valider',command = self.change_fichier_init)
- but2=Tkinter.Button(frameButtons,text='Browse',command = self.browse_fichier_init)
- but3=Tkinter.Button(frameButtons,text='Annuler',command = self.annule_fichier_init)
- but1.grid(row=0,column=0,padx=5,pady=5)
- but2.grid(row=0,column=1,padx=5,pady=5)
- but3.grid(row=0,column=2,padx=5,pady=5)
- frameButtons.place(relx=0.5,rely=0.6,anchor='center')
-
- if hasattr(self.node.item.object,'fichier_ini'):
- if self.node.item.object.fichier_ini :
- self.entry.insert(0,self.node.item.object.fichier_ini)
- self.entry.focus()
-
- def convert_file(self,file):
- """
- Methode pour convertir le fichier file dans le format courant
- """
- format=self.parent.appli.format_fichier.get()
- if convert.plugins.has_key(format):
- # Le convertisseur existe on l'utilise
- p=convert.plugins[format]()
- p.readfile(file)
- text=p.convert('execnoparseur')
- if not p.cr.estvide():
- self.parent.appli.affiche_infos("Erreur à la conversion")
- Fenetre(self,
- titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
- texte = str(p.cr))
- return None
- return text
- else:
- # Il n'existe pas c'est une erreur
- self.parent.appli.affiche_infos("Type de fichier non reconnu")
- showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
- return None
-
- def change_fichier_init(self,event=None):
- """
- Effectue le changement de fichier d'initialisation s'il est valide
- """
- new_fic = self.entry.get()
- if not os.path.isfile(new_fic) :
- showinfo("Fichier introuvable","Le fichier que vous avez saisi\n"+
- "n'est pas un nom de fichier valide !")
- self.parent.appli.affiche_infos("Fichier introuvable")
- return
- # On convertit le fichier
- text=self.convert_file(new_fic)
- # Si probleme a la lecture-conversion on arrete le traitement
- if not text:
- return
-
- try:
- self.node.item.object.change_fichier_init(new_fic,text)
- self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
- except:
- # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
- self.parent.appli.affiche_infos("Fichier invalide")
- l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
- f=FenetreYesNo(self.parent.appli,titre="Fichier invalide : voulez vous retablir l ancien fichier ?",
- texte="Erreur dans l'interprétation du nouveau fichier ...\n\n"+string.join(l),
- yes="Retablir",no="Changer")
- f.wait()
- reponse=f.result
- if reponse:
- # On retablit l'ancien fichier
- self.entry.delete(0,Tkinter.END)
- self.node.item.object.restore_fichier_init()
- self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
- fic=self.node.item.object.fichier_ini
- if fic:
- self.entry.insert(0,fic)
- else:
- self.node.item.object.force_fichier_init()
- self.parent.appli.affiche_infos("Fichier invalide ... Nouveau fichier mémorisé")
-
- def annule_fichier_init(self,event=None):
- """ Restaure dans self.entry le nom de fichier_init"""
- self.entry.delete(0,Tkinter.END)
- if self.node.item.object.fichier_ini:
- self.entry.insert(0,self.node.item.object.fichier_ini)
-
- def browse_fichier_init(self,event=None):
- """
- Propose à l'utilisateur une Bsf et retourne le fichier
- sélectionné dans self.entry
- """
- file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
- if file :
- self.entry.delete(0,Tkinter.END)
- self.entry.insert(0,file)
-
- def update_panel(self):
- if hasattr(self,"entry"):
- self.annule_fichier_init()
-
-class MACROTreeItem(compooper.EtapeTreeItem):
- """ Cette classe hérite d'une grande partie des comportements
- de la classe compooper.EtapeTreeItem
- """
- panel=MACROPanel
-
-class INCLUDETreeItemBase(MACROTreeItem):
- rmenu_specs=[("View","makeView"),
- ("Edit","makeEdit"),
- ]
-
- def __init__(self,appli, labeltext, object, setfunction):
- MACROTreeItem.__init__(self,appli, labeltext, object, setfunction)
-
- def iscopiable(self):
- """
- Retourne 1 si l'objet est copiable, 0 sinon
- """
- return 0
-
- def makeEdit(self,appli,node):
- #print "makeEdit",self.object,self.object.nom
- #print "makeEdit",self.object.jdc_aux,self.object.jdc_aux.nom
- #print "makeEdit",self.object.jdc_aux.context_ini
- if self.object.text_converted == 0:
- # Le texte du fichier inclus n'a pas pu etre converti par le module convert
- msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
- msg=msg+self.object.text_error
- Fenetre(self,titre="Include non editable",texte=msg,wrap='none')
- return
-
- if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
- #L'include n'est pas initialise
- self.object.build_include(None,"")
-
- # On cree un nouvel onglet dans le bureau
- appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
- label_onglet=None,
- JDCDISPLAY=macrodisplay.MACRODISPLAY)
-
- def makeView(self,appli,node):
- if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
- showerror("Include vide",
- "L'include doit etre correctement initialisé pour etre visualisé")
- return
-
- nom=self.object.nom
- if hasattr(self.object,'fichier_ini'):
- if self.object.fichier_ini is None:
- nom=nom+' '+"Fichier non défini"
- else:
- nom=nom+' '+self.object.fichier_ini
- macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
-
-class INCLUDEPanel(MACROPanel):
- def makeFichierPage(self,page):
- """
- Affiche la page d'onglet correspondant au changement du fichier INCLUDE
- """
- if not hasattr(self.node.item.object,'fichier_ini'):
- titre = Tkinter.Label(page,text="L'INCLUDE n'a pas de fichier associé\nIl faut d'abord choisir un numero d'unité " )
- titre.place(relx=0.5,rely=0.5,anchor='center')
- else:
- MACROPanel.makeFichierPage(self,page)
-
-class INCLUDETreeItem(INCLUDETreeItemBase):
- panel=INCLUDEPanel
-
-class POURSUITETreeItem(INCLUDETreeItemBase):
- def makeEdit(self,appli,node):
- if self.object.text_converted == 0:
- # Le texte du fichier inclus n'a pas pu etre converti par le module convert
- msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
- msg=msg+self.object.text_error
- Fenetre(self,titre="Poursuite non editable",texte=msg,wrap='none')
- return
-
- if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
- #La poursuite n'est pas initialisee
- text="""DEBUT()
-FIN()"""
- self.object.build_poursuite(None,text)
-
- # On cree un nouvel onglet dans le bureau
- appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
- label_onglet=None,
- JDCDISPLAY=macrodisplay.MACRODISPLAY)
-
- def makeView(self,appli,node):
- if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
- showerror("Poursuite vide","Une POURSUITE doit etre correctement initialisée pour etre visualisée")
- return
- nom=self.object.nom
- if hasattr(self.object,'fichier_ini'):
- if self.object.fichier_ini is None:
- nom=nom+' '+"Fichier non défini"
- else:
- nom=nom+' '+self.object.fichier_ini
- macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
-
-class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
- rmenu_specs=[("View","makeView"),
- ]
- def iscopiable(self):
- """
- Retourne 1 si l'objet est copiable, 0 sinon
- """
- return 1
-
-
-def treeitem(appli, labeltext, object, setfunction=None):
- """ Factory qui retourne l'item adapté au type de macro :
- INCLUDE, POURSUITE, MACRO
- """
- if object.nom == "INCLUDE_MATERIAU":
- return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
- elif object.nom == "INCLUDE":
- return INCLUDETreeItem(appli, labeltext, object, setfunction)
- elif object.nom == "POURSUITE":
- return POURSUITETreeItem(appli, labeltext, object, setfunction)
- else:
- return MACROTreeItem(appli, labeltext, object, setfunction)
-
-import Accas
-objet=Accas.MACRO_ETAPE
-
-import macrodisplay
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-from Tkinter import *
-import Pmw
-
-from Noyau.N_OBJECT import ErrorObj
-import Objecttreeitem
-import panels
-import traceback
-
-class MCLISTPanel(panels.Panel):
- def init(self):
- test_ajout = self.node.item.ajout_possible()
- nom_mcfact = self.node.item.get_nom()
- if test_ajout:
- texte = "Pour ajouter une autre occurrence du mot-clé facteur %s, cliquez ci-dessous" %nom_mcfact
- else:
- texte = "Vous ne pouvez pas ajouter une autre occurrence du mot-clé facteur %s ?" %nom_mcfact
- self.label = Label(self,text = texte)
- self.label.place(relx=0.5,rely=0.4,anchor='center')
- if test_ajout:
- self.but=Button(self,text="AJOUTER",command=self.ajout_occurrence)
- self.but.place(relx=0.5,rely=0.6,anchor='center')
- #Button(self,text="NON",command=None).place(relx=0.6,rely=0.6,anchor='center')
-
- def ajout_occurrence(self,event=None):
- self.node.parent.append_child(self.node.item.get_nom())
-
-import compofact
-import compoerror
-import treewidget
-
-class Node(treewidget.Node):
- def doPaste(self,node_selected):
- objet_a_copier = self.item.get_copie_objet()
- child=node_selected.doPaste_MCF(objet_a_copier)
- #print "doPaste",child
- return child
-
- def doPaste_MCF(self,objet_a_copier):
- if self.item.isMCList() :
- # le noeud courant est une MCList
- child = self.append_child(objet_a_copier,pos='first',retour='oui')
- #child = self.parent.append_child(objet_a_copier,pos='first',retour='oui')
- elif self.item.isMCFact() :
- # le noeud courant est un MCFACT
- if self.parent.item.isMCList():
- # le noeud selectionne est un MCFACT dans une MCList
- child = self.parent.append_child(objet_a_copier,
- pos=self.item,
- retour='oui')
- else:
- # le noeud MCFACT selectionne n'est pas dans une MCList
- child = self.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 !")
- self.appli.affiche_infos("Copie refusée")
- child=None
- #print "doPaste_MCF",child
- return child
-
-class MCListTreeItem(Objecttreeitem.SequenceTreeItem,compofact.FACTTreeItem):
- """ La classe MCListTreeItem joue le role d'un adaptateur pour les objets
- du noyau Accas instances de la classe MCLIST.
- Elle adapte ces objets pour leur permettre d'etre intégrés en tant que
- noeuds dans un arbre graphique (voir treewidget.py et ObjectTreeItem.py).
- Cette classe délègue les appels de méthode et les accès
- aux attributs à l'objet du noyau soit manuellement soit
- automatiquement (voir classe Delegate et attribut object).
- """
- itemNode=Node
-
- def init(self):
- # Si l'objet Accas (MCList) a moins d'un mot cle facteur
- # on utilise directement ce mot cle facteur comme delegue
- self.updateDelegate()
-
- def updateDelegate(self):
- if len(self._object) > 1:
- self.setdelegate(self._object)
- else:
- self.setdelegate(self._object.data[0])
-
- def panel(self,jdcdisplay,pane,node):
- """ Retourne une instance de l'objet panneau associe a l'item (self)
- Si la liste ne contient qu'un mot clé facteur, on utilise le panneau
- FACTPanel.
- Si la liste est plus longue on utilise le panneau MCLISTPanel.
- """
- if len(self._object) > 1:
- return MCLISTPanel(jdcdisplay,pane,node)
- elif isinstance(self._object.data[0],ErrorObj):
- return compoerror.ERRORPanel(jdcdisplay,pane,node)
- else:
- return compofact.FACTPanel(jdcdisplay,pane,node)
-
- def IsExpandable(self):
- if len(self._object) > 1:
- return Objecttreeitem.SequenceTreeItem.IsExpandable(self)
- else:
- return compofact.FACTTreeItem.IsExpandable(self)
-
- def GetSubList(self):
- self.updateDelegate()
- if len(self._object) <= 1:
- self._object.data[0].alt_parent=self._object
- return compofact.FACTTreeItem.GetSubList(self)
-
- liste=self._object.data
- sublist=[None]*len(liste)
- # suppression des items lies aux objets disparus
- for item in self.sublist:
- old_obj=item.getObject()
- if old_obj in liste:
- pos=liste.index(old_obj)
- sublist[pos]=item
- else:
- pass # objets supprimes ignores
- # ajout des items lies aux nouveaux objets
- pos=0
- for obj in liste:
- if sublist[pos] is None:
- # nouvel objet : on cree un nouvel item
- def setfunction(value, object=obj):
- object=value
- item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
- sublist[pos]=item
- #Attention : on ajoute une information supplementaire pour l'actualisation de
- # la validite. L'attribut parent d'un MCFACT pointe sur le parent de la MCLISTE
- # et pas sur la MCLISTE elle meme ce qui rompt la chaine de remontee des
- # informations de validite. alt_parent permet de remedier a ce defaut.
- obj.alt_parent=self._object
- pos=pos+1
-
- self.sublist=sublist
- return self.sublist
-
- def GetIconName(self):
- if self._object.isvalid():
- return "ast-green-los"
- elif self._object.isoblig():
- return "ast-red-los"
- else:
- return "ast-yel-los"
-
- def get_docu(self):
- """ Retourne la clé de doc de l'objet pointé par self """
- return self.object.get_docu()
-
- def iscopiable(self):
- if len(self._object) > 1:
- return Objecttreeitem.SequenceTreeItem.iscopiable(self)
- else:
- return compofact.FACTTreeItem.iscopiable(self)
-
- def isMCFact(self):
- """
- Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
- """
- return len(self._object) <= 1
-
- def isMCList(self):
- """
- Retourne 1 si l'objet pointé par self est une MCList, 0 sinon
- """
- return len(self._object) > 1
-
- def get_copie_objet(self):
- return self._object.data[0].copy()
-
- def additem(self,obj,pos):
- #print "compomclist.additem",obj,pos
- if len(self._object) <= 1:
- return compofact.FACTTreeItem.additem(self,obj,pos)
-
- o= self.object.addentite(obj,pos)
- return o
-
- def suppitem(self,item):
- """
- Retire un objet MCFACT de la MCList (self.object)
- """
- #print "compomclist.suppitem",item
- obj=item.getObject()
- if len(self._object) <= 1:
- return compofact.FACTTreeItem.suppitem(self,item)
-
- if self.object.suppentite(obj):
- if len(self._object) == 1: self.updateDelegate()
- message = "Mot-clé " + obj.nom + " supprimé"
- self.appli.affiche_infos(message)
- return 1
- else:
- self.appli.affiche_infos('Impossible de supprimer ce mot-clé')
- return 0
-
-
-import Accas
-objet = Accas.MCList
-
-def treeitem(appli,labeltext,object,setfunction):
- """ Factory qui produit un objet treeitem adapte a un objet
- Accas.MCList (attribut objet de ce module)
- """
- return MCListTreeItem(appli,labeltext,object,setfunction)
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 *
-import Pmw
-
-import Objecttreeitem
-import panels
-import fontes
-from Extensions import commentaire
-
-Fonte_Niveau = fontes.canvas_gras_italique
-Fonte_Niveau_inactif = fontes.canvas_italique
-
-class NIVEAUPanel(panels.OngletPanel):
- def init(self):
- """ Initialise les frame des panneaux contextuels relatifs à un JDC """
- panneau=Pmw.PanedWidget(self,orient='horizontal')
- panneau.add('left',min=0.4,max=0.6,size=0.5)
- panneau.add('right',min=0.4,max=0.6,size=0.5)
- panneau.pack(expand=1,fill='both')
- self.bouton_com.pack_forget()
- self.makeJDCPage(panneau.pane('left'))
- self.enlevebind()
-
-
-import treewidget
-class Node(treewidget.Node):pass
-
-
-class NIVEAUTreeItem(Objecttreeitem.ObjectTreeItem):
- panel = NIVEAUPanel
- itemNode=Node
-
- def isactif(self):
- return self.object.isactif()
-
- def IsExpandable(self):
- return 1
-
- def GetLabelText(self):
- """ Retourne 3 valeurs :
- - le texte à afficher dans le noeud représentant l'item
- - la fonte dans laquelle afficher ce texte
- - la couleur du texte
- """
- if self.isactif():
- fonte = Fonte_Niveau
- else :
- fonte = Fonte_Niveau_inactif
- return self.labeltext,fonte,'#00008b'
-
- def GetIconName(self):
- if self.isactif():
- if self.object.isvalid():
- return "ast-green-text"
- else:
- return "ast-red-text"
- else:
- return "ast-white-text"
-
- def keys(self):
- if self.object.etapes_niveaux != []:
- return range(len(self.object.etapes_niveaux))
- else:
- return range(len(self.object.etapes))
-
- def GetSubList(self):
- sublist=[]
- for key in self.keys():
- if self.object.etapes_niveaux != []:
- liste = self.object.etapes_niveaux
- else:
- liste = self.object.etapes
- try:
- value = liste[key]
- except KeyError:
- continue
- def setfunction(value, key=key, object=liste):
- object[key] = value
- item =self.make_objecttreeitem(self.appli,value.ident() + " : ", value, setfunction)
- sublist.append(item)
- return sublist
-
- def additem(self,name,pos):
- if isinstance(name,Objecttreeitem.TreeItem) :
- cmd=self.object.addentite(name.getObject(),pos)
- else :
- cmd = self.object.addentite(name,pos)
- item = self.make_objecttreeitem(self.appli,cmd.nom + " : ", cmd)
- return item
-
- def suppitem(self,item) :
- # item = item de l'ETAPE à supprimer du JDC
- # item.getObject() = ETAPE ou COMMENTAIRE
- # self.object = JDC
- itemobject=item.getObject()
- if self.object.suppentite(itemobject):
- if isinstance(item.object,commentaire.COMMENTAIRE):
- message = "Commentaire supprimé"
- else :
- message = "Commande " + itemobject.nom + " supprimée"
- self.appli.affiche_infos(message)
- return 1
- else:
- self.appli.affiche_infos("Pb interne : impossible de supprimer cet objet")
- return 0
-
- def GetText(self):
- return ''
-
-
-import Accas
-treeitem = NIVEAUTreeItem
-objet = Accas.ETAPE_NIVEAU
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 types
-import Tkinter
-import Pmw
-from repr import Repr
-from copy import copy,deepcopy
-
-# Modules Eficas
-import Objecttreeitem
-import panels
-
-#
-__version__="$Name: $"
-__Id__="$Id: componuplet.py,v 1.8 2005/11/03 09:03:48 eficas Exp $"
-#
-
-myrepr = Repr()
-myrepr.maxstring = 100
-myrepr.maxother = 100
-
-# Si Expandable vaut 1 les éléments du nuplet apparaissent dans l'arbre
-# Si Expandable vaut 0 les éléments n'apparaissent pas
-Expandable=1
-
-class NUPLETPanel(panels.OngletPanel):
- def init(self):
- """ Initialise les frame des panneaux contextuels relatifs \340 un NUPLET """
- self.nb=Pmw.NoteBook(self,raisecommand=self.raisecmd)
- self.nb.pack(fill = 'both', expand = 1)
- self.nb.add("Valeurs",tab_text="Saisir valeurs")
- self.makeValeurPage(self.nb.page('Valeurs'))
- self.enlevebind()
- self.creebind()
- self.nb.setnaturalsize()
-
- def makeValeurPage(self,page):
- label = Tkinter.Label(page,text='Valeurs :').pack(side=Tkinter.LEFT)
- i=0
- for obj in self.node.item.object.mc_liste:
- frame_valeur=Tkinter.Frame(page)
- frame_valeur.pack(side=Tkinter.LEFT)
- if hasattr(obj,'definition'):
- objet_mc=obj.definition
- else:
- objet_mc=None
- valeur=obj.valeur
- if type(valeur) == types.InstanceType :
- valeur=obj.getval()
- aide=self.gen_aide(obj)
- if objet_mc.into != None :
- l_choix=list(objet_mc.into)
- #obj.set_valeur(l_choix[0],evaluation='non')
- obj.set_valeur(l_choix[0])
- option=Pmw.OptionMenu (frame_valeur,
- items = l_choix,
- menubutton_width = 10,
- command = lambda e,obj=obj,s=self:s.record_valeur(val=e,obj=obj),
- )
- option.pack(side=Tkinter.LEFT,padx=1)
- else :
- entry = Tkinter.Entry(frame_valeur,relief='sunken',width=10)
- entry.pack(side=Tkinter.LEFT,padx=1)
- entry.bind("<Return>",
- lambda e,obj=obj,s=self:s.valid_valeur(e,obj=obj))
- entry.bind("<KP_Enter>",
- lambda e,obj=obj,s=self:s.valid_valeur(e,obj=obj))
- if i==0:entry.focus_set()
- #aide = Tkinter.Label(frame_valeur, text = aide)
- #aide.place(relx=0.5,rely=0.55,anchor='n')
- if valeur != None :
- entry.delete(0,Tkinter.END)
- entry.insert(0,obj.getval())
- i=i+1
-
- def record_valeur(self,val=None,obj=None,mess='Valeur du mot-cl\351 enregistr\351e'):
- """
- Enregistre val comme valeur de self.node.item.object SANS faire de
- test de validité
- """
- #obj.set_valeur(val,evaluation='non')
- obj.set_valeur(val)
- self.parent.appli.affiche_infos(mess)
- #self.node.parent.verif()
- #self.node.update()
-
- def valid_valeur(self,e,obj=None,mess='Valeur du mot-cl\351 enregistr\351e'):
- """
- Enregistre val comme valeur de self.node.item.object avec
- test de validité
- """
- valeur=e.widget.get()
- e.widget.delete(0,Tkinter.END)
- anc_val=obj.getval()
- if anc_val == None:anc_val=''
- test=obj.set_valeur(valeur)
- if test:
- if obj.isvalid():
- self.parent.appli.affiche_infos('Valeur du mot-cl\351 enregistr\351e')
- e.widget.insert(0,obj.getval())
- else:
- #obj.set_valeur(anc_val,evaluation='non')
- obj.set_valeur(anc_val)
- self.parent.appli.affiche_infos("valeur du mot-cl\351 non autoris\351e")
- e.widget.insert(0,anc_val)
- else:
- print "impossible d'\351valuer : %s " %valeur
- print "test =",test
- self.parent.appli.affiche_infos("valeur du mot-cl\351 non autoris\351e")
- e.widget.delete(0,Tkinter.END)
- e.widget.insert(0,anc_val)
-
- #self.node.parent.verif()
- #self.node.update()
-
- def gen_aide(self,obj):
- return ""
-
-
-class NUPLETTreeItem(Objecttreeitem.ObjectTreeItem):
- panel=NUPLETPanel
-
- def IsExpandable(self):
- return Expandable
-
- def GetText(self):
- return ''
-
- def isvalid(self):
- return self.object.isvalid()
-
- def GetIconName(self):
- if self.object.isvalid():
- return "ast-green-los"
- elif self.object.isoblig():
- return "ast-red-los"
- else:
- return "ast-yel-los"
-
- def GetSubList(self):
- if not Expandable:return []
- sublist=[]
- for obj in self.object.mc_liste:
- item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, None)
- sublist.append(item)
- return sublist
-
- def additem(self,name,pos):
- raise "NUPLET"
-
- def suppitem(self,item) :
- raise "NUPLET"
-
-import Accas
-treeitem=NUPLETTreeItem
-objet=Accas.MCNUPLET
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 *
-import Pmw
-import traceback
-import Objecttreeitem
-import panels
-import fontes
-
-class OPERPanel(panels.OngletPanel):
-
- def init(self):
- nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
- nb.pack(fill = 'both', expand = 1)
- self.nb=nb
- nb.add('Mocles', tab_text='Nouveau mot-clé')
- nb.add('Concept', tab_text='Nommer concept')
- nb.add('Commande', tab_text='Nouvelle Commande')
- nb.add('Commentaire',tab_text='Paramètre/Commentaire')
- panneau=Pmw.PanedWidget(nb.page("Mocles"),
- orient='horizontal')
- panneau.add('left',min=0.4,max=0.60,size=0.50)
- panneau.add('right',min=0.4,max=0.60,size=0.50)
- panneau.pack(expand=1,fill='both')
- panneau.setnaturalsize()
- self.makeCommandePage(nb.page("Commande"))
- self.makeConceptPage_oper(nb.page("Concept"))
- self.makeMoclesPage(panneau.pane('left'))
- self.makeReglesPage(panneau.pane('right'))
- #self.makeCommentairePage(nb.page("Commentaire"))
- self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
- nb.tab('Mocles').focus_set()
- self.nb.setnaturalsize()
- self.enlevebind()
- self.creebind()
- self.affiche()
-
- def makeConceptPage_oper(self,page):
- """ Crée la page de saisie du nom du concept """
- if self.node.item.is_reentrant():
- # commande obligatoirement reentrante
- self.makeConceptPage_reentrant(page)
- else:
- # commande non reentrante ou facultativement reentrante
- self.makeConceptPage(page)
-
- def makeConceptPage_reentrant(self,page):
- """ Crée la page de saisie du nom de concept pour un opérateur reentrant
- cad propose dans la liste des SD utilisées dans la commande celle(s) dont le
- type est compatible avec celui que retourne l'opérateur """
- liste_noms_sd = self.node.item.get_noms_sd_oper_reentrant()
- self.listbox = Pmw.ScrolledListBox(page,
- items=liste_noms_sd,
- labelpos='n',
- label_text="Structure(s) de données à enrichir par l'opérateur courant :",
- listbox_height = 6,
- selectioncommand=self.select_valeur_from_list,
- dblclickcommand=lambda s=self,c=self.execConcept : s.choose_valeur_from_list(c))
- self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
- Label(page,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
- self.valeur_choisie = StringVar()
- self.label_valeur = Label(page,textvariable=self.valeur_choisie)
- self.label_valeur.place(relx=0.45,rely=0.6)
- if len(liste_noms_sd) == 1 :
- self.valeur_choisie.set(liste_noms_sd[0])
-
- def select_valeur_from_list(self):
- try:
- choix = self.listbox.getcurselection()[0]
- self.valeur_choisie.set(choix)
- except:
- traceback.print_exc()
-
-
- def choose_valeur_from_list(self,command):
- try:
- choix = self.listbox.getcurselection()[0]
- self.valeur_choisie.set(choix)
- apply(command,(),{})
- except:
- traceback.print_exc()
-
-import treewidget
-class Node(treewidget.Node):
- def doPaste(self,node_selected):
- """
- Déclenche la copie de l'objet item avec pour cible
- l'objet passé en argument : node_selected
- """
- objet_a_copier = self.item.get_copie_objet()
- child=node_selected.doPaste_Commande(objet_a_copier)
- return child
-
- def doPaste_Commande(self,objet_a_copier):
- """
- Réalise la copie de l'objet passé en argument qui est nécessairement
- une commande
- """
- parent=self.parent
- #child = parent.item.append_child(objet_a_copier,self.item.getObject())
- child = self.append_brother(objet_a_copier,retour='oui')
- #if child is None:return 0
- return child
-
- def doPaste_MCF(self,objet_a_copier):
- """
- Réalise la copie de l'objet passé en argument (objet_a_copier)
- Il s'agit forcément d'un mot clé facteur
- """
- child = self.append_child(objet_a_copier,pos='first',retour='oui')
- return child
-
-
-class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
- """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
- Accas. Elle leur permet d'etre affichés comme des noeuds
- d'un arbre graphique.
- Cette classe a entre autres deux attributs importants :
- - _object qui est un pointeur vers l'objet du noyau
- - object qui pointe vers l'objet auquel sont délégués les
- appels de méthode et les accès aux attributs
- Dans le cas d'une ETAPE, _object et object pointent vers le
- meme objet.
- """
- panel = OPERPanel
- itemNode=Node
-
- def IsExpandable(self):
- return 1
-
- def GetIconName(self):
- """
- Retourne le nom de l'icône à afficher dans l'arbre
- Ce nom dépend de la validité de l'objet
- """
- if not self.object.isactif():
- return "ast-white-square"
- elif self.object.isvalid():
- return "ast-green-square"
- else:
- return "ast-red-square"
-
- def GetLabelText(self):
- """ Retourne 3 valeurs :
- - le texte à afficher dans le noeud représentant l'item
- - la fonte dans laquelle afficher ce texte
- - la couleur du texte
- """
- if self.object.isactif():
- # None --> fonte et couleur par défaut
- return self.labeltext,None,None
- else:
- return self.labeltext,fontes.standard_italique,None
-
- def get_objet(self,name) :
- for v in self.object.mc_liste:
- if v.nom == name : return v
- return None
-
- def get_type_sd_prod(self):
- """
- Retourne le nom du type du concept résultat de l'étape
- """
- sd_prod=self.object.get_type_produit()
- if sd_prod:
- return sd_prod.__name__
- else:
- return ""
-
- def additem(self,name,pos):
- #print "compooper.additem",name,pos
- mcent = self._object.addentite(name,pos)
- return mcent
-
- def suppitem(self,item) :
- # item : item du MOCLE de l'ETAPE à supprimer
- # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList
- itemobject=item.getObject()
- if itemobject.isoblig() :
- self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
- return 0
- if self.object.suppentite(itemobject):
- message = "Mot-clé " + itemobject.nom + " supprimé"
- self.appli.affiche_infos(message)
- return 1
- else :
- self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
- return 0
-
- def GetText(self):
- try:
- return self.object.get_sdname()
- except:
- return ''
-
- def keys(self):
- keys=self.object.mc_dict.keys()
- return keys
-
- def GetSubList(self):
- """
- Reactualise la liste des items fils stockes dans self.sublist
- """
- if self.isactif():
- liste=self.object.mc_liste
- else:
- liste=[]
-
- sublist=[None]*len(liste)
- # suppression des items lies aux objets disparus
- for item in self.sublist:
- old_obj=item.getObject()
- if old_obj in liste:
- pos=liste.index(old_obj)
- sublist[pos]=item
- else:
- pass # objets supprimes ignores
-
- # ajout des items lies aux nouveaux objets
- pos=0
- for obj in liste:
- if sublist[pos] is None:
- # nouvel objet : on cree un nouvel item
- def setfunction(value, object=obj):
- object.setval(value)
- item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
- sublist[pos]=item
- pos=pos+1
-
- self.sublist=sublist
- return self.sublist
-
- def isvalid(self):
- return self.object.isvalid()
-
- def iscopiable(self):
- """
- Retourne 1 si l'objet est copiable, 0 sinon
- """
- return 1
-
- def update(self,item):
- if item.sd and item.sd.nom:
- self.nomme_sd(item.sd.nom)
-
- def nomme_sd(self,nom):
- """ Lance la méthode de nommage de la SD """
- oldnom=""
- if self.object.sd != None :
- oldnom=self.object.sd.nom
- test,mess= self.object.nomme_sd(nom)
- if test:self.object.parent.reset_context()
- if (test and self.appli.dict_reels.has_key(oldnom) ):
- self.appli.dict_reels[nom]=self.appli.dict_reels[oldnom]
- return test,mess
-
- def is_reentrant(self):
- return self.object.is_reentrant()
-
- def get_noms_sd_oper_reentrant(self):
- return self.object.get_noms_sd_oper_reentrant()
-
- def get_objet_commentarise(self):
- """
- Cette méthode retourne un objet commentarisé
- représentatif de self.object
- """
- # Format de fichier utilisé
- format=self.appli.format_fichier.get()
- return self.object.get_objet_commentarise(format)
-
- def get_objet_commentarise_BAK(self):
- """
- Cette méthode retourne un objet commentarisé
- représentatif de self.object
- """
- import generator,string,Accas
- # Format de fichier utilisé
- format=self.appli.format_fichier.get()
- g=generator.plugins[format]()
- texte_commande = g.gener(self.object,format='beautifie')
- # Il faut enlever la première ligne vide de texte_commande que
- # rajoute le generator
- rebut,texte_commande = string.split(texte_commande,'\n',1)
- # on construit l'objet COMMANDE_COMM repésentatif de self mais non
- # enregistré dans le jdc
- commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
- parent=self.object.parent)
- commande_comment.niveau = self.object.niveau
- commande_comment.jdc = commande_comment.parent = self.object.jdc
-
- pos=self.object.parent.etapes.index(self.object)
- parent=self.object.parent
- self.object.parent.suppentite(self.object)
- parent.addentite(commande_comment,pos)
-
- return commande_comment
-
- def visu_3D(self,appli,node) :
- import TroisDPal
- troisD=TroisDPal.TroisDPilote(node.item,appli,node.parent)
- troisD.envoievisu()
-
-import Accas
-treeitem = EtapeTreeItem
-objet = Accas.ETAPE
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 les classes permettant de définir les objets graphiques
- représentant un objet de type PARAMETRE, cad le panneau et l'item de l'arbre
- d'EFICAS
-"""
-
-# import modules Python
-from Tkinter import *
-import Pmw
-import string
-
-# import modules EFICAS
-import Objecttreeitem
-import panels
-import fontes
-
-
-Fonte_PARAMETRE = fontes.standard_italique
-Fonte_TITRE = fontes.standard_gras_souligne
-
-
-class PARAMPanel(panels.OngletPanel):
- """
- Classe servant à construire le panneau associé à un paramètre.
- C'est au moyen de ce panneau que l'utilisateur peut accéder
- aux nom et valeur du paramètre en vue éventuellement de les
- modifier.
- """
-
- def init(self):
- """
- Initialise les frame des panneaux contextuels relatifs à un PARAMETRE
- """
- nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
- nb.pack(fill = 'both', expand = 1)
- self.nb=nb
- nb.add('Parametre', tab_text='Valeur Paramètre')
- nb.add('Commande', tab_text='Nouvelle Commande')
- nb.add('Commentaire',tab_text='Paramètre/Commentaire')
- self.makeParametrePage(nb.page("Parametre"))
- self.makeCommandePage(nb.page("Commande"))
- self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
- nb.tab('Parametre').focus_set()
- nb.setnaturalsize()
- self.make_buttons()
- self.enlevebind()
- self.creebind()
-
- def makeParametrePage(self,page):
- """
- Crée la page qui permet d'afficher et d'éditer le texte du PARAMETRE
- """
- self.frame_valeur = Frame(page)
- #self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
- self.frame_valeur.pack(expand=1)
- # affichage du titre du panneau
- self.titre = StringVar()
- self.titre.set("PARAMETRE "+self.node.item.get_nom())
- #Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.1,anchor='n')
- Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).grid(row=0,columnspan=2,padx=5,pady=5)
- # création des labels et entries associés aux nom et valeur du paramètre
- #Label(self.frame_valeur,text= 'Nom du paramètre : ').place(relx=0.,rely=0.3)
- Label(self.frame_valeur,text= 'Nom du paramètre : ').grid(row=1,sticky=W,padx=5,pady=5)
- self.entry_nom = Entry(self.frame_valeur)
- #Label(self.frame_valeur,text= 'Valeur du paramètre : ').place(relx=0.,rely=0.5)
- Label(self.frame_valeur,text= 'Valeur du paramètre : ').grid(row=2,sticky=W,padx=5,pady=5)
- self.entry_val = Entry(self.frame_valeur)
- # binding sur entry_nom
- self.entry_nom.bind("<Return>",lambda e,s=self : s.entry_val.focus())
- self.entry_val.bind("<Return>",lambda e,s=self : s.change_valeur())
- self.entry_nom.bind("<KP_Enter>",lambda e,s=self : s.entry_val.focus())
- self.entry_val.bind("<KP_Enter>",lambda e,s=self : s.change_valeur())
- # affichage des entries
- #self.entry_nom.place(relx=0.35,rely=0.3,relwidth=0.3)
- self.entry_nom.grid(row=1,column=1,sticky=W,padx=5,pady=5)
- #self.entry_val.place(relx=0.35,rely=0.5,relwidth=0.5)
- self.entry_val.grid(row=2,column=1,sticky=W,padx=5,pady=5)
- # affichage d'une phrase d'aide
- aide = """
- Un retour de chariot dans une zone de saisie vous permet de vérifier si
- la valeur que vous avez entrée est valide.
- Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
- valeurs seront effectivement prises en compte
- """
- #Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.65,anchor='n')
- Label(self.frame_valeur,text=aide).grid(row=3,columnspan=2,padx=5,pady=5)
- self.frame_valeur.columnconfigure(1,weight=1)
- # affichage des nom et valeur du paramètre
- self.display_valeur()
- self.entry_nom.focus()
-
- def make_buttons(self):
- """
- Crée les boutons du panneau
- """
- #self.bouton_sup.place_forget()
- #self.bouton_doc.place_forget()
- #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
- #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
- #self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
- #self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
- #self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
-
- self.bouton_sup.pack_forget()
- self.bouton_doc.pack_forget()
- self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
- self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
- self.bouton_val.pack(side='left',padx=5, pady=5)
- self.bouton_ann.pack(side='left',padx=5, pady=5)
- self.bouton_sup.pack(side='right',padx=5, pady=5)
-
- def change_valeur(self):
- """
- Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du PARAMETRE
- """
- if self.parent.modified == 'n' : self.parent.init_modif()
- new_nom = self.entry_nom.get()
- new_val = self.entry_val.get()
- self.node.item.set_nom(new_nom)
- self.node.item.set_valeur(new_val)
- self.node.update()
- self.display_valeur()
-
- def display_valeur(self):
- """
- Affiche dans self.widget_text la valeur de l'objet PARAMETRE
- (annule d'éventuelles modifications faite par l'utilisateur)
- """
- self.entry_nom.delete(0,END)
- self.entry_val.delete(0,END)
- self.titre.set('PARAMETRE '+self.node.item.get_nom())
- self.entry_nom.insert(END,self.node.item.get_nom())
- self.entry_val.insert(END,self.node.item.get_valeur())
-
-class PARAMTreeItem(Objecttreeitem.ObjectTreeItem):
- """
- Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
- qui représente le PARAMETRE
- """
- panel = PARAMPanel
-
- def init(self):
- self.setfunction = self.set_valeur
-
-# ---------------------------------------------------------------------------
-# API du PARAMETRE pour l'arbre
-# ---------------------------------------------------------------------------
-
- def GetIconName(self):
- """
- Retourne le nom de l'icône associée au noeud qui porte self,
- dépendant de la validité de l'objet
- NB : un PARAMETRE est toujours valide ...
- """
- if self.isactif():
- if self.isvalid():
- return "ast-green-square"
- else:
- return "ast-red-square"
- else:
- return "ast-white-square"
-
- def GetLabelText(self):
- """ Retourne 3 valeurs :
- - le texte à afficher dans le noeud représentant l'item
- - la fonte dans laquelle afficher ce texte
- - la couleur du texte
- """
- return 'Paramètre',Fonte_PARAMETRE,None
-
- def GetText(self):
- """
- Retourne le texte à afficher après le nom de la commande (ici après 'paramètre')
- Ce texte est tronqué à 25 caractères
- """
- texte = repr(self.object)
- texte = string.split(texte,'\n')[0]
- if len(texte) < 25 :
- return texte
- else :
- return texte[0:24]+'...'
-
- def GetSubList(self):
- """
- Retourne la liste des fils de self
- """
- return []
-
-# ---------------------------------------------------------------------------
-# Méthodes permettant la modification et la lecture des attributs
-# du paramètre = API graphique du PARAMETRE pour Panel et EFICAS
-# ---------------------------------------------------------------------------
-
- def get_valeur(self):
- """
- Retourne la valeur de l'objet PARAMETRE cad son texte
- """
- if self.object.valeur is None: return ''
- else: return self.object.valeur
-
- def get_nom(self):
- """
- Retourne le nom du paramètre
- """
- return self.object.nom
-
- def set_valeur(self,new_valeur):
- """
- Affecte valeur à l'objet PARAMETRE
- """
- self.object.set_valeur(new_valeur)
-
- def set_nom(self,new_nom):
- """
- Renomme le paramètre
- """
- self.object.set_nom(new_nom)
- #self.object.set_attribut('nom',new_nom)
-
- def get_fr(self):
- """
- Retourne le fr associé au paramètre, cad la bulle d'aide pour EFICAS
- """
- return "Définition d'un paramètre"
-
-import Extensions.parametre
-treeitem =PARAMTreeItem
-objet = Extensions.parametre.PARAMETRE
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 les classes permettant de définir les objets graphiques
-représentant un objet de type PARAMETRE_EVAL, cad le panneau et l'item de l'arbre
-d'EFICAS
-"""
-
-# import modules Python
-from Tkinter import *
-import Pmw
-import string
-
-# import modules EFICAS
-import widgets
-import Objecttreeitem
-import panels
-import fontes
-
-
-Fonte_PARAMETRE = fontes.standard_italique
-Fonte_TITRE = fontes.standard_gras_souligne
-
-
-class PARAM_EVALPanel(panels.OngletPanel):
- """
- Classe servant à construire le panneau associé à un paramètre.
- C'est au moyen de ce panneau que l'utilisateur peut accéder
- aux nom et valeur du paramètre en vue éventuellement de les
- modifier.
- """
-
- def init(self):
- """
- Initialise les frame des panneaux contextuels relatifs à un PARAMETRE
- """
- nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
- nb.pack(fill = 'both', expand = 1)
- self.nb=nb
- nb.add('Parametre', tab_text='Paramètre EVAL')
- nb.add('Commande', tab_text='Nouvelle Commande')
- nb.add('Commentaire',tab_text='Paramètre/Commentaire')
- self.makeParametrePage(nb.page("Parametre"))
- self.makeCommandePage(nb.page("Commande"))
- self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
- nb.tab('Parametre').focus_set()
- nb.setnaturalsize()
- self.make_buttons()
-
- def makeParametrePage(self,page):
- """
- Crée la page qui permet d'afficher et d'éditer le texte du PARAMETRE
- """
- self.frame_valeur = Frame(page)
- self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
- # affichage du titre du panneau
- self.titre = StringVar()
- self.titre.set("PARAMETRE EVAL "+self.node.item.get_nom())
- Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.1,anchor='n')
- # création des labels et entries associés aux nom et valeur du paramètre
- Label(self.frame_valeur,text= 'Nom du paramètre : ').place(relx=0.,rely=0.3)
- self.entry_nom = Entry(self.frame_valeur)
- Label(self.frame_valeur,text= 'Valeur du paramètre : ').place(relx=0.,rely=0.5)
- self.entry_val = Entry(self.frame_valeur)
- # binding sur entry_nom
- self.entry_nom.bind("<Return>",lambda e,s=self : s.verif_nom())
- self.entry_val.bind("<Return>",lambda e,s=self : s.verif_eval())
- self.entry_nom.bind("<KP_Enter>",lambda e,s=self : s.verif_nom())
- self.entry_val.bind("<KP_Enter>",lambda e,s=self : s.verif_eval())
- # affichage des entries
- self.entry_nom.place(relx=0.35,rely=0.3,relwidth=0.3)
- self.entry_val.place(relx=0.35,rely=0.5,relwidth=0.5)
- # affichage d'une phrase d'aide
- aide = """
- Un retour de chariot dans une zone de saisie vous permet de vérifier si
- la valeur que vous avez entrée est valide.
- Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
- valeurs seront effectivement prises en compte
- """
- Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.65,anchor='n')
- # affichage des nom et valeur du paramètre
- self.display_valeur()
- self.entry_nom.focus()
-
- def make_buttons(self):
- """
- Crée les boutons du panneau
- """
- #self.bouton_sup.place_forget()
- #self.bouton_doc.place_forget()
- self.bouton_sup.pack_forget()
- self.bouton_doc.pack_forget()
- #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
- #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
- self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
- self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
- self.bouton_val.bind("<Return>",lambda e,s=self : s.bouton_val.invoke())
- self.bouton_val.bind("<KP_Enter>",lambda e,s=self : s.bouton_val.invoke())
- #self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
- #self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
- #self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
- self.bouton_val.pack(side='left',padx=5, pady=5)
- self.bouton_ann.pack(side='left',padx=5, pady=5)
- self.bouton_sup.pack(side='left',padx=5, pady=5)
-
- def change_valeur(self):
- """
- Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du PARAMETRE
- """
- if self.parent.modified == 'n' : self.parent.init_modif()
- new_nom = self.entry_nom.get()
- new_val = self.entry_val.get()
- #self.node.item.set_nom(new_nom)
- #self.node.item.set_valeur(new_val)
- #self.node.update()
- #self.display_valeur()
- # on essaie de stocker les noms et valeurs
- test,erreur = self.node.item.save_parametre_eval(new_nom,new_val)
- if test :
- # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
- self.node.update()
- self.display_valeur()
- self.parent.appli.affiche_infos("Expression EVAL %s modifiée" %self.node.item.get_nom())
- else:
- # la formule est incorrecte : on affiche les erreurs
- widgets.showerror("Expression EVAL incorrecte",erreur)
- self.parent.appli.affiche_infos("Expression EVAL %s non modifiée" %self.node.item.get_nom())
-
- def display_valeur(self):
- """
- Affiche dans self.widget_text la valeur de l'objet PARAMETRE
- (annule d'éventuelles modifications faite par l'utilisateur)
- """
- self.entry_nom.delete(0,END)
- self.entry_val.delete(0,END)
- self.titre.set('PARAMETRE '+self.node.item.get_nom())
- self.entry_nom.insert(END,self.node.item.get_nom())
- self.entry_val.insert(END,self.node.item.get_valeur())
-
- def verif_nom(self):
- """
- Lance la vérification du nom donné par l'utilisateur dans entry_nom
- """
- nom = self.entry_nom.get()
- test,erreur = self.node.item.verif_nom(nom)
- if not test :
- widgets.showerror("Nom invalide",erreur)
- self.entry_nom.focus()
- self.entry_nom.selection_range(0,END)
- self.parent.appli.affiche_infos("Nom du paramètre refusé")
- else:
- self.parent.appli.affiche_infos("Nom du paramètre accepté")
-
- def verif_eval(self,event=None):
- """
- Lance la vérification de l'expression EVAL présente dans entry_val
- """
- exp_eval = self.entry_val.get()
- test,erreur = self.node.item.verif_eval(exp_eval)
- if not test:
- widgets.showerror("Expression EVAL invalide",erreur)
- self.entry_val.focus()
- self.entry_val.selection_range(0,END)
- self.parent.appli.affiche_infos("Expression EVAL refusée")
- else:
- self.parent.appli.affiche_infos("Expression EVAL acceptée")
-
-class PARAM_EVALTreeItem(Objecttreeitem.ObjectTreeItem):
- """
- Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
- qui représente le PARAMETRE
- """
- panel = PARAM_EVALPanel
-
- def init(self):
- self.setfunction = self.set_valeur
-
-# ---------------------------------------------------------------------------
-# API du PARAMETRE pour l'arbre
-# ---------------------------------------------------------------------------
-
- def GetIconName(self):
- """
- Retourne le nom de l'icône associée au noeud qui porte self,
- dépendant de la validité de l'objet
- NB : un PARAMETRE est toujours valide ...
- """
- if self.isactif():
- if self.isvalid():
- return "ast-green-square"
- else:
- return "ast-red-square"
- else:
- return "ast-white-square"
-
- def GetLabelText(self):
- """ Retourne 3 valeurs :
- - le texte à afficher dans le noeud représentant l'item
- - la fonte dans laquelle afficher ce texte
- - la couleur du texte
- """
- return 'EVAL',Fonte_PARAMETRE,None
-
- def GetText(self):
- """
- Retourne le texte à afficher après le nom de la commande (ici après 'paramètre')
- Ce texte est tronqué à 25 caractères
- """
- texte = repr(self.object)
- texte = string.split(texte,'\n')[0]
- if len(texte) < 25 :
- return texte
- else :
- return texte[0:24]+'...'
-
- def GetSubList(self):
- """
- Retourne la liste des fils de self
- """
- return []
-
-# ---------------------------------------------------------------------------
-# Méthodes permettant la modification et la lecture des attributs
-# du paramètre = API graphique du PARAMETRE pour Panel et EFICAS
-# ---------------------------------------------------------------------------
-
- def isvalid(self):
- """
- Indique si l'objet pointé par self est valide
- """
- return self.object.isvalid()
-
- def get_valeur(self):
- """
- Retourne une chaîne représentant la valeur de l'objet PARAMETRE
- cad de l'objet class_eval.EVAL
- """
- return self.object.get_valeur() or ''
-
- def get_nom(self):
- """
- Retourne le nom du paramètre
- """
- return self.object.get_nom()
-
- def set_valeur(self,new_valeur):
- """
- Affecte new_valeur à l'objet PARAMETRE_EVAL
- """
- # on construit le texte de la nouvelle valeur
- new_valeur = 'EVAL("""'+new_valeur+'""")'
- # on affecte la nouvelle valeur à self.object
- self.object.set_valeur(new_valeur)
-
- def set_nom(self,new_nom):
- """
- Renomme le paramètre
- """
- self.object.set_nom(new_nom)
-
- def get_fr(self):
- """
- Retourne le fr associé au paramètre, cad la bulle d'aide pour EFICAS
- """
- return "Définition d'un paramètre de type EVAL"
-
- def verif_nom(self,nom):
- """
- Lance la vérification de validité du nom passé en argument
- """
- return self.object.verif_nom(nom = nom)
-
- def verif_eval(self,valeur):
- """
- Lance la vérification de validité de l'expression EVAL passée en argument
- """
- return self.object.verif_eval(exp_eval = valeur)
-
- def save_parametre_eval(self,new_nom,new_val):
- """
- Vérifie si (new_nom,new_val) définit bien un EVAL licite :
- - si oui, stocke ces paramètres comme nouveaux paramètres de l'EVAL courant et retourne 1
- - si non, laisse les paramètres anciens de EVAL inchangés et retourne 0
- """
- test,erreur = self.object.verif_parametre_eval(param=(new_nom,new_val))
- if test :
- # la formule est bien correcte : on sauve les nouveaux paramètres
- self.object.update(param=(new_nom,new_val))
- return test,erreur
-
-import Extensions.parametre_eval
-treeitem =PARAM_EVALTreeItem
-objet = Extensions.parametre_eval.PARAMETRE_EVAL
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 *
-import Pmw
-
-import Objecttreeitem
-import panels
-import fontes
-import compooper
-
-class PROCPanel(panels.OngletPanel):
- def init(self):
- nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
- self.nb=nb
- nb.pack(fill = 'both', expand = 1)
- nb.add('Mocles', tab_text='Ajouter mots-clés')
- nb.add('Commande', tab_text='Nouvelle Commande')
- nb.add('Commentaire',tab_text='Paramètre/Commentaire')
- panneau=Pmw.PanedWidget(nb.page("Mocles"),
- orient='horizontal')
- panneau.add('left',min=0.4,max=0.6,size=0.5)
- panneau.add('right',min=0.4,max=0.6,size=0.5)
- panneau.pack(expand=1,fill='both')
- self.makeCommandePage(nb.page("Commande"))
- self.makeMoclesPage(panneau.pane('left'))
- self.makeReglesPage(panneau.pane('right'))
- self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
- nb.setnaturalsize()
- self.enlevebind()
- self.creebind()
- self.affiche()
-
-class ProcEtapeTreeItem(compooper.EtapeTreeItem):
- panel = PROCPanel
-
-import Accas
-treeitem = ProcEtapeTreeItem
-objet = Accas.PROC_ETAPE
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-
-class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
- from newsimppanel import newSIMPPanel
- panel = newSIMPPanel
-
- def init(self) :
- self.expandable = 0
- self.affect_panel()
-
-
- def affect_panel(self):
- """
- Cette méthode attribue le panel à l'objet pointé par self en fonction de la
- nature de la valeur demandée pour cet objet
- """
- from uniquepanel import UNIQUE_Panel
- from plusieurspanel import PLUSIEURS_Panel
-
- #print "affect_panel : ",self.nom,self.is_list(),self.has_into()
- # Attention l ordre des if est important
-
- if self.wait_shell():
- # l'objet attend un shell
- from shellpanel import SHELLPanel
- self.panel = SHELLPanel
- elif self.has_into():
- # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
- if self.is_list() :
- from plusieursintopanel import PLUSIEURS_INTO_Panel
- self.panel = PLUSIEURS_INTO_Panel
- else:
- from uniqueintopanel import UNIQUE_INTO_Panel
- self.panel = UNIQUE_INTO_Panel
- else:
- # l'objet prend une ou des valeurs à priori quelconques
- if self.is_list() :
- # on attend une liste de valeurs mais de quel type ?
- if self.wait_assd():
- # on attend une liste de SD
- from plusieursassdpanel import PLUSIEURS_ASSD_Panel
- self.panel = PLUSIEURS_ASSD_Panel
- else:
- # on attend une liste de valeurs de types debase (entiers, réels,...)
- #from plusieursbasepanel import PLUSIEURS_BASE_OR_UNELISTE_Panel
- #self.panel = PLUSIEURS_BASE_OR_UNELISTE_Panel
- from plusieursbasepanel import PLUSIEURS_BASE_Panel
- self.panel = PLUSIEURS_BASE_Panel
- else:
- # on n'attend qu'une seule valeur mais de quel type ?
- if self.wait_co():
- # on attend une SD ou un objet de la classe CO (qui n'existe pas encore)
- from uniquesdcopanel import UNIQUE_SDCO_Panel
- self.panel = UNIQUE_SDCO_Panel
- elif self.wait_assd():
- # on attend une SD
- from uniqueassdpanel import UNIQUE_ASSD_Panel
- from uniqueassdpanel import UNIQUE_ASSD_Panel_Reel
- if 'R' in self.GetType():
- self.panel = UNIQUE_ASSD_Panel_Reel
- else :
- self.panel = UNIQUE_ASSD_Panel
- else:
- # on attend une valeur d'un type de base (entier,réel,...)
- if self.wait_complex():
- # on attend un complexe
- from uniquecomppanel import UNIQUE_COMP_Panel
- self.panel = UNIQUE_COMP_Panel
- else:
- # on attend un entier, un réel ou une string
- from uniquebasepanel import UNIQUE_BASE_Panel
- self.panel = UNIQUE_BASE_Panel
- # cas particulier des fonctions
- genea = self.get_genealogie()
- if "VALE" in genea or "VALE_C" in genea:
- if "DEFI_FONCTION" in genea :
- from fonctionpanel import FONCTION_Panel
- self.panel=FONCTION_Panel
- #---------------------------------------------------------
- # PN ajout pour lancement de Salome
- #---------------------------------------------------------
- if hasattr( self.appli, 'salome' ):
- import panelsSalome
-
- self.select_noeud_maille=0
- self.clef_fonction="SALOME"
- for i in range(0,len( genea )) :
- self.clef_fonction=self.clef_fonction+"_"+ genea[i]
- #if genea[i] == "GROUP_NO" or genea[i] == "GROUP_MA":
- if "GROUP_NO" in genea[len(genea)-1] or "GROUP_MA" in genea[len(genea)-1]:
- self.select_noeud_maille=1
-
- recherche=panelsSalome.dict_classes_salome[self.panel]
- if hasattr(recherche,self.clef_fonction):
- self.panel=recherche
- if self.select_noeud_maille==1 :
- self.panel=recherche
-
-
- #-----------------------------------------------
- #
- # Methodes liees aux informations sur le Panel
- # ou au mot-clef simple
- #
- #-----------------------------------------------
- # is_list
- # get_into a priori inutile --> commentee
- # has_into
- # wait_into a priori inutile --> commentee
- # GetMinMax
- # GetMultiplicite
- # GetIntervalle
- # GetListeValeurs
- # get_liste_possible
-
- def is_list(self):
- """
- Cette méthode indique si le mot cle simple attend une liste (valeur de retour 1)
- ou s'il n'en attend pas (valeur de retour 0)
-
- Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
- Dans le cas sans validateur, l'information est donnée par l'attribut max
- de la definition du mot cle.
- Dans le cas avec validateur, il faut combiner l'information précédente avec
- celle issue de l'appel de la méthode is_list sur le validateur.On utilisera
- l'operateur ET pour effectuer cette combinaison (AndVal).
- """
- is_a_list=0
- min,max = self.GetMinMax()
- assert (min <= max)
- if max > 1 :
- is_a_list=1
- # Dans le cas avec validateurs, pour que le mot cle soit considéré
- # comme acceptant une liste, il faut que max soit supérieur a 1
- # ET que la méthode is_list du validateur retourne 1. Dans les autres cas
- # on retournera 0 (n'attend pas de liste)
- if self.definition.validators :
- is_a_list= self.definition.validators.is_list() * is_a_list
- return is_a_list
-
- #def get_into(self,liste_courante=None):
- # """
- # Cette méthode retourne la liste de choix proposée par le mot cle. Si le mot cle ne propose
- # pas de liste de choix, la méthode retourne None.
- # L'argument d'entrée liste_courante, s'il est différent de None, donne la liste des choix déjà
- # effectués par l'utilisateur. Dans ce cas, la méthode get_into doit calculer la liste des choix
- # en en tenant compte.
- # Cette méthode part du principe que la relation entre into du mot clé et les validateurs est
- # une relation de type ET (AndVal).
- # """
- # if not self.object.definition.validators :
- # return self.object.definition.into
- # else:
- # return self.object.definition.validators.get_into(liste_courante,self.definition.into)
-
- def has_into(self):
- """
- Cette méthode indique si le mot cle simple propose un choix (valeur de retour 1)
- ou s'il n'en propose pas (valeur de retour 0)
-
- Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
- Dans le cas sans validateur, l'information est donnée par l'attribut into
- de la definition du mot cle.
- Dans le cas avec validateurs, pour que le mot cle soit considéré
- comme proposant un choix, il faut que into soit présent OU
- que la méthode has_into du validateur retourne 1. Dans les autres cas
- on retournera 0 (ne propose pas de choix)
- """
- has_an_into=0
- if self.definition.into:
- has_an_into=1
- elif self.definition.validators :
- has_an_into= self.definition.validators.has_into()
- return has_an_into
-
-# def wait_into(self):
-# """ Méthode booléenne qui retourne 1 si l'objet pointé par self
-# prend ses valeurs dans un ensemble discret (into), 0 sinon """
-# if self.object.definition.into != None :
-# return 1
-# else:
-# return 0
-
- def GetMinMax(self):
- """ Retourne les valeurs min et max de la définition de object """
- return self.object.get_min_max()
-
- 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 GetIntervalle(self):
- """
- Retourne le domaine de valeur attendu par l'objet représenté
- par l'item.
- """
- return self.object.getintervalle()
-
- def GetListeValeurs(self) :
- """ Retourne la liste des valeurs de object """
- valeurs=self.object.get_liste_valeurs()
- try :
- if "R" in self.object.definition.type:
- clef=self.object.GetNomConcept()
- if self.appli.dict_reels.has_key(clef):
- if type(valeurs) == types.TupleType:
- valeurs_reelles=[]
- for val in valeurs :
- if self.appli.dict_reels[clef].has_key(val) :
- valeurs_reelles.append(self.appli.dict_reels[clef][val])
- else :
- valeurs_reelles.append(val)
- else :
- if self.appli.dict_reels[clef].has_key(valeurs):
- valeurs_reelles=self.appli.dict_reels[clef][valeurs]
- valeurs=valeurs_reelles
- except :
- pass
- return valeurs
-
- def get_liste_possible(self,listeActuelle=[]):
- if hasattr(self.definition.validators,'into'):
- valeurspossibles = self.definition.validators.into
- else:
- valeurspossibles = self.get_definition().into
-
- #On ne garde que les items valides
- listevalideitem=[]
- for item in valeurspossibles:
- encorevalide=self.valide_item(item)
- if encorevalide :
- listevalideitem.append(item)
-
- #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
- listevalideliste=[]
- for item in listevalideitem:
- encorevalide=self.valide_liste_partielle(item,listeActuelle)
- if encorevalide :
- listevalideliste.append(item)
- return listevalideliste
-
- def get_liste_param_possible(self):
- liste_param=[]
- for param in self.object.jdc.params:
- encorevalide=self.valide_item(param.valeur)
- if encorevalide:
- type_param=param.valeur.__class__.__name__
- for typ in self.definition.type:
- if typ=='R':
- liste_param.append(param)
- if typ=='I' and type_param=='int':
- liste_param.append(param)
- if typ=='TXM' and type_param=='str':
- liste_param.append(repr(param))
- return liste_param
-
- #--------------------------------------------------
- #
- # Methodes liees a la validite des valeurs saisies
- #
- #---------------------------------------------------
- # valide_item
- # valide_liste_partielle
- # valide_liste_complete
- # info_erreur_item
- # info_erreur_liste
- # IsInIntervalle
- # isvalid
-
- def valide_item(self,item):
- """
- La validation est réalisée directement par l'objet
- """
- return self.object.valide_item(item)
-
- def valide_liste_partielle(self,item,listecourante):
- #On protege la liste en entree en la copiant
- valeur=listecourante[:]
- valeur.append(item)
- return self.object.valid_valeur_partielle(valeur)
-
- def valide_liste_complete (self,valeur):
- return self.object.valid_valeur(valeur)
-
- def valide_val (self,valeur):
- return self.object.valid_val(valeur)
-
- def info_erreur_item(self) :
- commentaire=""
- if self.definition.validators :
- commentaire=self.definition.validators.info_erreur_item()
- return commentaire
-
- def aide(self) :
- commentaire=""
- if self.definition.validators :
- commentaire=self.definition.validators.aide()
- return commentaire
-
- def info_erreur_liste(self) :
- commentaire=""
- if self.definition.validators :
- commentaire=self.definition.validators.info_erreur_liste()
- return commentaire
-
- def IsInIntervalle(self,valeur):
- """
- Retourne 1 si la valeur est dans l'intervalle permis par
- l'objet représenté par l'item.
- """
- return self.valide_item(valeur)
-
- def isvalid(self):
- valide=self.object.isvalid()
- return valide
-
- #--------------------------------------------------
- #
- # Autres ...
- #
- #---------------------------------------------------
- # SetText a priori inutilisee --> commentee
- # GetIconName
- # GetText
- # getval a priori inutilisee --> commentee
- # set_valeur_co
- # get_sd_avant_du_bon_type
- # verif a priori inutilisee --> commentee
- # delete_valeur_co
-
- #def SetText(self, text):
- # try:
- # value = eval(text)
- # self.object.setval(value)
- # except:
- # pass
-
- def GetIconName(self):
- if self.isvalid():
- return "ast-green-ball"
- elif self.object.isoblig():
- return "ast-red-ball"
- else:
- return "ast-yel-ball"
-
- def GetText(self):
- """
- Classe SIMPTreeItem
- Retourne le texte à afficher dans l'arbre représentant la valeur de l'objet
- pointé par self
- """
- text= self.object.GetText()
- return text
-
- #def getval(self):
- # return self.object.getval()
-
- def set_valeur_co(self,nom_co):
- """
- Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
- """
- ret = self.object.set_valeur_co(nom_co)
- #print "set_valeur_co",ret
- return ret
-
- 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
- """
- a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
- return a
-
- def get_sd_avant_du_bon_type_pour_type_de_base(self):
- a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
- return a
-
-
-
- #def verif(self):
- # pass
-
- 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)
-
- #-----------------------------------------------
- #
- # Methodes liees au type de l objet attendu
- #
- #-----------------------------------------------
- # wait_co
- # wait_geom
- # wait_complex
- # wait_reel
- # wait_shell
- # wait_assd
- # GetType
-
- def wait_co(self):
- """
- Méthode booléenne qui retourne 1 si l'objet pointé par self
- attend un objet de type ASSD qui n'existe pas encore (type CO()),
- 0 sinon
- """
- return self.object.wait_co()
-
- def wait_geom(self):
- """
- Méthode booléenne qui retourne 1 si l'objet pointé par self
- attend un objet GEOM, 0 sinon
- """
- return self.object.wait_geom()
-
- def wait_complex(self):
- """ Méthode booléenne qui retourne 1 si l'objet pointé par self
- attend un complexe, 0 sinon """
- if 'C' in self.object.definition.type:
- return 1
- else:
- return 0
-
- def wait_reel(self):
- """ Méthode booléenne qui retourne 1 si l'objet pointé par self
- attend un réel, 0 sinon """
- if 'R' in self.object.definition.type:
- return 1
- else:
- return 0
-
- def wait_shell(self):
- """ Méthode booléenne qui retourne 1 si l'objet pointé par self
- attend un shell, 0 sinon """
- if 'shell' in self.object.definition.type:
- return 1
- else:
- return 0
-
- def wait_assd(self):
- """Méthode booléenne qui retourne 1 si l'objet pointé par self
- attend un objet de type ASSD ou dérivé, 0 sinon """
- return self.object.wait_assd()
-
- def wait_assd_or_type_base(self) :
- boo=0
- if len(self.object.definition.type) > 1 :
- if self.wait_reel() :
- boo = 1
- if 'I' in self.object.definition.type :
- boo = 1
- return boo
-
-
- def GetType(self):
- """
- Retourne le type de valeur attendu par l'objet représenté par l'item.
- """
- return self.object.get_type()
-
- #-----------------------------------------------------
- #
- # Methodes liees a l evaluation de la valeur saisie
- #
- #-----------------------------------------------------
- # eval_valeur
- # eval_valeur_item
- # is_CO
- # traite_reel
-
- def eval_valeur(self,valeur):
- """ Lance l'interprétation de 'valeur' (chaîne de caractères) comme valeur de self :
- - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
- - retourne 'valeur' (chaîne de caractères) sinon
- """
- newvaleur=self.eval_val(valeur)
- return newvaleur,1
-
- def eval_valeur_BAK(self,valeur):
- """ Lance l'interprétation de 'valeur' (chaîne de caractères) comme valeur
- de l'objet pointé par self :
- - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
- - retourne 'valeur' (chaîne de caractères) sinon
- - retourne None en cas d invalidite
- - retourne invalide si 1 des objets du tuple l est
- """
- validite=1
- if type(valeur) in (types.ListType,types.TupleType) :
- valeurretour=[]
- for item in valeur :
- newvaleur,validiteitem=self.eval_valeur_item(item)
- valeurretour.append(newvaleur)
- if validiteitem == 0:
- validite=0
- else :
- valeurretour,validite= self.eval_valeur_item(valeur)
- if validite == 0 :
- valeurretour = None
- return valeurretour,validite
-
- def eval_valeur_item(self,valeur):
- """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
- - va retourner la valeur de retour et la validite
- selon le type de l objet attendu
- - traite les reels et les parametres
- """
- #print "eval_valeur_item",valeur
- if valeur==None or valeur == "" :
- return None,0
- validite=1
- if self.wait_reel():
- valeurinter = self.traite_reel(valeur)
- if valeurinter != None :
- valeurretour,validite= self.object.eval_valeur(valeurinter)
- else:
- valeurretour,validite= self.object.eval_valeur(valeur)
- elif self.wait_geom():
- valeurretour,validite = valeur,1
- else :
- valeurretour,validite= self.object.eval_valeur(valeur)
- #print "eval_valeur_item",valeurretour,validite
-
- if validite == 0:
- if type(valeur) == types.StringType and self.object.wait_TXM():
- essai_valeur="'" + valeur + "'"
- valeurretour,validite= self.object.eval_valeur(essai_valeur)
-
- if hasattr(valeurretour,'__class__'):
- #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
- if valeurretour.__class__.__name__ in ('PARAMETRE',):
- validite=1
-
- #if self.wait_co():
- # CCAR : il ne faut pas essayer de creer un concept
- # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
- #try:
- #valeurretour=Accas.CO(valeur)
- #except:
- #valeurretour=None
- #validite=0
- # on est dans le cas où on a évalué et où on n'aurait pas du
- if self.object.wait_TXM() :
- if type(valeurretour) != types.StringType:
- valeurretour=str(valeur)
- validite=1
- return valeurretour,validite
-
- 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.InstanceType:return 0
- if valeur.__class__.__name__ == 'CO':return 1
- return 0
-
- def is_param(self,valeur) :
- for param in self.jdc.params:
- if (repr(param) == valeur):
- return 1
- return 0
-
- def traite_reel(self,valeur):
- """
- Cette fonction a pour but de rajouter le '.' en fin de chaîne pour un réel
- ou de détecter si on fait référence à un concept produit par DEFI_VALEUR
- ou un EVAL ...
- """
- valeur = string.strip(valeur)
- liste_reels = self.get_sd_avant_du_bon_type()
- if valeur in liste_reels:
- return valeur
- if len(valeur) >= 3 :
- if valeur[0:4] == 'EVAL' :
- # on a trouvé un EVAL --> on retourne directement la valeur
- return valeur
- if string.find(valeur,'.') == -1 :
- # aucun '.' n'a été trouvé dans valeur --> on en rajoute un à la fin
- if (self.is_param(valeur)):
- return valeur
- else:
- if string.find(valeur,'e') != -1:
- # Notation scientifique ?
- try :
- r=eval(valeur)
- return valeur
- except :
- return None
- else :
- return valeur+'.'
- else:
- return valeur
-
-
-import Accas
-treeitem = SIMPTreeItem
-objet = Accas.MCSIMP
-
import traceback
# Modules Eficas
-from widgets import showinfo,showerror,askretrycancel
-import utils
+from Editeur import utils
class CONFIGbase:
# Verifie l'existence du fichier "standard"
# appelle la lecture de ce fichier
if not os.path.isfile(self.fic_ini):
- print self.fic_ini
- showerror("Erreur","Pas de fichier de configuration" + self.fic_ini+"\n")
+ if self.appli.ihm=="TK" :
+ from widgets import showerror
+ showerror("Erreur","Pas de fichier de configuration" + self.fic_ini+"\n")
print "Erreur à la lecture du fichier de configuration : %s" % self.fic_ini
sys.exit(0)
self.lecture_fichier(self.fic_ini)
# les transforme en attribut de l 'objet
# utilisation du dictionnaire local pour récuperer style
txt = utils.read_file(fic)
- from styles import style
+ from InterfaceTK.styles import style
d=locals()
try:
exec txt in d
except:
l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
- showerror("Erreur","Une erreur s'est produite lors de la lecture du fichier : " + fic + "\n")
+ if self.appli.ihm=="TK" :
+ from widgets import showerror
+ showerror("Erreur","Une erreur s'est produite lors de la lecture du fichier : " + fic + "\n")
print "Erreur à la lecture du fichier de configuration : %s" % fic
sys.exit()
mode='query')
if not result.resultat :
if mode == 'considerer_annuler':
- test = askretrycancel("Erreur","Données incorrectes !")
+ test=0
+ if self.appli.ihm=="TK" :
+ from widgets import showerror,askretrycancel
+ test = askretrycancel("Erreur","Données incorrectes !")
if not test:
# XXX On sort d'EFICAS, je suppose
self.appli.exitEFICAS()
self.titre = "Paramètres d affichage"
self.texte_ini = "Voici les paramètres configurables : "
self.commande = self.creation_fichier_ini_si_possible
- self.pref="style."
self.labels={"background":"couleur du fonds",
"foreground":"couleur de la police standard" ,
"standard":" police et taille standard",
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 types
-
-# Modules Eficas
-import Accas
-from Noyau.N_CR import CR
-
-class CATALOGUE:
- def __init__(self,modules_cata):
- self.modules_cata = modules_cata # tuple de modules...
- self.cr = CR()
- self.state='undetermined'
- self.entites_attributs = {}
- self.entites_fils = []
- self.build_entites_attributs()
- self.build_entites_fils()
-
- def build_entites_attributs(self):
- pass
-
- def build_entites_fils(self):
- niv_types = Accas.NIVEAU(nom="types",label="Liste des types")
- niv_commandes = Accas.NIVEAU(nom="commandes",label="Liste des commandes")
- self.entites_fils.append(make_commande_cata(niv_types,self))
- self.entites_fils.append(make_commande_cata(niv_commandes,self))
- for module_cata in self.modules_cata:
- for e in dir(module_cata):
- obj = getattr(module_cata,e)
- if isCMD(obj):
- self.entites_fils[1].register(make_commande_cata(obj,self.entites_fils[1]))
- elif type(obj) == types.ClassType:
- if issubclass(obj,Accas.ASSD):
- self.entites_fils[0].register(TYPE_CATA(obj))
-
- def init_modif(self):
- self.state = 'modified'
-
- def report(self):
- """ Classe CATALOGUE
- Methode pour generation d un rapport de validite
- """
- self.cr.purge()
- self.cr.debut="DEBUT CR validation : "
- self.cr.fin="FIN CR validation :"
- self.state = 'modified'
- self.isvalid(cr='oui')
- for fils in self.entites_fils[1].entites :
- self.cr.add(fils.report())
- return self.cr
-
- def isvalid(self,cr='non'):
- if self.state != 'unchanged':
- valid=1
- for fils in self.entites_fils[1].entites_fils:
- if not fils.isvalid():
- valid=0
- break
- self.valid = valid
- self.state='unchanged'
- return self.valid
-
-def make_commande_cata(objet,pere):
- if isinstance(objet,Accas.OPER):
- return OPER_CATA(objet,pere,objet.nom)
- elif isinstance(objet,Accas.PROC):
- return PROC_CATA(objet,pere,objet.nom)
- elif isinstance(objet,Accas.MACRO):
- return MACRO_CATA(objet,pere,objet.nom)
- elif isinstance(objet,Accas.FORM):
- return MACRO_CATA(objet,pere,objet.nom)
- elif isinstance(objet,Accas.NIVEAU):
- return NIVEAU_CATA(objet,pere,objet.nom)
- else:
- print "Erreur dans make_commande_cata : on cherche à évaluer un objet non référencé ",objet
-
-def make_mc_cata(objet,pere,nom=''):
- if isinstance(objet,Accas.BLOC):
- return BLOC_CATA(objet,pere,nom)
- elif isinstance(objet,Accas.FACT):
- return FACT_CATA(objet,pere,nom)
- elif isinstance(objet,Accas.SIMP):
- return SIMP_CATA(objet,pere,nom)
- else:
- print "Erreur dans make_mc_cata : on cherche à évaluer un objet non référencé ",objet
-
-class TYPE_CATA:
- def __init__(self,objet):
- self.objet = objet
- self.nom = objet.__name__
-
- def isvalid(self,cr='non'):
- return 1
-
- def get_valeur_attribut(self,nom_attr):
- if nom_attr == 'nom':return self.nom
- return None
-
-class OBJET_CATA:
- attributs=[]
- attributs_defauts={}
- def __init__(self,objet,pere,nom):
- self.objet = objet
- self.nom = nom
- self.pere = pere
- self.cr = CR()
- self.state='undetermined'
- self.entites_fils = []
- self.entites_attributs = {}
- self.build_entites_attributs()
- self.build_entites_fils()
-
- def __str__(self):
- s=''
- s=self.__class__.__name__+' : '+self.nom
- return s
-
- def build_entites_attributs(self):
- for attribut in self.attributs:
- if hasattr(self.objet,attribut):
- self.entites_attributs[attribut]=ATTR_CATA(attribut,getattr(self.objet,attribut))
- else:
- if self.attributs_defauts.has_key(attribut):
- self.entites_attributs[attribut]=ATTR_CATA(attribut,self.attributs_defauts[attribut])
- else:
- self.entites_attributs[attribut]=ATTR_CATA(attribut,None)
-
- def build_entites_fils(self):
- for k,v in self.objet.entites.items():
- self.entites_fils.append(make_mc_cata(v,self,nom=k))
-
- def get_valeur_attribut(self,nom_attr):
- if nom_attr in self.entites_attributs.keys():
- return self.entites_attributs[nom_attr].valeur
- elif nom_attr in self.attributs_defauts.keys():
- return self.attributs_defauts[nom_attr]
- elif nom_attr == 'domaine_validité':
- if self.entites_attributs['into'].valeur != None :
- return 'discret'
- else:
- return 'continu'
-
- def isvalid(self,cr='non'):
- if self.state =='unchanged':
- return self.valid
- else:
- valid = 1
- if hasattr(self,'valid'):
- old_valid = self.valid
- else:
- old_valid = None
- # on teste self lui-meme
- if self.nom == '' or self.nom == None : valid=0
- # on teste les attributs
- for attribut in self.entites_attributs.values():
- if not attribut.isvalid() : valid =0
- break
- # on teste les fils
- for fils in self.entites_fils:
- if not fils.isvalid(): valid = 0
- break
- self.valid = valid
- self.state = 'unchanged'
- if old_valid:
- if old_valid != self.valid : self.init_modif_up()
- return self.valid
-
- def init_modif_up(self):
- self.pere.state='modified'
-
- def report(self):
- self.cr.purge()
- self.cr.debut="Debut "+self.__class__.__name__+' : '+self.nom
- self.cr.fin = "Fin "+self.__class__.__name__+' : '+self.nom
- self.isvalid(cr='oui')
- for attribut in self.entites_attributs.values():
- self.cr.add(attribut.report())
- for fils in self.entites_fils :
- self.cr.add(fils.report())
- return self.cr
-
- def set_valeur_attribut(self,nom_attr,valeur):
- """
- Affecte la valeur 'valeur' à l'attribut de nom 'nom-attr'
- """
- # il faudra être prudent sur les changements de nom : interdire de changer
- # le nom d'un mot-clé qui serait utilisé dans une règle ???
- self.entites_attributs[nom_attr].valeur = valeur
-
- def addentite(self,name,pos):
- """
- Permet d'ajouter un nouveau fils a self
- """
- self.init_modif()
- if name == 'new_simp':
- objet = Accas.SIMP(typ=('bidon',))
- objet_cata = make_mc_cata(objet,self)
- self.entites_fils.insert(pos,objet_cata)
- return objet_cata
-
- def init_modif(self):
- self.state = 'modified'
- if hasattr(self,'pere'):
- self.pere.init_modif()
-
- def verif_nom(self,cr='non'):
- """
- Méthode appelée par EFICAS et ACCAS
- Booléenne : retourne 1 si l'attribut nom est valide, 0 sinon
- """
- if self.entites_attributs['nom'].valeur == '':
- if cr == 'oui' : self.cr.fatal("L'objet de type %s n'est pas nommé" %self.__class__.__name__)
- return 0
- return 1
-
- def verif_defaut(self,cr='non'):
- """
- Méthode de vérification de validité du défaut
- """
- defaut = self.get_valeur_attribut('defaut')
- if self.get_valeur_attribut('domaine_validite') == 'discret' :
- if defaut not in self.get_valeur_attribut('into'):
- if cr == 'oui' : self.cr.fatal("La valeur %s n'est pas autorisée" %str(defaut))
- return 0
- return 1
- else:
- if defaut == None : return 1
- typ = self.get_valeur_attribut('type')
- # on attend un TXM ?
- if 'TXM' in typ :
- if type(defaut) == types.StringType : return 1
- val_min = self.get_valeur_attribut('val_min')
- val_max = self.get_valeur_attribut('val_max')
- # on attend un reel ?
- if 'R' in typ :
- if type(defaut) == types.StringType:
- try :
- nb = string.atof(defaut)
- except:
- nb=None
- else:
- nb = defaut
- if nb != None :
- test = 1
- if val_min != '**' : test = (nb >= val_min)
- if val_max != '**' : test = test*(nb <= val_max)
- if test : return 1
- # on attend un entier ?
- if 'I' in typ :
- if type(defaut)==types.StringType:
- try:
- nb = string.atoi(defaut)
- except:
- pass
- else:
- nb = defaut
- if nb != None :
- test = 1
- if val_min != '**' : test = (nb >= val_min)
- if val_max != '**' : test = test*(nb <= val_max)
- if test : return 1
- # si on passe par là, c'est que l'on n'a pas su évaluer defaut
- if cr == 'oui' : self.cr.fatal("La valeur %s n'est pas une valeur permise" %str(defaut))
- return 0
-
- def verif_val_min(self,cr='non'):
- """
- Méthode de vérification de val_min.
- Booléenne : retourne 1 si val_min est valide, 0 sinon
- """
- val_min = self.get_valeur_attribut('val_min')
- if not val_min :
- if cr == 'oui' : self.cr.fatal('val_min ne peut valoir None')
- return 0
- if val_min == '**': return 1
- # val_min doit à ce stade être :
- # - soit un entier ou un réel
- # - soit une chaîne de caractères représentant un entier ou un réel (provient d'EFICAS)
- if type(val_min) == types.StringType :
- try :
- val_min = string.atoi(val_min)
- except:
- try:
- val_min = string.atof(val_min)
- except:
- if cr == 'oui' : self.cr.fatal("%s n'est ni un entier ni un réel" %str(val_min))
- return 0
- # A ce stade, val_min doit être un entier ou un réel : on vérifie ...
- if type(val_min) not in (types.IntType,types.FloatType) :
- if cr == 'oui' : self.cr.fatal("%s n'est pas d'un type autorisé" %str(val_min))
- return 0
- # A ce stade valeur est un entier ou un réel : on peut comparer à val_max
- val_max = self.get_valeur_attribut('val_max')
- if val_max == '**' or val_min < val_max : return 1
- # erreur : val_min est supérieur à val_max !!!
- if cr == 'oui' : self.cr.fatal("%s n'est pas inférieur à %s" %(str(val_min),str(val_max)))
- return 0
-
- def verif_val_max(self,cr='non'):
- """
- Méthode de vérification de val_max.
- Booléenne : retourne 1 si val_max est valide, 0 sinon
- """
- val_max = self.get_valeur_attribut('val_max')
- if not val_max :
- if cr == 'oui' : self.cr.fatal('val_max ne peut valoir None')
- return 0
- if val_max == '**': return 1
- # val_max doit à ce stade être :
- # - soit un entier ou un réel
- # - soit une chaîne de caractères représentant un entier ou un réel (provient d'EFICAS)
- if type(val_max) == types.StringType :
- try :
- val_max = string.atoi(val_max)
- except:
- try:
- val_max = string.atof(val_max)
- except:
- if cr == 'oui' : self.cr.fatal("%s n'est ni un entier ni un réel" %str(val_max))
- return 0
- # A ce stade, val_max doit être un entier ou un réel : on vérifie ...
- if type(val_max) not in (types.IntType,types.FloatType) :
- if cr == 'oui' : self.cr.fatal("%s n'est pas d'un type autorisé" %str(val_max))
- return 0
- # A ce stade valeur est un entier ou un réel : on peut comparer à val_max
- val_min = self.get_valeur_attribut('val_min')
- if val_min == '**' or val_min < val_max : return 1
- # erreur : val_min est supérieur à val_max !!!
- if cr == 'oui' : self.cr.fatal("%s n'est pas supérieur à %s" %(str(val_max),str(val_min)))
- return 0
-
-class OPER_CATA(OBJET_CATA):
- attributs = ['ang','docu','fr','niveau','nom','op','op_init','reentrant','regles','repetable','sd_prod']
-
-class PROC_CATA(OBJET_CATA):
- attributs = ['ang','docu','fr','niveau','nom','op','op_init','regles','repetable']
-
-class MACRO_CATA(OBJET_CATA):
- attributs = ['ang','docu','fr','niveau','nom','op','op_init','reentrant','regles','repetable','sd_prod']
-
-class BLOC_CATA(OBJET_CATA):
- attributs = ['ang','condition','docu','fr','nom','regles']
-
-class FACT_CATA(OBJET_CATA):
- attributs=['ang','defaut','docu','fr','max','min','nom','regles','statut']
-
-class SIMP_CATA(OBJET_CATA):
- attributs=['ang','defaut','docu','fr','homo','into','max','min','nom','position','statut','type','val_min','val_max']
- attributs_defauts={'ang':'','defaut':None,'fr':'','homo':1,'into':None,'max':1,'min':1,'nom' : '','position':'local',
- 'regles':None,'statut':'f','type':None,'val_min':'**','val_max':'**','docu':''}
-
- def build_entites_fils(self):
- pass
-
- def isvalid(self,cr='non'):
- """
- Mde appelpar l'externe (EFICAS et ACCAS).
- Boolne : retourne 1 si l'objet est valide, 0 sinon
- """
- if self.state == 'unchanged':
- return self.valid
- else:
- valid = 1
- valid = valid*self.verif_nom(cr=cr)
- valid = valid*self.verif_defaut(cr=cr)
- valid = valid*self.verif_val_min(cr=cr)*self.verif_val_max(cr=cr)
- if hasattr(self,'valid'):
- old_valid = self.valid
- else:
- old_valid = None
- self.valid = valid
- self.state='unchanged'
- if old_valid :
- if old_valid != self.valid : self.init_modif_up()
- return self.valid
-
-class NIVEAU_CATA(OBJET_CATA):
- def __init__(self,objet,pere,nom):
- self.pere = pere
- self.nom = nom
- self.state = 'undetermined'
- self.cr = CR()
- self.objet = objet
- self.entites_fils=[]
- self.entites_attributs = {}
-
- def register(self,fils):
- """
- Enregistre la commande 굡pe :
- - si editmode = 0 : on est en mode relecture d'un fichier de commandes
- auquel cas on ajoute etape a fin de la liste self.etapes
- - si editmode = 1 : on est en mode ajout d'굡pe depuis eficas auquel cas
- cette mode ne fait rien, c'est addentité enregistre etape ࡬a bonne place
- dans self.etapes
- """
- self.entites_fils.append(fils)
-
- def unregister(self,etape):
- self.entites_fils.remove(etape)
-
- def isvalid(self,cr='non'):
- """ Mode boolne qui retourne 0 si le niveau est invalide, 1 sinon """
- if self.state == 'unchanged':
- return self.valid
- else:
- valid = 1
- if len(self.entites_fils) == 0:
- #valid = self.Accas.valide_vide
- valid = 1
- else:
- for commande in self.entites_fils :
- if hasattr(commande,'isvalid'):
- if not commande.isvalid() :
- valid = 0
- break
- else:
- print str(commande)," n'a pas de methode isvalid"
- if hasattr(self,'valid'):
- old_valid = self.valid
- else:
- old_valid = None
- self.valid = valid
- self.state='unchanged'
- if old_valid:
- if old_valid != self.valid : self.init_modif_up()
- return self.valid
-
-
-class ATTR_CATA(OBJET_CATA):
- def __init__(self,nom,valeur=None):
- self.nom = nom
- self.valeur = valeur
- self.cr = CR()
- self.state='undetermined'
- self.entites_attributs={}
- self.entites_fils=()
-
- def isvalid(self,cr='non'):
- return 1
-
-def isCMD(cmd):
- return isinstance(cmd,Accas.OPER) or isinstance(cmd,Accas.PROC) or isinstance(cmd,Accas.MACRO) or isinstance(cmd,Accas.FORM)
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-"""
-# Modules Python
-import string
-from Tkinter import Label
-import Pmw
-import traceback
-
-# Modules Eficas
-from widgets import showerror
-from widgets import askopenfilename
-import patches
-import appli
-from widgets import Fenetre
-
-class EFICAS(appli.APPLI):
-
- 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)
- texte = texte + 'Catalogue utilisé : %s\n' % self.bureau.fic_cata
- return texte
-
- def exitEFICAS(self):
- self.bureau.exitEFICAS()
-
- def getBureau(self):
- return self.bureau
-
- def browse(self,result):
- if result == 'Browse':
- self.ulfile = askopenfilename(parent=self.dialog.component('hull'),title="Choix fichier :")
- self._ulfile.setentry(self.ulfile)
- elif result == 'OK':
- self.ulfile = self._ulfile.get()
- # On utilise le convertisseur défini par format_fichier
- source=self.get_source(self.ulfile)
- if source:
- # On a réussi à convertir le fichier self.ulfile
- self.dialog.deactivate(result)
- self.text=source
- else:
- # Une erreur a été rencontrée
- self.text=''
- elif result == 'Cancel':
- self._ulfile.setentry('')
- self.dialog.deactivate(result)
- self.ulfile = None
- self.text=""
-
- def get_file(self,unite=None,fic_origine = ''):
- """
- Retourne le nom du fichier correspondant a l unite logique unite (entier)
- """
- if unite :
- titre = "Choix unite %d " %unite
- else:
- titre = "Choix d'un fichier de poursuite"
- self.dialog=Pmw.Dialog(self.top,
- title = titre,
- buttons = ('OK', 'Browse','Cancel'),
- defaultbutton='OK',
- command=self.browse,
- )
- self.dialog.withdraw()
- if unite :
- texte = "Le fichier %s contient une commande INCLUDE \n" % fic_origine
- texte = texte+'Donnez le nom du fichier correspondant\n à l unité logique %d' % unite
- else:
- texte="Le fichier %s contient une commande %s\n" %(fic_origine,'POURSUITE')
- texte = texte+'Donnez le nom du fichier dont vous \n voulez faire une poursuite'
- if self.test == 1: raise Exception("Erreur: "+texte)
- w = Label(self.dialog.interior(),
- text = texte)
- w.pack(padx = 10, pady = 10)
- if unite != None :
- labeltexte = 'Fichier pour unite %d :' % unite
- else:
- labeltexte = 'Fichier à poursuivre :'
- self._ulfile=Pmw.EntryField(self.dialog.interior(),
- labelpos = 'w',
- label_text = labeltexte,
- )
- self._ulfile.pack(fill='x', expand=1, padx=10, pady=5)
- self._ulfile.component('entry').focus_set()
- self.dialog.activate(geometry='centerscreenalways')
- return self.ulfile,self.text
-
- def get_source(self,file):
- import convert
- format=self.format_fichier.get()
- # Il faut convertir le contenu du fichier en fonction du format
- if convert.plugins.has_key(format):
- # Le convertisseur existe on l'utilise
- p=convert.plugins[format]()
- p.readfile(file)
- text=p.convert('execnoparseur')
- if not p.cr.estvide():
- self.affiche_infos("Erreur à la conversion")
- Fenetre(self,
- titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
- texte = str(p.cr)).wait()
- return text
- return text
- else:
- # Il n'existe pas c'est une erreur
- self.affiche_infos("Type de fichier non reconnu")
- showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
- return None
-
- def affiche_texte(self,entete,texte):
- """Cette methode ouvre une fenetre modale dans laquelle on affiche un texte
- """
- self.affiche_infos(entete)
- f=Fenetre(self, titre=entete, texte = texte)
- f.wait()
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 patienter l'utilisateur
-"""
-# Modules Python
-import sys
-import Tkinter
-
-# Modules Eficas
-import prefs
-if hasattr(prefs,'encoding'):
- # Hack pour changer le codage par defaut des strings
- import sys
- reload(sys)
- sys.setdefaultencoding(prefs.encoding)
- del sys.setdefaultencoding
- # Fin hack
-
-import styles
-import import_code
-import splash
-import session
-
-def lance_eficas(code=None,fichier=None):
- """
- Lance l'appli EFICAS
- """
- # Analyse des arguments de la ligne de commande
- options=session.parse(sys.argv)
- code=options.code
-
- root = Tkinter.Tk()
- splash.init_splash(root,code=code,titre="Lancement d'EFICAS pour %s" %code)
- splash._splash.configure(text="Chargement d'EFICAS en cours.\n Veuillez patienter ...")
- import eficas
- eficas.EFICAS(root,code=code)
-
- root.mainloop()
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-"""
-# Modules Python
-import sys
-import Tkinter
-
-# Modules Eficas
-import import_code
-import session
-
-def lance_eficas(code,fichier=None):
- """
- Lance l'appli EFICAS
- """
- options=session.parse(sys.argv)
- root = Tkinter.Tk()
- import eficas
- if fichier :
- a=eficas.EFICAS(root,code=code,fichier = fichier,test=1)
- bureau=a.getBureau()
- else:
- eficas.EFICAS(root,code=code)
-
- print bureau.JDC.report()
- bureau.closeJDC()
-
-def duplique_fichier(code,fichier=None,root=None):
- print code
- print fichier
- if root == None :
- root = Tkinter.Tk()
- import eficas
- import convert
- import generator
- import utils
- import string
-
- from Editeur import session
- if fichier != None :
- options=session.parse(sys.argv+[fichier])
- else :
- options=session.parse(sys.argv)
-
- appli=eficas.EFICAS(root,code=code,fichier = fichier,test=1)
- format='homard'
- if convert.plugins.has_key(format):
- p=convert.plugins[format]()
- p.readfile(fichier)
- text=p.convert('exec',appli)
- print text
- text2=convertir(text)
- print text2
- cata=appli.readercata.cata
- J=cata[0].JdC(procedure=text2,cata=cata)
- J.analyse()
- fileName=fichier+"_init"
- if generator.plugins.has_key(format):
- g=generator.plugins[format]()
- jdc_formate=g.gener(J,format='beautifie')
- jdc_fini = string.replace(jdc_formate,'\r\n','\n')
- utils.save_in_file(fileName+".comm",jdc_fini,None)
-
-def convertir(texte):
- import re
- dict_change={"FICHIER_MED_MAILLAGE_N=":"FICHIER_MED_MAILLAGE_NP1","NOM_MED_MAILLAGE_N=":"NOM_MED_MAILLAGE_NP1"}
- for mot in dict_change.keys():
- if( re.search(mot,texte)):
- indicenouveau=re.search(mot,texte).end()
- indicefinnouveau= texte.find(",",indicenouveau)
- avant=dict_change[mot]
- if( re.search(avant,texte)):
- indiceancien=re.search(avant,texte).end()+1
- indicefinancien= texte.find(",",indiceancien)
- valeur=texte[indiceancien:indicefinancien]
- texte=texte[0:indicenouveau]+valeur+texte[indicefinnouveau:]
- liste_mot_clef_None=['CRIT_RAFF_ABS','CRIT_RAFF_REL','CRIT_RAFF_PE','CRIT_DERA_ABS','CRIT_DERA_REL','CRIT_DERA_PE','NITER','NOM_MED_MAILLAGE_NP1','FICHIER_MED_MAILLAGE_NP1']
-
- for mot in liste_mot_clef_None:
- if( re.search(mot,texte)):
- indice=re.search(mot,texte).end()+1
- indicefin= texte.find(",",indice)
- texte=texte[0:indice]+"None"+texte[indicefin:]
- return texte
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-"""
-# Modules Python
-import os
-import Pmw
-from Tkinter import END
-
-# Modules Eficas
-import prefs
-import fontes
-
-class FAQ:
- def __init__(self,parent):
- self.parent=parent
- self.Dialog = Pmw.Dialog(parent,
- buttons=('Lu',),
- title="FAQs et limitations d'EFICAS",
- command = self.lu_FAQ)
- txt = open(os.path.join(prefs.INSTALLDIR,'Editeur','faqs.txt'),'r').read()
- Texte = Pmw.ScrolledText(self.Dialog.interior(),
- text_font=fontes.standard)
- Texte.insert(END,txt)
- Texte.pack(expand=1,fill='both')
- self.Dialog.activate(geometry = 'centerscreenalways')
-
- def lu_FAQ(self,event=None):
- self.Dialog.destroy()
-
-def affiche(parent):
- FAQ(parent)
+++ /dev/null
-
--------------------------------------------------------------------------------------------------------------
- FAQs et Limitations d'EFICAS
--------------------------------------------------------------------------------------------------------------
-
-
-1. Mots réservés :
-
- Tous les mots du langage Python sont des mots réservés.
- On ne peut donc pas appeler une variable ou un concept 'fin' ou 'dir'
- Pour la liste complète de ces mots-clés, veuillez vous référer à la
- documentation Python
-
-2. Concepts réentrants :
-
- Ne pas indiquer par un '&' devant son nom qu'un concept est utilisé comme
- concept réentrant. En effet EFICAS le sait !
-
-3. Carte commentaire :
-
- La carte commentaire est désormais le '#' (dièse) au lieu du '%' (pourcent)
- Les commentaires sont gérés comme des objets de même niveau que les
- commandes ; il n'est plus possible de placer des commentaires "dans"
- une commande. Attention, lors de la traduction d'un fichier de version 5
- en 6, les commentaires "dans" les commandes seront perdus.
-
-4. Nommer le concept produit par un opérateur :
-
- Vous ne pouvez nommer le concept produit d'un opérateur que lorsque
- celui-ci aura été entièrement et correctement rempli.
-
-5. Règle de rémanence dans les mots-clés facteurs répétés :
-
- La règle de rémanence qui permettait pour certains mots-clés facteurs
- et pour certains de leurs mots-clés simples de ne pas répeter la valeur
- de ces derniers dans toutes les occurrences du mot-clé facteur n'est pas
- connue d'EFICAS.
- En conséquence, vous devez répéter les mots-clés simples concernés dans
- toutes les occurrences des mots-clés facteurs.
-
-6. Besoin d'aide ?
-
- La documentation d'utilisation d'EFICAS a pris un peu de retard sur le produit ...
- Néanmoins, vous disposez sur la plupart des panneaux contextuels ( les panneaux à
- droite de l'arbre) d'une aide en ligne que vous pouvez activer en maintenant le
- bouton droit de votre souris enfoncé.
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-from Tkinter import *
-import copy
-
-# Modules Eficas
-from centerwindow import centerwindow
-
-class fenetre_mc_inconnus :
- """
- Cette classe sert à construire la fenêtre qui apparaît dans EFICAS
- lorsque des mots-clés inconnus ont été trouvés dans le fichier de
- commandes que l'on est en train de lire
- """
- def __init__(self,l_mc):
- self.l_mc = l_mc
- self.fenetre = Toplevel()
- self.fenetre.withdraw()
- self.fenetre.geometry("400x400+0+0")
- self.fenetre.title("Mots-clés inconnus dans le fichier de commandes")
- self.init()
- self.init_frames()
- self.init_label()
- self.init_liste_mc()
- self.init_boutons()
- centerwindow(self.fenetre)
- self.fenetre.deiconify()
-
- def init(self) :
- """
- Initialise les structures de données
- """
- self.new_l_mc = []
- for mc in self.l_mc :
- self.new_l_mc.append(copy.copy(mc))
- self.mc_courant = None
- self.var_quit = IntVar(0)
- self.entry_courante = None
-
- def init_frames(self):
- """
- Création des 2 frames devant contenir le label et la liste des MC inconnus
- """
- self.frame1 = Frame(self.fenetre)
- self.frame2 = Frame(self.fenetre)
- self.frame3 = Frame(self.fenetre)
- 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)
-
- 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é"
- self.fenetre.update_idletasks()
- Label(self.frame1,
- text = txt,
- wraplength = int(self.frame1.winfo_width()*0.8),
- justify = 'center').place(relx=0.5,rely=0.5,anchor='center')
-
-
- def init_liste_mc(self):
- """
- 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]
- 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.configure(relief='flat',state='disabled')
- self.widgets.append((e,lab))
- i=i+1
-
- def init_boutons(self):
- """
- Construit les boutons Modifier,Supprimer et Fermer
- Les deux premiers sont inactifs tant qu'aucun mot-clé n'est sélectionné
- """
- self.b_mod = Button(self.frame3,
- text = "Modifier",
- disabledforeground = 'grey35',
- state='disabled',
- command = self.modifie_mc)
- self.b_sup = Button(self.frame3,
- text = "Supprimer",
- disabledforeground = 'grey35',
- state='disabled',
- command = self.supprime_mc)
- 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_quit.place(relx=0.50,rely=0.5,anchor='center')
-
- def wait_new_list(self):
- """
- Cette méthode rend cette toplevel bloquante.
- Dès que la variable var_quit est modifiée, on continue l'exécution de cette
- méthode (et on quitte)
- """
- self.fenetre.wait_variable(self.var_quit)
- self.fenetre.destroy()
- return self.new_l_mc
-
- def get_path(self,l_o):
- """
- Construit la chaîne de caractère contenant le chemin d'accès complet du mot-clé
- """
- txt = ''
- for o in l_o :
- txt = txt + o.nom+'/'
- # on enlève le dernier slash en trop
- txt = txt[0:-1]
- return txt
-
- def select_mc(self,mc,entry):
- """
- Enregistre le mot-clé passé en argument comme mot-clé courant
- Active les boutons Modifier et Supprimer
- """
- self.desactive_entry()
- self.mc_courant = mc
- self.entry_courante = entry
- self.active_boutons()
- self.active_entry()
-
- def modifie_mc(self):
- """
- Modifie le nom du mot-clé en prenant la nouvelle valeur lue dans entry_courante
- """
- new_nom_mc = self.entry_courante.get()
- index = self.l_mc.index(self.mc_courant)
- new_mc = self.new_l_mc[index]
- new_mc[-2] = new_nom_mc
- objet_pere = self.mc_courant[-3]
-
- self.desactive_boutons()
- self.desactive_entry()
-
- def supprime_mc(self):
- """
- Supprime le mot-clé courant de la liste
- """
- 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()
-
- def desactive_boutons(self):
- """
- Désactive les boutons Modifier et Supprimer
- """
- self.b_mod.configure(state='disabled')
- self.b_sup.configure(state='disabled')
-
- def active_boutons(self):
- """
- Active les boutons Modifier et Supprimer
- """
- self.b_mod.configure(state='normal')
- self.b_sup.configure(state='normal')
-
- def desactive_entry(self):
- """
- Désactive l'entry courante si elle existe
- """
- if self.entry_courante :
- self.entry_courante.configure(state='disabled',relief='flat')
-
- def active_entry(self):
- """
- Active l'entry courante si elle existe
- """
- if self.entry_courante :
- self.entry_courante.configure(state='normal',relief='sunken')
-
- def quit(self):
- """
- Permet de fermer la fenêtre
- """
- self.var_quit.set(1)
-
-if __name__ == '__main__':
- fenetre_mc_inconnus(('toto','titi'))
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-from widgets import askopenfilename
-from widgets import showinfo
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-from plusieursbasepanel import PLUSIEURS_BASE_Panel
-
-
-class FONCTION_Panel(PLUSIEURS_BASE_Panel):
- def makeValeurPage(self,page):
- """
- Crée la page de saisie d'une liste de valeurs à priori quelconques,
- cad qui ne sont pas à choisir dans une liste prédéfinie
- """
- genea=self.node.item.get_genealogie()
- if "VALE" in genea:
- self.nb_valeurs=2
- if "VALE_C" in genea:
- self.nb_valeurs=3
- # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
- # et la liste des valeurs déjà affectées à l'objet courant
- bulle_aide=self.get_bulle_aide()
- objet_mc = self.node.item.get_definition()
- aide = self.get_aide()
- aide = justify_text(texte=aide)
- min,max = self.node.item.GetMinMax()
- l_valeurs = self.node.item.GetListeValeurs()
- l2_valeurs=self.decoupeListeValeurs(l_valeurs)
-
- # création des frames globales
- self.frame1 = Frame(page,relief='groove',bd=2)
- self.frame2 = Frame(page)
- self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
- self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
- self.frame_right = Frame(self.frame1)
- self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
-
- # création des frames internes
- self.frame_valeurs = Frame(self.frame1)
- self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
- self.frame_boutons_fleches = Frame(self.frame_right)
- self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
- self.frame_choix = Frame(self.frame_right)
- self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.5)
- self.frame_aide = Frame(self.frame_right)
- self.frame_aide.place(relx=0.1,rely=0.7,relwidth=0.8,relheight=0.3)
- self.frame_boutons = Frame(self.frame2)
- self.frame_boutons.place(relx=0.35,rely=0.,relwidth=0.5,relheight=1.)
- for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
- self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
- fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
- # création des objets dans les frames
- liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
- ("<Button-3>",self.deselectValeur),
- ("<Double-Button-1>",self.afficheValeurListe))
- self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l2_valeurs,liste_commandes = liste_commandes_valeurs,
- titre="Valeur(s) actuelle(s)")
-
- # 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_double_valeur_plusieurs_base)
- 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
- self.bouton_add = Button(self.frame_boutons_fleches,
- image = images.get_image('arrow_left'),
- command = self.add_double_valeur_plusieurs_base)
- self.bouton_sup = Button(self.frame_boutons_fleches,
- image = images.get_image('arrow_right'),
- command = self.sup_valeur_sans_into)
- self.bouton_add.place(relx=0.3,rely=0.35)
- self.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',
- 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
- self.bouton_accepter = Button(self.frame_boutons,
- text='Valider',
- command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur_recolle(m,M))
- self.bouton_annuler = Button(self.frame_boutons,
- text = 'Annuler',
- command = self.annule_modifs_valeur)
- for but in (self.bouton_accepter,self.bouton_annuler):
- but.pack(side='left',padx=4)
-
-
- def afficheValeurListe(self,name):
- self.display_valeur(name)
-
- def decoupeListeValeurs(self,liste):
- #decoupe la liste des valeurs en n ( les x puis les y)
- nb=self.nb_valeurs
- l_valeurs=[]
- if (len(liste)%nb != 0):
- message="La cardinalité n'est pas correcte, la dernière valeur est ignorée"
- showinfo("Problème",message)
- for i in range(len(liste)/nb) :
- if (nb==2):
- t=(liste[i*nb], liste[i*nb+1])
- else:
- t=(liste[i*nb], liste[i*nb+1], liste[i*nb+2])
- l_valeurs.append(t)
- return l_valeurs
-
-
- def accepte_modifs_valeur_recolle(self,min,max):
- l_valeurs=[]
- l1_valeurs = self.Liste_valeurs.get_liste()
- for val in l1_valeurs :
- for item in val :
- l_valeurs.append(item)
- self.accepte_modifs_valeur(min,max,l_valeurs)
-
-
- def add_double_valeur_plusieurs_base(self):
- # on verifie qu'il s agit bien d un tuple
- # on enleve les parentheses eventuelles
- #doublevaleur_entree,validite,commentaire=self.get_valeur_double()
- doublevaleur_entree= self.entry.get()
- try:
- if doublevaleur_entree[0]=='(' :
- doublevaleur_entree=doublevaleur_entree[1:-1]
- if doublevaleur_entree[-1]==')' :
- doublevaleur_entree=doublevaleur_entree[0:-2]
- val1=doublevaleur_entree.split(',')[0]
- val2=doublevaleur_entree.split(',')[1]
- saisie=(val1,val2)
- if (self.nb_valeurs==3):
- val3=doublevaleur_entree.split(',')[2]
- saisie=(val1,val2,val3)
- self.entry.delete(0,END)
- except :
- commentaire = "%s n est pas un tuple de la forme (x,y)" %`doublevaleur_entree`
- if (self.nb_valeurs==3):
- commentaire = "%s n est pas un tuple de la forme (x,y,z)" %`doublevaleur_entree`
- self.parent.appli.affiche_infos(commentaire)
- return
-
- # et seulement d un tuple
- try:
- val=doublevaleur_entree.split(',')[self.nb_valeurs]
- commentaire = "%s n est pas un tuple de la forme (x,y)" %`doublevaleur_entree`
- if (self.nb_valeurs==3):
- commentaire = "%s n est pas un tuple de la forme (x,y,z)" %`doublevaleur_entree`
- self.parent.appli.affiche_infos(commentaire)
- self.parent.appli.affiche_infos(commentaire)
- return
- except :
- # c est la le cas normal
- pass
-
- # on verifie la validite des valeurs sont correctes
- valeur,validite=self.node.item.eval_valeur(saisie)
- if not validite :
- commentaire = "impossible d'évaluer : %s " %`doublevaleur_entree`
- self.parent.appli.affiche_infos(commentaire)
- return
-
- # on verifie la validite de la liste
- liste=[]
- l1_valeurs = self.Liste_valeurs.get_liste()
- for val in l1_valeurs :
- for item in val :
- liste.append(item)
- validite_liste=self.node.item.valide_liste_partielle(valeur[0],liste)
- if not validite_liste:
- commentaire = "impossible d'ajouter %s a la liste " %`doublevaleur_entree`
- self.parent.appli.affiche_infos(commentaire)
- return
- # liste a deja ete modifiee par l appel precedent a valide_liste_partielle
- # et contient deja valeur[0]
- validite_liste=self.node.item.valide_liste_partielle(valeur[1],liste)
- if not validite_liste:
- commentaire = "impossible d'ajouter %s a la liste " %`doublevaleur_entree`
- self.parent.appli.affiche_infos(commentaire)
- return
-
- # si une valeur est selectionnee on insere apres
- # sinon on ajoute la valeur à la fin
- if (self.Liste_valeurs.selection != None):
- ligne=self.Liste_valeurs.cherche_selected_item()
- if self.nb_valeurs==2:
- l1_valeurs.insert(ligne,(valeur[0],valeur[1]))
- else :
- l1_valeurs.insert(ligne,(valeur[0],valeur[1],valeur[2]))
- else :
- if self.nb_valeurs==2:
- l1_valeurs.append((valeur[0],valeur[1]))
- else :
- l1_valeurs.append((valeur[0],valeur[1],valeur[2]))
- i = 0
- while i < self.nb_valeurs :
- self.set_valeur_texte(saisie[i])
- i=i+1
- self.Liste_valeurs.put_liste(l1_valeurs)
- self.Liste_valeurs.affiche_liste()
-
-
- def display_valeur(self,val=None):
- """
- Affiche la valeur passée en argument dans l'entry de saisie.
- Par défaut affiche la valeur du mot-clé simple
- Doit être redéfinie pour un pb avec les parametres dans un tuple
- """
- if not val :
- valeur = self.node.item.object.getval()
- else:
- valeur = val
- if not valeur : return
-
- try:
- affiche="("
- separe=""
- for val in valeur:
- affiche=affiche+separe+str(val)
- separe=","
- affiche=affiche+")"
- self.entry.delete(0,END)
- self.entry.insert(0,affiche)
- except :
- self.entry.delete(0,END)
-
-# Surcharge de select in file pour prendre en compte la saisie de tuple
- def select_in_file(self):
- """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
- nom_fichier = askopenfilename(title="Choix fichier :")
-
- if not nom_fichier:
- return
-
- try:
- f = open(nom_fichier, "rb")
- selection_texte = f.read()
- f.close()
- self.add_double_valeur_plusieurs_base = FenetreDeSelection(self,
- self.node.item,
- self.parent.appli,
- titre="Sélection de valeurs",
- texte=selection_texte,
- cardinal = self.nb_valeurs)
- except:
- traceback.print_exc()
- showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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')
-standard_gras_souligne = ("Times",10,'bold','underline')
-
-canvas = ('times',8)
-canvas_italique = ('times',8,'italic')
-canvas_gras = ("Times",8,'bold')
-canvas_gras_italique = ("Times",10,'bold','italic')
-
-standard12 = ("Times",12)
-standard12_gras = ("Times",12,'bold')
-standard12_gras_italique = ( "times",12,'bold','italic')
-
-standardcourier10 = ("Courier",10)
-
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 COMMUNES nécessaires
+ aux deux éditeurs graphiques QT et TK
+"""
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-"""
-
-import os
-import Tkinter
-
-if __name__ == '__main__':
- # Programme de test
- import sys
- import images
- root=Tkinter.Tk()
- frame = Tkinter.Frame(root)
- frame.pack(expand=1,fill='both')
-
- for name in ('About24','Save24'):
- Tkinter.Label(frame, image=images.get_image(name)).pack(side=Tkinter.TOP)
-
- root.mainloop()
- sys.exit()
-
-try:
- import prefs
- ICONDIR=prefs.ICONDIR
-except:
- # Par defaut on utilise le repertoire local icons
- ICONDIR=os.path.join(os.path.abspath(os.path.dirname(__file__)),'icons')
-
-dico_images={}
-
-def get_image(name):
- if dico_images.has_key(name):
- return dico_images[name]
- else :
- fic_image = os.path.join(ICONDIR,name)
- if not os.path.isfile(fic_image):
- file, ext = os.path.splitext(fic_image)
- fic_image = file + '.gif'
- image = Tkinter.PhotoImage(file=fic_image)
- dico_images[name]=image
- return image
-
-def update_cache():
- global dico_images
- dico_images={}
-
les imports de modules Python
"""
import sys
-import prefs
+from Aster import prefs
+
# Ce chemin permet d'importer les modules Noyau et Validation
# représentant le code utilisé (si fourni)
if prefs.CODE_PATH:
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
- les informations attachées au noeud de l'arbre sélectionné
-"""
-# Modules Python
-import types,sys
-import traceback
-import Tkinter
-import Pmw
-
-# Modules Eficas
-import panels
-from treeitemincanvas import TREEITEMINCANVAS
-from widgets import showinfo,showerror
-
-class CONFIG:
- isdeveloppeur='NON'
-
-class JDCDISPLAY:
- """
- Cette classe ajoute à la class TREEITEMINCANVAS l'affichage des infos
- attachées au noeud sélectionné dans un notebook
- L'objet item associé au jdc est créé par la classe TREEITEMINCANVAS
- """
- def __init__(self,jdc,nom_jdc,appli=None,parent=None):
- self.jdc=jdc
- self.nom_jdc=nom_jdc
- self.fichier=None
- self.panel_courant=None
-
- if not appli:
- class Appli:
- def __init__(self):
- self.CONFIGURATION=CONFIG()
- def affiche_infos(self,message):
- print message
- return
-
- def efface_aide(self,event):
- return
-
- def affiche_aide(self,event,aide):
- print aide
- return
-
- appli=Appli()
- self.appli=appli
-
- if not parent:
- parent=Tkinter.Tk()
- Pmw.initialise(parent)
- self.parent=parent
- self.node_selected = None
- self.modified='n'
-
- self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
- 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,self.make_rmenu)
-
- def make_rmenu(self,node,event):
- if hasattr(node.item,'rmenu_specs'):
- rmenu = Tkinter.Menu(self.pane.pane('treebrowser'), tearoff=0)
- #node.select()
- self.cree_menu(rmenu,node.item.rmenu_specs,node)
- rmenu.tk_popup(event.x_root,event.y_root)
-
- def cree_menu(self,menu,itemlist,node):
- """
- 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,node)
- elif method[0] == '&':
- # On a une chaine avec & en tete => on cree un radiobouton
- try:
- command=getattr(node.item,method[1:])
- menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
- if radio == None:radio=number_item
- except:pass
- else:
- try:
- command=getattr(node.item,method)
- menu.add_command(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
- except:pass
- # Si au moins un radiobouton existe on invoke le premier
- if radio:menu.invoke(radio)
-
- def select(self):
- return
-
- def unselect(self):
- return
-
- def select_node(self,node):
- """
- Cette méthode est appelée à chaque fois qu'un noeud est sélectionné
- dans l'arbre.
- Elle permet l'affichage du panneau correspondant au noeud sélectionné
- """
- if node is not self.node_selected :
- #ATTENTION: il faut affecter l'attribut node_selected avant d'appeler
- # create_panel pour eviter une recursion infinie entre create_panel,
- # Emit, onValid, select_node
- self.node_selected = node
- self.create_panel(node)
- elif self.panel_courant:
- self.panel_courant.update_panel()
-
- def create_panel(self,node):
- """
- 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 is None:
- self.panel_courant=None
- return self.panel_courant
-
- if node.item.isactif():
- if hasattr(node.item,"panel"):
- 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:
- self.panel_courant = panels.Panel_Inactif(self,self.pane.pane('selected'),node)
- return self.panel_courant
-
- def init_modif(self):
- """
- Met l'attribut modified à 'o' : utilisé par Eficas pour savoir
- si un JDC doit être sauvegardé avant destruction ou non
- """
- self.modified = 'o'
-
- def stop_modif(self):
- """
- Met l'attribut modified à 'n' : utilisé par Eficas pour savoir
- si un JDC doit être sauvegardé avant destruction ou non
- """
- self.modified = 'n'
-
- def mainloop(self):
- self.parent.mainloop()
-
- def ReplaceObjectNode(self,node,new_object,nom_sd=None):
- """
- Cette méthode sert à remplacer l'objet pointé par node par
- new_object.
- Si nom_sd : on remplace un OPER et on essaie de renommer la
- nouvelle sd par nom_sd
- """
- child = node.append_brother(new_object,retour='oui')
- if child == 0:
- self.appli.affiche_infos("Impossible de remplacer l'objet du noeud courant")
- else:
- self.init_modif()
- node.delete()
- #if nom_sd:
- #child.item.nomme_sd(nom_sd)
- child.select()
- #child.update()
-
- def doCut(self):
- """
- Stocke dans Eficas.noeud_a_editer le noeud à couper
- """
- if not self.node_selected.item.iscopiable():
- showinfo("Copie impossible",
- "Cette version d'EFICAS ne permet que la copie d'objets de type 'Commande' ou mot-clé facteur")
- return
- self.appli.edit="couper"
- self.appli.noeud_a_editer = self.node_selected
-
- def doCopy(self):
- """
- Stocke dans Eficas.noeud_a_editer le noeud à copier
- """
- if not self.node_selected.item.iscopiable():
- showinfo("Copie impossible",
- "La copie d'un tel objet n'est pas permise")
- return
- self.appli.edit="copier"
- self.appli.noeud_a_editer = self.node_selected
-
- def doPaste(self):
- """
- Lance la copie de l'objet placé dans self.appli.noeud_a_editer
- Ne permet que la copie d'objets de type Commande ou MCF
- """
- try:
- child=self.appli.noeud_a_editer.doPaste(self.node_selected)
- except:
- traceback.print_exc()
- showinfo("Action de coller impossible",
- "L'action de coller apres un tel objet n'est pas permise")
- return
-
- if child == 0:
- if self.appli.message != '':
- showerror("Copie refusée",self.appli.message)
- self.appli.message = ''
- self.appli.affiche_infos("Copie refusée")
- return
-
- # il faut déclarer le JDCDisplay_courant modifié
- self.init_modif()
- # suppression éventuelle du noeud sélectionné
- # si possible on renomme l objet comme le noeud couper
- if self.appli.edit == "couper":
- #nom = self.appli.noeud_a_editer.item.object.sd.nom
- item=self.appli.noeud_a_editer.item
- self.appli.noeud_a_editer.delete()
- child.item.update(item)
- #test,mess = child.item.nomme_sd(nom)
- child.select()
- # on rend la copie à nouveau possible en libérant le flag edit
- self.appli.edit="copier"
-
- def update(self):
- """Cette methode est utilisee par le JDC associe pour
- signaler des modifications globales du JDC
- """
- self.tree.update()
-
- def supprime(self):
- #print "supprime",self
- self.select_node(None)
- self.tree.supprime()
- self.tree=None
- self.pane.destroy()
-
- #def __del__(self):
- # print "__del__",self
+++ /dev/null
-import string
-
-class listeFichiers :
-
- def __init__(self,appli):
- self.appli=appli
- self.premiere=1
- self.nbfich=0
- self.rep=self.appli.CONFIGURATION.rep_user
- self.menuFichier=self.appli.menubar.menudict['Fichier']
- self.monFichier=self.rep+"/listefichiers"
- self.liste_Fichiers=[]
- self.init_Fichier()
- self.traite_liste()
-
- def init_Fichier(self):
- index=0
- try :
- f=open(self.monFichier)
- while ( index < 5) :
- ligne=f.readline()
- if ligne != "" :
- l=(ligne.split("\n"))[0]
- self.liste_Fichiers.append(l)
- index=index+1
- except :
- pass
- try :
- f.close()
- except :
- pass
-
- def sauve_Fichier(self):
- try :
- if len(self.liste_Fichiers) == 0 :
- return
- f=open(self.monFichier,'w')
- index=0
- while ( index < len(self.liste_Fichiers)):
- ligne=self.liste_Fichiers[index]+"\n"
- f.write(ligne)
- index=index+1
- except :
- pass
- try :
- f.close()
- except :
- pass
-
- def traite_liste(self):
- index=0
- for index in range(self.nbfich):
- self.menuFichier.delete(9)
- self.nbfich = 0
- index = 0
- while( index < len(self.liste_Fichiers)) :
- self.ajout_item(index)
- index=index+1
-
- def ajout_item(self,index):
- if self.premiere and (len(self.liste_Fichiers)!=0):
- self.premiere=0
- self.menuFichier.add_separator()
- label=self.liste_Fichiers[index]
- self.menuFichier.insert_command(8,label=label,command= lambda self=self, l=label:self.coucou (l));
- self.nbfich=self.nbfich+1
-
- def coucou(self,label):
- self.appli.bureau.openJDC(file=label)
-
- def aOuvert(self,file):
- if file not in self.liste_Fichiers :
- if (len(self.liste_Fichiers) > 4) :
- f=self.liste_Fichiers[0]
- self.liste_Fichiers.remove(f)
- self.liste_Fichiers.insert(len(self.liste_Fichiers),file)
- else:
- self.liste_Fichiers.remove(file)
- self.liste_Fichiers.insert(len(self.liste_Fichiers),file)
- self.traite_liste()
- self.sauve_Fichier()
import os
import re
-import Tkinter
-
-# le dictionnaire sous menu est indexe parceque l'ordre des
-# recherches est important
sous_menu={0:{"3D":"3D.comm"},1:{"poutre":"pou.comm"},2:{"salome":"salome.comm"},3:{"divers":"comm"}}
class listePatrons :
- def __init__(self,appli):
- self.appli=appli
- rep_ini=self.appli.CONFIGURATION.rep_ini
- if self.appli.code != "ASTER" :
- return
- self.rep_patrons=rep_ini+"/../Editeur/Patrons"
+ def __init__(self):
+ repIni=os.path.dirname(os.path.abspath(__file__))
+ self.rep_patrons=repIni+"/Patrons"
self.liste={}
self.traite_liste()
- self.ajout_menu()
-
def traite_liste(self):
for file in os.listdir(self.rep_patrons):
else :
self.liste[clef]=[file]
break
-
- def ajout_menu(self):
- menuFichier=self.appli.menubar.menubar
- menu_cascade=Tkinter.Menu(menuFichier,tearoff=0)
- menuFichier.add_cascade(label="Patrons",menu=menu_cascade)
- for ss_menu in self.liste.keys():
- ssmenu=Tkinter.Menu(menu_cascade,tearoff=0)
- menu_cascade.add_cascade(label=ss_menu,menu=ssmenu)
- for fichier in self.liste[ss_menu]:
- ssmenu.add_command(label=fichier,command= lambda self=self, l=fichier:self.ouvre(l));
-
- def ouvre(self,label):
- fichier=self.rep_patrons+"/"+label
- self.appli.bureau.openJDC(file=fichier,enregistre="non")
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 MacroDisplay qui realise l'affichage
- des sous commandes d'une macro sous forme d'arbre
-"""
-# Modules Python
-import types,sys
-import Tkinter,Pmw
-
-# Modules EFICAS
-import images
-import tooltip
-import Objecttreeitem
-import compojdc
-import treewidget
-from widgets import Fenetre
-from Ihm import CONNECTOR
-
-class MACRO2TreeItem(compojdc.JDCTreeItem):
- pass
-
-class MacroDisplay:
- def __init__(self,appli,macroitem,nom_jdc):
- self.fenetre = Tkinter.Toplevel()
- self.fenetre.configure(width = 800,height=500)
- self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
- self.fenetre.title("Visualisation Macro_Etape")
- self.macroitem=macroitem
- self.jdc=macroitem.object.jdc_aux
- self.nom_jdc=nom_jdc
- self.appli=appli
- self.barre=Tkinter.Frame(self.fenetre,relief="ridge",bd=2)
- self.barre.pack(expand=0,fill=Tkinter.X)
- if self.macroitem.object.fichier_text is not None:
- b=Tkinter.Button(self.barre,image=images.get_image("Zoom24"),command=self.visufile)
- b.pack(side='left')
- tp=tooltip.TOOLTIP(b,"View file")
- self.mainPart=Pmw.ScrolledCanvas(self.fenetre,
- hull_width=600,
- hull_height=500,
- borderframe=1)
- self.canvas=self.mainPart.component('canvas')
- Pmw.Color.changecolor(self.canvas,background='gray95')
- self.mainPart.pack(padx=10,pady=10,fill = 'both', expand = 1)
- self.item=MACRO2TreeItem(self.appli,nom_jdc,self.jdc)
- self.tree = treewidget.Tree(self.appli,self.item,self.mainPart,command=None,rmenu=self.make_rmenu)
- self.tree.draw()
- CONNECTOR.Connect(self.jdc,"close",self.onCloseView,())
-
- def onCloseView(self):
- self.quit()
-
- def visufile(self):
- Fenetre(self.appli,titre="Source du fichier inclus",texte=self.macroitem.object.fichier_text)
-
- def make_rmenu(self,node,event):
- if hasattr(node.item,'rmenu_specs'):
- rmenu = Tkinter.Menu(self.canvas, tearoff=0)
- self.cree_menu(rmenu,node.item.rmenu_specs,node)
- rmenu.tk_popup(event.x_root,event.y_root)
-
- def cree_menu(self,menu,itemlist,node):
- """
- 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,node)
- elif method[0] == '&':
- # On a une chaine avec & en tete => on cree un radiobouton
- try:
- command=getattr(node.item,method[1:])
- menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
- if radio == None:radio=number_item
- except:pass
- else:
- try:
- command=getattr(node.item,method)
- menu.add_command(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
- except:pass
- # Si au moins un radiobouton existe on invoke le premier
- if radio:menu.invoke(radio)
-
- def quit(self):
- #print "quit",self
- self.tree.supprime()
- self.tree=None
- self.fenetre.destroy()
-
- #def __del__(self):
- # print "__del__",self
-
-def makeMacroDisplay(appli,macroitem,nom_item):
- return MacroDisplay(appli,macroitem,nom_item)
-
-import treeitemincanvas
-
-class TREEITEMINCANVAS(treeitemincanvas.TREEITEMINCANVAS):
- def __init__(self,object,nom="",parent=None,appli=None,sel=None,rmenu=None):
- #print "TREEITEMINCANVAS",object
- self.object=object
- self.nom=nom
- self.appli=appli
- self.parent=parent
-
- self.item=MACRO2TreeItem(self.appli,self.nom,self.object)
- 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):
- return
- self.tree=treewidget.Tree(self.appli,self.item,self.canvas,command=sel,rmenu=rmenu)
- self.tree.draw()
-
-import jdcdisplay
-
-class MACRODISPLAY(jdcdisplay.JDCDISPLAY):
- def __init__(self,jdc,nom_jdc,appli=None,parent=None):
- #print "MACRODISPLAY",jdc
- self.jdc=jdc
- self.nom_jdc=nom_jdc
- self.fichier=None
- self.panel_courant=None
- self.appli=appli
- self.parent=parent
- self.node_selected = None
- self.modified='n'
-
- self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
- 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,self.make_rmenu)
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-
-class MENUBAR:
- def __init__(self,appli,parent):
- # L'attribut appli pointe vers l'objet application qui détient la menubar et les autres composants
- self.appli=appli
- # L'attribut parent pointe vers l'objet graphique parent de la menubar
- self.parent=parent
- self.menubar=Menu(self.parent)
- self.parent.configure(menu=self.menubar)
- self.init()
-
- try:
- from prefs import labels
- except:
- labels= ('Fichier','Edition','Jeu de commandes','Catalogue','Options','Aide','Traducteur')
-
- def init(self):
- self.menudict={}
- for label in self.labels:
- menu=Menu(self.menubar,tearoff=0)
- self.menudict[label]=menu
- self.menubar.add_cascade(label=label,menu=menu)
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-import composimp
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-
-class newSIMPPanel(panels.OngletPanel):
- """
- Classe virtuelle servant de classe mère à toutes les classes Panel
- servant à afficher et récupérer la valeur d'un mot-clé simple.
- Le panel est différent suivant le type de la valeur attendu
- """
- def init(self):
- """
- Méthode appelée par le constructeur de OngletPanel :
- construit le notebook à 2 onglets utilisé par tous les panels de
- tous les mots-clés simples
- """
- nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
- nb.pack(fill = 'both', expand = 1)
- self.nb=nb
- nb.add('Valeur', tab_text='Saisir valeur')
- self.makeValeurPage(nb.page('Valeur'))
- self.enlevebind()
- self.creebind()
- nb.setnaturalsize()
-
-# ----------------------------------------------------------------------------------------
-# Méthodes utilisées pour l'affectation de la valeur donnée par l'utilisateur
-# au mot-clé courant
-# ----------------------------------------------------------------------------------------
-
- def reset_old_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é ni ré-évaluer l'ancienne valeur
- permet de rester avec des valeurs non entrees et de ne pas
- ré-évaluer des entiers par exemple
- """
- if self.parent.modified == 'n' : self.parent.init_modif()
- self.node.item.set_valeur(name)
- self.parent.appli.affiche_infos(mess)
-
- def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
- """
- Enregistre val comme valeur de self.node.item.object
- en evaluant l item et en le validant
- Si name n'est pas renseigné, la valeur
- """
- if self.parent.modified == 'n' : self.parent.init_modif()
- if name != None:
- valeur = name
- validite = 1
- else :
- valeurentree= self.entry.get()
- self.entry.delete(0,END)
- if valeurentree == '': valeurentree=None
- valeur,validite=self.node.item.eval_valeur(valeurentree)
- if not validite :
- valeur= self.entry.get()
- commentaire = "impossible d'évaluer : %s " %`valeurentree`
- self.parent.appli.affiche_infos(commentaire)
-
- if validite :
- validite,commentaire=self.node.item.valide_val(valeur)
-
- if validite :
- self.node.item.set_valeur(valeur)
- self.parent.appli.affiche_infos(mess)
- else :
- self.parent.appli.affiche_infos(commentaire)
-
-# ----------------------------------------------------------------------------------------
-# Méthodes utilisées pour la manipulation des items dans les listes de choix
-# ----------------------------------------------------------------------------------------
- def selectValeur(self,name):
- self.selected_valeur = name
-
- def deselectValeur(self,name):
- self.selectValeur = None
-
- def sup_valeur(self,name=None):
- """
- Supprime la valeur selectionnée de la liste des valeurs et la rajoute
- à la liste des choix possibles
- """
- if hasattr(self,'selected_valeur') :
- if ( self.selected_valeur != None and self.selected_valeur != ''):
- liste_valeurs = self.Liste_valeurs.get_liste()
- liste_valeurs.remove(self.selected_valeur)
- self.Liste_valeurs.put_liste(liste_valeurs)
- listeActuelle=self.Liste_valeurs.get_liste()
- liste_choix=self.node.item.get_liste_possible(listeActuelle)
- self.Liste_choix.put_liste(liste_choix)
- self.selected_valeur = None
-
- def add_choix(self,name=None):
- """
- Ajoute le choix selectionné à la liste des valeurs et le retire
- de la liste des choix possibles
- """
-
- if hasattr(self,'selected_choix') :
- if (self.selected_choix != None and self.selected_choix != ''):
- min,max = self.node.item.GetMinMax()
- liste_valeurs = self.Liste_valeurs.get_liste()
- if len(liste_valeurs) >= max :
- self.parent.appli.affiche_infos("La liste ne peut pas avoir plus de %d éléments" %max)
- return
- if (self.Liste_valeurs.selection != None):
- ligne=self.Liste_valeurs.cherche_selected_item()
- liste_valeurs.insert(ligne,self.selected_choix)
- else :
- liste_valeurs.append(self.selected_choix)
- self.Liste_valeurs.put_liste(liste_valeurs)
- listeActuelle=self.Liste_valeurs.get_liste()
- liste_choix=self.node.item.get_liste_possible(listeActuelle)
- self.Liste_choix.put_liste(liste_choix)
- self.selected_choix = None
-
- def selectChoix(self,name):
- self.selected_choix = name
-
- def deselectChoix(self,name):
- self.selectChoix = None
-
- def raisecmd(self,page):
- try:
- self.entry.focus()
- except:
- pass
-
-# ----------------------------------------------------------------------------------------
-# Méthodes utilisées pour la manipulation des items en notation scientifique
-# ----------------------------------------------------------------------------------------
- def set_valeur_texte(self,texte_valeur) :
- """ Sert à mettre à jour la notation scientifique"""
- try :
- if "R" in self.node.item.object.definition.type:
- if texte_valeur[0] != "'":
- clef=eval(texte_valeur)
- if str(clef) != str(texte_valeur) :
- self.node.item.object.init_modif()
- clefobj=self.node.item.object.GetNomConcept()
- if not self.parent.appli.dict_reels.has_key(clefobj):
- self.parent.appli.dict_reels[clefobj] = {}
- self.parent.appli.dict_reels[clefobj][clef]=texte_valeur
- self.parent.appli.dict_reels[clefobj]
- self.node.item.object.fin_modif()
- except:
- pass
-
-
- def get_valeur_texte(self,valeur) :
- valeur_texte=""
- if "R" in self.node.item.object.definition.type:
- clefobj=self.node.item.object.GetNomConcept()
- if self.parent.appli.dict_reels.has_key(clefobj):
- if self.parent.appli.dict_reels[clefobj].has_key(valeur):
- valeur_texte=self.parent.appli.dict_reels[clefobj][valeur]
- return valeur_texte
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 os,string
-
-# Modules Eficas
-from widgets import askopenfilename
-import panels
-
-# l'option affichage_commandes peut prendre les valeurs "groupes" ou "alphabetic"
-affichage_commandes="alphabetic"
-
-class OPTIONS:
-
- menu_defs=[
- ('Options',[
- ("Affichage commandes",(("alphabétique",'&affichage_alpha'),("groupes",'&affichage_grp'))),
- #("Couleur",(("fond",'change_fond'),("barre",'change_barre'))),
- # ("Catalogue développeur",'choix_cata_developpeur'),
- ('Paramètres Eficas','affichage_fichier_ini'),
- ('Paramètres Affichage','affichage_style_ini'),
-
- ]
- )
- ]
-
- button_defs=[]
-
- def __init__(self,appli,parent):
- self.appli=appli
- self.parent=parent
-
-
- def affichage_grp(self):
- global affichage_commandes
- affichage_commandes="groupes"
- if hasattr(panels,'panneauCommande'):
- panel=panels.panneauCommande
- parent=panel.parent
- if parent != None :
- parent.create_panel(parent.node_selected)
- # si on a un panel avec plusieurs onglets
- # on affiche Commande
- try :
- parent.panel_courant.nb.selectpage("Commande")
- except :
- pass
-
- def affichage_alpha(self):
-
- global affichage_commandes
- affichage_commandes="alphabetic"
- if hasattr(panels,'panneauCommande'):
- panel=panels.panneauCommande
- parent=panel.parent
- if parent != None :
- parent.create_panel(parent.node_selected)
- # si on a un panel avec plusieurs onglets
- # on affiche Commande
- try :
- parent.panel_courant.nb.selectpage("Commande")
- except :
- pass
-
- def change_fond(self):
- from tkColorChooser import askcolor
- #nouvelle=askcolor(self.appli.background)
- nouvelle=askcolor('grey')
-
- def change_barre(self):
- pass
-
- def choix_cata_developpeur(self):
- """
- Cette méthode demande à l'utilisateur-développeur d'indiquer quel catalogue
- il veut utiliser en remplacement du catalogue standard du code
- NB : il faut que le développeur ait les droits d'écriture dans le répertoire où
- se trouve le catalogue
- """
- file = askopenfilename(title="Choix d'un catalogue personnel",
- defaultextension=".py",
- filetypes = ( ("Catalogue", "cata*.py"),))
- if file :
- self.parent.update_idletasks()
- self.appli.reset_affichage_infos()
- rep_fic = os.path.dirname(file)
- nom_fic = string.split(os.path.basename(file),'.')[0]
- rep_courant = os.getcwd()
- os.chdir(rep_fic)
- self.cata = __import__(nom_fic)
- self.code = self.cata.CODE
- os.chdir(rep_courant)
- self.fic_cata = file
- fic_cata_p = nom_fic+'_pickled.py'
- self.fic_cata_p = os.path.join(rep_fic,fic_cata_p)
- pile_erreurs = self.cata.erreurs_cata
- if pile_erreurs.existe_message() :
- messages = pile_erreurs.retourne_messages()
- print messages
- else :
- # XXX ne doit pas fonctionner
- self.catalo = catabrowser.CataItem(cata=self.cata)
- self.Retrouve_Ordre_Cata('personnel')
- pile_erreurs.efface()
-
-
- def affichage_fichier_ini(self):
- self.appli.CONFIGURATION.affichage_fichier_ini()
-
-
- def affichage_style_ini(self):
- self.appli.CONFIGStyle.affichage_style_ini()
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 os
-from Tkinter import *
-import Pmw
-import time
-import traceback
-
-import widgets
-from widgets import ListeChoix
-from widgets import ListeChoixParGroupes
-import prefs
-import options
-
-SEPARATEUR = '-'*30
-
-
-class Panel(Frame) :
- """
- Classe servant de classe mère à toutes celles représentant les
- panneaux à afficher en fonction de la nature de l'objet en cours
- Elle est toujours dérivée.
- """
- def __init__(self,parent,panneau,node) :
- # Le parent d'un panel est un objet de la classe JDCDISPLAY ou derivee
- # ou un objet qui a les attributs : appli (de classe APPLI ou derivee),
- # modified et la methode init_modif
- self.parent=parent
- self.panneau = panneau
- self.node=node
- Frame.__init__(self,self.panneau)
- self.place(x=0,y=0,relheight=1,relwidth=1)
- self.creer_boutons()
- self.init()
- global panneauCommande
- panneauCommande=self
-
- #def __del__(self):
- # print "__del__",self
-
- def update_panel(self):
- """Methode appele pour demander une mise a jour du panneau"""
-
- 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
- (à droite sous les onglets )
- """
- self.fr_but = Frame(self,height=30)
- self.fr_but.pack(side='bottom')
- #self.fr_but.pack(side='bottom',fill='x')
- #self.bouton_com = Button(self.fr_but, text = 'Commentariser', command = self.ajout_commentaire, width=14)
- #self.bouton_sup = Button(self.fr_but, text = "Supprimer", command=self.supprimer, width=14)
- #self.bouton_doc = Button(self.fr_but, text="Documentation", command=self.visu_doc, width=14)
- #self.bouton_cata = Button(self.fr_but, text = "Catalogue", command = self.show_catalogue, width=14)
- self.bouton_com = Button(self.fr_but, text = 'Commentariser', command = self.ajout_commentaire)
- self.bouton_sup = Button(self.fr_but, text = "Supprimer", command=self.supprimer)
- self.bouton_doc = Button(self.fr_but, text="Documentation", command=self.visu_doc)
- self.bouton_cata = Button(self.fr_but, text = "Catalogue", command = self.show_catalogue)
-
- if self.parent.appli.CONFIGURATION.isdeveloppeur == 'OUI':
- self.bouton_sup.pack(side='left',padx=5, pady=5)
- self.bouton_cata.pack(side='left',padx=5, pady=5)
- self.bouton_doc.pack(side='right',padx=5, pady=5)
- #self.bouton_sup.place(relx=0.25,rely = 0.5,relheight = 0.8,anchor='center')
- #self.bouton_cata.place(relx=0.5,rely = 0.5,relheight = 0.8,anchor='center')
- #self.bouton_doc.place(relx=0.75,rely = 0.5,relheight = 0.8,anchor='center')
- else:
- self.bouton_sup.pack(side='left',padx=5, pady=5)
- self.bouton_doc.pack(side='right',padx=5, pady=5)
- #self.bouton_sup.place(relx=0.3,rely = 0.5,relheight = 0.8,anchor='center')
- #self.bouton_doc.place(relx=0.7,rely = 0.5,relheight = 0.8,anchor='center')
-
- def show_catalogue(self):
- try:
- genea = self.node.item.get_genealogie()
- self.parent.appli.browser_catalogue_objet(genea)
- except Exception,e:
- traceback.print_exc()
-
- def efface(self):
- self.node.efface()
-
-# ------------------------------------------------------------------------
-# Méthodes permettant d'ajouter des commentaires, des paramètres
-# et des objets EVAL.
-# Ces méthodes sont utilisées par les panneaux des JDC,ETAPE,
-# COMMENTAIRE et PARAMETRE
-# ------------------------------------------------------------------------
-
- def ajout_commentaire(self,ind='after'):
- """
- Ajoute un commentaire à l'intérieur du JDC :
- - si ind='after' : l'ajoute après l'objet courant
- - si ind='before' : l'ajoute avant.
- """
- if self.parent.modified == 'n' : self.parent.init_modif()
- return self.node.append_brother("COMMENTAIRE",ind)
-
- def ajout_commentaire_first(self):
- """
- Ajoute un commentaire en début de JDC
- """
- if self.parent.modified == 'n' : self.parent.init_modif()
- return self.node.append_child("COMMENTAIRE",'first')
-
- def ajout_parametre(self,ind='after'):
- """
- Ajoute un parametre à l'intérieur du JDC :
- - si ind='after' : l'ajoute après l'objet courant
- - si ind='before' : l'ajoute avant.
- """
- if self.parent.modified == 'n' : self.parent.init_modif()
- return self.node.append_brother("PARAMETRE",ind)
-
- def ajout_parametre_first(self):
- """
- Ajoute un parametre en début de JDC
- """
- if self.parent.modified == 'n' : self.parent.init_modif()
- return self.node.append_child("PARAMETRE",'first')
-
-# def ajout_parametre_eval(self,ind='after'):
-# """
-# Ajoute un paramètre EVAL à l'intérieur du JDC :
-# - si ind='after' : l'ajoute après l'objet courant
-# - si ind='before' : l'ajoute avant.
-# """
-# if self.parent.modified == 'n' : self.parent.init_modif()
-# return self.node.append_brother("PARAMETRE_EVAL",ind)
-
-# def ajout_parametre_eval_first(self):
-# """
-# Ajoute un paramètre EVAL en début de JDC
-# """
-# if self.parent.modified == 'n' : self.parent.init_modif()
-# return self.node.append_child("PARAMETRE_EVAL",'first')
-
-# ------------------------------------------------------------------------
-
- def visu_doc(self):
- """ Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
- - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
- - indication du chemin d'accès aux fichiers pdf à revoir : trop statique"""
- cle_doc = self.node.item.get_docu()
- if cle_doc == None : return
- cle_doc = string.replace(cle_doc,'.','')
- cle_doc = string.replace(cle_doc,'-','')
- commande = self.parent.appli.CONFIGURATION.exec_acrobat
- nom_fichier = cle_doc+".pdf"
- fichier = os.path.abspath(os.path.join(self.parent.appli.CONFIGURATION.path_doc,
- nom_fichier))
- if os.name == 'nt':
- os.spawnv(os.P_NOWAIT,commande,(commande,fichier,))
- elif os.name == 'posix':
- script ="#!/usr/bin/sh \n%s %s&" %(commande,fichier)
- pid = os.system(script)
-
- def supprimer(self):
- """
- Suppression du noeud courant
- """
- # On signale au parent du panel (le JDCDisplay) une modification
- self.parent.init_modif()
- self.node.delete()
-
- def affiche(self):
- """ Force l'affichage des fenêtres en cours """
- self.tkraise()
-
- def selectMC(self,name):
- """ On retrouve le mot-clé sous le curseur pour affichage du fr """
- cmd=self.node.item.get_definition()
- texte_infos = ''
- for e in cmd.entites.keys() :
- if e == name :
- texte_infos=getattr(cmd.entites[e],prefs.lang)
- break
- if texte_infos == '' : texte_infos="Pas d'infos disponibles"
- self.parent.appli.affiche_infos(texte_infos)
-
- def defMC(self,name):
- """ On ajoute un mot-clé à la commande : subnode """
- if name == SEPARATEUR:return
- if self.parent.modified == 'n' : self.parent.init_modif()
- if name != "COMMENTAIRE":
- self.node.append_child(name)
- else :
- self.ajout_commentaire()
-
- def selectCmd(self,name):
- """ On retrouve la commande sous le curseur pour affichage du fr """
- if name != 'COMMENTAIRE' and name != SEPARATEUR:
- texte_infos=getattr(self.parent.jdc.get_cmd(name),prefs.lang)
- self.parent.appli.affiche_infos(texte_infos)
-
- def defCmd(self,name):
- """
- On ajoute une commande après la commande selectionnée : after
- ou bien on ajoute un commentaire
- """
- if name == SEPARATEUR:return
- if self.parent.modified == 'n' : self.parent.init_modif()
- if name != "COMMENTAIRE":
- #parent=self.node.parent
- #new_obj = parent.item.append_child(name,self.node.item.getObject())
- #parent.children[parent.children.index(self.node)+1].select()
- new_node = self.node.append_brother(name,'after')
- else :
- new_node = self.ajout_commentaire()
-
- def defCmdFirst(self,name):
- """ On ajoute une commande ou un commentaire au début du fichier de commandes """
- if name == SEPARATEUR:return
- if self.parent.modified == 'n' : self.parent.init_modif()
- if name != "COMMENTAIRE":
- #new_obj = self.node.item.append_child(name,'first')
- #self.node.children[0].select()
- new_node = self.node.append_child(name,'first')
- else :
- new_node = self.ajout_commentaire_first()
-
-class OngletPanel(Panel) :
- """ Cette classe est virtuelle et doit être dérivée
- Elle contient les principales méthodes d'affichage des différents onglets"""
-
- global panelbind
-
- def raisecmd(self,page):
- self.nb.page(page).focus_set()
- if page == 'Concept':
- try:
- self._any.focus()
- except:
- pass
- elif page == 'Commande':
- try:
- self.command_entry.component('entry').focus()
- except:
- pass
-
- def creebind(self):
- self.nb.bind_all("<F1>",lambda e,s=self,num=0:s.commande_up(num))
- self.nb.bind_all("<F2>",lambda e,s=self,num=1:s.commande_up(num))
- self.nb.bind_all("<F3>",lambda e,s=self,num=2:s.commande_up(num))
- self.nb.bind_all("<F4>",lambda e,s=self,num=3:s.commande_up(num))
- OngletPanel.panelbind=self.nb
-
- def enlevebind(self):
- if not hasattr(OngletPanel,"panelbind"):
- return
- if OngletPanel.panelbind == None:
- return
- try:
- OngletPanel.panelbind.unbind_all("<F1>")
- OngletPanel.panelbind.unbind_all("<F2>")
- OngletPanel.panelbind.unbind_all("<F3>")
- OngletPanel.panelbind.unbind_all("<F4>")
- except:
- pass
- OngletPanel.panelbind = None
-
- def commande_up(self,num):
- #print "commande_up de panels pour ", num
- try :
- OngletPanel.panelbind.selectpage(num)
- pageNew=OngletPanel.panelbind.page(num)
- pageNew.focus_set()
- except :
- pass
-
- def affiche(self):
- page=self.nb.getcurselection()
- self.nb.page(page).focus_set()
- if page == 'Concept':
- try:
-# _any est un pointeur sur entry
-# component est une methode de pmw
-# a priori, jamais ok
- self._any.component('entry').focus_set()
- except:
- pass
- self.tkraise()
-
-# ------------------------------------------------------------------------
-# Méthodes permettant d'afficher des pages partagées par différents
-# types d'objets (règles,mots-clés,concept,...)
-# ------------------------------------------------------------------------
-
- def makeConceptPage(self,page):
- """
- Crée la page de saisie du nom du concept
- """
- self.label = Label(page,text='Nom du concept :')
- self.label.place(relx=0.1,rely=0.4)
- self._any = Entry(page,relief='sunken')
- self._any.place(relx=0.35,rely=0.4,relwidth=0.5)
- self._any.bind("<Return>",lambda e,s=self:s.execConcept())
- self._any.bind("<KP_Enter>",lambda e,s=self:s.execConcept())
- self._any.insert(0,self.node.item.GetText())
- self.but_ok=Button(page,text = "Valider",command=self.execConcept)
- self.but_ok.place(relx=0.35,rely=0.8, relwidth=0.35)
- type_sd = self.node.item.get_type_sd_prod()
- if type_sd :
- txt = "L'opérateur courant retourne un objet de type %s" %type_sd
- self.label = Label(page, text = txt)
- self.label.place(relx=0.5,rely=0.55,anchor='n')
- self._any.focus()
- # aide associée au panneau
- bulle_aide="""Tapez dans la zone de saisie le nom que vous voulez donner
- au concept retounré par l'opérateur courant et pressez <Return> pour valider"""
- page.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- page.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
-
- def makeMoclesPage(self,page):
- """
- Crée la page qui affiche la liste des mots-clés que l'on peut
- encore ajouter
- """
- genea =self.node.item.get_genealogie()
- jdc = self.node.item.get_jdc()
- liste_mc=self.node.item.get_liste_mc_ordonnee(genea,jdc.cata_ordonne_dico)
- liste_commandes = (("<Enter>",self.selectMC),
- ("<Leave>",self.deselectMC),
- ("<Double-Button-1>",self.defMC))
- Liste = ListeChoix(self,page,liste_mc,liste_commandes = liste_commandes,titre = "Mots-clés permis",optionReturn="oui")
- Liste.affiche_liste()
- # aide associée au panneau
- bulle_aide="""Double-cliquez sur le mot-clé que vous voulez ajouter à
- la commande en cours d'édition"""
- Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
- if len(liste_mc) > 0 :
- Liste.surligne(liste_mc[0])
- self.Liste=Liste
-
- def makeCommentairePage(self,page):
- label = Label(page,text = "Insérer un commentaire :")
- label.grid(column = 0, row = 2)
- but_avant = Button(page,text = "AVANT",command = lambda s=self :s.ajout_commentaire(ind = 'before'))
- but_apres = Button(page,text = "APRES",command = self.ajout_commentaire)
- but_avant.grid(column = 1,row =2)
- 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_commandes = (("<Enter>",self.selectCmd),
- ("<Leave>",self.deselectCmd),
- ("<Double-Button-1>",self.defCmd))
- 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",optionReturn="oui")
- else:
- liste_commandes=liste_commandes+(("<Return>",self.defCmd),)
- liste_groupes,dict_groupes=self.get_groups()
- Liste = ListeChoixParGroupes(self,frame2,liste_groupes,dict_groupes,
- liste_commandes = liste_commandes,
- filtre='oui',titre = "Commandes",optionReturn="oui")
- Liste.affiche_liste()
- self.command_entry=Liste.entry
- # aide associée au panneau
- bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
- Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
- self.liste_command=Liste
- global panneauCommande
- panneauCommande=self
-
- def makeJDCPage(self,page):
- """
- Crée la page correspondant à un objet de type JDC
- """
- liste_commandes = (("<Enter>",self.selectCmd),
- ("<Leave>",self.deselectCmd),
- ("<Double-Button-1>",self.defCmdFirst))
- 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",optionReturn="oui")
- else:
- liste_commandes=liste_commandes+(("<Return>",self.defCmdFirst),)
- liste_groupes,dict_groupes=self.get_groups()
- Liste = ListeChoixParGroupes(self,page,liste_groupes,dict_groupes,
- liste_commandes = liste_commandes,
- filtre='oui',titre = "Commandes",optionReturn="oui")
- Liste.affiche_liste()
- # aide associée au panneau
- bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
- Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
- def makeReglesPage(self,page) :
- """
- Crée la page qui affiche la liste des règles avec celle qui ne sont
- pas respectées en rouge
- """
- regles = []
- regles = self.node.item.get_regles()
- dictionnaire = self.node.item.get_mc_presents()
- texte_regles = []
- l_regles_en_defaut=[]
- if len(regles) > 0:
- i = 0
- for regle in regles :
- texte_regles.append(regle.gettext())
- texte,test = regle.verif(dictionnaire)
- if test == 0 : l_regles_en_defaut.append(i)
- i = i+1
- Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
- Liste.affiche_liste()
- # aide associée au panneau
- bulle_aide="""Ce panneau contient la liste des règles qui s'appliquent à l'objet
- en cours d'édition.
- - en noir : règles valides
- - en rouge : règles violées"""
- Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
- def makeParamCommentPage_for_etape(self,page):
- """
- Crée la page qui offre le choix à l'utilisateur d'ajouter un commentaire
- ou un paramètre, avant ou après le noeud courant dans l'arbre.
- Cette page est destinée aux objets de niveau ETAPE cad à toutes les CMD,
- les commentaires inter commandes et les paramètres
- """
- # les frame ...
- self.frame_comment = Frame(page,bd=1,relief='raised')
- self.frame_param = Frame(page,bd=1,relief='raised')
- self.frame_boutons = Frame(page,bd=1,relief='raised')
- self.frame_comment.place(relx=0,rely=0,relwidth=1,relheight=0.40)
- self.frame_param.place(relx=0,rely=0.40,relwidth=1,relheight=0.40)
- self.frame_boutons.place(relx=0,rely=0.84,relwidth=1,relheight=0.16)
- # remplissage de la frame commentaire
- Label(self.frame_comment,text = "Insérer un commentaire :").place(relx=0.1,rely=0.5,anchor='w')
- but_comment_avant = Button(self.frame_comment,
- text = "AVANT "+self.node.item.get_nom(),
- command = lambda s=self :s.ajout_commentaire(ind = 'before'))
- but_comment_apres = Button(self.frame_comment,
- text = "APRES "+self.node.item.get_nom(),
- command = self.ajout_commentaire)
- but_comment_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
- but_comment_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
- # remplissage de la frame paramètre
- Label(self.frame_param,text = "Insérer un paramètre :").place(relx=0.1,rely=0.5,anchor='w')
- but_param_avant = Button(self.frame_param,
- text = "AVANT "+self.node.item.get_nom(),
- command = lambda s=self :s.ajout_parametre(ind = 'before'))
- but_param_apres = Button(self.frame_param,
- text = "APRES "+self.node.item.get_nom(),
- command = self.ajout_parametre)
- but_param_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
- but_param_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
- # remplissage de la frame boutons
- Button(self.frame_boutons,
- text="Commentariser toute la commande",
- command = self.comment_commande).place(relx=0.5,rely=0.5,anchor='center')
-
- def deselectMC(self,name):
- self.parent.appli.affiche_infos('')
-
- def get_groups(self):
- jdc=self.node.item.object.get_jdc_root()
- return jdc.get_groups()
-
- def get_liste_cmd(self):
- #print "get_liste_cmd",self.node.item.object
- jdc=self.node.item.object.get_jdc_root()
- listeCmd = jdc.get_liste_cmd()
- return listeCmd
-
- def deselectCmd(self,name):
- self.parent.appli.affiche_infos('')
-
- def execConcept(self):
- """
- Nomme le concept SD retourné par l'étape
- """
- if not hasattr(self,'valeur_choisie'):
- nom = self._any.get()
- else:
- nom = self.valeur_choisie.get()
- nom = string.strip(nom)
- if nom == '' : return # si pas de nom, on ressort sans rien faire ...
- if self.parent.modified == 'n' : self.parent.init_modif()
- test,mess = self.node.item.nomme_sd(nom)
- #self.node.verif()
- #self.node.racine.update()
- self.parent.appli.affiche_infos(mess)
-
- def changed(self):
- pass
-
- def comment_commande(self):
- """
- Cette méthode a pour but de commentariser la commande pointée par self.node
- """
- # On traite par une exception le cas où l'utilisateur final cherche à désactiver
- # (commentariser) un commentaire.
- try :
- pos=self.node.parent.children.index(self.node)
- commande_comment = self.node.item.get_objet_commentarise()
- # On signale au parent du panel (le JDCDisplay) une modification
- self.parent.init_modif()
- self.node.parent.children[pos].select()
- except Exception,e:
- traceback.print_exc()
- widgets.showerror("TOO BAD",str(e))
- return
-
-
-class Panel_Inactif(Panel):
- """
- Cette classe sert à définir un panneau dans lequel on dit que le noeud
- sélectionné n'est pas actif
- """
- def __init__(self,parent,panneau,node) :
- self.parent=parent
- self.panneau = panneau
- self.node=node
- Frame.__init__(self,self.panneau)
- self.place(x=0,y=0,relheight=1,relwidth=1)
- self.creer_texte()
-
- def creer_texte(self):
- texte = "Le noeud sélectionné ne correspond pas à un objet actif\n"
- texte = texte + "Seules les commandes placées entre \nDEBUT/POURSUITE et FIN sont actives"
- longueur = int(self.panneau.winfo_width()*0.8)
- self.label = Label(self,text=texte,wraplength=longueur,justify='center')
- self.label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
- self.bouton_sup = Button(self,
- text = "Supprimer",
- command=self.supprimer,
- width=14)
- self.bouton_sup.place(relx=0.5,rely=0.8,anchor='center')
-
-
-if __name__ == "__main__" : pass
+++ /dev/null
-# -*- coding: utf-8 -*-
-print "Import de panelsSalome"
-
-from Tkinter import *
-from widgets import ListeChoix
-from widgets import showerror
-
-from fonctionpanel import FONCTION_Panel
-from shellpanel import SHELLPanel
-from plusieursintopanel import PLUSIEURS_INTO_Panel
-from plusieursassdpanel import PLUSIEURS_ASSD_Panel
-from plusieursbasepanel import PLUSIEURS_BASE_Panel
-from plusieursbasepanel import PLUSIEURS_BASE_OR_UNELISTE_Panel
-from uniquesdcopanel import UNIQUE_SDCO_Panel
-from uniqueassdpanel import UNIQUE_ASSD_Panel
-from uniqueintopanel import UNIQUE_INTO_Panel
-from uniquecomppanel import UNIQUE_COMP_Panel
-from uniquebasepanel import UNIQUE_BASE_Panel
-from uniqueassdpanel import UNIQUE_ASSD_Panel_Reel
-
-from Noyau.N_CR import justify_text
-
-import traceback
-import salome # CS_pbruno à poubelliser
-import images
-
-
-
-# 2 types de commandes vont etre particularisees dans Salome
-#
-# - un cas general :
-# Toutes les commandes possedant GROUP_NO ou GROUP_MA
-# seront surchargees d office
-# pour cela on va utiliser le dictionnaire dict_classes_salome
-# qui va permettre de changer la classe de la commande
-# ainsi si un panel en dehors de salome a pour classe PLUSIEURS_BASE_Panel
-# la classe de ce panel devient alors SALOME_PLUSIEURS_BASE_Panel
-# (pour cela voir composimp)
-
-# des commandes "autres" ne pouvant pas etre identifiées par leur nom
-# il suffit de creer dans la classe SALOME de la commande
-# une fonction portant son nom
-# Exemple de particularisation d un panel :
-# Supposons que l on veuille particulariser la commande
-# - LIRE_MAILLAGE_UNITE
-# le panel initial a pour classe UNIQUE_BASE_Panel
-# il suffit d'ajouter dans la classe derivée SALOME_UNIQUE_BASE_Panel
-# une fonction SALOME_LIRE_MAILLAGE_UNITE
-# la classe de ce panel devient alors SALOME_UNIQUE_BASE_Panel
-# on peut surcharger les methodes nécessaires (affichage par exemple)
-
-
-class SALOME_SHELLPanel (SHELLPanel):
- ""
-
-class SALOME_FONCTION_Panel (FONCTION_Panel):
- ""
-
-class SALOME_PLUSIEURS_INTO_Panel (PLUSIEURS_INTO_Panel):
- ""
-
-class SALOME_PLUSIEURS_ASSD_Panel (PLUSIEURS_ASSD_Panel):
- ""
-
-class SALOME_UNIQUE_INTO_Panel (UNIQUE_INTO_Panel):
- ""
-
-class SALOME_UNIQUE_SDCO_Panel (UNIQUE_SDCO_Panel):
- ""
-
-class SALOME_UNIQUE_ASSD_Panel (UNIQUE_ASSD_Panel):
- ""
-
-class SALOME_UNIQUE_COMP_Panel (UNIQUE_COMP_Panel):
- ""
-
-class SALOME_UNIQUE_ASSD_Panel_Reel (UNIQUE_ASSD_Panel_Reel):
- ""
-
-# ------------------------------------------------------------------------------#
-# classe SALOME_PLUSIEURS_BASE_Panel
-#
-# Commandes modifiées :
-# - AFFE_CHAR_MECA_DDL_IMPO_GROUP_NO
-# Methodes surchargées :
-# - makeValeurPage(self,page)
-#
-# ------------------------------------------------------------------------------#
-
-class SALOME_PLUSIEURS_BASE_OR_UNELISTE_Panel(PLUSIEURS_BASE_OR_UNELISTE_Panel):
- ""
-
-class SALOME_PLUSIEURS_BASE_Panel(PLUSIEURS_BASE_Panel):
-
- def __init__(self,parent,panneau,node):
- PLUSIEURS_BASE_Panel.__init__( self, parent, panneau, node )
- #self.selected_valeur = None
-
- def add_valeur_plusieurs_base(self,name=None):
- try:
- valeur,validite,commentaire=self.get_valeur()
- if not valeur: # sélection dans salome
- strSelection = ''
-
- genea=self.node.item.get_genealogie()
- kwType = None
- for e in genea:
- if "GROUP_NO" in e:
- kwType = "GROUP_NO"
- if "GROUP_MA" in e:
- kwType = "GROUP_MA"
-
- selection, msg = self.parent.appli.selectGroupFromSalome(kwType)
- if selection:
- for oneSelection in selection:
- strSelection +=str( oneSelection )
- strSelection +=','
-
- strSelection = strSelection.rstrip(',')
- self.display_valeur( strSelection )
-
- PLUSIEURS_BASE_Panel.add_valeur_plusieurs_base( self, name )
- if msg:
- self.parent.appli.affiche_infos(msg)
- self.erase_valeur()
- except:
- print ' erreur add_valeur_plusieurs_base' #CS_pbruno : afficher boite de dialogue ici ?
-
- def makeValeurPage(self,page):
- """
- Crée la page de saisie d'une liste de valeurs à priori quelconques,
- cad qui ne sont pas à choisir dans une liste prédéfinie
- """
- PLUSIEURS_BASE_Panel.makeValeurPage(self,page)
- self.c = Button( self.frame_choix, text='Visualiser',command=self.displayInSalomeGeom )
- self.c.place( relx=0.3, rely=0.0,relwidth=0.55)
-
-
- def displayInSalomeGeom( self ):
- if self.selected_valeur:
- ok, msgError = self.parent.appli.displayShape( self.selected_valeur )
- if not ok:
- self.parent.appli.affiche_infos(msgError)
-
-
-
-
-# ------------------------------------------------------------------------------#
-# classe SALOME_UNIQUE_BASE_Panel
-#
-# Commandes modifiées :
-# - LIRE_MAILLAGE_UNITE
-# Methodes surchargées :
-# - makeValeurPage(self,page)
-#
-# ------------------------------------------------------------------------------#
-
-class SALOME_UNIQUE_BASE_Panel(UNIQUE_BASE_Panel):
-
-# ce dictionnaire va servir lors de la sortie d efficas
-# a creer le fichier qui sera integre au config.txt
-# pour relier une unite logique et un nom de fichier
-
- dict_fichier_unite={}
-
-
- def SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_N(self):
- entrychaine=salome.sg.getAllSelected()
- if entrychaine != '':
- self.entry2.delete(0,END)
- try:
- SO = salome.myStudy.FindObjectID(entrychaine[0])
- except:
- boo = 0
- SO = None
-
- FileName=''
- if SO != None:
- myBuilder = salome.myStudy.NewBuilder()
- boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeFileType")
- if boo:
- val=FileAttr.Value()
- if (val !="FICHIERMED" and val != "FICHIER_RESU_MED"):
- boo=0
- showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
- else:
- boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeExternalFileDef")
- if boo :
- FileName=FileAttr.Value()
- else:
- showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
- if FileName != '' :
- self.entry.delete(0,END)
- self.entry2.delete(0,END)
- self.entry.insert(0,FileName)
- self.entry2.insert(0,FileName)
- self.valid_valeur()
-
-
- def SALOME_DONNEES_HOMARD_TRAITEMENT_NOM_MED_MAILLAGE_N(self):
- EntryName=''
- entrychaine=salome.sg.getAllSelected()
- if entrychaine != '':
- self.entry2.delete(0,END)
- try:
- SO = salome.myStudy.FindObjectID(entrychaine[0])
- except:
- boo = 0
- SO = None
-
- if SO is not None:
- myBuilder = salome.myStudy.NewBuilder()
- ok, AtName = myBuilder.FindAttribute(SO,"AttributeName")
- if ok:
- EntryName=AtName.Value()
-
- if EntryName != '':
- self.entry.delete(0,END)
- self.entry2.delete(0,END)
- self.entry.insert(0,EntryName)
- self.entry2.insert(0,EntryName)
- self.valid_valeur()
-
- def SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_NP1(self):
- self.SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_N()
-
- def SALOME_DEFI_GROUP_CREA_GROUP_MA_GROUP_MA(self):
- #try:
- if ( 1 == 1 ) :
- selection, msg = self.parent.appli.selectGroupFromSalome()
- if selection:
- strSelection =str( selection )
- UNIQUE_BASE_Panel.valid_valeur(self,strSelection)
- if msg:
- self.parent.appli.affiche_infos(msg)
- self.erase_valeur()
- #except:
- else :
- print ' erreur '
-
-
- def redistribue_selon_simp(self):
- genea = self.node.item.get_genealogie()
- commande="SALOME"
- for i in range(0,len( genea )) :
- commande=commande+"_"+ genea[i]
- # --------------------------------------------------------------
- # on verifie que la methode n est pas particularise
- # sinon on appelle SALOME_DEFI_GROUP_CREA_GROUP_MA_GROUP_MA qui
- # sert comme methode par defaut
- # --------------------------------------------------------------
- try :
- SALOME_UNIQUE_BASE_Panel.__dict__[commande](self)
- except :
- SALOME_UNIQUE_BASE_Panel.SALOME_DEFI_GROUP_CREA_GROUP_MA_GROUP_MA(self)
-
-
-
- def makeValeurPage(self,page):
- """
- Crée la page de saisie d'une valeur à priori quelconque,
- cad qui ne sont pas à choisir dans une liste prédéfinie
- Ajout d'un bouton pour selectionner à partir de Salome
- """
- UNIQUE_BASE_Panel.makeValeurPage(self,page)
- self.b = Button(self.frame_valeur,text='Relier selection',command=self.redistribue_selon_simp)
- self.b.place(relx=0.28,rely=0.4,relwidth=0.4)
-
-#---------------------------------------------------------------------------------------
-# Correspondances entre les classes eficas et les classes salome_eficas
-#______________________________________________________________________________________
-dict_classes_salome = { SHELLPanel : SALOME_SHELLPanel,
- FONCTION_Panel : SALOME_FONCTION_Panel,
- PLUSIEURS_INTO_Panel : SALOME_PLUSIEURS_INTO_Panel,
- PLUSIEURS_ASSD_Panel : SALOME_PLUSIEURS_ASSD_Panel,
- PLUSIEURS_BASE_Panel : SALOME_PLUSIEURS_BASE_Panel,
- PLUSIEURS_BASE_OR_UNELISTE_Panel : SALOME_PLUSIEURS_BASE_OR_UNELISTE_Panel,
- UNIQUE_INTO_Panel : SALOME_UNIQUE_INTO_Panel,
- UNIQUE_SDCO_Panel : SALOME_UNIQUE_SDCO_Panel,
- UNIQUE_ASSD_Panel : SALOME_UNIQUE_ASSD_Panel,
- UNIQUE_ASSD_Panel_Reel : SALOME_UNIQUE_ASSD_Panel_Reel,
- UNIQUE_COMP_Panel : SALOME_UNIQUE_COMP_Panel,
- UNIQUE_BASE_Panel : SALOME_UNIQUE_BASE_Panel}
-
-dict_geom_numgroupe = { }
-dict_geom_numface = { }
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 modifications mineures du comportement
- du noyau ou de validation
-"""
-import string
-
-if __name__ == "__main__":
- import Noyau.N_CR
- print Noyau.N_CR.encadre_message(motif='!',
-texte="""- Il faut au moins un mot-clé parmi : ('DEBUT', 'POURSUITE')
-- Il faut au moins un mot-clé parmi : ('FIN',)
-- Il faut qu'au moins un objet de la liste : ('DEBUT', 'POURSUITE') soit suivi d'au moins un objet de la liste : ('FIN',)
-ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,yyyyyyyyyyyyyyyy
-""")
-
-
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from plusieurspanel import PLUSIEURS_Panel
-
-class PLUSIEURS_ASSD_Panel(PLUSIEURS_Panel):
- """
- Classe définissant le panel associé aux mots-clés qui demandent
- à l'utilisateur de donner une liste de valeurs qui ne sont pas
- à choisir dans une liste discrètes et qui sont de type dérivé d'ASSD
- """
- def makeValeurPage(self,page):
- """
- Génère la page de saisie de plusieurs noms de SD parmi un ensemble discret
- de SD possibles, cad d'un type cohérent avec les types attendus par le mot-clé simple
- """
- # On récupère la bulle d'aide du panneau, l'objet, l'aide, min et max (cardinalité de la liste),
- # la liste des valeurs déjà affectées à l'objet courant et la liste des SD du bon type
- bulle_aide=self.get_bulle_aide()
- self.ajout_valeurs=None
- objet_mc = self.node.item.get_definition()
- aide = self.get_aide()
- aide = justify_text(texte=aide)
- min,max = self.node.item.GetMinMax()
- l_valeurs = self.node.item.GetListeValeurs()
- l_choix=self.node.item.get_sd_avant_du_bon_type()
- l_choix.sort()
- # remplissage du panneau
- self.frame_valeurs = Frame(page)
- self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
- self.frame_boutons_fleches = Frame(page)
- self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
- self.frame_choix = Frame(page)
- self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
- self.frame_boutons = Frame(page)
- self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=0.5,relheight=0.1)
- liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
- ("<Button-3>",self.deselectValeur),
- ("<Double-Button-1>",self.sup_valeur_sans_into))
- liste_commandes_choix = (("<Button-1>",self.selectChoix),
- ("<Button-3>",self.deselectChoix),
- ("<Double-Button-1>",self.add_eval_valeur_sans_into))
- self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
- titre="Valeur(s) actuelle(s)")
- self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,liste_commandes = liste_commandes_choix,
- titre= "Valeurs possibles")
- self.bouton_add = Button(self.frame_boutons_fleches,
- image = images.get_image('arrow_left'),
- command = self.add_eval_valeur_sans_into)
- self.bouton_sup = Button(self.frame_boutons_fleches,
- image = images.get_image('arrow_right'),
- command = self.sup_valeur_sans_into)
- self.bouton_accepter = Button(self.frame_boutons,
- text='Valider',
- command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
- self.bouton_annuler = Button(self.frame_boutons,
- text = 'Annuler',
- command = self.annule_modifs_valeur)
- self.bouton_add.place(relx=0.3,rely=0.35)
- self.bouton_sup.place(relx=0.3,rely=0.65)
- for but in (self.bouton_accepter,self.bouton_annuler):
- but.pack(side='left',padx=4)
- self.Liste_valeurs.affiche_liste()
- if len(l_valeurs) > 0 :
- liste_marque=l_valeurs[-1]
- self.Liste_valeurs.surligne(liste_marque)
- self.Liste_choix.affiche_liste()
- for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
- fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
- def add_eval_valeur_sans_into(self,valeurentree=None):
- if valeurentree == None:
- valeurentree = self.get_valeur()
- valeur,validite=self.node.item.eval_valeur(valeurentree)
- if not validite :
- commentaire = "impossible d'évaluer : %s " %`valeurentree`
- self.parent.appli.affiche_infos(commentaire)
- return
- self.add_valeur_sans_into(valeur)
-
- def get_bulle_aide(self):
- """
- Retourne la bulle d'aide associée au panneau
- """
- return """Un clic sur une valeur des deux listes la sélectionne.
- - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
- dans la liste des valeurs que vous voulez affecter au mot-clé simple
- - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
- sélectionnée (elle apparaît alors à nouveau comme choix possible
- dans la liste des choix à droite)
- - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
- au mot-clé simple courant
- - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
- avant toute modification depuis le dernier 'Valider'"""
-
- def get_aide(self):
- """
- Retourne la phrase d'aide indiquant de quel type doivent être les
- valeurs que doit entrer l'utilisateur
- """
- commentaire=""
- mc = self.node.item.get_definition()
- type = mc.type[0].__name__
- if len(mc.type)>1 :
- for typ in mc.type[1:] :
- type = type + ' ou '+typ.__name__
- if mc.min == mc.max:
- commentaire="Une liste de "+`mc.min`+" objets de type "+type+" est attendue"
- else :
- commentaire="Une liste d'objets de type "+type+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
- aideval=self.node.item.aide()
- commentaire=commentaire +"\n"+ aideval
- return commentaire
-
-
- def sup_valeur(self,name=None):
- """
- Supprime la valeur selectionnée de la liste des valeurs et la rajoute
- à la liste des choix possibles
- """
- liste_valeurs = self.Liste_valeurs.get_liste()
- liste_valeurs.remove(self.selected_valeur)
- liste_choix = self.node.item.get_definition().into
- liste_choix = substract_list(liste_choix,liste_valeurs)
- self.Liste_valeurs.put_liste(liste_valeurs)
- self.Liste_choix.put_liste(liste_choix)
- self.selected_valeur = None
-
- def erase_valeur(self):
- pass
-
- def get_valeur(self):
- """
- Retourne la valeur sélectionnée dans la liste des choix
- """
- return self.selected_choix
-
- def display_valeur(self,val=None):
- """
- Affiche la valeur passée en argument dans l'entry de saisie.
- Par défaut affiche la valeur du mot-clé simple
- """
- # Il n'y a pas d'entry pour ce type de panneau
- return
-
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import showinfo
-from widgets import askopenfilename
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-from widgets import FenetreDeParametre
-
-from Noyau.N_CR import justify_text
-from Ihm.I_LASSD import LASSD
-from Extensions.parametre import PARAMETRE
-
-from utils import substract_list
-from plusieurspanel import PLUSIEURS_Panel
-from uniqueassdpanel import UNIQUE_ASSD_Panel
-
-import fontes
-import math
-
-class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
- """
- Classe définissant le panel associé aux mots-clés qui demandent
- à l'utilisateur de donner une liste de valeurs qui ne sont pas
- à choisir dans une liste discrètes et qui sont de type de base :
- entier, réel, string,...
- """
- def makeValeurPage(self,page):
- """
- Crée la page de saisie d'une liste de valeurs à priori quelconques,
- cad qui ne sont pas à choisir dans une liste prédéfinie
- """
- #print "Methode Utilisée par Salome"
- # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
- # et la liste des valeurs déjà affectées à l'objet courant
- bulle_aide=self.get_bulle_aide()
- objet_mc = self.node.item.get_definition()
- aide = self.get_aide()
- aide = justify_text(texte=aide)
- min,max = self.node.item.GetMinMax()
- l_valeurs = self.node.item.GetListeValeurs()
-
- # création des frames globales
- self.frame1 = Frame(page,relief='groove',bd=2)
- self.frame2 = Frame(page)
- self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
- self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
- self.frame_right = Frame(self.frame1)
- self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
-
- # création des frames internes
- self.frame_valeurs = Frame(self.frame1)
- self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
- self.frame_boutons_fleches = Frame(self.frame_right)
- self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
- self.frame_choix = Frame(self.frame_right)
- self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.8)
- self.frame_aide = Frame(self.frame_right)
- self.frame_aide.place(relx=0.1,rely=0.8,relwidth=0.8,relheight=0.2)
- self.frame_boutons = Frame(self.frame2)
- self.frame_boutons.place(relx=0.2,rely=0.,relwidth=1,relheight=1.)
- for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
- self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
- fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
- # création des objets dans les frames
- liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
- ("<Button-3>",self.deselectValeur),
- ("<Double-Button-1>",self.sup_valeur_sans_into))
- self.Liste_valeurs=ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
- titre="Valeur(s) actuelle(s)")
-
- # Création de l'entry ou de la liste des SD
- # PN : pour ajouter les validators
- self.label = Label(self.frame_choix,text="Valeur :")
- self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
- self.label.place(relx=0.05,rely=0.2)
-
- # Création d'un bouton "Importer ..." et d'un bouton "Paramatres" 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.4,relwidth=0.6)
- bouton_parametres = Button(self.frame_choix, text="Parametres", command=self.affiche_parametre)
- bouton_parametres.place(relx=0.28,rely=0.6,relwidth=0.6)
- self.ajout_valeurs = None
-
- # boutons Ajouter et Supprimer
- self.bouton_add = Button(self.frame_boutons_fleches,
- image = images.get_image('arrow_left'),
- command = self.add_valeur_plusieurs_base)
- self.bouton_sup = Button(self.frame_boutons_fleches,
- image = images.get_image('arrow_right'),
- command = self.sup_valeur_sans_into)
- self.bouton_add.place(relx=0.3,rely=0.35)
- self.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',
- 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()
- if len(l_valeurs) > 0 :
- liste_marque=l_valeurs[-1]
- self.Liste_valeurs.surligne(liste_marque)
- self.selectValeur(liste_marque)
- # boutons Accepter et Annuler
- self.bouton_accepter = Button(self.frame_boutons,
- text='Valider',
- command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
- self.bouton_annuler = Button(self.frame_boutons,
- text = 'Annuler',
- command = self.annule_modifs_valeur)
- self.bouton_accepter.place(relx=0.2, rely=0.2,relwidth=0.25)
- self.bouton_annuler.place(relx=0.5, rely=0.2,relwidth=0.25)
-
- def affiche_parametre(self) :
- if self.node.item.get_liste_param_possible() != [ ]:
- txtparam=""
- for param in self.node.item.get_liste_param_possible():
- txtparam=txtparam+repr(param)+"\n"
- if txtparam=="":
- showerror("Aucun parametre ","Pas de parametre de ce type")
- else :
- try :
- self.self.fenetreparam.destroy()
- except:
- pass
- self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
-
- def valid_valeur(self):
- self.add_valeur_plusieurs_base()
-
- def add_valeur_plusieurs_base(self,name=None):
- if name != None :
- valeur = name
- else:
- valeur,validite,commentaire=self.get_valeur()
- if not validite :
- self.parent.appli.affiche_infos(commentaire)
- return
-
- atraiter=[]
- if type(valeur) in (types.ListType,types.TupleType) :
- indice = 0
- while (indice < len(valeur)):
- v=valeur[indice]
- if self.node.item.wait_complex :
- if (v== 'RI' or v == 'MP'):
- try :
- t=tuple([v,valeur[indice+1],valeur[indice+2]])
- atraiter.append(t)
- indice=indice+3
- except :
- validite=0
- commentaire = "Veuillez entrer le complexe sous forme aster ou sous forme python"
- self.parent.appli.affiche_infos(commentaire)
- return
- else : # ce n'est pas un tuple à la mode aster
- atraiter.append(v)
- indice = indice + 1
- else: # on n'attend pas un complexe
- atraiter.append(v)
- indice=indice+1
- else:
- atraiter.append(valeur)
-
- for valeur in atraiter :
- encorevalide=self.node.item.valide_item(valeur)
- if encorevalide :
- listecourante=self.Liste_valeurs.get_liste()
- encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
- if not encorevalide : encorevalide = -1
- self.add_valeur_sans_into(valeur,encorevalide)
-
- def select_in_file(self):
- """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
- nom_fichier = askopenfilename(title="Choix fichier :")
-
- if not 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):
- """
- Retourne l'aide associée au panneau courant
- """
- return """Taper dans la boîte de saisie de droite la valeur que
- vous voulez affecter au mot-clé simple.
- - Cliquez sur la flèche gauche ou pressez <Return> pour la faire glisser
- dans la liste des valeurs que vous voulez affecter au mot-clé simple
- - Un clic sur une valeur de la liste la sélectionne
- - Un clic sur la flèche droite ou un double-clic retire la valeur
- sélectionnée de la liste
- - Cliquez sur 'Valider' pour que la nouvelle valeur désirée soit affectée
- au mot-clé simple
- - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
- depuis le dernier clic sur 'Valider'"""
-
- def get_aide(self):
- """
- Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
- que saisit l'utilisateur
- """
- commentaire=""
- mc = self.node.item.get_definition()
- d_aides = { 'TXM' : 'chaînes de caractères',
- 'R' : 'réels',
- 'I' : 'entiers',
- 'C' : 'complexes'}
- type = mc.type[0]
- if not d_aides.has_key(type) : return 'Type de base inconnu'
- if mc.min == mc.max:
- commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min` + " est attendue"
- else :
- commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
-
- aideval=self.node.item.aide()
- commentaire=commentaire +"\n"+aideval
- return commentaire
-
- def make_entry(self,frame,command,x=0.28,y=0.2):
- self.entry = Entry(frame,relief='sunken')
- self.entry.place(relx=0.28,rely=y,relwidth=0.6)
- self.entry.bind("<Return>",lambda e,c=command:c())
- self.entry.bind("<KP_Enter>",lambda e,c=command:c())
- self.entry.focus()
-
- def get_valeur(self):
- """
- Retourne la valeur saisie par l'utilisateur dans self.entry
- """
- commentaire = ""
- if hasattr(self,'entry'):
- # Traitement d'une entree unique
- valeurentree = self.entry.get()
- if (valeurentree == None or valeurentree ==""):
- return None,0,""
-
- #On tente une evaluation globale (ne fait pas de vérification de validité
- #seulement une transformation de la chaine en objet équivalent)
- valeur,validite=self.node.item.eval_valeur(valeurentree)
- if valeur == valeurentree:
- #L'evaluation n'a rien donné : on a toujours la string
- #on découpe la string sur le séparateur , si c'est possible
- if valeurentree.find(',') != -1:
- valeur=[]
- for v in valeurentree.split(','):
- vsimple,validite=self.node.item.eval_valeur(v)
- valeur.append(vsimple)
-
- return valeur,validite,commentaire
-
-
- # if (valeurentree[0] != "(") and (valeurentree.find(',') < len(valeurentree)):
- # valeurs=[]
- # for v in valeurentree.split(','):
- # vsimple,validite=self.node.item.eval_valeur(v)
- # Pn If ajoute pour le panneau "double"
- #if isinstance(vsimple,LASSD) :
- # commentaire = "impossible de mélanger reels et liste prédéfinie"
- # validite = 0
- # break
- # if validite :
- # valeurs.append(vsimple)
- # else:
- # commentaire = "impossible d'évaluer : %s " %`valeurentree`
- # break
- # valeur=valeurs
- # else:
- # valeur,validite=self.node.item.eval_valeur(valeurentree)
- # if not validite and commentaire == "":
- # commentaire = "impossible d'évaluer : %s " %`valeurentree`
- # return valeur,validite,commentaire
- #else:
- # # Traitement d'une entree de type complexe
- # try:
- # valeur= (self.typ_cplx.get(),
- # string.atof(self.entry1.get()),
- # string.atof(self.entry2.get()))
- # return valeur,1,""
- # except:
- # #traceback.print_exc()
- # return None,0,"impossible d'évaluer la valeur d'entree"
-
- def erase_valeur(self):
- """
- Efface la valeur donnée par l'utilisateur dans l'entry
- """
- if hasattr(self,'entry'):
- self.entry.delete(0,END)
- else:
- self.typ_cplx.set('RI')
- self.entry1.delete(0,END)
- self.entry2.delete(0,END)
-
-
- def display_valeur(self,val=None):
- """
- Affiche la valeur passée en argument dans l'entry de saisie.
- Par défaut affiche la valeur du mot-clé simple
- """
- if not val :
- valeur = self.node.item.object.getval()
- else:
- valeur = val
- if not valeur : return
-
- if hasattr(self,'entry'):
- # Traitement d'une entree unique
- self.entry.delete(0,END)
- self.entry.insert(0,str(valeur))
- else:
- # Traitement d'une entree de type complexe
- typ_cplx,x1,x2=valeur
- self.entry1.delete(0,END)
- self.entry2.delete(0,END)
- self.typ_cplx.set(typ_cplx)
- self.entry1.setentry(x1)
- self.entry2.setentry(x2)
-
-class PLUSIEURS_BASE_OR_UNELISTE_Panel(PLUSIEURS_BASE_Panel,UNIQUE_ASSD_Panel):
-
- def makeValeurPage(self,page):
- """
- Crée la page de saisie d'une liste de valeurs à priori quelconques,
- cad qui ne sont pas à choisir dans une liste prédéfinie
- """
- # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
- # et la liste des valeurs déjà affectées à l'objet courant
- bulle_aide=self.get_bulle_aide()
- objet_mc = self.node.item.get_definition()
- aide = self.get_aide()
- aide = justify_text(texte=aide)
- aide2 = self.get_aide2()
- aide2 = justify_text(texte=aide2)
- min,max = self.node.item.GetMinMax()
- l_valeurs = self.node.item.GetListeValeurs()
- for i in l_valeurs:
- if isinstance(i,LASSD) :
- affiche_entry=l_valeurs
- l_valeurs=()
-
- # Il faut traiter ici pour avoir le choix entre une liste
- # deja constituee (listr8aster) ou manuelle
-
- # création des frames globales
- self.frame1 = Frame(page,relief='groove',bd=2)
- self.frame2 = Frame(page)
- self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.9)
- self.frame2.place(relx=0.,rely=0.9,relwidth=1,relheight=0.1)
-
- # création des frames internes dans frame1
- self.frame_valeurs = Frame(self.frame1)
- self.frame_valeurs.place(relx=0.02,rely=0.55,relwidth=0.35,relheight=0.45)
- self.frame_haut = Frame(self.frame1)
- self.frame_haut.place(relx=0.02,rely=0.02,relwidth=0.98,relheight=0.45)
- self.frame_bas = Frame(self.frame1)
- self.frame_bas.place(relx=0.37,rely=0.55,relwidth=0.63,relheight=0.45)
-
- # création des frames internes dans frame_right
- self.frame_fleches = Frame(self.frame_bas)
- self.frame_fleches.place(relx=0.,rely=0.4,relwidth=0.2,relheight=0.5)
- self.frame_choix = Frame(self.frame_bas)
- self.frame_choix.place(relx=0.2,rely=0.1,relwidth=0.75,relheight=1)
-
- # affichage de l'aide
- self.aide = Label(self.frame_haut, text = aide, justify='center', anchor='center',)
- self.aide.place(relx=0.72,rely=0.25,anchor='center',relwidth=1)
- self.aide2 = Label(self.frame2, text = aide2,)
- self.aide2.place(relx=0.4,rely=0.01,relwidth=0.6)
-
- # Création d'un bouton "Importer ..." et d'un bouton "Parametres" 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.0,relwidth=0.6)
- bouton_parametres = Button(self.frame_choix, text="Parametres", command=self.affiche_parametre)
- bouton_parametres.place(relx=0.28,rely=0.25,relwidth=0.6)
- self.ajout_valeurs = None
-
-
- # Création de la liste des SD
- liste_noms_sd = self.node.item.get_sd_avant_du_bon_type_pour_type_de_base()
- liste_noms_sd = self.tri(liste_noms_sd)
- self.listbox = Pmw.ScrolledListBox(self.frame_haut,
- items=liste_noms_sd,
- labelpos='n',
- #label_text="Structures de données du type\n requis parl'objet courant :",
- label_text="Listes du type\n requis parl'objet courant :",
- listbox_height = 6,
- dblclickcommand=lambda s=self,c=UNIQUE_ASSD_Panel.valid_valeur : s.choose_valeur_from_list(c))
- self.listbox.place(relx=0.00,rely=0.00,relwidth=0.4)
-
- # On eneleve le label pour gagner de la place
- #self.label = Label(self.frame_choix,text="Valeur :")
- #self.label.place(relx=0.05,rely=0.85)
- self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base,x=0.28,y=0.55)
-
- # boutons Ajouter et Supprimer
- bouton_add = Button(self.frame_fleches, image = images.get_image('arrow_left'),
- command = self.add_valeur_plusieurs_base)
- bouton_sup = Button(self.frame_fleches, image = images.get_image('arrow_right'),
- command = self.sup_valeur_sans_into)
- bouton_add.place(relx=0.2,rely=0.25)
- bouton_sup.place(relx=0.2,rely=0.70)
-
-
- # boutons Accepter et Annuler dans frame2
- bouton_accepter = Button(self.frame2, text='Valider',
- command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
- bouton_annuler = Button(self.frame2, text = 'Annuler',
- command = self.annule_modifs_valeur)
- for but in (bouton_accepter,bouton_annuler):
- but.pack(side='left',padx=5)
-
- # création des objets dans les frames
- liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
- ("<Button-3>",self.deselectValeur),
- ("<Double-Button-1>",self.sup_valeur_sans_into))
- self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,
- liste_commandes = liste_commandes_valeurs,
- titre="Valeur(s) non-prédéfinies(s)",
- fonte_titre=None
- )
-
- for fram in (self.frame1,self.frame2,self.frame_bas,self.frame_haut,self.frame_valeurs,
- self.frame_fleches,self.frame_choix):
- fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide: s.parent.appli.affiche_aide(e,a))
- fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
- self.Liste_valeurs.affiche_liste()
- if len(l_valeurs) > 0 :
- liste_marque=l_valeurs[-1]
- self.Liste_valeurs.surligne(liste_marque)
-
- def get_aide(self):
- """
- Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
- saisies par l'utilisateur
- """
- commentaire="Ce motclef accepte soit un nom de liste déja définie soit une liste manuelle de valeurs"
- return commentaire
-
- def get_aide2(self):
- min,max = self.node.item.GetMinMax()
- aideval=self.node.item.aide()
- commentaire="min : " + str(min) + ", max : " + str(max)
- aideval=commentaire + aideval
- return aideval
-
- def choose_valeur_from_list(self,command):
- """
- Affecte à valeur choisie la sélection courante dans la liste des choix proposés
- Exécute command
- """
- self.Liste_valeurs.liste=[]
- self.Liste_valeurs.affiche_liste()
- if len(self.listbox.get()) == 0 : return
- choix = self.listbox.getcurselection()[0]
- d={}
- d["valeurentree"]=choix
- apply(command,(self,),d)
-
-
-
- def tri(self,liste_noms_sd):
- a=(3+8j)
- d_types = { 'TXM' : type('A'),
- 'R' : type(3.),
- 'I' : type(0),
- 'C' : type(a)}
-
- # On enleve seulement ceux qu'on peut
- # Sur certaines listes, il est possible qu'on ne
- # sache pas déterminer le type
- listefinale=[]
- typespossibles=self.node.item.object.definition.type
- typecherche = None
- for t in typespossibles:
- if t in d_types.keys() :
- typecherche = d_types[t]
- break
- for liste in liste_noms_sd:
- valeur,validite=self.node.item.eval_valeur(liste)
- for mc in valeur.etape.mc_liste :
- try :
- if type(mc.valeur) in (types.ListType,types.TupleType) :
- typeliste=type(mc.valeur[0])
- else :
- typeliste=type(mc.valeur)
- if type(mc.valeur[0]) == typecherche:
- listefinale.append(liste)
- except:
- listefinale.append(liste)
- return listefinale
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from plusieurspanel import PLUSIEURS_Panel
-
-class PLUSIEURS_INTO_Panel(PLUSIEURS_Panel):
- """
- Classe servant à définir le panneau permettant d'afficher et de saisir une
- liste de valeurs à choisir parmi une liste discrètes de valeurs possibles
- """
- def makeValeurPage(self,page):
- """
- Génère la page de saisie de plusieurs valeurs parmi un ensemble discret
- de possibles
- """
- 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
- aide = self.get_aide()
- aide = justify_text(texte=aide)
- bulle_aide=self.get_bulle_aide()
- objet_mc = self.node.item.get_definition()
- min,max = self.node.item.GetMinMax()
- #l_choix=list(objet_mc.into)
- l_valeurs = self.node.item.GetListeValeurs()
- l_choix= self.node.item.get_liste_possible(l_valeurs)
- # reinitialisation de l_valeurs
- l_valeurs = self.node.item.GetListeValeurs()
-
- # remplissage du panneau
- self.frame_valeurs = Frame(page)
- self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
- self.frame_boutons_fleches = Frame(page)
- self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
- self.frame_choix = Frame(page)
- self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
- self.frame_boutons = Frame(page)
- self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=1,relheight=0.1)
- self.frame_aide = Frame(page)
- self.frame_aide.place(relx=0.1,rely=0.75,relwidth=1,relheight=0.15)
- liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
- ("<Button-3>",self.deselectValeur),
- ("<Double-Button-1>",self.sup_valeur))
- liste_commandes_choix = (("<Button-1>",self.selectChoix),
- ("<Button-3>",self.deselectChoix),
- ("<Double-Button-1>",self.add_choix))
- self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,
- l_valeurs,liste_commandes = liste_commandes_valeurs,
- titre="Valeur(s) actuelle(s)")
- self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,
- liste_commandes = liste_commandes_choix,
- titre= "Valeurs possibles")
- self.bouton_add = Button(self.frame_boutons_fleches,
- #text="<--",
- image = images.get_image('arrow_left'),
- command = self.add_choix)
- self.bouton_sup = Button(self.frame_boutons_fleches,
- #text="-->",
- image = images.get_image('arrow_right'),
- command = self.sup_valeur)
- self.bouton_accepter = Button(self.frame_boutons,
- text='Valider',
- command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
- self.bouton_annuler = Button(self.frame_boutons,
- text = 'Annuler',
- command = self.annule_modifs_valeur)
- self.bouton_add.place(relx=0.3,rely=0.35)
- self.bouton_sup.place(relx=0.3,rely=0.65)
- for but in (self.bouton_accepter,self.bouton_annuler):
- but.pack(side='left',padx=3)
- self.Liste_valeurs.affiche_liste()
- if len(l_valeurs) > 0 :
- liste_marque=l_valeurs[-1]
- self.Liste_valeurs.surligne(liste_marque)
- self.selectValeur(l_valeurs[-1])
- self.Liste_choix.affiche_liste()
- for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
- fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
- self.frame_aide.update()
- self.aide = Label(self.frame_aide,
- text = aide,
- justify='center',
- anchor='center')
- #wraplength=int(self.frame_aide.winfo_width()*0.8))
- self.aide.place(relx=0.3,rely=0.5,anchor='center',relwidth=1)
-
- def get_aide(self):
- """
- Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
- que saisit l'utilisateur
- """
- commentaire=""
- mc = self.node.item.get_definition()
- d_aides = { 'TXM' : 'chaînes de caractères',
- 'R' : 'réels',
- 'I' : 'entiers',
- 'C' : 'complexes'}
- type = mc.type[0]
- if not d_aides.has_key(type) :
- if mc.min == mc.max:
- return str(mc.min)+" valeur(s) est(sont) attendue(s)"
- else :
- return "entrez entre "+str(mc.min)+" et "+str(mc.max)+" valeurs"
- if mc.min == mc.max:
- commentaire="Une liste de "+str(mc.min)+" "+d_aides[type]+" est attendue"
- else :
- commentaire="Entre "+str(mc.min)+" et "+str(mc.max)+" valeurs de type "+d_aides[type]+" sont attendues"
- aideval=self.node.item.aide()
- commentaire=commentaire + "\n" + aideval
- return commentaire
-
- def get_bulle_aide(self):
- """
- Retourne la bulle d'aide du panneau (affichée par clic droit)
- """
- return """Un clic sur une valeur des deux listes la sélectionne.
- - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
- dans la liste des valeurs que vous voulez affecter au mot-clé simple
- - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
- sélectionnée (elle apparaît alors à nouveau comme choix possible
- dans la liste des choix à droite)
- - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
- au mot-clé simple courant
- - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
- avant toute modification depuis le dernier 'Valider'"""
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from newsimppanel import newSIMPPanel
-
-
-class PLUSIEURS_Panel(newSIMPPanel):
- """
- Classe virtuelle servant de classe mère à toutes celles définissant
- un panneau pour un mot-clé simple qui attend une liste de valeurs
- """
- def accepte_modifs_valeur(self,min,max,liste=None):
- """
- Méthode qui récupère la liste des valeurs donnée par l'utilisateur
- et l'affecte au mot-clé courant.
- le parametre None n'est pas rempli sauf par l appel a partir de fonctionpanel
- """
- if liste==None:
- l1_valeurs = self.Liste_valeurs.get_liste()
- else:
- l1_valeurs = liste
-
- #nettoyage de la liste
- l_valeurs=[]
- for val in l1_valeurs :
- if val != '' and val != None :
- l_valeurs.append(val)
-
- longueur = len(l_valeurs)
- if longueur < min or longueur > max :
- self.parent.appli.affiche_infos("Valeur refusée : nombre d'éléments incorrect dans la liste")
- return
- if longueur > 1:
- valeur = tuple(l_valeurs)
- elif longueur == 1:
- valeur = l_valeurs[0]
- else:
- valeur = None
-
- self.parent.appli.affiche_infos("Valeur acceptée")
- self.record_valeur(valeur)
- # 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
- if self.ajout_valeurs:
- self.ajout_valeurs.quit()
-
- def add_valeur_sans_into(self,name=None,encorevalide=1):
- """
- Tente d'ajouter la valeur fournie (name) à la liste courante :
- - si la valeur est acceptable, elle est ajoutée dans la liste des valeurs
- - sinon elle est refusée
-
- encorevalide peut prendre les valeurs suivantes :
-
- - valeur 1 si le validateur trouve l item et la liste correctes
- - valeur 0 si le validateur trouve la valeur de l item incorrecte
- - valeur -1 si le validateur trouve la liste incorrecte
- """
- valeur = name
- commentaire="Valeur incorrecte : ajout à la liste refusé"
- testvalide=1
-
- # Pas de traitement des valeurs nulles ( a priori clic involontaire
- if (valeur == None or valeur =="") :
- commentaire = "Pas de saisie des valeurs nulles"
- encorevalide = -2
- testtype=0
- else :
- testtype,comment = self.node.item.object.verif_type(valeur)
- if not testtype :
- commentaire =comment
- encorevalide=-2
-
- if (encorevalide ==0) :
- commentaire=self.node.item.info_erreur_item()
- if (encorevalide == -1) :
- commentaire=self.node.item.info_erreur_liste()
- # On traite le cas ou la liste n est pas valide pour un pb de cardinalite
- min,max = self.node.item.GetMinMax()
- if len(self.Liste_valeurs.get_liste()) >= max :
- commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
-
- if testvalide and (encorevalide == 1):
- min,max = self.node.item.GetMinMax()
-
- if testtype :
- liste_valeurs = self.Liste_valeurs.get_liste()
- if len(liste_valeurs) >= max :
- commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
- else :
- if (self.Liste_valeurs.selection != None):
- ligne=self.Liste_valeurs.cherche_selected_item()
- liste_valeurs.insert(ligne,valeur)
- else :
- liste_valeurs.append(valeur)
- try :
- self.set_valeur_texte(str(self.entry.get()))
- except :
- pass
- self.Liste_valeurs.put_liste(liste_valeurs)
- self.erase_valeur()
- commentaire="Nouvelle valeur acceptée"
- else :
- commentaire ="Type de la valeur incorrecte"
-
- self.parent.appli.affiche_infos(commentaire)
-
- def sup_valeur_sans_into(self,name=None):
- """
- Méthode qui sert à retirer de la liste des valeurs la valeur sélectionnée
- """
- try:
- self.Liste_valeurs.remove_selected_item()
- self.display_valeur(self.selected_valeur)
- self.selected_valeur = None
- except:
- # la valeur sélectionnée n'est pas dans la liste
- return
-
- def display_valeur(self,val=None):
- """
- Affiche la valeur passée en argument dans l'entry de saisie.
- Par défaut affiche la valeur du mot-clé simple
- """
- if not val :
- #valeur = self.node.item.getval()
- valeur = self.node.item.object.getval()
- else:
- valeur = val
- self.entry.delete(0,END)
- if not valeur : return
- self.entry.insert(0,str(valeur))
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-import Pmw
-
-# Modules Eficas
-import prefs
-import splash
-import fontes
-import analyse_catalogue
-from Noyau.N_CR import CR
-from widgets import showinfo,showerror
-from widgets import Fenetre
-from utils import init_rep_cata_dev
-
-#import catabrowser
-import autre_analyse_cata
-import uiinfo
-import re
-
-class READERCATA:
-
- menu_defs=[
- ('Catalogue',[
- ("Rapport de validation catalogue",'visuCRCATA'),
- ]
- )
- ]
-
- button_defs=[]
-
- def __init__(self,appli,parent):
- self.appli=appli
- self.parent=parent
- self.code=self.appli.code
- self.appli.format_fichier.set('python')
- self.version_code=self.appli.version_code
- self.fic_cata=None
- self.OpenCata()
- self.cataitem=None
-
- def OpenCata(self):
- """
- Ouvre le catalogue standard du code courant, cad le catalogue présent
- dans le répertoire Cata
- """
- message1 = "Compilation des fichiers Eficas \n\n Veuillez patienter ..."
- if self.appli.test == 0 :
- splash._splash.configure(text = message1)
- self.configure_barre(4)
-
- liste_cata_possibles=[]
- for catalogue in self.appli.CONFIGURATION.catalogues:
- if catalogue[0] == self.code :
- liste_cata_possibles.append(catalogue)
-
- if len(liste_cata_possibles)==0:
- showerror("Import du catalogue","Pas de catalogue defini pour le code %s" % self.code)
- self.appli.quit()
- sys.exit(1)
-
- if self.version_code is not None:
- # La version a ete fixee
- for cata in liste_cata_possibles:
- if self.version_code == cata[1]:
- self.fic_cata = cata[2]
- self.appli.format_fichier.set(cata[3])
- elif len(liste_cata_possibles)==1:
- self.fic_cata = liste_cata_possibles[0][2]
- self.code = self.appli.CONFIGURATION.catalogues[0][0]
- self.version_code = liste_cata_possibles[0][1]
- self.appli.format_fichier.set(liste_cata_possibles[0][3])
- else:
- # plusieurs catalogues sont disponibles : il faut demander à l'utilisateur
- # lequel il veut utiliser ...
- self.ask_choix_catalogue()
-
- if self.fic_cata == None :
- print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
- sys.exit(0)
-
- # Determinination du repertoire materiau
- v_codeSansPoint=self.version_code
- v_codeSansPoint=re.sub("\.","",v_codeSansPoint)
- chaine="rep_mat_"+v_codeSansPoint
- if hasattr(self.appli.CONFIGURATION,chaine):
- a=getattr(self.appli.CONFIGURATION,chaine)
- else :
- try :
- a=self.appli.CONFIGURATION.dRepMat[self.version_code]
- except :
- print "Probleme avec le repertoire materiau"
- a='.'
- self.appli.CONFIGURATION.rep_mat=a
-
- # 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'
-
- #if self.appli.test == 0 :
- # splash._splash.configure(text = "Debut compil cata: %d s" % time.clock())
- # compilation éventuelle du catalogue
- #test = self.compile_cata(self.fic_cata,self.fic_cata_c)
- #self.update_barre()
- #if self.appli.test == 0 :
- # splash._splash.configure(text = "Fin compil cata: %d s" % time.clock())
- #if not test : showerror("Compilation catalogue","Impossible de compiler le catalogue %s" %self.fic_cata)
-
- # import du catalogue
- if self.appli.test == 0 :
- splash._splash.configure(text = "Debut import_cata: %d s" % time.clock())
- self.cata = self.import_cata(self.fic_cata)
- self.update_barre()
- if self.appli.test == 0 :
- splash._splash.configure(text = "Fin import_cata: %d s" % time.clock())
- if not self.cata :
- showerror("Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
- self.appli.quit()
- sys.exit(1)
- #
- # analyse du catalogue (ordre des mots-clés)
- #
- if self.appli.test == 0 :
- splash._splash.configure(text = "Debut Retrouve_Ordre: %d s" % 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()
- self.update_barre()
- if self.appli.test == 0 :
- splash._splash.configure(text = "Fin Retrouve_Ordre: %d s" % time.clock())
- #
- # analyse des données liées à l'IHM : UIinfo
- #
- uiinfo.traite_UIinfo(self.cata)
- self.update_barre()
-
- #
- # traitement des clefs documentaires
- #
- self.traite_clefs_documentaires()
-
- # 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')
- if os.path.isfile(fic_cata_dev):
- # il y a bien un catalogue développeur : il faut récupérer le module_object associé ...
- test = self.compile_cata(fic_cata_dev,fic_cata_dev+'c')
- if not test :
- showinfo("Compilation catalogue développeur",
- "Erreur dans la compilation du catalogue développeur")
- self.cata = (self.cata,)
- else:
- self.cata_dev =self.import_cata(fic_cata_dev)
- #self.Retrouve_Ordre_Cata_Developpeur()
- self.Retrouve_Ordre_Cata_Developpeur_autre()
- self.cata = (self.cata,self.cata_dev)
- else:
- self.cata = (self.cata,)
- else:
- self.cata = (self.cata,)
- titreSuite=" avec le catalogue " + os.path.basename(self.fic_cata)
- titre=self.appli.titre+titreSuite
- if self.appli.top:
- self.appli.top.title(titre)
- self.appli.titre=titre
-
-
- def import_cata(self,cata):
- """
- Réalise l'import du catalogue dont le chemin d'accès est donné par cata
- """
- if self.appli.test == 0 :
- splash._splash.configure(text = "Chargement du catalogue")
- nom_cata = os.path.splitext(os.path.basename(cata))[0]
- rep_cata = os.path.dirname(cata)
- sys.path[:0] = [rep_cata]
- try :
- o=__import__(nom_cata)
- return o
- except Exception,e:
- 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,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
-
- def Retrouve_Ordre_Cata_Standard(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
- """
- time1 = os.path.getmtime(self.fic_cata)
- try :
- time2 = os.path.getmtime(self.fic_cata_p)
- except:
- time2 = 0
- if time2 > time1 :
- # l'objet catalogue n'a pas été modifié depuis le dernier "pickle"
- self.Get_Ordre_Cata()
- else :
- # le catalogue a été modifié depuis le dernier "pickle" :
- # il faut retrouver l'ordre du catalogue et refaire pickle
- 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
- if self.appli.test == 0 :
- 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
- if self.appli.test == 0 :
- splash._splash.configure(text = message,barre='oui')
- cata_dev_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
- 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 :
- - mode='pickle ': tente de relire le fichier pickle et sinon lance l'analyse du catalogue
- - mode='cata' : force l'analyse du catalogue directement sans relire le pickle
- """
- if mode == 'pickle' :
- try:
- f = open(self.fic_cata_p)
- u = cPickle.Unpickler(f)
- if self.appli.test == 0 :
- splash._splash.configure(text = "Analyse du catalogue")
- self.cata_ordonne_dico = u.load()
- f.close()
- except :
- # on peut ne pas arriver à relire le fichier pickle s'il a été altéré
- # ou (le plus probable) s'il a été créé sous un autre OS
- self.Get_Ordre_Cata(mode='cata')
- elif mode == 'cata':
- if self.appli.test == 0 :
- 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.entites
- splash._splash.configure(text = "Sauvegarde des informations sur le catalogue")
- f = open(self.fic_cata_p,'w+')
- p = cPickle.Pickler(f)
- p.dump(self.cata_ordonne_dico)
- f.close()
- else :
- raise Exception("Appel à un mode inconnu de Get_Ordre_Cata : %s" % mode)
- return
-
- def ask_choix_catalogue(self):
- """
- Ouvre une fenêtre de sélection du catalogue dans le cas où plusieurs
- ont été définis dans Accas/editeur.ini
- """
- # construction du dictionnaire et de la liste des catalogues
- self.dico_catalogues = {}
- defaut = None
- for catalogue in self.appli.CONFIGURATION.catalogues:
- if catalogue[0] == self.code :
- self.dico_catalogues[catalogue[1]] = catalogue
- if len(catalogue) == 5 :
- if catalogue[4]=='defaut' : defaut = catalogue[1]
- liste_choix = self.dico_catalogues.keys()
- liste_choix.sort()
- # test si plusieurs catalogues ou non
- if len(liste_choix) == 0:
- showerror("Aucun catalogue déclaré pour %s" %self.code)
- self.appli.quit()
- sys.exit(1)
- elif len(liste_choix) == 1:
- self.fic_cata = self.dico_catalogues[liste_choix[0]][2]
- self.version_code = liste_choix[0]
- return
- # création d'une boîte de dialogue modale
- self.fenetre_choix_cata = Pmw.Dialog(splash._splash, #avec self.parent, ne marche pas sous Windows
- buttons=('OK','ANNULER'),
- defaultbutton = 'OK',
- title = "Choix d'une version du code %s" %self.code,
- command = self.chooseCata)
- # construction des radioboutons
- label = `len(liste_choix)`+' versions du code %s sont disponibles\n' %self.code
- label = label + 'Veuillez choisir celle avec laquelle vous souhaitez travailler :'
- self.radiobutton = Pmw.RadioSelect(self.fenetre_choix_cata.interior(),
- buttontype='radiobutton',
- labelpos = 'w',
- label_text = label,
- label_font = fontes.standard,
- orient='vertical')
- for choix in liste_choix :
- self.radiobutton.add(choix)
- if defaut == None :
- # aucun catalogue par défaut n'a été spécifié dans Accas/editeur.ini
- defaut = liste_choix[0]
- self.radiobutton.invoke(defaut)
- self.radiobutton.pack(fill='x',padx=10,pady=10)
- # centrage de la fenêtre
- self.fenetre_choix_cata.activate(geometry='centerscreenalways')
-
- def chooseCata(self,txt):
- """
- Méthode activée lorsque l'utilisateur a fait son choix et cliqué sur 'OK' ou sur 'ANNULER'
- """
- if txt == 'OK' :
- version_cata = self.radiobutton.getcurselection()
- self.fic_cata = self.dico_catalogues[version_cata][2]
- self.version_code = version_cata
- self.appli.format_fichier.set(self.dico_catalogues[version_cata][3])
- self.fenetre_choix_cata.destroy()
- else:
- self.parent.destroy()
-
- def compile_cata(self,cata,catac):
- """
- Teste si le catalogue a bien besoin d'être recompilé et si oui, le compile et
- affiche un message dans le splash . Retourne 1 si la compilation s'est bien déroulée,
- 0 sinon.
- """
- time1 = os.path.getmtime(cata)
- try:
- time2 = os.path.getmtime(catac)
- except:
- time2 = 0
- if time1 > time2:
- try:
- # le catalogue doit être recompilé avant d'être importé
- if self.appli.test == 0 :
- splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
- py_compile.compile(cata)
- except:
- return 0
- return 1
-
-
-#--------------------------------------------------------------------------------
-# Méthodes concernant la barre de progression lors de l'analyse du catalogue
-#--------------------------------------------------------------------------------
-
- def configure_barre(self,nbcommandes):
- """ Configure la barre de progression en lui passant comme paramètre le
- nombre de commandes du catalogue qui lui sert à déterminer la longueur de son incrément """
- try:
- if self.appli.test == 0 :
- splash._splash.configure(barre='oui',ratio = nbcommandes)
- except:
- pass
-
- def update_barre(self):
- """ Update la position de la barre de progression : la fait progresser de son incrément """
- try:
- if self.appli.test == 0 :
- splash._splash.update_barre()
- except:
- pass
-
- def visuCRCATA(self):
- """
- Méthode permettant l'affichage du rapport de validation
- """
- cr = CR( debut = "Début rapport de validation du catalogue",
- fin = "Fin rapport de validation du catalogue")
- titre="rapport de validation du catalogue"
- if hasattr(self,'cata_ordonne_cr') :
- cr.add(self.cata_ordonne_cr)
- if hasattr(self,'cata_dev_ordonne_cr') :
- cr.add(self.cata_dev_ordonne_cr)
- for cata in self.cata:
- if hasattr(cata,'JdC'):
- cr.add(cata.JdC.report())
- texte_cr = str(cr)
- self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
-
-
- def traite_clefs_documentaires(self):
- try:
- self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
- f=open(self.fic_cata_clef)
- except:
- #print "Pas de fichier associé contenant des clefs documentaires"
- return
-
- dict_clef_docu={}
- for l in f.readlines():
- clef=l.split(':')[0]
- docu=l.split(':')[1]
- docu=docu[0:-1]
- dict_clef_docu[clef]=docu
- for oper in self.cata.JdC.commandes:
- if dict_clef_docu.has_key(oper.nom):
- oper.docu=dict_clef_docu[oper.nom]
import os,traceback
import ConfigParser
-import prefs
import re
+from Aster import prefs
# Les valeurs decodees par optparse sont mises dans un objet dictionnaire-like.
# On l'utilise comme environnement de session.
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-#import prefs
-#import panels
-#import images
-#from widgets import ListeChoix
-#from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-from newsimppanel import newSIMPPanel
-
-
-class SHELLPanel(newSIMPPanel):
- """
- Classe Panel utilisé pour les mots-clés simples qui attendent un shell pour valeur
- """
-
- def makeValeurPage(self,page):
- """
- Affiche la page concernant l'objet pointé par self qui attend un shell
- """
- objet_mc = self.node.item.get_definition()
- aide = self.gen_aide()
- aide = justify_text(texte=aide)
- self.frame = Frame(page)
- self.frame.place(relx=0,rely=0,relwidth=1,relheight=1)
- label_aide = Label(self.frame,text = aide)
- label_aide.place(relx=0.5,rely=0.1,anchor='center')
- self.text = Text(self.frame,bg='gray95')
- self.text.place(relx=0.2,rely=0.2,relwidth=0.6,relheight=0.6)
- but_val = Button(self.frame,text='Valider',command = self.valide_shell)
- but_ann = Button(self.frame,text='Annuler',command = self.annule_shell)
- but_val.place(relx=0.35,rely=0.9,anchor='center')
- but_ann.place(relx=0.65,rely=0.9,anchor='center')
- self.display_valeur()
-
- def gen_aide(self):
- """
- Retourne une chaîne de caractères d'aide sur la valeur qu'attend l'objet
- pointé par self
- """
- return "Un shell est attendu"
-
- def valide_shell(self,event=None):
- """
- Récupère la valeur saisie par l'utilisateur dans self.text
- et la stocke dans l'objet MCSIMP courant
- """
- texte = self.text.get(1.0,END)
- self.record_valeur(texte)
-
- def annule_shell(self,event=None):
- """
- Annule toute saisie dans self.text
- """
- self.text.delete(0,END)
-
- def display_valeur(self,val=None):
- """
- Affiche la valeur de l'objet pointé par self
- """
- if val != None :
- valeur = val
- else:
- valeur = self.node.item.get_valeur()
- if valeur == None or valeur == '': return
- self.text.insert(END,valeur)
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-"""
-from Tkinter import *
-
-from centerwindow import centerwindow
-from Tools.foztools.foztools import Slider
-import fontes
-import images
-
-_splash=None
-
-def init_splash(*pos,**args):
- global _splash
- _splash=SplashScreen(*pos,**args)
-
-def fini_splash():
- global _splash
- _splash.quit()
- _splash=None
-
-class SplashScreen(Toplevel):
- """
- Provides a splash screen. Usage:
- Subclass and override 'CreateWidgets()'
- In constructor of main window/application call
- - S = SplashScreen(main=self) (if caller is Toplevel)
- - S = SplashScreen(main=self.master) (if caller is Frame)
- - S.quit() after you are done creating your widgets etc.
- """
- def __init__(self, master=None,**args):
- Toplevel.__init__(self, master, relief='groove',
- borderwidth=5)
- self.main = master
- if self.main != None :
- self.main.iconify()
- self.withdraw()
- self.frame = Frame(self)
- self.frame.pack(expand=1,fill='both')
- self.init(args)
- self.geometry("300x200")
- self.resizable(0,0)
- centerwindow(self)
- self.CreateWidgets()
- self.deiconify()
-
- def init(self,args={}):
- self.text = StringVar()
- self.text.set('')
- self.text2 = StringVar()
- self.text2.set('')
- self.icone = 'logo_edf.gif'
- self.barre = 'non'
- if args == {} : return
- if args.has_key('text'):
- self.text.set(args['text'])
- if args.has_key('info'):
- self.text2.set(args['info'])
- if args.has_key('titre'):
- self.title(args['titre'])
- if args.has_key('code'):
- self.code = args['code']
- else:
- self.code = 'inconnu'
- if args.has_key('icone'):
- self.icone = args['icone']
- if self.code == 'ASTER' :
- self.icone = 'code_aster.gif'
- elif self.code == 'SATURNE':
- self.icone = 'code_saturne.gif'
- elif self.code == 'DESCARTES':
- self.icone = 'code_descartes.gif'
-
- def CreateWidgets(self):
- self.catIcon = images.get_image(self.icone)
- self.label = Label(self.frame, image=self.catIcon)
- self.label.pack(side=TOP)
- self.label = Label(self.frame, textvariable=self.text,font = fontes.standard_gras)
- self.label.pack(side=TOP,expand=1,fill='both')
- self.label2 = Label(self.frame, textvariable=self.text2,font = fontes.standard_italique)
- self.label2.pack(side=TOP,expand=1,fill='both')
- self.progress = Slider(self.frame,value=0,max=100,orientation='horizontal',
- fillColor='#00008b',width=200,height=30,
- background='white',labelColor='red')
- centerwindow(self)
-
- def update_barre(self,event=None):
- """ Permet de faire avancer la barre de progression """
- try:
- self.progress.value = self.progress.value+self.increment
- self.progress.update()
- except:
- pass
-
- def configure_barre(self):
- """
- Calcule l'incrément de progression de la barre en fonction
- du nombre d'opérations à effectuer afin que le compteur
- soit à 100% à la fin des opérations
- """
- self.increment = 100./self.ratio
- self.progress.update()
-
- def configure(self,**args):
- if args.has_key('text'):
- self.text.set(args['text'])
- if args.has_key('info'):
- self.text2.set(args['info'])
- if args.has_key('titre'):
- self.title(args['titre'])
- if args.has_key('barre'):
- old = self.barre
- self.barre = args['barre']
- if self.barre == 'oui' and old == 'non':
- self.progress.frame.pack(in_=self.frame,side='top')
- elif self.barre == 'non' and old == 'oui':
- self.progress.frame.pack_forget()
- if args.has_key('ratio'):
- self.ratio = args['ratio']
- self.configure_barre()
- self.update()
-
- def quit(self):
- self.progress = None
- self.destroy()
- if self.main:
- centerwindow(self.main,parent='sans')
- self.main.deiconify()
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 Tkinter
-import types
-
-class STATUSBAR:
- def __init__(self,parent,police):
- self.parent=parent
- self.police=police
- self.frame = Tkinter.Frame(parent,bd=1, relief=Tkinter.RAISED)
- self.frame.pack(side=Tkinter.BOTTOM, fill=Tkinter.X)
- self.label = Tkinter.Label (self.frame,
- fg='black',
- text='',
- justify='left',
- relief='sunken',
- height=3,
- bg='gray95')
- self.label.pack(side='left',expand=1,fill='both')
-
- def affiche_infos(self,texte):
- if len(texte)>150 :
- texte_infos=texte[0:150]
- else :
- texte_infos=texte
- self.label.configure(text=texte_infos,font=self.police)
-
- def reset_affichage_infos(self):
- """ Efface tout message présent dans le panneau en bas d'EFICAS """
- self.affiche_infos('')
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-import os
-import prefs
-import basestyle
-from basestyle import STYLE,style
-
-inistylefile=os.path.join(prefs.REPINI,"style.py")
-if os.path.isfile(inistylefile):
- execfile(inistylefile)
-
-userstylefile=os.path.expanduser("~/Eficas_install/style.py")
-if os.path.isfile(userstylefile):
- execfile(userstylefile)
-
-import fontes
-for attr in dir(style):
- if attr[0]=='_':continue
- if not hasattr(fontes,attr):continue
- setattr(fontes,attr,getattr(style,attr))
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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
-from Tkinter import *
-import Pmw
-
-# Modules Eficas
-import images
-
-class TOOLBAR:
- def __init__(self,appli,parent):
- # parent représente l'objet graphique parent
- self.parent=parent
- # appli représente l'objet application parent
- self.appli=appli
- self.balloon = None
- self.l_boutons_a_activer = []
- self.barreboutons=Frame(self.parent,relief='ridge',bd=2)
- self.barreboutons.pack(anchor='nw',expand=0,fill=X)
- # bouton Infos à l'extrême droite de la barre des boutons
- b = Button(self.barreboutons,
- image = images.get_image('About24'),
- command = self.view_infos)
- b.pack(side='right')
- texte = "Infos EFICAS"
- b.bind("<Enter>",lambda e,s=self,but=b,t=texte : s.affiche_balloon(e,but,t,pos='right'))
- b.bind("<Leave>", self.efface_balloon)
-
- def appelle_commande(self,e,b,c):
- try :
- c()
- except :
- pass
-
- def inactive_boutons(self):
- """
- Inactive les boutons de la liste self.l_boutons_a_activer
- --> cette méthode est appelée dès qu'il n'y a pas de JDC courant
- """
- for but in self.l_boutons_a_activer:
- but.configure(state='disabled')
-
- def active_boutons(self):
- """
- Active les boutons de la liste self.l_boutons_a_activer
- --> cette méthode est appelée dès qu'il y a un JDC courant
- """
- for but in self.l_boutons_a_activer:
- but.configure(state='normal')
-
- def affiche_balloon(self,event,bouton,bulle,pos='left'):
- """
- Affiche le balloon bulle associé au bouton bouton
- """
- etat = bouton.cget('state')
- if etat != 'normal' : return
- geom = bouton.winfo_geometry()
- l_args = string.split(geom,'+')
- x = eval(l_args[1])+event.x+10
- self.balloon = Label(self.parent,
- text = bulle,
- background="yellow",
- borderwidth=2,
- relief='ridge')
- if pos == 'left':
- self.balloon.place(in_=self.parent,x=x,y=32)
- else:
- self.balloon.place(in_=self.parent,x=x,y=32,anchor='ne')
-
- def efface_balloon(self,event=None):
- """
- Efface le balloon courant
- """
- if self.balloon :
- self.balloon.destroy()
- self.balloon = None
-
- def view_infos(self):
- """
- Permet d'afficher des infos sur la session courante d'EFICAS
- """
- self.fen_infos = Pmw.Dialog(self.parent,
- title = 'Informations session EFICAS',
- buttons = ('Fermer',),
- command = self.close_infos)
- self.fen_infos.withdraw()
- texte_infos = self.appli.get_texte_infos()
- Label(self.fen_infos.interior(),
- text = texte_infos,
- anchor='center').pack(side='top',anchor='center')
- self.fen_infos.activate(geometry = 'centerscreenalways')
-
- def close_infos(self,lbl):
- """
- Ferme la fenêtre des infos
- """
- self.fen_infos.destroy()
-
- 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)
- Button(self.barreboutons,
- image = images.get_image('Sep'),
- state='disabled',
- relief = 'flat').pack(side='left')
- continue
- nom_fic,commande,texte,statut = bouton
- commande=getattr(appli_composant,commande)
- b = Button(self.barreboutons,
- image = images.get_image(nom_fic),
- command = commande,
- relief='flat')
- b.pack(side='left')
- b.bind("<Enter>",lambda e,s=self,but=b,t=texte : s.affiche_balloon(e,but,t))
- b.bind("<Leave>", self.efface_balloon)
- b.bind("<Return>", lambda e,s=self,but=b,c=commande:s.appelle_commande(e,but,c))
- if statut != 'always':
- self.l_boutons_a_activer.append(b)
-
- # inactive les boutons qui doivent l'être tant qu'aucun JDC courant
- self.inactive_boutons()
-
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,text=None):
- self.widget=widget
- self.text = text
- self.timer = None
- self.tooltip = None
- self.label = None
- self.bindings = []
- self.bindings.append(self.widget.bind("<Enter>", self._enter))
- self.bindings.append(self.widget.bind("<Leave>", self._leave))
- self.bindings.append(self.widget.bind("<ButtonPress>", self._leave))
- # user overrideable settings
- self.time = 1000 # milliseconds
- self.relief = Tkinter.SOLID
- self.justify = Tkinter.LEFT
- self.fg = "#000000"
- self.bg = "#ffffe0"
- self.xoffset = 20
- self.yoffset = 1
-
- def setText(self, text):
- self.text = text
-
- def _unbind(self):
- if self.bindings and self.widget:
- self.widget.unbind("<Enter>", self.bindings[0])
- self.widget.unbind("<Leave>", self.bindings[1])
- self.widget.unbind("<ButtonPress>", self.bindings[2])
- self.bindings = []
-
- def destroy(self):
- self._unbind()
- self._leave()
-
- def _enter(self, *event):
- after_cancel(self.timer)
- self.timer = after(self.widget, self.time, self._showTip)
-
- def _leave(self, *event):
- after_cancel(self.timer)
- self.timer = None
- if self.tooltip:
- self.label.destroy()
- destruct(self.label)
- self.label = None
- self.tooltip.destroy()
- destruct(self.tooltip)
- self.tooltip = None
-
- def _showTip(self):
- if self.tooltip or not self.text:
- return
- c = self.widget.__class__
- if c in (Tkinter.Button,):
- if self.widget["state"] == Tkinter.DISABLED:
- return
- x = self.widget.winfo_rootx()
- y = self.widget.winfo_rooty() + self.widget.winfo_height()
- x = x + self.xoffset
- y = y + self.yoffset
- self.tooltip = Tkinter.Toplevel()
- self.tooltip.wm_iconify()
- self.tooltip.wm_overrideredirect(1)
- self.tooltip.wm_protocol("WM_DELETE_WINDOW", self.destroy)
- self.label = Tkinter.Label(self.tooltip, text=self.text,
- relief=self.relief, justify=self.justify,
- fg=self.fg, bg=self.bg, bd=1, takefocus=0)
- self.label.pack(ipadx=1, ipady=1)
- self.tooltip.wm_geometry("%+d%+d" % (x, y))
- self.tooltip.wm_deiconify()
-
-if __name__ == "__main__":
- root=Tkinter.Tk()
- label = Tkinter.Label(root, text="coucou")
- label.pack()
- tp=TOOLTIP(label,"texte d'aide")
- root.mainloop()
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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 Tkinter,Pmw
-
-# Modules Eficas
-import Objecttreeitem
-import treewidget
-
-class TREEITEMINCANVAS:
- def __init__(self,object,nom="",parent=None,appli=None,sel=None,rmenu=None):
- self.object=object
- self.nom=nom
-
- if not appli:
- class Appli:
- def affiche_infos(self,message):
- pass
- appli=Appli()
- self.appli=appli
-
- if not parent:
- parent=Tkinter.Tk()
- Pmw.initialise(parent)
- self.parent=parent
-
- self.item=Objecttreeitem.make_objecttreeitem(self.appli,self.nom,self.object)
- 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):
- return
- self.tree=treewidget.Tree(self.appli,self.item,self.canvas,command=sel,rmenu=rmenu)
- self.tree.draw()
-
- def mainloop(self):
- self.parent.mainloop()
-
- def update(self):
- """Cette methode est utilisee pour signaler une mise a jour des objets associes"""
- self.tree.update()
-
- def supprime(self):
- #print "supprime",self
- self.tree.supprime()
- self.tree=None
- self.canvas.destroy()
- self.canvas=None
-
- #def __del__(self):
- # print "__del__",self
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,sys,string,re,types,traceback
-from Tkinter import *
-
-
-import fontes
-import images
-from Ihm import CONNECTOR
-
-#
-__version__="$Name: $"
-__Id__="$Id: treewidget.py,v 1.31.12.1 2007-04-26 07:56:07 cchris Exp $"
-#
-
-Fonte_Standard = fontes.standard
-
-class Tree :
- def __init__(self,appli,jdc_item,scrolledcanvas,command = None,rmenu=None):
- self.item = jdc_item
- self.scrolledcanvas = scrolledcanvas
- self.canvas = self.scrolledcanvas.component('canvas')
- #resolution
- resolution= self.canvas.winfo_screenwidth()/(self.canvas.winfo_screenmmwidth()/25.4*72)
- self.DDY=max(20,resolution*(Fonte_Standard[1]+4))
- self.id_up=self.canvas.bind("<F11>", self.page_up)
- self.id_down=self.canvas.bind("<F12>", self.page_down)
- self.id_um=self.canvas.bind("<Key-Left>", self.mot_up)
- self.id_dm=self.canvas.bind("<Key-Right>", self.mot_down)
- self.id_s=self.canvas.bind("<1>", self.canvas_select)
- self.tree = self
- self.command = command
- self.rmenu=rmenu
- self.appli = appli
- self.parent = None
- self.racine = self
- self.node_selected = None
- self.build_children()
-
- def canvas_select(self,event):
- self.canvas.focus_set()
-
- def page_up(self,event):
- event.widget.yview_scroll(-1, "page")
-
- def page_down(self,event):
- event.widget.yview_scroll(1, "page")
-
- def unit_up(self,event):
- event.widget.yview_scroll(-1, "unit")
-
- def unit_down(self,event):
- event.widget.yview_scroll(1, "unit")
-
- def mot_down(self,event):
- self.select_next(None)
- self.canvas.focus_set()
-
- def mot_down_force(self):
- self.select_next(None)
- self.canvas.focus_set()
-
- def mot_up(self,event):
- self.node_selected.select_mot_previous()
- self.canvas.focus_set()
-
- def mot_up_force(self):
- self.node_selected.select_mot_prev()
- self.canvas.focus_set()
-
- def deplieReplieNode(self):
- self.node_selected.deplieReplieNode()
-
- def build_children(self):
- """ Construit la liste des enfants de self """
- self.children = []
- child = self.item.itemNode(self,self.item,self.command,self.rmenu)
- self.children.append(child)
- child.state='expanded'
-
- def draw(self):
- """ Dessine l'arbre """
- lasty = 8
- x = 5
- for child in self.children:
- child.draw(x,lasty)
- lasty = child.lasty + 15
- self.children[0].select()
- self.resizescrollregion()
-
- def deselectall(self):
- """ déselectionne tous les éléments de l'arbre """
- if self.node_selected :
- self.node_selected.deselect()
-
- def update(self):
- """ Update tous les éléments de l'arbre """
- for child in self.children:
- child.update()
-
- def supprime(self):
- """ supprime tous les éléments de l'arbre """
- #print "supprime",self
- self.canvas.unbind("<F11>",self.id_up)
- self.canvas.unbind("<F12>",self.id_down)
- self.canvas.unbind("<Key-Left>",self.id_um)
- self.canvas.unbind("<Key-Right>",self.id_dm)
- self.canvas.unbind("<1>",self.id_s)
- self.tree = None
- self.racine = None
- self.node_selected = None
- self.item = None
- self.scrolledcanvas = None
- self.canvas = None
- self.command = None
- self.rmenu=None
- for child in self.children:
- child.supprime()
- self.children=[]
-
- def update_valid(self) :
- """Cette methode a pour but de mettre a jour la validite du noeud
- et de propager la demande de mise à jour à son parent
- """
- pass
-
- def resizescrollregion(self):
- x0,y0,x1,y1=self.canvas.bbox(ALL)
- # On ajoute une marge approximativement de la moitié du canvas
- y1=y1+self.canvas.winfo_height()/2
- self.canvas.configure(scrollregion = (x0,y0,x1,y1))
-
- def select_next(self,event):
- self.node_selected.select_next()
- self.canvas.focus_set()
-
- def select_previous(self,event):
- self.node_selected.select_previous()
-
- def see(self,items):
- x1, y1, x2, y2=apply(self.canvas.bbox, items)
- while x2 > self.canvas.canvasx(0)+self.canvas.winfo_width():
- old=self.canvas.canvasx(0)
- self.canvas.xview_scroll( 1, 'units')
- # avoid endless loop if we can't scroll
- if old == self.canvas.canvasx(0):
- break
- while y2 > self.canvas.canvasy(0)+self.canvas.winfo_height():
- old=self.canvas.canvasy(0)
- self.canvas.yview_scroll( 1, 'units')
- if old == self.canvas.canvasy(0):
- break
- # done in this order to ensure upper-left of object is visible
- while x1 < self.canvas.canvasx(0):
- old=self.canvas.canvasx(0)
- self.canvas.xview_scroll( -1, 'units')
- if old == self.canvas.canvasx(0):
- break
- while y1 < self.canvas.canvasy(0):
- old=self.canvas.canvasy(0)
- self.canvas.yview_scroll( -1, 'units')
- if old == self.canvas.canvasy(0):
- break
-
- #def __del__(self):
- # print "__del__",self
-
-
-class Node :
- def __init__(self,parent,item,command=None,rmenu=None):
- self.parent = parent
- self.item = item
- self.connect()
- self.command = command
- self.rmenu=rmenu
- self.tree = self.parent.tree
- self.appli = self.parent.appli
- self.canvas = self.parent.canvas
- self.init()
-
- def init(self):
- self.state='collapsed'
- self.displayed = 0
- self.selected = 0
- self.x = self.y =None
- self.lasty = 0
- self.children = None
- self.id = []
- if self.parent is self.tree:
- self.racine=self
- else:
- self.racine = self.parent.racine
-
- def connect(self):
- self.item.connect("add",self.onAdd,())
- self.item.connect("supp",self.onSupp,())
- self.item.connect("valid",self.onValid,())
-
- #def __del__(self):
- # print "__del__",self
-
- def force_select(self):
- if self.selected:
- # le noeud est selectionné. On force la reconstruction du panel associé
- if self.command:apply(self.command,(None,))
- self.select()
-
- def onValid(self):
- #print "onValid : l'item a changé de validité ",self.item,self.item.object,self.item.object.isvalid()
- self.update_node_valid()
- self.update_node_label()
- self.update_node_texte()
- if self.selected and self.command:
- self.command(self)
-
- def onAdd(self,objet):
- #print "onAdd : un objet a été ajouté aux fils de l'item ",self.item.object,objet
- self.expand_node()
- old_nodes=self.children
- self.update_nodes()
- self.redraw_children(old_nodes)
- self.force_select()
-
- def onSupp(self,objet):
- #print "onSupp : un objet a été supprimé des fils de l'item ",self.item.object,objet
- self.expand_node()
- old_nodes=self.children
- self.update_nodes()
- self.redraw_children(old_nodes)
- self.force_select()
-
- def update_nodes(self):
- #print "update_nodes",self
- newnodes=[]
- inodes=iter(self.children)
- sublist=self.item._GetSubList()
- iliste=iter(sublist)
-
- while(1):
- old_item=item=None
- for node in inodes:
- old_item=node.item
- if old_item in sublist:break
- #print "item supprime",old_item
- for item in iliste:
- if item is old_item:break
- #print "item ajoute",item
- child = item.itemNode(self,item,self.command,self.rmenu)
- newnodes.append(child)
-
- if old_item is None and item is None:break
- if old_item is item:
- #print "item conserve",item
- newnodes.append(node)
-
- self.children=newnodes
- self.connect()
-
- def supprime(self):
- #print "supprime",self
- self.efface_node()
- self.racine = None
- self.command = None
- self.rmenu=None
- if not self.children : return
- for child in self.children:
- child.supprime()
- self.children=None
-
- def redraw_children(self,old_nodes):
- #print "redraw_children",old_nodes
- #print self.children
- y = self.y + self.tree.DDY
- x = self.x + 15
- supp_nodes=[]
-
- inodes=iter(old_nodes)
- iliste=iter(self.children)
- # on parcourt la liste des anciens noeuds (node)
- # et la liste des nouveaux noeuds (new_node) en parallele (iterateurs)
-
- while(1):
- new_node=node=None
- for node in inodes:
- #print "ancien noeud",node
- if node in self.children:break # ancien noeud toujours present
- #print "noeud supprime",node,node.item.GetLabelText()[0]
- dy=node.y-node.lasty -self.tree.DDY
- #print "deplacer noeuds",y,dy
- node.move_nodes(y,dy)
- node.supprime()
- #supp_nodes.append(node)
-
- for new_node in iliste:
- #print "nouveau noeud",new_node
- if new_node in old_nodes: break # nouveau noeud deja present
- #print "noeud ajoute",new_node,new_node.item.GetLabelText()[0]
- y=self.draw_node(new_node,x,y)
-
- if node is None and new_node is None : break
-
- if node is new_node: # ancien noeud
- #print "noeud conserve",node
- node.update_node_label()
- y=y+node.lasty-node.y +self.tree.DDY
-
- self.racine.update_coords()
- self.canvas.delete('line')
- self.racine.trace_ligne()
- self.tree.resizescrollregion()
- # Mettre à 1 pour verifier les cycles entre objets node
- #withCyclops=0
- #if withCyclops:
- #from Misc import Cyclops
- #z = Cyclops.CycleFinder()
- #print supp_nodes
- #for o in supp_nodes:
- #z.register(o)
- #del supp_nodes
- #del o
- #z.find_cycles()
- #z.show_stats()
- #z.show_cycles()
-
- def tag_move_nodes(self,y):
- """ Marque pour deplacement tous les noeuds au dela de l'ordonnée y """
- #print "tag_move_nodes",y
- self.canvas.dtag(ALL,'move')
- # on marque tous les ids au dela de y
- x0, y0, x1, y1 = self.canvas.bbox(ALL)
- if y > y1: # pas d'objet a deplacer
- return
- self.canvas.addtag_overlapping('move',x0,y,x1,y1)
-
- def move_nodes(self,y,dy):
- """ Déplace de l'incrément dy les noeuds au dela de l'ordonnée y """
- #print "move_nodes",y,dy
- self.tag_move_nodes(y)
- # on déplace tous les items de dy
- self.canvas.move('move',0,dy)
-
- def draw_node(self,new_node,x,y):
- """ Dessine le noeud new_node en x,y en deplacant les noeuds existants
- en y et au dela
- Retourne la position du premier des noeuds deplaces
- """
- #print "draw_node",new_node,x,y
- self.tag_move_nodes(y)
- #if new_node.item.isactif():
- #new_node.state = 'expanded'
- new_node.state = 'expanded'
- new_node.draw(x,y)
- dy=(new_node.get_nb_children()+1)*self.tree.DDY
- #print "deplacer noeuds",y,dy
- self.canvas.move('move',0,dy)
- return new_node.lasty+self.tree.DDY
-
- def build_children(self):
- """ Construit la liste des enfants de self """
- self.children = []
- sublist = self.item._GetSubList()
- if not sublist : return
- for item in sublist :
- child = item.itemNode(self,item,self.command,self.rmenu)
- self.children.append(child)
-
- #-----------------------------------------------
- # Méthodes de sélection/déselection d'un noeud
- #-----------------------------------------------
-
- def select(self, event=None):
- """
- Rend le noeud courant (self) sélectionné et déselectionne
- tous les autres
- """
- #print "SELECT",self
- if not self.children : self.build_children()
- self.tree.deselectall()
- self.selected = 1
- self.tree.node_selected = self
- if self.command:apply(self.command,(self,))
- self.highlight()
- self.make_visible()
-
- def deselect(self, event=None):
- """ Déselectionne self """
- self.selected = 0
- if self.displayed == 1 : self.dehighlight()
-
- def make_visible(self):
- """ Rend l'objet self visible cad déplace le scroll pour que self
- soit dans la fenêtre de visu
- """
- lchild=self.last_child()
- self.tree.see((self.image_id,lchild.image_id))
-
- def select_next(self,ind=0):
- """ on doit chercher à sélectionner dans l'ordre:
- - son premier fils s'il est affiché
- - son frère cadet s'il existe
- - son oncle (benjamin de son père)
- - ... appel récursif ...
- """
- if self.state=='expanded' and len(self.children) > ind:
- self.children[ind].select()
- else :
- index = self.parent.children.index(self) + 1
- try :
- if isinstance(self.parent,TREE) :
- try:
- self.children[ind].select()
- except:
- self.children[0].select()
- except :
- if self.parent is self.tree:
- pass
- else :
- self.parent.select_next(index)
-
- def select_mot_prev(self):
- index = self.parent.children.index(self) - 1
- try :
- if index > -1 :
- self.parent.children[index].select()
- if self.parent.children[index].state=="expanded":
- print len(self.parent.children[index].children)
- if len(self.parent.children[index].children)!=0 :
- max=len(self.parent.children[index].children) - 1
- self.parent.children[index].children[max].select()
- else :
- self.parent.children[index].select()
- else :
- self.parent.children[index].select()
- elif self.parent is self.tree:
- pass
- else :
- self.parent.select()
- except:
- if self.parent is self.tree:
- pass
- else :
- self.parent.select_previous()
-
-
- def select_mot_previous(self):
- index = self.parent.children.index(self) - 1
- try :
- if index > -1 :
- self.parent.children[index].select()
- elif self.parent is self.tree:
- pass
- else :
- self.parent.select()
- except:
- if self.parent is self.tree:
- pass
- else :
- self.parent.select_previous()
-
- def select_previous(self):
- """ on doit d'abord sélectionner(dans l'ordre) :
- - son frère aîné
- - son père
- """
- index = self.parent.children.index(self) - 1
- try :
- self.parent.children[index].select()
- except:
- #self.parent.select()
- if self.parent is self.tree:
- pass
- else :
- self.parent.select_previous()
-
- def popup(self,event=None):
- """
- Declenche le traitement associé au clic droit de la souris
- sur l'icone du Node
- """
- if not self.rmenu:return
- apply(self.rmenu,(self,event))
-
- #-----------------------------------------------
- # Méthodes de recherche d'informations
- #-----------------------------------------------
- def geticonimage(self,name=None):
- """
- Retourne l'image qui doit être associée à self
- """
- if not name :
- name = self.item.GetIconName()
- if not name or name == 'aucune' :
- return None
- return images.get_image(name)
-
- def get_nb_children(self):
- """ Retourne le nombre d'enfants affichés de self """
- nb = 0
- if self.state =='collapsed' : return nb
- for child in self.children :
- nb = nb + 1 + child.get_nb_children()
- return nb
-
- def get_liste_id(self):
- """ Retourne la liste de tous les id (filiation comprise) de self """
- liste = self.id
- for child in self.children:
- liste.extend(child.get_liste_id())
- return liste
-
- def get_node_fils(self,name) :
- """ Retourne le fils de self de nom name s'il existe"""
- for child in self.children:
- if child.item.get_nom() == name: return child
- return None
-
- #-----------------------------------------------
- # Méthodes d'affichage d'un noeud
- #-----------------------------------------------
- def draw(self,x,y):
- """ Permet de tracer le noeud self """
- # le début du noeud est en x,y
- self.x = x
- self.y = y
- self.lasty = y
- self.displayed = 1
- self.id=[]
- # choix de l'icone à afficher : + ou -
- if self.item.IsExpandable():
- if self.state == 'expanded':
- iconname = "minusnode"
- callback = self.collapse
- else:
- iconname = "plusnode"
- callback = self.expand
- image = self.geticonimage(name=iconname)
- self.icone_id = self.canvas.create_image(self.x, self.y, image=image)
- self.callback_id=self.canvas.tag_bind(self.icone_id, "<1>", callback)
- self.id.append(self.icone_id)
- # création de la ligne horizontale
- self.ligne_id = self.canvas.create_line(self.x,self.y,self.x+10,self.y)
- self.id.append(self.ligne_id)
- self.canvas.tag_lower(self.ligne_id)
- # affichage de l'icone (carre ,rond, ovale ...) de couleur
- image = self.geticonimage()
- if image != None :
- self.image_id = self.canvas.create_image(self.x+15,self.y,image = image)
- self.select_id2=self.canvas.tag_bind(self.image_id,"<1>",self.select)
- self.popup_id2=self.canvas.tag_bind(self.image_id,"<3>",self.popup)
- self.id.append(self.image_id)
- else:
- self.image_id = None
- # affichage du texte : nom de l'objet (ETAPE ou MOT-CLE) et sa valeur
- self.drawtext()
- if self.state == 'expanded' :
- if not self.children : self.build_children()
- if len(self.children) > 0:
- self.drawchildren()
- self.lasty = self.children[-1].lasty
-
- def drawchildren(self):
- """ Dessine les enfants de self """
- y = self.y + self.tree.DDY
- x = self.x + 15
- for child in self.children:
- child.draw(x,y)
- nb = child.get_nb_children()
- y = y + self.tree.DDY*(nb+1)
- self.trace_ligne()
-
- def drawtext(self):
- """ Affiche les deux zones de texte après l'icône de couleur de l'objet """
- if self.image_id != None :
- textx = self.x + 30
- else:
- textx = self.x + 15
- texty = self.y
- # nom,fonte et couleur de l'objet du noeud à afficher
- labeltext,fonte,couleur = self.item.GetLabelText()
- if labeltext == '' : labeltext = ' '
- if fonte == None : fonte = Fonte_Standard
- if couleur == None : couleur = 'black'
- # création du widget label
- self.label = Label(self.canvas,
- text = labeltext,
- fg = couleur,
- bg = 'gray95',
- font=fonte)
- self.label_id = self.canvas.create_window(textx,texty,window=self.label,anchor='w')
- self.id.append(self.label_id)
- # bindings sur le widget label
- self.select_id=self.label.bind("<1>", self.select)
- self.popup_id=self.label.bind("<3>", self.popup)
- self.enter_id=self.label.bind("<Enter>",self.enter)
- self.leave_id=self.label.bind("<Leave>",self.leave)
- # valeur de cet objet à afficher
- x0, y0, x1, y1 = self.canvas.bbox(self.label_id)
- textx = max(x1, 200) + 10
- text = self.item.GetText() or " "
- self.text = Label(self.canvas, text=text,
- bd=0, padx=2, pady=2,background='gray95',
- font=fonte)
- if self.selected:
- self.highlight()
- else:
- self.dehighlight()
- self.text_id = self.canvas.create_window(textx, texty,anchor="w", window=self.text)
- self.id.append(self.text_id)
-
- def highlight(self,event=None):
- """ Met en surbrillance self"""
- if hasattr(self,'label'):
- self.label.configure(fg='white',bg='#00008b')
- if (hasattr(self.item,'get_nom') and hasattr( self.appli, 'salome')) :
- if self.item.get_nom() == "AFFE_CARA_ELEM":
- self.item.rmenu_specs=[("View3D", "visu_3D")]
- self.tree.rmenu
-
-
- def dehighlight(self,event=None):
- """ Rétablit l'affichage normal de self"""
- if hasattr(self,'label'):
- self.label.configure(fg='black',bg='gray95')
-
- def enter(self,event=None):
- """ Met en surbrillance self et affiche le fr de l'objet """
- self.highlight()
- fr = self.item.get_fr()
- self.appli.affiche_infos(fr)
-
- def leave(self,event=None):
- """ Rétablit l'affichage normal de self et efface le fr de l'objet """
- if not self.selected :
- self.dehighlight()
- self.appli.affiche_infos('')
-
- def collapse_children(self):
- """ Collapse récursivement tous les descendants de self """
- if not self.children : return
- for child in self.children:
- child.state='collapsed'
- child.collapse_children()
-
- def deplieReplieNode(self):
- if self.state == 'expanded':
- self.collapse()
- else :
- self.expand_node()
-
- def collapse(self,event = None):
- """ Collapse self et descendants et retrace self """
- nb = self.get_nb_children()
- self.state = 'collapsed'
- self.collapse_children()
- self.redraw(-nb)
- self.select()
-
- def expand_node(self,event = None):
- """ Expanse self et le retrace """
- if self.state == 'expanded':return
- #if not self.item.isactif() : return
- if not self.children : self.build_children()
- self.state = 'expanded'
- nb = self.get_nb_children()
- self.redraw(nb)
-
- def expand(self,event = None):
- """ Expanse self et le retrace """
- self.expand_node()
- self.select()
-
- def redraw(self,nb):
- """ Redessine self : nb est le décalage à introduire
- en dessous de self pour le redessiner """
- # nb = nombre d'items de décalage
- self.move(self.tree.DDY*nb)
- # on efface self et on le redessine
- self.efface()
- self.draw(self.x,self.y)
- # Il n'est pas nécessaire d'appeler update
- # il suffit d'updater les coordonnees et de retracer les lignes
- self.racine.update_coords()
- self.racine.trace_ligne()
- self.update_valid()
- self.tree.resizescrollregion()
-
- def update_coords(self):
- """ Permet d'updater les coordonnes de self et de tous ses enfants"""
- if self.displayed == 0 : return
- if self.image_id != None :
- coords = self.canvas.coords(self.image_id)
- self.x = coords[0]-15
- else:
- coords = self.canvas.coords(self.label_id)
- self.x = coords[0]-15
- self.y = coords[1]
- self.lasty = self.y
- if self.state == 'expanded' :
- for child in self.children:
- if child.displayed != 0:
- child.update_coords()
- self.lasty = child.lasty
-
- def update_icone(self):
- """ Met à jour les icônes de tous les noeuds : teste la validité de l'objet
- Cette méthode est très lente, trop !!"""
- if self.image_id != None :
- image = self.geticonimage()
- self.canvas.itemconfig(self.image_id,image=image)
- if self.state == 'expanded':
- for child in self.children:
- if child.displayed != 0:
- child.update_icone()
-
- def update_label_texte(self):
- """ Met a jour le label du noeud et celui de tous ses fils ouverts """
- self.update_node_label()
- if self.state == 'expanded' :
- for child in self.children:
- if child.displayed != 0 : child.update_label_texte()
-
- def update_texte(self):
- """ Met à jour les noms des SD et valeurs des mots-clés """
- self.update_node_texte()
- if self.state == 'expanded' :
- for child in self.children:
- if child.displayed != 0 : child.update_texte()
-
- def update_node_label(self):
- """ Met a jour le label du noeud """
- if self.displayed == 0 : return
- # nom,fonte et couleur de l'objet du noeud à afficher
- labeltext,fonte,couleur = self.item.GetLabelText()
- if labeltext == '' : labeltext = ' '
- if fonte == None : fonte = Fonte_Standard
- if couleur == None : couleur = 'black'
- self.label.configure(text=labeltext,font=fonte)
-
- def update_node_texte(self):
- """ Met à jour les noms des SD et valeurs des mots-clés """
- if self.displayed == 0 : return
- text = self.item.GetText()
- if text == None : text = ''
- self.text.configure(text=text)
-
- def update_node_valid(self) :
- """Cette methode remet a jour la validite du noeud (icone)
- Elle appelle isvalid
- """
- if self.displayed == 0 : return
- if self.image_id != None :
- image = self.geticonimage()
- self.canvas.itemconfig(self.image_id,image=image)
-
- def update_valid(self) :
- """Cette methode a pour but de mettre a jour la validite du noeud
- et de propager la demande de mise à jour à son parent
- """
- self.update_node_valid()
- self.parent.update_valid()
-
- def update(self,event=None) :
- """ Classe Node :
- Cette méthode est appelée pour demander l update d un noeud
- d'un jeu de commandes
- Cette demande est transmise au noeud racine (le JDC) qui update
- tout l arbre représentant le jeu de commandes
- Pendant cette mise à jour, on appelle la méthode isvalid qui
- fera l update de tous les objets déclarés modifiés lors des
- actions précédentes
- La métode isvalid est en général appelée par l intermédiaire de
- update_icone -> geticonimage -> GetIconName
- """
- #print "update",self
- #traceback.print_stack()
- self.racine.update_coords()
- self.racine.trace_ligne()
- self.racine.update_icone()
- self.racine.update_texte()
- self.racine.update_label_texte()
- self.tree.resizescrollregion()
-
- def efface_node(self):
- if self.displayed != 0:
- self.label.unbind("<1>", self.select_id)
- self.label.unbind("<3>", self.popup_id)
- self.label.unbind("<Enter>",self.enter_id)
- self.label.unbind("<Leave>",self.leave_id)
- self.canvas.tag_unbind(self.image_id,"<1>",self.select_id2)
- self.canvas.tag_unbind(self.image_id,"<3>",self.popup_id2)
- if self.item.IsExpandable():
- self.canvas.tag_unbind(self.icone_id, "<1>", self.callback_id)
- self.label.destroy()
- self.text.destroy()
-
- for id in self.id :
- self.canvas.delete(id)
- self.id=[]
- self.label_id=None
- self.text_id=None
- self.image_id=None
- self.icone_id=None
- self.label=None
- self.text=None
- self.displayed=0
-
- def efface(self):
- """ Efface du canvas les id associés à self : cad les siens et ceux
- de ses enfants """
- self.efface_node()
- if not self.children : return
- for child in self.children:
- child.efface()
-
- def move(self,dy):
- """ Déplace de l'incrément dy tous les id en dessous de self """
- # il faut marquer tous les suivants de self
- bbox1 = self.canvas.bbox(ALL)
- self.canvas.dtag(ALL,'move')
- self.canvas.delete('line')
- 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.getObject()
- print self.item.getObject().definition.label
- print 'y=',self.y
- print 'dy=',dy
- # on déplace tous les items de dy
- self.canvas.move('move',0,dy)
-
- def trace_ligne(self):
- """ Dessine les lignes verticales entre frères et entre père et premier fils"""
- if self.state=='collapsed' : return
- if len(self.children)==0 : return
- # on est bien dans le cas d'un noeud expansé avec enfants ...
- # il faut rechercher l'ordonnée du dernier fils de self
- y_end = self.children[-1].y
- ligne = self.canvas.create_line(self.x+15,self.y,self.x+15,y_end,tags='line')
- self.canvas.tag_lower(ligne)
- for child in self.children :
- try:
- child.trace_ligne()
- except:
- print "Erreur dans trace_ligne :"
- print child
- print child.item.getObject()
-
- def last_child(self):
- lchild=self
- if self.state == 'expanded' and self.children:
- lchild= self.children[-1].last_child()
- return lchild
-
- #------------------------------------------------------------------
- # Méthodes de création et destruction de noeuds
- # Certaines de ces méthodes peuvent être appelées depuis l'externe
- #------------------------------------------------------------------
- def append_brother(self,name,pos='after',retour='non'):
- """
- Permet d'ajouter un objet frère à l'objet associé au noeud self
- par défaut on l'ajoute immédiatement après
- Méthode externe
- """
- # on veut ajouter le frère de nom name directement avant ou après self
- index = self.parent.children.index(self)
- if pos == 'before':
- index = index
- elif pos == 'after':
- index = index +1
- else:
- print str(pos)," n'est pas un index valide pour append_brother"
- return 0
- return self.parent.append_child(name,pos=index)
-
- def append_child(self,name,pos=None,verif='oui',retour='non'):
- """
- Methode pour ajouter un objet fils à l'objet associé au noeud self.
- On peut l'ajouter en début de liste (pos='first'), en fin (pos='last')
- ou en position intermédiaire.
- Si pos vaut None, on le place à la position du catalogue.
- """
- #print "append_child",self,self.children
- if pos == 'first':
- index = 0
- elif pos == 'last':
- index = len(self.children)
- elif type(pos) == types.IntType :
- # position fixee
- index = pos
- elif type(pos) == types.InstanceType:
- # pos est un item. Il faut inserer name apres pos
- index = self.item.get_index(pos) +1
- elif type(name) == types.InstanceType:
- index = self.item.get_index_child(name.nom)
- else:
- index = self.item.get_index_child(name)
- obj=self.item.additem(name,index)
- #print obj
- if obj is None:obj=0
- if obj == 0:return 0
- #print "append_child",index,self.children
- child=self.children[index]
- child.select()
- return child
-
- def delete(self):
- """
- Méthode externe pour la destruction de l'objet associé au noeud
- La mise à jour des noeuds est faite par onSupp sur notification
- """
- index = self.parent.children.index(self) - 1
- if index < 0 : index =0
-
- parent=self.parent
- ret=parent.item.suppitem(self.item)
- if ret == 0:return
-
- brothers=parent.children
- if brothers:
- toselect=brothers[index]
- else:
- toselect=parent
- toselect.select()
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# ======================================================================
-# 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 copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from uniquepanel import UNIQUE_Panel
-
-
-class UNIQUE_ASSD_Panel(UNIQUE_Panel):
- """
- Classe servant à définir le panneau associé aux objets qui attendent une valeur unique
- d'un type dérivé d'ASSD
- """
- def valid_valeur_automatique(self):
- """
- Réalise la validation d'un concept sans remonter dans le
- node parent dans le cas ou il n'y a qu'un concept possible (liste de longueur 1)
- Identique à valid_valeur moins appel de self.node.parent.select()
- On pourrait supposer que le seul concept présent est valide et donc ne pas
- réaliser tous les tests de vérification.
- """
- if self.parent.modified == 'n' : self.parent.init_modif()
- valeur = self.get_valeur()
- self.erase_valeur()
- anc_val = self.node.item.get_valeur()
- valeur,validite=self.node.item.eval_valeur_item(valeur)
- 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)
- 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()
- else :
- cr = self.node.item.get_cr()
- mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
- self.reset_old_valeur(anc_val,mess=mess)
-
- def makeValeurPage(self,page,reel="non"):
- """
- Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une
- SD de type dérivé d'ASSD
- """
- # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
- # et de la liste des SD du bon type (constituant la liste des choix)
- bulle_aide=self.get_bulle_aide()
- aide=self.get_aide()
- aide= justify_text(texte=aide)
- liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
-
- # Remplissage du panneau
- self.valeur_choisie = StringVar()
- self.valeur_choisie.set('')
- min,max = self.node.item.GetMinMax()
- if (min == 1 and min == max and len(liste_noms_sd)==1 ):
- if self.valeur_choisie.get() != liste_noms_sd[0]:
- if ('R' not in self.node.item.get_type()) :
- self.valeur_choisie.set(liste_noms_sd[0])
- self.valid_valeur_automatique()
-
- self.frame_valeur = Frame(page)
- self.frame_valeur.pack(fill='both',expand=1)
- self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
- self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
- items=liste_noms_sd,
- labelpos='n',
- label_text="Structures de données du type\n requis par l'objet courant :",
- listbox_height = 6,
- selectioncommand=self.select_valeur_from_list,
- dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
- self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
- Label(self.frame_valeur,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
- Label(self.frame_valeur,textvariable=self.valeur_choisie).place(relx=0.5,rely=0.6)
- self.but_val = Button(self.frame_valeur,text = "Valider",command= self.Choisir)
- self.but_val.place(relx=0.3,rely=0.8,relwidth=0.35)
-
- # affichage de la valeur courante
- self.display_valeur()
- if self.__class__.__name__ == 'UNIQUE_ASSD_Panel_Reel' :
- Label(self.frame_valeur,text='Valeur Réelle').place(relx=0.1,rely=0.9)
- self.entry = Entry(self.frame_valeur,relief='sunken')
- self.entry.place(relx=0.28,rely=0.9,relwidth=0.6)
- self.entry.bind("<Return>",lambda e,c=self.valid_valeur_reel:c())
- self.entry.bind("<KP_Enter>",lambda e,c=self.valid_valeur_reel:c())
-
-
-
- def get_bulle_aide(self):
- """
- Retourne l'aide associée au panneau
- """
- return "Double-cliquez sur la structure de donnée désirée pour valoriser le mot-clé simple courant"
-
- def get_aide(self):
- """
- Retourne la phrase d'aide indiquant de quel type doit être la valeur à donner par l'utilisateur
- """
- mc = self.node.item.get_definition()
- try :
- type = mc.type[0].__name__
- except :
- type = str(mc.type[0])
- if len(mc.type)>1 :
- for typ in mc.type[1:] :
- try :
- l=typ.__name__
- except:
- l=str(typ)
- type = type + ' ou '+l
- commentaire="Un objet de type "+type+" est attendu"
- aideval=self.node.item.aide()
- commentaire=commentaire +"\n"+ aideval
- return commentaire
-
-
- def select_valeur_from_list(self):
- """
- Affecte à valeur choisie la sélection courante dans la liste des choix proposée
- """
- if len(self.listbox.get()) == 0 : return
- if len(self.listbox.getcurselection()) == 0 : return
- choix = self.listbox.getcurselection()[0]
- self.valeur_choisie.set(choix)
- self.listbox.component("listbox").focus_set()
-
- def choose_valeur_from_list(self,command):
- """
- Affecte à valeur choisie la sélection courante dans la liste des choix proposée
- Exécute command
- """
- if len(self.listbox.get()) == 0 : return
- if len(self.listbox.getcurselection()) == 0 : return
- choix = self.listbox.getcurselection()[0]
- self.valeur_choisie.set(choix)
- apply(command,(),{})
-
- def Choisir(self) :
- #Appeler par le bouton Valider
- self.choose_valeur_from_list(self.valid_valeur)
-
- def get_valeur(self):
- """
- Retourne la valeur donnée par l'utilisateur au MCS
- """
- return self.valeur_choisie.get()
-
- def display_valeur(self):
- """
- Affiche la valeur de l'objet pointé par self
- """
- valeur = self.node.item.get_valeur()
- if valeur == None or valeur == '' : return # pas de valeur à afficher ...
- self.valeur_choisie.set(getattr(valeur,"nom","unknown"))
-
- def erase_valeur(self):
- pass
-
- def appel_make(self,page):
- self.makeValeurPage(page,reel="oui")
-
-class UNIQUE_ASSD_Panel_Reel(UNIQUE_ASSD_Panel):
-
- def valid_valeur_reel(self):
- if self.parent.modified == 'n' : self.parent.init_modif()
- anc_val = self.node.item.get_valeur()
- valeurentree = self.entry.get()
- self.valeur_choisie.set(valeurentree)
- self.valid_valeur()
-
- def display_valeur(self):
- valeur = self.node.item.get_valeur()
- if valeur == None or valeur == '' : return # pas de valeur à afficher ...
- if type(valeur) == types.FloatType :
- self.valeur_choisie.set(valeur)
- else :
- self.valeur_choisie.set(valeur.nom)
-
-
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-from Tkinter import Widget
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import FenetreDeParametre
-from widgets import showerror
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from uniquepanel import UNIQUE_Panel
-
-
-class UNIQUE_BASE_Panel(UNIQUE_Panel):
- """
- Classe servant à définir le panneau associé aux mots-clés simples qui attendent
- une valeur d'un type de base (entier, réel ou string).
- """
- def makeValeurPage(self,page):
- """
- Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
- de base cad entier, réel, string ou complexe
- """
- # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
- # et de la liste des SD du bon type (constituant la liste des choix)
- bulle_aide=self.get_bulle_aide()
- aide=self.get_aide()
- aide= justify_text(texte=aide)
- liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
- # Remplissage du panneau
- self.frame_valeur = Frame(page)
- self.frame_valeur.pack(fill='both',expand=1)
- self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
- self.label = Label(self.frame_valeur,text='Valeur :')
- #self.label.place(relx=0.1,rely=0.2)
- self.label.grid(row=0,padx=5,pady=5)
- self.entry = Entry(self.frame_valeur,relief='sunken')
- #self.entry.place(relx=0.28,rely=0.2,relwidth=0.6)
- self.entry.grid(row=0,column=1,padx=5,pady=5)
- self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
- self.entry.bind("<KP_Enter>",lambda e,c=self.valid_valeur:c())
- # aide associée au panneau
- 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.9,anchor='n')
- self.aide.grid(row=4,columnspan=2,padx=5,pady=5)
- # bouton parametre
- bouton_parametres = Button(self.frame_valeur, text="Parametres", command=self.affiche_parametre)
- #bouton_parametres.place(relx=0.28,rely=0.5,relwidth=0.4)
- bouton_parametres.grid(row=2,columnspan=2,padx=5,pady=5)
- bouton_val = Button(self.frame_valeur, text="Valider", command=self.valide)
- #bouton_val.place(relx=0.28,rely=0.6,relwidth=0.4)
- bouton_val.grid(row=3,columnspan=2,padx=5,pady=5)
- # affichage de la valeur du MCS
- self.display_valeur()
-
- def valide(self):
- self.valid_valeur()
-
- def affiche_parametre(self) :
- if self.node.item.get_liste_param_possible() != [ ]:
- txtparam=""
- for param in self.node.item.get_liste_param_possible():
- txtparam=txtparam+repr(param)+"\n"
- if txtparam=="":
- showerror("Aucun parametre ","Pas de parametre de ce type")
- else :
- try :
- self.fenetreparam.destroy()
- except :
- pass
- self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
-
- def destroy(self):
- try :
- self.fenetreparam.destroy()
- except :
- pass
- Widget.destroy(self)
-
- def get_aide(self):
- """
- Retourne la phrase d'aide indiquant de quel type doit être la valeur
- du mot-clé simple fournie par l'utilisateur
- """
- mc = self.node.item.get_definition()
- d_aides = { 'TXM' : "Une chaîne de caractères est attendue",
- 'R' : "Un réel est attendu",
- 'I' : "Un entier est attendu"}
- type = mc.type[0]
- commentaire=d_aides.get(type,"Type de base inconnu")
- aideval=self.node.item.aide()
- commentaire=commentaire +"\n"+ aideval
- return commentaire
-
- def get_bulle_aide(self):
- """
- Retourne la bulle d'aide associée au panneau et affichée par clic droit
- """
- return """Saisissez la valeur que vous voulez affecter au mot-clé simple
- dans la zone de saisie et pressez <Return>"""
-
- def display_valeur(self):
- """
- Affiche la valeur de l'objet pointé par self
- """
- valeur = self.node.item.get_valeur()
- if valeur == None or valeur == '' : # pas de valeur à afficher ...
- self.entry.delete(0,END)
- self.entry.focus()
- return
-
- valeur_texte=self.get_valeur_texte(valeur)
- if valeur_texte != "":
- valeur=valeur_texte
- self.entry.delete(0,END)
- self.entry.insert(0,valeur)
- self.entry.focus()
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from uniquepanel import UNIQUE_Panel
-
-
-class UNIQUE_COMP_Panel(UNIQUE_Panel):
- """
- Classe servant à définir le panneau associé aux mots-clés simples
- qui attendent une valeur de type complexe
- """
- def makeValeurPage(self,page):
- """
- Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
- de base cad entier, réel, string ou complexe
- """
- # Récupération de l'aide associée au panneau et de l'aide destinée à l'utilisateur
- bulle_aide=self.get_bulle_aide()
- aide=self.get_aide()
- aide= justify_text(texte=aide)
- # Remplissage du panneau
- self.frame_valeur = Frame(page)
- self.frame_valeur.pack(fill='both',expand=1)
- self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
- self.label = Label(self.frame_valeur,text='Complexe de la forme : a+bj')
- self.label1 = Label(self.frame_valeur,text='Imaginaire')
- self.label2 = Label(self.frame_valeur,text='Phase')
- self.label3 = Label(self.frame_valeur,text='OU')
- self.label.place (relx=0.15,rely=0.1)
- self.label1.place(relx=0.6,rely=0.50)
- self.label2.place(relx=0.6,rely=0.57)
- self.label3.place(relx=0.15,rely=0.4)
- self.typ_cplx=StringVar()
- self.typ_cplx.set('RI')
- rb1 = Radiobutton(self.frame_valeur, text='RI : Réel',variable=self.typ_cplx,value='RI')
- rb2 = Radiobutton(self.frame_valeur, text='MP : Module',variable=self.typ_cplx,value='MP')
- rb1.place(relx=0.15,rely = 0.50)
- rb2.place(relx=0.15,rely = 0.57)
- self.entry1 = Pmw.EntryField(self.frame_valeur,validate='real')
- self.entry2 = Pmw.EntryField(self.frame_valeur,validate='real')
- self.entry3 = Pmw.EntryField(self.frame_valeur)
- self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus())
- self.entry1.component('entry').bind("<KP_Enter>",lambda e,s=self:s.entry2.component('entry').focus())
- self.entry2.component('entry').bind("<Return>",lambda e,c=self.valid_valeur:c())
- self.entry2.component('entry').bind("<KP_Enter>",lambda e,c=self.valid_valeur:c())
- self.entry3.component('entry').bind("<Return>",lambda e,c=self.valid_complexe:c())
- self.entry3.component('entry').bind("<KP_Enter>",lambda e,c=self.valid_complexe:c())
- self.entry1.place(relx=0.15,rely = 0.65,relwidth=0.35)
- self.entry2.place(relx=0.60,rely = 0.65,relwidth=0.35)
- self.entry3.place(relx=0.15,rely = 0.20,relwidth=0.60)
- self.entry1.focus()
- self.bouton_val=Button(self.frame_valeur,text="Valider",command=self.valider,width=14)
- self.bouton_val.place(relx=0.4,rely=0.8)
- 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.9,anchor='n')
- # affichage de la valeur du MCS
- self.display_valeur()
-
- def valider(self):
- if ((self.entry3.get() != None) and (self.entry3.get() != "" )):
- self.erase_valeur()
- self.valid_complexe()
- else :
- self.valid_valeur()
-
-
- def display_valeur(self):
- """
- Affiche la valeur de l'objet pointé par self
- """
- valeur = self.node.item.get_valeur()
- if valeur == None or valeur == '' : return # pas de valeur à afficher ...
- self.entry1.delete(0,END)
- self.entry2.delete(0,END)
- self.entry3.delete(0,END)
- if type(valeur) not in (types.ListType,types.TupleType) :
- self.display_complexe()
- else:
- typ_cplx,x1,x2=valeur
- self.typ_cplx.set(typ_cplx)
- self.entry1.setentry(x1)
- self.entry2.setentry(x2)
-
- def display_complexe(self):
- valeur = self.node.item.get_valeur()
- self.entry3.setentry(valeur)
-
- def get_bulle_aide(self):
- """
- Retourne la bulle d'aide du panneau
- """
- return """-Choisissez votre format de saisie du complexe :
- \t 'RI' = parties réelle et imaginaire
- \t 'MP' = module/phase (en degrés)
- - Saisissez ensuite dans les deux zones de saisie les deux nombres attendus"""
-
- def get_aide(self):
- """
- Retourne la phrase d'aide décrivant le type de la valeur que peut prendre
- le mot-clé simple courant
- """
- commentaire='Un complexe est attendu'
- aideval=self.node.item.aide()
- commentaire=commentaire +"\n"+ aideval
- return commentaire
-
- def get_valeur(self):
- """
- Retourne le complexe saisi par l'utilisateur
- """
- l=[]
- l.append(self.typ_cplx.get())
- try :
- l.append(string.atof(self.entry1.get()))
- l.append(string.atof(self.entry2.get()))
- except :
- return None
- return `tuple(l)`
-
- def erase_valeur(self):
- """
- Efface les entries de saisie
- """
- self.typ_cplx.set('RI')
- self.entry1.delete(0,END)
- self.entry2.delete(0,END)
-
- def valid_complexe(self):
- valeurentree=self.entry3.get()
- self.valid_valeur(valeurentree=valeurentree)
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from uniquepanel import UNIQUE_Panel
-
-class UNIQUE_INTO_Panel(UNIQUE_Panel):
- """
- Classe définissant le panel associé aux mots-clés qui demandent
- à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
- discrètes
- """
- def makeValeurPage(self,page):
- """
- Génère la page de saisie d'une seule valeur parmi un ensemble
- discret de possibles
- """
- # récupération de la bulle d'aide et de l'objet mc
- bulle_aide=self.get_bulle_aide()
- objet_mc = self.node.item.get_definition()
- # remplissage du panel
- self.frame_valeur = Frame(page)
- self.frame_valeur.pack(fill='both',expand=1)
- self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide :
- s.parent.appli.affiche_aide(e,a))
- self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
- #l_choix=list(objet_mc.into)
- #l_choix.sort()
- l_choix=self.node.item.get_liste_possible([])
- self.label = Label(self.frame_valeur,text='Choisir une valeur :')
- self.label.pack(side='top')
- self.frame = Frame(page)
- self.frame.place(relx=0.33,rely=0.2,relwidth=0.33,relheight=0.6)
-
-
- liste_commandes = (("<Button-1>",self.selectChoix),
- ("<Button-3>",self.deselectChoix),
- ("<Double-Button-1>",self.record_valeur))
- self.Liste_choix = ListeChoix(self,self.frame,l_choix,
- liste_commandes = liste_commandes,
- titre="Valeurs possibles",optionReturn="oui")
- self.Liste_choix.affiche_liste()
- self.bouton_val = Button(self.frame_valeur,
- text = "Valider",
- command=self.record_valeur_ligne,
- width=14)
- self.bouton_val.place(relx=0.33,rely=0.85)
-
- def record_valeur_ligne(self):
- valeur=self.Liste_choix.arg_selected
- self.record_valeur(valeur)
-
- def get_bulle_aide(self):
- """
- Retourne la bulle d'aide affectée au panneau courant (affichée par clic droit)
- """
- return """Double-cliquez sur la valeur désirée
- pour valoriser le mot-clé simple courant"""
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from newsimppanel import newSIMPPanel
-
-
-class UNIQUE_Panel(newSIMPPanel):
- """
- Classe virtuelle servant de classe mère à toutes celles définissant un panneau
- permettant l'affichage et la saisie d'une valeur unique pour le mot-clé simple
- """
-
- def erase_valeur(self):
- """
- Efface l'entry de saisie
- """
- self.entry.delete(0,END)
-
- def get_valeur(self):
- """
- Retourne la valeur donnée par l'utilisateur
- """
- return self.entry.get()
-
-
- def valid_valeur(self,valeurentree=None):
- """
- 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()
- anc_val = self.node.item.get_valeur()
- if valeurentree== None :
- valeurentree = self.get_valeur()
- valeur,validite=self.node.item.eval_valeur(valeurentree)
- if not validite :
- commentaire = "impossible d'évaluer : %s " %`valeurentree`
- self.display_valeur()
- self.parent.appli.affiche_infos(commentaire)
- return
-
- test = self.node.item.set_valeur(valeur)
- if test :
- self.set_valeur_texte(str(valeurentree))
-
- if not test :
- mess = "impossible d'évaluer : %s " %`valeur`
- self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée : "+mess)
- elif self.node.item.isvalid() :
- self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
- else :
- cr = self.node.item.get_cr()
- mess = "Valeur du mot-clé non autorisée "+cr.get_mess_fatal()
- self.reset_old_valeur(anc_val,mess=mess)
-
- self.display_valeur()
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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,os
-from Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from uniqueassdpanel import UNIQUE_ASSD_Panel
-
-
-class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
- """
- Classe servant à définir le panneau correspondant à un mot-clé simple
- qui attend une valeur unique de type dérivé d'ASSD ou non encore
- existante (type CO(...) utilisé dans les macros uniquement)
- """
- def makeValeurPage(self,page):
- """
- Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une SD de type dérivé
- d'ASSD
- """
- # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
- # et de la liste des SD du bon type (constituant la liste des choix)
- bulle_aide=self.get_bulle_aide()
- aide=self.get_aide()
- aide= justify_text(texte=aide)
- liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
- # Remplissage du panneau
- self.frame_valeur = Frame(page)
- self.frame_valeur.pack(fill='both',expand=1)
- self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
- self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
- # affichage de la liste des SD existantes et du bon type
- self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
- items=liste_noms_sd,
- labelpos='n',
- label_text="Structures de données du type\n requis par l'objet courant :",
- listbox_height = 6,
- selectioncommand=self.select_valeur_from_list,
- dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
- self.listbox.component("listbox").bind("<Return>",lambda e,s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
- if liste_noms_sd != [] :
- self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
- self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ", items = ('NON','OUI'),
- menubutton_width=10)
- else :
- self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ", items = ('OUI',),
- menubutton_width=10)
- # affichage du bouton 'Nouveau concept'
- self.b_co.configure(command = self.ask_new_concept)
- if liste_noms_sd != [] :
- self.b_co.place(relx=0.05,rely=0.6,anchor='w')
- else :
- self.b_co.place(relx=0.05,rely=0.3,anchor='w')
- self.label_co = Label(self.frame_valeur,text='Nom du nouveau concept :')
- self.entry_co = Entry(self.frame_valeur)
- self.entry_co.bind('<Return>',self.valid_nom_concept_co)
- self.entry_co.bind('<KP_Enter>',self.valid_nom_concept_co)
- # affichage du label de la structure de donnée choisie
- 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.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.but_val = Button(self.fr_but,text = "Valider",command= self.valid_nom_concept_co)
- self.but_val.pack(side='right',padx=5, pady=5)
-
- # affichage de la valeur courante
- self.display_valeur()
- if liste_noms_sd == [] :
- self.b_co.invoke('OUI')
-
- def get_bulle_aide(self):
- """
- Retourne la bulle d'aide du panneau
- """
- return """Double-cliquez sur la structure de donnée désirée
- 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()
- #print "valid_valeur",valeur
-
- self.erase_valeur()
- anc_val = self.node.item.get_valeur()
- test_CO=self.node.item.is_CO(anc_val)
- #PN essai pour bug dans MACRO_PROJ_BASE
- valeur,validite=self.node.item.eval_valeur(valeur)
- 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
- #PN essai pour bug dans MACRO_PROJ_BASE
- #elif self.node.item.isvalid() :
- elif validite:
- 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.reset_old_valeur(anc_val,mess=mess)
- return
-
- 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
- """
- #print "valid_nom_concept_co"
- if self.parent.modified == 'n' : self.parent.init_modif()
- anc_val = self.node.item.get_valeur()
- if anc_val != None:
- # 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()
- nom_concept = self.entry_co.get()
- #print "valid_nom_concept_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.reset_old_valeur(anc_val,mess=mess)
- return
-
- def ask_new_concept(self,tag):
- """
- Crée une entry dans le panneau d'un MCS qui attend un concept OU un CO() afin de
- permettre à l'utilisateur de donner le nom du nouveau concept
- """
- new_concept = self.b_co.getcurselection()
- if new_concept == 'OUI':
- self.label_co.place(relx=0.05,rely=0.7)
- self.entry_co.place(relx=0.45,rely=0.7,relwidth=0.25)
- self.l_resu.place_forget()
- self.label_valeur.place_forget()
- self.entry_co.focus()
- elif new_concept == 'NON':
- # On est passe de OUI à NON, on supprime la valeur
-# PN correction de bug (on passe de non a non et cela supprime la valeur)
-# ajout du if de le ligne suivane
- if self.node.item.is_CO():
- 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)
- self.label_valeur.place(relx=0.45,rely=0.7)
-
- def display_valeur(self):
- """
- Affiche la valeur de l'objet pointé par self
- """
- valeur = self.node.item.get_valeur()
- #print "display_valeur",valeur
- 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 self.node.item.is_CO():
- #print "display_valeur.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.isvalid():
- self.node.parent.select()
-
-
+++ /dev/null
-# -*- coding: utf-8 -*-
-# 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.
-#
-#
-# ======================================================================
-# ----------------------------------------------------------
-# Cette classe sert à définir les widgets utilisés par
-# EFICAS
-# ----------------------------------------------------------
-
-import Tkinter
-from Tkinter import *
-import Pmw
-import os,sys,re,string
-import types,fnmatch
-import traceback
-from tkFileDialog import *
-from tkMessageBox import showinfo,askyesno,showerror,askretrycancel
-
-import fontes
-import prefs
-from utils import save_in_file
-from centerwindow import centerwindow
-
-from Noyau.N_utils import repr_float
-from Accas import AsException
-
-# Surcharge de la fonction askyesno qui retourne un resultat errone en Python 2.3 avec Tk 8.4
-# et Tkinter.wantobject==1
-import tkMessageBox
-def askyesno(title=None, message=None, **options):
- "Ask a question; return true if the answer is yes"
- s = tkMessageBox._show(title, message, tkMessageBox.QUESTION, tkMessageBox.YESNO, **options)
- if s == tkMessageBox.YES:return 1
- if s == tkMessageBox.NO:return 0
- if s:return 1
- return 0
-
-
-class Fenetre :
- """ Cette classe permet de créer une fenêtre Toplevel dans laquelle
- on peut afficher un texte et qui permet de le sauver"""
- def __init__(self,appli,titre="",texte="",wrap=WORD,width=100,height=30):
- self.appli=appli
- if self.appli.test==1 : return
- self.fenetre = Toplevel()
- self.fenetre.withdraw()
- #self.fenetre.configure(width = 800,height=500)
- self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
- self.fenetre.title("Visualisation du "+titre)
- self.texte = string.replace(texte,'\r\n','\n')
- self.titre = titre
- fonte=fontes.standardcourier10
- # définition des frames
- self.frame_texte = Frame(self.fenetre)
- self.frame_boutons = Frame(self.fenetre)
- #self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.9)
- #self.frame_boutons.place(relheight=0.1,relx=0,rely=0.9,relwidth=1.)
- # définition de la zone texte et du scrollbar
- self.zone_texte = Text(self.frame_texte,font=fonte,wrap=wrap,
- height=height,width=width)
- self.zone_texte.bind("<Key-Prior>", self.page_up)
- self.zone_texte.bind("<Key-Next>", self.page_down)
- self.zone_texte.bind("<Key-Up>", self.unit_up)
- self.zone_texte.bind("<Key-Down>", self.unit_down)
- self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
- #self.scroll_h = Scrollbar (self.frame_texte,command = self.zone_texte.xview)
- self.scroll_v.pack(side='right',fill ='y')
- #self.scroll_h.pack(side='bottom',fill ='x')
- self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
- self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
- # définition des boutons
- self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit,
- default='active')
- self.but_save = Button(self.frame_boutons,text = "Sauver",command = self.save)
- #self.but_quit.place(relx=0.4,rely=0.5,anchor='center')
- #self.but_save.place(relx=0.6,rely=0.5,anchor='center')
- self.but_quit.pack(side='left',padx=25, pady=5)
- self.but_save.pack(side='right',padx=25, pady=5)
- self.frame_texte.pack(side='top',fill='both',expand=1)
- self.frame_boutons.pack(side='bottom')
- self.zone_texte.focus_set()
- self.fenetre.bind('<Return>',self.quit) #dismiss window
-
- # affichage du texte
- self.affiche_texte(self.texte)
- self.zone_texte.config(state=DISABLED)
- centerwindow(self.fenetre)
- self.fenetre.deiconify()
-
- def page_up(self,event):
- event.widget.yview_scroll(-1, "page")
- return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
- def page_down(self,event):
- event.widget.yview_scroll(1, "page")
- return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
- def unit_up(self,event):
- event.widget.yview_scroll(-1, "unit")
- return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
- def unit_down(self,event):
- event.widget.yview_scroll(1, "unit")
- return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
-
- def wait(self):
- self.fenetre.grab_set()
- self.zone_texte.focus_set()
- self.fenetre.wait_window(self.fenetre)
-
- def quit(self,event=None):
- self.fenetre.destroy()
- return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
-
- def efface_scroll(self):
- """ Efface le scroll lorsqu'il n'est pas nécessaire : ne marche pas"""
- self.scroll_v.pack_forget()
- #self.scroll_h.pack_forget()
-
- def affiche_texte(self,texte):
- """ Affiche le texte dans la fenêtre """
- if texte != "" :
- self.zone_texte.insert(END,texte)
- try:
- self.fenetre.update_idletasks()
- x0,y0,x1,y1 = self.zone_texte.bbox(END)
- if (y1-y0) < 300 : self.efface_scroll()
- except:
- pass
-
- def save(self):
- """ Permet de sauvegarder le texte dans un fichier dont on a demandé le nom
- à l'utilisateur """
- file = asksaveasfilename(parent=self.fenetre,defaultextension = '.comm',
- #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,None) :
- showerror("Sauvegarde impossible",
- "Impossible de sauvegarder le texte dans le fichier spécifié\n"+
- "Vérifiez les droits d'écriture",parent=self.fenetre)
- else:
- showinfo("Sauvegarde effectuée","Sauvegarde effectuée dans le fichier %s" %file,parent=self.fenetre)
-
- def destroy(self):
- try :
- self.fenetre.destroy()
- except :
- pass
-
-class FenetreSurLigneWarning(Fenetre):
-
- def affiche_texte(self,texte):
- """ Affiche le texte dans la fenêtre """
- ligne=0
- if texte != "" :
- texte_cr=texte.splitlines()
- for l in texte_cr:
- ligne=ligne+1
- l=l+"\n"
- self.zone_texte.insert(END,l)
- if (l.find("WARNING") > -1) or (l.find("ERROR") > -1) :
- self.zone_texte.tag_add( "Rouge", str(ligne)+".0", "end-1c" )
- self.zone_texte.tag_config("Rouge", foreground='red')
- try:
- self.fenetre.update_idletasks()
- x0,y0,x1,y1 = self.zone_texte.bbox(END)
- if (y1-y0) < 300 : self.efface_scroll()
- except:
- pass
-
-class FenetreYesNo(Fenetre):
- def __init__(self,appli,titre="",texte="",yes="Yes",no="No"):
- self.appli=appli
- self.fenetre = Toplevel()
- self.fenetre.configure(width = 800,height=500)
- self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
- self.fenetre.title(titre)
- self.texte = string.replace(texte,'\r\n','\n')
- self.titre = titre
- fonte=fontes.standardcourier10
- # définition des frames
- self.frame_texte = Frame(self.fenetre)
- self.frame_boutons = Frame(self.fenetre)
- self.frame_boutons.place(relx=0,rely=0, relwidth=1.,relheight=0.1)
- self.frame_texte.place( relx=0,rely=0.1, relwidth=1, relheight=0.9)
- # définition de la zone texte et du scrollbar
- self.zone_texte = Text(self.frame_texte,font=fonte)
- self.zone_texte.bind("<Key-Prior>", self.page_up)
- self.zone_texte.bind("<Key-Next>", self.page_down)
- self.zone_texte.bind("<Key-Up>", self.unit_up)
- self.zone_texte.bind("<Key-Down>", self.unit_down)
- self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
- #self.scroll_h = Scrollbar (self.frame_texte,command = self.zone_texte.xview)
- self.scroll_v.pack(side='right',fill ='y')
- #self.scroll_h.pack(side='bottom',fill ='x')
- self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
- self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
- # définition des boutons
- self.but_yes = Button(self.frame_boutons,text = yes,command=self.yes)
- self.but_no = Button(self.frame_boutons,text = no,command = self.no)
- self.but_yes.place(relx=0.4,rely=0.5,anchor='center')
- self.but_no.place(relx=0.6,rely=0.5,anchor='center')
- # affichage du texte
- self.affiche_texte(self.texte)
- centerwindow(self.fenetre)
-
- def yes(self):
- self.result=1
- self.quit()
-
- def no(self):
- self.result=0
- self.quit()
-
-class FenetreDeSelection(Fenetre):
- """ Classe dérivée de Fenêtre permettant la récupération d'une zone de texte sélectionnée.
- Cette classe est utilisée pour affecter une liste de valeurs à un mot-clé.
- """
- def __init__(self,panel,item,appli,titre="",texte="",cardinal=1):
- Fenetre.__init__(self,appli,titre=titre,texte=texte)
- self.frame_boutons.place_forget()
- self.frame_texte.place_forget()
- self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.8)
- self.frame_boutons.place(relheight=0.2,relx=0,rely=0.8,relwidth=1.)
-
- self.cardinal=cardinal
- self.fenetre.configure(width = 320,height=400)
- centerwindow(self.fenetre)
- self.panel = panel
- self.item = item
- self.fenetre.title(titre)
- self.but_save.configure(text="Ajouter",command=self.traite_selection)
- # séparateur par défaut
- self.separateur = ';'
- # création de la zone de saisie du séparateur
- l_separateurs_autorises = self.get_separateurs_autorises()
- self.choix_sep = Pmw.ComboBox(self.frame_boutons,
- label_text = "Séparateur :",
- labelpos = 'w',
- listheight = 100,
- selectioncommand = self.choose_separateur,
- scrolledlist_items = l_separateurs_autorises)
- self.choix_sep.component('entry').configure(width=6)
- self.choix_sep.place(relx=0.01,rely=0.5,anchor='w')
- self.choix_sep.selectitem(self.separateur)
- # Replacement
- self.but_quit.place_forget()
- self.but_save.place_forget()
- self.but_all = Button(self.frame_boutons,text = "Tout Sélectionner", command=self.tout)
- self.but_save.place(relx=0.6,rely=0.6,anchor='center')
- self.but_quit.place(relx=0.8,rely=0.6,anchor='center')
- self.but_all.place(relx=0.7,rely=0.2,anchor='center')
- self.choose_separateur('espace')
-
-
- def get_separateurs_autorises(self):
- """
- Retourne la liste des séparateurs autorisés
- """
- return ['espace',';',',']
-
- def choose_separateur(self,nom_sep):
- """
- Affecte à self.separateur le caractère séparateur correspondant à nom_sep
- """
- if nom_sep == 'espace' :
- self.separateur = ' '
- else:
- self.separateur = nom_sep
-
- def tout(self):
- liste=[]
- texte=self.texte.splitlines()
- for l in texte :
- for mot in string.split(l,self.separateur):
- if mot != '' and mot != ' ' and mot != self.separateur :
- liste.append(mot)
- self.traite_selection(liste)
-
- def traite_selection(self,liste=None):
- """ Cette méthode effectue tous les traitements nécessaires pour vérifier
- et affecter la liste de valeurs à l'objet réprésenté par self.item
- """
- # Récupère la liste des chaines de caractères de la zone sélectionnée
- message=""
- if liste == None:
- message,liste = self.recupere_liste()
- if self.test_probleme(message,"Sélectionnez des données") == 0:
- return
- # Vérifie que le nombre de données est dans les limites attendues
- message = self.verif_liste(liste)
- if self.test_probleme(message,"Vérifiez le nombre de données") == 0:
- return
- # Crée une liste de valeurs du type attendu
- message,liste_valeurs = self.creation_liste_valeurs(liste)
- if self.test_probleme(message,"Vérifiez le type des données") == 0:
- return
- # Vérifie que chaque valeur est dans le domaine exigé
- message = self.verif_valeurs(liste_valeurs)
- if self.test_probleme(message,"Vérifiez le domaine des valeurs") == 0:
- return
- # Ajoute les valeurs dans la liste de valeurs du mot-clé
- if self.cardinal != 1 :
- nb=self.cardinal
- l_valeurs=[]
- # a ameliorer
- if (len(liste_valeurs)%nb != 0):
- message="La cardinalité n'est pas correcte"
- self.test_probleme(message,"On attend des tuples")
- return
- for i in range(len(liste_valeurs)/nb) :
- if (nb==2):
- t=(liste_valeurs[i*nb], liste_valeurs[i*nb+1])
- elif (nb ==3):
- t=(liste_valeurs[i*nb], liste_valeurs[i*nb+1], liste_valeurs[i*nb+2])
- else :
- print "probleme : prevenir la maintenance Eficas"
- return
- l_valeurs.append(t)
- liste_valeurs=l_valeurs
- self.ajouter_valeurs(liste_valeurs)
- self.appli.affiche_infos("Liste de valeurs acceptée")
-
- def test_probleme(self, message, message_eficas):
- """ Cette méthode affiche un message d'erreur si message != ''
- et retourne 0, sinon retourne 1 sans rien afficher.
- """
- if message != "":
- showinfo("Problème",message,parent=self.fenetre)
- self.fenetre.tkraise()
- self.appli.affiche_infos(message_eficas)
- return 0
- else:
- return 1
-
- def recupere_liste(self):
- """ Cette méthode récupère le texte de la zone sélectionnée, construit et
- retourne une liste avec les chaines qui se trouvent entre les séparateurs.
- S'il n'y a pas de données selectionnées, elle retourne un message d'erreur
- et une liste vide.
- """
- message = ""
- try:
- selection=self.fenetre.selection_get()
- except:
- message = "Pas de donnée sélectionnée"
- return message,None
- # les retours chariots doivent être interprétés comme des séparateurs
- selection = string.replace(selection,'\n',self.separateur)
- # on splitte la sélection suivant le caractère séparateur
- liste_chaines = string.split(selection,self.separateur)
- l_chaines = []
- for chaine in liste_chaines:
- chaine = string.strip(chaine)
- if chaine != '' : l_chaines.append(chaine)
- return message,l_chaines
-
- def verif_liste(self, liste):
- """ Cette méthode effectue des tests sur le nombre d'éléments de la liste
- et retourne 1 si la liste est correcte, sinon 0 et le message d'erreur
- correspondant.
- """
- message = ""
- # nombre d'éléments sélectionnés
- nombre_elements = len(liste)
- # nombre d'éléments déja dans la liste du panel
- nombre_in_liste = len(self.panel.Liste_valeurs.get_liste())
- multiplicite = self.item.GetMultiplicite()
- if (nombre_elements % multiplicite) != 0:
- message = "Vous devez sélectionner "+str(multiplicite)+" * n données"
- return message
- nombre_valeurs = nombre_elements / multiplicite
- cardinalite = self.item.GetMinMax()
- if nombre_valeurs < cardinalite[0]:
- message = "Vous devez sélectionner au moins "+str(cardinalite[0])+" valeurs"
- return message
- if cardinalite[1] != "**" and nombre_valeurs > (long(cardinalite[1])-nombre_in_liste):
- message = "La liste ne peut avoir plus de "+str(cardinalite[1])+" valeurs"
- return message
-
- return message
-
- def creation_liste_valeurs(self, liste):
- """ Cette méthode crée et retourne une liste de valeurs du type attendu
- par le mot-clé. La liste de valeurs est créée à partir de la liste
- de chaines de caractères transmise.
- """
- type_attendu = self.item.GetType()[0]
- if type_attendu == 'R':
- return self.convertir(liste, f_conversion= float)
- elif type_attendu == 'I':
- return self.convertir(liste, f_conversion= int)
- elif type_attendu == 'TXM':
- return self.convertir(liste)
- else:
- message = "Seuls les entiers, les réels et les chaines de caractères sont convertis"
- return message,None
-
- def convertir(self, liste, f_conversion=None):
- """ Cette méthode essaie de convertir les éléments de la liste avec la
- fonction f_conversion si elle existe, et retourne la liste des
- éléments dans le type voulu en cas de succès, sinon retourne None.
- """
- liste_valeurs = []
- message = ""
- for chaine in liste:
- if f_conversion:
- try:
- liste_valeurs.append(f_conversion(chaine))
- except:
- message = "Impossible de convertir "+chaine+" dans le type attendu"
- return message,None
- else:
- liste_valeurs.append(chaine)
- return message,liste_valeurs
-
- def verif_valeurs(self, liste_valeurs):
- """ Cette méthode teste la validité de tous les éléments de la liste,
- retourne un message vide s'ils sont valides
- ou un message non vide au premier élément non valide rencontré
- """
- message = ""
- for valeur in liste_valeurs:
- test,message = self.item.object.verif_type(valeur)
- if test == 0: return message
- return message
-
- def ajouter_valeurs(self, liste_valeurs):
- """ Cette méthode ajoute les nouvelles valeurs à la liste existante."""
- liste = self.panel.Liste_valeurs.get_liste()
- liste.extend(liste_valeurs)
- self.panel.Liste_valeurs.put_liste(liste)
-
-class FenetreDeParametre(Fenetre) :
- def __init__(self,parent,item,appli,texte):
- self.parent=parent
- self.appli=appli
- self.fenetre = Toplevel()
- self.fenetre.configure(width = 250,height=100)
- self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
- self.fenetre.title("Parametres")
- self.titre = "Parametres"
- self.texte = string.replace(texte,'\r\n','\n')
- fonte=fontes.standardcourier10
-
- # définition des frames
- self.frame_texte = Frame(self.fenetre)
- self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.7)
- # définition de la zone texte et du scrollbar
- self.zone_texte = Text(self.frame_texte,font=fonte)
- self.zone_texte.bind("<Key-Prior>", self.page_up)
- self.zone_texte.bind("<Key-Next>", self.page_down)
- self.zone_texte.bind("<Key-Up>", self.unit_up)
- self.zone_texte.bind("<Key-Down>", self.unit_down)
- self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
- self.scroll_v.pack(side='right',fill ='y')
- self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
- self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
- # affichage du texte
- self.affiche_texte(self.texte)
- self.zone_texte.config(state="disabled")
-
- # définition des boutons
- self.frame_boutons = Frame(self.fenetre)
- self.frame_boutons.place(relheight=0.3,relx=0,rely=0.65,relwidth=1.)
- self.label1 = Label(self.frame_boutons,text="surligner la")
- self.label2 = Label(self.frame_boutons,text="ligne entière")
- self.label1.place(relx=0.1,rely=0)
- self.label2.place(relx=0.1,rely=0.5)
- self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit)
- self.but_save = Button(self.frame_boutons,text = "Choisir",command = self.Choisir)
- self.but_save.place(relx=0.6,rely=0,relheight=1)
- self.but_quit.place(relx=0.8,rely=0,relheight=1)
-
-
- def Choisir(self):
- try:
- selection=self.zone_texte.selection_get()
- except:
- showerror("Pas de donnée sélectionnée",
- "Selectionner un parametre")
- l_param = ""
- for param in selection.splitlines():
- nomparam=param[0:param.find("=")-1]
- if nomparam != '' :
- l_param=l_param+nomparam+','
- self.parent.entry.delete(0,Tkinter.END)
- self.parent.entry.insert(0,l_param[0:-1])
- self.parent.valid_valeur()
- self.quit()
-
-class Formulaire:
- """
- Cette classe permet de créer une boîte Dialog dans laquelle
- on affiche un formulaire à remplir par l'utilisateur
- """
- def __init__(self,fen_pere,obj_pere=None,titre="",texte="",items=(),mode='query',commande=None):
- self.resultat=0
- if items in ((),[]) : return
- self.items = items
- self.titre = titre
- self.texte = texte
- self.fen_pere = fen_pere
- self.obj_pere = obj_pere
- self.mode= mode
- self.command = commande
- self.display()
-
- def display(self):
- self.init_validateurs()
- self.init_fenetre()
- self.init_texte()
- self.init_items_formulaire()
- self.fenetre.activate(geometry='centerscreenalways')
-
- def init_validateurs(self):
- """
- Crée le dictionnaire des validateurs des objets reconnus par le formulaire
- """
- self.d_validateurs = {}
- self.d_validateurs['rep'] = self.repvalidator
- self.d_validateurs['file'] = self.filevalidator
- self.d_validateurs['cata']= self.catavalidator
- self.d_validateurs['mot']= self.motvalidator
- self.d_validateurs['mot2']= self.mot2validator
- self.d_validateurs['mot3']= self.mot3validator
- self.d_validateurs['mot4']= self.mot4validator
-
- def init_fenetre(self):
- """
- Crée la fenêtre Dialog
- """
- if self.mode == 'query':
- buttons=('Valider','Annuler')
- defaultbutton = 'Valider'
- elif self.mode == 'display':
- if self.command :
- buttons=(self.command[0],'OK')
- defaultbutton = 'OK'
- else:
- buttons=('OK')
- defaultbutton = 'OK'
- self.fenetre = Pmw.Dialog(self.fen_pere,
- buttons=buttons,
- defaultbutton = defaultbutton,
- title = self.titre,
- command = self.execute)
- self.fenetre.withdraw()
-
- def init_texte(self):
- """
- Crée le label qui affiche le texte à l'intérieur du panneau
- """
- fonte=fontes.standard
- fr_texte = Frame(self.fenetre.interior(),height=60)
- fr_texte.pack(side='top',fill='x',expand=1)
- Label(fr_texte,text = self.texte, font=fonte).place(relx=0.5,rely=0.5,anchor='center')
-
- def init_items_formulaire(self):
- """
- Crée et affiche les items dans la boîte de dialogue
- """
- self.radiobut = 0
- self.widgets = []
- self.item_widgets = {}
- length_maxi = 0
- for item in self.items:
- if len(item[0])>length_maxi : length_maxi = len(item[0])
- window = self.fenetre.interior()
- for item in self.items :
- if len(item) == 4 :
- label,nature,nom_var,defaut = item
- chaine="Yes"
- chaine2="No"
- else :
- label,nature,nom_var,defaut,chaine,chaine2 = item
-
- # création de la frame
- fr_item = Frame(window,height=40,width=700)
- fr_item.pack(side='top',fill='x',expand=1)
- # création du label
- Label(fr_item,text = label).place(relx=0.05,rely=0.4)
- if nature in ('rep','file','cata','mot','mot2','mot3','mot4'):
- # création de l'entry
- e_item = Entry(fr_item)
- e_item.place(relx=0.5,rely=0.4,relwidth=0.45)
- self.widgets.append(e_item)
- self.item_widgets[item] = e_item
- if defaut : e_item.insert(0,str(defaut))
- elif nature == 'YesNo':
- # création de la StringVar
- var = StringVar()
- setattr(self,'item_'+nom_var,var)
- var.set(defaut)
- # création du radiobouton
- rb1 = Radiobutton(fr_item,text=chaine,variable=var,value='OUI')
- rb2 = Radiobutton(fr_item,text=chaine2,variable=var,value='NON')
- rb1.place(relx=0.65,rely=0.5,anchor='center')
- rb2.place(relx=0.80,rely=0.5,anchor='center')
- self.widgets.append((rb1,rb2))
- self.item_widgets[item] = var
- # détermination de la méthode à appliquer sur les boutons
- if self.mode == 'query':
- function = self.active
- elif self.mode == 'display':
- function = self.inactive
- else:
- return
- # on applique la méthode sur les boutons (activation ou désactivation)
- for widget in self.widgets :
- if type(widget) == types.TupleType:
- for widg in widget :
- apply(function,(widg,),{})
- else:
- apply(function,(widget,),{})
-
- def active(self,widget):
- """
- Active le widget passé en argument
- """
- widget.configure(state='normal',bg='white')
-
- def inactive(self,widget):
- """
- Inactive le widget passé en argument
- """
- if not isinstance(widget,Radiobutton) :
- widget.configure(state='disabled',bg='gray95')
- else :
- widget.configure(state='disabled')
-
-# --------------------------------------------------------------------------------
-# Validateurs des noms de répertoire, de fichiers et de catalogues
-# -------------------------------------------------------------------------------
-
- def motvalidator(self,text):
- text2="("+text+")"
- return self.motlongueurvalidator(text2,1)
-
- def mot2validator(self,text):
- return self.motlongueurvalidator(text,2)
-
- def mot3validator(self,text):
- return self.motlongueurvalidator(text,3)
-
- def mot4validator(self,text):
- return self.motlongueurvalidator(text,4)
-
- def motlongueurvalidator(self,text,longueur):
- try :
- if ((text[0] != "(") or (text[-1] != ")")) : return 0
- if len(text.split(",")) != longueur : return 0
- return 1
- except :
- return 0
-
- def repvalidator(self,text):
- """
- Teste si text peut faire référence à un répertoire ou non
- Retourne 1 si valide, 0 sinon
- """
- return os.path.isdir(text),'Répertoire introuvable : %s' %text
-
- def filevalidator(self,text):
- """
- Teste si text peut faire référence à un fichier ou non
- Retourne 1 si valide, 0 sinon
- """
- return os.path.isfile(text),'Fichier introuvable : %s' %text
-
- def catavalidator(self,text):
- """
- Teste si text est un chemin d'accès valide à un catalogue
- Retourne 1 si valide, 0 sinon
- """
- return os.path.isfile(text),"Catalogue introuvable : %s" %text
-
-# --------------------------------------------------------------------------------
-# Méthodes callbacks des boutons et de fin
-# --------------------------------------------------------------------------------
-
- def execute(self,txt):
- """
- Cette commande est activée à chaque clic sur un bouton.
- Redirige l'action sur la bonne méthode en fonction du bouton activé
- """
- if txt == 'Valider':
- self.fini()
- elif txt in ('OK','Annuler'):
- self.quit()
- elif txt == 'Modifier':
- self.resultat = apply(self.command[1],(),{})
- self.fenetre.destroy()
- else :
- print "Nom de bouton inconnu"
- self.quit()
-
- def fini(self):
- """
- Commande qui termine le panneau et sauvegarde les nouvelles options
- dans l'objet resultat (dictionnaire)
- """
- dico={}
- for item,widget in self.item_widgets.items():
- nom_var = item[2]
- type_var = item[1]
- valeur = widget.get()
- if self.d_validateurs.has_key(type_var):
- test = self.d_validateurs[type_var](valeur)
- if not test :
- # une entrée n'est pas valide --> on la met en surbrillance et on quitte la méthode
- # sans tuer la fenêtre bien sûr
- widget.selection_range(0,END)
- return
- dico[nom_var] = valeur
- self.fenetre.destroy()
- self.resultat=dico
-
- def quit(self):
- self.fenetre.destroy()
- self.resultat=None
-
-class ListeChoix :
- """ Cette classe est utilisée pour afficher une liste de choix passée en paramètre
- en passant les commandes à lancer suivant différents bindings """
- def __init__(self,parent,page,liste,liste_commandes=[],liste_marques =[],active ='oui',filtre='non',titre='',
- optionReturn=None, fonte_titre=fontes.standard_gras_souligne):
- self.parent = parent
- self.page = page
- self.liste = liste
- self.dico_labels={}
- self.dico_mots={}
- self.nBlabel = 0
- self.dico_place={}
- self.dico_mots={}
- 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.optionReturn = optionReturn
- self.fonte_titre=fonte_titre
- self.init()
-
- def init(self):
- self.make_label_titre()
- self.make_entry_filtre()
- self.make_text_box()
- try:
- self.entry.component('entry').focus()
- except:
- pass
-
- def make_label_titre(self):
- """ Crée le label correspondant au titre """
- if self.titre == '' : return
- self.label = Label(self.page,
- text = self.titre,
- font = self.fonte_titre)
- self.label.pack(side='top',pady=2)
-
- def make_entry_filtre(self):
- """ Crée l'entry permettant à l'utilisateur d'entrer un filtre de sélection dans la liste """
- if self.filtre != 'oui' : return
- self.entry = Pmw.EntryField(self.page,labelpos='w',
- label_text="Filtre :",
- command=self.entry_changed)
- self.entry.pack(side='top',pady=2)
-
- def make_text_box(self):
- """ Crée la fenêtre texte dans laquelle sera affichée la liste """
- self.MCbox = Text (self.page,relief='sunken',bg='gray95',bd=2)
- self.MCscroll = Scrollbar (self.page,command = self.MCbox.yview)
- self.MCscroll.pack(side='right',fill ='y',pady=2)
- self.MCbox.pack(fill='y',expand=1,padx=2,pady=2)
- self.MCbox.configure(yscrollcommand=self.MCscroll.set)
-
-
- def affiche_liste(self):
- """ Affiche la liste dans la fenêtre"""
- liste_labels=[]
- self.MCbox.config(state=NORMAL)
- self.MCbox.delete(1.0,END)
- self.nBlabel = 0
- self.dico_place={}
- for objet in self.liste :
- if type(objet) == types.InstanceType:
- try:
- mot = objet.nom
- except:
- mot = str(objet)
- elif type(objet) in (types.StringType,types.IntType):
- mot = objet
- elif type(objet) == types.FloatType :
- mot = self.parent.get_valeur_texte(objet)
- if mot == "" :
- mot = str(objet)
- elif type(objet) == types.TupleType :
- mot="("
- premier=1
- for val in objet:
- if (not premier):
- mot=mot+","
- else:
- premier=0
- valtexte = self.parent.get_valeur_texte(val)
- if valtexte != "" :
- mot=mot+valtexte
- else:
- mot=mot+str(val)
- mot=mot+")"
- else:
- mot=`objet`
- label = Label(self.MCbox,
- text = mot,
- fg = 'black',bg = 'gray95',justify = 'left')
- self.dico_labels[mot]=label
- self.dico_place[mot]=self.nBlabel
- self.dico_mots[label]=mot
- self.nBlabel=self.nBlabel+1
- liste_labels.append(label)
- self.MCbox.window_create(END,
- window=label,
- stretch = 1)
- self.MCbox.insert(END,'\n')
- if self.optionReturn != None :
- label.bind("<Return>",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c))
- label.bind("<KP_Enter>",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c))
- label.bind("<Key-Right>",lambda e,s=self,x=objet,l=label : s.selectNextItem(x,l))
- label.bind("<Key-Down>",lambda e, s=self,x=objet,l=label : s.selectNextItem(x,l))
- label.bind("<Key-Left>" ,lambda e,s=self,x=objet,l=label : s.selectPrevItem(x,l))
- label.bind("<Key-Up>" ,lambda e,s=self,x=objet,l=label : s.selectPrevItem(x,l))
- if self.active == 'oui':
- label.bind(self.liste_commandes[0][0],lambda e,s=self,c=self.liste_commandes[0][1],x=objet,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=objet,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=objet,l=label : s.chooseitem(x,l,c))
-
- for marque in self.liste_marques:
- try:
- self.markitem(liste_labels[marque])
- except:
- pass
-
- self.MCbox.config(state=DISABLED)
- self.selection = None
- self.dontselect=0
- for event,callback in self.liste_commandes:
- if event == "<Enter>":
- self.selection=None,None,callback
- break
-
- def clear_marque(self):
- try:
- self.dico_labels[self.arg_selected].configure(bg='gray95',fg='black')
- self.arg_selected = ''
- except :
- pass
-
- def surligne(self,marque):
- try :
- self.highlightitem(self.dico_labels[marque])
- self.arg_selected = marque
- except:
- pass
-
- def chooseitemsurligne(self,mot,label,commande):
- """ Active la méthode de choix passée en argument"""
- try:
- mot=self.arg_selected
- commande(mot)
- except AsException,e:
- raison=str(e)
- showerror(raison.split('\n')[0],raison)
-
- def chooseitem(self,mot,label,commande):
- """ Active la méthode de choix passée en argument"""
- try:
- commande(mot)
- except AsException,e:
- raison=str(e)
- showerror(raison.split('\n')[0],raison)
-
- def afficheMot(self,mot):
- """ Pour contourner le bug sur l index
- on commence par la methode dite normale
- puis par la methode de contournement
- puis rien du tout
- """
- try:
- labelsuivant=self.dico_labels[mot]
- index = self.MCbox.index(labelsuivant)
- self.MCbox.see(index)
- except :
- posmot=self.dico_place[mot]
- totale=self.nBlabel + 0.0
- self.MCbox.yview_moveto(posmot/totale)
-
- def selectNextItem(self,mot,label):
- index=self.liste.index(mot)
- indexsuivant=index+1
- if indexsuivant > len(self.liste) -1:
- indexsuivant=0
- motsuivant=self.liste[indexsuivant]
- labelsuivant=self.dico_labels[motsuivant]
- self.afficheMot(motsuivant)
- self.selectthis(motsuivant,labelsuivant,self.selection[2],)
- self.dontselect=1
-
- def selectPrevItem(self,mot,label):
- index=self.liste.index(mot)
- indexprec=index-1
- motprec=self.liste[indexprec]
- labelprec=self.dico_labels[motprec]
- self.afficheMot(motprec)
- self.selectthis(motprec,labelprec,self.selection[2],)
- self.dontselect=1
-
- def selectthis(self,mot,label,commande) :
- self.clear_marque()
- if self.selection != None :
- self.deselectitem(self.selection[1],self.selection[0],self.selection[2],)
- self.highlightitem(label)
- self.selection = (mot,label,commande)
- self.arg_selected = mot
- if commande : commande(mot)
-
- def selectitem(self,mot,label,commande) :
- """ Met l'item sélectionné (représenté par son label) en surbrillance
- et lance la commande associée au double-clic"""
- if self.dontselect:
- self.dontselect=0
- return
- self.selectthis(mot,label,commande)
-
- def highlightitem(self,label) :
- """ Met l'item représenté par son label en surbrillance """
- label.focus_set()
- label.configure(bg='#00008b',fg='white')
-
- def markitem(self,label):
- """ Met l'item (représenté par son label) en rouge """
- label.configure(bg='gray95',fg='red')
-
- def deselectitem(self,label,mot='',commande=None) :
- """ Remet l'item (représenté par son label) en noir"""
- if label:label.configure(bg='gray95',fg='black')
- self.arg_selected = ''
- if commande and mot : commande(mot)
-
- def cherche_selected_item(self):
- try :
- index=self.MCbox.index(self.selection[1])
- lign,col=map(int,string.split(index,'.'))
- except :
- label=self.dico_labels[self.arg_selected]
- mot=self.dico_mots[label]
- lign=self.dico_place[mot]+1
- return lign
-
- def remove_selected_item(self):
- try :
- index=self.MCbox.index(self.selection[1])
- lign,col=map(int,string.split(index,'.'))
- except :
- label=self.dico_labels[self.arg_selected]
- mot=self.dico_mots[label]
- lign=self.dico_place[mot]+1
- del self.liste[lign-1]
- self.affiche_liste()
-
- 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)
- self.dontselect=0
- for arg in self.liste :
- if fnmatch.fnmatch(arg,filtre) or fnmatch.fnmatch(arg,FILTRE) :
- label=self.dico_labels[arg]
- self.afficheMot(arg)
- self.selectitem(arg,label,self.selection[2])
- break
-
- #try :
- #self.dico_labels[self.arg_selected].focus_set()
- #except :
- #pass
-
-
- # PN attention à la gestion des paramétres
- # cela retourne H = 1 , et ni H, ni 1
- # print repr(val)
- # print val.__class__.__name__
- def get_liste(self):
- l=[]
- for val in self.liste:
-# try:
-# v = eval(val)
-# l.append(v)
-# except:
- l.append(val)
- return l
-
- def put_liste(self,liste):
- self.liste = liste
- self.affiche_liste()
-
-class Affichage :
- """ Cette classe permet d'afficher au lancement d'EFICAS le message
- d'attente et la barre de progression"""
- def __init__(self,master,message,barre ='oui'):
- from Tools.foztools.foztools import Slider
- fonte=fontes.standard12_gras
- self.master=master
- self.frame = Frame(self.master)
- self.frame.pack(expand=1,fill='both')
- self.mess = Label(self.frame,text=message,justify='center',
- bd=2,relief='groove',font=fonte)
- self.mess.pack(in_ = self.frame,side='top',expand=1,fill='both')
- self.progress = Slider(self.frame,value=0,max=100,orientation='horizontal',
- fillColor='#00008b',width=200,height=30,
- background='white',labelColor='red')
- if barre == 'oui':
- self.progress.frame.pack(in_=self.frame,side='top')
- self.master.update()
- if barre == 'oui':
- self.progress.frame.after(1000,self.update)
-
- def configure(self,**options):
- if options.has_key('message'):
- self.mess.configure(text=options['message'])
- if options.has_key('barre'):
- if options['barre'] == 'oui' :
- self.progress.frame.pack(in_=self.frame,side='top')
- elif options['barre'] == 'non' :
- self.progress.frame.pack_forget()
- self.master.update_idletasks()
-
- def quit(self):
- self.frame.destroy()
- self.master.update()
-
- def update(self,event=None):
- """ Permet de faire avancer la barre de progression """
- try :
- bar=self.progress
- bar.value = bar.value+self.increment
- bar.update()
- self.master.after(100,self.update)
- except:
- pass
-
- def configure_barre(self,nb):
- """ Calcule l'incrément de progression de la barre en fonction
- du nombre d'opérations à effectuer afin que le compteur
- soit à 100% à la fin des opérations"""
- self.increment = 100./nb
- self.progress.update()
-
-class Ask_Format_Fichier :
- """
- Cette classe permet de créer une fenêtre Toplevel dans laquelle
- on propose le choix du format de fichier de commandes à ouvrir
- """
- def __init__(self,appli):
- self.fenetre = Toplevel()
- self.fenetre.configure(width = 250,height=150)
- self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
- self.fenetre.title("Choix du format du fichier de commandes")
- # définition des frames
- self.frame_texte = Frame(self.fenetre)
- self.frame_radioboutons = Frame(self.fenetre)
- self.frame_bouton_ok = Frame(self.fenetre)
- self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.3)
- self.frame_radioboutons.place(relheight=0.5,relx=0,rely=0.3,relwidth=1.)
- self.frame_bouton_ok.place(relheight=0.2,relx=0,rely=0.8,relwidth=1.)
- # définition de la zone texte et du scrollbar
- zone_texte = Label(self.frame_texte,text = "Format du fichier à ouvrir :")
- zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
- # définition des radioboutons
- Radiobutton(self.frame_radioboutons,text='Format Aster (Code_Aster --> v5)',
- variable=appli.format_fichier,value='Aster').pack(anchor='n')
- Radiobutton(self.frame_radioboutons,text='Format Python (Code_Aster v6-->)',
- variable=appli.format_fichier,value='Python').pack(anchor='n')
- # création du bouton OK
- Button(self.frame_bouton_ok,text='OK',command=self.quit).pack(anchor='n')
- # centrage de la fenêtre
- centerwindow(self.fenetre)
-
- def quit(self):
- self.fenetre.destroy()
-
-class BARRE_K2000(Toplevel):
- def __init__(self,master=None,text = ""):
- Toplevel.__init__(self,master,relief='groove')
- self.master.iconify()
- self.geometry("250x100+0+0")
- self.protocol("WM_DELETE_WINDOW",self.quit)
- # frame principale dans self (= Toplevel)
- self.frame = Frame(self)
- self.frame.place(relwidth=1,relheight=1)
- # frame contenant le texte à afficher
- self.frame_text = Frame(self.frame)
- self.frame_text.place(relwidth=1,relheight=0.75,rely=0)
- # frame contenant le canvas de la barre
- self.frame_canv = Frame(self.frame)
- self.frame_canv.place(relwidth=1,relheight=0.25,rely=0.75)
- # canvas dans lequel sera affichée la barre K2000
- self.canvas = Canvas(self.frame_canv)
- self.canvas.place(relx=0.5,rely=0.5,relheight=0.8,relwidth=0.8,anchor='center')
- # on affiche le texte et la barre
- self.build_text(text)
- self.build_batons()
- #self.overrideredirect(1)
- # on active la barre ...
- self.master.after(1000,self.launch)
- # on centre la fenêtre
- centerwindow(self)
- self.focus()
-
- def build_text(self,text):
- """
- Affichage de text dans frame_text
- """
- self.texte_var = StringVar()
- self.texte_var.set(text)
- Label(self.frame_text,textvariable=self.texte_var).place(relx=0.5,rely=0.5,anchor='center')
-
- def build_batons(self):
- """
- Construit la suite de bâtons dans le canvas
- """
- self.l_batons=[]
- self.black = -1
- self.sens = 'D'
- self.quit = 0
- for i in range(0,40):
- id = self.canvas.create_rectangle(i*5,0,(i+1)*5,20,fill='gray90',outline='')
- self.l_batons.append(id)
-
- def launch(self):
- """
- Active la barre K2000 en affichant les bâtons avec des couleurs en dégradé
- """
- if self.quit == 1 :
- self.destroy()
- self.master.deiconify()
- return
- if self.sens == 'D':
- self.black = self.black+1
- l_bat = self.l_batons[0:self.black+1]
- l_bat.reverse()
- elif self.sens == 'G':
- self.black = self.black-1
- l_bat = self.l_batons[self.black:]
- i=0
- for bat in l_bat :
- num_color = 5+i*10
- if num_color < 10 : color = 'black'
- elif num_color > 90 : color = 'white'
- else: color = 'gray'+`num_color`
- self.canvas.itemconfigure(bat,fill=color)
- i=i+1
- if self.black == len(self.l_batons) :
- self.sens = 'G'
- if self.black == 0 and self.sens == 'G':self.sens = 'D'
- self.after(80,self.launch)
-
- def update_text(self,new_text):
- """
- Remplace le texte affiché par new_text
- """
- self.texte_var.set(new_text)
-
- 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
- Exemple de binding:
- liste_commandes = (("<Enter>",self.selectCmd),
- ("<Leave>",self.deselectCmd),
- ("<Double-Button-1>",self.defCmd))
- Il s'agit d'une liste de doublets dont le premier element est un evenement et le
- deuxieme un callback a appeler sur l'evenement en question.
-
- """
- def __init__(self,parent,page,liste_groupes,dict_groupes,liste_commandes=[],liste_marques =[],
- active ='oui',filtre='non',titre='',optionReturn=None,fonte_titre=fontes.standard_gras_souligne):
- 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.optionReturn = optionReturn
- self.fonte_titre=fonte_titre
- self.init()
-
- def affiche_liste(self):
- """ Affiche la liste dans la fenêtre"""
- liste_labels=[]
- self.dico_mots={}
- 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
- liste_labels.append(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.dico_mots[label]=cmd
- self.MCbox.window_create(END,
- window=label,
- stretch = 1)
- self.MCbox.insert(END,'\n')
-
- def null(*tp,**args): return
-
- if self.active == 'oui':
- # Traitement par defaut des evenements
- label.bind("<Enter>",lambda e,s=self,c=null,x=cmd,l=label: s.selectitem(x,l,c))
- label.bind("<Leave>",lambda e,s=self,c=null,x=cmd,l=label: s.deselectitem(l,x,c))
- label.bind("<Double-Button-1>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
- label.bind("<Return>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
- label.bind("<KP_Enter>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
- label.bind("<Key-Right>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x))
- label.bind("<Key-Down>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x))
- label.bind("<Key-Left>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x))
- label.bind("<Key-Up>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x))
-
- # Si des callbacks sont definis on les utilise
- for event,callback in self.liste_commandes:
- if event == "<Enter>":
- label.bind("<Enter>",lambda e,s=self,c=callback,x=cmd,l=label: s.selectitem(x,l,c))
- elif event == "<Leave>":
- label.bind("<Leave>",lambda e,s=self,c=callback,x=cmd,l=label: s.deselectitem(l,x,c))
- elif event == "<Double-Button-1>":
- label.bind("<Double-Button-1>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
- elif event == "<Return>":
- label.bind("<Return>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
- elif event == "<KP_Enter>":
- label.bind("<KP_Enter>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
- elif event == "<Key-Right>":
- label.bind("<Key-Right>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x))
- elif event == "<Key-Down>":
- label.bind("<Key-Down>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x))
- elif event == "<Key-Left>":
- label.bind("<Key-Left>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x))
- elif event == "<Key-Up>":
- label.bind("<Key-Up>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x))
- else:
- label.bind(event,lambda e,s=self,c=callback,x=cmd,l=label: c())
-
- for marque in self.liste_marques:
- try:
- self.markitem(liste_labels[marque])
- except:
- pass
-
- self.MCbox.config(state=DISABLED)
- self.selection = None
- self.dontselect=0
- for event,callback in self.liste_commandes:
- if event == "<Enter>":
- self.selection=None,None,callback
- break
-
- def selectPrevItem(self,mot,label,callback,group,cmd):
- g=self.liste_groupes.index(group)
- liste_commandes=self.dict_groupes[group]
- c=liste_commandes.index(cmd)
- if c > 0:
- co=liste_commandes[c-1]
- else:
- # debut de liste. On passe au groupe precedent
- if g > 0:
- gr=self.liste_groupes[g-1]
- co=self.dict_groupes[gr][-1]
- else:
- # debut des groupes. On ne fait rien
- return
- # On a trouve l'item precedent
- labelsuivant=self.dico_labels[co]
- index = self.MCbox.index(labelsuivant)
- self.MCbox.see(index)
- self.selectthis(co,labelsuivant,self.selection[2],)
- self.dontselect=1
-
- def selectNextItem(self,mot,label,callback,group,cmd):
- g=self.liste_groupes.index(group)
- liste_commandes=self.dict_groupes[group]
- c=liste_commandes.index(cmd)
- try:
- co=liste_commandes[c+1]
- except:
- # fin de liste. On passe au groupe suivant
- try:
- gr=self.liste_groupes[g+1]
- co=self.dict_groupes[gr][0]
- except:
- # fin des groupes. On ne fait rien
- return
- # On a trouve l'item suivant
- labelsuivant=self.dico_labels[co]
- index = self.MCbox.index(labelsuivant)
- self.MCbox.see(index)
- self.selectthis(co,labelsuivant,self.selection[2],)
- self.dontselect=1
-
- 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) :
- cmd=self.dict_groupes[grp][0]
- label=self.dico_labels[cmd]
- index = self.MCbox.index(label)
- self.MCbox.see(index)
- self.selectitem(cmd,label,self.selection[2])
- # 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) :
- label=self.dico_labels[cmd]
- index = self.MCbox.index(label)
- self.MCbox.see(index)
- self.selectitem(cmd,label,self.selection[2])
- # On a trouve une commande on arrete la recherche
- return
-
import traceback
from Noyau import N_OBJECT
-import prefs
+from Aster import prefs
class ETAPE_NIVEAU(N_OBJECT.OBJECT):
test = 1
arguments = arguments[1:-1] # on enlève les parenthèses ouvrante et fermante
l_arguments = string.split(arguments,',')
- #for argument in l_arguments:
- # argument = string.strip(argument)
- # try:
- # nom=argument
- # typ,nom = string.split(argument,':')
- # #pas de vérification sur le nom de l'argument
- # #vérification du type de l'argument
- # typ = string.strip(typ)
- # if typ not in self.l_types_autorises :
- # test = 0
- # erreur = erreur + "Le type "+typ+" n'est pas un type permis pour "+nom+'\n'
- # except:
- # # l'argument ne respecte pas la syntaxe : typ_arg : nom_arg
- # test = 0
- # erreur = erreur+"Syntaxe argument non valide : "+argument+'\n'
return test,erreur
def verif_corps(self,corps=None,arguments=None):
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 nécessaires
+ pour l'éditeur graphique QT
+"""
--- /dev/null
+# -*- coding: utf-8 -*-
+import os,sys,string,re,types,traceback
+
+from qt import *
+
+
+from InterfaceQT import utilIcons
+
+
+class JDCTree( QListView ):
+ def __init__( self, jdc_item, parent = None ):
+ QListView.__init__( self, parent )
+
+ self.item = jdc_item
+ self.tree = self
+ self.editor = parent
+ self.racine = self
+ self.node_selected = None
+ self.children = self.build_children()
+
+ self.setCaption(self.trUtf8('Browser'))
+ self.setRootIsDecorated(1)
+ self.setSorting(-1)
+ self.addColumn(self.trUtf8('Name'))
+ self.addColumn(self.trUtf8('Value'))
+
+ self.setMinimumSize(QSize(400,500))
+ self.connect(self,SIGNAL('contextMenuRequested(QListViewItem *, const QPoint &, int)'),
+ self.handleContextMenu)
+
+ self.connect(self, SIGNAL("onItem ( QListViewItem * ) "), self.handleOnItem)
+
+
+ def handleContextMenu(self,itm,coord,col):
+ """
+ Private slot to show the context menu of the listview.
+
+ @param itm the selected listview item (QListViewItem)
+ @param coord the position of the mouse pointer (QPoint)
+ @param col the column of the mouse pointer (int)
+ """
+ try:
+ if itm.menu:
+ itm.menu.popup(coord)
+ except:
+ pass
+
+ def handleOnItem(self, item ):
+ fr = item.item.get_fr()
+ if self.editor:
+ self.editor.affiche_infos(fr)
+
+ def build_children(self):
+ """ Construit la liste des enfants de self """
+ children = []
+ child = self.item.itemNode(self,self.item)
+ children.append(child)
+ child.state='expanded'
+ return children
+
+ def supprime(self):
+ """ supprime tous les elements de l'arbre """
+ raise RuntimeError, 'Not implemented'
+ self.tree = None
+ self.racine = None
+ self.node_selected = None
+ self.item = None
+ self.scrolledcanvas = None
+ for child in self.children:
+ child.supprime()
+ self.children=[]
+
+ def showEvent(self, event):
+ """ QT : pour afficher le 1er niveau d'arborescence de l''arbre"""
+ self.children[0].select()
+
+ def update(self):
+ """ Update tous les elements de l'arbre """
+ print 'TREE update'
+ for child in self.children:
+ child.update()
+
+ def update_valid(self) :
+ """Cette methode a pour but de mettre a jour la validite du noeud
+ et de propager la demande de mise a jour a son parent
+ """
+ print 'TREE update_valid'
+
+# type de noeud
+COMMENT = "COMMENTAIRE"
+PARAMETERS = "PARAMETRE"
+
+
+class JDCNode(QListViewItem):
+ def __init__( self, parent, item, after=None, bold=0):
+ """
+ Constructor
+
+ @param parent parent Browser or BrowserNode
+ @param text text to be displayed by this node (string or QString)
+ @param after sibling this node is positioned after
+ @param bold flag indicating a highlighted font
+ """
+ self.item = item
+ self.parent = parent
+ self.tree = self.parent.tree
+ self.editor = self.parent.tree.editor
+ self.bold = bold
+
+ name = self.tree.trUtf8( str( item.GetLabelText()[0] ) )
+ value = self.tree.trUtf8( str( item.GetText() ) )
+
+ if after is None:
+ QListViewItem.__init__(self,parent)
+ self.setText(0, name )
+ self.setText(1, value )
+ else:
+ QListViewItem.__init__(self,parent, after)
+ self.setText(0, name )
+ self.setText(1, value)
+
+ p = utilIcons.getPixmap(item.GetIconName() + ".gif")
+ self.setPixmap(0,p)
+ self.setExpandable(item.IsExpandable())
+
+ self.connect()
+ self.init()
+ self.createPopUpMenu()
+
+
+ def paintCell(self, p, cg, column, width, alignment):
+ """
+ Overwritten class to set a different text color, if bold is true.
+
+ @param p the painter (QPainter)
+ @param cg the color group (QColorGroup)
+ @param column the column (int)
+ @param width width of the cell (int)
+ @param alignment alignment of the cell (int)
+ """
+ _cg = QColorGroup(cg)
+ c = _cg.text()
+
+ if self.bold and column == 0:
+ _cg.setColor(QColorGroup.Text, Qt.red)
+
+ QListViewItem.paintCell(self, p, _cg, column, width, alignment)
+
+ _cg.setColor(QColorGroup.Text, c)
+
+
+ def setOpen(self, o):
+ """
+ Public slot to set/reset the open state.
+
+ @param o flag indicating the open state
+ """
+ if o:
+ if not self.children :
+ self.build_children()
+ self.selected = 1
+ self.tree.node_selected = self
+ else:
+
+ for child in self.children:
+ self.takeItem(child)
+ del child
+ self.children = []
+ QListViewItem.setOpen(self,o)
+ self.tree.setSelected(self,o)
+
+
+ #----------------------------------------------------------
+ # interface a implementer par les noeuds derives (debut)
+ #----------------------------------------------------------
+ def getPanel(self):
+ print self.__class__
+ return None
+
+ def createPopUpMenu(self):
+ pass
+
+ #----------------------------------------------------
+ # interface a implementer par les noeuds derives (fin)
+ #----------------------------------------------------
+
+ def init(self): #CS_pbruno toclean
+ self.state='collapsed'
+ self.displayed = 0
+ self.selected = 0
+ self.x = self.y =None
+ self.lasty = 0
+ self.children = []
+ self.id = []
+ if self.parent is self.tree:
+ self.racine=self
+ else:
+ self.racine = self.parent.racine
+
+ def connect(self):
+ self.item.connect("add",self.onAdd,())
+ self.item.connect("supp",self.onSupp,())
+ self.item.connect("valid",self.onValid,())
+
+ def commentIt(self):
+ """
+ Cette methode a pour but de commentariser la commande pointee par self
+ """
+ # On traite par une exception le cas ou l'utilisateur final cherche a désactiver
+ # (commentariser) un commentaire.
+ try :
+ pos=self.parent.children.index( self )
+ commande_comment = self.item.get_objet_commentarise()
+ # On signale au parent du panel (le JDCDisplay) une modification
+ self.editor.init_modif()
+ self.parent.children[pos].select()
+ except Exception,e:
+ traceback.print_exc()
+ QMessageBox.critical( self.parent, "TOO BAD",str(e))
+ return
+
+ def unCommentIt(self):
+ """
+ Realise la decommentarisation de self
+ """
+ try:
+ pos=self.parent.children.index(self.node)
+ commande,nom = self.item.uncomment()
+ self.parent.children[pos].select()
+ except Exception,e:
+ QMessageBox.critical( self.parent, "Erreur !",str(e))
+ return
+
+ def addComment( self, after=True ):
+ """
+ Ajoute un commentaire a l'interieur du JDC :
+ """
+ self.editor.init_modif()
+ if after:
+ pos = 'after'
+ else:
+ pos = 'before'
+ return self.append_brother( COMMENT, pos )
+
+ def addParameters( self, after=True ):
+ """
+ Ajoute un parametre a l'interieur du JDC :
+ """
+ self.editor.init_modif()
+ if after:
+ pos = 'after'
+ else:
+ pos = 'before'
+ return self.append_brother( PARAMETERS, pos )
+
+
+
+ def select( self ):
+ """
+ Rend le noeud courant (self) selectionne et deselectionne
+ tous les autres
+ """
+ self.setOpen( True )
+
+ #------------------------------------------------------------------
+ # Methodes de creation et destruction de noeuds
+ # Certaines de ces methodes peuvent etre appelees depuis l'externe
+ #------------------------------------------------------------------
+ def append_brother(self,name,pos='after',retour='non'):
+ """
+ Permet d'ajouter un objet frere a l'objet associe au noeud self
+ par defaut on l'ajoute immediatement apres
+ Methode externe
+ """
+ # on veut ajouter le frere de nom name directement avant ou apres self
+## print "*********** append_brother ", self.item.GetLabelText()
+ index = self.parent.children.index(self)
+ if pos == 'before':
+ index = index
+ elif pos == 'after':
+ index = index +1
+ else:
+ print str(pos)," n'est pas un index valide pour append_brother"
+ return 0
+ return self.parent.append_child(name,pos=index)
+
+ def append_child(self,name,pos=None,verif='oui',retour='non'):
+ """
+ Methode pour ajouter un objet fils a l'objet associe au noeud self.
+ On peut l'ajouter en debut de liste (pos='first'), en fin (pos='last')
+ ou en position intermediaire.
+ Si pos vaut None, on le place a la position du catalogue.
+ """
+## print "************** append_child ",self.item.GetLabelText()
+ if pos == 'first':
+ index = 0
+ elif pos == 'last':
+ index = len(self.children)
+ elif type(pos) == types.IntType :
+ # position fixee
+ index = pos
+ elif type(pos) == types.InstanceType:
+ # pos est un item. Il faut inserer name apres pos
+ index = self.item.get_index(pos) +1
+ elif type(name) == types.InstanceType:
+ index = self.item.get_index_child(name.nom)
+ else:
+ index = self.item.get_index_child(name)
+ obj=self.item.additem(name,index) #CS_pbruno emet le signal 'add'
+ #print obj
+ if obj is None:obj=0
+ if obj == 0:return 0
+ #print "append_child",index,self.children
+ child=self.children[index]
+ child.select()
+ return child
+
+ def delete(self):
+ """
+ Methode externe pour la destruction de l'objet associe au noeud
+ La mise a jour des noeuds est faite par onSupp sur notification
+ """
+ self.editor.init_modif()
+ index = self.parent.children.index(self) - 1
+ if index < 0 : index =0
+
+ parent=self.parent
+ ret=parent.item.suppitem(self.item)
+ if ret == 0:return
+
+ brothers=parent.children
+ if brothers:
+ toselect=brothers[index]
+ else:
+ toselect=parent
+ toselect.select()
+
+ #------------------------------------------------------------------
+ def onValid(self):
+ self.update_node_valid()
+ self.update_node_label()
+ self.update_node_texte()
+
+
+ def onAdd(self,objet):
+ #print "NODE onAdd : un objet a ete ajoute aux fils de l'item ",self.item.GetLabelText()
+ old_nodes=self.children
+ self.update_nodes()
+ #self.select()
+
+ def onSupp(self,objet):
+ #print "NODE onSupp : un objet a ete supprime des fils de l'item ",self.item.object,objet
+ old_nodes=self.children
+ self.update_nodes()
+ #self.select()
+
+ def update_node_valid(self):
+ """Cette methode remet a jour la validite du noeud (icone)
+ Elle appelle isvalid
+ """
+ #print 'NODE update_node_valid', self.item.GetLabelText()
+ p = utilIcons.getPixmap(self.item.GetIconName() + ".gif")
+ self.setPixmap(0,p)
+
+ def update_node_label(self): #CS_pbruno todo
+ """ Met a jour le label du noeud """
+ #print "NODE update_node_label", self.item.GetLabelText()
+ labeltext,fonte,couleur = self.item.GetLabelText()
+ self.setText(0, labeltext)
+
+ def update_node_texte(self):
+ """ Met a jour les noms des SD et valeurs des mots-cles """
+ #print "NODE update_node_texte", self.item.GetLabelText()
+ value = self.item.GetText()
+ self.setText(1, value)
+
+ def update_nodes(self):
+ #print "NODE update_nodes ", self.item.GetLabelText()
+ self.setOpen( False )
+ self.setOpen( True )
+ #self.select()
+
+ def update_texte(self):
+ """ Met a jour les noms des SD et valeurs des mots-cles """
+ #print "NODE update_texte", self.item.GetLabelText()
+ self.update_node_texte()
+ if self.state == 'expanded' :
+ for child in self.children:
+ if child.displayed != 0 : child.update_texte()
+
+ def update_valid(self) :
+ """Cette methode a pour but de mettre a jour la validite du noeud
+ et de propager la demande de mise a jour a son parent
+ """
+ #print "NODE update_valid", self.item.GetLabelText()
+ self.update_node_valid()
+ self.parent.update_valid()
+
+ def supprime(self):
+ #print "NODE supprime",self.item.GetLabelText()
+ self.efface_node()
+ self.racine = None
+ if not self.children : return
+ for child in self.children:
+ child.supprime()
+ self.children=None
+
+ def build_children(self):
+ """ Construit la liste des enfants de self """
+ #print "NODE : Construit la liste des enfants de", self.item.GetLabelText()
+ self.children = []
+ sublist = self.item._GetSubList()
+ if sublist :
+ last = None
+ for item in sublist :
+ child = item.itemNode(self, item, last)
+ last = child
+ self.children.append(child)
+
+
+
+
+if __name__=='__main__':
+ from qt import *
+
+
+ sys.path[:0]=['..','../Aster','../Aster/Cata' ]
+
+ app = QApplication(sys.argv)
+
+ fn = 'azAster.comm'
+ jdcName = os.path.basename(fn)
+ f=open(fn,'r')
+ text=f.read()
+ f.close()
+ print 'text',text
+
+ from autre_analyse_cata import analyse_catalogue
+ from Cata import cataSTA8
+ cata=cataSTA8
+ fic_cata="../../Aster/Cata/cataSTA8/cata.py"
+ cata_ordonne ,list_simp_reel = analyse_catalogue(cata)
+
+
+
+ j=cata.JdC( procedure=text, cata=cata, nom=jdcName,
+ cata_ord_dico=cata_ordonne )
+
+ j.compile()
+ if not j.cr.estvide():
+ print j.cr
+ sys.exit()
+
+ j.exec_compile()
+ if not j.cr.estvide():
+ print j.cr
+ sys.exit()
+
+ from Editeur import comploader
+ comploader.charger_composants(QT)
+ from Editeur import Objecttreeitem
+ jdc_item=Objecttreeitem.make_objecttreeitem( app, "nom", j)
+
+ if jdc_item:
+ tree = JDCTree( jdc_item, None )
+
+ app.setMainWidget(tree)
+ app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+ tree.show()
+
+ res = app.exec_loop()
+ sys.exit(res)
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from Editeur import Objecttreeitem
+from InterfaceQT import compofact
+from InterfaceQT import browser
+from qt import *
+
+
+class Node(browser.JDCNode):
+ def getPanel(self):
+ """
+ """
+ from monMCFactPanel import MonMCFactPanel
+ return MonMCFactPanel(self,parent=self.editor)
+
+
+class BLOCTreeItem(compofact.FACTTreeItem):
+ itemNode=Node
+
+ def get_objet(self,name) :
+ for v in self.object.mc_liste:
+ if v.nom == name : return v
+ return None
+
+ def iscopiable(self):
+ return 0
+
+
+import Accas
+treeitem = BLOCTreeItem
+objet = Accas.MCBLOC
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+from qt import *
+
+from Editeur import Objecttreeitem
+from InterfaceQT import browser
+from InterfaceQT import typeNode
+
+
+class Node(browser.JDCNode,typeNode.PopUpMenuNodePartiel):
+ def getPanel( self ):
+ """
+ """
+ from monCommentairePanel import MonCommentairePanel
+ return MonCommentairePanel(self,parent=self.editor)
+
+ def createPopUpMenu(self):
+ typeNode.PopUpMenuNodePartiel.createPopUpMenu(self)
+ self.menu.insertItem( qApp.translate('Browser','Uncomment'), self.unCommentIt )
+
+ def update_node_label(self) :
+ """
+ """
+ debComm=self.item.GetText()
+ self.setText(1,debComm)
+
+
+class COMMTreeItem(Objecttreeitem.ObjectTreeItem):
+ itemNode=Node
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icône associée au noeud qui porte self,
+ dépendant de la validité de l'objet
+ NB : un commentaire est toujours valide ...
+ """
+ return "ast-white-percent"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ return 'commentaire' #CS_pbruno,Fonte_Commentaire,None
+
+ def get_valeur(self):
+ """
+ Retourne la valeur de l'objet Commentaire cad son texte
+ """
+ return self.object.get_valeur() or ''
+
+ def GetText(self):
+ texte = self.object.valeur
+ texte = string.split(texte,'\n')[0]
+ if len(texte) < 25 :
+ return texte
+ else :
+ return texte[0:24]
+
+ def set_valeur(self,valeur):
+ """
+ Afecte valeur à l'objet COMMENTAIRE
+ """
+ self.object.set_valeur(valeur)
+
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ """
+ return []
+
+
+ def get_objet_commentarise(self):
+ """
+ La méthode get_objet_commentarise() de la classe compocomm.COMMTreeItem
+ surcharge la méthode get_objet_commentarise de la classe Objecttreeitem.ObjectTreeItem
+ elle a pour but d'empecher l'utilisateur final de commentariser un commentaire.
+ """
+ raise Exception( 'Citoyen : tu peux "commentariser" une commande MAIS PAS UN COMMENTAIRE' )
+
+import Extensions
+treeitem =COMMTreeItem
+objet = Extensions.commentaire.COMMENTAIRE
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 Editeur import Objecttreeitem
+from InterfaceQT import browser
+from qt import *
+
+
+class Node(browser.JDCNode):
+ def getPanel(self):
+ """
+ """
+ from monMCFactPanel import MonMCFactPanel
+ return MonMCFactPanel(self,parent=self.editor)
+
+ def doPaste(self,node_selected):
+ objetACopier = self.item.get_copie_objet()
+ child=node_selected.doPasteMCF(objetACopier)
+ return child
+
+ def doPaste_MCF(self,objetACopier):
+ child = self.parent.append_child(objetACopier,
+ pos=self.item,
+ retour='oui')
+ return child
+
+
+class FACTTreeItem(Objecttreeitem.ObjectTreeItem):
+ itemNode=Node
+
+ def IsExpandable(self):
+ return 1
+
+ def GetText(self):
+ return ''
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ # None --> fonte et couleur par défaut
+ return self.object.getlabeltext(),None,None
+
+ def isvalid(self):
+ return self.object.isvalid()
+
+ def iscopiable(self):
+ return 1
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return "ast-green-los"
+ elif self.object.isoblig():
+ return "ast-red-los"
+ else:
+ return "ast-yel-los"
+
+ def keys(self):
+ keys=self.object.mc_dict.keys()
+ return keys
+
+ def GetSubList(self):
+ """
+ Reactualise la liste des items fils stockes dans self.sublist
+ """
+ liste=self.object.mc_liste
+ sublist=[None]*len(liste)
+ # suppression des items lies aux objets disparus
+ for item in self.sublist:
+ old_obj=item.getObject()
+ if old_obj in liste:
+ pos=liste.index(old_obj)
+ sublist[pos]=item
+ else:
+ pass # objets supprimes ignores
+ # ajout des items lies aux nouveaux objets
+ pos=0
+ for obj in liste:
+ if sublist[pos] is None:
+ # nouvel objet : on cree un nouvel item
+ def setfunction(value, object=obj):
+ object.setval(value)
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+ sublist[pos]=item
+ pos=pos+1
+
+ self.sublist=sublist
+ return self.sublist
+
+ def additem(self,name,pos):
+ objet = self.object.addentite(name,pos)
+ return objet
+
+ def suppitem(self,item) :
+ """
+ Cette methode a pour fonction de supprimer l'item passee en argument
+ des fils de l'item FACT qui est son pere
+ - item = item du MOCLE a supprimer du MOCLE pere
+ - item.getObject() = MCSIMP ou MCBLOC
+ """
+ itemobject=item.getObject()
+ if itemobject.isoblig() :
+ self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
+ return 0
+
+ if self.object.suppentite(itemobject):
+ message = "Mot-clé " + itemobject.nom + " supprimé"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
+ return 0
+
+import Accas
+objet = Accas.MCFACT
+treeitem = FACTTreeItem
--- /dev/null
+# -*- coding: utf-8 -*-
+
+"""
+Ce module contient les classes permettant de définir les objets graphiques
+représentant un objet de type FORMULE, cad le panneau et l'item de l'arbre
+d'EFICAS
+"""
+
+import string
+from qt import *
+from InterfaceQT import compooper
+from InterfaceQT import browser
+from InterfaceQT import typeNode
+
+
+class FormuleNode(browser.JDCNode,typeNode.PopUpMenuNode):
+
+ def getPanel(self):
+
+ from monFormulePanel import MonFormulePanel
+ return MonFormulePanel(self,parent=self.editor)
+
+
+class FORMULETreeItem(compooper.EtapeTreeItem):
+ """
+ Classe servant a définir l'item porté par le noeud de l'arbre d'EFICAS
+ qui représente la FORMULE
+ """
+ itemNode=Node =FormuleNode
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+# API de FORMULE pour l'arbre
+# ---------------------------------------------------------------------------
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ On considére que FORMULE n'a pas de fils
+ --> modification par rapport a MACRO classique
+ """
+ # dans EFICAS on ne souhaite pas afficher les mots-clés fils de FORMULE
+ # de façon traditionnelle
+ return []
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icone à afficher dans l'arbre
+ Ce nom dépend de la validité de l'objet
+ """
+ if self.object.isactif():
+ self.object.state="modified"
+ if self.object.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+ else:
+ return "ast-white-text"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte a afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ if self.object.isactif():
+ # None --> fonte et couleur par défaut
+ return self.labeltext,None,None
+ else:
+ return self.labeltext,fontes.standard_italique,None
+
+# ---------------------------------------------------------------------------
+# Méthodes permettant la modification et la lecture des attributs
+# du paramètre = API graphique de la FORMULE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+ def get_nom(self):
+ """
+ Retourne le nom de la FORMULE
+ """
+ return self.object.get_nom()
+
+ def get_type(self):
+ """
+ Retourne le type de la valeur retournée par la FORMULE
+ """
+ return self.object.type_retourne
+
+ def get_args(self):
+ """
+ Retourne les arguments de la FORMULE
+ """
+ args=""
+ for mot in self.object.mc_liste:
+ if mot.nom == 'NOM_PARA':
+ args=mot.valeur
+ break
+ if args :
+ if args[0] == "(" and args[-1] ==")":
+ args=args[1:-1]
+ # transforme en tuple si ce n est pas déja le casa
+ try :
+ args=string.split(args,',')
+ except :
+ pass
+ return args
+
+ def get_corps(self):
+ """
+ Retourne le corps de la FORMULE
+ """
+ corps=""
+ for mot in self.object.mc_liste:
+ if mot.nom == 'VALE':
+ corps=mot.valeur
+ break
+ return corps
+
+
+ def get_liste_types_autorises(self):
+ """
+ Retourne la liste des types autorises pour les valeurs de sortie
+ d'une FORMULE
+ """
+ return self.object.l_types_autorises
+
+ def save_formule(self,new_nom,new_typ,new_arg,new_exp):
+ """
+ Vérifie si (new_nom,new_typ,new_arg,new_exp) définit bien une FORMULE
+ licite :
+ - si oui, stocke ces paramètres comme nouveaux paramètres de la
+ FORMULE courante et retourne 1
+ - si non, laisse les paramètres anciens de la FORMULE inchangés et
+ retourne 0
+ """
+ test,erreur = self.object.verif_formule_python(formule=(new_nom,new_typ,new_arg,
+ new_exp))
+ if test :
+ # la formule est bien correcte : on sauve les nouveaux paramètres
+ test=self.object.update_formule_python(formule=(new_nom,new_typ,new_exp,new_arg))
+ return test,erreur
+
+# ---------------------------------------------------------------------------
+# Accès aux méthodes de vérification de l'objet FORM_ETAPE
+# ---------------------------------------------------------------------------
+
+ def verif_nom(self,nom):
+ """
+ Lance la vérification du nom passé en argument
+ """
+ return self.object.verif_nom(nom)
+
+ def verif_arguments(self,arguments):
+ """
+ Lance la vérification des arguments passés en argument
+ """
+ return self.object.verif_arguments('('+arguments+')')
+
+ def verif_formule(self,formule):
+ """
+ Lance la vérification de FORMULE passée en argument
+ """
+ return self.object.verif_formule(formule=formule)
+
+
+ def verif_formule_python(self,formule):
+ """
+ Lance la vérification de FORMULE passée en argument
+ """
+ return self.object.verif_formule_python(formule=formule)
+
+import Accas
+treeitem =FORMULETreeItem
+objet = Accas.FORM_ETAPE
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from qt import *
+from Editeur import Objecttreeitem
+from InterfaceQT import browser
+
+
+class Node(browser.JDCNode):
+ def getPanel(self):
+ """
+ """
+ from monRacinePanel import MonRacinePanel
+ return MonRacinePanel(self,parent=self.editor)
+
+ def doPasteCommande(self,objet_a_copier):
+ """
+ Réalise la copie de l'objet passé en argument qui est nécessairement
+ une commande
+ """
+ child = self.append_child(objet_a_copier,pos='first',retour='oui')
+ return child
+
+
+class JDCTreeItem(Objecttreeitem.ObjectTreeItem):
+ itemNode=Node
+
+ def IsExpandable(self):
+ return 1
+
+ def GetText(self):
+ return " "
+
+ def GetLabelText(self):
+ # None --> fonte et couleur par défaut
+ return self.object.nom,None,None
+
+ def get_jdc(self):
+ """
+ Retourne l'objet pointé par self
+ """
+ return self.object
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+
+ def keys(self):
+ if self.object.etapes_niveaux != []:
+ return range(len(self.object.etapes_niveaux))
+ else:
+ return range(len(self.object.etapes))
+
+ def additem(self,name,pos):
+ cmd = self._object.addentite(name,pos)
+ return cmd
+
+ def suppitem(self,item) :
+ # item = item de l'ETAPE à supprimer du JDC
+ # item.getObject() = ETAPE ou COMMENTAIRE
+ # self.object = JDC
+
+ itemobject=item.getObject()
+ if self.object.suppentite(itemobject):
+ if itemobject.nature == "COMMENTAIRE" :
+ message = "Commentaire supprimé"
+ else :
+ message = "Commande " + itemobject.nom + " supprimée"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos("Pb interne : impossible de supprimer cet objet")
+ return 0
+
+ def GetSubList(self):
+ """
+ Retourne la liste des items fils de l'item jdc.
+ Cette liste est conservee et mise a jour a chaque appel
+ """
+ if self.object.etapes_niveaux != []:
+ liste = self.object.etapes_niveaux
+ else:
+ liste = self.object.etapes
+ sublist=[None]*len(liste)
+ # suppression des items lies aux objets disparus
+ for item in self.sublist:
+ old_obj=item.getObject()
+ if old_obj in liste:
+ pos=liste.index(old_obj)
+ sublist[pos]=item
+ else:
+ pass # objets supprimes ignores
+ # ajout des items lies aux nouveaux objets
+ pos=0
+ for obj in liste:
+ if sublist[pos] is None:
+ # nouvel objet : on cree un nouvel item
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj)
+ sublist[pos]=item
+ pos=pos+1
+
+ self.sublist=sublist
+ return self.sublist
+
+ def get_l_noms_etapes(self):
+ """ Retourne la liste des noms des étapes de self.object"""
+ return self.object.get_l_noms_etapes()
+
+ def get_liste_cmd(self):
+ listeCmd = self.object.niveau.definition.get_liste_cmd()
+ return listeCmd
+
+import Accas
+treeitem =JDCTreeItem
+objet = Accas.JDC
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Modules Python
+import os,sys,string
+import types
+import traceback
+from qt import *
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from InterfaceQT import compooper
+from InterfaceQT import browser
+from InterfaceQT import typeNode
+
+import convert
+
+class MACRONode(browser.JDCNode,typeNode.PopUpMenuNode):
+ def getPanel(self):
+ from monMacroPanel import MonMacroPanel
+ return MonMacroPanel (self,parent=self.editor )
+
+ def createPopUpMenu(self):
+ typeNode.PopUpMenuNode.createPopUpMenu(self)
+
+
+class MACROTreeItem(compooper.EtapeTreeItem):
+ """ Cette classe hérite d'une grande partie des comportements
+ de la classe compooper.EtapeTreeItem
+ """
+ itemNode=MACRONode
+
+class INCLUDETreeItemBase(MACROTreeItem):
+
+ def __init__(self,appli, labeltext, object, setfunction):
+ MACROTreeItem.__init__(self,appli, labeltext, object, setfunction)
+
+ def iscopiable(self):
+ """
+ Retourne 1 si l'objet est copiable, 0 sinon
+ """
+ return 0
+
+
+class INCLUDENode(browser.JDCNode,typeNode.PopUpMenuNode):
+## def getPanel(self):
+## """
+## """
+## return INCLUDEPanel( self, self.editor )
+
+ def makeEdit(self): #,appli,node
+ if self.item.object.text_converted == 0:
+ # Le texte du fichier inclus n'a pas pu etre converti par le module convert
+ msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
+ msg=msg+self.item.object.text_error
+ return
+
+ if not hasattr(self.item.object,"jdc_aux") or self.item.object.jdc_aux is None:
+ #L'include n'est pas initialise
+ self.item.object.build_include(None,"")
+
+ # On cree un nouvel onglet dans le bureau
+## appli.bureau.ShowJDC( self.item.object.jdc_aux,
+## self.item.object.jdc_aux.nom,
+## label_onglet=None,
+## JDCDISPLAY=macrodisplay.MACRODISPLAY)
+ self.editor.vm.displayJDC( self.item.object.jdc_aux ) #, self.item.object.jdc_aux.nom )
+
+ def makeView(self):#,appli,node):
+ pass #CS_pbruno todo
+
+
+
+class INCLUDETreeItem(INCLUDETreeItemBase):
+## panel=INCLUDEPanel
+ itemNode=INCLUDENode
+
+
+
+class POURSUITENode(browser.JDCNode, typeNode.PopUpMenuNode):
+## def getPanel(self):
+## """
+## """
+## return INCLUDEPanel( self, self.editor )
+
+ def makeEdit(self): #,appli,node
+ if self.item.object.text_converted == 0:
+ # Le texte du fichier inclus n'a pas pu etre converti par le module convert
+ msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
+ msg=msg+self.item.object.text_error
+## Fenetre(self,titre="Poursuite non editable",texte=msg,wrap='none') #CS_pbruno todo
+ return
+
+ if not hasattr(self.item.object,"jdc_aux") or self.item.object.jdc_aux is None:
+ #La poursuite n'est pas initialisee
+ text="""DEBUT()
+ FIN()"""
+ self.object.build_poursuite(None,text)
+
+ # On cree un nouvel onglet dans le bureau
+## appli.bureau.ShowJDC( self.item.object.jdc_aux,
+## self.item.object.jdc_aux.nom,
+## label_onglet=None,
+## JDCDISPLAY=macrodisplay.MACRODISPLAY)
+ self.editor.vm.displayJDC( self.item.object.jdc_aux ) #, self.item.object.jdc_aux.nom )
+
+ def makeView(self):#,appli,node):
+ pass #CS_pbruno todo
+
+
+
+class POURSUITETreeItem(INCLUDETreeItemBase):
+ itemNode=POURSUITENode
+## def makeEdit(self,appli,node):
+## if self.object.text_converted == 0:
+## # Le texte du fichier inclus n'a pas pu etre converti par le module convert
+## msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
+## msg=msg+self.object.text_error
+## Fenetre(self,titre="Poursuite non editable",texte=msg,wrap='none')
+## return
+##
+## if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
+## #La poursuite n'est pas initialisee
+## text="""DEBUT()
+##FIN()"""
+## self.object.build_poursuite(None,text)
+##
+## # On cree un nouvel onglet dans le bureau
+## appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
+## label_onglet=None,
+## JDCDISPLAY=macrodisplay.MACRODISPLAY)
+##
+## def makeView(self,appli,node):
+## if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
+## showerror("Poursuite vide","Une POURSUITE doit etre correctement initialisée pour etre visualisée")
+## return
+## nom=self.object.nom
+## if hasattr(self.object,'fichier_ini'):
+## if self.object.fichier_ini is None:
+## nom=nom+' '+"Fichier non défini"
+## else:
+## nom=nom+' '+self.object.fichier_ini
+## macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
+
+class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
+ rmenu_specs=[("View","makeView"),
+ ]
+ def iscopiable(self):
+ """
+ Retourne 1 si l'objet est copiable, 0 sinon
+ """
+ return 1
+
+
+def treeitem(appli, labeltext, object, setfunction=None):
+ """ Factory qui retourne l'item adapté au type de macro :
+ INCLUDE, POURSUITE, MACRO
+ """
+ if object.nom == "INCLUDE_MATERIAU":
+ return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
+ elif object.nom == "INCLUDE":
+ return INCLUDETreeItem(appli, labeltext, object, setfunction)
+ elif object.nom == "POURSUITE":
+ return POURSUITETreeItem(appli, labeltext, object, setfunction)
+ else:
+ return MACROTreeItem(appli, labeltext, object, setfunction)
+
+import Accas
+objet=Accas.MACRO_ETAPE
+
+#import macrodisplay
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import types
+import traceback
+
+from qt import *
+
+from InterfaceQT import compofact
+from InterfaceQT import browser
+from Editeur import Objecttreeitem
+from Noyau.N_OBJECT import ErrorObj
+#import compoerror
+
+
+class Node(browser.JDCNode):
+ def getPanel(self):
+ """
+ """
+ if self.item.isMCList() :
+ if self.item.ajout_possible():
+ from monMCListAjoutPanel import MonMCListAjoutPanel
+ return MonMCListAjoutPanel(self,parent=self.editor)
+ else :
+ print "MCList"
+ elif self.item.isMCFact() :
+ from monMCFactPanel import MonMCFactPanel
+ return MonMCFactPanel(self,parent=self.editor)
+ else :
+ print "MCList"
+ print "kkkkkkkkkkkkkkkkkkkkk"
+
+ def doPaste(self,node_selected):
+ objet_a_copier = self.item.get_copie_objet()
+ child=node_selected.doPaste_MCF(objet_a_copier)
+ #print "doPaste",child
+ return child
+
+ def doPaste_MCF(self,objet_a_copier):
+ child=None
+ # le noeud courant est une MCList
+ if self.item.isMCList() :
+ child = self.append_child(objet_a_copier,pos='first',retour='oui')
+
+ # le noeud courant est un MCFACT
+ elif self.item.isMCFact() :
+ # le noeud selectionne est un MCFACT dans une MCList
+ if self.parent.item.isMCList():
+ child = self.parent.append_child(objet_a_copier,
+ pos=self.item,
+ retour='oui')
+
+ # le noeud MCFACT selectionne n'est pas dans une MCList
+ else:
+ child = self.parent.append_child(objet_a_copier,retour='oui')
+
+ else:
+ QMessageBox.information( self, "Copie impossible",
+ "Vous ne pouvez coller le mot-clé facteur copié à ce niveau de l'arborescence !")
+ self.editor.affiche_infos("Copie refusée")
+
+ return child
+
+class MCListTreeItem(Objecttreeitem.SequenceTreeItem,compofact.FACTTreeItem):
+ """ La classe MCListTreeItem joue le role d'un adaptateur pour les objets
+ du noyau Accas instances de la classe MCLIST.
+ Elle adapte ces objets pour leur permettre d'etre intégrés en tant que
+ noeuds dans un arbre graphique (voir treewidget.py et ObjectTreeItem.py).
+ Cette classe délègue les appels de méthode et les accès
+ aux attributs à l'objet du noyau soit manuellement soit
+ automatiquement (voir classe Delegate et attribut object).
+ """
+ itemNode=Node
+
+ def init(self):
+ # Si l'objet Accas (MCList) a moins d'un mot cle facteur
+ # on utilise directement ce mot cle facteur comme delegue
+ self.updateDelegate()
+
+ def updateDelegate(self):
+ if len(self._object) > 1:
+ self.setdelegate(self._object)
+ else:
+ self.setdelegate(self._object.data[0])
+
+ def panel(self,jdcdisplay,pane,node):
+ """ Retourne une instance de l'objet panneau associe a l'item (self)
+ Si la liste ne contient qu'un mot clé facteur, on utilise le panneau
+ FACTPanel.
+ Si la liste est plus longue on utilise le panneau MCLISTPanel.
+ """
+ if len(self._object) > 1:
+ return MCLISTPanel(jdcdisplay,pane,node)
+ elif isinstance(self._object.data[0],ErrorObj):
+ return compoerror.ERRORPanel(jdcdisplay,pane,node)
+ else:
+ return compofact.FACTPanel(jdcdisplay,pane,node)
+
+ def IsExpandable(self):
+ if len(self._object) > 1:
+ return Objecttreeitem.SequenceTreeItem.IsExpandable(self)
+ else:
+ return compofact.FACTTreeItem.IsExpandable(self)
+
+ def GetSubList(self):
+ self.updateDelegate()
+ if len(self._object) <= 1:
+ self._object.data[0].alt_parent=self._object
+ return compofact.FACTTreeItem.GetSubList(self)
+
+ liste=self._object.data
+ sublist=[None]*len(liste)
+ # suppression des items lies aux objets disparus
+ for item in self.sublist:
+ old_obj=item.getObject()
+ if old_obj in liste:
+ pos=liste.index(old_obj)
+ sublist[pos]=item
+ else:
+ pass # objets supprimes ignores
+ # ajout des items lies aux nouveaux objets
+ pos=0
+ for obj in liste:
+ if sublist[pos] is None:
+ # nouvel objet : on cree un nouvel item
+ def setfunction(value, object=obj):
+ object=value
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+ sublist[pos]=item
+ #Attention : on ajoute une information supplementaire pour l'actualisation de
+ # la validite. L'attribut parent d'un MCFACT pointe sur le parent de la MCLISTE
+ # et pas sur la MCLISTE elle meme ce qui rompt la chaine de remontee des
+ # informations de validite. alt_parent permet de remedier a ce defaut.
+ obj.alt_parent=self._object
+ pos=pos+1
+
+ self.sublist=sublist
+ return self.sublist
+
+ def GetIconName(self):
+ if self._object.isvalid():
+ return "ast-green-los"
+ elif self._object.isoblig():
+ return "ast-red-los"
+ else:
+ return "ast-yel-los"
+
+ def get_docu(self):
+ """ Retourne la clef de doc de l'objet pointé par self """
+ return self.object.get_docu()
+
+ def iscopiable(self):
+ if len(self._object) > 1:
+ return Objecttreeitem.SequenceTreeItem.iscopiable(self)
+ else:
+ return compofact.FACTTreeItem.iscopiable(self)
+
+ def isMCFact(self):
+ """
+ Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
+ """
+ return len(self._object) <= 1
+
+ def isMCList(self):
+ """
+ Retourne 1 si l'objet pointé par self est une MCList, 0 sinon
+ """
+ return len(self._object) > 1
+
+ def get_copie_objet(self):
+ return self._object.data[0].copy()
+
+ def additem(self,obj,pos):
+ #print "compomclist.additem",obj,pos
+ if len(self._object) <= 1:
+ return compofact.FACTTreeItem.additem(self,obj,pos)
+
+ o= self.object.addentite(obj,pos)
+ return o
+
+ def suppitem(self,item):
+ """
+ Retire un objet MCFACT de la MCList (self.object)
+ """
+ #print "compomclist.suppitem",item
+ obj=item.getObject()
+ if len(self._object) <= 1:
+ return compofact.FACTTreeItem.suppitem(self,item)
+
+ if self.object.suppentite(obj):
+ if len(self._object) == 1: self.updateDelegate()
+ message = "Mot-clef " + obj.nom + " supprimé"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos('Impossible de supprimer ce mot-clef')
+ return 0
+
+
+import Accas
+objet = Accas.MCList
+
+def treeitem(appli,labeltext,object,setfunction):
+ """ Factory qui produit un objet treeitem adapte a un objet
+ Accas.MCList (attribut objet de ce module)
+ """
+ return MCListTreeItem(appli,labeltext,object,setfunction)
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from qt import *
+from Editeur import Objecttreeitem
+from Extensions import commentaire
+from InterfaceQT import browser
+
+class Node(browser.JDCNode): pass
+## def getPanel(self):
+## """
+## """
+## return NIVEAUPanel( self, self.editor )
+
+class NIVEAUTreeItem(Objecttreeitem.ObjectTreeItem):
+## panel = NIVEAUPanel
+ itemNode=Node
+
+ def isactif(self):
+ return self.object.isactif()
+
+ def IsExpandable(self):
+ return 1
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ if self.isactif():
+ fonte = Fonte_Niveau
+ else :
+ fonte = Fonte_Niveau_inactif
+ return self.labeltext,fonte,'#00008b'
+
+ def GetIconName(self):
+ if self.isactif():
+ if self.object.isvalid():
+ return "ast-green-text"
+ else:
+ return "ast-red-text"
+ else:
+ return "ast-white-text"
+
+ def keys(self):
+ if self.object.etapes_niveaux != []:
+ return range(len(self.object.etapes_niveaux))
+ else:
+ return range(len(self.object.etapes))
+
+ def GetSubList(self):
+ sublist=[]
+ for key in self.keys():
+ if self.object.etapes_niveaux != []:
+ liste = self.object.etapes_niveaux
+ else:
+ liste = self.object.etapes
+ try:
+ value = liste[key]
+ except KeyError:
+ continue
+ def setfunction(value, key=key, object=liste):
+ object[key] = value
+ item =self.make_objecttreeitem(self.appli,value.ident() + " : ", value, setfunction)
+ sublist.append(item)
+ return sublist
+
+ def additem(self,name,pos):
+ if isinstance(name,Objecttreeitem.TreeItem) :
+ cmd=self.object.addentite(name.getObject(),pos)
+ else :
+ cmd = self.object.addentite(name,pos)
+ item = self.make_objecttreeitem(self.appli,cmd.nom + " : ", cmd)
+ return item
+
+ def suppitem(self,item) :
+ # item = item de l'ETAPE à supprimer du JDC
+ # item.getObject() = ETAPE ou COMMENTAIRE
+ # self.object = JDC
+ itemobject=item.getObject()
+ if self.object.suppentite(itemobject):
+ if isinstance(item.object,commentaire.COMMENTAIRE):
+ message = "Commentaire supprimé"
+ else :
+ message = "Commande " + itemobject.nom + " supprimée"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos("Pb interne : impossible de supprimer cet objet")
+ return 0
+
+ def GetText(self):
+ return ''
+
+
+import Accas
+treeitem = NIVEAUTreeItem
+objet = Accas.ETAPE_NIVEAU
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 types
+from repr import Repr
+from copy import copy,deepcopy
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+
+myrepr = Repr()
+myrepr.maxstring = 100
+myrepr.maxother = 100
+
+# Si Expandable vaut 1 les éléments du nuplet apparaissent dans l'arbre
+# Si Expandable vaut 0 les éléments n'apparaissent pas
+Expandable=1
+
+
+import browser
+from qt import *
+
+class Node(browser.JDCNode): pass
+## def getPanel(self):
+## """
+## """
+## return NUPLETPanel( self, self.editor )
+
+
+class NUPLETTreeItem(Objecttreeitem.ObjectTreeItem):
+## panel=NUPLETPanel
+ itemNode=Node
+
+ def IsExpandable(self):
+ return Expandable
+
+ def GetText(self):
+ return ''
+
+ def isvalid(self):
+ return self.object.isvalid()
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return "ast-green-los"
+ elif self.object.isoblig():
+ return "ast-red-los"
+ else:
+ return "ast-yel-los"
+
+ def GetSubList(self):
+ if not Expandable:return []
+ sublist=[]
+ for obj in self.object.mc_liste:
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, None)
+ sublist.append(item)
+ return sublist
+
+ def additem(self,name,pos):
+ raise "NUPLET"
+
+ def suppitem(self,item) :
+ raise "NUPLET"
+
+import Accas
+treeitem=NUPLETTreeItem
+objet=Accas.MCNUPLET
--- /dev/null
+# -*- coding: utf-8 -*-
+
+import traceback
+import string
+
+from qt import *
+
+from Editeur import Objecttreeitem
+from InterfaceQT import browser
+from InterfaceQT import typeNode
+
+class Node(browser.JDCNode, typeNode.PopUpMenuNode):
+ def getPanel( self ):
+ """
+ """
+ from monCommandePanel import MonCommandePanel
+ return MonCommandePanel(self,parent=self.editor)
+
+ def createPopUpMenu(self):
+ typeNode.PopUpMenuNode.createPopUpMenu(self)
+
+ def doPaste(self,node_selected):
+ """
+ Déclenche la copie de l'objet item avec pour cible
+ l'objet passé en argument : node_selected
+ """
+ objet_a_copier = self.item.get_copie_objet()
+ child=node_selected.doPaste_Commande(objet_a_copier)
+ return child
+
+ def doPasteCommande(self,objet_a_copier):
+ """
+ Réalise la copie de l'objet passé en argument qui est nécessairement
+ une commande
+ """
+ parent=self.parent
+ #child = parent.item.append_child(objet_a_copier,self.item.getObject())
+ child = self.append_brother(objet_a_copier,retour='oui')
+ #if child is None:return 0
+ return child
+
+ def doPaste_MCF(self,objet_a_copier):
+ """
+ Réalise la copie de l'objet passé en argument (objet_a_copier)
+ Il s'agit forcément d'un mot clé facteur
+ """
+ child = self.append_child(objet_a_copier,pos='first',retour='oui')
+ return child
+
+
+class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
+ """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
+ Accas. Elle leur permet d'etre affichés comme des noeuds
+ d'un arbre graphique.
+ Cette classe a entre autres deux attributs importants :
+ - _object qui est un pointeur vers l'objet du noyau
+ - object qui pointe vers l'objet auquel sont délégués les
+ appels de méthode et les accès aux attributs
+ Dans le cas d'une ETAPE, _object et object pointent vers le
+ meme objet.
+ """
+## panel = OPERPanel
+ itemNode=Node
+
+ def IsExpandable(self):
+ return 1
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icône à afficher dans l'arbre
+ Ce nom dépend de la validité de l'objet
+ """
+ if not self.object.isactif():
+ return "ast-white-square"
+ elif self.object.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ if self.object.isactif():
+ # None --> fonte et couleur par défaut
+ return self.labeltext,None,None
+ else:
+ return self.labeltext, None, None #CS_pbruno todo
+## return self.labeltext,fontes.standard_italique,None
+
+ def get_objet(self,name) :
+ for v in self.object.mc_liste:
+ if v.nom == name : return v
+ return None
+
+ def get_type_sd_prod(self):
+ """
+ Retourne le nom du type du concept résultat de l'étape
+ """
+ sd_prod=self.object.get_type_produit()
+ if sd_prod:
+ return sd_prod.__name__
+ else:
+ return ""
+
+ def additem(self,name,pos):
+ print "CS_PBRUNO compooper.additem",name,pos
+ mcent = self._object.addentite(name,pos)
+ print "CS_PBRUNO mcent ",mcent
+ return mcent
+
+
+ def suppitem(self,item) :
+ # item : item du MOCLE de l'ETAPE à supprimer
+ # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList
+ itemobject=item.getObject()
+ if itemobject.isoblig() :
+ self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
+ return 0
+ if self.object.suppentite(itemobject):
+ message = "Mot-clé " + itemobject.nom + " supprimé"
+ self.appli.affiche_infos(message)
+ return 1
+ else :
+ self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
+ return 0
+
+ def GetText(self):
+ try:
+ return self.object.get_sdname()
+ except:
+ return ''
+
+ def keys(self):
+ keys=self.object.mc_dict.keys()
+ return keys
+
+ def GetSubList(self):
+ """
+ Reactualise la liste des items fils stockes dans self.sublist
+ """
+ if self.isactif():
+ liste=self.object.mc_liste
+ else:
+ liste=[]
+
+ sublist=[None]*len(liste)
+ # suppression des items lies aux objets disparus
+ for item in self.sublist:
+ old_obj=item.getObject()
+ if old_obj in liste:
+ pos=liste.index(old_obj)
+ sublist[pos]=item
+ else:
+ pass # objets supprimes ignores
+
+ # ajout des items lies aux nouveaux objets
+ pos=0
+ for obj in liste:
+ if sublist[pos] is None:
+ # nouvel objet : on cree un nouvel item
+ def setfunction(value, object=obj):
+ object.setval(value)
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+ sublist[pos]=item
+ pos=pos+1
+
+ self.sublist=sublist
+ return self.sublist
+
+ def isvalid(self):
+ return self.object.isvalid()
+
+ def iscopiable(self):
+ """
+ Retourne 1 si l'objet est copiable, 0 sinon
+ """
+ return 1
+
+ def update(self,item):
+ if item.sd and item.sd.nom:
+ self.nomme_sd(item.sd.nom)
+
+ def nomme_sd(self,nom):
+ """ Lance la méthode de nommage de la SD """
+ oldnom=""
+ if self.object.sd != None :
+ oldnom=self.object.sd.nom
+ test,mess= self.object.nomme_sd(nom)
+ if test:self.object.parent.reset_context()
+ if (test and self.appli.dict_reels.has_key(oldnom) ):
+ self.appli.dict_reels[nom]=self.appli.dict_reels[oldnom]
+ return test,mess
+
+ def is_reentrant(self):
+ return self.object.is_reentrant()
+
+ def get_noms_sd_oper_reentrant(self):
+ return self.object.get_noms_sd_oper_reentrant()
+
+ def get_objet_commentarise(self):
+ """
+ Cette méthode retourne un objet commentarisé
+ représentatif de self.object
+ """
+ # Format de fichier utilisé
+ format=self.appli.format_fichier.get()
+ return self.object.get_objet_commentarise(format)
+
+ def get_objet_commentarise_BAK(self):
+ """
+ Cette méthode retourne un objet commentarisé
+ représentatif de self.object
+ """
+ import generator,string,Accas
+ # Format de fichier utilisé
+ format=self.appli.format_fichier.get()
+ g=generator.plugins[format]()
+ texte_commande = g.gener(self.object,format='beautifie')
+ # Il faut enlever la première ligne vide de texte_commande que
+ # rajoute le generator
+ rebut,texte_commande = string.split(texte_commande,'\n',1)
+ # on construit l'objet COMMANDE_COMM repésentatif de self mais non
+ # enregistré dans le jdc
+ commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
+ parent=self.object.parent)
+ commande_comment.niveau = self.object.niveau
+ commande_comment.jdc = commande_comment.parent = self.object.jdc
+
+ pos=self.object.parent.etapes.index(self.object)
+ parent=self.object.parent
+ self.object.parent.suppentite(self.object)
+ parent.addentite(commande_comment,pos)
+
+ return commande_comment
+
+ def visu_3D(self,appli,node) :
+ import TroisDPal
+ troisD=TroisDPal.TroisDPilote(node.item,appli,node.parent)
+ troisD.envoievisu()
+
+import Accas
+treeitem = EtapeTreeItem
+objet = Accas.ETAPE
+
--- /dev/null
+# -*- coding: utf-8 -*-
+"""
+ Ce module contient les classes permettant de définir les objets graphiques
+ représentant un objet de type PARAMETRE, cad le panneau et l'item de l'arbre
+ d'EFICAS
+"""
+
+# import modules Python
+import string
+from qt import *
+
+# import modules EFICAS
+from Editeur import Objecttreeitem
+from InterfaceQT import browser
+
+class Node(browser.JDCNode): pass
+## def getPanel(self):
+## """
+## """
+## return PARAMPanel( self, self.editor )
+
+
+class PARAMTreeItem(Objecttreeitem.ObjectTreeItem):
+ """
+ Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
+ qui représente le PARAMETRE
+ """
+ itemNode=Node
+## panel = PARAMPanel
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+# API du PARAMETRE pour l'arbre
+# ---------------------------------------------------------------------------
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icone associée au noeud qui porte self,
+ dépendant de la validité de l'objet
+ NB : un PARAMETRE est toujours valide ...
+ """
+ if self.isactif():
+ if self.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+ else:
+ return "ast-white-square"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ return 'Paramêtre',None,None #CS_pbruno todo
+## return 'Paramêtre',Fonte_PARAMETRE,None
+
+ def GetText(self):
+ """
+ Retourne le texte à afficher aprês le nom de la commande (ici aprês 'paramêtre')
+ Ce texte est tronqué à 25 caractêres
+ """
+ texte = repr(self.object)
+ texte = string.split(texte,'\n')[0]
+ if len(texte) < 25 :
+ return texte
+ else :
+ return texte[0:24]+'...'
+
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ """
+ return []
+
+# ---------------------------------------------------------------------------
+# Méthodes permettant la modification et la lecture des attributs
+# du paramêtre = API graphique du PARAMETRE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+ def get_valeur(self):
+ """
+ Retourne la valeur de l'objet PARAMETRE cad son texte
+ """
+ if self.object.valeur is None: return ''
+ else: return self.object.valeur
+
+ def get_nom(self):
+ """
+ Retourne le nom du paramêtre
+ """
+ return self.object.nom
+
+ def set_valeur(self,new_valeur):
+ """
+ Affecte valeur à l'objet PARAMETRE
+ """
+ self.object.set_valeur(new_valeur)
+
+ def set_nom(self,new_nom):
+ """
+ Renomme le paramêtre
+ """
+ self.object.set_nom(new_nom)
+ #self.object.set_attribut('nom',new_nom)
+
+ def get_fr(self):
+ """
+ Retourne le fr associé au paramêtre, cad la bulle d'aide pour EFICAS
+ """
+ return "Définition d'un paramêtre"
+
+import Extensions.parametre
+treeitem =PARAMTreeItem
+objet = Extensions.parametre.PARAMETRE
--- /dev/null
+# -*- coding: utf-8 -*-
+
+"""
+Ce module contient les classes permettant de définir les objets graphiques
+représentant un objet de type PARAMETRE_EVAL, cad le panneau et l'item de l'arbre
+d'EFICAS
+"""
+
+# import modules Python
+import string
+
+# import modules EFICAS
+
+import Objecttreeitem
+
+
+import browser
+from qt import *
+
+class Node(browser.JDCNode): pass
+## def getPanel(self):
+## """
+## """
+## return PARAM_EVALPanel( self, self.editor )
+
+
+class PARAM_EVALTreeItem(Objecttreeitem.ObjectTreeItem):
+ """
+ Classe servant a définir l'item porté par le noeud de l'arbre d'EFICAS
+ qui représente le PARAMETRE
+ """
+ itemNode=Node
+## panel = PARAM_EVALPanel
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+# API du PARAMETRE pour l'arbre
+# ---------------------------------------------------------------------------
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icone associée au noeud qui porte self,
+ dépendant de la validité de l'objet
+ NB : un PARAMETRE est toujours valide ...
+ """
+ if self.isactif():
+ if self.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+ else:
+ return "ast-white-square"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte a afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ return 'EVAL',Fonte_PARAMETRE,None
+
+ def GetText(self):
+ """
+ Retourne le texte a afficher apres le nom de la commande (ici apres 'parametre')
+ Ce texte est tronqué a 25 caracteres
+ """
+ texte = repr(self.object)
+ texte = string.split(texte,'\n')[0]
+ if len(texte) < 25 :
+ return texte
+ else :
+ return texte[0:24]+'...'
+
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ """
+ return []
+
+# ---------------------------------------------------------------------------
+# Méthodes permettant la modification et la lecture des attributs
+# du parametre = API graphique du PARAMETRE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+ def isvalid(self):
+ """
+ Indique si l'objet pointé par self est valide
+ """
+ return self.object.isvalid()
+
+ def get_valeur(self):
+ """
+ Retourne une chaine représentant la valeur de l'objet PARAMETRE
+ cad de l'objet class_eval.EVAL
+ """
+ return self.object.get_valeur() or ''
+
+ def get_nom(self):
+ """
+ Retourne le nom du parametre
+ """
+ return self.object.get_nom()
+
+ def set_valeur(self,new_valeur):
+ """
+ Affecte new_valeur a l'objet PARAMETRE_EVAL
+ """
+ # on construit le texte de la nouvelle valeur
+ new_valeur = 'EVAL("""'+new_valeur+'""")'
+ # on affecte la nouvelle valeur a self.object
+ self.object.set_valeur(new_valeur)
+
+ def set_nom(self,new_nom):
+ """
+ Renomme le parametre
+ """
+ self.object.set_nom(new_nom)
+
+ def get_fr(self):
+ """
+ Retourne le fr associé au parametre, cad la bulle d'aide pour EFICAS
+ """
+ return "Définition d'un parametre de type EVAL"
+
+ def verif_nom(self,nom):
+ """
+ Lance la vérification de validité du nom passé en argument
+ """
+ return self.object.verif_nom(nom = nom)
+
+ def verif_eval(self,valeur):
+ """
+ Lance la vérification de validité de l'expression EVAL passée en argument
+ """
+ return self.object.verif_eval(exp_eval = valeur)
+
+ def save_parametre_eval(self,new_nom,new_val):
+ """
+ Vérifie si (new_nom,new_val) définit bien un EVAL licite :
+ - si oui, stocke ces parametres comme nouveaux parametres de l'EVAL courant et retourne 1
+ - si non, laisse les parametres anciens de EVAL inchangés et retourne 0
+ """
+ test,erreur = self.object.verif_parametre_eval(param=(new_nom,new_val))
+ if test :
+ # la formule est bien correcte : on sauve les nouveaux parametres
+ self.object.update(param=(new_nom,new_val))
+ return test,erreur
+
+import Extensions.parametre_eval
+treeitem =PARAM_EVALTreeItem
+objet = Extensions.parametre_eval.PARAMETRE_EVAL
--- /dev/null
+# -*- coding: utf-8 -*-
+from Editeur import Objecttreeitem
+from InterfaceQT import compooper
+from InterfaceQT import browser
+
+from qt import *
+
+class Node(browser.JDCNode): pass
+## def getPanel(self):
+## """
+## """
+## return PROCPanel( self, self.editor )
+
+class ProcEtapeTreeItem(compooper.EtapeTreeItem):
+ itemNode=Node
+## panel = PROCPanel
+ pass
+
+import Accas
+treeitem = ProcEtapeTreeItem
+objet = Accas.PROC_ETAPE
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# Modules Python
+import string,types,os
+
+from copy import copy,deepcopy
+import traceback
+from qt import *
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+from InterfaceQT import browser
+from Noyau.N_CR import justify_text
+
+
+class Node(browser.JDCNode):
+ def getPanel(self):
+ """
+ """
+ klass = None
+
+ # Attention l ordre des if est important
+ if self.item.wait_shell():
+ # l'objet attend un shell
+ # a priori jamais
+ print "Pb : Panneau Shell attendu"
+ print "Pb : Prevenir la maintenance"
+ klass = None #CS_pbruno todo
+ return None
+
+ # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
+ if self.item.has_into():
+ if self.item.is_list() :
+ from monPlusieursIntoPanel import MonPlusieursIntoPanel
+ klass = MonPlusieursIntoPanel
+ else:
+ from monUniqueIntoPanel import MonUniqueIntoPanel
+ klass = MonUniqueIntoPanel
+
+ # l'objet prend une ou des valeurs a priori quelconques
+ else:
+ # on attend une liste de valeurs
+ if self.item.is_list() :
+ # on attend une liste de SD
+ if self.item.wait_assd():
+ from monPlusieursASSDPanel import MonPlusieursASSDPanel
+ klass = MonPlusieursASSDPanel
+ else:
+ # on attend une liste de valeurs de types debase (entiers, réels,...)
+ from monPlusieursBasePanel import MonPlusieursBasePanel
+ klass = MonPlusieursBasePanel
+ # on n'attend qu'une seule valeur
+ else:
+ # on attend une SD ou un objet de la classe CO (qui n'existe pas encore)
+ if self.item.wait_co():
+ from monUniqueSDCOPanel import MonUniqueSDCOPanel
+ klass = MonUniqueSDCOPanel
+
+ # on attend une SD
+ elif self.item.wait_assd():
+ if 'R' in self.item.GetType():
+ from monUniqueASSDPanel import MonUniqueASSDReelPanel
+ klass = MonUniqueASSDReelPanel
+ else :
+ from monUniqueASSDPanel import MonUniqueASSDPanel
+ klass = MonUniqueASSDPanel
+
+ # on attend une valeur d'un type de base (entier,reel,...)
+ else:
+ # on attend un complexe
+ if self.item.wait_complex():
+ from monUniqueCompPanel import MonUniqueCompPanel
+ klass = MonUniqueCompPanel
+ else:
+ # on attend un entier, un réel ou une string
+ from monUniqueBasePanel import MonUniqueBasePanel
+ klass = MonUniqueBasePanel
+
+ # cas particulier des fonctions
+ genea = self.item.get_genealogie()
+ if "VALE" in genea or "VALE_C" in genea:
+ if "DEFI_FONCTION" in genea :
+ from monFonctionPanel import MonFonctionPanel
+ klass = MonFonctionPanel
+
+ #---------------------------------------------------------
+ # PN ajout pour lancement de Salome
+ #---------------------------------------------------------
+ if hasattr( self.editor, 'salome' ):
+## import panelsSalome
+##
+## self.item.select_noeud_maille=0
+## self.item.clef_fonction="SALOME"
+## for i in range(0,len( genea )) :
+## self.item.clef_fonction=self.item.clef_fonction+"_"+ genea[i]
+## #if genea[i] == "GROUP_NO" or genea[i] == "GROUP_MA":
+## if "GROUP_NO" in genea[len(genea)-1] or "GROUP_MA" in genea[len(genea)-1]:
+## self.item.select_noeud_maille=1
+##
+## recherche=panelsSalome.dict_classes_salome[klass]
+## if hasattr(recherche,self.item.clef_fonction):
+## klass=recherche
+## if self.item.select_noeud_maille==1 :
+## klass=recherche
+ klass = None #CS_pbruno todo
+
+ if not klass:
+ return None
+
+ return klass( self, self.editor )
+
+
+
+class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
+## from newsimppanel import newSIMPPanel
+## panel = newSIMPPanel
+ itemNode=Node
+
+ def init(self) :
+ self.expandable = 0
+
+
+ #-----------------------------------------------
+ #
+ # Methodes liees aux informations sur le Panel
+ # ou au mot-clef simple
+ #
+ #-----------------------------------------------
+ # is_list
+ # get_into a priori inutile --> commentee
+ # has_into
+ # wait_into a priori inutile --> commentee
+ # GetMinMax
+ # GetMultiplicite
+ # GetIntervalle
+ # GetListeValeurs
+ # get_liste_possible
+
+ def is_list(self):
+ """
+ Cette méthode indique si le mot cle simple attend une liste (valeur de retour 1)
+ ou s'il n'en attend pas (valeur de retour 0)
+
+ Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
+ Dans le cas sans validateur, l'information est donnée par l'attribut max
+ de la definition du mot cle.
+ Dans le cas avec validateur, il faut combiner l'information précédente avec
+ celle issue de l'appel de la méthode is_list sur le validateur.On utilisera
+ l'operateur ET pour effectuer cette combinaison (AndVal).
+ """
+ is_a_list=0
+ min,max = self.GetMinMax()
+ assert (min <= max)
+ if max > 1 :
+ is_a_list=1
+ # Dans le cas avec validateurs, pour que le mot cle soit considéré
+ # comme acceptant une liste, il faut que max soit supérieur a 1
+ # ET que la méthode is_list du validateur retourne 1. Dans les autres cas
+ # on retournera 0 (n'attend pas de liste)
+ if self.definition.validators :
+ is_a_list= self.definition.validators.is_list() * is_a_list
+ return is_a_list
+
+ #def get_into(self,liste_courante=None):
+ # """
+ # Cette méthode retourne la liste de choix proposée par le mot cle. Si le mot cle ne propose
+ # pas de liste de choix, la méthode retourne None.
+ # L'argument d'entrée liste_courante, s'il est différent de None, donne la liste des choix déja
+ # effectués par l'utilisateur. Dans ce cas, la méthode get_into doit calculer la liste des choix
+ # en en tenant compte.
+ # Cette méthode part du principe que la relation entre into du mot clé et les validateurs est
+ # une relation de type ET (AndVal).
+ # """
+ # if not self.object.definition.validators :
+ # return self.object.definition.into
+ # else:
+ # return self.object.definition.validators.get_into(liste_courante,self.definition.into)
+
+ def has_into(self):
+ """
+ Cette méthode indique si le mot cle simple propose un choix (valeur de retour 1)
+ ou s'il n'en propose pas (valeur de retour 0)
+
+ Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
+ Dans le cas sans validateur, l'information est donnée par l'attribut into
+ de la definition du mot cle.
+ Dans le cas avec validateurs, pour que le mot cle soit considéré
+ comme proposant un choix, il faut que into soit présent OU
+ que la méthode has_into du validateur retourne 1. Dans les autres cas
+ on retournera 0 (ne propose pas de choix)
+ """
+ has_an_into=0
+ if self.definition.into:
+ has_an_into=1
+ elif self.definition.validators :
+ has_an_into= self.definition.validators.has_into()
+ return has_an_into
+
+# def wait_into(self):
+# """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+# prend ses valeurs dans un ensemble discret (into), 0 sinon """
+# if self.object.definition.into != None :
+# return 1
+# else:
+# return 0
+
+ def GetMinMax(self):
+ """ Retourne les valeurs min et max de la définition de object """
+ return self.object.get_min_max()
+
+ def GetMultiplicite(self):
+ """ A préciser.
+ Retourne la multiplicité des valeurs affectées a l'objet
+ représenté par l'item. Pour le moment retourne invariablement 1.
+ """
+ return 1
+
+ def GetIntervalle(self):
+ """
+ Retourne le domaine de valeur attendu par l'objet représenté
+ par l'item.
+ """
+ return self.object.getintervalle()
+
+ def GetListeValeurs(self) :
+ """ Retourne la liste des valeurs de object """
+ valeurs=self.object.get_liste_valeurs()
+ try :
+ if "R" in self.object.definition.type:
+ clef=self.object.GetNomConcept()
+ if self.appli.dict_reels.has_key(clef):
+ if type(valeurs) == types.TupleType:
+ valeurs_reelles=[]
+ for val in valeurs :
+ if self.appli.dict_reels[clef].has_key(val) :
+ valeurs_reelles.append(self.appli.dict_reels[clef][val])
+ else :
+ valeurs_reelles.append(val)
+ else :
+ if self.appli.dict_reels[clef].has_key(valeurs):
+ valeurs_reelles=self.appli.dict_reels[clef][valeurs]
+ valeurs=valeurs_reelles
+ except :
+ pass
+ return valeurs
+
+ def get_liste_possible(self,listeActuelle=[]):
+ if hasattr(self.definition.validators,'into'):
+ valeurspossibles = self.definition.validators.into
+ else:
+ valeurspossibles = self.get_definition().into
+
+ #On ne garde que les items valides
+ listevalideitem=[]
+ for item in valeurspossibles:
+ encorevalide=self.valide_item(item)
+ if encorevalide :
+ listevalideitem.append(item)
+
+ #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
+ listevalideliste=[]
+ for item in listevalideitem:
+ encorevalide=self.valide_liste_partielle(item,listeActuelle)
+ if encorevalide :
+ listevalideliste.append(item)
+ return listevalideliste
+
+ def get_liste_param_possible(self):
+ liste_param=[]
+ for param in self.object.jdc.params:
+ encorevalide=self.valide_item(param.valeur)
+ if encorevalide:
+ type_param=param.valeur.__class__.__name__
+ for typ in self.definition.type:
+ if typ=='R':
+ liste_param.append(param)
+ if typ=='I' and type_param=='int':
+ liste_param.append(param)
+ if typ=='TXM' and type_param=='str':
+ liste_param.append(repr(param))
+ return liste_param
+
+ #--------------------------------------------------
+ #
+ # Methodes liees a la validite des valeurs saisies
+ #
+ #---------------------------------------------------
+ # valide_item
+ # valide_liste_partielle
+ # valide_liste_complete
+ # info_erreur_item
+ # info_erreur_liste
+ # IsInIntervalle
+ # isvalid
+
+ def valide_item(self,item):
+ """
+ La validation est réalisée directement par l'objet
+ """
+ return self.object.valide_item(item)
+
+ def valide_liste_partielle(self,item,listecourante):
+ #On protege la liste en entree en la copiant
+ valeur=listecourante[:]
+ valeur.append(item)
+ return self.object.valid_valeur_partielle(valeur)
+
+ def valide_liste_complete (self,valeur):
+ return self.object.valid_valeur(valeur)
+
+ def valide_val (self,valeur):
+ return self.object.valid_val(valeur)
+
+ def info_erreur_item(self) :
+ commentaire=""
+ if self.definition.validators :
+ commentaire=self.definition.validators.info_erreur_item()
+ return commentaire
+
+ def aide(self) :
+ commentaire=""
+ if self.definition.validators :
+ commentaire=self.definition.validators.aide()
+ return commentaire
+
+ def info_erreur_liste(self) :
+ commentaire=""
+ if self.definition.validators :
+ commentaire=self.definition.validators.info_erreur_liste()
+ return commentaire
+
+ def IsInIntervalle(self,valeur):
+ """
+ Retourne 1 si la valeur est dans l'intervalle permis par
+ l'objet représenté par l'item.
+ """
+ return self.valide_item(valeur)
+
+ def isvalid(self):
+ valide=self.object.isvalid()
+ return valide
+
+ #--------------------------------------------------
+ #
+ # Autres ...
+ #
+ #---------------------------------------------------
+ # SetText a priori inutilisee --> commentee
+ # GetIconName
+ # GetText
+ # getval a priori inutilisee --> commentee
+ # set_valeur_co
+ # get_sd_avant_du_bon_type
+ # verif a priori inutilisee --> commentee
+ # delete_valeur_co
+
+ #def SetText(self, text):
+ # try:
+ # value = eval(text)
+ # self.object.setval(value)
+ # except:
+ # pass
+
+ def GetIconName(self):
+ if self.isvalid():
+ return "ast-green-ball"
+ elif self.object.isoblig():
+ return "ast-red-ball"
+ else:
+ return "ast-yel-ball"
+
+ def GetText(self):
+ """
+ Classe SIMPTreeItem
+ Retourne le texte a afficher dans l'arbre représentant la valeur de l'objet
+ pointé par self
+ """
+ text= self.object.GetText()
+ if text == None : text=""
+ return text
+
+ #def getval(self):
+ # return self.object.getval()
+
+ def set_valeur_co(self,nom_co):
+ """
+ Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
+ """
+ ret = self.object.set_valeur_co(nom_co)
+ #print "set_valeur_co",ret
+ return ret
+
+ 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
+ """
+ a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
+ return a
+
+ def get_sd_avant_du_bon_type_pour_type_de_base(self):
+ a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
+ return a
+
+
+
+ #def verif(self):
+ # pass
+
+ 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)
+
+ #-----------------------------------------------
+ #
+ # Methodes liees au type de l objet attendu
+ #
+ #-----------------------------------------------
+ # wait_co
+ # wait_geom
+ # wait_complex
+ # wait_reel
+ # wait_shell
+ # wait_assd
+ # GetType
+
+ def wait_co(self):
+ """
+ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un objet de type ASSD qui n'existe pas encore (type CO()),
+ 0 sinon
+ """
+ return self.object.wait_co()
+
+ def wait_geom(self):
+ """
+ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un objet GEOM, 0 sinon
+ """
+ return self.object.wait_geom()
+
+ def wait_complex(self):
+ """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un complexe, 0 sinon """
+ if 'C' in self.object.definition.type:
+ return 1
+ else:
+ return 0
+
+ def wait_reel(self):
+ """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un réel, 0 sinon """
+ if 'R' in self.object.definition.type:
+ return 1
+ else:
+ return 0
+
+ def wait_shell(self):
+ """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un shell, 0 sinon """
+ if 'shell' in self.object.definition.type:
+ return 1
+ else:
+ return 0
+
+ def wait_assd(self):
+ """Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un objet de type ASSD ou dérivé, 0 sinon """
+ return self.object.wait_assd()
+
+ def wait_assd_or_type_base(self) :
+ boo=0
+ if len(self.object.definition.type) > 1 :
+ if self.wait_reel() :
+ boo = 1
+ if 'I' in self.object.definition.type :
+ boo = 1
+ return boo
+
+
+ def GetType(self):
+ """
+ Retourne le type de valeur attendu par l'objet représenté par l'item.
+ """
+ return self.object.get_type()
+
+ #-----------------------------------------------------
+ #
+ # Methodes liees a l evaluation de la valeur saisie
+ #
+ #-----------------------------------------------------
+ # eval_valeur
+ # eval_valeur_item
+ # is_CO
+ # traite_reel
+
+ def eval_valeur(self,valeur):
+ """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur de self :
+ - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
+ - retourne 'valeur' (chaine de caractéres) sinon
+ """
+ newvaleur=self.eval_val(valeur)
+ return newvaleur,1
+
+ def eval_valeur_BAK(self,valeur):
+ """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur
+ de l'objet pointé par self :
+ - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
+ - retourne 'valeur' (chaine de caractéres) sinon
+ - retourne None en cas d invalidite
+ - retourne invalide si 1 des objets du tuple l est
+ """
+ validite=1
+ if type(valeur) in (types.ListType,types.TupleType) :
+ valeurretour=[]
+ for item in valeur :
+ newvaleur,validiteitem=self.eval_valeur_item(item)
+ valeurretour.append(newvaleur)
+ if validiteitem == 0:
+ validite=0
+ else :
+ valeurretour,validite= self.eval_valeur_item(valeur)
+ if validite == 0 :
+ valeurretour = None
+ return valeurretour,validite
+
+ def eval_valeur_item(self,valeur):
+ """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
+ - va retourner la valeur de retour et la validite
+ selon le type de l objet attendu
+ - traite les reels et les parametres
+ """
+ #print "eval_valeur_item",valeur
+ if valeur==None or valeur == "" :
+ return None,0
+ validite=1
+ if self.wait_reel():
+ valeurinter = self.traite_reel(valeur)
+ if valeurinter != None :
+ valeurretour,validite= self.object.eval_valeur(valeurinter)
+ else:
+ valeurretour,validite= self.object.eval_valeur(valeur)
+ elif self.wait_geom():
+ valeurretour,validite = valeur,1
+ else :
+ valeurretour,validite= self.object.eval_valeur(valeur)
+ #print "eval_valeur_item",valeurretour,validite
+
+ if validite == 0:
+ if type(valeur) == types.StringType and self.object.wait_TXM():
+ essai_valeur="'" + valeur + "'"
+ valeurretour,validite= self.object.eval_valeur(essai_valeur)
+
+ if hasattr(valeurretour,'__class__'):
+ #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
+ if valeurretour.__class__.__name__ in ('PARAMETRE',):
+ validite=1
+
+ #if self.wait_co():
+ # CCAR : il ne faut pas essayer de creer un concept
+ # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
+ #try:
+ #valeurretour=Accas.CO(valeur)
+ #except:
+ #valeurretour=None
+ #validite=0
+ # on est dans le cas ou on a évalué et ou on n'aurait pas du
+ if self.object.wait_TXM() :
+ if type(valeurretour) != types.StringType:
+ valeurretour=str(valeur)
+ validite=1
+ return valeurretour,validite
+
+ 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.InstanceType:return 0
+ if valeur.__class__.__name__ == 'CO':return 1
+ return 0
+
+ def is_param(self,valeur) :
+ for param in self.jdc.params:
+ if (repr(param) == valeur):
+ return 1
+ return 0
+
+ def traite_reel(self,valeur):
+ """
+ Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
+ ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
+ ou un EVAL ...
+ """
+ valeur = string.strip(valeur)
+ liste_reels = self.get_sd_avant_du_bon_type()
+ if valeur in liste_reels:
+ return valeur
+ if len(valeur) >= 3 :
+ if valeur[0:4] == 'EVAL' :
+ # on a trouvé un EVAL --> on retourne directement la valeur
+ return valeur
+ if string.find(valeur,'.') == -1 :
+ # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
+ if (self.is_param(valeur)):
+ return valeur
+ else:
+ if string.find(valeur,'e') != -1:
+ # Notation scientifique ?
+ try :
+ r=eval(valeur)
+ return valeur
+ except :
+ return None
+ else :
+ return valeur+'.'
+ else:
+ return valeur
+
+
+import Accas
+treeitem = SIMPTreeItem
+objet = Accas.MCSIMP
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Modules Python
+import types,sys,os
+import traceback
+from qt import *
+
+# Modules Eficas
+
+import convert,generator
+from Editeur import session
+from Editeur import comploader
+from Editeur import Objecttreeitem
+from Aster import prefs
+from InterfaceQT import panelsQT
+from InterfaceQT import browser
+from InterfaceQT import readercata
+
+import qtCommun
+
+VERSION_EFICAS = "EFICAS v1.12"
+
+
+class StringVar: # a cause de format_fichier (Tkinter.StringVar) appele ailleurs que ds l'Interface
+ def __init__(self):
+ self.val = ""
+ def set(self,str):
+ self.val = str
+ def get(self):
+ return self.val
+
+# -------------------------- #
+# #
+class JDCEditor(QSplitter):
+# #
+# -------------------------- #
+ """
+ Editeur de jdc
+ """
+
+ def __init__(self,fn = None, jdc = None ,parent=None, editor = None):
+ #-------------------------------------------------------------------#
+
+ QSplitter.__init__(self, parent,'')
+
+ VERSION_CODE = session.d_env.cata
+ self.top = None
+ self.code = prefs.code
+ self.version_code = VERSION_CODE
+ self.titre=VERSION_EFICAS + ' pour '+ self.code
+ self.dict_reels={}
+ self.liste_simp_reel=[]
+ self.format_fichier = StringVar()
+ self.format_fichier.set('python') #CS_pbruno gestion python uniquement
+ self.ihm="QT"
+
+ from Editeur import configuration
+ self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
+ self.CONFIGStyle = configuration.make_config_style(self,prefs.REPINI)
+ self.test=0
+ self.sb = None
+ if hasattr(qApp.mainWidget(),"statusBar"):
+ self.sb = qApp.mainWidget().statusBar()
+
+ self.parent = parent
+ self.vm = parent #viewManager
+ self.fileName = fn
+ self.fileInfo = None
+ self.lastModified = 0
+ self.jdc = jdc
+
+ self.fichier=None
+ self.panel_courant=None
+ self.node_selected = None
+ self.modified = False
+ self.isReadOnly = False
+
+ if not hasattr( readercata, 'reader' ):
+ readercata.reader = readercata.READERCATA( self, self )
+ self.readercata = readercata.reader
+
+
+ #------- construction du jdc --------------
+
+ jdc_item = None
+
+ if self.fileName is not None: # fichier jdc fourni
+ self.fileInfo = QFileInfo(self.fileName)
+ self.fileInfo.setCaching(0)
+ if editor is None:
+ self.jdc = self.readFile(self.fileName)
+ else:
+ self.top = editor.top
+ self.code = editor.code
+ self.version_code = editor.version_code
+ self.titre = editor.titre
+ self.dict_reels = editor.dict_reels
+ self.liste_simp_reel= editor.liste_simp_reel
+ self.format_fichier = editor.format_fichier
+ self.CONFIGURATION = editor.CONFIGURATION
+ self.CONFIGStyle = editor.CONFIGStyle
+ self.jdc = editor.jdc
+
+ self.lastModified = self.fileInfo.lastModified()
+ elif editor is not None:
+ self.jdc = editor.jdc
+ else:
+ if not self.jdc: # nouveau jdc
+ self.jdc = self._newJDC()
+
+ if self.jdc:
+ self.jdc.appli = self
+ txt_exception = None
+ if not jdc:
+ self.jdc.analyse()
+ txt_exception = self.jdc.cr.get_mess_exception()
+ if txt_exception:
+ self.jdc = None
+ qApp.restoreOverrideCursor()
+ self.affiche_infos("Erreur fatale au chargement de %s" %fn)
+ QMessageBox.critical( self, "Erreur fatale au chargement d'un fichier", txt_exception)
+ else:
+ comploader.charger_composants("QT")
+ jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
+
+ if not self.jdc.isvalid():
+ self.viewJdcRapport()
+
+ #------- config widget --------------
+
+ if jdc_item:
+ self.tree = browser.JDCTree( jdc_item, self )
+ self.connect(self.tree,SIGNAL('selectionChanged(QListViewItem *)'),self.updatePanel)
+
+ sh = self.sizeHint()
+ if sh.height() < 300:
+ sh.setHeight(300)
+ self.resize(sh)
+
+ # Make sure tabbing through a QWorkspace works.
+ self.setFocusPolicy(QWidget.StrongFocus)
+ self._updateReadOnly(1)
+
+ # Set the editors size if it is too big for the parent.
+ if parent is not None:
+ req = self.size()
+ bnd = req.boundedTo(parent.size())
+
+ if bnd.width() < req.width() or bnd.height() < req.height():
+ self.resize(bnd)
+
+ self.panel = QWidget(self)
+ self.connect(self, SIGNAL('modificationChanged(bool)'), self.handleModificationChanged)
+
+
+ #-------------------------------------------------------------------#
+ def _updateReadOnly(self, bForce=1):
+ #-------------------------------------------------------------------#
+ """
+ Private method to update the readOnly information for this editor.
+
+ If bForce is True, then updates everything regardless if
+ the attributes have actually changed, such as during
+ initialization time. A signal is emitted after the
+ caption change.
+
+ @param bForce 1 to force change, 0 to only update and emit
+ signal if there was an attribute change.
+ """
+
+ if self.fileName is None:
+ return
+ readOnly = not QFileInfo(self.fileName).isWritable() and 1 or 0
+ if not bForce and (readOnly == self.isReadOnly):
+ return
+ cap = self.fileName
+ if readOnly:
+ cap = "%s (ro)" % unicode(cap)
+ self.isReadOnly = readOnly
+ self.setCaption(cap)
+ self.emit(PYSIGNAL('captionChanged'), (cap, self))
+
+ #-------------------#
+ def _newJDC( self ):
+ #-------------------#
+ """
+ Initialise un nouveau JDC vierge
+ """
+ CONTEXT.unset_current_step()
+ jdc=self.readercata.cata[0].JdC( procedure="",
+ appli=self,
+ cata=self.readercata.cata,
+ cata_ord_dico=self.readercata.cata_ordonne_dico,
+ rep_mat=self.CONFIGURATION.rep_mat
+ )
+ jdc.analyse()
+ return jdc
+
+
+ #-----------------------#
+ def get_source(self,file):
+ #-----------------------#
+ import convert
+ format=self.format_fichier.get()
+
+ # Il faut convertir le contenu du fichier en fonction du format
+ if convert.plugins.has_key(format):
+ # Le convertisseur existe on l'utilise
+ p=convert.plugins[format]()
+ p.readfile(file)
+ text=p.convert('execnoparseur')
+ if not p.cr.estvide():
+ self.affiche_infos("Erreur a la conversion")
+ return text
+ else:
+ # Il n'existe pas c'est une erreur
+ self.affiche_infos("Type de fichier non reconnu")
+ QMessageBox.critical( self, "Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
+ return None
+
+ #---------------------------------------------#
+ def get_file(self,unite=None,fic_origine = ''):
+ #---------------------------------------------#
+ ulfile = None
+ jdcText = ""
+
+ titre = ""
+
+ if unite :
+ titre = "Choix unite %d " %unite
+ texte = "Le fichier %s contient une commande INCLUDE \n" % fic_origine
+ texte = texte+'Donnez le nom du fichier correspondant\n à l unité logique %d' % unite
+ labeltexte = 'Fichier pour unite %d :' % unite
+ else:
+ titre = "Choix d'un fichier de poursuite"
+ texte = "Le fichier %s contient une commande %s\n" %(fic_origine,'POURSUITE')
+ texte = texte+'Donnez le nom du fichier dont vous \n voulez faire une poursuite'
+ labeltexte = 'Fichier à poursuivre :'
+
+ fn = QFileDialog.getOpenFileName( None,
+ "",
+ self,
+ None,
+ labeltexte )
+
+ print 'GETFILE', fn
+
+ if fn.isNull():
+ return
+
+ ulfile = os.path.abspath(unicode(fn))
+ # On utilise le convertisseur défini par format_fichier
+ print 'GETFILE', ulfile
+ source=self.get_source(ulfile)
+ if source:
+ # On a réussi à convertir le fichier self.ulfile
+ jdcText = source
+ else:
+ # Une erreur a été rencontrée
+ jdcText = ''
+
+
+ return ulfile, jdcText
+
+
+ #-----------------------#
+ def readFile(self, fn):
+ #-----------------------#
+ """
+ Public slot to read the text from a file.
+
+ @param fn filename to read from (string or QString)
+ """
+ fn = unicode(fn)
+
+ qApp.setOverrideCursor(Qt.waitCursor)
+
+ # ------------------------------------------------------------------------------------
+ # charge le JDC
+ # ------------------------------------------------------------------------------------
+
+ jdcName=os.path.basename(fn)
+ # Il faut convertir le contenu du fichier en fonction du format
+ if convert.plugins.has_key( self.format_fichier.get() ):
+ # Le convertisseur existe on l'utilise
+ appli = self # CS_pbruno compatiblity parseur_python: self.appli.liste_simp_reel, self.appli.dict_reels
+ p=convert.plugins[self.format_fichier.get()]()
+ p.readfile(fn)
+ text=p.convert('exec',appli)
+ if not p.cr.estvide():
+ self.affiche_infos("Erreur à la conversion")
+
+ CONTEXT.unset_current_step()
+ ## os.chdir(self.initialdir)
+ jdc=self.readercata.cata[0].JdC(procedure=text,
+ appli=self,
+ cata=self.readercata.cata,
+ cata_ord_dico=self.readercata.cata_ordonne_dico,
+ nom=jdcName,
+ rep_mat=self.CONFIGURATION.rep_mat
+ )
+ # ----------------------------------------------------
+ # charge le JDC fin
+ # ----------------------------------------------------
+ self.modified = False
+
+ qApp.restoreOverrideCursor()
+ self.lastModified = self.fileInfo.lastModified()
+ return jdc
+
+ #----------------------------------------------#
+ def _viewText(self, txt, caption = "FILE_VIEWER"):
+ #----------------------------------------------#
+ w = qtCommun.ViewText( self.parent )
+ w.setCaption( caption )
+ w.setText(txt)
+ w.show()
+
+ #-----------------------#
+ def viewJdcSource(self):
+ #-----------------------#
+ format = self.format_fichier.get()
+ strSource = str( self.get_text_JDC(format) )
+ self._viewText(strSource, "JDC_SOURCE")
+
+ #-----------------------#
+ def viewJdcRapport(self):
+ #-----------------------#
+ strRapport = str( self.jdc.report() )
+ self._viewText(strRapport, "JDC_RAPPORT")
+
+ #-----------------------#
+ def handleRenamed(self, fn):
+ #-----------------------#
+ """
+ Public slot to handle the editorRenamed signal.
+
+ @param fn filename to be set for the editor (QString or string).
+ """
+ self.fileName = unicode(fn)
+ self.setCaption(self.fileName)
+
+ if self.fileInfo is None:
+ self.fileInfo = QFileInfo(self.fileName)
+ self.fileInfo.setCaching(0)
+
+ self.lastModified = self.fileInfo.lastModified()
+ self.vm.setEditorName(self, self.fileName)
+ self._updateReadOnly(1)
+
+ #-----------------------#
+ def handleNewView(self):
+ #-----------------------#
+ """
+ Private slot to create a new view to an open document.
+ """
+ self.vm.newEditorView(self.fileName, self)#, self.isPythonFile)
+
+ #------------------------------------#
+ def handleModificationChanged(self, m):
+ #------------------------------------#
+ """
+ Private slot to handle the modificationChanged signal.
+
+ It emits the signal modificationStatusChanged with parameters
+ m and self.
+
+ @param m modification status
+ """
+ if not m and self.fileInfo is not None:
+ self.lastModified = self.fileInfo.lastModified()
+ self.emit(PYSIGNAL('modificationStatusChanged'), (m, self))
+
+ #------------------------#
+ def hasSyntaxErrors(self):
+ #------------------------#
+ return False #CS_pbruno todo
+
+ #----------------#
+ def closeIt(self):
+ #----------------#
+ """
+ Public method called by the viewmanager to finally get rid of us.
+ """
+
+ if self.jdc:
+ self.jdc.supprime()
+ self.close()
+
+
+ #------------------------------#
+ def affiche_infos(self,message):
+ #------------------------------#
+ if self.sb:
+ self.sb.message(message)#,2000)
+
+ #------------------------------#
+ def updatePanel(self, jdcNode):
+ #------------------------------#
+ """
+ Appele a chaque changement de noeud
+ """
+ self.node_selected = jdcNode
+ if self.panel:
+ self.panel.close()
+ del self.panel
+ self.panel = None
+
+ print jdcNode.__class__
+ if jdcNode.item.isactif():
+ self.panel = jdcNode.getPanel()
+ else:
+ self.panel = panelsQT.PanelInactif(self.node_selected,self)
+
+ if not self.panel:
+ self.panel = panelsQT.NoPanel(self)
+
+ self.panel.show()
+
+
+
+ #-------------------#
+ def init_modif(self):
+ #-------------------#
+ """
+ Met l'attribut modified a 'o' : utilise par Eficas pour savoir
+ si un JDC doit etre sauvegarde avant destruction ou non
+ """
+ self.modified = True
+ self.emit(PYSIGNAL('modificationStatusChanged'), (True, self))
+
+ #-------------------#
+ def stop_modif(self):
+ #-------------------#
+ """
+ Met l'attribut modified à 'n' : utilisé par Eficas pour savoir
+ si un JDC doit etre sauvegardé avant destruction ou non
+ """
+ self.modified = False
+ self.emit(PYSIGNAL('modificationStatusChanged'), (False, self))
+
+
+ #-------------------#
+ def cut(self):
+ #-------------------#
+ """
+ Stocke dans Eficas.noeud_a_editer le noeud à couper
+ """
+ if not self.node_selected.item.iscopiable():
+ QMessageBox.information( self, "Copie impossible",
+ "Cette version d'EFICAS ne permet que la copie d'objets de type 'Commande' ou mot-clé facteur")
+ return
+ self.parent.edit="couper"
+ self.parent.noeud_a_editer = self.node_selected
+
+ #-------------------#
+ def copy(self):
+ #-------------------#
+ """
+ Stocke dans Eficas.noeud_a_editer le noeud a copier
+ """
+ if not self.node_selected.item.iscopiable():
+ QMessageBox.information( self, "Copie impossible",
+ "La copie d'un tel objet n'est pas permise")
+ return
+ self.parent.edit="copier"
+ self.parent.noeud_a_editer = self.node_selected
+
+ #-------------------#
+ def paste(self):
+ #-------------------#
+ """
+ Lance la copie de l'objet place dans self.parent.noeud_a_editer
+ Ne permet que la copie d'objets de type Commande ou MCF
+ """
+ try:
+ child=self.parent.noeud_a_editer.doPaste(self.node_selected)
+ except:
+ traceback.print_exc()
+ QMessageBox.information( self, "Copie impossible",
+ "L'action de coller apres un tel objet n'est pas permise")
+ return
+
+ if child == 0:
+ if self.message != '':
+ QMessageBox.critical( self, "Copie refusee", self.message)
+ self.message = ''
+ self.affiche_infos("Copie refusée")
+ return
+
+ # il faut declarer le JDCDisplay_courant modifie
+ self.init_modif()
+ # suppression eventuelle du noeud selectionne
+ # si possible on renomme l objet comme le noeud couper
+
+ if self.parent.edit == "couper":
+ #nom = self.parent.noeud_a_editer.item.object.sd.nom
+ item=self.parent.noeud_a_editer.item
+ self.parent.noeud_a_editer.delete()
+ child.item.update(item)
+ #test,mess = child.item.nomme_sd(nom)
+ child.select()
+
+ # on rend la copie a nouveau possible en liberant le flag edit
+ self.parent.edit="copier"
+
+ #---------------------#
+ def getFileName(self):
+ #---------------------#
+ return self.fileName
+
+ #---------------------#
+ def writeFile(self, fn):
+ #---------------------#
+ """
+ Public slot to write the text to a file.
+
+ @param fn filename to write to (string or QString)
+ @return flag indicating success
+ """
+ fn = unicode(fn)
+ txt = self.get_text_JDC('python')
+
+ eol = '\n'
+ if len(txt) >= len(eol):
+ if txt[-len(eol):] != eol:
+ txt += eol
+ else:
+ txt += eol
+ try:
+ f = open(fn, 'wb')
+ f.write(txt)
+ f.close()
+ return 1
+ except IOError, why:
+ QMessageBox.critical(self, self.trUtf8('Save File'),
+ self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
+ .arg(unicode(fn)).arg(str(why)))
+ return 0
+
+ #-----------------------------#
+ def get_text_JDC(self,format):
+ #-----------------------------#
+ if generator.plugins.has_key(format):
+ # Le generateur existe on l'utilise
+ g=generator.plugins[format]()
+ jdc_formate=g.gener(self.jdc,format='beautifie')
+ if not g.cr.estvide():
+ self.affiche_infos("Erreur à la generation")
+ QMessageBox.critical( self, "Erreur a la generation","EFICAS ne sait pas convertir ce JDC")
+ return
+ else:
+ return jdc_formate
+ else:
+ # Il n'existe pas c'est une erreur
+ self.affiche_infos("Format %s non reconnu" % format)
+ QMessageBox.critical( self, "Format %s non reconnu" % format,"EFICAS ne sait pas convertir le JDC en format %s "% format)
+ return
+
+
+ #-------------------------------------------#
+ def saveFile(self, saveas = 0, path = None):
+ #-------------------------------------------#
+ """
+ Public slot to save the text to a file.
+
+ @param saveas flag indicating a 'save as' action
+ @param path directory to save the file in (string or QString)
+ @return tuple of two values (boolean, string) giving a success indicator and
+ the name of the saved file
+ """
+ self.modified = True #CS_pbruno test
+
+ if not saveas and not self.modified:#self.isModified():
+ return (0, None) # do nothing if text wasn't changed
+
+ newName = None
+ if saveas or self.fileName is None:
+ if path is None and self.fileName is not None:
+ path = os.path.dirname(unicode(self.fileName))
+ selectedFilter = QString('')
+ fn = QFileDialog.getSaveFileName(path,
+ self.trUtf8("JDC (*.comm);;"
+ "All Files (*)"), self, None,
+ self.trUtf8("Save File"), selectedFilter, 0)
+
+ if not fn.isNull():
+ ext = QFileInfo(fn).extension()
+ if ext.isEmpty():
+ ex = selectedFilter.section('(*',1,1).section(')',0,0)
+ if not ex.isEmpty():
+ fn.append(ex)
+ if QFileInfo(fn).exists():
+ abort = QMessageBox.warning(self,
+ self.trUtf8("Save File"),
+ self.trUtf8("The file <b>%1</b> already exists.")
+ .arg(fn),
+ self.trUtf8("&Overwrite"),
+ self.trUtf8("&Abort"), None, 1)
+ if abort:
+ return (0, None)
+ fn = unicode(QDir.convertSeparators(fn))
+ newName = fn
+ else:
+ return (0, None)
+ else:
+ fn = self.fileName
+
+ if self.writeFile(fn):
+ self.fileName = fn
+ self.modified = False
+ self.setCaption(self.fileName)
+ if self.fileInfo is None or saveas:
+ self.fileInfo = QFileInfo(self.fileName)
+ self.fileInfo.setCaching(0)
+ self.emit(PYSIGNAL('editorRenamed'), (self.fileName,))
+ self.lastModified = self.fileInfo.lastModified()
+ if newName is not None:
+ self.vm.addToRecentList(newName)
+ self.emit(PYSIGNAL('editorSaved'), (self.fileName,))
+ self.stop_modif()
+ return (1, self.fileName)
+ else:
+ return (0, None)
+
+ #---------------------------------#
+ def saveFileAs(self, path = None):
+ #---------------------------------#
+ """
+ Public slot to save a file with a new name.
+
+ @param path directory to save the file in (string or QString)
+ @return tuple of two values (boolean, string) giving a success indicator and
+ the name of the saved file
+ """
+ return self.saveFile(1, path)
+
+
+
+
+
+if __name__=='__main__':
+ if hasattr(prefs,'encoding'):
+ # Hack pour changer le codage par defaut des strings
+ import sys
+ reload(sys)
+ sys.setdefaultencoding(prefs.encoding)
+ del sys.setdefaultencoding
+ # Fin hack
+
+ #CS_pbruno note: fait implicitement des trucs ces imports (grr)
+ import styles
+ import import_code
+ import session
+
+ # Analyse des arguments de la ligne de commande
+ options=session.parse(sys.argv)
+ code=options.code
+
+ app = QApplication(sys.argv)
+ mw = JDCEditor('azAster.comm')
+ app.setMainWidget(mw)
+ app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+ mw.show()
+
+ res = app.exec_loop()
+ sys.exit(res)
+
--- /dev/null
+class UserInterface(Eficas):
+ """
+ Class implementing the main user interface.
+
+ @signal appendStderr(string) emitted to write data to stderr logger
+ @signal appendStdout(string) emitted to write data to stdout logger
+ @signal preferencesChanged() emitted after the preferences were changed
+ """
+ def __init__(self):
+ """
+ Constructor
+
+ @param loc locale to be used by the UI (string)
+ @param splash reference to the splashscreen (UI.SplashScreen.SplashScreen)
+ """
+ Eficas.__init__(self)
+
+ # Generate the debug server object
+ dbs = DebugServer()
+
+
+ # Create main layout type 4 (floating windows)
+
+ # Create the view manager depending on the configuration setting
+ self.viewmanager = MyTabview(self, self, dbs) #MyTabview, MyWorkspace, Listspace
+ self.setCentralWidget(self.viewmanager)
+
+
+ self.connect(self,PYSIGNAL('preferencesChanged'),
+ self.viewmanager.handlePreferencesChanged)
+
+
+ self.connect(self.viewmanager,PYSIGNAL('lastEditorClosed'),
+ self.handleLastEditorClosed)
+ self.connect(self.viewmanager,PYSIGNAL('editorOpened'),
+ self.handleEditorOpened)
+
+
+
+ # Initialise the instance variables.
+ self.currentProg = None
+ self.isProg = 0
+ self.utEditorOpen = 0
+ self.utProjectOpen = 0
+
+ self.inDragDrop = 0
+ self.setAcceptDrops(1)
+
+
+
+ def handleLastEditorClosed(self):
+ """
+ Public slot to handle the lastEditorClosed signal.
+ """
+ pass
+
+ def handleEditorOpened(self, fn):
+ """
+ Public slot to handle the editorOpened signal.
+
+ @param fn filename of the opened editor (string)
+ """
+ pass
+
+ def fileOpen(self, prog=None):
+ self.viewmanager.handleOpen(prog)
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+# Modules Eficas
+
+from desChoixCata import DChoixCata
+from qt import *
+
+
+# Import des panels
+
+class MonChoixCata(DChoixCata):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,listeCata,readercata, parent = None,name = None,fl = 0):
+ DChoixCata.__init__(self,parent,name,fl)
+ self.listeCata=listeCata
+ self.readercata=readercata
+ for cata in self.listeCata :
+ self.CBChoixCata.insertItem(cata,0)
+ lab = QString(repr(len(listeCata)))
+ lab += QString(" versions du catalogue sont disponibles")
+ self.TLNb.setText(lab)
+ self.readercata.version_cata=self.CBChoixCata.currentText()
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def CataChoisi(self):
+ self.readercata.version_cata=self.CBChoixCata.currentText()
+
+ def BOkPressed(self):
+ QDialog.accept(self)
+
+ def BCancelPressed(self):
+ QDialog.reject(self)
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+# Modules Eficas
+
+from desCommande import DComm
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW1
+from qtCommun import QTPanelTBW2
+from qtCommun import QTPanelTBW3
+from qt import *
+
+
+# Import des panels
+
+class MonCommandePanel(DComm,QTPanelTBW1,QTPanelTBW2,QTPanelTBW3):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ DComm.__init__(self,parent,name,fl)
+ QTPanel.__init__(self,node,parent)
+ QTPanelTBW1.__init__(self,node,parent)
+ QTPanelTBW2.__init__(self,node,parent)
+ QTPanelTBW3.__init__(self,node,parent)
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def BOkPressed(self):
+ QTPanel.BOkPressed(self)
+
+ def BNextPressed(self):
+ QTPanelTBW2.BNextPressed(self)
+
+ def BuildTabCommand(self):
+ QTPanelTBW2.BuildLBNouvCommande(self)
+
+ def LEFiltreTextChanged(self):
+ QTPanelTBW2.LEFiltreTextChanged(self)
+
+ def LEfiltreReturnPressed(self):
+ QTPanelTBW2.LEfiltreReturnPressed(self)
+
+ def LBNouvCommandeClicked(self):
+ QTPanelTBW2.LBNouvCommandeClicked(self)
+
+ def LENomConceptReturnPressed(self):
+ QTPanelTBW3.LENomConceptReturnPressed(self)
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+
+# Modules Eficas
+
+from qt import *
+
+from desCommentaire import DComment
+from qtCommun import QTPanel
+from Aster import prefs
+
+# Import des panels
+
+class MonCommentairePanel(DComment,QTPanel):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ QTPanel.__init__(self,node,parent)
+ DComment.__init__(self,parent,name,fl)
+ self.RemplitPanel()
+
+ def RemplitPanel(self):
+ texte=self.node.item.get_valeur()
+ self.textCommentaire.setText(texte)
+
+ def TexteCommentaireEntre(self):
+ texte=self.textCommentaire.text().latin1()
+ self.editor.init_modif()
+ self.node.item.set_valeur(texte)
+ self.node.onValid()
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from qt import *
+
+# Modules Eficas
+
+from monPlusieursBasePanel import MonPlusieursBasePanel
+
+# Import des panels
+
+class MonFonctionPanel(MonPlusieursBasePanel):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ self.node=node
+ self.SetNbValeurs()
+ MonPlusieursBasePanel.__init__(self,node,parent,name,fl)
+
+ def SetNbValeurs(self):
+ genea=self.node.item.get_genealogie()
+ if "VALE" in genea:
+ self.nbValeurs=2
+ if "VALE_C" in genea:
+ self.nbValeurs=3
+
+
+ def DecoupeListeValeurs(self,liste):
+ #decoupe la liste des valeurs en n ( les x puis les y)
+ l_valeurs=[]
+ if (len(liste)% self.nbValeurs != 0):
+ message="La cardinalité n'est pas correcte, la dernière valeur est ignorée"
+ self.Commentaire.setText(QString(commentaire))
+ for i in range(len(liste)/ self.nbValeurs) :
+ if (self.nbValeurs==2):
+ t=(liste[i*self.nbValeurs], liste[i*self.nbValeurs+1])
+ else:
+ t=(liste[i*self.nbValeurs], liste[i*self.nbValeurs+1], liste[i*self.nbValeurs+2])
+ l_valeurs.append(t)
+ return l_valeurs
+
+ def BuildLBValeurs(self):
+ self.LBValeurs.clear()
+ listeValeurs=self.node.item.GetListeValeurs()
+ for valeur in self.DecoupeListeValeurs(listeValeurs):
+ self.LBValeurs.insertItem(str(valeur))
+
+ def Ajout1Valeur(self):
+ liste,validite=self.TraiteLEValeur()
+ if validite == 0 : return
+ if liste ==[] : return
+
+ if len(liste) != self.nbValeurs :
+ commentaire = QString(str(liste))
+ commentaire += QString(" n est pas un tuple de ")
+ commentaire += QString(str(self.nbValeurs))
+ commentaire += QString(" valeurs")
+ self.Commentaire.setText(commentaire)
+ return
+
+ index=self.LBValeurs.currentItem() +1
+ indexListe=index*self.nbValeurs
+ if index == 0 :
+ index = -1
+ indexListe=len(self.listeValeursCourantes)
+ listeVal=[]
+ for valeur in self.listeValeursCourantes :
+ listeVal.append(valeur)
+ validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,index,listeVal)
+ self.Commentaire.setText(comm2)
+ if not validite :
+ self.editor.affiche_infos(comm)
+ else:
+ self.LEValeur.setText(QString(""))
+ l1=self.listeValeursCourantes[:indexListe]
+ l3=self.listeValeursCourantes[indexListe:]
+ for valeur in self.DecoupeListeValeurs(listeRetour):
+ self.LBValeurs.insertItem(QString(str(valeur)),index)
+ index=index+1
+ self.listeValeursCourantes=l1+listeRetour+l3
+
+
+ def Sup1Valeur(self):
+ index=self.LBValeurs.currentItem()
+ self.LBValeurs.removeItem(self.LBValeurs.currentItem())
+ listeVal=[]
+ i=0
+ for valeur in self.listeValeursCourantes :
+ if self.nbValeurs == 2 :
+ if (i != index*2 and i != index*2+1 ) : listeVal.append(valeur)
+ elif self.nbValeurs == 3 :
+ if (i != index*3 and i != index*3+1 and i != index*3 +2) : listeVal.append(valeur)
+ else :
+ print "aiiiiiiiiiiiiiiiiiieeee"
+ i = i+1
+ print listeVal
+ self.listeValeursCourantes=listeVal
+ listeValeurs=self.listeValeursCourantes
+ self.LBValeurs.clear()
+ for valeur in self.DecoupeListeValeurs(listeValeurs):
+ self.LBValeurs.insertItem(str(valeur))
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+# Modules Eficas
+
+from desFormule import DFormule
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW2
+from qt import *
+
+
+# Import des panels
+
+class MonFormulePanel(DFormule,QTPanelTBW2):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ DFormule.__init__(self,parent,name,fl)
+ QTPanel.__init__(self,node,parent)
+ QTPanelTBW2.__init__(self,node,parent)
+ self.LENomFormule.setText(node.item.get_nom())
+ self.LECorpsFormule.setText(node.item.get_corps())
+ texte_args=""
+ for i in node.item.get_args() :
+ if texte_args != "" :
+ texte_args = texte_args +","
+ texte_args=texte_args + i
+ self.LENomsArgs.setText(texte_args)
+
+
+ self.parent=parent
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def BOkPressed(self):
+ QTPanel.BOkPressed(self)
+
+ def BNextPressed(self):
+ QTPanelTBW2.BNextPressed(self)
+
+ def BuildTabCommand(self):
+ QTPanelTBW2.BuildLBNouvCommande(self)
+
+ def LEFiltreTextChanged(self):
+ QTPanelTBW2.LEFiltreTextChanged(self)
+
+ def LEfiltreReturnPressed(self):
+ QTPanelTBW2.LEfiltreReturnPressed(self)
+
+ def LBNouvCommandeClicked(self):
+ QTPanelTBW2.LBNouvCommandeClicked(self)
+
+ def NomFormuleSaisi(self):
+ nomFormule = self.LENomFormule.text().latin1()
+ if nomFormule == '' : return
+ test,erreur = self.node.item.verif_nom(nomFormule)
+ if test :
+ commentaire=nomFormule+" est un nom valide pour une FORMULE"
+ else :
+ commentaire=nomFormule+" n'est pas un nom valide pour une FORMULE"
+ self.editor.affiche_infos(commentaire)
+
+ def argsSaisis(self):
+ arguments = self.LENomsArgs.text().latin1()
+ if arguments == '' : return
+
+ test,erreur = self.node.item.verif_arguments(arguments)
+ if test:
+ commentaire="Argument(s) valide(s) pour une FORMULE"
+ else:
+ commentaire="Argument(s) invalide(s) pour une FORMULE"
+ self.editor.affiche_infos(commentaire)
+
+ def FormuleSaisie(self):
+ nomFormule = self.LENomFormule.text().latin1()
+ arguments = self.LENomsArgs.text().latin1()
+ expression = self.LECorpsFormule.text().latin1()
+ if expression == '' : return
+ test,erreur = self.node.item.verif_formule_python((nomFormule,"REEL",arguments,expression))
+
+ if test:
+ commentaire="Corps de FORMULE valide"
+ else:
+ commentaire="Corps de FORMULE invalide"
+ self.editor.affiche_infos(commentaire)
+
+
+ def BOkPressedFormule(self):
+ if self.parent.modified == 'n' : self.parent.init_modif()
+
+ nomFormule = self.LENomFormule.text().latin1()
+ test,erreur = self.node.item.verif_nom(nomFormule)
+ if not test :
+ self.editor.affiche_infos(erreur)
+ return
+
+ arguments = self.LENomsArgs.text().latin1()
+ test,erreur = self.node.item.verif_arguments(arguments)
+ if not test :
+ self.editor.affiche_infos(erreur)
+ return
+
+ expression = self.LECorpsFormule.text().latin1()
+ test,erreur = self.node.item.verif_formule_python((nomFormule,"REEL",arguments,expression))
+ if not test :
+ self.editor.affiche_infos(erreur)
+ return
+
+ test=self.node.item.object.update_formule_python(formule=(nomFormule,"REEL",arguments,expression))
+ test,erreur = self.node.item.save_formule(nomFormule,"REEL",arguments,expression)
+ if test :
+ self.node.update_valid()
+ self.node.update_node_texte()
+ commentaire = "Formule modifiée"
+ else:
+ commentaire ="Formule incorrecte : " + erreur
+ self.editor.init_modif()
+ self.editor.affiche_infos(commentaire)
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+# Modules Eficas
+
+from desMCFact import DMCFact
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW1
+from qt import *
+
+
+# Import des panels
+
+class MonMCFactPanel(DMCFact,QTPanelTBW1):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ DMCFact.__init__(self,parent,name,fl)
+ QTPanel.__init__(self,node,parent)
+ QTPanelTBW1.__init__(self,node,parent)
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def BOkPressed(self):
+ QTPanel.BOkPressed(self)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+# Modules Eficas
+
+from desMCListAjout import DMCListAjout
+from qtCommun import QTPanel
+from qt import *
+
+
+# Import des panels
+
+class MonMCListAjoutPanel(DMCListAjout,QTPanel):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node,parent = None,name = None,fl = 0):
+ DMCListAjout.__init__(self,parent,name,fl)
+ QTPanel.__init__(self,node,parent)
+ monMCFact=self.node.item.get_nom()
+ self.MCFacteur.setText(QString(monMCFact))
+ self.MCFacteur.setAlignment(Qt.AlignHCenter)
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def BAjoutClicked(self):
+ self.node.parent.append_child(self.node.item.get_nom())
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+# Modules Eficas
+
+from desMacro import DMacro
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW1
+from qtCommun import QTPanelTBW2
+from qt import *
+
+
+# Import des panels
+
+class MonMacroPanel(DMacro,QTPanelTBW1,QTPanelTBW2):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ DMacro.__init__(self,parent,name,fl)
+ QTPanel.__init__(self,node,parent)
+ QTPanelTBW2.__init__(self,node,parent)
+ QTPanelTBW1.__init__(self,node,parent)
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def BOkPressed(self):
+ QTPanel.BOkPressed(self)
+
+ def BNextPressed(self):
+ QTPanelTBW2.BNextPressed(self)
+
+ def BuildTabCommand(self):
+ QTPanelTBW2.BuildLBNouvCommande(self)
+
+ def LEFiltreTextChanged(self):
+ QTPanelTBW2.LEFiltreTextChanged(self)
+
+ def LEfiltreReturnPressed(self):
+ QTPanelTBW2.LEfiltreReturnPressed(self)
+
+ def LBNouvCommandeClicked(self):
+ QTPanelTBW2.LBNouvCommandeClicked(self)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+
+# Modules Eficas
+from Aster import prefs
+
+from qt import *
+from monPlusieursIntoPanel import MonPlusieursIntoPanel
+from desPlusieursInto import DPlusInto
+from qtCommun import QTPanel
+from politiquesValidation import PolitiquePlusieurs
+# Import des panels
+
+class MonPlusieursASSDPanel(MonPlusieursIntoPanel):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ QTPanel.__init__(self,node,parent)
+ DPlusInto.__init__(self,parent,name,fl)
+
+ self.listeValeursCourantes=self.node.item.GetListeValeurs()
+ self.InitValeursCourantes()
+ self.DisplayListBoxCourantes()
+ self.DisplayListBoxPossibles()
+
+ self.politique=PolitiquePlusieurs(node,parent)
+ #QObject.connect(self.listBoxVal, SIGNAL("doubleClicked(QListBoxItem*)" ), self.Ajout1Valeur )
+ # QObject.connect(self.listBoxVal, SIGNAL("doubleClicked(QListBoxItem*)" ), self.ClicASSD )
+
+ def DisplayListBoxPossibles(self):
+ listeNomsSD = self.node.item.get_sd_avant_du_bon_type()
+ self.listBoxVal.clear()
+ for aSD in listeNomsSD:
+ if aSD not in self.listNomsValeurs :
+ self.listBoxVal.insertItem( aSD)
+
+ def DisplayListBoxCourantes(self):
+ self.LBValeurs.clear()
+ for aSD in self.listNomsValeurs :
+ self.LBValeurs.insertItem( aSD)
+
+ def InitValeursCourantes(self):
+ self.listNomsValeurs=[]
+ for i in self.listeValeursCourantes :
+ self.listNomsValeurs.append(i.get_name())
+
+ def BOkPourListePressed(self):
+ self.node.item.set_valeur(self.listeValeursCourantes)
+ self.editor.affiche_infos("Valeur Acceptée")
+ pass
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def Sup1Valeur(self):
+ index=self.LBValeurs.currentItem()
+ self.LBValeurs.removeItem(self.LBValeurs.currentItem())
+ listeVal=[]
+ i=0
+ for valeur in self.listeValeursCourantes :
+ if i != index : listeVal.append(valeur)
+ i = i+1
+ self.listeValeursCourantes=listeVal
+ self.InitValeursCourantes()
+ self.DisplayListBoxCourantes()
+ self.DisplayListBoxPossibles()
+
+ def Ajout1Valeur(self):
+ liste=[]
+ liste.append(self.listBoxVal.currentText().latin1())
+ index=self.LBValeurs.currentItem() + 1
+ if index==0 : index = -1
+ listeVal=[]
+ for valeur in self.listeValeursCourantes :
+ listeVal.append(valeur)
+ validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,index,listeVal)
+ self.Commentaire.setText(comm2)
+ if not validite :
+ self.editor.affiche_infos(comm)
+ else:
+ l1=self.listeValeursCourantes[:index]
+ l3=self.listeValeursCourantes[index:]
+ for valeur in listeRetour:
+ self.LBValeurs.insertItem(QString(str(valeur)),index)
+ index=index+1
+ self.listeValeursCourantes=l1+listeRetour+l3
+ self.InitValeursCourantes()
+ self.DisplayListBoxCourantes()
+ self.DisplayListBoxPossibles()
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+
+# Modules Eficas
+from Aster import prefs
+
+from qt import *
+
+from desPlusieursBase import DPlusBase
+from qtCommun import QTPanel
+from qtSaisie import SaisieValeur
+from politiquesValidation import PolitiquePlusieurs
+
+# Import des panels
+
+class MonPlusieursBasePanel(DPlusBase,QTPanel,SaisieValeur):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ QTPanel.__init__(self,node,parent)
+ DPlusBase.__init__(self,parent,name,fl)
+ self.politique=PolitiquePlusieurs(node,parent)
+ self.BuildLBValeurs()
+ self.listeValeursCourantes=self.node.item.GetListeValeurs()
+
+ def BuildLBValeurs(self):
+ # redefinit en raison de l heritage par monFonctionPanel
+ SaisieValeur.BuildLBValeurs(self)
+
+ def BOkPourListePressed(self):
+ self.node.item.set_valeur(self.listeValeursCourantes)
+ self.editor.affiche_infos("Valeur Acceptée")
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def LEValeurPressed(self):
+ self.Ajout1Valeur()
+
+ def Sup1Valeur(self):
+ index=self.LBValeurs.currentItem()
+ self.LEValeur.setText(self.LBValeurs.currentText())
+ self.LBValeurs.removeItem(self.LBValeurs.currentItem())
+ listeVal=[]
+ i=0
+ for valeur in self.listeValeursCourantes :
+ if i != index : listeVal.append(valeur)
+ i = i+1
+ self.listeValeursCourantes=listeVal
+
+
+ def Ajout1Valeur(self):
+ liste,validite=SaisieValeur.TraiteLEValeur(self)
+ if validite == 0 : return
+ if liste ==[] : return
+
+ index=self.LBValeurs.currentItem() + 1
+ listeVal=[]
+ for valeur in self.listeValeursCourantes :
+ listeVal.append(valeur)
+ validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,index,listeVal)
+ self.Commentaire.setText(comm2)
+ if not validite :
+ self.editor.affiche_infos(comm)
+ else:
+ self.LEValeur.setText(QString(""))
+ l1=self.listeValeursCourantes[:index]
+ l3=self.listeValeursCourantes[index:]
+ for valeur in listeRetour:
+ self.LBValeurs.insertItem(QString(str(valeur)),index)
+ index=index+1
+ self.listeValeursCourantes=l1+listeRetour+l3
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+
+# Modules Eficas
+from Aster import prefs
+
+from qt import *
+
+from desPlusieursInto import DPlusInto
+from qtCommun import QTPanel
+from qtSaisie import SaisieValeur
+from politiquesValidation import PolitiquePlusieurs
+
+# Import des panels
+
+class MonPlusieursIntoPanel(DPlusInto,QTPanel,SaisieValeur):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ QTPanel.__init__(self,node,parent)
+ DPlusInto.__init__(self,parent,name,fl)
+ self.politique=PolitiquePlusieurs(node,parent)
+ SaisieValeur.BuildLBValeurs(self)
+ self.listeValeursCourantes=self.node.item.GetListeValeurs()
+ SaisieValeur.RemplitPanel(self,self.listeValeursCourantes)
+ QObject.connect(self.listBoxVal, SIGNAL("doubleClicked(QListBoxItem*)" ), self.Ajout1Valeur )
+
+ def BOkPourListePressed(self):
+ self.node.item.set_valeur(self.listeValeursCourantes)
+ self.editor.affiche_infos("Valeur Acceptée")
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def Sup1Valeur(self):
+ index=self.LBValeurs.currentItem()
+ self.LBValeurs.removeItem(self.LBValeurs.currentItem())
+ listeVal=[]
+ i=0
+ for valeur in self.listeValeursCourantes :
+ if i != index : listeVal.append(valeur)
+ i = i+1
+ self.listeValeursCourantes=listeVal
+ SaisieValeur.RemplitPanel(self,self.listeValeursCourantes)
+
+ def Ajout1Valeur(self):
+ liste=[]
+ liste.append(self.listBoxVal.currentText().latin1())
+ index=self.LBValeurs.currentItem() + 1
+ if index==0 : index = -1
+ listeVal=[]
+ for valeur in self.listeValeursCourantes :
+ listeVal.append(valeur)
+ validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,index,listeVal)
+ self.Commentaire.setText(comm2)
+ if not validite :
+ self.editor.affiche_infos(comm)
+ else:
+ l1=self.listeValeursCourantes[:index]
+ l3=self.listeValeursCourantes[index:]
+ for valeur in listeRetour:
+ self.LBValeurs.insertItem(QString(str(valeur)),index)
+ index=index+1
+ self.listeValeursCourantes=l1+listeRetour+l3
+ SaisieValeur.RemplitPanel(self,self.listeValeursCourantes)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+# Modules Eficas
+
+from desRacine import DRac
+from qtCommun import QTPanel
+from qtCommun import QTPanelTBW2
+from qtCommun import itemColore
+from qt import *
+
+
+# Import des panels
+
+class MonRacinePanel(DRac,QTPanelTBW2):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ DRac.__init__(self,parent,name,fl)
+ QTPanel.__init__(self,node,parent)
+ QTPanelTBW2.__init__(self,node,parent)
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def BOkPressed(self):
+ QTPanel.BOkPressed(self)
+
+ def BNextPressed(self):
+ QTPanelTBW2.BNextPressed(self)
+
+ def BuildTabCommand(self):
+ QTPanelTBW2.BuildLBNouvCommande(self)
+
+ def LEFiltreTextChanged(self):
+ QTPanelTBW2.LEFiltreTextChanged(self)
+
+ def LEfiltreReturnPressed(self):
+ QTPanelTBW2.LEfiltreReturnPressed(self)
+
+ def LBNouvCommandeClicked(self):
+ QTPanelTBW2.LBNouvCommandeClicked(self)
+
+ def AppelleBuildLBRegles(self):
+ listeRegles=self.node.item.get_regles()
+ listeNomsEtapes = self.node.item.get_l_noms_etapes()
+ self.BuildLBRegles(listeRegles,listeNomsEtapes)
+
+ def DefCmd(self):
+ name=str(self.LBNouvCommande.selectedItem().text())
+ if name==QString(" "): return
+ if name.find("GROUPE :")==0 : return
+ self.editor.init_modif()
+ new_node = self.node.append_child(name,'first')
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+
+# Modules Eficas
+from Aster import prefs
+
+from qt import *
+
+from desUniqueASSD import DUnASSD
+from qtCommun import QTPanel
+from qtSaisie import SaisieValeur
+from politiquesValidation import PolitiqueUnique
+
+# Import des panels
+
+class MonUniqueASSDPanel(DUnASSD,QTPanel,SaisieValeur):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ QTPanel.__init__(self,node,parent)
+ DUnASSD.__init__(self,parent,name,fl)
+ self.politique=PolitiqueUnique(node,parent)
+ self.InitListBoxASSD()
+
+ def BOkPressed(self):
+ self.clicASSD()
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+
+# Modules Eficas
+from Aster import prefs
+
+from qt import *
+
+from desUniqueBase import DUnBase
+from qtCommun import QTPanel
+from qtSaisie import SaisieValeur
+from politiquesValidation import PolitiqueUnique
+
+# Import des panels
+
+class MonUniqueBasePanel(DUnBase,QTPanel,SaisieValeur):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ QTPanel.__init__(self,node,parent)
+ DUnBase.__init__(self,parent,name,fl)
+ self.politique=PolitiqueUnique(node,parent)
+ self.InitLineEditVal()
+
+ def InitLineEditVal(self):
+ valeur=self.node.item.get_valeur()
+ valeurTexte=self.politique.GetValeurTexte(valeur)
+ if valeurTexte != None:
+ try :
+ str=QString("").setNum(valeurTexte)
+ except :
+ str=QString(valeurTexte)
+ self.lineEditVal.setText(str)
+
+ def BOk2Pressed(self):
+ SaisieValeur.BOk2Pressed(self)
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
+ def LEValeurPressed(self):
+ SaisieValeur.LEValeurPressed(self)
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os,re
+
+# Modules Eficas
+from Aster import prefs
+
+from qt import *
+
+from desUniqueComp import DUnComp
+from qtCommun import QTPanel
+from politiquesValidation import PolitiqueUnique
+
+# Import des panels
+
+#class MonUniqueCompPanel(DUnComp,QTPanel,SaisieValeur):
+class MonUniqueCompPanel(DUnComp,QTPanel,PolitiqueUnique):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ QTPanel.__init__(self,node,parent)
+ DUnComp.__init__(self,parent,name,fl)
+ self.politique=PolitiqueUnique(node,parent)
+ self.InitLinesVal()
+
+ def InitLinesVal(self):
+ valeur=self.node.item.get_valeur()
+ if valeur == None or valeur == '' : return
+ if type(valeur) not in (types.ListType,types.TupleType) :
+ self.LEcomp.setText(str(valeur))
+ else :
+ typ_cplx,x1,x2=valeur
+ self.LEReel.setText(str(x1))
+ self.LEImag.setText(str(x2))
+ if typ_cplx == "RI" :
+ self.buttonGroup1.setButton(1)
+ else :
+ self.buttonGroup1.setButton(0)
+
+
+ def LEcompRPressed(self) :
+ self.LEReel.clear()
+ self.LEImag.clear()
+ commentaire="expression valide"
+ valeur = str(self.LEcomp.text())
+ d={}
+ try :
+ v=eval(valeur,d)
+ except :
+ commentaire="expression invalide"
+ self.editor.affiche_infos(commentaire)
+ return
+ try :
+ i=v.imag
+ except :
+ commentaire="expression n est pas de la forme a+bj"
+ self.editor.affiche_infos(commentaire)
+
+ def LEReelRPressed(self):
+ self.LEcomp.clear()
+ commentaire="expression valide"
+ valeur = str(self.LEReel.text())
+ try :
+ a=string.atof(valeur)
+ except :
+ commentaire="expression invalide"
+ self.editor.affiche_infos(commentaire)
+
+ def LEImagRPressed(self):
+ self.LEcomp.clear()
+ commentaire="expression valide"
+ valeur = str(self.LEImag.text())
+ try :
+ a=string.atof(valeur)
+ except :
+ commentaire="expression invalide"
+ self.editor.affiche_infos(commentaire)
+
+ def BOkPressed(self):
+ if self.LEcomp.text()== "" :
+ valeur = self.getValeurAster()
+ else :
+ if self.LEReel.text() != "" or self.LEImag.text() != "" :
+ commentaire="entrer une seule valeur SVP"
+ self.editor.affiche_infos(commentaire)
+ return
+ valeur= self.getValeurComp()
+ self.politique.RecordValeur(valeur)
+
+ def getValeurAster(self):
+ """
+ Retourne le complexe saisi par l'utilisateur
+ """
+ l=[]
+ if (self.buttonGroup1.selectedId() == 0 ) :
+ l.append("MP")
+ elif (self.buttonGroup1.selectedId() == 1) :
+ l.append("RI")
+ else :
+ commentaire="saisir le type de complexe"
+ self.editor.affiche_infos(commentaire)
+ return None
+ try :
+ l.append(string.atof(str(self.LEReel.text())))
+ l.append(string.atof(str(self.LEImag.text())))
+ except :
+ return None
+ return `tuple(l)`
+
+ def getValeurComp(self):
+ commentaire="expression valide"
+ valeur = str(self.LEcomp.text())
+ d={}
+ try :
+ v=eval(valeur,d)
+ except :
+ commentaire="expression invalide"
+ self.editor.affiche_infos(commentaire)
+ return None
+ try :
+ i=v.imag
+ except :
+ commentaire="expression n est pas de la forme a+bj"
+ self.editor.affiche_infos(commentaire)
+ return None
+ return v
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+
+# Modules Eficas
+from Aster import prefs
+
+from qt import *
+
+from desUniqueIntoPanel import DUnIn
+from qtCommun import QTPanel
+from qtSaisie import SaisieValeur
+from politiquesValidation import PolitiqueUnique
+
+# Import des panels
+
+class MonUniqueIntoPanel(DUnIn,QTPanel,SaisieValeur):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def __init__(self,node, parent = None,name = None,fl = 0):
+ QTPanel.__init__(self,node,parent)
+ DUnIn.__init__(self,parent,name,fl)
+ SaisieValeur.RemplitPanel(self)
+ self.politique=PolitiqueUnique(node,parent)
+ QObject.connect(self.listBoxVal, SIGNAL("doubleClicked(QListBoxItem*)" ), self.ClicValeur )
+
+ def ClicValeur(self):
+ SaisieValeur.ClicValeur(self)
+
+ def BOkPressed(self):
+ SaisieValeur.BOkPressed(self)
+
+ def BSupPressed(self):
+ QTPanel.BSupPressed(self)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'myMain.ui'
+#
+# Created: lun mar 5 15:21:40 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+ "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+ "\x74\x49\x44\x41\x54\x38\x8d\xed\xd5\xc1\x09\xc0" \
+ "\x20\x0c\x05\xd0\x6f\xe9\x36\x81\x2c\x10\xb2\xff" \
+ "\xdd\x85\xd2\x53\x85\xb6\xa9\x91\x48\x0f\x05\x3f" \
+ "\x08\x1a\xf0\x29\x12\x10\xf8\x28\xc5\xa9\xd9\xc4" \
+ "\xde\x96\xcd\x2b\x9a\xd9\xeb\x00\x00\x66\x0e\x2f" \
+ "\xe0\xc2\x51\x98\x39\xc4\xf7\x0c\x4c\x44\x6d\x5e" \
+ "\x6b\x35\x38\xcf\x92\x82\x45\xe4\xb2\xf6\xf0\x14" \
+ "\xac\xaa\x8f\xda\x1d\x4f\xc1\xa5\x74\x1b\x22\x07" \
+ "\x9f\x9d\x11\x1d\x96\xea\x8a\x91\x2c\x78\xc1\x0b" \
+ "\xee\x64\xe6\x07\x19\xf5\x7e\x92\x03\xad\x45\x2a" \
+ "\x04\xcc\x4e\x50\x20\x00\x00\x00\x00\x49\x45\x4e" \
+ "\x44\xae\x42\x60\x82"
+image1_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+ "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+ "\x99\x49\x44\x41\x54\x38\x8d\xed\x94\x41\x0e\x85" \
+ "\x20\x0c\x44\x5f\x89\xc7\x36\x7f\x61\xbc\x77\x5d" \
+ "\x28\x48\xa4\x28\x60\xff\xce\xd9\x54\x8b\xbe\x8e" \
+ "\x13\x04\x3e\x1d\x92\x81\x77\xf4\x81\xa1\x23\xdc" \
+ "\x2b\x34\xf6\xf4\x7a\x3d\xe2\xb8\x65\xa8\x84\x3f" \
+ "\x40\x01\x98\x2a\x0b\x3d\x5f\x62\xc5\x83\x00\xaa" \
+ "\x1a\xd7\x05\x50\x44\x9a\xb9\xd5\x07\xa7\x73\xa8" \
+ "\xa4\xba\x4f\x92\xa2\xdf\x33\x3c\x64\xc6\x3b\xeb" \
+ "\xbd\x82\xe5\xb8\xad\xde\xcb\xcc\x78\x20\xeb\x42" \
+ "\x66\xc6\x39\x74\x5d\xfa\x80\xf3\x6f\xaf\x66\xc6" \
+ "\x6f\xa1\x9c\x3f\x88\x2f\xb4\x70\xec\x05\xcd\xc0" \
+ "\xbe\xd0\x78\x93\xf6\x8e\x17\x14\x92\x63\x5f\x68" \
+ "\x6c\x3e\xef\xf6\xba\x3c\x8f\xdd\x36\x6d\xc4\xc0" \
+ "\x45\x2c\x87\x81\xf8\x08\x00\x00\x00\x00\x49\x45" \
+ "\x4e\x44\xae\x42\x60\x82"
+image2_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+ "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+ "\xa0\x49\x44\x41\x54\x38\x8d\xd5\x95\x4d\x0a\x80" \
+ "\x20\x10\x85\x9f\xd1\x46\x68\xe1\x8d\xe6\x62\xd2" \
+ "\x22\xbc\x98\x37\x6a\x21\xb4\xac\x45\x19\x92\xc6" \
+ "\x64\x69\xe0\xb7\xf1\x87\xf1\xf1\x1c\x47\x05\x2a" \
+ "\x21\x8e\x76\x2d\xad\xdb\xfb\x9e\x99\xf6\x56\x8f" \
+ "\x80\xb5\x36\x4b\x85\x88\xce\x35\x44\x04\x00\xe8" \
+ "\x0a\x39\x8c\xe8\xf9\x90\x34\xd2\x29\x2c\xc3\x7c" \
+ "\x8e\xbd\x53\x0f\xeb\x58\x3a\x05\xe9\x54\x34\x1f" \
+ "\x8a\x02\x7b\x2a\x7d\x3a\x1f\x09\xbf\x85\x4d\xc5" \
+ "\xd5\xd9\x53\xaa\x39\x6e\x4f\x38\xca\xb1\x99\xe2" \
+ "\xd2\xe1\x08\xab\xe1\x56\xf8\x2e\x30\x97\x7f\xcb" \
+ "\x4d\x8f\xf9\x42\xd7\x5d\xbe\xbe\xd2\xe1\x43\x95" \
+ "\x3a\x93\xf6\xca\xad\x3d\x61\x11\xf4\x4b\x7d\x4f" \
+ "\x82\x0f\xf9\xc0\x06\x9b\xb5\x1e\xcd\xed\x31\x8c" \
+ "\x5c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60" \
+ "\x82"
+image3_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+ "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+ "\x73\x49\x44\x41\x54\x38\x8d\xed\x92\xc1\x0e\x80" \
+ "\x20\x08\x40\xb1\xef\x66\x1d\x1c\xff\x4d\x87\x6a" \
+ "\xa8\x88\xa1\x76\x69\xf9\x36\x0f\x28\x3e\xd8\x00" \
+ "\x60\xf1\x59\x42\x5f\x3a\x71\xf5\x36\x02\xe0\x8e" \
+ "\x99\x2b\x09\x88\x01\xd0\x28\x54\x17\x6a\xe4\x7f" \
+ "\x21\xce\x1f\xb5\xb0\x5d\x38\xed\xdc\x90\x60\xd0" \
+ "\xf1\x13\x79\x63\x5b\x3b\xc9\x2b\xd5\x18\xe2\x39" \
+ "\xa9\x43\xec\x1d\x5a\xb7\x78\x5c\xee\x10\x7b\xe4" \
+ "\xb2\x15\xaf\x40\x91\xf8\x94\xde\x47\x18\x1e\xce" \
+ "\xa5\x9e\xde\x9e\xc5\x9f\x38\x00\x62\xac\x28\xb1" \
+ "\xe3\xd7\x01\xd9\x00\x00\x00\x00\x49\x45\x4e\x44" \
+ "\xae\x42\x60\x82"
+image4_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+ "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+ "\x74\x49\x44\x41\x54\x38\x8d\xed\x92\xc1\x0a\xc0" \
+ "\x20\x08\x40\x6d\xdf\x2d\x3b\x84\xff\xed\x0e\xa3" \
+ "\x58\x6a\x26\xd1\x65\xe0\x83\x0e\xa5\x3e\x85\x04" \
+ "\x48\x7e\x4b\x91\x0f\x54\x89\xf1\x9e\xa5\xa3\xca" \
+ "\x0f\x8a\x89\x63\x65\xb3\x06\xc4\x2d\xd6\x13\xc6" \
+ "\x49\xbd\xc2\x59\x83\x16\x13\x62\x19\xf0\xf9\x36" \
+ "\xc0\xa2\xef\x00\xd7\x5a\x62\x61\x4d\x3a\xb2\x29" \
+ "\x96\xf2\xa3\x62\xff\xa3\x37\xc5\xeb\xed\xe9\x62" \
+ "\xaa\xd1\xa2\xe8\x4a\xaa\xa2\xf7\x50\xdd\x12\x74" \
+ "\x8c\x0f\xd0\xab\x93\x24\x67\x78\x00\x59\x6e\x28" \
+ "\xb1\x74\x3f\x46\x86\x00\x00\x00\x00\x49\x45\x4e" \
+ "\x44\xae\x42\x60\x82"
+image5_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+ "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+ "\x82\x49\x44\x41\x54\x38\x8d\xcd\xd3\x41\x12\x80" \
+ "\x20\x08\x05\x50\xe8\xe0\x2e\xbc\x38\xad\x32\x73" \
+ "\x50\x3e\x48\x53\x7f\xe3\xe4\x8c\x4f\x24\x25\xfa" \
+ "\x28\xe2\x9c\x6f\x39\x92\x0b\xf9\x27\x6c\xb6\x01" \
+ "\x85\x35\x88\x77\x61\x13\x88\xc2\x57\x64\x18\xcd" \
+ "\xa0\x15\xf5\x20\xb4\xe6\xb5\x5b\xe1\x09\xdc\x06" \
+ "\x22\xb8\xe2\x2a\xcf\x31\x05\x6e\x18\xdf\xdf\xf8" \
+ "\x06\x06\xaa\x55\x1c\xc6\x35\x64\xc4\xdc\xf8\x0c" \
+ "\xd0\x20\x1d\x57\x7a\x5c\x85\xa8\x84\x5f\xdc\x02" \
+ "\x5e\xa5\x30\x7a\xfc\xcd\x07\xe2\x3a\x1d\xf2\x83" \
+ "\xec\x2b\x37\xd9\xad\x5f\xb4\xdf\xef\xd4\x9c\xfb" \
+ "\xf7\x2f\xac\x98\xc8\xcc\x89\x00\x00\x00\x00\x49" \
+ "\x45\x4e\x44\xae\x42\x60\x82"
+image6_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+ "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+ "\xbf\x49\x44\x41\x54\x38\x8d\xd5\x93\x41\x0a\x83" \
+ "\x30\x10\x45\xdf\x48\x8e\xe5\x1d\xbc\x8c\x3b\xa9" \
+ "\x8b\xf4\x6a\x9e\xab\xd3\x85\x35\x0d\x26\x63\x62" \
+ "\x44\x4a\x3f\x0c\x42\x66\xfc\xf3\xf8\x24\xf0\x6f" \
+ "\x12\x40\x2b\x66\xda\x8c\x55\xf3\xde\x22\x12\xcf" \
+ "\x9d\x92\xcb\x98\xc0\xba\x2d\x7c\x45\x44\xcf\x9a" \
+ "\x07\x63\x8b\xba\xd5\x3c\x44\x91\x23\x5e\xcf\x7c" \
+ "\xc1\x62\x36\x97\xa9\x25\x40\xc1\x1f\xf4\xfd\xa7" \
+ "\x52\x75\x01\x5d\x24\xa9\x38\x9e\x7d\x6f\x53\xdf" \
+ "\x4f\xe4\xcc\xab\x32\x3e\xea\x0f\x03\xc0\xc4\xb2" \
+ "\xa0\x71\x2c\xe6\xad\xd8\x9b\x59\xb7\x66\x1c\x3b" \
+ "\xe0\x95\x98\x5f\x26\x16\x79\xee\x4e\xbc\xc2\x2c" \
+ "\x97\x88\x55\x1f\xe6\xa2\xcb\xc4\x96\x9a\x89\x4b" \
+ "\xcb\x6f\x23\xee\x36\x1a\xab\x62\xe2\x52\xc5\x72" \
+ "\x94\xdf\xbf\xb6\x10\xbb\xf2\xc8\x97\xb8\xa4\x6c" \
+ "\xc6\x67\x7e\xaa\x51\x95\x71\xfa\x08\x7e\xa8\x37" \
+ "\x62\xda\x9a\xba\xcb\x20\x23\x5f\x00\x00\x00\x00" \
+ "\x49\x45\x4e\x44\xae\x42\x60\x82"
+image7_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+ "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+ "\xd5\x49\x44\x41\x54\x38\x8d\xc5\x95\x5d\x0a\x84" \
+ "\x30\x0c\x84\x27\xe2\xa9\x0a\x9e\x6c\x8b\x0f\x4b" \
+ "\x3d\xd9\x82\xd7\xca\x3e\x58\xd7\xfe\x4c\xd0\xba" \
+ "\x5d\x76\x40\x02\x4d\xf2\x65\xda\x0a\x05\x7e\x24" \
+ "\x39\xc9\xeb\x8d\x9e\xaa\x88\x41\xa0\xc9\xaa\xd8" \
+ "\xc8\x2a\xb3\x2f\x9c\x42\x5b\xe1\xe3\x0e\x0d\xcf" \
+ "\x00\xc0\x03\x08\xf0\xb3\xa7\xa0\x74\x10\xa9\xd7" \
+ "\x14\x2e\x00\xb4\x2c\x5a\x5f\xab\x69\x6b\x97\x9b" \
+ "\x1c\x83\x7f\xc0\xc3\x16\xb6\xe4\x16\x5b\x64\xf7" \
+ "\x8d\x71\x63\x59\x91\x9b\xdc\x45\x70\xde\x47\xc0" \
+ "\x47\x32\xdd\x5e\x5b\xcc\x35\xf0\xc9\x77\x62\xae" \
+ "\x78\x79\x36\xdc\xcf\x75\x13\x57\x7e\x79\xf4\x8c" \
+ "\x4b\x27\xaa\x0f\x13\x27\xb2\x40\xf5\x11\x7f\xcb" \
+ "\xe3\x48\xaa\x33\xb6\xe0\x22\x4b\x05\x4d\x07\x46" \
+ "\xb8\x02\x5e\x2e\x3b\x3e\x73\xcd\xe0\xdd\x1c\x97" \
+ "\xf0\x2e\x8e\xd9\xd0\xaf\x1d\xb3\x81\x22\x4b\xdf" \
+ "\x33\xee\xe6\x98\xa9\x34\xa0\xf6\x17\xb4\x55\x40" \
+ "\xd0\x0b\xcf\x4c\xa0\x8f\xc0\xdf\xf4\x06\xe3\x25" \
+ "\xc1\x98\x1b\xc4\x18\x76\x00\x00\x00\x00\x49\x45" \
+ "\x4e\x44\xae\x42\x60\x82"
+image8_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+ "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x02" \
+ "\x5d\x49\x44\x41\x54\x38\x8d\xd5\x93\xa1\x72\xdb" \
+ "\x40\x10\x86\x3f\x67\x0a\x56\xec\xc4\x22\x78\xd0" \
+ "\x65\x36\x93\xa0\xc2\x1c\x68\xd6\xc2\xe6\x0d\xf2" \
+ "\x1a\x81\x81\x11\x34\x94\x99\xc2\x54\xa8\x32\x9b" \
+ "\x55\xf0\xe0\x89\xdd\xb1\x5b\xa6\x02\xb7\x9d\x66" \
+ "\x92\xd6\x99\xb6\xd3\x99\xfe\xe8\x6e\x67\xe7\xdb" \
+ "\x7f\x77\xef\xe0\x7f\xd3\xe2\xc7\x4b\xd7\x75\xb3" \
+ "\x73\x0e\xef\x3d\x51\x15\x00\x23\x82\xb5\x16\x6b" \
+ "\x2d\x57\x57\x57\x8b\x17\x29\xbf\x02\xb7\x6d\x3b" \
+ "\x0f\x87\x03\xb9\x2d\x58\xae\xd7\x60\x04\x00\xef" \
+ "\x1c\xe3\xc7\x03\x06\xa8\xaa\x8a\xeb\xeb\xeb\x57" \
+ "\xc1\x17\xdf\xa0\x6d\xdb\x52\x5d\xd7\x54\xef\xb6" \
+ "\x00\xa8\x2a\x49\x13\x8a\x12\x35\x32\xec\x3a\xc4" \
+ "\x2b\x9b\xcd\xe6\x55\xce\x2f\xfa\xbe\x9f\x87\xc3" \
+ "\x40\xfd\xe1\x3d\xcb\x4d\x8d\xaa\xa2\x4e\x48\xee" \
+ "\x12\xc6\x82\x38\x08\xc1\x07\x96\x9b\x1a\x8a\x9c" \
+ "\xe3\xf1\xf8\xaa\x51\x5c\x38\xe7\xc8\xad\xa5\xaa" \
+ "\x6b\x00\xc4\x5f\x12\x9c\x67\xd2\x23\x93\x8c\x88" \
+ "\xe6\xc8\x60\xd1\x18\xb1\xd5\x92\xd1\x39\xba\xae" \
+ "\x9b\xcf\x83\xa7\x89\x65\xb5\x46\x51\x34\x80\x1b" \
+ "\x1d\x2e\x1f\x49\x45\xc0\xe3\x50\x09\x64\x08\xea" \
+ "\x15\x44\x90\xc2\xe0\xbd\x3f\xef\x58\x53\xc2\xe4" \
+ "\x86\xa0\x01\x9f\x4d\x84\xf5\x84\x18\x41\x83\x62" \
+ "\xb0\x40\x8e\x8b\x23\xc9\x24\x50\x10\x93\x31\x4d" \
+ "\xd3\x59\xf0\x1b\x80\x98\x14\x11\x20\x25\x14\x40" \
+ "\x15\xf1\x96\x4c\x0b\xbc\x1b\x48\x4b\x07\xe4\x68" \
+ "\x88\x80\xc0\x29\xeb\xd7\x8e\x41\x41\xf5\xb4\x34" \
+ "\xfd\x76\x86\x4c\x05\x3f\x1e\x08\x4b\x0f\x85\x80" \
+ "\x26\x54\x40\x63\x40\x44\xce\x83\x8b\xbc\xc0\x39" \
+ "\x87\xa6\x13\x50\xa3\xa2\x28\x5e\x1d\x5a\x44\x14" \
+ "\xd0\x70\x8a\xa5\x98\x08\x21\x62\xad\x3d\x0f\xb6" \
+ "\xd6\xe2\x87\xcf\xa4\x98\x50\x8d\x27\x40\x50\x44" \
+ "\x73\x70\x42\x8c\x91\xaf\x8d\x10\xfd\x44\x81\x60" \
+ "\x8c\x39\x0b\x5e\x00\xdc\xdd\xdd\xcd\x8e\x80\xa9" \
+ "\xde\x42\x02\x48\xe8\x04\x84\x08\x56\xf0\x3e\x02" \
+ "\x90\x7d\x72\x94\x65\xc9\xba\x5a\xe3\x46\x87\x31" \
+ "\xe6\xa7\x9f\xe5\x02\x60\xb5\x5a\x61\x02\xc4\xee" \
+ "\x40\xa6\x89\x4c\x33\xf2\xcb\x0c\xb1\x06\x51\x28" \
+ "\x14\xf8\xf8\x99\xb2\x2c\xb9\xb9\xb9\x59\xb8\xd1" \
+ "\xf1\xf8\xf8\x48\xd3\x34\xb4\x6d\xfb\xe2\x9b\xfe" \
+ "\x5e\xad\xef\xfb\xf9\x78\x3c\x32\x3a\x87\x18\x81" \
+ "\xec\xb4\x20\x0d\x11\x51\xa8\xeb\x9a\xed\x76\xbb" \
+ "\x00\x18\x86\x61\xee\xba\x8e\xfd\x7e\x8f\x31\x86" \
+ "\xed\x76\xcb\x6a\xb5\x7a\xe2\xfe\x59\x1b\x5d\xd7" \
+ "\xcd\xde\x7b\x62\x8c\x88\x08\x79\x9e\x63\xad\xa5" \
+ "\xaa\xaa\x67\xb9\xbb\xdd\x6e\x6e\x9a\x06\xef\x3d" \
+ "\x75\x5d\x3f\x29\xfe\xc7\xea\xfb\x7e\xbe\xbd\xbd" \
+ "\x9d\xad\xb5\x73\x59\x96\xf3\xfd\xfd\xfd\xfc\xa2" \
+ "\xe3\xdf\xd5\xc3\xc3\xc3\xdc\x34\x0d\xd3\x34\xb1" \
+ "\xd9\x6c\xfe\x1e\x18\x4e\x63\xdc\xef\xf7\xa4\x94" \
+ "\xfe\x26\xf6\x1f\xe9\x0b\xbc\x4c\x5e\x59\xd6\x14" \
+ "\xca\xf4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42" \
+ "\x60\x82"
+
+class Eficas(QMainWindow):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QMainWindow.__init__(self,parent,name,fl)
+ self.statusBar()
+
+ self.image0 = QPixmap()
+ self.image0.loadFromData(image0_data,"PNG")
+ self.image1 = QPixmap()
+ self.image1.loadFromData(image1_data,"PNG")
+ self.image2 = QPixmap()
+ self.image2.loadFromData(image2_data,"PNG")
+ self.image3 = QPixmap()
+ self.image3.loadFromData(image3_data,"PNG")
+ self.image4 = QPixmap()
+ self.image4.loadFromData(image4_data,"PNG")
+ self.image5 = QPixmap()
+ self.image5.loadFromData(image5_data,"PNG")
+ self.image6 = QPixmap()
+ self.image6.loadFromData(image6_data,"PNG")
+ self.image7 = QPixmap()
+ self.image7.loadFromData(image7_data,"PNG")
+ self.image8 = QPixmap()
+ self.image8.loadFromData(image8_data,"PNG")
+ if not name:
+ self.setName("Eficas")
+
+ self.setEnabled(1)
+ self.setMinimumSize(QSize(902,575))
+ self.setBackgroundOrigin(QMainWindow.WidgetOrigin)
+ f = QFont(self.font())
+ self.setFont(f)
+
+ self.setCentralWidget(QWidget(self,"qt_central_widget"))
+
+ self.line1 = QFrame(self.centralWidget(),"line1")
+ self.line1.setGeometry(QRect(-30,-10,930,20))
+ self.line1.setFrameShape(QFrame.HLine)
+ self.line1.setFrameShadow(QFrame.Sunken)
+ self.line1.setFrameShape(QFrame.HLine)
+
+ self.fileNewAction = QAction(self,"fileNewAction")
+ self.fileNewAction.setIconSet(QIconSet(self.image0))
+ self.fileOpenAction = QAction(self,"fileOpenAction")
+ self.fileOpenAction.setIconSet(QIconSet(self.image1))
+ self.fileSaveAction = QAction(self,"fileSaveAction")
+ self.fileSaveAction.setIconSet(QIconSet(self.image2))
+ self.fileSaveAsAction = QAction(self,"fileSaveAsAction")
+ self.fileExitAction = QAction(self,"fileExitAction")
+ self.editUndoAction = QAction(self,"editUndoAction")
+ self.editUndoAction.setIconSet(QIconSet(self.image3))
+ self.editRedoAction = QAction(self,"editRedoAction")
+ self.editRedoAction.setIconSet(QIconSet(self.image4))
+ self.editCutAction = QAction(self,"editCutAction")
+ self.editCutAction.setIconSet(QIconSet(self.image5))
+ self.editCopyAction = QAction(self,"editCopyAction")
+ self.editCopyAction.setIconSet(QIconSet(self.image6))
+ self.editPasteAction = QAction(self,"editPasteAction")
+ self.editPasteAction.setIconSet(QIconSet(self.image7))
+ self.editFindAction = QAction(self,"editFindAction")
+ self.editFindAction.setIconSet(QIconSet(self.image8))
+ self.helpContentsAction = QAction(self,"helpContentsAction")
+ self.helpIndexAction = QAction(self,"helpIndexAction")
+ self.helpAboutAction = QAction(self,"helpAboutAction")
+ self.traductionnew_itemAction = QAction(self,"traductionnew_itemAction")
+ self.fileSaveCloseAction = QAction(self,"fileSaveCloseAction")
+ self.fileCloseAction = QAction(self,"fileCloseAction")
+ self.fileNewViewAction = QAction(self,"fileNewViewAction")
+ self.fileCloseAllAction = QAction(self,"fileCloseAllAction")
+ self.jdcRapportDeValidationAction = QAction(self,"jdcRapportDeValidationAction")
+ self.jdcFichierSourceAction = QAction(self,"jdcFichierSourceAction")
+
+
+ self.toolBar = QToolBar(QString(""),self,Qt.DockTop)
+
+ self.toolBar.setFrameShape(QToolBar.MenuBarPanel)
+ self.toolBar.setHorizontallyStretchable(0)
+ self.fileNewAction.addTo(self.toolBar)
+ self.fileSaveAction.addTo(self.toolBar)
+ self.fileOpenAction.addTo(self.toolBar)
+ self.fileSaveAsAction.addTo(self.toolBar)
+ self.editCutAction.addTo(self.toolBar)
+ self.editPasteAction.addTo(self.toolBar)
+ self.editFindAction.addTo(self.toolBar)
+ self.fileExitAction.addTo(self.toolBar)
+
+
+ self.MenuBar = QMenuBar(self,"MenuBar")
+
+ self.MenuBar.setMargin(2)
+
+ self.Fichier = QPopupMenu(self)
+ self.fileNewAction.addTo(self.Fichier)
+ self.fileNewViewAction.addTo(self.Fichier)
+ self.fileOpenAction.addTo(self.Fichier)
+ self.fileSaveAction.addTo(self.Fichier)
+ self.fileSaveAsAction.addTo(self.Fichier)
+ self.fileCloseAction.addTo(self.Fichier)
+ self.fileCloseAllAction.addTo(self.Fichier)
+ self.Fichier.insertSeparator()
+ self.Fichier.insertSeparator()
+ self.fileExitAction.addTo(self.Fichier)
+ self.MenuBar.insertItem(QString(""),self.Fichier,2)
+
+ self.Edition = QPopupMenu(self)
+ self.Edition.insertSeparator()
+ self.editCutAction.addTo(self.Edition)
+ self.editCopyAction.addTo(self.Edition)
+ self.editPasteAction.addTo(self.Edition)
+ self.Edition.insertSeparator()
+ self.editFindAction.addTo(self.Edition)
+ self.MenuBar.insertItem(QString(""),self.Edition,3)
+
+ self.JdC = QPopupMenu(self)
+ self.jdcRapportDeValidationAction.addTo(self.JdC)
+ self.jdcFichierSourceAction.addTo(self.JdC)
+ self.MenuBar.insertItem(QString(""),self.JdC,4)
+
+ self.Options = QPopupMenu(self)
+ self.MenuBar.insertItem(QString(""),self.Options,5)
+
+ self.Aide = QPopupMenu(self)
+ self.MenuBar.insertItem(QString(""),self.Aide,6)
+
+ self.Traduction = QPopupMenu(self)
+ self.traductionnew_itemAction.addTo(self.Traduction)
+ self.MenuBar.insertItem(QString(""),self.Traduction,7)
+
+ self.Patrons = QPopupMenu(self)
+ self.MenuBar.insertItem(QString(""),self.Patrons,8)
+
+
+ self.languageChange()
+
+ self.resize(QSize(902,575).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.fileNewAction,SIGNAL("activated()"),self.fileNew)
+ self.connect(self.fileOpenAction,SIGNAL("activated()"),self.fileOpen)
+ self.connect(self.fileSaveAction,SIGNAL("activated()"),self.fileSave)
+ self.connect(self.fileSaveAsAction,SIGNAL("activated()"),self.fileSaveAs)
+ self.connect(self.fileExitAction,SIGNAL("activated()"),self.fileExit)
+ self.connect(self.editUndoAction,SIGNAL("activated()"),self.editUndo)
+ self.connect(self.editRedoAction,SIGNAL("activated()"),self.editRedo)
+ self.connect(self.editCutAction,SIGNAL("activated()"),self.editCut)
+ self.connect(self.editPasteAction,SIGNAL("activated()"),self.editPaste)
+ self.connect(self.editFindAction,SIGNAL("activated()"),self.editFind)
+ self.connect(self.helpIndexAction,SIGNAL("activated()"),self.helpIndex)
+ self.connect(self.helpContentsAction,SIGNAL("activated()"),self.helpContents)
+ self.connect(self.helpAboutAction,SIGNAL("activated()"),self.helpAbout)
+ self.connect(self.fileCloseAction,SIGNAL("activated()"),self.fileClose)
+ self.connect(self.fileNewViewAction,SIGNAL("activated()"),self.fileNewView)
+ self.connect(self.fileCloseAllAction,SIGNAL("activated()"),self.fileCloseAll)
+ self.connect(self.editCopyAction,SIGNAL("activated()"),self.editCopy)
+ self.connect(self.jdcRapportDeValidationAction,SIGNAL("activated()"),self.jdcRapport)
+ self.connect(self.jdcFichierSourceAction,SIGNAL("activated()"),self.jdcFichierSource)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("Eficas "))
+ self.fileNewAction.setText(self.__tr("New"))
+ self.fileNewAction.setMenuText(self.__tr("&New"))
+ self.fileNewAction.setAccel(self.__tr("Ctrl+N"))
+ self.fileOpenAction.setText(self.__tr("Open"))
+ self.fileOpenAction.setMenuText(self.__tr("&Open..."))
+ self.fileOpenAction.setAccel(self.__tr("Ctrl+O"))
+ self.fileSaveAction.setText(self.__tr("Save"))
+ self.fileSaveAction.setMenuText(self.__tr("&Save"))
+ self.fileSaveAction.setAccel(self.__tr("Ctrl+S"))
+ self.fileSaveAsAction.setText(self.__tr("Save As"))
+ self.fileSaveAsAction.setMenuText(self.__tr("Save &As..."))
+ self.fileSaveAsAction.setAccel(QString.null)
+ self.fileExitAction.setText(self.__tr("Exit"))
+ self.fileExitAction.setMenuText(self.__tr("E&xit"))
+ self.fileExitAction.setAccel(QString.null)
+ self.editUndoAction.setText(self.__tr("Undo"))
+ self.editUndoAction.setMenuText(self.__tr("&Undo"))
+ self.editUndoAction.setAccel(self.__tr("Ctrl+Z"))
+ self.editRedoAction.setText(self.__tr("Redo"))
+ self.editRedoAction.setMenuText(self.__tr("&Redo"))
+ self.editRedoAction.setAccel(self.__tr("Ctrl+Y"))
+ self.editCutAction.setText(self.__tr("Cut"))
+ self.editCutAction.setMenuText(self.__tr("Cu&t"))
+ self.editCutAction.setAccel(self.__tr("Ctrl+X"))
+ self.editCopyAction.setText(self.__tr("Copy"))
+ self.editCopyAction.setMenuText(self.__tr("&Copy"))
+ self.editCopyAction.setAccel(self.__tr("Ctrl+C"))
+ self.editPasteAction.setText(self.__tr("Paste"))
+ self.editPasteAction.setMenuText(self.__tr("&Paste"))
+ self.editPasteAction.setAccel(self.__tr("Ctrl+V"))
+ self.editFindAction.setText(self.__tr("Find"))
+ self.editFindAction.setMenuText(self.__tr("&Find..."))
+ self.editFindAction.setAccel(self.__tr("Ctrl+F"))
+ self.helpContentsAction.setText(self.__tr("Contents"))
+ self.helpContentsAction.setMenuText(self.__tr("&Contents..."))
+ self.helpContentsAction.setAccel(QString.null)
+ self.helpIndexAction.setText(self.__tr("Index"))
+ self.helpIndexAction.setMenuText(self.__tr("&Index..."))
+ self.helpIndexAction.setAccel(QString.null)
+ self.helpAboutAction.setText(self.__tr("About"))
+ self.helpAboutAction.setMenuText(self.__tr("&About"))
+ self.helpAboutAction.setAccel(QString.null)
+ self.traductionnew_itemAction.setText(self.__tr("new item"))
+ self.traductionnew_itemAction.setMenuText(self.__tr("new item"))
+ self.fileSaveCloseAction.setText(self.__tr("Close"))
+ self.fileSaveCloseAction.setMenuText(self.__tr("Close"))
+ self.fileCloseAction.setText(self.__tr("Close"))
+ self.fileCloseAction.setMenuText(self.__tr("Close"))
+ self.fileCloseAction.setAccel(self.__tr("Ctrl+W"))
+ self.fileNewViewAction.setText(self.__tr("New view"))
+ self.fileCloseAllAction.setText(self.__tr("Close All"))
+ self.fileCloseAllAction.setMenuText(self.__tr("Close All"))
+ self.jdcRapportDeValidationAction.setText(self.__tr("Rapport de validation"))
+ self.jdcRapportDeValidationAction.setMenuText(self.__tr("Rapport de validation"))
+ self.jdcRapportDeValidationAction.setAccel(self.__tr("Ctrl+R"))
+ self.jdcFichierSourceAction.setText(self.__tr("Fichier source"))
+ self.jdcFichierSourceAction.setMenuText(self.__tr("Fichier source"))
+ self.jdcFichierSourceAction.setAccel(self.__tr("Ctrl+B"))
+ self.toolBar.setLabel(self.__tr("Tools"))
+ if self.MenuBar.findItem(2):
+ self.MenuBar.findItem(2).setText(self.__tr("&Fichier"))
+ if self.MenuBar.findItem(3):
+ self.MenuBar.findItem(3).setText(self.__tr("&Edition"))
+ if self.MenuBar.findItem(4):
+ self.MenuBar.findItem(4).setText(self.__tr("JdC"))
+ if self.MenuBar.findItem(5):
+ self.MenuBar.findItem(5).setText(self.__tr("Options"))
+ if self.MenuBar.findItem(6):
+ self.MenuBar.findItem(6).setText(self.__tr("&Aide"))
+ if self.MenuBar.findItem(7):
+ self.MenuBar.findItem(7).setText(self.__tr("Traduction"))
+ if self.MenuBar.findItem(8):
+ self.MenuBar.findItem(8).setText(self.__tr("Patrons"))
+
+
+ def fileNew(self):
+ print "Eficas.fileNew(): Not implemented yet"
+
+ def fileOpen(self):
+ print "Eficas.fileOpen(): Not implemented yet"
+
+ def fileSave(self):
+ print "Eficas.fileSave(): Not implemented yet"
+
+ def fileSaveAs(self):
+ print "Eficas.fileSaveAs(): Not implemented yet"
+
+ def filePrint(self):
+ print "Eficas.filePrint(): Not implemented yet"
+
+ def fileExit(self):
+ print "Eficas.fileExit(): Not implemented yet"
+
+ def editUndo(self):
+ print "Eficas.editUndo(): Not implemented yet"
+
+ def editRedo(self):
+ print "Eficas.editRedo(): Not implemented yet"
+
+ def jdcFichierSource(self):
+ print "Eficas.jdcFichierSource(): Not implemented yet"
+
+ def fileNewView(self):
+ print "Eficas.fileNewView(): Not implemented yet"
+
+ def editPaste(self):
+ print "Eficas.editPaste(): Not implemented yet"
+
+ def editFind(self):
+ print "Eficas.editFind(): Not implemented yet"
+
+ def helpIndex(self):
+ print "Eficas.helpIndex(): Not implemented yet"
+
+ def helpContents(self):
+ print "Eficas.helpContents(): Not implemented yet"
+
+ def helpAbout(self):
+ print "Eficas.helpAbout(): Not implemented yet"
+
+ def fileClose(self):
+ print "Eficas.fileClose(): Not implemented yet"
+
+ def fileCloseAll(self):
+ print "Eficas.fileCloseAll(): Not implemented yet"
+
+ def jdcRapport(self):
+ print "Eficas.jdcRapport(): Not implemented yet"
+
+ def editCut(self):
+ print "Eficas.editCut(): Not implemented yet"
+
+ def editCopy(self):
+ print "Eficas.editCopy(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("Eficas",s,c)
--- /dev/null
+# -*- coding: utf-8 -*-
+import string
+import os
+
+import traceback
+
+from qt import *
+from qtCommun import QTPanel
+from desInactif import DInactif
+
+
+SEPARATEUR = '-'*30
+
+
+class PanelInactif( QTPanel, DInactif ):
+ def __init__(self,node,parent=None ):
+ DInactif.__init__(self,parent)
+ QTPanel.__init__(self,node,parent)
+
+
+class NoPanel( QWidget ):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+ self.textLabel = QLabel(self)
+ self.textLabel.setText(QString("PANNEAU A IMPLEMENTER"))
+ self.textLabel.setGeometry(QRect(130,150,219,17))
+ self.resize(QSize(600,480).expandedTo(self.minimumSizeHint()))
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 types
+
+
+#------------------
+class Validation :
+#------------------
+ def __init__(self,node,parent) :
+ self.node=node
+ self.parent=parent
+
+ def TesteUneValeur(self,valeurentree):
+ valeur,validite=self.node.item.eval_valeur(valeurentree)
+ if not validite :
+ commentaire = "impossible d'évaluer : %s " %`valeurentree`
+ return valeur,validite,commentaire
+
+ testtype,commentaire = self.node.item.object.verif_type(valeur)
+ if not testtype :
+ return valeur,0,commentaire
+
+ valide=self.node.item.valide_item(valeur)
+ if type(valide) == types.TupleType:
+ validite,commentaire=valide
+ else :
+ validite=valide
+ commentaire=" "
+
+ if not validite :
+ commentaire = "impossible d'évaluer : %s " %`valeurentree`
+ return valeur, validite, commentaire
+
+# ----------------------------------------------------------------------------------------
+# Méthodes utilisées pour la manipulation des items en notation scientifique
+# a mettre au point
+# ----------------------------------------------------------------------------------------
+ def SetValeurTexte(self,texteValeur) :
+ try :
+ if "R" in self.node.item.object.definition.type:
+ if texteValeur[0] != "'":
+ clef=eval(texteValeur)
+ if str(clef) != str(texteValeur) :
+ self.node.item.object.init_modif()
+ clefobj=self.node.item.object.GetNomConcept()
+ if not self.parent.dict_reels.has_key(clefobj):
+ self.parent.dict_reels[clefobj] = {}
+ self.parent.dict_reels[clefobj][clef]=texteValeur
+ self.parent.dict_reels[clefobj]
+ self.node.item.object.fin_modif()
+ except:
+ pass
+
+ def GetValeurTexte(self,valeur) :
+ valeurTexte=valeur
+ if "R" in self.node.item.object.definition.type:
+ clefobj=self.node.item.object.GetNomConcept()
+ if self.parent.dict_reels.has_key(clefobj):
+ if self.parent.dict_reels[clefobj].has_key(valeur):
+ valeurTexte=self.parent.dict_reels[clefobj][valeur]
+ return valeurTexte
+
+#------------------------------------
+class PolitiqueUnique(Validation) :
+#------------------------------------
+ """
+ classe servant pour les entrees ne demandant qu un mot clef
+ """
+ def __init__(self,node,parent):
+ Validation.__init__(self,node,parent)
+
+ def RecordValeur(self,valeurentree):
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ ancienne_val = self.node.item.get_valeur()
+ valeur,validite,commentaire =self.TesteUneValeur(valeurentree)
+ if validite :
+ validite=self.node.item.set_valeur(valeur)
+ if self.node.item.isvalid():
+ commentaire = "Valeur du mot-clé enregistrée"
+ self.SetValeurTexte(str(valeurentree))
+ else:
+ cr = self.node.item.get_cr()
+ commentaire = "Valeur du mot-clé non autorisée "+cr.get_mess_fatal()
+ self.node.item.set_valeur(ancienne_val)
+ return validite, commentaire
+
+
+#------------------------
+class PolitiquePlusieurs:
+#------------------------
+ """
+ classe servant pour les entrees ne demandant qu un mot clef
+ """
+ def __init__(self,node,parent) :
+ self.node=node
+ self.parent=parent
+
+
+ def AjoutValeurs(self,listevaleur,index,listecourante):
+ listeRetour=[]
+ commentaire="Nouvelle valeur acceptée"
+ commentaire2=""
+ valide=1
+ for valeur in listevaleur :
+ # On teste le type de la valeur
+ valide=self.node.item.valide_item(valeur)
+ if not valide:
+ commentaire="Valeur "+str(valeur)+ "incorrecte : ajout à la liste refusé"
+ commentaire2=self.node.item.info_erreur_item()
+ return valide,commentaire,commentaire2,listeRetour
+
+ # On valide la liste obtenue
+ encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
+ if not encorevalide :
+ commentaire2=self.node.item.info_erreur_liste()
+ # On traite le cas ou la liste n est pas valide pour un pb de cardinalite
+ min,max = self.node.item.GetMinMax()
+ if len(listecourante) + 1 >= max :
+ commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
+ return valide,commentaire,commentaire2,listeRetour
+ if len(listecourante) + 1 > min :
+ return valide,commentaire,commentaire2,listeRetour
+
+ # On ajoute la valeur testee a la liste courante et a la liste acceptee
+ listecourante.insert(index,valeur)
+ index=index+1
+ listeRetour.append(valeur)
+
+ return valide,commentaire,commentaire2,listeRetour
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# ======================================================================
+# 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.
+#
+#
+# ======================================================================
+
+lang='fr'
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+import traceback
+
+from qt import *
+from InterfaceQT import prefsQT
+
+# Import des panels
+
+# ---------- #
+class QTPanel:
+# ---------- #
+ """
+ Classe contenant les méthodes Qt communes a tous les panneaux droits
+ Tous les panneaux Mon...Panel héritent de cette classe
+ Gére plus précisement :
+ - l affichage de la doc
+ - le bouton Suppression (BSupPressed)
+ - la mutualisation de l affichage des regles
+ """
+ def __init__(self,node, parent = None):
+ self.editor = parent
+ self.node = node
+
+ def BSupPressed(self):
+ self.editor.init_modif()
+ self.node.delete()
+
+ def BOkPressed(self):
+ """ Impossible d utiliser les vrais labels avec designer ?? """
+ label=self.TWChoix.tabLabel(self.TWChoix.currentPage())
+ if label==QString("Nouvelle Commande"):
+ self.DefCmd()
+ if label==QString("Nommer Concept"):
+ self.LENomConceptReturnPressed()
+ if label==QString("Ajouter Mot-Clef"):
+ self.DefMC()
+ if label==QString("Définition Formule"):
+ self.BOkPressedFormule()
+
+ def AppelleBuildLBRegles(self):
+ listeRegles = self.node.item.get_regles()
+ listeNomsEtapes = self.node.item.get_mc_presents()
+ self.BuildLBRegles(listeRegles,listeNomsEtapes)
+
+
+ def BuildLBRegles(self,listeRegles,listeNomsEtapes):
+ if len(listeRegles) > 0:
+ for regle in listeRegles :
+ texteRegle=regle.gettext()
+ texteMauvais,test = regle.verif(listeNomsEtapes)
+ for ligne in texteRegle.split("\n") :
+ if ligne == "" :
+ self.LBRegles.insertItem(ligne)
+ continue
+ if ligne[0]=="\t" :
+ ligne=" "+ligne[1:]
+ if test :
+ self.LBRegles.insertItem(ligne)
+ else :
+ self.LBRegles.insertItem(itemColore(ligne))
+
+
+# ----------------------- #
+class QTPanelTBW1(QTPanel):
+# ----------------------- #
+ """
+ Classe contenant les méthodes nécessaires a l onglet "Ajouter Mot-Clef"
+ hérite de QTPanel # Attention n appelle pas le __init__
+ Gére plus précisement :
+ """
+ def __init__(self,node, parent = None):
+ self.editor = parent
+ self.node = node
+ self.BuildLBMCPermis()
+ self.AppelleBuildLBRegles()
+
+ def BuildLBMCPermis(self):
+ self.LBMCPermis.clear()
+ try :
+ QObject.disconnect(self.LBMCPermis,SIGNAL("doubleClicked(QListBoxItem*)"),self.DefMC)
+ except :
+ # normal pour la première fois qu on passe
+ # peut-etre inutile selon le connect ??
+ pass
+ QObject.connect(self.LBMCPermis,SIGNAL("doubleClicked(QListBoxItem*)"),self.DefMC)
+
+ jdc = self.node.item.get_jdc()
+ genea =self.node.item.get_genealogie()
+ liste_mc=self.node.item.get_liste_mc_ordonnee(genea,jdc.cata_ordonne_dico)
+ for aMc in liste_mc:
+ self.LBMCPermis.insertItem( aMc)
+
+
+ def DefMC(self):
+ """ On ajoute un mot-clé à la commande : subnode """
+ name=str(self.LBMCPermis.selectedItem().text())
+ self.editor.init_modif()
+ self.node.append_child(name)
+
+# ---------------------------- #
+class QTPanelTBW2(QTPanel):
+# ---------------------------- #
+ """
+ Classe contenant les méthodes nécessaires a l onglet "Nouvelle Commande"
+ hérite de QTPanel # Attention n appelle pas le __init__
+ Gére plus précisement :
+ """
+
+ def __init__(self,node, parent = None):
+ self.editor = parent
+ self.node = node
+ self.BuildLBNouvCommande()
+ self.AppelleBuildLBRegles()
+
+
+ def BuildLBNouvCommande(self):
+ self.LBNouvCommande.clear()
+ try :
+ QObject.disconnect(self.LBNouvCommande,SIGNAL("doubleClicked(QListBoxItem*)"),self.DefCmd)
+ except :
+ # normal pour la première fois qu on passe
+ # peut-etre inutile selon le connect ??
+ pass
+
+ jdc=self.node.item.object.get_jdc_root()
+ if self.RBalpha.isOn():
+ listeCmd = jdc.get_liste_cmd()
+ for aCmd in listeCmd:
+ self.LBNouvCommande.insertItem( aCmd )
+ else :
+ listeGroupes,dictGroupes=jdc.get_groups()
+ for grp in listeGroupes:
+ if grp == "CACHE":continue
+ listeCmd=dictGroupes[grp]
+ texte="GROUPE : "+grp
+ self.LBNouvCommande.insertItem( texte )
+ self.LBNouvCommande.insertItem( " " )
+ for aCmd in listeCmd:
+ self.LBNouvCommande.insertItem( aCmd)
+ self.LBNouvCommande.insertItem( " " )
+ QObject.connect( self.LBNouvCommande, SIGNAL("doubleClicked(QListBoxItem*)"),self.DefCmd )
+
+ def DefCmd(self):
+ name=str(self.LBNouvCommande.selectedItem().text())
+ if name==QString(" "):
+ return
+ if name.find("GROUPE :")==0 :
+ return
+ self.editor.init_modif()
+ new_node = self.node.append_brother(name,'after')
+
+
+ def LEFiltreTextChanged(self):
+ MonItem=self.LBNouvCommande.findItem(self.LEFiltre.text().upper(),Qt.Contains)
+ if MonItem != None :
+ self.LBNouvCommande.setCurrentItem(MonItem)
+ self.LBNouvCommande.setSelected(MonItem,1)
+
+ def LEfiltreReturnPressed(self):
+ self.DefCmd()
+
+ def BNextPressed(self):
+ self.LBNouvCommande.setCurrentItem(self.LBNouvCommande.currentItem()+1)
+ self.LEFiltreTextChanged()
+
+ def LBNouvCommandeClicked(self):
+ name=str(self.LBNouvCommande.currentText())
+
+
+# ---------------------------- #
+class QTPanelTBW3(QTPanel):
+# ---------------------------- #
+
+ """
+ Classe contenant les méthodes nécessaires a l onglet "Nommer Concept"
+ si non réentrant
+ hérite de QTPanel # Attention n appelle pas le __init__
+ Gére plus précisement :
+ """
+
+ def __init__(self,node, parent = None):
+ self.editor = parent
+ self.node = node
+ type_sd = self.node.item.get_type_sd_prod()
+ nomConcept = self.node.item.GetText()
+ self.typeConcept.setText(type_sd)
+ self.LENomConcept.setText("")
+ self.LENomConcept.setText(nomConcept)
+
+
+
+ def LENomConceptReturnPressed(self):
+ """
+ Nomme le concept SD retourne par l'etape
+ """
+ nom = str(self.LENomConcept.text())
+ nom = string.strip(nom)
+
+ if nom == '' : return # si pas de nom, on ressort sans rien faire
+
+ self.editor.init_modif()
+ test,mess = self.node.item.nomme_sd(nom)
+ self.editor.affiche_infos(mess)
+
+# ----------------------- #
+class ViewText(QDialog):
+# ----------------------- #
+ """
+ Classe permettant la visualisation de texte
+ """
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ l1 = QVBoxLayout(self,11,6,)
+ self.view = QTextEdit(self)
+ self.view.setReadOnly(True)
+
+ l2 = QHBoxLayout(None,0,6)
+ Horizontal_Spacing2 = QSpacerItem(220,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
+ bclose= QPushButton(self)
+ bclose.setText(self.trUtf8( "Fermer"))
+ bsave= QPushButton(self)
+ bsave.setText(self.trUtf8( "Sauver"))
+ l2.addItem(Horizontal_Spacing2)
+ l2.addWidget(bsave)
+ l2.addWidget(bclose)
+
+ l1.addWidget(self.view)
+ l1.addLayout(l2)
+
+ self.resize( QSize(600,507).expandedTo(self.minimumSizeHint()) )
+ self.connect( bclose,SIGNAL("clicked()"), self, SLOT("close()") )
+ self.connect( bsave,SIGNAL("clicked()"), self.saveFile )
+
+ def setText(self, txt ):
+ self.view.setText(txt)
+
+ def saveFile(self):
+ #recuperation du nom du fichier
+ fn = QFileDialog.getSaveFileName(None,
+ self.trUtf8("All Files (*)"), self, None,
+ self.trUtf8("Save File"), '', 0)
+ if not fn.isNull():
+ if QFileInfo(fn).exists():
+ abort = QMessageBox.warning(self,
+ self.trUtf8("Save File"),
+ self.trUtf8("The file <b>%1</b> already exists.")
+ .arg(fn),
+ self.trUtf8("&Overwrite"),
+ self.trUtf8("&Abort"), None, 1)
+ if abort:
+ return
+ fn = unicode(QDir.convertSeparators(fn))
+ else:
+ return
+
+ #ecriture du fichier
+ try:
+ f = open(fn, 'wb')
+ f.write(str(self.view.text()))
+ f.close()
+ return 1
+ except IOError, why:
+ QMessageBox.critical(self, self.trUtf8('Save File'),
+ self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
+ .arg(unicode(fn)).arg(str(why)))
+ return
+
+
+#-------------------------------
+class itemColore(QListBoxText):
+#-------------------------------
+ def paint(self,p):
+ p.setPen(Qt.red)
+ QListBoxText.paint(self,p);
--- /dev/null
+"""
+
+"""
+import os, sys
+REPINI=os.path.dirname(os.path.abspath(__file__))
+INSTALLDIR=os.path.join(REPINI,'..')
+sys.path.append(INSTALLDIR)
+sys.path.append(INSTALLDIR+"/Ui")
+
+from qt import *
+from myMain_ui import Eficas
+from viewManager import MyTabview
+
+from Editeur import configuration
+from Aster import prefs
+from InterfaceQT import utilIcons
+utilIcons.initializeMimeSourceFactory()
+
+class Appli(Eficas):
+ """
+ Class implementing the main user interface.
+ """
+ def __init__(self):
+ """
+ Constructor
+
+ @param loc locale to be used by the UI (string)
+ @param splash reference to the splashscreen (UI.SplashScreen.SplashScreen)
+ """
+ Eficas.__init__(self)
+
+ self.top=self
+ self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
+ self.CONFIGStyle = configuration.make_config_style(self,prefs.REPINI)
+
+ self.viewmanager = MyTabview(self, self) #MyTabview, MyWorkspace, Listspace
+ self.setCentralWidget(self.viewmanager)
+
+ self.recentMenu = QPopupMenu(self.Fichier)
+ self.Fichier.insertItem(self.trUtf8('Open &Recent Files'), self.recentMenu)
+ self.connect(self.recentMenu,SIGNAL('aboutToShow()'),self.handleShowRecentMenu)
+
+
+ self.connect(self,PYSIGNAL('preferencesChanged'),
+ self.viewmanager.handlePreferencesChanged)
+
+ self.connect(self.viewmanager,PYSIGNAL('lastEditorClosed'),
+ self.handleLastEditorClosed)
+
+ self.connect(self.viewmanager,PYSIGNAL('editorOpened'),
+ self.handleEditorOpened)
+
+ # Initialise the instance variables.
+ self.currentProg = None
+ self.isProg = 0
+ self.utEditorOpen = 0
+ self.utProjectOpen = 0
+
+ self.inDragDrop = 0
+ self.setAcceptDrops(1)
+ self.ficPatrons={}
+ self.initPatrons()
+ self.ihm="QT"
+
+
+ def initPatrons(self) :
+ from Editeur import listePatrons
+ self.listePatrons = listePatrons.listePatrons()
+ idx = 0
+ for nomSsMenu in self.listePatrons.liste.keys():
+ ssmenu = QPopupMenu(self.Patrons)
+ self.Patrons.insertItem(nomSsMenu, ssmenu)
+ for fichier in self.listePatrons.liste[nomSsMenu]:
+ id = ssmenu.insertItem(fichier, self.handleOpenPatrons)
+ self.ficPatrons[idx]=fichier
+ self.Patrons.setItemParameter(id,idx)
+ idx=idx+1
+
+ def handleShowRecentMenu(self):
+ """
+ Private method to set up recent files menu.
+ """
+ idx = 0
+ self.recentMenu.clear()
+
+ for rp in self.viewmanager.recent:
+ id = self.recentMenu.insertItem('&%d. %s' % (idx+1, unicode(rp)),
+ self.handleOpenRecent)
+ self.recentMenu.setItemParameter(id,idx)
+
+ idx = idx + 1
+
+ self.recentMenu.insertSeparator()
+ self.recentMenu.insertItem(self.trUtf8('&Clear'), self.handleClearRecent)
+
+ def handleOpenPatrons(self, idx):
+ fichier=REPINI+"/../Editeur/Patrons/"+self.ficPatrons[idx]
+ self.viewmanager.handleOpen(fn=fichier, patron = 1)
+
+
+ def handleOpenRecent(self, idx):
+ """
+ Private method to open a file from the list of rencently opened files.
+
+ @param idx index of the selected entry (int)
+ """
+ self.viewmanager.handleOpen(unicode(self.viewmanager.recent[idx]))
+
+ def handleClearRecent(self):
+ """
+ Private method to clear the recent files menu.
+ """
+## self.recent = QStringList()
+ self.viewmanager.recent = QStringList()
+
+
+ def handleLastEditorClosed(self):
+ """
+ Public slot to handle the lastEditorClosed signal.
+ """
+ print 10*"handleLastEditorClosed: CS_pbruno todo griser les parties k'il faut "
+ pass # CS_pbruno todo griser les parties k'il faut
+
+ def handleEditorOpened(self, fn):
+ """
+ Public slot to handle the editorOpened signal.
+
+ @param fn filename of the opened editor (string)
+ """
+ print 10*"handleEditorOpened: CS_pbruno todo griser les parties k'il faut "
+ pass # CS_pbruno todo degriser les parties k'il faut
+
+
+ def fileNew(self):
+ self.viewmanager.newEditor()
+
+ def fileOpen(self, prog=None):
+ self.viewmanager.handleOpen(prog)
+
+ def fileNewView(self):
+ self.viewmanager.handleNewView()
+
+ def fileSave(self):
+ self.viewmanager.saveCurrentEditor()
+
+ def fileSaveAs(self):
+ self.viewmanager.saveAsCurrentEditor()
+
+ def fileClose(self):
+ self.viewmanager.handleClose()
+
+ def fileCloseAll(self):
+ self.viewmanager.handleCloseAll()
+
+ def fileExit(self):
+ self.viewmanager.handleCloseAll()
+ qApp.closeAllWindows()
+
+ def editCopy(self):
+ self.viewmanager.handleEditCopy()
+
+ def editCut(self):
+ self.viewmanager.handleEditCut()
+
+ def editPaste(self):
+ self.viewmanager.handleEditPaste()
+
+ def jdcFichierSource(self):
+ self.viewmanager.handleViewJdcFichierSource()
+
+ def jdcRapport(self):
+ self.viewmanager.handleViewJdcRapport()
+
+
+
+
+
+if __name__=='__main__':
+
+ # Modules Eficas
+ from Aster import prefs
+ if hasattr(prefs,'encoding'):
+ # Hack pour changer le codage par defaut des strings
+ import sys
+ reload(sys)
+ sys.setdefaultencoding(prefs.encoding)
+ del sys.setdefaultencoding
+ # Fin hack
+
+ #CS_pbruno note: fait implicitement des trucs ces imports (grr)
+ #import styles
+ from Editeur import import_code
+ from Editeur import session
+
+ # Analyse des arguments de la ligne de commande
+ options=session.parse(sys.argv)
+ code=options.code
+
+ app = QApplication(sys.argv)
+ mw = Appli()
+ app.setMainWidget(mw)
+ app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+ mw.show()
+
+ res = app.exec_loop()
+ sys.exit(res)
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from qt import *
+
+# Import des panels
+
+class SaisieValeur:
+ """
+ Classe contenant les méthodes communes aux panels
+ permettant de choisir des valeurs
+ """
+ def __init__(self):
+ pass
+
+ def InitListBoxASSD(self):
+ listeNomsSD = self.node.item.get_sd_avant_du_bon_type()
+ for aSD in listeNomsSD:
+ self.listBoxASSD.insertItem( aSD)
+ QObject.connect(self.listBoxASSD, SIGNAL("doubleClicked(QListBoxItem*)" ), self.ClicASSD )
+ min,max = self.node.item.GetMinMax()
+ if (min == 1 and min == max and len(listeNomsSD)==1 ):
+ if ('R' not in self.node.item.get_type()) :
+ self.listBoxASSD.setCurrentItem(0)
+ self.ClicASSD()
+
+ def BuildLBValeurs(self):
+ self.LBValeurs.clear()
+ listeValeurs=self.node.item.GetListeValeurs()
+ for valeur in listeValeurs:
+ self.LBValeurs.insertItem(str(valeur))
+ if listeValeurs != None and listeValeurs != [] :
+ self.LBValeurs.setCurrentItem(len(listeValeurs) - 1)
+
+
+ def RemplitPanel(self,listeDejaLa=[]):
+ self.listBoxVal.clear()
+ lChoix=self.node.item.get_liste_possible(listeDejaLa)
+ for valeur in lChoix :
+ self.listBoxVal.insertItem( valeur )
+
+ def ClicASSD(self):
+ valeurQstring=self.listBoxASSD.selectedItem().text()
+ commentaire = QString("Valeur selectionnée : ")
+ commentaire.append(valeurQstring)
+ self.Commentaire.setText(commentaire)
+ valeur=valeurQstring.latin1()
+ validite,commentaire=self.politique.RecordValeur(valeur)
+ self.Commentaire.setText(QString(commentaire))
+
+ def ClicValeur(self):
+ valeurQstring=self.listBoxVal.selectedItem().text()
+ valeur=valeurQstring.latin1()
+ validite,commentaire=self.politique.RecordValeur(valeur)
+ self.Commentaire.setText(QString(commentaire))
+
+ def BOkPressed(self):
+ if self.listBoxVal.selectedItem()==None :
+ commentaire = "Pas de valeur selectionnée"
+ self.Commentaire.setText(QString(commentaire))
+ else :
+ self.ClicValeur()
+
+ def BOk2Pressed(self):
+ if str(self.lineEditVal.text())== "" :
+ commentaire = "Pas de valeur entrée "
+ self.Commentaire.setText(QString(commentaire))
+ else :
+ self.LEValeurPressed()
+
+ def LEValeurPressed(self):
+ nouvelleValeur=str(self.lineEditVal.text())
+ validite,commentaire=self.politique.RecordValeur(nouvelleValeur)
+ if commentaire != "" :
+ self.Commentaire.setText(QString(commentaire))
+
+ def BParametresPressed(self):
+ print "a faire"
+
+
+ def TraiteLEValeur(self,valeurTraitee=None) :
+ # lit la chaine entree dans le line edit
+ # et la tranforme en chaine de valeurs
+ # a traiter. renvoie eventuellement des complexes
+ listeValeurs=[]
+ if valeurTraitee == None :
+ valeurBrute=str(self.LEValeur.text())
+ else :
+ valeurBrute=valeurTraitee
+ print type(valeurBrute)
+ if valeurBrute == str("") : return 1, listeValeurs
+ try :
+ valeur=eval(valeurBrute,{})
+ except :
+ valeur=valeurBrute
+ if type(valeur) in (types.ListType,types.TupleType) :
+ indice = 0
+ while (indice < len(valeur)):
+ v=valeur[indice]
+ if self.node.item.wait_complex() :
+ if (v== 'RI' or v == 'MP'):
+ try :
+ t=tuple([v,valeur[indice+1],valeur[indice+2]])
+ listeValeurs.append(t)
+ indice=indice+3
+ except :
+ commentaire = "Veuillez entrer le complexe sous forme aster ou sous forme python"
+ self.editor.affiche_infos(commentaire)
+ return listeValeurs,0
+
+
+ else : # ce n'est pas un tuple à la mode aster
+
+ listeValeurs.append(v)
+ indice = indice + 1
+
+ else: # on n'attend pas un complexe
+ listeValeurs.append(v)
+ indice=indice+1
+ elif type(valeur) == types.StringType:
+ listeValeurs=valeur.split(',')
+ else:
+ listeValeurs.append(valeur)
+
+ return listeValeurs,1
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 lire un catalogue et a 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
+import re
+
+# Modules Eficas
+from Aster import prefs
+from Noyau.N_CR import CR
+from utils import init_rep_cata_dev
+
+from Editeur import analyse_catalogue
+from Editeur import autre_analyse_cata
+from Editeur import uiinfo
+from monChoixCata import MonChoixCata
+
+from qt import *
+
+class READERCATA:
+
+ #menu_defs=[
+ # ('Catalogue',[
+ # ("Rapport de validation catalogue",'visuCRCATA'),
+ # ]
+ # )
+ # ]
+ #
+ #button_defs=[]
+
+ def __init__(self,appli,parent):
+ self.appli=appli
+ self.parent=parent
+ self.code=self.appli.code
+ self.appli.format_fichier.set('python')
+ self.version_code=self.appli.version_code
+ self.version_cata=None
+ self.fic_cata=None
+ self.OpenCata()
+ self.cataitem=None
+
+ def OpenCata(self):
+ """
+ Ouvre le catalogue standard du code courant, cad le catalogue présent
+ dans le répertoire Cata
+ """
+ message1 = "Compilation des fichiers Eficas \n\n Veuillez patienter ..."
+ self.configure_barre(4)
+
+ liste_cata_possibles=[]
+ for catalogue in self.appli.CONFIGURATION.catalogues:
+ if catalogue[0] == self.code :
+ liste_cata_possibles.append(catalogue)
+
+ if len(liste_cata_possibles)==0:
+ QMessageBox.critical( self.parent, "Import du catalogue","Pas de catalogue defini pour le code %s" % self.code)
+ self.appli.quit()
+ sys.exit(1)
+
+ if self.version_code is not None:
+ # La version a ete fixee
+ for cata in liste_cata_possibles:
+ if self.version_code == cata[1]:
+ self.fic_cata = cata[2]
+ self.appli.format_fichier.set(cata[3])
+ elif len(liste_cata_possibles)==1:
+ self.fic_cata = liste_cata_possibles[0][2]
+ self.code = self.appli.CONFIGURATION.catalogues[0][0]
+ self.version_code = liste_cata_possibles[0][1]
+ self.appli.format_fichier.set(liste_cata_possibles[0][3])
+ lab=QString("Eficas V1.12 pour ASTER avec le catalogue ")
+ lab+=self.version_code
+ qApp.mainWidget().setCaption(lab)
+ else:
+ # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
+ # lequel il veut utiliser ...
+ self.ask_choix_catalogue()
+
+ if self.fic_cata == None :
+ print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
+ sys.exit(0)
+
+ # Determinination du repertoire materiau
+ v_codeSansPoint=self.version_code
+ v_codeSansPoint=re.sub("\.","",v_codeSansPoint)
+ chaine="rep_mat_"+v_codeSansPoint
+ if hasattr(self.appli.CONFIGURATION,chaine):
+ a=getattr(self.appli.CONFIGURATION,chaine)
+ else :
+ try :
+ a=self.appli.CONFIGURATION.dRepMat[self.version_code]
+ except :
+ print "Probleme avec le repertoire materiau"
+ a='.'
+ self.appli.CONFIGURATION.rep_mat=a
+
+
+ # 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'
+
+ # import du catalogue
+ self.cata = self.import_cata(self.fic_cata)
+ self.update_barre()
+ if not self.cata :
+ QMessageBox.critical( self.parent, "Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
+ self.appli.quit()
+ sys.exit(1)
+ #
+ # analyse du catalogue (ordre des mots-clés)
+ #
+ # 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 a la création
+ self.Retrouve_Ordre_Cata_Standard_autre()
+ self.update_barre()
+
+ #
+ # analyse des données liées a l'IHM : UIinfo
+ #
+ uiinfo.traite_UIinfo(self.cata)
+ self.update_barre()
+
+ #
+ # traitement des clefs documentaires
+ #
+ self.traite_clefs_documentaires()
+
+ # 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')
+ if os.path.isfile(fic_cata_dev):
+ # il y a bien un catalogue développeur : il faut récupérer le module_object associé ...
+ test = self.compile_cata(fic_cata_dev,fic_cata_dev+'c')
+ if not test :
+ showinfo("Compilation catalogue développeur",
+ "Erreur dans la compilation du catalogue développeur")
+ self.cata = (self.cata,)
+ else:
+ self.cata_dev =self.import_cata(fic_cata_dev)
+ #self.Retrouve_Ordre_Cata_Developpeur()
+ self.Retrouve_Ordre_Cata_Developpeur_autre()
+ self.cata = (self.cata,self.cata_dev)
+ else:
+ self.cata = (self.cata,)
+ else:
+ self.cata = (self.cata,)
+ titreSuite=" avec le catalogue " + os.path.basename(self.fic_cata)
+ titre=self.appli.titre+titreSuite
+ if self.appli.top:
+ self.appli.top.title(titre)
+ self.appli.titre=titre
+
+ def import_cata(self,cata):
+ """
+ Réalise l'import du catalogue dont le chemin d'acca¨s est donné par cata
+ """
+ nom_cata = os.path.splitext(os.path.basename(cata))[0]
+ rep_cata = os.path.dirname(cata)
+ sys.path[:0] = [rep_cata]
+ try :
+ o=__import__(nom_cata)
+ return o
+ except Exception,e:
+ traceback.print_exc()
+ return 0
+
+ def Retrouve_Ordre_Cata_Standard_autre(self):
+ """
+ Construit une structure de données dans le catalogue qui permet
+ a 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,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
+
+ def Retrouve_Ordre_Cata_Standard(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
+ """
+ time1 = os.path.getmtime(self.fic_cata)
+ try :
+ time2 = os.path.getmtime(self.fic_cata_p)
+ except:
+ time2 = 0
+ if time2 > time1 :
+ # l'objet catalogue n'a pas été modifié depuis le dernier "pickle"
+ self.Get_Ordre_Cata()
+ else :
+ # le catalogue a été modifié depuis le dernier "pickle" :
+ # il faut retrouver l'ordre du catalogue et refaire pickle
+ 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
+ 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
+ cata_dev_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
+ 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 :
+ - mode='pickle ': tente de relire le fichier pickle et sinon lance l'analyse du catalogue
+ - mode='cata' : force l'analyse du catalogue directement sans relire le pickle
+ """
+ if mode == 'pickle' :
+ try:
+ f = open(self.fic_cata_p)
+ u = cPickle.Unpickler(f)
+ self.cata_ordonne_dico = u.load()
+ f.close()
+ except :
+ # on peut ne pas arriver a relire le fichier pickle s'il a été altéré
+ # ou (le plus probable) s'il a été créé sous un autre OS
+ self.Get_Ordre_Cata(mode='cata')
+ elif mode == 'cata':
+ cata_ordonne = analyse_catalogue.analyse_catalogue(self,self.fic_cata)
+ self.cata_ordonne_cr = cata_ordonne.cr
+ self.cata_ordonne_dico = cata_ordonne.entites
+ f = open(self.fic_cata_p,'w+')
+ p = cPickle.Pickler(f)
+ p.dump(self.cata_ordonne_dico)
+ f.close()
+ else :
+ raise Exception("Appel a un mode inconnu de Get_Ordre_Cata : %s" % mode)
+ return
+
+ def ask_choix_catalogue(self):
+ """
+ Ouvre une fenetre de sélection du catalogue dans le cas oa¹ plusieurs
+ ont été définis dans Accas/editeur.ini
+ """
+ # construction du dictionnaire et de la liste des catalogues
+ self.dico_catalogues = {}
+ defaut = None
+ for catalogue in self.appli.CONFIGURATION.catalogues:
+ if catalogue[0] == self.code :
+ self.dico_catalogues[catalogue[1]] = catalogue
+ if len(catalogue) == 5 :
+ if catalogue[4]=='defaut' : defaut = catalogue[1]
+ liste_choix = self.dico_catalogues.keys()
+ liste_choix.sort()
+
+ lab=QString("Eficas V1.12 pour ASTER avec le catalogue ")
+
+ # teste si plusieurs catalogues ou non
+ if len(liste_choix) == 0:
+ QMessageBox.critical( self.parent, "", "Aucun catalogue déclaré pour %s" %self.code)
+ self.appli.quit()
+ sys.exit(1)
+ #elif len(liste_choix) == 1:
+ # self.fic_cata = self.dico_catalogues[liste_choix[0]][2]
+ # self.version_code = liste_choix[0]
+ lab=QString("Eficas V1.12 pour ASTER avec le catalogue ")
+ # lab+=self.version_code
+ # qApp.mainWidget().setCaption(lab)
+ # return
+
+ # création d'une boite de dialogue modale
+ widgetChoix=MonChoixCata(liste_choix,self, self.parent, "", True )
+ ret=widgetChoix.exec_loop()
+
+ if ret == QDialog.Accepted:
+ self.version_cata=str(self.version_cata)
+ self.fic_cata = self.dico_catalogues[self.version_cata][2]
+ self.version_code = self.version_cata
+ self.appli.format_fichier.set( self.dico_catalogues[self.version_cata][3] )
+ lab+=self.version_cata
+ qApp.mainWidget().setCaption(lab)
+
+
+
+
+ def compile_cata(self,cata,catac):
+ """
+ Teste si le catalogue a bien besoin d'etre recompilé et si oui, le compile et
+ affiche un message dans le splash . Retourne 1 si la compilation s'est bien déroulée,
+ 0 sinon.
+ """
+ time1 = os.path.getmtime(cata)
+ try:
+ time2 = os.path.getmtime(catac)
+ except:
+ time2 = 0
+ if time1 > time2:
+ try:
+ # le catalogue doit etre recompilé avant d'etre importé
+ if self.appli.test == 0 :
+ splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
+ py_compile.compile(cata)
+ except:
+ return 0
+ return 1
+
+
+#--------------------------------------------------------------------------------
+# Méthodes concernant la barre de progression lors de l'analyse du catalogue
+#--------------------------------------------------------------------------------
+
+ def configure_barre(self,nbcommandes):
+ """ Configure la barre de progression en lui passant comme parama¨tre le
+ nombre de commandes du catalogue qui lui sert a déterminer la longueur de son incrément """
+ try:
+ if self.appli.test == 0 :
+ splash._splash.configure(barre='oui',ratio = nbcommandes)
+ except:
+ pass
+
+ def update_barre(self):
+ """ Update la position de la barre de progression : la fait progresser de son incrément """
+ try:
+ if self.appli.test == 0 :
+ splash._splash.update_barre()
+ except:
+ pass
+
+ def visuCRCATA(self):
+ """
+ Méthode permettant l'affichage du rapport de validation
+ """
+ cr = CR( debut = "Début rapport de validation du catalogue",
+ fin = "Fin rapport de validation du catalogue")
+ titre="rapport de validation du catalogue"
+ if hasattr(self,'cata_ordonne_cr') :
+ cr.add(self.cata_ordonne_cr)
+ if hasattr(self,'cata_dev_ordonne_cr') :
+ cr.add(self.cata_dev_ordonne_cr)
+ for cata in self.cata:
+ if hasattr(cata,'JdC'):
+ cr.add(cata.JdC.report())
+ texte_cr = str(cr)
+ self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
+
+
+ def traite_clefs_documentaires(self):
+ try:
+ self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
+ f=open(self.fic_cata_clef)
+ except:
+ #print "Pas de fichier associé contenant des clefs documentaires"
+ return
+
+ dict_clef_docu={}
+ for l in f.readlines():
+ clef=l.split(':')[0]
+ docu=l.split(':')[1]
+ docu=docu[0:-1]
+ dict_clef_docu[clef]=docu
+ for oper in self.cata.JdC.commandes:
+ if dict_clef_docu.has_key(oper.nom):
+ oper.docu=dict_clef_docu[oper.nom]
--- /dev/null
+# -*- coding: utf-8 -*-
+from qt import *
+
+#---------------------------#
+class PopUpMenuNodePartiel :
+#---------------------------#
+ def createPopUpMenu(self):
+ #menu
+ self.menu = QPopupMenu(self.tree)
+
+ #ss-menu Comment:
+ self.commentMenu = QPopupMenu( self.menu )
+ self.menu.insertItem( qApp.translate('Browser','Comment'), self.commentMenu )
+ self.commentMenu.insertItem( 'after', self.addCommentAfter )
+ self.commentMenu.insertItem( 'before', self.addCommentBefore )
+
+ #ss-menu Parameters:
+ self.parametersMenu = QPopupMenu( self.menu )
+ self.parametersMenu.insertItem( 'after', self.addParametersAfter )
+ self.parametersMenu.insertItem( 'before', self.addParametersBefore )
+
+ #items du menu
+ self.menu.insertItem( qApp.translate('Browser','Delete'), self.delete )
+ self.menu.insertItem( qApp.translate('Browser','Parameters'), self.parametersMenu )
+
+
+ def addCommentAfter(self):
+ """
+ """
+ self.addComment()
+
+ def addCommentBefore(self):
+ """
+ """
+ self.addComment(False)
+
+ def addParametersAfter(self):
+ """
+ """
+ self.addParameters()
+
+ def addParametersBefore(self):
+ """
+ """
+ self.addParameters(False)
+
+
+#-----------------------------------------#
+class PopUpMenuNode(PopUpMenuNodePartiel) :
+#-----------------------------------------#
+ def createPopUpMenu(self):
+ PopUpMenuNodePartiel.createPopUpMenu(self)
+
+ self.commentMenu.insertItem( 'it', self.commentIt )
--- /dev/null
+# -*- coding: utf-8 -*-
+
+from qt import QPixmap
+import os
+
+class PixmapCache:
+ """
+ Class implementing a pixmap cache for icons.
+ """
+ def __init__(self):
+ """
+ Constructor
+ """
+ self.pixmapCache = {}
+
+ def getPixmap(self, key):
+ """
+ Public method to retrieve a pixmap.
+
+ @param key name of the wanted pixmap (string)
+ @return the requested pixmap (QPixmap)
+ """
+ try:
+ return self.pixmapCache[key]
+ except KeyError:
+ self.pixmapCache[key] = QPixmap.fromMimeSource(key)
+ return self.pixmapCache[key]
+
+pixCache = PixmapCache()
+
+def getPixmap(key, cache = pixCache):
+ """
+ Module function to retrieve a pixmap.
+
+ @param key name of the wanted pixmap (string)
+ @return the requested pixmap (QPixmap)
+ """
+ return cache.getPixmap(key)
+
+
+
+from qt import QMimeSourceFactory
+
+def initializeMimeSourceFactory():
+ """
+ Function to initialize the default mime source factory.
+
+ """
+ defaultFactory = QMimeSourceFactory.defaultFactory()
+ repini=os.path.dirname(os.path.abspath(__file__))
+ defaultFactory.addFilePath(repini+"/../Editeur/icons") #CS_pbruno todo (config)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+from InterfaceQT import utilIcons
+from qt import *
+
+
+##fonctions utilitaires
+def normabspath(path):
+ """
+ Function returning a normalized, absolute path.
+
+ @param path file path (string)
+ @return absolute, normalized path (string)
+ """
+ return os.path.abspath(path)
+
+
+def samepath(f1, f2):
+ """
+ Function to compare two paths.
+
+ @param f1 first path for the compare (string)
+ @param f2 second path for the compare (string)
+ @return flag indicating whether the two paths represent the
+ same path on disk.
+ """
+ if f1 is None or f2 is None:
+ return 0
+
+ if normcasepath(f1) == normcasepath(f2):
+ return 1
+
+ return 0
+
+def normcasepath(path):
+ """
+ Function returning a path, that is normalized with respect to its case and references.
+
+ @param path file path (string)
+ @return case normalized path (string)
+ """
+ return os.path.normcase(os.path.normpath(path))
+
+
+
+
+class ViewManager:
+ """
+ Base class inherited by all specific viewmanager classes.
+
+ It defines the interface to be implemented by specific
+ viewmanager classes and all common methods.
+
+ @signal lastEditorClosed emitted after the last editor window was closed
+ @signal editorOpened(string) emitted after an editor window was opened
+ @signal editorSaved(string) emitted after an editor window was saved
+ @signal checkActions(editor) emitted when some actions should be checked
+ for their status
+ @signal cursorChanged(editor) emitted after the cursor position of the active
+ window has changed
+ @signal breakpointToggled(editor) emitted when a breakpoint is toggled.
+ @signal bookmarkToggled(editor) emitted when a bookmark is toggled.
+ """
+ def __init__(self, ui ):
+ """
+ Constructor
+
+ @param ui reference to the main user interface
+ @param dbs reference to the debug server object
+ """
+ # initialize the instance variables
+ self.ui = ui
+ self.editors = []
+ self.currentEditor = None
+ self.untitledCount = 0
+ self.srHistory = {"search" : QStringList(), "replace" : QStringList()}
+ self.editorsCheckFocusIn = 1
+ self.recent = QStringList()
+
+
+ # initialize the central store for api information (used by
+ # autocompletion and calltips)
+ self.apis = {}
+ self.initFileFilters()
+
+
+ def initFileFilters(self):
+ """
+ Private method to initialize the lists of supported filename filters.
+ """
+ self.fileFiltersString = self.trUtf8(\
+ 'Python Files (*.py);;'
+ 'Aster Files (*.com*);;'
+ 'Pyrex Files (*.pyx);;'
+ 'Quixote Template Files (*.ptl);;'
+ 'IDL Files (*.idl);;'
+ 'C Files (*.h *.c);;'
+ 'C++ Files (*.h *.hpp *.hh *.cxx *.cpp *.cc);;'
+ 'C# Files (*.cs);;'
+ 'HTML Files (*.html *.htm *.asp *.shtml *.css);;'
+ 'PHP Files (*.php *.php3 *.php4 *.php5 *.phtml);;'
+ 'XML Files (*.xml *.xsl *.xslt *.dtd);;'
+ 'Java Files (*.java);;'
+ 'JavaScript Files (*.js);;'
+ 'SQL Files (*.sql);;'
+ 'Docbook Files (*.docbook);;'
+ 'Perl Files (*.pl *.pm *.ph);;'
+ 'Shell Files (*.sh);;'
+ 'Aster Files (*.com*);;'
+ 'All Files (*)')
+
+ fileFilters = QStringList.split(';;', self.fileFiltersString)
+
+ self.ext2Filter = {}
+ for fileFilter in fileFilters:
+ extensions = QStringList.split('*', fileFilter)
+ for extension in extensions[1:]:
+ extension = unicode(extension).strip().replace(')', '')
+ if extension:
+ self.ext2Filter[extension] = unicode(fileFilter)
+
+
+
+ #####################################################################
+ ## methods above need to be implemented by a subclass
+ #####################################################################
+
+ def canSplit(self):
+ """
+ public method to signal if splitting of the view is available.
+
+ @return flag indicating splitting of the view is available.
+ """
+ return 0
+
+ def addSplit(self):
+ """
+ Public method used to split the current view.
+ """
+ pass
+
+ def removeSplit(self):
+ """
+ Public method used to remove the current split view.
+
+ @return Flag indicating successful deletion
+ """
+ return 0
+
+ def setSplitOrientation(self, orientation):
+ """
+ Public method used to set the orientation of the split view.
+
+ @param orientation orientation of the split
+ (QSplitter.Horizontal or QSplitter.Vertical)
+ """
+ pass
+
+ def eventFilter(self, object, event):
+ """
+ Private method called to filter an event.
+
+ @param object object, that generated the event (QObject)
+ @param event the event, that was generated by object (QEvent)
+ @return flag indicating if event was filtered out
+ """
+ return 0
+
+ def focusInEvent(self, event):
+ """
+ Public method called when the viewmanager receives focus.
+
+ @param event the event object (QFocusEvent)
+ """
+ self.editorActGrp.setEnabled(1)
+
+ def focusOutEvent(self, event):
+ """
+ Public method called when the viewmanager loses focus.
+
+ @param event the event object (QFocusEvent)
+ """
+ self.editorActGrp.setEnabled(0)
+
+
+ def initEditMenu(self):
+ """
+ Public method to create the Edit menu
+
+ @return the generated menu
+ """
+ menu = QPopupMenu(self.ui)
+ menu.insertTearOffHandle()
+ self.undoAct.addTo(menu)
+ self.redoAct.addTo(menu)
+ self.revertAct.addTo(menu)
+ menu.insertSeparator()
+ self.cutAct.addTo(menu)
+ self.copyAct.addTo(menu)
+ self.pasteAct.addTo(menu)
+ self.deleteAct.addTo(menu)
+ menu.insertSeparator()
+ self.indentAct.addTo(menu)
+ self.unindentAct.addTo(menu)
+ menu.insertSeparator()
+ self.commentAct.addTo(menu)
+ self.uncommentAct.addTo(menu)
+ self.streamCommentAct.addTo(menu)
+ self.boxCommentAct.addTo(menu)
+ menu.insertSeparator()
+ self.autoCompleteAct.addTo(menu)
+ self.autoCompleteFromDocAct.addTo(menu)
+ self.autoCompleteFromAPIsAct.addTo(menu)
+ menu.insertSeparator()
+ self.searchAct.addTo(menu)
+ self.searchAgainAct.addTo(menu)
+ self.replaceAct.addTo(menu)
+ menu.insertSeparator()
+ self.searchFilesAct.addTo(menu)
+ menu.insertSeparator()
+ self.gotoAct.addTo(menu)
+ self.gotoBraceAct.addTo(menu)
+ menu.insertSeparator()
+ self.selectBraceAct.addTo(menu)
+ self.selectAllAct.addTo(menu)
+ self.deselectAllAct.addTo(menu)
+ menu.insertSeparator()
+ self.shortenEmptyAct.addTo(menu)
+ self.convertEOLAct.addTo(menu)
+
+ return menu
+
+ def initEditToolbar(self):
+ """
+ Public method to create the Edit toolbar
+
+ @return the generated toolbar
+ """
+ tb = QToolBar(self.ui)
+ self.undoAct.addTo(tb)
+ self.redoAct.addTo(tb)
+ tb.addSeparator()
+ self.cutAct.addTo(tb)
+ self.copyAct.addTo(tb)
+ self.pasteAct.addTo(tb)
+ self.deleteAct.addTo(tb)
+ tb.addSeparator()
+ self.indentAct.addTo(tb)
+ self.unindentAct.addTo(tb)
+ tb.addSeparator()
+ self.commentAct.addTo(tb)
+ self.uncommentAct.addTo(tb)
+
+ return tb
+
+ ##################################################################
+ ## Initialize the search related actions, search menu and toolbar
+ ##################################################################
+
+ def initSearchActions(self):
+ """
+ Private method defining the user interface actions for the search commands.
+ """
+ self.searchActGrp = QActionGroup(self)
+
+ self.searchAct = QAction(self.trUtf8('Search'),
+ QIconSet(utilIcons.getPixmap("find.png")),
+ self.trUtf8('&Search...'),
+ QKeySequence(self.trUtf8("CTRL+F","Search|Search")),
+ self.searchActGrp)
+ self.searchAct.setStatusTip(self.trUtf8('Search for a text'))
+ self.searchAct.setWhatsThis(self.trUtf8(
+ """<b>Search</b>"""
+ """<p>Search for some text in the current editor. A"""
+ """ dialog is shown to enter the searchtext and options"""
+ """ for the search.</p>"""
+ ))
+ self.connect(self.searchAct,SIGNAL('activated()'),self.handleSearch)
+ self.searchActions.append(self.searchAct)
+
+ self.searchAgainAct = QAction(self.trUtf8('Search again'),
+ QIconSet(utilIcons.getPixmap("findNext.png")),
+ self.trUtf8('Search &again'),
+ Qt.Key_F3,self.searchActGrp)
+ self.searchAgainAct.setStatusTip(self.trUtf8('Search again for text'))
+ self.searchAgainAct.setWhatsThis(self.trUtf8(
+ """<b>Search again</b>"""
+ """<p>Search again for some text in the current editor."""
+ """ The previously entered searchtext and options are reused.</p>"""
+ ))
+ self.connect(self.searchAgainAct,SIGNAL('activated()'),self.searchDlg.handleFindNext)
+ self.searchActions.append(self.searchAgainAct)
+
+ self.replaceAct = QAction(self.trUtf8('Replace'),
+ self.trUtf8('&Replace...'),
+ QKeySequence(self.trUtf8("CTRL+R","Search|Replace")),
+ self.searchActGrp)
+ self.replaceAct.setStatusTip(self.trUtf8('Replace some text'))
+ self.replaceAct.setWhatsThis(self.trUtf8(
+ """<b>Replace</b>"""
+ """<p>Search for some text in the current editor and replace it. A"""
+ """ dialog is shown to enter the searchtext, the replacement text"""
+ """ and options for the search and replace.</p>"""
+ ))
+ self.connect(self.replaceAct,SIGNAL('activated()'),self.handleReplace)
+ self.searchActions.append(self.replaceAct)
+
+ self.gotoAct = QAction(self.trUtf8('Goto Line'),
+ QIconSet(utilIcons.getPixmap("goto.png")),
+ self.trUtf8('&Goto Line...'),
+ QKeySequence(self.trUtf8("CTRL+G","Search|Goto Line")),
+ self.searchActGrp)
+ self.gotoAct.setStatusTip(self.trUtf8('Goto Line'))
+ self.gotoAct.setWhatsThis(self.trUtf8(
+ """<b>Goto Line</b>"""
+ """<p>Go to a specific line of text in the current editor."""
+ """ A dialog is shown to enter the linenumber.</p>"""
+ ))
+ self.connect(self.gotoAct,SIGNAL('activated()'),self.handleGoto)
+ self.searchActions.append(self.gotoAct)
+
+ self.gotoBraceAct = QAction(self.trUtf8('Goto Brace'),
+ QIconSet(utilIcons.getPixmap("gotoBrace.png")),
+ self.trUtf8('Goto &Brace'),
+ QKeySequence(self.trUtf8("CTRL+L","Search|Goto Brace")),
+ self.searchActGrp)
+ self.gotoBraceAct.setStatusTip(self.trUtf8('Goto Brace'))
+ self.gotoBraceAct.setWhatsThis(self.trUtf8(
+ """<b>Goto Brace</b>"""
+ """<p>Go to the matching brace in the current editor.</p>"""
+ ))
+ self.connect(self.gotoBraceAct,SIGNAL('activated()'),self.handleGotoBrace)
+ self.searchActions.append(self.gotoBraceAct)
+
+ self.searchActGrp.setEnabled(0)
+
+ self.searchFilesAct = QAction(self.trUtf8('Search in Files'),
+ QIconSet(utilIcons.getPixmap("projectFind.png")),
+ self.trUtf8('Search in &Files...'),
+ QKeySequence(self.trUtf8("SHIFT+CTRL+F","Search|Search Files")),
+ self)
+ self.searchFilesAct.setStatusTip(self.trUtf8('Search for a text in files'))
+ self.searchFilesAct.setWhatsThis(self.trUtf8(
+ """<b>Search in Files</b>"""
+ """<p>Search for some text in the files of a directory tree"""
+ """ or the project. A dialog is shown to enter the searchtext"""
+ """ and options for the search and to display the result.</p>"""
+ ))
+ self.connect(self.searchFilesAct,SIGNAL('activated()'),self.handleSearchFiles)
+ self.searchActions.append(self.searchFilesAct)
+
+
+ ##################################################################
+ ## Initialize the view related actions, view menu and toolbar
+ ##################################################################
+
+ def initViewActions(self):
+ """
+ Protected method defining the user interface actions for the view commands.
+ """
+ self.viewActGrp = QActionGroup(self)
+ self.viewFoldActGrp = QActionGroup(self)
+
+ self.zoomInAct = QAction(self.trUtf8('Zoom in'),
+ QIconSet(utilIcons.getPixmap("zoomIn.png")),
+ self.trUtf8('Zoom &in'),
+ Qt.CTRL+Qt.Key_Plus, self.viewActGrp)
+ self.zoomInAct.setStatusTip(self.trUtf8('Zoom in on the text'))
+ self.zoomInAct.setWhatsThis(self.trUtf8(
+ """<b>Zoom in</b>"""
+ """<p>Zoom in on the text. This makes the text bigger.</p>"""
+ ))
+ self.connect(self.zoomInAct,SIGNAL('activated()'),self.handleZoomIn)
+ self.viewActions.append(self.zoomInAct)
+
+ self.zoomOutAct = QAction(self.trUtf8('Zoom out'),
+ QIconSet(utilIcons.getPixmap("zoomOut.png")),
+ self.trUtf8('Zoom &out'),
+ Qt.CTRL+Qt.Key_Minus, self.viewActGrp)
+ self.zoomOutAct.setStatusTip(self.trUtf8('Zoom out on the text'))
+ self.zoomOutAct.setWhatsThis(self.trUtf8(
+ """<b>Zoom out</b>"""
+ """<p>Zoom out on the text. This makes the text smaller.</p>"""
+ ))
+ self.connect(self.zoomOutAct,SIGNAL('activated()'),self.handleZoomOut)
+ self.viewActions.append(self.zoomOutAct)
+
+ self.zoomToAct = QAction(self.trUtf8('Zoom'),
+ QIconSet(utilIcons.getPixmap("zoomTo.png")),
+ self.trUtf8('&Zoom'),
+ 0, self.viewActGrp)
+ self.zoomToAct.setStatusTip(self.trUtf8('Zoom the text'))
+ self.zoomToAct.setWhatsThis(self.trUtf8(
+ """<b>Zoom</b>"""
+ """<p>Zoom the text. This opens a dialog where the"""
+ """ desired size can be entered.</p>"""
+ ))
+ self.connect(self.zoomToAct,SIGNAL('activated()'),self.handleZoom)
+ self.viewActions.append(self.zoomToAct)
+
+ self.toggleAllAct = QAction(self.trUtf8('Toggle all folds'),
+ self.trUtf8('Toggle &all folds'),
+ 0, self.viewFoldActGrp)
+ self.toggleAllAct.setStatusTip(self.trUtf8('Toggle all folds'))
+ self.toggleAllAct.setWhatsThis(self.trUtf8(
+ """<b>Toggle all folds</b>"""
+ """<p>Toggle all folds of the current editor.</p>"""
+ ))
+ self.connect(self.toggleAllAct,SIGNAL('activated()'),self.handleToggleAll)
+ self.viewActions.append(self.toggleAllAct)
+
+ self.toggleCurrentAct = QAction(self.trUtf8('Toggle current fold'),
+ self.trUtf8('Toggle ¤t fold'),
+ 0, self.viewFoldActGrp)
+ self.toggleCurrentAct.setStatusTip(self.trUtf8('Toggle current fold'))
+ self.toggleCurrentAct.setWhatsThis(self.trUtf8(
+ """<b>Toggle current fold</b>"""
+ """<p>Toggle the folds of the current line of the current editor.</p>"""
+ ))
+ self.connect(self.toggleCurrentAct,SIGNAL('activated()'),self.handleToggleCurrent)
+ self.viewActions.append(self.toggleCurrentAct)
+
+ self.unhighlightAct = QAction(self.trUtf8('Remove all highlights'),
+ QIconSet(utilIcons.getPixmap("unhighlight.png")),
+ self.trUtf8('Remove all highlights'),
+ 0, self)
+ self.unhighlightAct.setStatusTip(self.trUtf8('Remove all highlights'))
+ self.unhighlightAct.setWhatsThis(self.trUtf8(
+ """<b>Remove all highlights</b>"""
+ """<p>Remove the highlights of all editors.</p>"""
+ ))
+ self.connect(self.unhighlightAct,SIGNAL('activated()'),self.unhighlight)
+ self.viewActions.append(self.unhighlightAct)
+
+ self.splitViewAct = QAction(self.trUtf8('Split view'),
+ QIconSet(utilIcons.getPixmap("splitVertical.png")),
+ self.trUtf8('&Split view'),
+ 0, self)
+ self.splitViewAct.setStatusTip(self.trUtf8('Add a split to the view'))
+ self.splitViewAct.setWhatsThis(self.trUtf8(
+ """<b>Split view</b>"""
+ """<p>Add a split to the view.</p>"""
+ ))
+ self.connect(self.splitViewAct,SIGNAL('activated()'),self.handleSplitView)
+ self.viewActions.append(self.splitViewAct)
+
+ self.splitOrientationAct = QAction(self.trUtf8('Arrange horizontally'),
+ self.trUtf8('Arrange &horizontally'),
+ 0, self, None, 1)
+ self.splitOrientationAct.setStatusTip(self.trUtf8('Arrange the splitted views horizontally'))
+ self.splitOrientationAct.setWhatsThis(self.trUtf8(
+ """<b>Arrange horizontally</b>"""
+ """<p>Arrange the splitted views horizontally.</p>"""
+ ))
+ self.splitOrientationAct.setOn(0)
+ self.connect(self.splitOrientationAct,SIGNAL('activated()'),self.handleSplitOrientation)
+ self.viewActions.append(self.splitOrientationAct)
+
+ self.splitRemoveAct = QAction(self.trUtf8('Remove split'),
+ QIconSet(utilIcons.getPixmap("remsplitVertical.png")),
+ self.trUtf8('&Remove split'),
+ 0, self)
+ self.splitRemoveAct.setStatusTip(self.trUtf8('Remove the current split'))
+ self.splitRemoveAct.setWhatsThis(self.trUtf8(
+ """<b>Remove split</b>"""
+ """<p>Remove the current split.</p>"""
+ ))
+ self.connect(self.splitRemoveAct,SIGNAL('activated()'),self.removeSplit)
+ self.viewActions.append(self.splitRemoveAct)
+
+ self.viewActGrp.setEnabled(0)
+ self.viewFoldActGrp.setEnabled(0)
+ self.unhighlightAct.setEnabled(0)
+ self.splitViewAct.setEnabled(0)
+ self.splitOrientationAct.setEnabled(0)
+ self.splitRemoveAct.setEnabled(0)
+
+ def initViewMenu(self):
+ """
+ Public method to create the View menu
+
+ @return the generated menu
+ """
+ menu = QPopupMenu(self.ui)
+ menu.insertTearOffHandle()
+ self.viewActGrp.addTo(menu)
+ menu.insertSeparator()
+ self.viewFoldActGrp.addTo(menu)
+ menu.insertSeparator()
+ self.unhighlightAct.addTo(menu)
+ if self.canSplit():
+ menu.insertSeparator()
+ self.splitViewAct.addTo(menu)
+ self.splitOrientationAct.addTo(menu)
+ self.splitRemoveAct.addTo(menu)
+ return menu
+
+ def initViewToolbar(self):
+ """
+ Public method to create the View toolbar
+
+ @return the generated toolbar
+ """
+ tb = QToolBar(self.ui)
+ self.viewActGrp.addTo(tb)
+ tb.addSeparator()
+ self.unhighlightAct.addTo(tb)
+ if self.canSplit():
+ tb.addSeparator()
+ self.splitViewAct.addTo(tb)
+ self.splitRemoveAct.addTo(tb)
+
+ return tb
+
+ ##################################################################
+ ## Initialize the macro related actions and macro menu
+ ##################################################################
+
+ def initMacroActions(self):
+ """
+ Private method defining the user interface actions for the macro commands.
+ """
+ self.macroActGrp = QActionGroup(self)
+
+ self.macroStartRecAct = QAction(self.trUtf8('Start Macro Recording'),
+ self.trUtf8('S&tart Macro Recording'),
+ 0, self.macroActGrp)
+ self.macroStartRecAct.setStatusTip(self.trUtf8('Start Macro Recording'))
+ self.macroStartRecAct.setWhatsThis(self.trUtf8(
+ """<b>Start Macro Recording</b>"""
+ """<p>Start recording editor commands into a new macro.</p>"""
+ ))
+ self.connect(self.macroStartRecAct,SIGNAL('activated()'),self.handleMacroStartRecording)
+ self.macroActions.append(self.macroStartRecAct)
+
+ self.macroStopRecAct = QAction(self.trUtf8('Stop Macro Recording'),
+ self.trUtf8('Sto&p Macro Recording'),
+ 0, self.macroActGrp)
+ self.macroStopRecAct.setStatusTip(self.trUtf8('Stop Macro Recording'))
+ self.macroStopRecAct.setWhatsThis(self.trUtf8(
+ """<b>Stop Macro Recording</b>"""
+ """<p>Stop recording editor commands into a new macro.</p>"""
+ ))
+ self.connect(self.macroStopRecAct,SIGNAL('activated()'),self.handleMacroStopRecording)
+ self.macroActions.append(self.macroStopRecAct)
+
+ self.macroRunAct = QAction(self.trUtf8('Run Macro'),
+ self.trUtf8('&Run Macro'),
+ 0, self.macroActGrp)
+ self.macroRunAct.setStatusTip(self.trUtf8('Run Macro'))
+ self.macroRunAct.setWhatsThis(self.trUtf8(
+ """<b>Run Macro</b>"""
+ """<p>Run a previously recorded editor macro.</p>"""
+ ))
+ self.connect(self.macroRunAct,SIGNAL('activated()'),self.handleMacroRun)
+ self.macroActions.append(self.macroRunAct)
+
+ self.macroDeleteAct = QAction(self.trUtf8('Delete Macro'),
+ self.trUtf8('&Delete Macro'),
+ 0, self.macroActGrp)
+ self.macroDeleteAct.setStatusTip(self.trUtf8('Delete Macro'))
+ self.macroDeleteAct.setWhatsThis(self.trUtf8(
+ """<b>Delete Macro</b>"""
+ """<p>Delete a previously recorded editor macro.</p>"""
+ ))
+ self.connect(self.macroDeleteAct,SIGNAL('activated()'),self.handleMacroDelete)
+ self.macroActions.append(self.macroDeleteAct)
+
+ self.macroLoadAct = QAction(self.trUtf8('Load Macro'),
+ self.trUtf8('&Load Macro'),
+ 0, self.macroActGrp)
+ self.macroLoadAct.setStatusTip(self.trUtf8('Load Macro'))
+ self.macroLoadAct.setWhatsThis(self.trUtf8(
+ """<b>Load Macro</b>"""
+ """<p>Load an editor macro from a file.</p>"""
+ ))
+ self.connect(self.macroLoadAct,SIGNAL('activated()'),self.handleMacroLoad)
+ self.macroActions.append(self.macroLoadAct)
+
+ self.macroSaveAct = QAction(self.trUtf8('Save Macro'),
+ self.trUtf8('&Save Macro'),
+ 0, self.macroActGrp)
+ self.macroSaveAct.setStatusTip(self.trUtf8('Save Macro'))
+ self.macroSaveAct.setWhatsThis(self.trUtf8(
+ """<b>Save Macro</b>"""
+ """<p>Save a previously recorded editor macro to a file.</p>"""
+ ))
+ self.connect(self.macroSaveAct,SIGNAL('activated()'),self.handleMacroSave)
+ self.macroActions.append(self.macroSaveAct)
+
+ self.macroActGrp.setEnabled(0)
+
+ def initMacroMenu(self):
+ """
+ Public method to create the Macro menu
+
+ @return the generated menu
+ """
+ menu = QPopupMenu(self.ui)
+ menu.insertTearOffHandle()
+ self.macroActGrp.addTo(menu)
+ return menu
+
+
+ def checkDirty(self, editor):
+ """
+ Private method to check dirty status and open a message window.
+
+ @param editor editor window to check
+ @return flag indicating successful reset of the dirty flag (boolean)
+ """
+ if editor.modified:
+ print 'CHECKDIRTY AAAAAA'
+ fn = editor.getFileName()
+ if fn is None:
+ fn = self.trUtf8('Noname')
+ res = QMessageBox.warning(self.parent(),
+ self.trUtf8("File Modified"),
+ self.trUtf8("The file <b>%1</b> has unsaved changes.")
+ .arg(fn),
+ self.trUtf8("&Save"), self.trUtf8("&Discard changes"),
+ self.trUtf8("&Abort"), 0, 2)
+ if res == 0:
+ (ok, newName) = editor.saveFile()
+ if ok:
+ self.setEditorName(editor, newName)
+ return ok
+ elif res == 2:
+ return 0
+ print 'CHECKDIRTY BBBBBB'
+ return 1
+
+ def checkAllDirty(self):
+ """
+ Public method to check the dirty status of all editors.
+
+ @return flag indicating successful reset of all dirty flags (boolean)
+ """
+ for editor in self.editors:
+ if not self.checkDirty(editor):
+ return 0
+
+ return 1
+
+ def closeEditor(self, editor):
+ """
+ Private method to close an editor window.
+
+ @param editor editor window to be closed
+ @return flag indicating success (boolean)
+ """
+ print 'CLOSEEDITOR'
+ # save file if necessary
+ if not self.checkDirty(editor):
+ return 0
+
+ # remove the window
+ self.removeView(editor)
+ self.editors.remove(editor)
+ if not len(self.editors):
+ self.handleLastEditorClosed()
+ self.emit(PYSIGNAL('lastEditorClosed'), ()) #CS_pbruno connecter signal avec l'appli
+ return 1
+
+ def handleClose(self):
+ """
+ Public method to close the current window.
+
+ @return flag indicating success (boolean)
+ """
+ aw = self.activeWindow()
+ if aw is None:
+ return 0
+
+ res = self.closeEditor(aw)
+ if res and aw == self.currentEditor:
+ self.currentEditor = None
+
+ return res
+
+ def handleNewView(self):
+ """
+ Public method to close the current window.
+
+ @return flag indicating success (boolean)
+ """
+ aw = self.activeWindow()
+ if aw is None:
+ return 0
+
+ aw.handleNewView()
+
+
+ def handleCloseAll(self):
+ """
+ Private method to close all editor windows via file menu.
+ """
+ savedEditors = self.editors[:]
+ for editor in savedEditors:
+ self.closeEditor(editor)
+
+ def handleCloseWindow(self, fn):
+ """
+ Public method to close an arbitrary source editor.
+
+ @param fn filename of editor to be closed
+ @return flag indicating success (boolean)
+ """
+ for editor in self.editors:
+ if samepath(fn, editor.getFileName()):
+ break
+ else:
+ return 1
+
+ res = self.closeEditor(editor)
+ if res and editor == self.currentEditor:
+ self.currentEditor = None
+
+ return res
+
+ def handleExit(self):
+ """
+ Public method to handle the debugged program terminating.
+ """
+ if self.currentEditor is not None:
+ self.currentEditor.highlight()
+ self.currentEditor = None
+
+ self.setSbFile()
+
+ def handlePythonFile(self,pyfn,lineno=None):
+ """
+ Public method to handle the user selecting a file for display.
+
+ @param pyfn name of file to be opened
+ @param lineno line number to place the cursor at
+ """
+ try:
+ self.displayPythonFile(pyfn,lineno)
+ except IOError:
+ pass
+
+
+ def displayJDC(self,jdc):
+ """
+ Public slot to display a file in an editor.
+
+ @param fn name of file to be opened
+ @param lineno line number to place the cursor at
+ """
+ newWin, editor = self.getEditor(None, jdc)
+
+ if newWin:
+ self.handleModificationStatusChanged(editor.modified, editor)
+ self.checkActions(editor)
+
+ # insert filename into list of recently opened files
+ self.addToRecentList(editor.getFileName())
+
+
+
+ def newEditorView(self, fn, caller):
+ """
+ Public method to create a new editor displaying the given document.
+
+ @param fn filename of this view
+ @param caller reference to the editor calling this method
+ """
+ from editor import JDCEditor
+ print 50*'='
+ print 'newEditorView fn->',fn
+ print 'newEditorView caller.jdc->',caller.jdc
+ print 50*'+'
+ editor = JDCEditor(fn, None, self, editor=caller)
+ self.editors.append(editor)
+ self.connect(editor, PYSIGNAL('modificationStatusChanged'),
+ self.handleModificationStatusChanged)
+ self.connect(editor, PYSIGNAL('cursorChanged'), self.handleCursorChanged)
+ self.connect(editor, PYSIGNAL('editorSaved'), self.handleEditorSaved)
+ self.connect(editor, PYSIGNAL('breakpointToggled'), self.handleBreakpointToggled)
+ self.connect(editor, PYSIGNAL('bookmarkToggled'), self.handleBookmarkToggled)
+ self.connect(editor, PYSIGNAL('syntaxerrorToggled'), self.handleSyntaxErrorToggled)
+ self.connect(editor, PYSIGNAL('autoCompletionAPIsAvailable'),
+ self.handleEditoracAPIsAvailable)
+ self.handleEditorOpened()
+ self.emit(PYSIGNAL('editorOpened'), (fn,))
+
+ self.connect(caller, PYSIGNAL('editorRenamed'), editor.handleRenamed)
+ self.connect(editor, PYSIGNAL('editorRenamed'), caller.handleRenamed)
+
+ self.addView(editor, fn)
+ self.handleModificationStatusChanged(editor.modified, editor)
+ self.checkActions(editor)
+
+ def addToRecentList(self, fn):
+ """
+ Public slot to add a filename to the list of recently opened files.
+
+ @param fn name of the file to be added
+ """
+ self.recent.remove(fn)
+ self.recent.prepend(fn)
+ if len(self.recent) > 9:
+ self.recent = self.recent[:9]
+
+ def toggleWindow(self,w):
+ """
+ Private method to toggle a workspace window.
+
+ @param w editor window to be toggled
+ """
+ if w.isHidden():
+ w.show()
+ else:
+ w.hide()
+
+ def setFileLine(self,fn,line,error=0,syntaxError=0):
+ """
+ Public method to update the user interface when the current program or line changes.
+
+ @param fn filename of editor to update (string)
+ @param line line number to highlight (int)
+ @param error flag indicating an error highlight (boolean)
+ @param syntaxError flag indicating a syntax error
+ """
+ self.setSbFile(fn,line)
+
+ try:
+ newWin, self.currentEditor = self.getEditor(fn)
+ except IOError:
+ return
+
+ # Change the highlighted line.
+ self.currentEditor.highlight(line,error,syntaxError)
+
+ self.currentEditor.highlightVisible()
+ self.checkActions(self.currentEditor, 0)
+
+ def setSbFile(self,fn=None,line=None,pos=None):
+ """
+ Private method to set the file info in the status bar.
+
+ @param fn filename to display (string)
+ @param line line number to display (int)
+ @param pos character position to display (int)
+ """
+ if fn is None:
+ fn = ''
+ writ = ' '
+ else:
+ if QFileInfo(fn).isWritable():
+ writ = ' rw'
+ else:
+ writ = ' ro'
+
+ self.sbWritable.setText(writ)
+ self.sbFile.setText(self.trUtf8('File: %1').arg(fn,-50))
+
+ if line is None:
+ line = ''
+
+ self.sbLine.setText(self.trUtf8('Line: %1').arg(line,5))
+
+ if pos is None:
+ pos = ''
+
+ self.sbPos.setText(self.trUtf8('Pos: %1').arg(pos, 5))
+
+ def unhighlight(self, current=0):
+ """
+ Public method to switch off all highlights.
+
+ @param current flag indicating only the current editor should be unhighlighted
+ (boolean)
+ """
+ if current:
+ if self.currentEditor is not None:
+ self.currentEditor.highlight()
+ else:
+ for editor in self.editors:
+ editor.highlight()
+
+ def getOpenFilenames(self):
+ """
+ Public method returning a list of the filenames of all editors.
+
+ @return list of all opened filenames (list of strings)
+ """
+ filenames = []
+ for editor in self.editors:
+ fn = editor.getFileName()
+ if fn is not None:
+ filenames.append(fn)
+
+ return filenames
+
+ def getEditor(self, fn, jdc = None):
+ """
+ Private method to return the editor displaying the given file.
+
+ If there is no editor with the given file, a new editor window is
+ created.
+
+ @param fn filename to look for
+ @param isPythonFile flag indicating that this is a Python file
+ even if it doesn't have the .py extension (boolean)
+ @return tuple of two values giving a flag indicating a new window creation and
+ a reference to the editor displaying this file
+ """
+ newWin = 0
+ for editor in self.editors:
+ if samepath(fn, editor.getFileName()):
+ break
+ else:
+ from editor import JDCEditor
+ editor = JDCEditor(fn, jdc, self)
+
+ print 'GETEDITOR editor.jdc->', editor.jdc
+ if editor.jdc: # le fichier est bien un jdc
+ self.editors.append(editor)
+ self.connect(editor, PYSIGNAL('modificationStatusChanged'),
+ self.handleModificationStatusChanged)
+ self.connect(editor, PYSIGNAL('cursorChanged'), self.handleCursorChanged)
+ self.connect(editor, PYSIGNAL('editorSaved'), self.handleEditorSaved)
+ self.connect(editor, PYSIGNAL('breakpointToggled'), self.handleBreakpointToggled)
+ self.connect(editor, PYSIGNAL('bookmarkToggled'), self.handleBookmarkToggled)
+ self.connect(editor, PYSIGNAL('syntaxerrorToggled'), self.handleSyntaxErrorToggled)
+ self.connect(editor, PYSIGNAL('autoCompletionAPIsAvailable'),
+ self.handleEditoracAPIsAvailable)
+ self.handleEditorOpened()
+ self.emit(PYSIGNAL('editorOpened'), (fn,))
+ newWin = 1
+ else:
+ editor.closeIt()
+
+ if newWin:
+ print 'GETEDITOR addView'
+ self.addView(editor, fn)
+ elif editor.jdc:
+ print 'GETEDITOR showView'
+ self.showView(editor, fn)
+
+ return (newWin, editor)
+
+
+ def getOpenEditor(self, fn):
+ """
+ Public method to return the editor displaying the given file.
+
+ @param fn filename to look for
+ @return a reference to the editor displaying this file or None, if
+ no editor was found
+ """
+ for editor in self.editors:
+ if samepath(fn, editor.getFileName()):
+ return editor
+
+ return None
+
+ def getActiveName(self):
+ """
+ Public method to retrieve the filename of the active window.
+
+ @return filename of active window (string)
+ """
+ aw = self.activeWindow()
+ if aw:
+ return aw.getFileName()
+ else:
+ return None
+
+ def saveEditor(self, fn):
+ """
+ Public method to save a named editor file.
+
+ @param fn filename of editor to be saved (string)
+ @return flag indicating success (boolean)
+ """
+ for editor in self.editors:
+ if samepath(fn, editor.getFileName()):
+ break
+ else:
+ return 1
+
+ if not editor.modified:
+ return 1
+ else:
+ ok, dummy = editor.saveFile()
+ return ok
+
+ def saveCurrentEditor(self):
+ """
+ Public slot to save the contents of the current editor.
+ """
+ aw = self.activeWindow()
+ if aw:
+ ok, newName = aw.saveFile()
+ if ok:
+ self.setEditorName(aw, newName)
+ else:
+ return
+
+ def saveAsCurrentEditor(self):
+ """
+ Public slot to save the contents of the current editor to a new file.
+ """
+ aw = self.activeWindow()
+ if aw:
+ ok, newName = aw.saveFileAs()
+ if ok:
+ self.setEditorName(aw, newName)
+ else:
+ return
+
+ def saveAllEditors(self):
+ """
+ Public slot to save the contents of all editors.
+ """
+ for editor in self.editors:
+ ok, newName = editor.saveFile()
+ if ok:
+ self.setEditorName(editor, newName)
+
+ # restart autosave timer
+ if self.autosaveInterval > 0:
+ self.autosaveTimer.start(self.autosaveInterval * 60000, 1)
+
+ def saveCurrentEditorToProject(self):
+ """
+ Public slot to save the contents of the current editor to the current project.
+ """
+ pro = self.ui.getProject()
+ path = pro.ppath
+ aw = self.activeWindow()
+ if aw:
+ ok, newName = aw.saveFileAs(path)
+ if ok:
+ self.setEditorName(aw, newName)
+ pro.appendFile(newName)
+ else:
+ return
+
+ def newEditor(self):
+ """
+ Public slot to generate a new empty editor.
+ """
+ from editor import JDCEditor
+ editor = JDCEditor(None,None,self)
+
+ self.editors.append(editor)
+ self.connect(editor, PYSIGNAL('modificationStatusChanged'),
+ self.handleModificationStatusChanged)
+ self.connect(editor, PYSIGNAL('cursorChanged'), self.handleCursorChanged)
+ self.connect(editor, PYSIGNAL('editorSaved'), self.handleEditorSaved)
+ self.connect(editor, PYSIGNAL('breakpointToggled'), self.handleBreakpointToggled)
+ self.connect(editor, PYSIGNAL('bookmarkToggled'), self.handleBookmarkToggled)
+ self.connect(editor, PYSIGNAL('syntaxerrorToggled'), self.handleSyntaxErrorToggled)
+ self.connect(editor, PYSIGNAL('autoCompletionAPIsAvailable'),
+ self.handleEditoracAPIsAvailable)
+ self.addView(editor, None)
+ self.handleEditorOpened()
+ self.checkActions(editor)
+ self.emit(PYSIGNAL('editorOpened'), (None,))
+
+ def printCurrentEditor(self):
+ """
+ Public slot to print the contents of the current editor.
+ """
+ aw = self.activeWindow()
+ if aw:
+ aw.printFile()
+ else:
+ return
+
+ def printCurrentEditorSel(self):
+ """
+ Public slot to print the selection of the current editor.
+ """
+ aw = self.activeWindow()
+ if aw:
+ aw.printSelection()
+ else:
+ return
+
+## def handleShowRecentMenu(self):
+## """
+## Private method to set up recent files menu.
+## """
+## idx = 0
+## self.recentMenu.clear()
+##
+## for rp in self.recent:
+## id = self.recentMenu.insertItem('&%d. %s' % (idx+1, unicode(rp)),
+## self.handleOpenRecent)
+## self.recentMenu.setItemParameter(id,idx)
+##
+## idx = idx + 1
+##
+## self.recentMenu.insertSeparator()
+## self.recentMenu.insertItem(self.trUtf8('&Clear'), self.handleClearRecent)
+##
+## def handleOpenRecent(self, idx):
+## """
+## Private method to open a file from the list of rencently opened files.
+##
+## @param idx index of the selected entry (int)
+## """
+## self.handlePythonFile(unicode(self.recent[idx]))
+##
+## def handleClearRecent(self):
+## """
+## Private method to clear the recent files menu.
+## """
+## self.recent = QStringList()
+
+
+ def handleViewJdcFichierSource(self):
+ self.activeWindow().viewJdcSource()
+
+ def handleViewJdcRapport(self):
+ self.activeWindow().viewJdcRapport()
+
+ def handleNewProject(self):
+ """
+ Public slot to handle the NewProject signal.
+ """
+ self.saveToProjectAct.setEnabled(1)
+
+ def handleProjectOpened(self):
+ """
+ Public slot to handle the projectOpened signal.
+ """
+ self.saveToProjectAct.setEnabled(1)
+
+ def handleProjectClosed(self):
+ """
+ Public slot to handle the projectClosed signal.
+ """
+ self.saveToProjectAct.setEnabled(0)
+
+ def handleProjectFileRenamed(self, oldfn, newfn):
+ """
+ Public slot to handle the projectFileRenamed signal.
+
+ @param oldfn old filename of the file (string)
+ @param newfn new filename of the file (string)
+ """
+ editor = self.getOpenEditor(oldfn)
+ if editor:
+ editor.fileRenamed(newfn)
+
+ def enableEditorsCheckFocusIn(self, enabled):
+ """
+ Public method to set a flag enabling the editors to perform focus in checks.
+
+ @param enabled flag indicating focus in checks should be performed (boolean)
+ """
+ self.editorsCheckFocusIn = enabled
+
+ def editorsCheckFocusInEnabled(self):
+ """
+ Public method returning the flag indicating editors should perform focus in checks.
+
+ @return flag indicating focus in checks should be performed (boolean)
+ """
+ return self.editorsCheckFocusIn
+
+ def handleFindFileName(self):
+ """
+ Private method to handle the search for file action.
+ """
+ self.ui.findFileNameDialog.show()
+ self.ui.findFileNameDialog.raiseW()
+ self.ui.findFileNameDialog.setActiveWindow()
+
+ ##################################################################
+ ## Below are the action methods for the edit menu
+ ##################################################################
+
+ def handleEditUndo(self):
+ """
+ Private method to handle the undo action.
+ """
+ self.activeWindow().undo()
+
+ def handleEditRedo(self):
+ """
+ Private method to handle the redo action.
+ """
+ self.activeWindow().redo()
+
+ def handleEditRevert(self):
+ """
+ Private method to handle the revert action.
+ """
+ self.activeWindow().revertToUnmodified()
+
+ def handleEditCut(self):
+ """
+ Private method to handle the cut action.
+ """
+ self.activeWindow().cut()
+
+ def handleEditCopy(self):
+ """
+ Private method to handle the copy action.
+ """
+ self.activeWindow().copy()
+
+ def handleEditPaste(self):
+ """
+ Private method to handle the paste action.
+ """
+ self.activeWindow().paste()
+
+ def handleEditDelete(self):
+ """
+ Private method to handle the delete action.
+ """
+ self.activeWindow().clear()
+
+ def handleEditIndent(self):
+ """
+ Private method to handle the indent action.
+ """
+ self.activeWindow().indentLineOrSelection()
+
+ def handleEditUnindent(self):
+ """
+ Private method to handle the unindent action.
+ """
+ self.activeWindow().unindentLineOrSelection()
+
+ def handleEditComment(self):
+ """
+ Private method to handle the comment action.
+ """
+ self.activeWindow().commentLineOrSelection()
+
+ def handleEditUncomment(self):
+ """
+ Private method to handle the uncomment action.
+ """
+ self.activeWindow().uncommentLineOrSelection()
+
+ def handleEditStreamComment(self):
+ """
+ Private method to handle the stream comment action.
+ """
+ self.activeWindow().streamCommentLineOrSelection()
+
+ def handleEditBoxComment(self):
+ """
+ Private method to handle the box comment action.
+ """
+ self.activeWindow().boxCommentLineOrSelection()
+
+ def handleEditSelectBrace(self):
+ """
+ Private method to handle the select to brace action.
+ """
+ self.activeWindow().selectToMatchingBrace()
+
+ def handleEditSelectAll(self):
+ """
+ Private method to handle the select all action.
+ """
+ self.activeWindow().selectAll(1)
+
+ def handleEditDeselectAll(self):
+ """
+ Private method to handle the select all action.
+ """
+ self.activeWindow().selectAll(0)
+
+ def handleConvertEOL(self):
+ """
+ Private method to handle the convert line end characters action.
+ """
+ aw = self.activeWindow()
+ aw.convertEols(aw.eolMode())
+
+ def handleShortenEmptyLines(self):
+ """
+ Private method to handle the shorten empty lines action.
+ """
+ self.activeWindow().handleShortenEmptyLines()
+
+ def handleEditAutoComplete(self):
+ """
+ Private method to handle the autocomplete action.
+ """
+ aw = self.activeWindow()
+ aw.autoComplete()
+
+ def handleEditAutoCompleteFromDoc(self):
+ """
+ Private method to handle the autocomplete from document action.
+ """
+ aw = self.activeWindow()
+ aw.autoCompleteFromDocument()
+
+ def handleEditAutoCompleteFromAPIs(self):
+ """
+ Private method to handle the autocomplete from APIs action.
+ """
+ aw = self.activeWindow()
+ aw.autoCompleteFromAPIs()
+
+ def handleEditoracAPIsAvailable(self, available):
+ """
+ Private method to handle the availability of API autocompletion signal.
+ """
+ self.autoCompleteFromAPIsAct.setEnabled(available)
+
+ ##################################################################
+ ## Below are the action and utility methods for the search menu
+ ##################################################################
+
+ def getWord(self, text, index):
+ """
+ Private method to get the word at a position.
+
+ @param text text to look at (string or QString)
+ @param index position to look at (int)
+ @return the word at that position
+ """
+ re = QRegExp('[^\w_]')
+ start = text.findRev(re, index) + 1
+ end = text.find(re, index)
+ if end > start:
+ word = text.mid(start, end-start)
+ else:
+ word = QString('')
+ return word
+
+ def textForFind(self):
+ """
+ Private method to determine the selection or the current word for the next find operation.
+
+ @return selection or current word (QString)
+ """
+ aw = self.activeWindow()
+ if aw is None:
+ return ''
+
+ if aw.hasSelectedText():
+ text = aw.selectedText()
+ if text.contains('\r') or text.contains('\n'):
+ # the selection contains at least a newline, it is
+ # unlikely to be the expression to search for
+ return ''
+
+ return text
+
+ # no selected text, determine the word at the current position
+ line, index = aw.getCursorPosition()
+ return self.getWord(aw.text(line), index)
+
+ def getSRHistory(self, key):
+ """
+ Private method to get the search or replace history list.
+
+ @param key list to return (must be 'search' or 'replace')
+ @return the requested history list (QStringList)
+ """
+ return self.srHistory[key]
+
+ def handleSearch(self):
+ """
+ Private method to handle the search action.
+ """
+ self.searchDlg.showFind(self.textForFind())
+
+ def handleReplace(self):
+ """
+ Private method to handle the replace action.
+ """
+ self.replaceDlg.showReplace(self.textForFind())
+
+ def handleGoto(self):
+ """
+ Private method to handle the goto action.
+ """
+ aw = self.activeWindow()
+ dlg = GotoDialog(self.ui, None, 1)
+ dlg.selectAll()
+ if dlg.exec_loop() == QDialog.Accepted:
+ aw.gotoLine(min(dlg.getLinenumber(), aw.lines()))
+
+ def handleGotoBrace(self):
+ """
+ Private method to handle the goto brace action.
+ """
+ self.activeWindow().moveToMatchingBrace()
+
+ def handleSearchFiles(self):
+ """
+ Private method to handle the search in files action.
+ """
+ self.ui.findFilesDialog.show(self.textForFind())
+ self.ui.findFilesDialog.raiseW()
+ self.ui.findFilesDialog.setActiveWindow()
+
+ ##################################################################
+ ## Below are the action methods for the view menu
+ ##################################################################
+
+ def handleZoomIn(self):
+ """
+ Private method to handle the zoom in action.
+ """
+ self.activeWindow().zoomIn()
+
+ def handleZoomOut(self):
+ """
+ Private method to handle the zoom out action.
+ """
+ self.activeWindow().zoomOut()
+
+ def handleZoom(self):
+ """
+ Private method to handle the zoom action.
+ """
+ aw = self.activeWindow()
+ dlg = ZoomDialog(aw.getZoom(), self.ui, None, 1)
+ if dlg.exec_loop() == QDialog.Accepted:
+ aw.zoomTo(dlg.getZoomSize())
+
+ def handleToggleAll(self):
+ """
+ Private method to handle the toggle all folds action.
+ """
+ self.activeWindow().foldAll()
+
+ def handleToggleCurrent(self):
+ """
+ Private method to handle the toggle current fold action.
+ """
+ aw = self.activeWindow()
+ line, index = aw.getCursorPosition()
+ aw.foldLine(line)
+
+ def handleSplitView(self):
+ """
+ Private method to handle the split view action.
+ """
+ self.addSplit()
+
+ def handleSplitOrientation(self):
+ """
+ Private method to handle the split orientation action.
+ """
+ if self.splitOrientationAct.isOn():
+ self.setSplitOrientation(QSplitter.Horizontal)
+ self.splitViewAct.setIconSet(\
+ QIconSet(utilIcons.getPixmap("splitHorizontal.png")))
+ self.splitRemoveAct.setIconSet(\
+ QIconSet(utilIcons.getPixmap("remsplitHorizontal.png")))
+ else:
+ self.setSplitOrientation(QSplitter.Vertical)
+ self.splitViewAct.setIconSet(\
+ QIconSet(utilIcons.getPixmap("splitVertical.png")))
+ self.splitRemoveAct.setIconSet(\
+ QIconSet(utilIcons.getPixmap("remsplitVertical.png")))
+
+ ##################################################################
+ ## Below are the action methods for the macro menu
+ ##################################################################
+
+ def handleMacroStartRecording(self):
+ """
+ Private method to handle the start macro recording action.
+ """
+ self.activeWindow().handleStartMacroRecording()
+
+ def handleMacroStopRecording(self):
+ """
+ Private method to handle the stop macro recording action.
+ """
+ self.activeWindow().handleStopMacroRecording()
+
+ def handleMacroRun(self):
+ """
+ Private method to handle the run macro action.
+ """
+ self.activeWindow().handleRunMacro()
+
+ def handleMacroDelete(self):
+ """
+ Private method to handle the delete macro action.
+ """
+ self.activeWindow().handleDeleteMacro()
+
+ def handleMacroLoad(self):
+ """
+ Private method to handle the load macro action.
+ """
+ self.activeWindow().handleLoadMacro()
+
+ def handleMacroSave(self):
+ """
+ Private method to handle the save macro action.
+ """
+ self.activeWindow().handleSaveMacro()
+
+ ##################################################################
+ ## Below are the action methods for the bookmarks menu
+ ##################################################################
+
+ def handleToggleBookmark(self):
+ """
+ Private method to handle the toggle bookmark action.
+ """
+ self.activeWindow().handleToggleBookmark()
+
+ def handleNextBookmark(self):
+ """
+ Private method to handle the next bookmark action.
+ """
+ self.activeWindow().handleNextBookmark()
+
+ def handlePreviousBookmark(self):
+ """
+ Private method to handle the previous bookmark action.
+ """
+ self.activeWindow().handlePreviousBookmark()
+
+ def handleClearAllBookmarks(self):
+ """
+ Private method to handle the clear all bookmarks action.
+ """
+ for editor in self.editors:
+ editor.handleClearBookmarks()
+
+ self.bookmarkNextAct.setEnabled(0)
+ self.bookmarkPreviousAct.setEnabled(0)
+ self.bookmarkClearAct.setEnabled(0)
+
+ def handleShowBookmarksMenu(self):
+ """
+ Private method to handle the show bookmarks menu signal.
+ """
+ self.bookmarks = {}
+ self.bookmarksMenu.clear()
+
+ filenames = self.getOpenFilenames()
+ filenames.sort()
+ for filename in filenames:
+ editor = self.getOpenEditor(filename)
+ for bookmark in editor.getBookmarks():
+ if len(filename) > 50:
+ dots = "..."
+ else:
+ dots = ""
+ id = self.bookmarksMenu.insertItem(\
+ "%s%s : %d" % (dots, filename[-50:], bookmark))
+ self.bookmarks[id] = (filename, bookmark)
+
+ def handleBookmarkSelected(self, id):
+ """
+ Private method to handle the bookmark selected signal.
+
+ @param id index of the selected menu entry
+ This acts as an index into the list of bookmarks
+ that was created, when the bookmarks menu was built.
+ """
+ self.displayPythonFile(self.bookmarks[id][0], self.bookmarks[id][1])
+
+ def handleBookmarkToggled(self, editor):
+ """
+ Private slot to handle the bookmarkToggled signal.
+
+ It checks some bookmark actions and reemits the signal.
+
+ @param editor editor that sent the signal
+ """
+ if editor.hasBookmarks():
+ self.bookmarkNextAct.setEnabled(1)
+ self.bookmarkPreviousAct.setEnabled(1)
+ self.bookmarkClearAct.setEnabled(1)
+ else:
+ self.bookmarkNextAct.setEnabled(0)
+ self.bookmarkPreviousAct.setEnabled(0)
+ self.bookmarkClearAct.setEnabled(0)
+ self.emit(PYSIGNAL('bookmarkToggled'), (editor,))
+
+ def handleGotoSyntaxError(self):
+ """
+ Private method to handle the goto syntax error action.
+ """
+ self.activeWindow().handleGotoSyntaxError()
+
+ def handleClearAllSyntaxErrors(self):
+ """
+ Private method to handle the clear all syntax errors action.
+ """
+ for editor in self.editors:
+ editor.handleClearSyntaxError()
+
+ def handleSyntaxErrorToggled(self, editor):
+ """
+ Private slot to handle the syntaxerrorToggled signal.
+
+ It checks some syntax error actions and reemits the signal.
+
+ @param editor editor that sent the signal
+ """
+ if editor.hasSyntaxErrors():
+ self.syntaxErrorGotoAct.setEnabled(1)
+ self.syntaxErrorClearAct.setEnabled(1)
+ else:
+ self.syntaxErrorGotoAct.setEnabled(0)
+ self.syntaxErrorClearAct.setEnabled(0)
+ self.emit(PYSIGNAL('syntaxerrorToggled'), (editor,))
+
+ ##################################################################
+ ## Below are general utility methods
+ ##################################################################
+
+ def handleResetUI(self):
+ """
+ Public slot to handle the resetUI signal.
+ """
+ editor = self.activeWindow()
+ if editor is None:
+ self.setSbFile()
+ else:
+ line, pos = editor.getCursorPosition()
+ self.setSbFile(editor.getFileName(), line+1, pos)
+
+ def closeViewManager(self):
+ """
+ Public method to shutdown the viewmanager.
+
+ If it cannot close all editor windows, it aborts the shutdown process.
+
+ @return flag indicating success (boolean)
+ """
+ self.handleCloseAll()
+ if len(self.editors):
+ return 0
+ else:
+ return 1
+
+ def handleLastEditorClosed(self):
+ """
+ Private slot to handle the lastEditorClosed signal.
+ """
+ self.SauveRecents()
+
+
+ def handleEditorOpened(self):
+ """
+ Private slot to handle the editorOpened signal.
+ """
+ self.closeActGrp.setEnabled(1)
+ self.saveActGrp.setEnabled(1)
+ self.printAct.setEnabled(1)
+ self.printSelAct.setEnabled(1)
+ self.editActGrp.setEnabled(1)
+ self.searchActGrp.setEnabled(1)
+ self.viewActGrp.setEnabled(1)
+ self.viewFoldActGrp.setEnabled(1)
+ self.unhighlightAct.setEnabled(1)
+ self.splitViewAct.setEnabled(1)
+ self.splitOrientationAct.setEnabled(1)
+ self.macroActGrp.setEnabled(1)
+ self.bookmarkActGrp.setEnabled(1)
+
+ # activate the autosave timer
+ if not self.autosaveTimer.isActive() and \
+ self.autosaveInterval > 0:
+ self.autosaveTimer.start(self.autosaveInterval * 60000, 1)
+
+
+ def checkActions(self, editor, setSb=1):
+ """
+ Private slot to check some actions for their enable/disable status and set the statusbar info.
+
+ @param editor editor window
+ @param setSb flag indicating an update of the status bar is wanted (boolean)
+ """
+ if editor is not None:
+ self.saveAct.setEnabled(editor.modified)
+ self.revertAct.setEnabled(editor.modified)
+
+ lex = editor.getLexer()
+ if lex is not None:
+ self.commentAct.setEnabled(lex.canBlockComment())
+ self.uncommentAct.setEnabled(lex.canBlockComment())
+ self.streamCommentAct.setEnabled(lex.canStreamComment())
+ self.boxCommentAct.setEnabled(lex.canBoxComment())
+ else:
+ self.commentAct.setEnabled(0)
+ self.uncommentAct.setEnabled(0)
+ self.streamCommentAct.setEnabled(0)
+ self.boxCommentAct.setEnabled(0)
+
+ if editor.hasBookmarks():
+ self.bookmarkNextAct.setEnabled(1)
+ self.bookmarkPreviousAct.setEnabled(1)
+ self.bookmarkClearAct.setEnabled(1)
+ else:
+ self.bookmarkNextAct.setEnabled(0)
+ self.bookmarkPreviousAct.setEnabled(0)
+ self.bookmarkClearAct.setEnabled(0)
+
+ if editor.hasSyntaxErrors():
+ self.syntaxErrorGotoAct.setEnabled(1)
+ self.syntaxErrorClearAct.setEnabled(1)
+ else:
+ self.syntaxErrorGotoAct.setEnabled(0)
+ self.syntaxErrorClearAct.setEnabled(0)
+
+ if editor.canAutoCompleteFromAPIs():
+ self.autoCompleteFromAPIsAct.setEnabled(1)
+ else:
+ self.autoCompleteFromAPIsAct.setEnabled(0)
+
+ if setSb:
+ line, pos = editor.getCursorPosition()
+ self.setSbFile(editor.getFileName(), line+1, pos)
+
+ self.emit(PYSIGNAL('checkActions'), (editor,))
+
+ def handlePreferencesChanged(self):
+ """
+ Public slot to handle the preferencesChanged signal.
+
+ This method performs the following actions
+ <ul>
+ <li>reread the colours for the syntax highlighting</li>
+ <li>reloads the already created API objetcs</li>
+ <li>starts or stops the autosave timer</li>
+ <li><b>Note</b>: changes in viewmanager type are activated
+ on an application restart.</li>
+ </ul>
+ """
+ # reload api information
+ for language, api in self.apis.items():
+ if api is not None:
+ apifiles = Preferences.getEditorAPI(language)
+ if len(apifiles):
+ api.clear()
+ for apifile in apifiles:
+ api.load(apifile)
+ else:
+ self.apis[language] = None
+
+ # reload editor settings
+ for editor in self.editors:
+ editor.readSettings()
+
+ # reload the autosave timer setting
+ self.autosaveInterval = Preferences.getEditor("AutosaveInterval")
+ if len(self.editors):
+ if self.autosaveTimer.isActive() and \
+ self.autosaveInterval == 0:
+ self.autosaveTimer.stop()
+ elif not self.autosaveTimer.isActive() and \
+ self.autosaveInterval > 0:
+ self.autosaveTimer.start(self.autosaveInterval * 60000, 1)
+
+ def handleEditorSaved(self, fn):
+ """
+ Public slot to handle the editorSaved signal.
+
+ It simply reemits the signal.
+
+ @param fn filename of the saved editor
+ """
+ self.emit(PYSIGNAL('editorSaved'), (fn,))
+
+ def handleCursorChanged(self, fn, line, pos):
+ """
+ Private slot to handle the cursorChanged signal.
+
+ It emits the signal cursorChanged with parameter editor.
+
+ @param fn filename (string)
+ @param line line number of the cursor (int)
+ @param pos position in line of the cursor (int)
+ """
+ self.setSbFile(fn, line, pos)
+ self.emit(PYSIGNAL('cursorChanged'), (self.getOpenEditor(fn),))
+
+ def handleBreakpointToggled(self, editor):
+ """
+ Private slot to handle the breakpointToggled signal.
+
+ It simply reemits the signal.
+
+ @param editor editor that sent the signal
+ """
+ self.emit(PYSIGNAL('breakpointToggled'), (editor,))
+
+
+ def getProject(self):
+ """
+ Public method to get a reference to the Project object.
+
+ @return Reference to the Project object (Project.Project)
+ """
+ return self.ui.getProject()
+
+ def getActions(self, type):
+ """
+ Public method to get a list of all actions.
+
+ @param type string denoting the action set to get.
+ It must be one of "edit", "file", "search",
+ "view" or "window"
+ @return list of all actions (list of QAction)
+ """
+ try:
+ exec 'actionList = self.%sActions[:]' % type
+ except:
+ actionList = []
+
+ return actionList
+
+ def editorCommand(self, cmd):
+ """
+ Private method to send an editor command to the active window.
+
+ @param cmd the scintilla command to be sent
+ """
+ aw = self.activeWindow()
+ if aw:
+ aw.SendScintilla(cmd)
+
+ ##################################################################
+ ## Below are protected utility methods
+ ##################################################################
+
+ def _getOpenStartDir(self):
+ """
+ Protected method to return the starting directory for a file open dialog.
+
+ The appropriate starting directory is calculated
+ using the following search order, until a match is found:<br />
+ 1: Directory of currently active editor<br />
+ 2: Directory of currently active Project<br />
+ 3: CWD
+
+ @return String name of directory to start or None
+ """
+ # if we have an active source, return its path
+ if self.activeWindow() is not None and \
+ self.activeWindow().getFileName():
+ return os.path.dirname(self.activeWindow().getFileName())
+
+ # ok, try if there is an active project and return its path
+ elif self.getProject().isOpen():
+ return self.getProject().ppath
+
+ else:
+ # None will cause open dialog to start with cwd
+ return None
+
+
+ def _getOpenFileFilter(self):
+ """
+ Protected method to return the active filename filter for a file open dialog.
+
+ The appropriate filename filter is determined by file extension of
+ the currently active editor.
+
+ @return name of the filename filter (QString) or None
+ """
+ if self.activeWindow() is not None and \
+ self.activeWindow().getFileName():
+ ext = os.path.splitext(self.activeWindow().getFileName())[1]
+ try:
+ return QString(self.ext2Filter[ext])
+ except KeyError:
+ return None
+
+ else:
+ return None
+
+
+
+
+"""
+Module implementing a tabbed viewmanager class.
+"""
+
+
+
+class TabWidget(QTabWidget):
+ """
+ Class implementing a custimized TabWidget.
+ """
+ def __init__(self, parent):
+ """
+ Constructor
+
+ @param parent parent widget (QWidget)
+ """
+ QTabWidget.__init__(self, parent)
+
+ self.editors = []
+ self.curIndex = 0
+
+ self.connect(self, SIGNAL("currentChanged(QWidget *)"), self.handleCurrentChanged)
+
+ def handleCurrentChanged(self):
+ """
+ Private slot called by the currentChanged signal.
+ """
+ self.curIndex = self.currentPageIndex()
+
+ def addTab(self, editor, title):
+ """
+ Overwritten method to add a new tab.
+
+ @param editor the editor object to be added (QScintilla.Editor.Editor)
+ @param title title for the new tab (string, QString or QTab)
+ """
+ QTabWidget.addTab(self, editor, title)
+
+ if not editor in self.editors:
+ self.editors.append(editor)
+ self.connect(editor, PYSIGNAL('captionChanged'),
+ self.handleCaptionChange)
+
+ def showPage(self, editor):
+ """
+ Overridden method to show a tab.
+
+ @param editor the editor object to be shown (QScintilla.Editor.Editor)
+ """
+ QTabWidget.showPage(self, editor)
+ self.curIndex = self.indexOf(editor)
+
+ def nextTab(self):
+ """
+ Public slot used to show the next tab.
+ """
+ if self.count():
+ self.curIndex += 1
+ if self.curIndex == self.count():
+ self.curIndex = 0
+
+ QTabWidget.showPage(self, self.page(self.curIndex))
+
+ def prevTab(self):
+ """
+ Public slot used to show the previous tab.
+ """
+ if self.count():
+ self.curIndex -= 1
+ if self.curIndex == -1:
+ self.curIndex = self.count() - 1
+
+ QTabWidget.showPage(self, self.page(self.curIndex))
+
+ def handleCaptionChange(self, cap, editor):
+ """
+ Private method to handle Caption change signals from the editor.
+
+ Updates the listview text to reflect the new caption information.
+
+ @param cap Caption for the editor
+ @param editor Editor to update the caption for
+ """
+ fn = editor.getFileName()
+ if fn:
+ txt = os.path.basename(fn)
+ if editor.isReadOnly():
+ txt = '%s (ro)' % txt
+ self.changeTab(editor, txt)
+
+ def removePage(self, object):
+ """
+ Overwritten method to remove a page.
+
+ @param object object to be removed (QObject)
+ """
+ QTabWidget.removePage(self, object)
+
+ self.disconnect( object, PYSIGNAL('captionChanged'),
+ self.handleCaptionChange )
+ self.editors.remove(object)
+
+ def hasEditor(self, editor):
+ """
+ Public method to check for an editor.
+
+ @param editor editor object to check for
+ @return flag indicating, whether the editor to be checked belongs
+ to the list of editors managed by this tab widget.
+ """
+ return editor in self.editors
+
+ def hasEditors(self):
+ """
+ Public method to test, if any editor is managed.
+
+ @return flag indicating editors are managed
+ """
+ return len(self.editors) and 1 or 0
+
+class Tabview(QSplitter, ViewManager):
+ """
+ Class implementing a tabbed viewmanager class embedded in a splitter.
+
+ @signal lastEditorClosed emitted after the last editor window was closed
+ @signal editorOpened emitted after an editor window was opened
+ @signal editorSaved emitted after an editor window was saved
+ """
+ def __init__(self,parent, ui):
+ """
+ Constructor
+
+ @param parent parent widget (QWidget)
+ @param ui reference to the main user interface
+ @param dbs reference to the debug server object
+ """
+ self.tabWidgets = []
+
+ QSplitter.__init__(self,parent)
+ ViewManager.__init__(self, ui)
+ tw = TabWidget(self)
+ self.tabWidgets.append(tw)
+ self.currentTabWidget = tw
+ self.connect(tw, SIGNAL('currentChanged(QWidget*)'),
+ self.handleCurrentChanged)
+ tw.installEventFilter(self)
+ tw.tabBar().installEventFilter(self)
+ self.setOrientation(QSplitter.Vertical)
+
+ def initViewActions(self):
+ """
+ Protected method defining the user interface actions for the view commands.
+ """
+ ViewManager.initViewActions(self)
+
+ self.nextTabAct = QAction(self.trUtf8('Show next tab'),
+ self.trUtf8('Show next tab'),
+ QKeySequence(self.trUtf8('Ctrl+Alt+Tab')), self)
+ self.connect(self.nextTabAct, SIGNAL('activated()'), self.nextTab)
+ self.viewActions.append(self.nextTabAct)
+
+ self.prevTabAct = QAction(self.trUtf8('Show previous tab'),
+ self.trUtf8('Show previous tab'),
+ QKeySequence(self.trUtf8('Shift+Ctrl+Alt+Tab')), self)
+ self.connect(self.prevTabAct, SIGNAL('activated()'), self.prevTab)
+ self.viewActions.append(self.prevTabAct)
+
+ def nextTab(self):
+ """
+ Private slot used to show the next tab of the current tabwidget.
+ """
+ self.currentTabWidget.nextTab()
+
+ def prevTab(self):
+ """
+ Private slot used to show the previous tab of the current tabwidget.
+ """
+ self.currentTabWidget.prevTab()
+
+ def canCascade(self):
+ """
+ Public method to signal if cascading of managed windows is available.
+
+ @return flag indicating cascading of windows is available
+ """
+ return 0
+
+ def canTile(self):
+ """
+ Public method to signal if tiling of managed windows is available.
+
+ @return flag indicating tiling of windows is available
+ """
+ return 0
+
+ def canSplit(self):
+ """
+ public method to signal if splitting of the view is available.
+
+ @return flag indicating splitting of the view is available.
+ """
+ return 1
+
+ def tile(self):
+ """
+ Public method to tile the managed windows.
+ """
+ pass
+
+ def cascade(self):
+ """
+ Public method to cascade the managed windows.
+ """
+ pass
+
+ def removeAllViews(self):
+ """
+ Private method to remove all views (i.e. windows)
+ """
+ for win in self.editors:
+ self.removeView(win)
+
+ def removeView(self, win):
+ """
+ Private method to remove a view (i.e. window)
+
+ @param win editor window to be removed
+ """
+ print 'removeView win', win
+ for tw in self.tabWidgets:
+ if tw.hasEditor(win):
+ tw.removePage(win)
+ break
+ win.closeIt()
+
+ print 'removeView A'
+ # if this was the last editor in this view, switch to the next, that
+ # still has open editors
+ print 'removeView B'
+ for i in range(self.tabWidgets.index(tw), -1, -1) + \
+ range(self.tabWidgets.index(tw) + 1, len(self.tabWidgets)):
+ print 'removeView C'
+ if self.tabWidgets[i].hasEditors():
+ self.currentTabWidget = self.tabWidgets[i]
+ self.activeWindow().setFocus()
+ print 'removeView D',self.activeWindow()
+ break
+
+ def addView(self, win, fn=None):
+ """
+ Private method to add a view (i.e. window)
+
+ @param win editor window to be added
+ @param fn filename of this editor
+ """
+ win.show()
+ if fn is None:
+ self.untitledCount += 1
+ self.currentTabWidget.addTab(win, self.trUtf8("Untitled %1").arg(self.untitledCount))
+ else:
+ txt = os.path.basename(fn)
+ if not QFileInfo(fn).isWritable():
+ txt = '%s (ro)' % txt
+ self.currentTabWidget.addTab(win, txt)
+ self.currentTabWidget.setTabToolTip(win, os.path.dirname(fn))
+ self.currentTabWidget.showPage(win)
+ win.setFocus()
+
+ def showView(self, win, fn=None):
+ """
+ Private method to show a view (i.e. window)
+
+ @param win editor window to be shown
+ @param fn filename of this editor
+ """
+ win.show()
+ for tw in self.tabWidgets:
+ if tw.hasEditor(win):
+ tw.showPage(win)
+ self.currentTabWidget = tw
+ break
+ win.setFocus()
+
+ def activeWindow(self):
+ """
+ Private method to return the active (i.e. current) window.
+
+ @return reference to the active editor
+ """
+ return self.currentTabWidget.currentPage()
+
+ def handleShowWindowMenu(self, windowMenu):
+ """
+ Private method to set up the viewmanager part of the Window menu.
+
+ @param windowMenu reference to the window menu
+ """
+ pass
+
+ def initWindowActions(self):
+ """
+ Define the user interface actions for window handling.
+ """
+ pass
+
+ def setEditorName(self, editor, newName):
+ """
+ Change the displayed name of the editor.
+
+ @param editor editor window to be changed
+ @param newName new name to be shown (string or QString)
+ """
+ self.currentTabWidget.changeTab(editor,
+ os.path.basename(unicode(newName)))
+ self.currentTabWidget.setTabToolTip(editor,
+ os.path.dirname(unicode(newName)))
+
+ def handleModificationStatusChanged(self, m, editor):
+ """
+ Private slot to handle the modificationStatusChanged signal.
+
+ @param m flag indicating the modification status (boolean)
+ @param editor editor window changed
+ """
+ print 50*'handleModificationStatusChanged'
+ for tw in self.tabWidgets:
+ if tw.hasEditor(editor):
+ break
+ if m:
+ tw.setTabIconSet(editor,
+ QIconSet(utilIcons.getPixmap("fileModified.png")))
+ elif editor.hasSyntaxErrors():
+ tw.setTabIconSet(editor,
+ QIconSet(utilIcons.getPixmap("syntaxError.png")))
+ else:
+ tw.setTabIconSet(editor,
+ QIconSet(utilIcons.getPixmap("empty.png")))
+ self.checkActions(editor)
+
+ def handleSyntaxErrorToggled(self, editor):
+ """
+ Private slot to handle the syntaxerrorToggled signal.
+
+ @param editor editor that sent the signal
+ """
+ for tw in self.tabWidgets:
+ if tw.hasEditor(editor):
+ break
+ if editor.hasSyntaxErrors():
+ tw.setTabIconSet(editor,
+ QIconSet(utilIcons.getPixmap("syntaxError.png")))
+ else:
+ tw.setTabIconSet(editor,
+ QIconSet(utilIcons.getPixmap("empty.png")))
+
+ ViewManager.handleSyntaxErrorToggled(self, editor)
+
+ def addSplit(self):
+ """
+ Public method used to split the current view.
+ """
+ tw = TabWidget(self)
+ tw.show()
+ self.tabWidgets.append(tw)
+ self.currentTabWidget = self.tabWidgets[-1]
+ self.connect(tw, SIGNAL('currentChanged(QWidget*)'),
+ self.handleCurrentChanged)
+ tw.installEventFilter(self)
+ tw.tabBar().installEventFilter(self)
+ self.setSizes([int(100/len(self.tabWidgets))] * len(self.tabWidgets))
+ self.splitRemoveAct.setEnabled(1)
+
+ def removeSplit(self):
+ """
+ Public method used to remove the current split view.
+
+ @return flag indicating successfull removal
+ """
+ if len(self.tabWidgets) > 1:
+ tw = self.currentTabWidget
+ res = 1
+ savedEditors = tw.editors[:]
+ for editor in savedEditors:
+ res &= self.closeEditor(editor)
+ if res:
+ i = self.tabWidgets.index(tw)
+ if i == len(self.tabWidgets)-1:
+ i -= 1
+ self.tabWidgets.remove(tw)
+ tw.close(1)
+ self.currentTabWidget = self.tabWidgets[i]
+ if len(self.tabWidgets) == 1:
+ self.splitRemoveAct.setEnabled(0)
+ return 1
+
+ return 0
+
+ def setSplitOrientation(self, orientation):
+ """
+ Public method used to set the orientation of the split view.
+
+ @param orientation orientation of the split
+ (QSplitter.Horizontal or QSplitter.Vertical)
+ """
+ self.setOrientation(orientation)
+
+ def handleCurrentChanged(self, editor):
+ """
+ Private slot to handle the currentChanged signal.
+
+ @param editor selected editor window
+ """
+ self.checkActions(editor)
+ editor.setFocus()
+
+ def eventFilter(self, watched, event):
+ """
+ Method called to filter the event queue.
+
+ @param watched the QObject being watched
+ @param event the event that occurred
+ @return always 0
+ """
+ if event.type() == QEvent.MouseButtonPress and \
+ not event.button() == Qt.RightButton:
+ if isinstance(watched, QTabWidget):
+ self.currentTabWidget = watched
+ elif isinstance(watched, QTabBar):
+ self.currentTabWidget = watched.parent()
+ elif isinstance(watched, QScintilla.Editor.Editor):
+ for tw in self.tabWidgets:
+ if tw.hasEditor(watched):
+ self.currentTabWidget = tw
+ break
+
+ aw = self.activeWindow()
+ if aw is not None:
+ self.checkActions(aw)
+ aw.setFocus()
+
+ return 0
+
+
+class MyTabview(Tabview):
+ """
+ Base class inherited by all specific viewmanager classes.
+
+ It defines the interface to be implemented by specific
+ viewmanager classes and all common methods.
+
+ @signal lastEditorClosed emitted after the last editor window was closed
+ @signal editorOpened(string) emitted after an editor window was opened
+ @signal editorSaved(string) emitted after an editor window was saved
+ @signal checkActions(editor) emitted when some actions should be checked
+ for their status
+ @signal cursorChanged(editor) emitted after the cursor position of the active
+ window has changed
+ @signal breakpointToggled(editor) emitted when a breakpoint is toggled.
+ @signal bookmarkToggled(editor) emitted when a bookmark is toggled.
+ """
+ def __init__(self, parent, ui):
+ Tabview.__init__(self, parent, ui)
+ self.appli=parent
+ self.initRecent()
+
+ def initRecent(self) :
+ rep=self.appli.CONFIGURATION.rep_user
+ monFichier=rep+"/listefichiers"
+ index=0
+ try :
+ f=open(monFichier)
+ while ( index < 9) :
+ ligne=f.readline()
+ if ligne != "" :
+ l=(ligne.split("\n"))[0]
+ self.recent.append(l)
+ index=index+1
+ except : pass
+
+ try : f.close()
+ except : pass
+
+ def SauveRecents(self) :
+ rep=self.appli.CONFIGURATION.rep_user
+ monFichier=rep+"/listefichiers"
+ try :
+ f=open(monFichier,'w')
+ if len(self.recent) == 0 : return
+ index=0
+ while ( index < len(self.recent)):
+ ligne=str(self.recent[index])+"\n"
+ f.write(ligne)
+ index=index+1
+ except :
+ pass
+ try :
+ f.close()
+ except :
+ pass
+
+
+ def checkActions(self, editor, setSb=1):
+ """
+ Private slot to check some actions for their enable/disable status and set the statusbar info.
+
+ @param editor editor window
+ @param setSb flag indicating an update of the status bar is wanted (boolean)
+ """
+ self.emit(PYSIGNAL('checkActions'), (editor,))
+
+
+ def addToRecentList(self, fn):
+ """
+ Public slot to add a filename to the list of recently opened files.
+
+ @param fn name of the file to be added
+ """
+ self.recent.remove(fn)
+ self.recent.prepend(fn)
+ if len(self.recent) > 9:
+ self.recent = self.recent[:9]
+
+ def handleOpen(self,fn=None,patron=0):
+ """
+ Public slot to open a Python JDC file.
+
+ @param prog name of file to be opened (string or QString)
+ patron booleen pour indiquer si le fichier doit etre
+ ajoute a la liste des fichiers ouverts recemment
+ """
+ # Get the file name if one wasn't specified.
+ if fn is None:
+
+ fn = QFileDialog.getOpenFileName(self._getOpenStartDir(),
+ self.trUtf8('JDC Files (*.comm);;''All Files (*)'), self.ui, None, None, None)
+
+ if fn.isNull():
+ return
+
+ fn = normabspath(unicode(fn))
+
+ newWin, editor = self.getEditor(fn)
+
+ if newWin:
+ self.handleModificationStatusChanged(editor.modified, editor)
+ self.checkActions(editor)
+
+ # insert filename into list of recently opened files
+ if patron == 0 : self.addToRecentList(fn)
+
+
+ ##################################################################
+ ## Below are protected utility methods
+ #################################################################
+
+ def _getOpenStartDir(self):
+ """
+ Protected method to return the starting directory for a file open dialog.
+
+ The appropriate starting directory is calculated
+ using the following search order, until a match is found:<br />
+ 1: Directory of currently active editor<br />
+ 2: Directory of currently active Project<br />
+ 3: CWD
+
+ @return String name of directory to start or None
+ """
+ # if we have an active source, return its path
+ if self.activeWindow() is not None and \
+ self.activeWindow().getFileName():
+ return os.path.dirname(self.activeWindow().getFileName())
+
+
+ else:
+ # None will cause open dialog to start with cwd
+ return None
+
+
+ def handleEditorOpened(self):
+ """
+ Private slot to handle the editorOpened signal.
+ """
+ pass
+
+ def handleModificationStatusChanged(self, m, editor):
+ """
+ Private slot to handle the modificationStatusChanged signal.
+
+ @param m flag indicating the modification status (boolean)
+ @param editor editor window changed
+ """
+ for tw in self.tabWidgets:
+ if tw.hasEditor(editor):
+ break
+ if m:
+ #tw.setTabIconSet(editor,
+ # QIconSet(utilIcons.getPixmap("fileModified.png")))
+ pass
+ elif editor.hasSyntaxErrors():
+ tw.setTabIconSet(editor,
+ QIconSet(utilIcons.getPixmap("syntaxError.png")))
+ else:
+ tw.setTabIconSet(editor,
+ QIconSet(utilIcons.getPixmap("empty.png")))
+ self.checkActions(editor)
+
+
+
+
+if __name__=='__main__':
+ import sys
+ from Aster import prefs
+ if hasattr(prefs,'encoding'):
+ # Hack pour changer le codage par defaut des strings
+ import sys
+ reload(sys)
+ sys.setdefaultencoding(prefs.encoding)
+ del sys.setdefaultencoding
+ # Fin hack
+
+ #CS_pbruno note: fait implicitement des trucs ces imports (grr)
+ #import styles
+ from Editeur import import_code
+ from Editeur import session
+
+ # Analyse des arguments de la ligne de commande
+ options=session.parse(sys.argv)
+ code=options.code
+ app = QApplication(sys.argv)
+
+ mw = MyTabview(None,None)
+ app.setMainWidget(mw)
+ app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+ mw.show()
+ mw.getEditor('azAster.comm')
+ mw.getEditor('azAster2.comm')
+ res = app.exec_loop()
+ sys.exit(res)
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'visualisation.ui'
+#
+# Created: mer fév 21 10:55:14 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class visual(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ if not name:
+ self.setName("visual")
+
+ f = QFont(self.font())
+ f.setPointSize(14)
+ self.setFont(f)
+
+
+ self.frame5 = QFrame(self,"frame5")
+ self.frame5.setGeometry(QRect(10,520,801,41))
+ self.frame5.setFrameShape(QFrame.StyledPanel)
+ self.frame5.setFrameShadow(QFrame.Raised)
+
+ self.pushBOK = QPushButton(self.frame5,"pushBOK")
+ self.pushBOK.setGeometry(QRect(120,8,121,25))
+
+ self.pushBSave = QPushButton(self.frame5,"pushBSave")
+ self.pushBSave.setGeometry(QRect(470,8,120,25))
+
+ self.textBrowser1 = QTextBrowser(self,"textBrowser1")
+ self.textBrowser1.setGeometry(QRect(10,10,810,500))
+
+ self.languageChange()
+
+ self.resize(QSize(830,582).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.pushBOK,SIGNAL("clicked()"),self.close)
+ self.connect(self.pushBSave,SIGNAL("clicked()"),self.Save)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("Visualisation du rapport de validation du jeu de commandes courant"))
+ self.pushBOK.setText(self.__tr("Fermer"))
+ self.pushBSave.setText(self.__tr("Sauver"))
+
+
+ def Save(self):
+ print "visual.Save(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("visual",s,c)
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 Tkinter,ScrolledText
+import os, sys, string, traceback
+import code
+
+sys.ps1 = ">>> "
+sys.ps2 = "... "
+
+class PythonInterpreter( code.InteractiveConsole):
+ def __init__( self, text, namespace = None):
+ code.InteractiveConsole.__init__( self, namespace)
+ self.text = text
+
+ def showtraceback( self):
+ start = self.text.pos + " - 1 lines"
+ code.InteractiveConsole.showtraceback( self)
+ end = self.text.pos
+ self.text.tag_add( "exception", start, end)
+
+class InterpWindow(Tkinter.Toplevel):
+ def __init__(self,namespace, parent=None):
+ Tkinter.Toplevel.__init__(self,parent)
+ self._initTkWidgets()
+ self.stdout = self.stderr = self
+ self.pos = '1.0'
+ self.history = [ '' ]
+ self.hpos = 0
+ self.tabCount = 0
+ self.shell = PythonInterpreter( self,namespace)
+ self.write("Python %s on %s\n%s\n(%s)\n" %
+ (sys.version, sys.platform, sys.copyright,
+ self.__class__.__name__))
+ self.write( sys.ps1)
+ self.text.focus_set()
+
+ def _initTkWidgets( self):
+ self.text = ScrolledText.ScrolledText( self, bg = "white",fg="black", wrap="word")
+ self.text.pack( fill='both', expand = 1)
+ self.text.bind( '<KeyPress>', self.clearMsg)
+ self.text.bind( '<Return>', self.inputhandler)
+ self.text.bind( '<KP_Enter>', self.inputhandler)
+ self.text.bind( '<Up>', self.uphistory)
+ self.text.bind( '<Down>', self.downhistory)
+ self.text.bind( '<Control-a>', self.goto_sol)
+ self.text.bind( '<Control-d>', self.sendeof)
+ self.text.tag_config("exception", foreground = "red")
+
+ def swapStdFiles(self):
+ sys.stdout,self.stdout = self.stdout,sys.stdout
+ sys.stderr,self.stderr = self.stderr,sys.stderr
+
+ def write(self, data):
+ self.text.insert("end", data)
+ self.pos = self.text.index("end - 1 char")
+ self.text.yview_pickplace("end")
+
+ def tag_add( self, tag, start, end):
+ self.text.tag_add( tag, start, end)
+
+ def inputhandler(self, *args):
+ # Remove any extraneous stuff
+ self.text.delete( self.pos + " lineend", "end")
+ # Now get the line
+ line = self.text.get(self.pos, "end - 1 char")
+ self.text.insert("end", "\n")
+ self.pos = self.text.index("end")
+ self.addHistory( line)
+ self.swapStdFiles()
+ if self.shell.push( line):
+ self.write(sys.ps2)
+ else:
+ self.write(sys.ps1)
+ self.swapStdFiles()
+ self.text.mark_set("insert", "end")
+ return "break"
+
+ def addHistory( self, line):
+ if line:
+ self.history.insert( len( self.history) - 1, line)
+ self.hpos = len( self.history) - 1
+
+ def sendeof(self, *args):
+ self.destroy()
+ return "break"
+
+ def uphistory(self, event=None):
+ if not self.history: return "break"
+
+ if self.hpos > 0:
+ self.hpos = self.hpos - 1
+
+ line = self.history[ self.hpos]
+ self.text.delete( self.pos, "end")
+ self.text.insert( self.pos, line)
+
+ return "break"
+
+ def downhistory( self, event=None):
+ if not self.history: return "break"
+
+ if self.hpos < (len( self.history) - 1):
+ self.hpos = self.hpos + 1
+
+ line = self.history[ self.hpos]
+ self.text.delete( self.pos, "end")
+ self.text.insert( self.pos, line)
+
+ return "break"
+
+ def goto_sol( self, event=None):
+ """
+ Met en mode edition la ligne courante
+ """
+ self.text.mark_set( 'insert', 'insert linestart + 4 chars')
+ return "break"
+
+ def clearMsg( self, event=None):
+ index = self.text.index( "insert")
+ self.text.delete( "insert lineend", "end")
+ self.tabCount = 0
+
+if __name__ == "__main__":
+ app = Tkinter.Tk()
+ d={'a':1}
+
+ def go():
+ InterpWindow(d,parent=app)
+
+ Tkinter.Button(app,text="Interp",command=go).pack()
+ Tkinter.Button(app,text="Quit",command=app.destroy).pack()
+
+ app.mainloop()
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+import types,string,os,glob,imp,sys
+from repr import Repr
+from copy import copy,deepcopy
+
+# import du chargeur de composants
+from comploader import make_objecttreeitem
+import treewidget
+from Ihm import CONNECTOR
+
+myrepr = Repr()
+myrepr.maxstring = 100
+myrepr.maxother = 100
+
+class TreeItem:
+
+ """Abstract class representing tree items.
+
+ Methods should typically be overridden, otherwise a default action
+ is used.
+
+ """
+ # itemNode est une factory qui doit retourner un objet de la classe Node
+ # ou dérivé de cette classe.
+ # Le widget arbre utilisera cet objet comme noeud associé au tree item.
+ # Par defaut, utilise la classe Node de base
+ # La signature de la factory est la suivante :
+ # itemNode(treeOrNode,item,command,rmenu)
+ # ou treeOrNode est le noeud parent, item est l'item associé
+ # command est une fonction python appelée sur sélection graphique
+ # du noeud et rmenu est une fonction python appelée sur click droit sur le noeud
+ itemNode=treewidget.Node
+
+ def __init__(self):
+ """Constructor. Do whatever you need to do."""
+
+ def GetText(self):
+ """Return text string to display."""
+
+ def GetLabelText(self):
+ """Return label text string to display in front of text (if any)."""
+
+ expandable = None
+
+ def _IsExpandable(self):
+ """Do not override! Called by TreeNode."""
+ if self.expandable is None:
+ self.expandable = self.IsExpandable()
+ return self.expandable
+
+ def IsExpandable(self):
+ """Return whether there are subitems."""
+ return 1
+
+ def _GetSubList(self):
+ """Do not override! Called by TreeNode."""
+ if not self.IsExpandable():
+ return []
+ sublist = self.GetSubList()
+ if not sublist:
+ self.expandable = 0
+ return sublist
+
+ def IsEditable(self):
+ """Return whether the item's text may be edited."""
+
+ def SetText(self, text):
+ """Change the item's text (if it is editable)."""
+
+ def GetIconName(self):
+ """Return name of icon to be displayed normally."""
+
+ def GetSelectedIconName(self):
+ """Return name of icon to be displayed when selected."""
+
+ def GetSubList(self):
+ """Return list of items forming sublist."""
+
+ def OnDoubleClick(self):
+ """Called on a double-click on the item."""
+
+class Delegate:
+ def __init__(self, delegate=None):
+ self.object = delegate
+ self.__cache = {}
+
+ def setdelegate(self, delegate):
+ self.resetcache()
+ self.object = delegate
+
+ def getdelegate(self):
+ return self.object
+
+ def __getattr__(self, name):
+ attr = getattr(self.object, name) # May raise AttributeError
+ setattr(self, name, attr)
+ self.__cache[name] = attr
+ return attr
+
+ def resetcache(self):
+ for key in self.__cache.keys():
+ try:
+ delattr(self, key)
+ except AttributeError:
+ pass
+ self.__cache.clear()
+
+ def cachereport(self):
+ keys = self.__cache.keys()
+ keys.sort()
+ print keys
+
+
+class ObjectTreeItem(TreeItem,Delegate):
+ def __init__(self, appli, labeltext, object, setfunction=None):
+ self.labeltext = labeltext
+ self.appli = appli
+ # L'objet délegué est stocké dans l'attribut object
+ # L'objet associé à l'item est stocké dans l'attribut _object
+ # Il peut etre obtenu par appel à la méthode getObject
+ # Attention : le délégué peut etre différent de l'objet associé (MCLIST)
+ # Dans le cas d'une MCListe de longueur 1, l'objet associé est la MCListe
+ # et l'objet délégué est le MCFACT (object = _object.data[0])
+ Delegate.__init__(self,object)
+ # On cache l'objet initial (pour destruction eventuelle
+ # ultérieure)
+ self._object = object
+ self.setfunction = setfunction
+ self.expandable = 1
+ self.sublist=[]
+ self.init()
+
+ def init(self):
+ return
+
+ def getObject(self):
+ return self._object
+
+ def connect(self,channel,callable,args):
+ """ Connecte la fonction callable (avec arguments args) à l'item self sur le
+ canal channel
+ """
+ CONNECTOR.Connect(self._object,channel,callable,args)
+ CONNECTOR.Connect(self.object, channel,callable,args)
+
+ def copy(self):
+ """
+ Crée un item copie de self
+ """
+ object = self._object.copy()
+ appli = copy(self.appli)
+ labeltext = copy(self.labeltext)
+ fonction = deepcopy(self.setfunction)
+ item = make_objecttreeitem(appli,labeltext,object,fonction)
+ return item
+
+ def isactif(self):
+ if hasattr(self.object,'actif'):
+ return self.object.actif
+ else:
+ return 1
+
+ def update(self,item):
+ """
+ Met a jour l'item courant a partir d'un autre item passe en argument
+ Ne fait rien par defaut
+ """
+ pass
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ # None --> fonte et couleur par défaut
+ return self.labeltext,None,None
+
+ def get_nature(self) :
+ """
+ Retourne la nature de l'item et de l'objet
+ """
+ return self.object.nature
+
+ def get_regles(self):
+ """ retourne les règles de l'objet pointé par self """
+ return self.object.get_regles()
+
+ def get_liste_mc_presents(self):
+ """ Retourne la liste des mots-clés fils de l'objet pointé par self """
+ return self.object.liste_mc_presents()
+
+ def get_val(self):
+ """ Retourne le nom de la valeur de l'objet pointé par self dans le cas
+ où celle-ci est un objet (ASSD) """
+ return self.object.getval()
+
+ def get_definition(self):
+ """
+ Retourne l'objet definition de l'objet pointé par self
+ """
+ return self.object.definition
+
+ def get_liste_mc_ordonnee(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 + ...
+ il faut encore réarranger cette liste (certains mots-clés déjà
+ présents ne doivent plus être proposés, règles ...)"""
+ return self.object.get_liste_mc_ordonnee(liste,dico)
+
+ 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 + ...
+ """
+ return self.object.get_liste_mc_ordonnee_brute(liste,dico)
+
+ def get_genealogie(self):
+ """
+ Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
+ de l'objet pointé par self
+ """
+ return self.object.get_genealogie()
+
+ def get_index_child(self,nom_fils):
+ """
+ Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
+ Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
+ le nouveau mot-clé
+ """
+ return self.object.get_index_child(nom_fils)
+
+ def get_index_child_old(self,nom_fils):
+ """
+ Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
+ Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
+ le nouveau mot-clé
+ """
+ liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),self.get_jdc().cata_ordonne_dico)
+ liste_noms_mc_presents = self.object.liste_mc_presents()
+ l=[]
+ for nom in liste_noms_mc_ordonnee:
+ if nom in liste_noms_mc_presents or nom == nom_fils:
+ l.append(nom)
+ # l contient les anciens mots-clés + le nouveau dans l'ordre
+ return l.index(nom_fils)
+
+ def append_child(self,name,pos=None):
+ """
+ Permet d'ajouter un item fils à self
+ """
+ if pos == 'first':
+ index = 0
+ elif pos == 'last':
+ index = len(self.liste_mc_presents())
+ elif type(pos) == types.IntType :
+ # la position est fixée
+ index = pos
+ elif type(pos) == types.InstanceType:
+ # pos est un item. Il faut inserer name apres pos
+ index = self.get_index(pos) +1
+ elif type(name) == types.InstanceType:
+ index = self.get_index_child(name.nom)
+ else:
+ index = self.get_index_child(name)
+ return self.addobject(name,index)
+
+ def append_brother(self,name,pos='after'):
+ """
+ Permet d'ajouter un frère à self
+ par défaut on l'ajoute après self
+ """
+ index = self._object.parent.get_index(self.getObject())
+ if pos == 'before':
+ index = index
+ elif pos == 'after':
+ index = index +1
+ else:
+ print str(pos)," n'est pas un index valide pour append_brother"
+ return
+ return self.parent.addobject(name,index)
+
+ def get_nom_etape(self):
+ """Retourne le nom de self """
+ return self.object.get_nom_etape()
+
+ def get_copie_objet(self):
+ """ Retourne une copie de l'objet pointé par self """
+ return self.object.copy()
+
+ def get_position(self):
+ """ Retourne la valeur de l'attribut position de l'objet pointé par self """
+ definition = self.get_definition()
+ try:
+ return getattr(definition,'position')
+ except AttributeError:
+ return 'local'
+
+ def get_nom(self):
+ """ Retourne le nom de l'objet pointé par self """
+ return self.object.nom
+
+ def get_jdc(self):
+ """ Retourne le jdc auquel appartient l'objet pointé par self """
+ return self.object.jdc
+
+ def get_valeur(self):
+ """ Retourne la valeur de l'objet pointé par self """
+ return self.object.valeur
+
+ def get_cr(self):
+ """ Retourne le compte-rendu CR de self """
+ return self.object.report()
+
+ def get_objet_commentarise(self):
+ """
+ Cette méthode retourne un objet commentarisé
+ représentatif de self.object
+ --> à surcharger par les différents items
+ """
+ raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
+ pass
+
+ def isvalid(self):
+ """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
+ return self.object.isvalid()
+
+ def iscopiable(self):
+ """
+ Retourne 1 si l'objet est copiable, 0 sinon
+ Par défaut retourne 0
+ """
+ return 0
+
+ def get_mc_presents(self):
+ """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
+ return self.object.dict_mc_presents()
+
+ def verif_condition_regles(self,l_mc_presents):
+ return self.object.verif_condition_regles(l_mc_presents)
+
+ def get_fr(self):
+ """ Retourne le fr de l'objet pointé par self """
+ try:
+ return self.object.get_fr()
+ except:
+ return ""
+
+ def get_docu(self):
+ """ Retourne la clé de doc de l'objet pointé par self """
+ return self.object.get_docu()
+
+ def set_valeur(self,new_valeur):
+ """ Remplace la valeur de l'objet pointé par self par new_valeur """
+ return self.object.set_valeur(new_valeur)
+
+ def GetText(self):
+ return myrepr.repr(self.object)
+
+ def GetIconName(self):
+ if not self.IsExpandable():
+ return "python"
+
+ def IsEditable(self):
+ return self.setfunction is not None
+
+ def SetText(self, text):
+ try:
+ value = eval(text)
+ self.setfunction(value)
+ except:
+ pass
+# Modif de ma part CCar : je ne comprend pas a quoi ca sert
+# ca parait meme incorrect
+ # else:
+ # self.object = value
+
+ def IsExpandable(self):
+ return 1
+
+ def GetSubList(self):
+ keys = dir(self.object)
+ sublist = []
+ for key in keys:
+ try:
+ value = getattr(self.object, key)
+ except AttributeError:
+ continue
+ item = make_objecttreeitem(
+ self.appli,
+ str(key) + " =",
+ value,
+ lambda value, key=key, object=self.object:
+ setattr(object, key, value))
+ sublist.append(item)
+ return sublist
+
+ def wait_fichier_init(self):
+ """ Retourne 1 si l'object pointé par self attend un fichier d'initialisation
+ (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
+ return self.object.definition.fichier_ini
+
+ def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
+ """
+ Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
+ de type item associé à l'object passé en argument.
+ """
+ return make_objecttreeitem(appli,labeltext,object,setfunction)
+
+ #def __del__(self):
+ # print "__del__",self
+
+class AtomicObjectTreeItem(ObjectTreeItem):
+ def IsExpandable(self):
+ return 0
+
+class SequenceTreeItem(ObjectTreeItem):
+ def IsExpandable(self):
+ return len(self._object) > 0
+
+ def __len__(self) :
+ return len(self._object)
+
+ def keys(self):
+ return range(len(self._object))
+
+ def GetIconName(self):
+ if self._object.isvalid():
+ return "ast-green-los"
+ elif self._object.isoblig():
+ return "ast-red-los"
+ else:
+ return "ast-yel-los"
+
+ def ajout_possible(self):
+ return self._object.ajout_possible()
+
+ def get_index(self,child):
+ """ Retourne le numéro de child dans la liste des enfants de self """
+ return self._object.get_index(child.getObject())
+
+ def GetText(self):
+ return " "
+
+ def additem(self,obj,pos):
+ self._object.insert(pos,obj)
+ item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
+ return item
+
+ def suppitem(self,item):
+ try :
+ self._object.remove(item.getObject())
+ # la liste peut être retournée vide !
+ message = "Mot-clé " + item.getObject().nom + " supprimé"
+ self.appli.affiche_infos(message)
+ return 1
+ except:
+ return 0
+
+ def GetSubList(self):
+ isublist=iter(self.sublist)
+ liste=self._object.data
+ iliste=iter(liste)
+ self.sublist=[]
+
+ while(1):
+ old_obj=obj=None
+ for item in isublist:
+ old_obj=item.getObject()
+ if old_obj in liste:break
+
+ for obj in iliste:
+ if obj is old_obj:break
+ # nouvel objet : on cree un nouvel item
+ def setfunction(value, object=obj):
+ object=value
+ it = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+ self.sublist.append(it)
+ if old_obj is None and obj is None:break
+ if old_obj is obj: self.sublist.append(item)
+ return self.sublist
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 3Dpilote qui va creer les ordres
+ de pilotage de l idl PAL pour un element de structure
+"""
+import generator
+
+class TroisDPilote:
+
+ def __init__(self,node,appli,parent):
+ self.node=node
+ self.appli=appli
+ self.parent=parent
+
+ def envoievisu(self):
+ """
+ """
+ format="vers3DSalome"
+ if generator.plugins.has_key(format):
+ # Le generateur existe on l'utilise
+ g=generator.plugins[format]()
+ g.init_jdc(self.node.get_jdc())
+ texte=g.gener(self.node)
+ else:
+ print "Le generateur n a pas ete trouvé"
+ print "Erreur ! Erreur!"
+ return ""
+ self.appli.envoievisu(texte)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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.
+#
+#
+# ======================================================================
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+ des composants graphiques et l'initialisation Tk
+ L'aspect applicatif doit etre pris en charge par la classe dérivée
+"""
+# Modules Python
+import os
+import string
+import sys
+import types
+import Pmw
+import Tkinter
+from widgets import showerror
+
+# Modules Eficas
+import splash
+from Aster import prefs
+import styles
+from styles import style
+from InterfaceTK import fontes
+import tooltip
+import properties
+import convert,generator
+from Editeur import comploader
+from Editeur.utils import extension_fichier,stripPath
+
+from widgets import Fenetre
+from Misc import MakeNomComplet
+from Editeur import session
+
+import listeFichiers
+
+REPTK=os.path.dirname(os.path.abspath(__file__))
+sys.path[:0]=[REPTK]
+
+VERSION="EFICAS v1.12"
+
+class APPLI:
+ def __init__ (self,master,code=prefs.code,fichier=None,test=0,ihm="TK") :
+ self.code=code
+ self.top=master
+ self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS)
+ self.ihm=ihm
+
+ #dimensionnement de la fenetre principale
+ #aspect ratio de l'ecran
+ aspect=float(self.top.winfo_screenwidth())/float(self.top.winfo_screenheight())
+ #resolution (pixels par point). On utilise le fait qu'on a "normalement" 72 points par inch
+ resolution= self.top.winfo_screenwidth()/(self.top.winfo_screenmmwidth()/25.4*72)
+ DDY=max(20,resolution*(fontes.standard[1]+4)) #largeur d'un caractere fonte standard en pixel
+ x=int(45*DDY) #largeur d'ouverture de 45 caracteres de fonte standard
+ y=int(25*DDY) #hauteur d'ouverture de 25 caracteres de fonte standard
+ minx=x*8/10 #largeur min (80 pour cent de largeur)
+ miny=y*8/10 #hauteur min (80 pour cent de hauteur)
+ self.top.minsize(minx,miny)
+ self.top.geometry('%dx%d' % (x,y))
+
+ self.top.title(VERSION + ' pour '+self.code)
+ self.titre=VERSION + ' pour '+self.code
+ self.top.withdraw()
+ self.initializeTk(master)
+ Pmw.initialise(master)
+
+ self.dict_reels={}
+ self.liste_simp_reel=[]
+ # L'attribut test permet d'activer les panneaux de splash et d'erreur (test=0)
+ # Si test est different de 0, les panneaux ne sont pas activés
+ self.test=test
+
+ # Lecture des parametres de configuration (fichier global editeur.ini
+ # et utilisateur eficas.ini)
+ self.lecture_parametres()
+
+ self.format_fichier = Tkinter.StringVar()
+ self.message=''
+ # Avant la creation du bureau qui lit le catalogue
+ self.version_code=session.d_env.cata
+
+ # Creation de la menubar, toolbar, messagebar
+ self.cree_composants_graphiques()
+ # Creation des autres composants graphiques dont le bureau (parametrable par prefs.py)
+ self.load_appli_composants()
+ self.listeFichiers=listeFichiers.listeFichiers(self)
+ from InterfaceTK import listePatronsTK
+ self.listePatrons=listePatronsTK.listePatronsTK(self)
+ self.dir=None
+
+ # Fermer le splash et deiconifier la fenetre principale si on n'est pas en test
+ if (self.test == 0):
+ splash.fini_splash()
+ #self.affiche_FAQ()
+
+ # Ouverture des fichiers de commandes donnes sur la ligne de commande
+ cwd=os.getcwd()
+ self.dir=cwd
+ for study in session.d_env.studies:
+ os.chdir(cwd)
+ d=session.get_unit(study,self)
+ self.bureau.openJDC(file=study["comm"],units=d)
+
+
+ def send_message(self,message):
+ self.message=message
+
+ def exitEFICAS(self):
+ self.quit()
+
+ def quit(self):
+ self.top.quit()
+
+ def lecture_parametres(self):
+ """
+ Active la lecture des paramètres standards et utilisateur
+ """
+ if (self.test == 0):
+ splash._splash.configure(text = "Chargement des paramètres utilisateur")
+ from Editeur import configuration
+ self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
+ self.CONFIGStyle = configuration.make_config_style(self,prefs.REPINI)
+
+ def cree_composants_graphiques(self):
+ """
+ Cree les constituants graphiques fixes de l'application :
+ - menubar
+ - toolbar
+ - statusbar
+ """
+ if (self.test == 0):
+ splash._splash.configure(text = "Chargement de l'IHM")
+ splash._splash.configure(text = "Chargement de la menubar")
+ import menubar
+ self.menubar=menubar.MENUBAR(self,self.top)
+ if (self.test == 0):
+ splash._splash.configure(text = "Chargement de la toolbar")
+ import toolbar
+ self.toolbar=toolbar.TOOLBAR(self,self.top)
+ if (self.test == 0):
+ splash._splash.configure(text = "Chargement de la statusbar")
+ import statusbar
+ self.statusbar=statusbar.STATUSBAR(self.top,styles.style.statusfont)
+
+ def load_appli_composants(self):
+ """
+ Cree les autres constituants graphiques de l'application :
+ - bureau
+ - readercata
+ - ...
+ Cette creation est parametrable par fichier prefs.py
+ """
+ if (self.test == 0):
+ splash._splash.configure(text = "Chargement des appli_composants")
+ for mname in self.appli_composants:
+ self.load_appli_composant(mname)
+
+ def load_appli_composant(self,mname):
+ if mname=="bureau" :
+ mnameTK="InterfaceTK."+mname
+ moduleTK=__import__(mnameTK,globals(),locals())
+ module=getattr(moduleTK,mname)
+ factory=getattr(module,mname.upper())
+ 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)
+ return
+
+
+ try :
+ mnameTK="InterfaceTK."+mname
+ moduleTK=__import__(mnameTK,globals(),locals())
+ module=getattr(moduleTK,mname)
+ except :
+ mnameEditeur="Editeur."+mname
+ moduleEditeur=__import__(mnameEditeur,globals(),locals())
+ module=getattr(moduleEditeur,mname)
+ factory=getattr(module,mname.upper())
+ 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
+ faq.affiche(self.top)
+
+ def affiche_infos(self,message):
+ self.statusbar.affiche_infos(message)
+ return
+
+ def initializeTk(self, root):
+ """
+ Initialize platform specific options
+ """
+ if sys.platform == 'mac':
+ self.initializeTk_mac(root)
+ elif sys.platform == 'win32':
+ self.initializeTk_win32(root)
+ else:
+ self.initializeTk_unix(root)
+
+ def initializeTk_win32(self, root):
+ root.option_add('*Font', fontes.standard)
+ root.option_add('*EntryField.Entry.Font', fontes.standard)
+ root.option_add('*Listbox*Font',fontes.standard)
+
+ def initializeTk_colors_common(self, root):
+ root.option_add('*background', style.background)
+ root.option_add('*foreground', style.foreground)
+ root.option_add('*EntryField.Entry.background', style.entry_background)
+ root.option_add('*Entry*background', style.entry_background)
+ root.option_add('*Listbox*background', style.list_background)
+ root.option_add('*Listbox*selectBackground', style.list_select_background)
+ root.option_add('*Listbox*selectForeground', style.list_select_foreground)
+
+ def initializeTk_mac(self, root):
+ self.initializeTk_colors_common(root)
+
+ def initializeTk_unix(self, root):
+ root.option_add('*Font', fontes.standard)
+ root.option_add('*EntryField.Entry.Font',fontes.standard )
+ root.option_add('*Listbox*Font', fontes.standard)
+ self.initializeTk_colors_common(root)
+
+ def get_texte_infos(self):
+ """
+ Retourne un texte d'informations sur la session courante d'EFICAS
+ """
+ texte = VERSION + '\n\n'
+ texte = texte + 'EFICAS est un produit développé par \nEDF-R&D\n'
+ texte = texte + 'Equipe : SINETICS\n\n'
+ texte = texte + 'Code utilisé : %s version %s\n' % (self.code,properties.version)
+ return texte
+
+ def efface_aide(self,event):
+ """
+ Efface la bulle d'aide d'un panneau
+ """
+ try:
+ self.aide.destroy()
+ except:
+ pass
+ return
+
+ def affiche_aide(self,event,aide):
+ """
+ Affiche l'aide concernant un panneau
+ """
+ x=event.x
+ y=event.y
+ widget=event.widget
+ 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
+ raccourci_label=""
+ if not item :
+ #menu.add_separator()
+ pass
+ else:
+ if len(item)==3:
+ raccourci=item[2]
+ raccourci_label=" "+raccourci
+ newitem=(item[0],item[1])
+ else :
+ if len(item)==4:
+ raccourci=item[2]
+ raccourci_label=" "+item[3]
+ newitem=(item[0],item[1])
+ else :
+ raccourci=""
+ newitem=item
+ item=newitem
+ 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,accelerator=raccourci_label,command=command)
+ if raccourci != "" :
+ self.top.bind(raccourci,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
+ self.cree_menu(menu,itemlist,appli_composant)
+
+ def update_jdc_courant(self):
+ self.bureau.update_jdc_courant()
+
+ def affiche_alerte(self,titre,message):
+ f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
+ f.wait()
+
+
+class valeur:
+ def __init__(self,v=None):
+ self.v=v
+ def set(self,v):
+ self.v=v
+ def get(self):
+ return self.v
+
+class STANDALONE(APPLI):
+ def __init__ (self,code=prefs.code,fichier=None,version='v8.2') :
+ self.code=code
+ self.top=None
+ self.format_fichier=valeur()
+
+ self.dict_reels={}
+ self.liste_simp_reel=[]
+ # L'attribut test doit valoir 1 si on ne veut pas creer les fenetres
+ self.test=1
+ self.titre="STANDALONE POUR TEST"
+
+ # Lecture des parametres de configuration (fichier global editeur.ini
+ # et utilisateur eficas.ini)
+ self.lecture_parametres()
+
+ self.message=''
+ # Avant la creation du bureau qui lit le catalogue
+ self.version_code=version
+ from InterfaceTK import readercata
+ self.readercata=readercata.READERCATA(self,None)
+
+ self.dir=None
+
+ def affiche_infos(self,message):
+ return
+
+ def get_text_JDC(self,JDC,format):
+ if generator.plugins.has_key(format):
+ # Le generateur existe on l'utilise
+ g=generator.plugins[format]()
+ jdc_formate=g.gener(JDC,format='beautifie')
+ return jdc_formate
+ else:
+ # Il n'existe pas c'est une erreur
+ return
+
+ def newJDC(self):
+ CONTEXT.unset_current_step()
+ J=self.readercata.cata[0].JdC(procedure="",
+ appli=self,
+ cata=self.readercata.cata,
+ cata_ord_dico=self.readercata.cata_ordonne_dico,
+ rep_mat=self.CONFIGURATION.rep_mat,
+ )
+ J.analyse()
+ return J
+
+ def openJDC(self,file):
+ self.fileName = file
+ e=extension_fichier(file)
+ self.JDCName=stripPath(file)
+ self.initialdir = os.path.dirname(os.path.abspath(file))
+ format=self.format_fichier.get()
+ # Il faut convertir le contenu du fichier en fonction du format
+ if convert.plugins.has_key(format):
+ # Le convertisseur existe on l'utilise
+ p=convert.plugins[format]()
+ p.readfile(file)
+ text=p.convert('exec',self)
+ if not p.cr.estvide():
+ raise ValueError(str(p.cr))
+
+ # On se met dans le repertoire ou se trouve le fichier de commandes
+ # pour trouver les eventuels fichiers include ou autres
+ # localises a cote du fichier de commandes
+ os.chdir(self.initialdir)
+ CONTEXT.unset_current_step()
+ J=self.readercata.cata[0].JdC(procedure=text,
+ appli=self,
+ cata=self.readercata.cata,
+ cata_ord_dico=self.readercata.cata_ordonne_dico,
+ nom=self.JDCName,
+ rep_mat=self.CONFIGURATION.rep_mat,
+ )
+ J.analyse()
+ txt= J.cr.get_mess_exception()
+ if txt:raise ValueError(txt)
+ return J
+
+ def openTXT(self,text):
+ self.JDCName="TEXT"
+ CONTEXT.unset_current_step()
+ J=self.readercata.cata[0].JdC(procedure=text,
+ appli=self,
+ cata=self.readercata.cata,
+ cata_ord_dico=self.readercata.cata_ordonne_dico,
+ nom=self.JDCName,
+ rep_mat=self.CONFIGURATION.rep_mat,
+ )
+ J.analyse()
+ txt= J.cr.get_mess_exception()
+ if txt:raise ValueError(txt)
+ return J
+
+ def create_item(self,obj):
+ return comploader.make_objecttreeitem(self,getattr(obj,"nom","item"),obj)
+
+ def get_file(self,unite=None,fic_origine = ''):
+ """
+ Retourne le nom du fichier correspondant a l unite logique unite (entier)
+ ou d'un fichier poursuite
+ """
+ f,ext=os.path.splitext(fic_origine)
+ if unite :
+ #include
+ finclude=f+".%d" % unite
+ else:
+ #poursuite
+ n=ext[-1]
+ if n == '0':
+ ext=".comm"
+ else:
+ ext=".com%d" % (string.atoi(n)-1)
+ if ext == '.com0' and not os.path.isfile(f+".com0"):
+ ext=".comm"
+ finclude=f+ext
+ ff=open(finclude)
+ text=ff.read()
+ ff.close()
+ return finclude,text
+
+ def affiche_alerte(self,titre,message):
+ print titre+ "\n\n" + message
--- /dev/null
+class STYLE:
+ background='gray90'
+ foreground='black'
+ entry_background='white'
+ list_background='white'
+ list_select_background='#00008b'
+ list_select_foreground='grey'
+ tooltip_background="yellow"
+
+ standard = ("Helvetica",12)
+ standard_italique = ("Helvetica",12,'italic')
+ standard_gras = ("Helvetica",12,'bold')
+ standard_gras_souligne = ("Helvetica",12,'bold','underline')
+
+ canvas = ('Helvetica',10)
+ canvas_italique = ('Helvetica',10,'italic')
+ canvas_gras = ("Helvetica",10,'bold')
+ canvas_gras_italique = ("Helvetica",12,'bold','italic')
+
+ standard12 = ("Helvetica",14)
+ standard12_gras = ("Helvetica",14,'bold')
+ standard12_gras_italique = ( "Helvetica",14,'bold','italic')
+
+ standardcourier10 = ("Courier",14)
+ statusfont = ("Helvetica",16)
+
+style=STYLE()
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 os,string
+
+# Modules Eficas
+import Interp
+import catabrowser
+import cataediteur
+
+class BROWSER:
+
+ menu_defs=[
+ ('Browsers',[
+ ('Browser catalogue','browser_catalogue'),
+ ('Editeur catalogue','edite_catalogue'),
+ ('Shell','shell'),
+ ]
+ )
+ ]
+
+ button_defs=[]
+
+ def __init__(self,appli,parent):
+ self.appli=appli
+ self.parent=parent
+ self.cataitem = catabrowser.CATAItem(self,"Catalogue "+self.appli.readercata.code,
+ self.appli.readercata.cata,
+ objet_cata_ordonne = self.appli.readercata.cata_ordonne_dico)
+
+ def shell(self,event=None):
+ if not hasattr(self.appli.bureau.JDCDisplay_courant,'jdc'):return
+ d={'j':self.appli.bureau.JDCDisplay_courant.jdc}
+ Interp.InterpWindow(d,parent=self.parent)
+
+ def browser_catalogue(self,event=None):
+ catabrowser.CataBrowser(parent=self.parent,appli=self.appli,
+ cata = self.appli.readercata.cata,
+ item = self.cataitem)
+
+ def edite_catalogue(self,event=None):
+ cataediteur.CataEditeur(parent=self.parent,appli=self.appli,cata=self.appli.readercata.cata)
+
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+"""
+# Modules Python
+import os,string,sys
+import traceback
+import Pmw
+from widgets import askopenfilename,asksaveasfilename
+from widgets import showinfo,askyesno,showerror
+
+# Modules Eficas
+import splash
+import Aster.prefs
+import convert
+import generator
+import AIDE
+import os
+from jdcdisplay import JDCDISPLAY
+from utils import extension_fichier,stripPath,save_in_file
+from widgets import Fenetre,Ask_Format_Fichier,FenetreSurLigneWarning
+from fenetre_mc_inconnus import fenetre_mc_inconnus
+from Ihm import CONNECTOR
+from Traducteur import traduitV7V8
+
+from Editeur import comploader
+
+class BUREAU:
+ menu_defs=[
+ ('Fichier',[
+ ('Nouveau','newJDC','<Control-n>'),
+ ('Ouvrir','openJDC','<Control-o>'),
+ ('Enregistrer','saveJDC','<Control-e>'),
+ ('Enregistrer sous','saveasJDC','<Control-s>'),
+ None,
+ ('Fermer','closeJDC','<Control-f>'),
+ ('Quitter','exitEFICAS','<Control-q>'),
+ ]
+ ),
+ ('Edition',[
+ ('Copier','copy','<Control-c>'),
+ ('Couper','cut','<Control-x>'),
+ ('Coller','paste','<Control-v>'),
+ ]
+ ),
+ ('Jeu de commandes',[
+ ('Rapport de validation','visuCRJDC','<Control-r>'),
+ ('Fichier à plat','visu_a_plat','<Control-p>'),
+ ('Fichier .py','visuJDC_py'),
+ ('Fichier source','visu_txt_brut_JDC','<Control-b>'),
+ ('Paramètres Eficas','affichage_fichier_ini'),
+ ('Mots-clés inconnus','mc_inconnus'),
+ ]
+ ),
+ ('Traduction',[
+ ('Traduction v7 en v8','TraduitFichier','<Control-t>','Ctrl+T')
+ ]
+ ),
+ ('Aide',[
+ ('Aide EFICAS','aideEFICAS'),
+ ]
+ ),
+ ]
+
+ button_defs = (('New24',"newJDC","Création d'un nouveau fichier",'always'),
+ ('Open24',"openJDC","Ouverture d'un fichier existant",'always'),
+ ('Save24',"saveJDC","Sauvegarde du fichier courant",'always'),
+ ('Fermer24',"closeJDC","Fermeture du fichier courant",'always'),
+ ('Zoom24',"visuJDC","Visualisation du fichier de commandes",'always'),
+ None,
+ ('Copy24',"copy","Copie l'objet courant",'jdc'),
+ ('Cut24',"cut","Coupe l'objet courant",'jdc'),
+ ('Paste24',"paste","Colle l'objet copié après l'objet courant",'jdc'),
+ None,
+ ('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
+ self.appli=appli
+ if self.appli.test == 0 :
+ splash._splash.configure(text = "Création du bureau")
+ self.nb = Pmw.NoteBook(self.parent,raisecommand=self.selectJDC)
+ self.nb.pack(fill='both',expand=1)
+ self.JDCDisplay_courant=None
+ self.fileName=None
+ self.liste_JDCDisplay=[]
+ comploader.charger_composants()
+ self.cree_cataitem()
+ self.text_reel=""
+ self.initialdir = self.appli.CONFIGURATION.initialdir
+
+ def cree_cataitem(self):
+ """
+ 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
+ self.cata=self.appli.readercata.cata
+ self.cata_ordonne_dico=self.appli.readercata.cata_ordonne_dico
+ self.code=self.appli.readercata.code
+ self.version_code=self.appli.readercata.version_code
+ self.fic_cata=self.appli.readercata.fic_cata
+
+ def selectJDC(self,event=None):
+ """
+ Cette méthode est appelée chaque fois que l'on sélectionne
+ l'onglet d'un JDC dans le NoteBook des JDC.
+ Elle permet de stocker dans les variable self.JDC et
+ self.JDCDisplay_courant les valeurs concernant le JDC courant
+ """
+ if len(self.liste_JDCDisplay) == 0 : return
+ #if self.JDCDisplay_courant : self.JDCDisplay_courant.jdc.unset_context()
+ numero_jdc = self.nb.index(self.nb.getcurselection())
+ self.JDCDisplay_courant.unselect()
+ self.JDCDisplay_courant = self.liste_JDCDisplay[numero_jdc]
+ self.JDC = self.JDCDisplay_courant.jdc
+ self.JDCName = self.JDC.nom
+ self.JDCDisplay_courant.select()
+ #print "selectJDC",numero_jdc,self.JDCDisplay_courant,self.JDCName
+
+
+ def newJDC_include(self,event=None):
+ """
+ Initialise un nouveau JDC include vierge
+ """
+ import Extensions.jdc_include
+ JdC_aux=Extensions.jdc_include.JdC_include
+
+ self.appli.statusbar.reset_affichage_infos()
+
+ CONTEXT.unset_current_step()
+ jaux=self.cata[0].JdC(procedure="",appli=self.appli,
+ cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
+ rep_mat=self.appli.CONFIGURATION.rep_mat,
+ )
+ jaux.analyse()
+
+ J=JdC_aux(procedure="",appli=self.appli,
+ cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
+ jdc_pere=jaux,
+ rep_mat=self.appli.CONFIGURATION.rep_mat,
+ )
+ J.analyse()
+ self.JDCName=J.nom
+ self.fileName=None
+ self.ShowJDC(J,self.JDCName)
+ self.appli.toolbar.active_boutons()
+ return J
+
+ def newJDC(self,event=None):
+ """
+ Initialise un nouveau JDC vierge
+ """
+ self.appli.statusbar.reset_affichage_infos()
+
+ CONTEXT.unset_current_step()
+ J=self.cata[0].JdC(procedure="",appli=self.appli,
+ cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
+ rep_mat=self.appli.CONFIGURATION.rep_mat,
+ )
+ J.analyse()
+ self.JDCName=J.nom
+ self.fileName=None
+ self.ShowJDC(J,self.JDCName)
+ self.appli.toolbar.active_boutons()
+ return J
+
+ def ShowJDC(self,JDC,nom,label_onglet=None,JDCDISPLAY=JDCDISPLAY,enregistre="non"):
+ """
+ Lance l'affichage du JDC cad création du JDCDisplay
+ Rajoute le JDCDisplay à la liste des JDCDisplay si label_onglet == None cad si on crée
+ bien un nouveau JDCDisplay et non si on remplace (renommage de l'onglet)
+ """
+ self.JDC=JDC
+ self.JDCName = self.JDC.nom = nom
+ if label_onglet == None :
+ # On veut un nouvel onglet
+ label_onglet = self.GetLabelJDC()
+ self.nb.add(label_onglet,tab_text = nom,tab_width=20)
+ new = 'oui'
+ else :
+ new = 'non'
+ self.JDCDisplay_courant=JDCDISPLAY(self.JDC,nom,appli=self.appli,parent=self.nb.page(label_onglet))
+ if new == 'oui':
+ self.liste_JDCDisplay.append(self.JDCDisplay_courant)
+ self.JDCDisplay_courant.modified='n'
+ if enregistre != "non" :
+ self.JDCDisplay_courant.fichier=self.fileName
+ else :
+ self.initialdir = self.appli.CONFIGURATION.rep_user
+ self.nb.selectpage(label_onglet)
+ self.nb.setnaturalsize()
+ self.nb.bind_all("<Key-Next>",lambda e,s=self:s.selectArbreDown())
+ self.nb.bind_all("<Key-Prior>",lambda e,s=self:s.selectArbreUp())
+ self.nb.bind_all("<Insert>",lambda e,s=self:s.deplieReplieNode())
+ texte = "Jeu de commandes :" + self.JDCName+" ouvert"
+ CONNECTOR.Connect(JDC,"close",self.onClose,(self.JDCDisplay_courant,))
+ self.appli.affiche_infos(texte)
+
+ def onClose(self,jdcdisplay):
+ #print "onClose",jdcdisplay
+ self.closeJDCDISPLAY(jdcdisplay)
+
+ def closeJDCDISPLAY(self,jdc):
+ """
+ Ferme le jdcdisplay spécifié par l'argument jdc
+ """
+ if jdc is self.JDCDisplay_courant:
+ # on ferme le jdcdisplay courant
+ self.closeSelectedJDC()
+ else:
+ # on ferme un autre jdcdisplay que le courant
+ old_JDCDisplay=self.JDCDisplay_courant
+ old_page=self.nb.getcurselection()
+
+ self.JDCDisplay_courant=jdc
+ self.JDC=jdc.jdc
+ numero_jdc=self.liste_JDCDisplay.index(jdc)
+ self.nb.selectpage(numero_jdc)
+ #print numero_jdc
+
+ self.closeSelectedJDC()
+ self.JDCDisplay_courant=old_JDCDisplay
+ self.JDC=old_JDCDisplay.jdc
+ self.nb.selectpage(old_page)
+
+ def closeJDC (self,event=None) :
+ """
+ Ferme le JDC associé au JDCDISPLAY selectionné
+ """
+ if self.JDCDisplay_courant :
+ self.JDCDisplay_courant.jdc.close()
+
+ def closeSelectedJDC (self) :
+ """
+ Ferme le JDC courant et détruit l'onglet associé dans le notebook self.nb
+ """
+ if self.JDCDisplay_courant.modified == 'o' :
+ message = "Voulez-vous sauvegarder le jeu de commandes "+self.JDC.nom+" courant ?"
+ reponse = askyesno(title="Sauvegarde du jdc courant",
+ message=message)
+ if reponse :
+ test = self.saveJDC()
+ if test == 0 :
+ self.appli.affiche_infos("Sauvegarde impossible")
+ return
+
+ CONNECTOR.Disconnect(self.JDCDisplay_courant.jdc,"close",self.onClose,(self.JDCDisplay_courant,))
+ self.JDCDisplay_courant.supprime()
+ self.JDCDisplay_courant.jdc.supprime()
+ self.liste_JDCDisplay.remove(self.JDCDisplay_courant)
+ # Active le mecanisme de selection du notebook (selectJDC)
+ self.nb.delete(self.nb.getcurselection())
+
+ try:
+ index = self.nb.index(self.nb.getcurselection())
+ self.JDCDisplay_courant = self.liste_JDCDisplay[index]
+ self.JDC = self.JDCDisplay_courant.jdc
+ except:
+ self.JDC = None
+ self.JDCDisplay_courant = None
+ self.appli.toolbar.inactive_boutons()
+
+ def visuCRJDC(self,event=None):
+ return self.visuCR(mode='JDC')
+
+ def visuCR(self,mode):
+ """
+ Méthode permettant l'affichage du rapport de validation
+ """
+ if mode == 'JDC':
+ if not hasattr(self,'JDC') : return
+ if self.JDC == None : return
+ titre="rapport de validation du jeu de commandes courant"
+ cr = self.JDC.report()
+ #self.update_jdc_courant()
+ elif mode == 'CATA':
+ from Noyau.N_CR import CR
+ cr = CR()
+ cr.debut = "Début rapport de validation du catalogue"
+ cr.fin = "Fin rapport de validation du catalogue"
+ titre="rapport de validation du catalogue"
+ if hasattr(self,'cata_ordonne_cr') :
+ cr.add(self.cata_ordonne_cr)
+ if hasattr(self,'cata_dev_ordonne_cr') :
+ cr.add(self.cata_dev_ordonne_cr)
+ for cata in self.cata:
+ if hasattr(cata,'JdC'):
+ cr.add(cata.JdC.report())
+ texte_cr = str(cr)
+ self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
+
+ def openJDC(self,event=None,file=None,units=None,enregistre="oui"):
+ """
+ Demande à l'utilisateur quel JDC existant il veut ouvrir
+ """
+ if self.code == 'ASTER':
+ filetypes = ( ("format "+self.appli.format_fichier.get(), ".com*"),("Tous",'*'))
+ elif self.code == 'HOMARD' :
+ filetypes = ( ("format "+self.appli.format_fichier.get(), ".py"),("Tous",'*'))
+ else:
+ filetypes = ( ("format "+self.appli.format_fichier.get(), ".py"),)
+ if not hasattr(self,'initialdir'):
+ self.initialdir = self.appli.CONFIGURATION.initialdir
+
+ if not file :
+ file = askopenfilename(title="Ouverture d'un fichier de commandes Aster",
+ defaultextension=".comm",
+ filetypes = filetypes,
+ initialdir = self.initialdir)
+ if file :
+ self.fileName = file
+ e=extension_fichier(file)
+ self.JDCName=stripPath(file)
+ self.initialdir = os.path.dirname(os.path.abspath(file))
+ else :
+ return
+
+ format=self.appli.format_fichier.get()
+ # Il faut convertir le contenu du fichier en fonction du format
+ if convert.plugins.has_key(format):
+ # Le convertisseur existe on l'utilise
+ p=convert.plugins[format]()
+ p.readfile(file)
+ text=p.convert('exec',self.appli)
+ if not p.cr.estvide():
+ self.appli.affiche_infos("Erreur à la conversion")
+ Fenetre(self.appli,
+ titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
+ texte = str(p.cr)).wait()
+ return
+ if enregistre == "oui" :
+ self.appli.listeFichiers.aOuvert(file)
+ else:
+ # Il n'existe pas c'est une erreur
+ self.appli.affiche_infos("Type de fichier non reconnu")
+ showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
+ return
+
+ # On se met dans le repertoire ou se trouve le fichier de commandes
+ # pour trouver les eventuels fichiers include ou autres
+ # localises a cote du fichier de commandes
+ os.chdir(self.initialdir)
+ CONTEXT.unset_current_step()
+ J=self.cata[0].JdC(procedure=text,appli=self.appli,
+ cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
+ nom = self.JDCName,
+ rep_mat=self.appli.CONFIGURATION.rep_mat,
+ )
+ if units is not None:
+ J.recorded_units=units
+ J.old_recorded_units=units
+
+ J.analyse()
+ txt_exception = J.cr.get_mess_exception()
+ if txt_exception :
+ # des exceptions ont été levées à la création du JDC
+ # --> on affiche les erreurs mais pas le JDC
+ self.JDC=J
+ self.appli.affiche_infos("Erreur fatale au chargement de %s" %file)
+ if self.appli.test == 0 :
+ showerror("Erreur fatale au chargement d'un fichier",txt_exception)
+ else:
+ self.ShowJDC(J,self.JDCName,enregistre=enregistre)
+ self.appli.toolbar.active_boutons()
+ # si le JDC ne contient rien (vide), on retourne ici
+ if len(self.JDC.etapes) == 0 : return
+ # dans le cas où le JDC est invalide, on affiche son CR
+ if not self.JDC.isvalid():
+ self.appli.top.update()
+ self.visuCR(mode='JDC')
+ return J
+
+ def deplieReplieNode(self):
+ self.JDCDisplay_courant.tree.tree.deplieReplieNode()
+
+ def selectArbreDown(self):
+ self.JDCDisplay_courant.tree.tree.canvas.focus_set()
+ self.JDCDisplay_courant.tree.tree.mot_down_force()
+
+ def selectArbreUp(self):
+ self.JDCDisplay_courant.tree.tree.canvas.focus_set()
+ self.JDCDisplay_courant.tree.tree.mot_up_force()
+
+ def GetLabelJDC(self,nb_jdc = 'absent'):
+ """
+ Retourne le label de l'onglet du NoteBook associé au JDC à afficher
+ """
+ if nb_jdc == 'absent':
+ nb_jdc = len(self.nb.pagenames())
+ nb_jdc = nb_jdc+1
+ label_onglet = 'JDC'+`nb_jdc`
+ if label_onglet not in self.nb.pagenames() :
+ return label_onglet
+ else :
+ return self.GetLabelJDC(nb_jdc)
+
+ def saveasJDC(self,event=None):
+ """
+ Sauvegarde le JDC courant en demandant impérativement à l'utilisateur de
+ donner le nom du fichier de sauvegarde
+ """
+ self.saveJDC(echo='oui')
+
+ def saveJDC(self,echo='non'):
+ """
+ Sauvegarde le JDC courant.
+ Retourne 1 si la sauvegarde s'est bien faite, 0 sinon.
+
+ - Si echo = 'oui' : interactif (l'utilisateur donne le nom sous lequel il
+ veut sauver le JDC
+ - Si echo = 'non' : muet (sauvegarde le JDC dans JDC.procedure)
+ """
+ ok = 0
+ if not hasattr(self,'JDC') : return 0
+ format=self.appli.format_fichier.get()
+ if generator.plugins.has_key(format):
+ # Le generateur existe on l'utilise
+ g=generator.plugins[format]()
+ jdc_formate=g.gener(self.JDC,format='beautifie')
+ if format == 'homard':
+ self.jdc_homard=g.get_homard()
+ if not g.cr.estvide():
+ self.appli.affiche_infos("Erreur à la generation")
+ showerror("Erreur à la generation","EFICAS ne sait pas convertir ce JDC")
+ return
+ else:
+ # Il n'existe pas c'est une erreur
+ self.appli.affiche_infos("Format %s non reconnu" % format)
+ showerror("Format %s non reconnu" % format,"EFICAS ne sait pas convertir le JDC")
+ return
+ self.jdc_fini = string.replace(jdc_formate,'\r\n','\n')
+
+ if echo =='oui' or self.JDCDisplay_courant.fichier == None:
+ ok = self.asknomsauvegardeJDC()
+ elif self.JDCDisplay_courant.fichier != None :
+ # le JDC a déjà un nom : on sauvegarde directement sans demander
+ # un autre nom au développeur
+ if not save_in_file(self.JDCDisplay_courant.fichier,self.jdc_fini,self.appli.dir) :
+ showinfo("Erreur","Problème à la sauvegarde du fichier :" + `self.JDCDisplay_courant.fichier`)
+ #return 0
+ ok = 0
+ else :
+ if self.appli.format_fichier.get() == 'homard':
+ self.save_homard(self.JDCDisplay_courant.fichier,self.jdc_homard)
+ self.JDCDisplay_courant.stop_modif()
+ self.appli.affiche_infos("sauvegarde de "+`self.JDCDisplay_courant.fichier`+" effectuée")
+ ok = 1
+
+ if ok and hasattr( self.appli, 'salome'):
+ # eficas a été lancé à partir deSalome
+ #1)ajout dans l'arbre d'étude du nom du jdc
+ ok, msg = self.appli.addJdcInSalome( self.JDCDisplay_courant.fichier )
+
+ #2)CS_pbruno ??
+ from panelsSalome import SALOME_UNIQUE_BASE_Panel
+ if len(SALOME_UNIQUE_BASE_Panel.dict_fichier_unite) > 0 :
+ print 'CS_pbruno if len(SALOMchier_unite) > 0 :???????'
+ self.appli.creeConfigTxt( self.appli.CONFIGURATION.initialdir, SALOME_UNIQUE_BASE_Panel.dict_fichier_unite )
+
+ #3)création/mise à jours d'un maillage dans Salome
+ self.appli.createOrUpdateMesh()
+ return ok
+
+ def asknomsauvegardeJDC(self):
+ """ Demande à l'utilsateur le nom sous lequel il veut sauvegarder le JDC courant """
+ titre = "Sauvegarde d'un fichier de commandes "+self.code
+ if self.code == 'ASTER':
+ defext = ".comm"
+ filtyp = ( ("ASTER", ".comm"),)
+ else :
+ defext = ".py"
+ filtyp = ( (self.code, ".py"),)
+ sauvegarde = asksaveasfilename(title=titre,
+ defaultextension=defext,
+ filetypes = filtyp,
+ initialdir = self.initialdir)
+ #initialdir = self.appli.CONFIGURATION.initialdir)
+ #initialdir = self.appli.CONFIGURATION.rep_user)
+ if sauvegarde :
+ if not save_in_file(sauvegarde,self.jdc_fini,None) :
+ showinfo("Erreur","Problème à la sauvegarde du fichier "+`sauvegarde`)
+ return 0
+ else :
+ if self.appli.format_fichier.get() == 'homard':
+ self.save_homard(sauvegarde,self.jdc_homard)
+ self.JDCDisplay_courant.stop_modif()
+ self.appli.affiche_infos("Sauvegarde effectuée")
+ if sauvegarde != self.JDCDisplay_courant.fichier :
+ # l'utilisateur a sauvegardé le JDC sous un autre nom
+ self.JDCDisplay_courant.fichier = sauvegarde
+ self.JDCName = self.JDC.nom = stripPath(sauvegarde)
+ self.JDC.changefichier(sauvegarde)
+ self.changeNomPage()
+ return 1
+ else :
+ return 0
+
+ def changeNomPage(self):
+ """ Change le nom de l'onglet contenant le JDC courant : en fait détruit l'actuel
+ et recrée un autre onglet à la même place avec le bon nom
+ """
+ nom = self.JDCName
+ self.JDCDisplay_courant.jdc.nom = nom
+ nom_page = self.nb.getcurselection()
+ num_page = self.nb.index(nom_page)
+ tab = self.nb.tab(num_page)
+ tab.configure(text = nom)
+
+ def exitEFICAS(self,event=None):
+ """
+ Permet de sortir d'EFICAS en demandant à l'utilisateur
+ s'il veut sauvegarder les modifications en cours
+ """
+ liste = self.GetListeJDCaSauvegarder()
+ if liste != [] :
+ # Certains fichiers n'ont pas été sauvegardés ...
+ if askyesno("Enregistrer modifications","Enregistrer les modifications ?") :
+ test = self.saveall(liste)
+ if test != 1 :
+ return
+ if askyesno ("Quitter","Voulez-vous vraiment quitter l'application ?") :
+ for JDCDisplay in self.liste_JDCDisplay:
+ JDCDisplay.jdc.supprime()
+ self.appli.quit()
+ return
+
+ def GetListeJDCaSauvegarder(self) :
+ """ Retourne parmi la liste de tous les JDC ouverts la liste de ceux qui ont été modifiés """
+ if not self.JDCDisplay_courant : return []
+ if len(self.liste_JDCDisplay) == 0 : return l
+ l = []
+ for JDCDisplay in self.liste_JDCDisplay:
+ if JDCDisplay.modified == 'o' :
+ l.append(JDCDisplay)
+ return l
+
+ def copy(self,event=None):
+ """
+ Lance la copie sur le JDC courant
+ """
+ if self.JDCDisplay_courant : self.JDCDisplay_courant.doCopy()
+
+ def paste(self,event=None):
+ """
+ Lance le collage sur le JDC courant
+ """
+ if self.JDCDisplay_courant : self.JDCDisplay_courant.doPaste()
+
+ def cut(self,event=None):
+ """
+ Lance le cut sur le JDC courant
+ """
+ if self.JDCDisplay_courant: self.JDCDisplay_courant.doCut()
+
+ def delete(self):
+ """
+ Lance la suppression du noeud courant
+ """
+ if not self.JDCDisplay_courant : return
+ self.JDCDisplay_courant.init_modif()
+ self.JDCDisplay_courant.node_selected.delete()
+
+ def visuJDC_py(self,event=None):
+ """
+ Méthode permettant d'afficher dans une fenêtre à part l'écho au
+ format python du jdc courant
+ """
+ if not hasattr(self,'JDC') : return
+ jdc_fini = self.get_text_JDC('python')
+ if jdc_fini == None : return
+ Fenetre(self.appli,
+ titre = 'fichier '+ self.JDCName + ' à la syntaxe Python',
+ texte = jdc_fini)
+
+ def visuJDC(self):
+ """
+ Méthode permettant d'afficher dans une fenêtre à part l'écho au
+ format .comm ou .py du jdc courant
+ """
+ if not hasattr(self,'JDC') : return
+ titre = 'fichier '+ self.JDCName + ' à la syntaxe '+ self.code
+ format=self.appli.format_fichier.get()
+ self.jdc_fini = self.get_text_JDC(format)
+ if self.jdc_fini == None : return
+ self.visu_fichier_cmd = Fenetre(self.appli,titre=titre,texte = self.jdc_fini)
+
+ def get_text_JDC(self,format):
+ if generator.plugins.has_key(format):
+ # Le generateur existe on l'utilise
+ g=generator.plugins[format]()
+ jdc_formate=g.gener(self.JDC,format='beautifie')
+ if not g.cr.estvide():
+ self.appli.affiche_infos("Erreur à la generation")
+ showerror("Erreur à la generation","EFICAS ne sait pas convertir ce JDC")
+ return
+ else:
+ return jdc_formate
+ else:
+ # Il n'existe pas c'est une erreur
+ self.appli.affiche_infos("Format %s non reconnu" % format)
+ showerror("Format %s non reconnu" % format,"EFICAS ne sait pas convertir le JDC en format %s "% format)
+ return
+
+ def view_doc(self):
+ """
+ Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
+ - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
+ - indication du chemin d'accès aux fichiers pdf à revoir : trop statique
+ """
+ if not self.JDCDisplay_courant : return
+ try:
+ cle_doc = self.JDCDisplay_courant.node_selected.item.get_docu()
+ if cle_doc == None : return
+ cle_doc = string.replace(cle_doc,'.','')
+ cle_doc = string.replace(cle_doc,'-','')
+ commande = self.appli.CONFIGURATION.exec_acrobat
+ nom_fichier = cle_doc+".pdf"
+ fichier = os.path.abspath(os.path.join(self.appli.CONFIGURATION.path_doc,nom_fichier))
+ if os.name == 'nt':
+ os.spawnv(os.P_NOWAIT,commande,(commande,fichier,))
+ elif os.name == 'posix':
+ script ="#!/usr/bin/sh \n%s %s&" %(commande,fichier)
+ pid = os.system(script)
+ except AttributeError:
+ traceback.print_exc()
+ pass
+
+ def visu_a_plat(self,event=None):
+ """
+ Méthode permettant d'afficher dans une fenêtre à part l'écho 'à plat' du jdc courant
+ """
+ if not hasattr(self,'JDC') : return
+ titre = 'fichier '+ self.JDCName + ' à plat '
+ self.jdc_fini = self.get_text_JDC('aplat')
+ if self.jdc_fini == None : return
+ self.visu_fichier_cmd = Fenetre(self.appli,titre=titre,texte = self.jdc_fini)
+
+ def visu_txt_brut_JDC(self,event=None):
+ """
+ Méthode permettant d'afficher le jeu de commandes tel qu'il a été passé au JDC
+ """
+ if not hasattr(self,'JDC') : return
+ titre = "fichier de commandes utilisateur"
+ #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")
+ return
+ os.chdir(self.appli.dir)
+ 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):
+ """
+ Affichage des valeurs des paramètres relus par Eficas
+ """
+ self.appli.CONFIGURATION.affichage_fichier_ini()
+
+ def saveall(self,liste):
+ """
+ Sauvegarde tous les JDC contenus dans liste
+ """
+ test = 1
+ for JDCDisplay in liste :
+ self.JDCDisplay_courant=JDCDisplay
+ self.JDC = JDCDisplay.jdc
+ test = test * self.saveJDC(echo = 'non')
+ return test
+
+ def save_homard(self,nom,texte):
+ file_homard=nom+'.conf_homard'
+ try:
+ f=open(file_homard,'w')
+ for ligne in texte:
+ f.write(ligne)
+ f.write('\n')
+ f.close()
+ except:
+ print "Pb a la sauvegarde sous le format homard"
+ if hasattr( self.appli, 'salome'):
+ import eficasEtude
+ self.appli.salome.rangeInStudy(file_homard,"_CONF")
+
+# ---------------------------------------------------------------------------
+# Méthodes liées aux mots-clés inconnus
+# ---------------------------------------------------------------------------
+
+ def mc_inconnus(self):
+ 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,event=None):
+ AIDE.go(master=self.parent)
+
+ def update_jdc_courant(self):
+ self.JDCDisplay_courant.update()
+
+ def TraduitFichier(self):
+ directory = self.appli.CONFIGURATION.rep_user
+ FichieraTraduire = askopenfilename(title="Nom du Fichier à Traduire",
+ defaultextension=".comm",
+ initialdir = directory
+ )
+ if (FichieraTraduire == "" or FichieraTraduire == () ) : return
+ i=FichieraTraduire.rfind(".")
+ Feuille=FichieraTraduire[0:i]
+ FichierTraduit=Feuille+"v8.comm"
+ log=self.initialdir+"/convert.log"
+ os.system("rm -rf "+log)
+ os.system("rm -rf "+FichierTraduit)
+ Pmw.showbusycursor()
+ traduitV7V8.traduc(FichieraTraduire,FichierTraduit,log)
+ Pmw.hidebusycursor()
+ Entete="Fichier Traduit : "+FichierTraduit +"\n\n"
+ titre = "conversion de "+ FichieraTraduire
+
+ if os.stat(log)[6] != 0L :
+ f=open(log)
+ texte_cr= f.read()
+ f.close()
+ else :
+ texte_cr = Entete
+ commande="diff "+FichieraTraduire+" "+FichierTraduit+" >/dev/null"
+ try :
+ if os.system(commande) == 0 :
+ texte_cr = texte_cr + "Pas de difference entre le fichier V7 et le fichier traduit"
+ except :
+ pass
+
+ cptrendu = FenetreSurLigneWarning(self.appli,titre=titre,texte=texte_cr)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 os
+import sys
+import types
+import string
+import Pmw
+from Tkinter import *
+
+# Modules Eficas
+from InterfaceTK import fontes
+from treewidget import Tree
+from Editeur.Objecttreeitem import TreeItem
+from Accas import AsException
+from Noyau.N_CR import justify_text
+from Accas import OPER,PROC,MACRO,FORM
+from Accas import FACT,BLOC,SIMP
+
+#
+__version__="$Name: BR_V1_12qt $"
+__Id__="$Id: catabrowser.py,v 1.4 2004-09-10 15:51:48 eficas Exp $"
+#
+class Tableau:
+ incr = 10
+ def __init__(self,parent,colonnes):
+ self.parent = parent
+ self.colonnes = colonnes
+ self.init()
+
+ def init(self):
+ # recherche du nombre maxi de lignes et de colonnes....
+ for col in self.colonnes :
+ nb_l = 0
+ if len(col) > nb_l : nb_l = len(col)
+ self.nb_lignes = nb_l
+ self.nb_colonnes = len(self.colonnes)
+ # initialisation des coordonnées dans le canvas
+ self.x0 = self.incr
+ self.y0 = self.incr
+ self.x = self.x0 + self.incr
+ self.y = self.y0 + self.incr
+
+ def affiche(self):
+ self.scrolledcanvas=Pmw.ScrolledCanvas(self.parent,
+ hull_width=1.,
+ hull_height=1.,
+ borderframe=1)
+ Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
+ self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
+ self.canvas = self.scrolledcanvas.component('canvas')
+ self.affiche_colonnes()
+
+ def affiche_colonnes(self):
+ for i in range(self.nb_lignes):
+ self.affiche_ligne(i)
+ self.aligne_colonnes()
+ self.trace_traits()
+ self.scrolledcanvas.resizescrollregion()
+
+ def get_xy_max(self):
+ try:
+ x0,y0,xmax,ymax = self.canvas.bbox(ALL)
+ return xmax,ymax
+ except:
+ return None,None
+
+ def trace_traits(self):
+ xmax,ymax = self.get_xy_max()
+ if not xmax : return
+ xmax = xmax+self.incr
+ ymax = ymax+self.incr
+ # trace les traits horizontaux
+ for i in range(self.nb_lignes):
+ tag_lig = 'ligne_'+`i`
+ l_id = self.canvas.find_withtag(tag_lig)
+ x0,y0,x1,y1 = self.bbox(l_id)
+ self.canvas.create_line(x0-self.incr,y0-self.incr,xmax,y0-self.incr)
+ self.canvas.create_line(self.x0,ymax,xmax,ymax)
+ # trace les traits verticaux
+ for j in range(self.nb_colonnes):
+ tag_col = 'colonne_'+`j`
+ l_id = self.canvas.find_withtag(tag_col)
+ x0,y0,x1,y1 = self.bbox(l_id)
+ self.canvas.create_line(x0-self.incr,y0-self.incr,x0-self.incr,ymax)
+ self.canvas.create_line(xmax,self.y0,xmax,ymax)
+
+ def bbox(self,l_id):
+ x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
+ for id in l_id[1:]:
+ x2,y2,x3,y3 = self.canvas.bbox(id)
+ x0 = min(x2,x0)
+ y0 = min(y2,y0)
+ x1 = max(x3,x1)
+ y1 = max(y3,y1)
+ return x0,y0,x1,y1
+
+ def affiche_ligne(self,num_lig):
+ tag_lig = 'ligne_'+`num_lig`
+ num_col = 0
+ for col in self.colonnes:
+ tag_col = 'colonne_'+`num_col`
+ x = 100*num_col+self.x
+ id = self.canvas.create_text(x,self.y,
+ text = justify_text(col[num_lig],cesure=60),
+ tag=(tag_lig,tag_col),
+ anchor='nw',
+ font = fontes.canvas)
+ x0,y0,x1,y1 = self.canvas.bbox(id)
+ num_col = num_col+1
+ l_id = self.canvas.find_withtag(tag_lig)
+ x0,y0,x1,y1 = self.bbox(l_id)
+ self.y = y1 + 2*self.incr
+
+ def aligne_colonnes(self):
+ num_col = 0
+ for col in self.colonnes:
+ tag_col = 'colonne_'+`num_col`
+ l_id = self.canvas.find_withtag(tag_col)
+ if not l_id : continue
+ x0,y0,x1,y1 = self.bbox(l_id)
+ self.move(x1+self.incr,self.colonnes[num_col+1:],num_col+1)
+ num_col = num_col+1
+
+ def move(self,x,colonnes,num):
+ num_col = num
+ for col in colonnes:
+ tag_col = 'colonne_'+`num_col`
+ l_id = self.canvas.find_withtag(tag_col)
+ if not l_id : continue
+ x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
+ self.canvas.move(tag_col,x+self.incr-x0,0)
+ num_col = num_col+1
+
+class CATAPanel(Frame) :
+ """ Classe servant à créer le panneau représentant l'objet sélectionné dans l'arbre"""
+ def __init__(self,parent,panneau,node) :
+ self.parent=parent
+ self.panneau = panneau
+ self.node=node
+ Frame.__init__(self,self.panneau)
+ self.place(x=0,y=0,relheight=1,relwidth=1)
+ self.init()
+
+ def init(self):
+ # création du label initial
+ label = Label(self,
+ text = 'Attributs de '+self.node.item.labeltext,
+ font = fontes.standard_gras_souligne)
+ label.pack(side='top',pady=10)
+ # création des listes correspondant aux colonnes du tableau à afficher
+ colonne1,colonne2 = self.get_listes()
+ # affichage du tableau
+ self.tableau = Tableau(self,(colonne1,colonne2))
+ self.tableau.affiche()
+
+ def get_listes(self):
+ self.node.item.get_dico_attributs()
+ l_cles_attributs = self.node.item.d_attributs.keys()
+ l_cles_attributs.sort()
+ ind=0
+ liste1 = []
+ liste2=[]
+ for nom_attr in l_cles_attributs :
+ valeur = self.node.item.d_attributs[nom_attr]
+ if type(valeur) == types.TupleType:
+ texte =''
+ for elem in valeur:
+ if type(elem) == types.ClassType:
+ texte = texte + elem.__name__
+ else:
+ texte = texte + str(elem)
+ elif type(valeur) == types.ClassType :
+ texte = valeur.__name__
+ else:
+ texte = str(valeur)
+ liste1.append(nom_attr)
+ liste2.append(texte)
+ return liste1,liste2
+
+class CATAItem(TreeItem):
+ panel = CATAPanel
+ def __init__(self,appli,labeltext,object,setfunction=None,objet_cata_ordonne = None):
+ self.appli = appli
+ self.labeltext = labeltext
+ self.object=object
+ self.setfunction = setfunction
+ self.objet_cata_ordonne = objet_cata_ordonne
+
+ def get_dico_fils(self):
+ d_fils = {}
+ if type(self.object) != types.TupleType:
+ for e in dir(self.object):
+ cmd = getattr(self.object,e)
+ if isCMD(cmd) :
+ d_fils[string.strip(cmd.nom)] = cmd
+ else:
+ for obj in self.object :
+ for e in dir(obj):
+ cmd = getattr(obj,e)
+ if isCMD(cmd) :
+ d_fils[string.strip(cmd.nom)] = cmd
+ self.d_fils = d_fils
+
+ def get_dico_attributs(self):
+ d_attributs ={}
+ if type(self.object) == types.TupleType :
+ self.d_attributs = d_attributs
+ return
+ l_noms_attributs = ['nom','op','sd_prod','reentrant','repetable','fr','docu','into','valide_vide','actif',
+ 'regles','op_init','niveau','definition','code','niveaux','statut',
+ 'defaut','min','max','homo','position','val_min','val_max','condition']
+ for nom_attribut in l_noms_attributs :
+ if hasattr(self.object,nom_attribut):
+ attr = getattr(self.object,nom_attribut)
+ d_attributs[nom_attribut] = attr
+ self.d_attributs = d_attributs
+
+ 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,'ordre_mc'):
+ return self.objet_cata_ordonne.ordre_mc
+ else :
+ l=self.objet_cata_ordonne.keys()
+ l.sort()
+ return l
+
+ def GetLabelText(self):
+ return self.labeltext,None,None
+
+ def get_fr(self):
+ return ''
+
+ def isMCList(self):
+ return 0
+
+ def GetSubList(self):
+ sublist=[]
+ if not hasattr(self,'d_fils'):
+ self.get_dico_fils()
+ # on classe les fils dans l'odre du catalogue ...
+ 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.entites[k]
+ else :
+ objet_cata = self.objet_cata_ordonne.get(k,None)
+ item = make_objecttreeitem(self.appli,k + " : ",self.d_fils[k],
+ objet_cata_ordonne = objet_cata)
+ sublist.append(item)
+ return sublist
+
+ def GetIconName(self):
+ return 'ast-green-square'
+
+ def isactif(self):
+ return 1
+
+class CMDItem(CATAItem):
+
+ def get_dico_fils(self):
+ self.d_fils = self.object.entites
+
+class SIMPItem(CATAItem):
+ d_fils={}
+ d_attributs={}
+
+ def GetIconName(self):
+ return 'ast-green-ball'
+
+ def IsExpandable(self):
+ return 0
+
+class FACTItem(CMDItem):
+ def GetIconName(self):
+ return 'ast-green-los'
+
+class BLOCItem(FACTItem): pass
+
+class ATTRIBUTItem(SIMPItem):
+ def get_dico_attributs(self):
+ self.d_attributs = {}
+
+ def GetSubList(self):
+ return []
+
+ def IsExpandable(self):
+ return 0
+
+ def GetText(self):
+ return self.object
+
+ def GetIconName(self):
+ return 'aucune'
+
+class CataBrowser:
+ def __init__(self,parent,appli,cata,item = None):
+ self.parent = parent
+ self.cata = cata
+ self.appli = appli
+ self.item = item
+ self.init()
+
+ def close(self):
+ self.top.destroy()
+
+ def init(self):
+ self.nodes={}
+ self.top = Pmw.Dialog(self.parent,
+ title = "Visualisation d'un catalogue",
+ buttons=('OK',),
+ command = self.quit)
+ self.pane = Pmw.PanedWidget(self.top.component('dialogchildsite'),
+ hull_width = 800,
+ hull_height = 500,
+ orient = 'horizontal')
+ self.pane.add('canvas',min = 0.4, max = 0.6, size = 0.5)
+ self.pane.add('panel',min = 0.4, max = 0.6, size = 0.5)
+ self.pane.pack(expand =1, fill = 'both')
+ self.scrolledcanvas = Pmw.ScrolledCanvas(self.pane.pane('canvas'),
+ hull_width=1.,
+ hull_height=1.,
+ borderframe=1)
+ Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
+ self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
+ if self.item == None :
+ self.item = CATAItem(self.appli,"Catalogue",self.cata)
+ self.tree = Tree(self.appli,self.item,self.scrolledcanvas,command = self.select_node)
+ self.tree.draw()
+ self.node = self.tree.node_selected
+
+ def select_node(self,node):
+ self.nodes[node]=self.create_panel(node)
+
+ def create_panel(self,node):
+ if hasattr(node.item,"panel"):
+ return getattr(node.item,"panel")(self,self.pane.pane('panel'),node)
+
+ def quit(self,nom_bouton) :
+ self.top.destroy()
+
+ def settitle(self):
+ self.top.wm_title("Browser de catalogue " )
+ self.top.wm_iconname("CataBrowser")
+
+
+dispatch = {
+ OPER : CMDItem,
+ PROC : CMDItem,
+ MACRO : CMDItem,
+ SIMP : SIMPItem,
+ FACT : FACTItem,
+ BLOC : BLOCItem,
+}
+
+def TYPE(o):
+ if isinstance(o,OPER):return OPER
+ elif isinstance(o,PROC):return PROC
+ elif isinstance(o,MACRO):return MACRO
+ elif isinstance(o,FORM):return MACRO
+ elif isinstance(o,SIMP):return SIMP
+ elif isinstance(o,FACT):return FACT
+ elif isinstance(o,BLOC):return BLOC
+ else:return type(o)
+
+def make_objecttreeitem(appli,labeltext, object, setfunction=None,objet_cata_ordonne=None):
+ t = TYPE(object)
+ if dispatch.has_key(t):
+ c = dispatch[t]
+ else:
+ #print 'on a un objet de type :',t,' ',object
+ c = ATTRIBUTItem
+ return c(appli,labeltext, object, setfunction = setfunction,objet_cata_ordonne=objet_cata_ordonne)
+
+def isCMD(cmd):
+ return isinstance(cmd,OPER) or isinstance(cmd,PROC) or isinstance(cmd,MACRO) or isinstance(cmd,FORM)
+
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 os
+import sys
+import types
+import string
+import Pmw
+from widgets import showinfo
+from Tkinter import *
+
+# Modules Eficas
+from InterfaceTK import fontes
+from widgets import *
+from treewidget import Tree
+from Editeur.Objecttreeitem import TreeItem
+from Accas import AsException
+from Noyau.N_CR import justify_text
+
+from Accas import ASSD,GEOM
+import definition_cata
+
+#
+__version__="$Name: BR_V1_12qt $"
+__Id__="$Id: cataediteur.py,v 1.9 2005-12-07 10:17:21 eficas Exp $"
+#
+
+Fonte_Niveau = fontes.canvas_gras_italique
+
+class Panel(Frame) :
+ """ Classe servant de classe mère à toutes celles représentant les
+ panneaux à afficher en fonction de la nature de l'objet en cours
+ Elle est toujours dérivée."""
+ def __init__(self,parent,panneau,node) :
+ self.parent=parent
+ self.panneau = panneau
+ self.node=node
+ Frame.__init__(self,self.panneau)
+ self.place(x=0,y=0,relheight=1,relwidth=1)
+ #self.creer_boutons()
+ self.init()
+
+ def creer_boutons(self):
+ """ Méthode créant les boutons se trouvant dans la partie contextuelle d'EFICAS
+ (à droite sous les onglets ) """
+ self.fr_but = Frame(self,height=30)
+ self.fr_but.pack(side='bottom',fill='x')
+ self.bouton_com = Button(self.fr_but,
+ text = 'Commentaire',
+ command = self.ajout_commentaire,
+ width=14)
+ self.bouton_sup = Button(self.fr_but,
+ text = "Supprimer",
+ command=self.supprimer,
+ width=14)
+ self.bouton_doc = Button(self.fr_but,
+ text="Documentation",
+ command=self.visu_doc,
+ width=14)
+ self.bouton_cata = Button(self.fr_but,
+ text = "Catalogue",
+ command = self.show_catalogue,
+ width=14)
+ if self.parent.appli.CONFIGURATION.isdeveloppeur == 'OUI':
+ self.bouton_sup.place(relx=0.25,rely = 0.5,relheight = 0.8,anchor='w')
+ self.bouton_cata.place(relx=0.5,rely = 0.5,relheight = 0.8,anchor='w')
+ self.bouton_doc.place(relx=0.75,rely = 0.5,relheight = 0.8,anchor='w')
+ else:
+ self.bouton_sup.place(relx=0.3,rely = 0.5,relheight = 0.8,anchor='w')
+ self.bouton_doc.place(relx=0.7,rely = 0.5,relheight = 0.8,anchor='w')
+
+ def show_catalogue(self):
+ try:
+ genea = self.node.item.get_genealogie()
+ self.parent.appli.browser_catalogue_objet(genea)
+ except Exception,e:
+ traceback.print_exc()
+
+ def efface(self):
+ self.node.efface()
+
+ def ajout_commentaire(self,ind='after'):
+ """ Ajoute un commentaire à l'intérieur du JDC, par défaut après le noeud en cours"""
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ return self.node.append_brother("COMMENTAIRE",ind)
+
+ def ajout_commentaire_first(self):
+ """ Ajoute un commentaire en début de JDC"""
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ return self.node.append_child("COMMENTAIRE",'first')
+
+ def visu_doc(self):
+ """ Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
+ - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
+ - indication du chemin d'accès aux fichiers pdf à revoir : trop statique"""
+ cle_doc = self.parent.appli.get_docu(self.node)
+ if cle_doc == None : return
+ cle_doc = string.replace(cle_doc,'.','')
+ commande = self.parent.appli.CONFIGURATION.exec_acrobat
+ nom_fichier = cle_doc+".doc"
+ rep_fichier = cle_doc[0:2]
+ fichier = os.path.abspath(os.path.join(self.parent.appli.CONFIGURATION.path_doc,rep_fichier,nom_fichier))
+ print 'commande =',commande
+ print 'fichier =',fichier
+ print 'existe =',os.path.isfile(fichier)
+ if os.name == 'nt':
+ os.spawnv(os.P_NOWAIT,commande,(commande,fichier))
+ elif os.name == 'posix':
+ script ="#!/usr/bin/sh \n%s %s" %(commande,nom_fichier)
+ pid = os.system(script)
+
+ def supprimer(self):
+ """ Suppression du noeud courant """
+ 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 """
+ self.tkraise()
+
+ def selectMC(self,name):
+ """ On retrouve le mot-clé sous le curseur pour affichage du fr """
+ cmd=self.node.item.get_definition()
+ texte_infos = ''
+ for e in cmd.entites.keys() :
+ if e == name :
+ texte_infos=getattr(cmd.entites[e],'fr')
+ break
+ if texte_infos == '' : texte_infos="Pas d'infos disponibles"
+ self.parent.appli.affiche_infos(texte_infos)
+
+ def defMC(self,name):
+ """ On ajoute un mot-clé à la commande : subnode """
+ if name == SEPARATEUR:return
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ if name != "COMMENTAIRE":
+ self.node.append_child(name)
+ else :
+ self.ajout_commentaire()
+
+ def selectFilsCmd(self,name):
+ pass
+
+ def defFilsCmd(self,name):
+ pass
+
+ def defCmdFirst(self,name):
+ """ On ajoute une commande ou un commentaire au début du fichier de commandes """
+ if name == SEPARATEUR:return
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ if name != "COMMENTAIRE":
+ new_node = self.node.append_child(name,'first')
+ else :
+ new_node = self.ajout_commentaire_first()
+
+ def add_commande_avant(self,event=None):
+ pass
+
+ def add_commande_apres(self,event=None):
+ pass
+
+class OngletPanel(Panel) :
+ """ Cette classe est virtuelle et doit être dérivée
+ Elle contient les principales méthodes d'affichage des différents onglets"""
+
+ def raisecmd(self,page):
+ self.nb.page(page).focus_set()
+ if page == 'Concept': self._any.focus()
+
+ def affiche(self):
+ page=self.nb.getcurselection()
+ self.nb.page(page).focus_set()
+ if page == 'Concept':self._any.component('entry').focus_set()
+ self.tkraise()
+
+ def makeConceptPage(self,page):
+ """ Crée la page de saisie du nom du concept """
+ self.label = Label(page,text='Nom du concept :')
+ self.label.place(relx=0.1,rely=0.4)
+ self._any = Entry(page,relief='sunken')
+ self._any.place(relx=0.35,rely=0.4,relwidth=0.5)
+ self._any.bind("<Return>",lambda e,s=self:s.execConcept())
+ self._any.bind("<KP_Enter>",lambda e,s=self:s.execConcept())
+ self._any.insert(0,self.node.item.GetText())
+ type_sd = self.node.item.object.get_type_sd_prod()
+ if type_sd :
+ txt = "L'opérateur courant retourne un objet de type %s" %type_sd
+ self.label = Label(page, text = txt)
+ self.label.place(relx=0.5,rely=0.55,anchor='n')
+ self._any.focus()
+
+ def makeCommandePage(self,page):
+ """ Affiche la page d'ajout d'une commande relativement à l'objet commande sélectionné """
+ titre = "Où voulez-vous insérer une commande par rapport à %s" %self.node.item.object.nom
+ Label(page,text=titre).place(relx=0.5,rely=0.2,anchor='w')
+ b_avant = Button(page,text='AVANT',
+ command = self.node.item.add_commande_avant)
+ b_apres = Button(page,text='APRES',
+ command = self.node.item.add_commande_apres)
+ b_avant.place(relx=0.35,rely=0.5,anchor='w')
+ b_apres.place(relx=0.65,rely=0.5,anchor='w')
+
+ def deselectMC(self,name):
+ self.parent.appli.affiche_infos('')
+
+ def get_liste_cmd(self):
+ listeCmd = self.node.item.object.niveau.definition.get_liste_cmd()
+ return listeCmd
+
+ def get_liste_fils_cmd(self):
+ return ['Mot-clé simple','Mot-clé facteur','Bloc']
+
+ def makeMoclesPage(self,page):
+ frame1 = Frame(page,height = 20)
+ frame1.pack(side='top',fill='x')
+ label = Label(frame1,text ="Le mot-clé choisi sera ajouté à la fin du catalogue")
+ label.pack(side='top')
+ frame2 = Frame(page)
+ frame2.pack(side='top',fill='both',expand=1)
+ liste_cmd = self.get_liste_fils_cmd()
+ liste_commandes = (("<Enter>",self.selectFilsCmd),
+ ("<Leave>",self.deselectFilsCmd),
+ ("<Double-Button-1>",self.defFilsCmd))
+ Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes,titre = "Mots-clés")
+ Liste.affiche_liste()
+
+ def deselectFilsCmd(self,name):
+ pass
+
+ def makeJDCPage(self,page):
+ 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")
+ Liste.affiche_liste()
+
+ def makeReglesPage(self,page) :
+ regles = []
+ regles = self.node.item.get_regles()
+ dictionnaire = self.node.item.get_mc_presents()
+ texte_regles = []
+ l_regles_en_defaut=[]
+ if len(regles) > 0:
+ i = 0
+ for regle in regles :
+ texte_regles.append(regle.gettext())
+ texte,test = regle.verif(dictionnaire)
+ if test == 0 : l_regles_en_defaut.append(i)
+ i = i+1
+ Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
+ Liste.affiche_liste()
+ #self.afficheListe(page,texte_regles,self.selectRegle,self.execRegle)
+
+ def execConcept(self):
+ """ Nomme le concept SD retourné par l'étape """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ nom = self._any.get()
+ # Pourquoi node.etape ???
+ #test,mess = self.node.etape.item.nomme_sd(nom)
+ test,mess = self.node.item.nomme_sd(nom)
+ self.parent.appli.affiche_infos(mess)
+ self.node.racine.update()
+
+ def changed(self):
+ pass
+
+ def makeAttributsPage(self,page):
+ l_attributs=self.node.item.object.attributs
+ d_defauts = self.node.item.object.attributs_defauts
+ for attribut in l_attributs :
+ attr = self.node.item.object.entites_attributs.get(attribut,None)
+ if attr.valeur is d_defauts[attribut] :
+ texte = attribut+' = '+repr(attr.valeur)+' (defaut)'
+ else:
+ texte = attribut+' = '+repr(attr.valeur)
+ Label(page,text=texte).pack(side='top')
+
+ def makeSimpPage(self,page):
+ texte = "Où voulez-vous ajouter un mot-clé simple ?"
+ Label(page,text=texte).place(relx=0.5,rely=0.3,anchor='center')
+ b1 = Button(page,text='AVANT '+self.node.item.object.nom,command=self.add_simp_avant)
+ b2 = Button(page,text='APRES '+self.node.item.object.nom,command=self.add_simp_apres)
+ b1.place(relx=0.5,rely=0.5,anchor='center')
+ b2.place(relx=0.5,rely=0.6,anchor='center')
+
+ def add_simp_avant(self,event=None):
+ """
+ Ajoute un mot-clé simple avant celui courant
+ """
+ self.node.append_brother('new_simp','before')
+ self.node.update()
+
+ def add_simp_apres(self,event=None):
+ """
+ Ajoute un mot-clé simple après celui courant
+ """
+ self.node.append_brother('new_simp','after')
+ self.node.update()
+
+class TYPEPanel(Frame):
+ def __init__(self,parent,panneau,node) :
+ self.parent=parent
+ self.panneau = panneau
+ self.node=node
+ Frame.__init__(self,self.panneau)
+ self.place(x=0,y=0,relheight=1,relwidth=1)
+ self.creer_texte()
+
+ def creer_texte(self):
+ texte = "Le noeud sélectionné correspond à un type\n"
+ self.label = Label(self,text=texte)
+ self.label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
+
+class OPERPanel(OngletPanel):
+ def init(self):
+ nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+
+ nb.pack(fill = 'both', expand = 1)
+ self.nb=nb
+ nb.add('Mocles', tab_text='Ajouter mots-clés')
+ nb.add('Commandes',tab_text='Ajouter une commande')
+ self.makeMoclesPage(nb.page("Mocles"))
+ self.makeCommandePage(nb.page("Commandes"))
+ nb.tab('Mocles').focus_set()
+ nb.setnaturalsize()
+ self.affiche()
+
+class SIMPPanel(OngletPanel):
+ def init(self):
+ nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+ nb.pack(fill = 'both', expand = 1)
+ self.nb=nb
+ nb.add('generaux', tab_text='Données générales')
+ nb.add('ihm',tab_text='Données IHM')
+ nb.add('mocle',tab_text='Ajouter un mot-cle simple')
+ self.makeAttributsGenerauxPage(nb.page("generaux"))
+ self.makeAttributsIHMPage(nb.page("ihm"))
+ self.makeSimpPage(nb.page('mocle'))
+ nb.tab('generaux').focus_set()
+ nb.setnaturalsize()
+ self.affiche()
+
+ def makeAttributsGenerauxPage(self,page):
+ fr1 = Frame(page,bd=1,relief='raised')
+ fr2 = Frame(page,bd=1,relief='raised')
+ fr3 = Frame(page,bd=1,relief='raised')
+ fr4 = Frame(page,bd=1,relief='raised')
+ fr5 = Frame(page,bd=1,relief='raised')
+ fr1.place(relheight=0.14,relwidth=1,rely=0)
+ fr2.place(relheight=0.14,relwidth=1,rely=0.14)
+ fr3.place(relheight=0.29,relwidth=1,rely=0.28)
+ fr4.place(relheight=0.14,relwidth=1,rely=0.57)
+ fr5.place(relheight=0.28,relwidth=1,rely=0.71)
+ # nom du mot-clé
+ Label(fr1,text = 'Nom :').place(relx=0.05,rely=0.3,anchor='w')
+ self.e_nom = Entry(fr1)
+ self.e_nom.place(relx=0.35,rely=0.3,relwidth=0.3,anchor='w')
+ self.e_nom.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('nom',None))
+ self.e_nom.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('nom',None))
+ self.e_nom.insert(0,self.get_valeur_attribut('nom'))
+ # Statut
+ Label(fr1,text='Statut : ').place(relx=0.05,rely=0.7,anchor='w')
+ self.statut=StringVar()
+ valeurs_statut=[('obligatoire','o'),
+ ('facultatif','f'),
+ ('caché','c')
+ ]
+ self.statut.set(self.node.item.object.get_valeur_attribut('statut'))
+ i=0
+ for text,mode in valeurs_statut:
+ b=Radiobutton(fr1,text=text,variable=self.statut,value=mode,
+ command = lambda s=self,m=mode : s.set_valeur_attribut('statut',m))
+ b.place(relx=0.25+i*0.25,rely=0.7,anchor='w')
+ i=i+1
+ # Type ...
+ Label(fr2,text='Type de la valeur : ').place(relx=0.05,rely=0.5,anchor='w')
+ self.e_type = Entry(fr2)
+ self.e_type.place(relx=0.35,rely=0.5,relwidth=0.5,anchor='w')
+ self.e_type.insert(0,self.node.item.object.get_valeur_attribut('type'))
+ # Domaine de validité
+ Label(fr3,text='Domaine de validité : ').place(relx=0.05,rely=0.2,anchor='w')
+ self.domaine = StringVar()
+ self.domaine.set(self.node.item.object.get_valeur_attribut('domaine_validité'))
+ b1=Radiobutton(fr3,text='continu',variable=self.domaine,value='continu',
+ command=lambda s=self,f=fr3 :s.change_domaine(f))
+ b2=Radiobutton(fr3,text='discret',variable=self.domaine,value='discret',
+ command=lambda s=self,f=fr3 :s.change_domaine(f))
+ b1.place(relx=0.35,rely=0.2,anchor='w')
+ b2.place(relx=0.65,rely=0.2,anchor='w')
+ self.change_domaine(fr3)
+ # Défaut ...
+ if self.domaine.get() == 'continu':
+ # le développeur peut donner la valeur qu'il souhaite, moyennant la vérification de type...
+ Label(fr4,text='Valeur par défaut : ').place(relx=0.05,rely=0.5,anchor='w')
+ self.e_defaut = Entry(fr4)
+ self.e_defaut.place(relx=0.35,rely=0.5,relwidth=0.5,anchor='w')
+ if self.node.item.object.get_valeur_attribut('defaut') :
+ self.e_defaut.insert(0,self.node.item.object.get_valeur_attribut('defaut'))
+ self.e_defaut.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('defaut',None))
+ self.e_defaut.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('defaut',None))
+ else :
+ # dans le cas discret, la valeur par défaut doit être dans l'ensemble des valeurs possibles (into)
+ liste = self.node.item.object.get_valeur_attribut('into')
+ if self.node.item.object.get_valeur_attribut('defaut') :
+ self.set_valeur_attribut('defaut',self.node.item.object.get_valeur_attribut('defaut'))
+ if liste == None : liste = []
+ self.e_defaut = Pmw.OptionMenu(fr4,labelpos='w',label_text = "Valeur par défaut : ",
+ items = self.node.item.object.get_valeur_attribut('into'),
+ menubutton_width=30)
+ self.e_defaut.configure(command = lambda e,s=self : s.set_valeur_attribut('defaut',None))
+ self.e_defaut.place(relx=0.05,rely=0.5,anchor='w')
+ # Liste de valeurs ?
+ Label(fr5,text='Liste de valeurs : ').place(relx=0.05,rely=0.2,anchor='w')
+ self.liste_valeurs = BooleanVar()
+ liste_valeurs = [('OUI',1),('NON',0)]
+ self.liste_valeurs.set(0)
+ i=0
+ for text,mode in liste_valeurs:
+ b=Radiobutton(fr5,text=text,variable=self.liste_valeurs,value=mode,
+ command=lambda s=self,f=fr5 :s.change_liste_valeurs(f))
+ b.place(relx=0.35+i*0.2,rely=0.2,anchor='w')
+ i=i+1
+ self.change_liste_valeurs(fr5)
+
+ def makeAttributsIHMPage(self,page):
+ fr1 = Frame(page,height=100,bd=1,relief='raised')
+ fr2 = Frame(page,height=50,bd=1,relief='raised')
+ fr1.pack(side='top',fill='x')
+ fr2.pack(side='top',fill='x')
+ # Champ fr ...
+ Label(fr1,text='Champ fr : ').place(relx=0.05,rely=0.35,anchor='w')
+ self.e_fr = Entry(fr1)
+ self.e_fr.place(relx=0.35,rely=0.35,relwidth=0.6,anchor='w')
+ self.e_fr.insert(0,self.node.item.object.get_valeur_attribut('fr'))
+ # Champ ang ...
+ Label(fr1,text='Champ ang : ').place(relx=0.05,rely=0.70,anchor='w')
+ self.e_ang = Entry(fr1)
+ self.e_ang.place(relx=0.35,rely=0.70,relwidth=0.6,anchor='w')
+ self.e_ang.insert(0,self.node.item.object.get_valeur_attribut('ang'))
+ # Clé documentaire ...
+ Label(fr2,text='Clé documentaire : ').place(relx=0.05,rely=0.50,anchor='w')
+ self.e_docu = Entry(fr2)
+ self.e_docu.place(relx=0.35,rely=0.50,relwidth=0.6,anchor='w')
+ self.e_docu.insert(0,self.node.item.object.get_valeur_attribut('docu'))
+
+ def detruit_widgets(self,l_widgets):
+ for nom_widg in l_widgets :
+ try:
+ widg = getattr(self,nom_widg)
+ widg.place_forget()
+ delattr(self,nom_widg)
+ except:
+ pass
+
+ def change_liste_valeurs(self,fr5):
+ valeur = self.liste_valeurs.get()
+ if valeur == 0 :
+ # pas de liste de valeurs
+ l_widgets=['l_homo','b1_homo','b2_homo','l_min','e_min','l_max','e_max']
+ self.detruit_widgets(l_widgets)
+ elif valeur == 1:
+ # pas de widgets à détruire ...
+ if hasattr(self,'l_homo') :
+ # on est déjà en mode 'liste' --> rien à faire
+ return
+ # homo
+ self.l_homo = Label(fr5,text='Liste homogène : ')
+ self.l_homo.place(relx=0.05,rely=0.4,anchor='w')
+ self.homo = BooleanVar()
+ self.homo.set(self.node.item.object.get_valeur_attribut('homo'))
+ self.b1_homo=Radiobutton(fr5,text='OUI',variable=self.homo,value=1)
+ self.b2_homo=Radiobutton(fr5,text='NON',variable=self.homo,value=0)
+ self.b1_homo.place(relx=0.35,rely=0.4,anchor='w')
+ self.b2_homo.place(relx=0.65,rely=0.4,anchor='w')
+ # min ...
+ self.l_min = Label(fr5,text='Longueur minimale : ')
+ self.l_min.place(relx=0.05,rely=0.6,anchor='w')
+ self.e_min = Entry(fr5)
+ self.e_min.place(relx=0.4,rely=0.6,relwidth=0.3,anchor='w')
+ self.e_min.insert(0,self.node.item.object.get_valeur_attribut('min'))
+ # max ...
+ self.l_max = Label(fr5,text='Longueur maximale : ')
+ self.l_max.place(relx=0.05,rely=0.8,anchor='w')
+ self.e_max = Entry(fr5)
+ self.e_max.place(relx=0.4,rely=0.8,relwidth=0.3,anchor='w')
+ self.e_max.insert(0,self.node.item.object.get_valeur_attribut('max'))
+
+ def change_domaine(self,fr3):
+ valeur = self.domaine.get()
+ if valeur == 'discret' :
+ l_widgets = ['l_val_min','l_val_max','e_val_min','e_val_max']
+ self.detruit_widgets(l_widgets)
+ # into
+ #self.l_into = Label(fr3,text='Ensemble de valeurs : ')
+ #self.l_into.place(relx=0.2,rely=0.5,anchor='w')
+ self.e_into = Pmw.ScrolledListBox(fr3,
+ items=self.node.item.object.get_valeur_attribut('into'),
+ labelpos='w',
+ label_text= 'Ensemble de valeurs : ',
+ listbox_height = 3,
+ dblclickcommand = self.change_into)
+ self.e_into.place(relx=0.05,rely=0.6,relwidth=0.9,anchor='w')
+ #self.e_into.insert(0,self.node.item.object.get_valeur_attribut('into'))
+ elif valeur == 'continu':
+ l_widgets = ['l_into','e_into']
+ self.detruit_widgets(l_widgets)
+ if hasattr(self,'l_val_min'):
+ # on est déjà en mode 'continu' --> rien à faire
+ return
+ # val_min
+ self.l_val_min = Label(fr3,text='Valeur minimale : ')
+ self.l_val_min.place(relx=0.05,rely=0.5,anchor='w')
+ self.e_val_min = Entry(fr3)
+ self.e_val_min.place(relx=0.35,rely=0.5,relwidth=0.5,anchor='w')
+ self.e_val_min.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('val_min',None))
+ self.e_val_min.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('val_min',None))
+ self.set_valeur_attribut('val_min',self.get_valeur_attribut('val_min'))
+ # val_max
+ self.l_val_max = Label(fr3,text='Valeur maximale : ')
+ self.l_val_max.place(relx=0.05,rely=0.8,anchor='w')
+ self.e_val_max = Entry(fr3)
+ self.e_val_max.place(relx=0.35,rely=0.8,relwidth=0.5,anchor='w')
+ self.e_val_max.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('val_max',None))
+ self.e_val_max.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('val_max',None))
+ self.set_valeur_attribut('val_max',self.get_valeur_attribut('val_max'))
+
+# ------------------------------------------------------------------
+# Méthodes de validation des entrées faites par l'utilisateur
+# ------------------------------------------------------------------
+
+ def get_valeur_attribut(self,nom_attr):
+ """
+ Demande à l'item de retourner la valeur de l'attribut nom_attr
+ """
+ return self.node.item.get_valeur_attribut(nom_attr)
+
+ def set_valeur_attribut(self,nom_attr,new_valeur):
+ """
+ Affecte la valeur new_valeur à l'attribut nom_attr
+ Vérifie si celle-ci est valide, sinon restaure l'ancienne
+ """
+ if new_valeur is None :
+ widget = getattr(self,'e_'+nom_attr)
+ if hasattr(widget,'getcurselection'):
+ new_valeur = widget.getcurselection()
+ else:
+ new_valeur = widget.get()
+ print "on affecte %s a %s" %(str(new_valeur),nom_attr)
+ self.node.item.set_valeur_attribut(nom_attr,new_valeur)
+ self.node.update()
+
+ def change_into(self):
+ """
+ Méthode activée par double clic sur la ListBox d'affichage des valeurs discrètes possibles :
+ permet de changer la liste de ces valeurs
+ """
+ showinfo("Fonction non encore disponible",
+ "Vous ne pouvez pas encore modifier la liste into par cette IHM")
+
+class OBJECTItem(TreeItem):
+ def __init__(self,appli,labeltext,object,setfunction=None,objet_cata_ordonne = None):
+ self.appli = appli
+ self.labeltext = labeltext
+ self.object=object
+ self.setfunction = setfunction
+ self.objet_cata_ordonne = objet_cata_ordonne
+
+ def GetLabelText(self):
+ return self.labeltext,None,None
+
+ def get_fr(self):
+ return ''
+
+ def isMCList(self):
+ return 0
+
+ def isactif(self):
+ return 1
+
+ def add_commande_avant(self):
+ pass
+
+ def add_commande_apres(self):
+ pass
+
+ def set_valeur_attribut(self,nom_attr,new_valeur):
+ """
+ Affecte la valeur new_valeur à l'attribut nom_attr
+ Vérifie si celle-ci est valide, sinon restaure l'ancienne
+ """
+ old_valeur = self.object.get_valeur_attribut(nom_attr)
+ self.object.set_valeur_attribut(nom_attr,new_valeur)
+ verificateur = 'verif_'+nom_attr
+ if hasattr(self.object,verificateur):
+ if not getattr(self.object,verificateur)():
+ # la nouvelle valeur de nom_attr n'est pas valide : on restaure l'ancienne (sans vérification)
+ self.object.set_valeur_attribut(nom_attr,old_valeur)
+ print 'changement de valeur refuse'
+ return
+ print 'changement de valeur accepte'
+ self.object.init_modif()
+
+ def get_valeur_attribut(self,nom_attr):
+ """
+ Retourne la valeur de l'attribut nom_attr
+ """
+ return self.object.get_valeur_attribut(nom_attr)
+
+class CATAItem(OBJECTItem):
+ def GetSubList(self):
+ sublist=[]
+ for fils in self.object.entites_fils:
+ item = make_objecttreeitem(self.appli,fils.objet.label + " : ",fils,objet_cata_ordonne=self.objet_cata_ordonne)
+ sublist.append(item)
+ return sublist
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return 'ast-green-square'
+ else:
+ return 'ast-red-square'
+
+ def GetText(self):
+ return "Catalogue %s" %self.appli.code
+
+ def add_commande_avant(self):
+ pass
+
+ def add_commande_apres(self):
+ pass
+
+
+def transforme_liste_dico(liste):
+ d={}
+ for item in liste :
+ d[item.nom]=item
+ return d
+
+class OPERItem(OBJECTItem):
+ panel = OPERPanel
+ def GetSubList(self):
+ sublist=[]
+ # on classe les fils dans l'ordre du catalogue ...
+ l_cles_fils = self.get_liste_mc_ordonnee()
+ # on crée les items fils ...
+ dico_fils = transforme_liste_dico(self.object.entites_fils)
+ 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.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)
+ sublist.append(item)
+ return sublist
+
+ def GetText(self):
+ #return self.object.nom
+ return self.object.get_valeur_attribut('nom')
+
+ def get_liste_mc_ordonnee(self):
+ return self.objet_cata_ordonne.ordre_mc
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return 'ast-green-square'
+ else:
+ return 'ast-red-square'
+
+ def additem(self,name,pos):
+ if isinstance(name,TreeItem) :
+ cmd=self.object.addentite(name.getObject(),pos)
+ else :
+ cmd = self.object.addentite(name,pos)
+ typ = TYPE_COMPLET(cmd)
+ item = make_objecttreeitem(self.appli,typ + " : ", cmd)
+ return item
+
+ def get_attribut(self,nom):
+ if nom == 'nature': return 'OPERATEUR'
+
+ def get_liste_mc_presents(self):
+ return []
+
+ def verif_condition_regles(self,liste):
+ return []
+
+class PROCItem(OPERItem):
+ panel = OPERPanel
+
+class MACROItem(OPERItem):
+ panel = OPERPanel
+
+class SIMPItem(OPERItem):
+ panel = SIMPPanel
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return 'ast-green-ball'
+ else:
+ return 'ast-red-ball'
+
+ def IsExpandable(self):
+ return 0
+
+ def GetSubList(self):
+ return []
+
+class FACTItem(OPERItem):
+ def GetIconName(self):
+ if self.object.isvalid():
+ return 'ast-green-los'
+ else:
+ return 'ast-red-los'
+
+class BLOCItem(FACTItem): pass
+
+class TYPEItem(SIMPItem):
+ panel = TYPEPanel
+ def get_dico_attributs(self):
+ self.d_attributs = {}
+
+ def GetSubList(self):
+ return []
+
+ def IsExpandable(self):
+ return 0
+
+ def GetText(self):
+ return self.object.nom
+
+class NIVEAUItem(OPERItem):
+ def IsExpandable(self):
+ return 1
+
+ def get_liste_mc_ordonnee(self):
+ l=[]
+ for fils in self.object.entites_fils:
+ l.append(fils.nom)
+ return l
+
+ def GetSubList(self):
+ sublist=[]
+ # on classe les fils dans l'ordre du catalogue ...
+ l_cles_fils = self.get_liste_mc_ordonnee()
+ # on crꥠles items fils ...
+ dico_fils = transforme_liste_dico(self.object.entites_fils)
+ 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.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)
+ sublist.append(item)
+ return sublist
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ return self.labeltext,Fonte_Niveau,'#00008b'
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return "ast-green-text"
+ else:
+ return 'ast-red-text'
+
+ def additem(self,name,pos):
+ if isinstance(name,TreeItem) :
+ cmd=self.object.addentite(name.getObject(),pos)
+ else :
+ cmd = self.object.addentite(name,pos)
+ typ = TYPE_COMPLET(obj)
+ item = make_objecttreeitem(self.appli,typ+ " : ", cmd)
+ return item
+
+ def suppitem(self,item) :
+ # item = item de l'ETAPE à supprimer du JDC
+ # item.getObject() = ETAPE ou _C
+ # self.object = JDC
+ itemobject=item.getObject()
+ if self.object.suppentite(itemobject):
+ if isinstance(itemobject,_C):
+ message = "Commentaire supprimé"
+ else :
+ message = "Commande " + itemobject.nom + " supprimée"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos("Pb interne : impossible de supprimer cet objet")
+ return 0
+
+ def GetText(self):
+ return ''
+
+class ATTRIBUTItem(SIMPItem):
+ def get_dico_attributs(self):
+ self.d_attributs = {}
+
+ def GetSubList(self):
+ return []
+
+ def IsExpandable(self):
+ return 0
+
+ def GetText(self):
+ return self.object
+
+ def GetIconName(self):
+ return 'aucune'
+
+class CataEditeur:
+ def __init__(self,parent,appli,cata):
+ self.parent = parent
+ self.cata = definition_cata.CATALOGUE(cata)
+ self.appli = appli
+ self.top = Toplevel()
+ self.top.geometry("800x500")
+ self.top.title("Edition d'un catalogue")
+ self.init()
+
+ def close(self):
+ self.top.destroy()
+
+ def init(self):
+ self.nodes={}
+ self.creerbarremenus()
+ self.pane = Pmw.PanedWidget(self.top,
+ hull_width = 800,
+ hull_height = 500,
+ orient = 'horizontal')
+ self.pane.add('canvas',min = 0.4, max = 0.6, size = 0.45)
+ self.pane.add('panel',min = 0.4, max = 0.6, size = 0.55)
+ self.pane.pack(expand =1, fill = 'both')
+ self.scrolledcanvas = Pmw.ScrolledCanvas(self.pane.pane('canvas'),
+ hull_width=1.,
+ hull_height=1.,
+ borderframe=1)
+ Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
+ self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
+ self.item = CATAItem(self.appli,"Catalogue",
+ self.cata,
+ objet_cata_ordonne = self.appli.readercata.cata_ordonne_dico)
+
+ self.tree = Tree(self.appli,self.item,self.scrolledcanvas,command = self.select_node)
+ self.tree.draw()
+ self.node = self.tree.node_selected
+
+ def creerbarremenus(self) :
+ self.menubar=Menu(self.top)
+ self.filemenu=Menu(self.menubar,tearoff=0)
+ self.filemenu.add_command(label='Quitter',command=self.quit)
+
+ self.editmenu=Menu(self.menubar,tearoff=0)
+ #self.editmenu.add_command(label='Copier',command=self.copy)
+ #self.editmenu.add_command(label='Couper',command=self.cut)
+ #self.editmenu.add_command(label='Coller',command=self.paste)
+
+ self.affichagemenu=Menu(self.menubar,tearoff=0)
+ self.affichagemenu.add_command(label='Rapport de validation',
+ command = self.visuCR)
+ self.affichagemenu.add_command(label='shell',command = self.shell)
+ #self.affichagemenu.add_command(label='Fichier ࡰlat',command=self.visu_a_plat)
+ #self.affichagemenu.add_command(label='Fichier .py',command =self.visuJDC_py)
+ #self.affichagemenu.add_command(label='Fichier source',command = self.visu_txt_brut_JDC)
+ #self.affichagemenu.add_command(label='Param鵲es Eficas',command=self.affichage_fichier_ini)
+
+ #self.optionmenu=Menu(self.menubar,tearoff=0)
+ #self.optionmenu.add_command(label='Catalogue d귥loppeur',command=self.choix_cata_developpeur)
+
+ self.menubar.add_cascade(label='Fichier',menu=self.filemenu)
+ self.menubar.add_cascade(label='Edition',menu=self.editmenu)
+ self.menubar.add_cascade(label='Jeu de commandes',menu=self.affichagemenu)
+ #self.menubar.add_cascade(label='Browsers',menu=self.browsermenu)
+ #self.menubar.add_cascade(label='Catalogue',menu=self.cataloguemenu)
+ #self.menubar.add_cascade(label='Options',menu=self.optionmenu)
+ self.top.configure(menu=self.menubar)
+ self.top.protocol("WM_DELETE_WINDOW",self.quit)
+ self.top.minsize(900,500)
+ self.top.geometry("900x500")
+
+ def shell(self,event=None):
+ import Interp
+ d={'j':self.tree.item.getObject()}
+ Interp.InterpWindow(d,parent=self.parent)
+
+ def visuCR(self,mode='Cata'):
+ txt = str(self.cata.report())
+ titre="Rapport de validation du catalogue"
+ Fenetre(self.appli,titre=titre,texte=txt)
+
+ def select_node(self,node):
+ self.nodes[node]=self.create_panel(node)
+
+ def create_panel(self,node):
+ if hasattr(node.item,"panel"):
+ return getattr(node.item,"panel")(self,self.pane.pane('panel'),node)
+
+ def quit(self) :
+ self.top.destroy()
+
+ def settitle(self):
+ self.top.wm_title("Browser de catalogue " )
+ self.top.wm_iconname("CataBrowser")
+
+
+dispatch = {
+ 'OPER' : OPERItem,
+ 'PROC' : PROCItem,
+ 'MACRO' : MACROItem,
+ 'SIMP' : SIMPItem,
+ 'FACT' : FACTItem,
+ 'BLOC' : BLOCItem,
+ 'TYPE' : TYPEItem,
+ 'NIVEAU' : NIVEAUItem
+}
+
+def TYPE(o):
+ if isinstance(o,definition_cata.OPER_CATA):return 'OPER'
+ elif isinstance(o,definition_cata.PROC_CATA):return 'PROC'
+ elif isinstance(o,definition_cata.MACRO_CATA):return 'MACRO'
+ elif isinstance(o,definition_cata.SIMP_CATA):return 'SIMP'
+ elif isinstance(o,definition_cata.FACT_CATA):return 'FACT'
+ elif isinstance(o,definition_cata.BLOC_CATA):return 'BLOC'
+ elif isinstance(o,definition_cata.TYPE_CATA):return 'TYPE'
+ elif isinstance(o,definition_cata.NIVEAU_CATA) : return 'NIVEAU'
+ else:return type(o)
+
+def TYPE_COMPLET(o):
+ if isinstance(o,definition_cata.OPER_CATA):return "OPERATEUR"
+ elif isinstance(o,definition_cata.PROC_CATA):return "PROCEDURE"
+ elif isinstance(o,definition_cata.MACRO_CATA):return "MACRO"
+ elif isinstance(o,definition_cata.SIMP_CATA):return "Mot-clé SIMPLE"
+ elif isinstance(o,definition_cata.FACT_CATA):return "Mot-clé FACTEUR"
+ elif isinstance(o,definition_cata.BLOC_CATA):return "BLOC"
+ elif isinstance(o,definition_cata.TYPE_CATA):return "Type"
+ elif isinstance(o,definition_cata.NIVEAU_CATA):return "Niveau"
+ else: return "Inconnu ("+`type(o)`+")"
+
+def make_objecttreeitem(appli,labeltext, object, setfunction=None,objet_cata_ordonne=None):
+ t = TYPE(object)
+ if dispatch.has_key(t):
+ c = dispatch[t]
+ else:
+ print 'on a un objet de type :',type(object),' ',object
+ c = ATTRIBUTItem
+ return c(appli,labeltext, object, setfunction = setfunction,objet_cata_ordonne=objet_cata_ordonne)
+
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+"""
+import types
+
+def centerwindow(window,parent = 'avec'):
+ if parent =='avec':
+ parent = window.winfo_parent()
+ if type(parent) == types.StringType:
+ parent = window._nametowidget(parent)
+ # Find size of window.
+ window.update_idletasks()
+ width = window.winfo_width()
+ height = window.winfo_height()
+ if width == 1 and height == 1:
+ # If the window has not yet been displayed, its size is
+ # reported as 1x1, so use requested size.
+ width = window.winfo_reqwidth()
+ height = window.winfo_reqheight()
+ # Place in centre of screen:
+ if parent =='avec' :
+ x = (window.winfo_screenwidth() - width) / 2 - parent.winfo_vrootx()
+ y = (window.winfo_screenheight() - height) / 3 - parent.winfo_vrooty()
+ else:
+ x = (window.winfo_screenwidth() - width) / 2
+ y = (window.winfo_screenheight() - height) / 3
+ if x < 0:
+ x = 0
+ if y < 0:
+ y = 0
+ window.geometry('+%d+%d' % (x, y))
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+"""
+# Modules Python
+import sys
+import os
+
+# Modules Eficas
+from Editeur import import_code
+from Editeur import session
+from Aster import prefs
+import convert
+import generator
+import string
+from Editeur.utils import extension_fichier,stripPath, save_in_file
+
+class DUP :
+
+ def __init__(self,code):
+ """
+ """
+ self.format_fichier="python"
+ self.version_code=None
+ self.code=code
+
+ self.top=None
+ self.test=2
+ from Editeur import configuration
+ self.CONFIGURATION=configuration.make_config(self,prefs.REPINI)
+
+ self.load_readercata()
+ self.cata=self.readercata.cata
+
+ self.JDC=None
+ self.JDCName=""
+ self.J2=None
+
+ def load_readercata(self):
+ mname='readercata'
+ module=__import__(mname,globals(),locals())
+ factory=getattr(module,mname.upper())
+ appli_composant=factory(self,self.top)
+ setattr(self,mname,appli_composant)
+
+
+ def openJDC(self,fichier):
+ if fichier :
+ self.fichier = fichier
+ e=extension_fichier(fichier)
+ self.JDCName=stripPath(fichier)
+ self.initialdir = os.path.dirname(os.path.abspath(fichier))
+ else :
+ return
+
+ format=self.format_fichier
+ # Il faut convertir le contenu du fichier en fonction du format
+ if convert.plugins.has_key(format):
+ # Le convertisseur existe on l'utilise
+ p=convert.plugins[format]()
+ p.readfile(fichier)
+ text=p.convert('exec',self)
+ if not p.cr.estvide():
+ print ("Erreur à la conversion")
+ print str(p.cr)
+ return
+
+ # On se met dans le repertoire ou se trouve le fichier de commandes
+ # pour trouver les eventuels fichiers include ou autres
+ # localises a cote du fichier de commandes
+ os.chdir(self.initialdir)
+ CONTEXT.unset_current_step()
+ J=self.cata[0].JdC(procedure=text,appli=self,
+ cata=self.cata,cata_ord_dico=self.readercata.cata_ordonne_dico,
+ nom = self.JDCName,
+ rep_mat=self.CONFIGURATION.rep_mat,
+ )
+
+ J.analyse()
+
+ txt_exception = J.cr.get_mess_exception()
+ if txt_exception :
+ # des exceptions ont été levées à la création du JDC
+ # --> on affiche les erreurs mais pas le JDC
+ self.JDC=J
+ print("Erreur fatale au chargement de %s" %file)
+ else :
+ self.JDC=J
+
+ def modifieJDC(self,texte):
+ if texte == None or texte == "" : return
+ format="python"
+ lignes=string.split(texte,";")
+ textedecoup=""
+ for l in lignes :
+ textedecoup=textedecoup+l+'\n'
+ if convert.plugins.has_key(format):
+ p=convert.plugins[format]()
+ p.settext(textedecoup)
+ text=p.convert('exec',self)
+ print text
+ if not p.cr.estvide():
+ print ("Erreur à la conversion")
+ print str(p.cr)
+ return
+ self.J2=self.cata[0].JdC(procedure=text,appli=self,
+ cata=self.cata,
+ cata_ord_dico=self.readercata.cata_ordonne_dico,
+ nom = self.JDCName+"2",
+ rep_mat=self.CONFIGURATION.rep_mat,
+ )
+ self.J2.definition.code = "MODIF"
+ self.J2.analyse()
+
+
+ def saveJDC(self,fichierSortie):
+ """
+ Sauvegarde le JDC courant.
+ Retourne 1 si la sauvegarde s'est bien faite, 0 sinon.
+ """
+ if not hasattr(self,'JDC') : return 0
+
+ format="Modif"
+
+ if generator.plugins.has_key(format):
+ g=generator.plugins[format]()
+ jdc_formate=g.genermodifparam(self.JDC,self.J2)
+ if not g.cr.estvide():
+ self.affiche_infos("Erreur à la generation")
+ return 0
+ else:
+ self.affiche_infos("Format %s non reconnu" % format)
+ return 0
+
+ self.jdc_fini = string.replace(jdc_formate,'\r\n','\n')
+
+ if not save_in_file(fichierSortie,self.jdc_fini) :
+ self.affiche_infos("Problème à la sauvegarde du fichier")
+ return 0
+ else :
+ self.affiche_infos("sauvegarde effectuée")
+ return 1
+
+
+ def affiche_infos(self,mess):
+ print mess
+
--- /dev/null
+from Editeur import Objecttreeitem
+treeitem = Objecttreeitem.ObjectTreeItem
+objet = None
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 *
+import Pmw
+
+from Editeur import Objecttreeitem
+import compofact
+
+
+class BLOCTreeItem(compofact.FACTTreeItem):
+ panel = compofact.FACTPanel
+
+ def get_objet(self,name) :
+ for v in self.object.mc_liste:
+ if v.nom == name : return v
+ return None
+
+ def iscopiable(self):
+ return 0
+
+
+import Accas
+treeitem = BLOCTreeItem
+objet = Accas.MCBLOC
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 *
+import Pmw
+import string
+
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+
+Fonte_Commentaire = fontes.standard_italique
+
+class COMMPanel(panels.OngletPanel):
+
+ def init(self):
+ """
+ Initialise les frame des panneaux contextuels relatifs à un COMMENTAIRE
+ """
+ nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+ nb.pack(fill = 'both', expand = 1)
+ self.nb=nb
+ nb.add('TexteComm', tab_text='Texte Commentaire')
+ nb.add('Commande', tab_text='Nouvelle Commande')
+ nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+ self.makeCOMMPage(nb.page("TexteComm"))
+ self.makeCommandePage(nb.page("Commande"))
+ self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+ nb.tab('TexteComm').focus_set()
+ self.enlevebind()
+ self.creebind()
+ nb.setnaturalsize()
+
+ def makeCOMMPage(self,page):
+ """
+ Crée la page qui permet d'afficher et d'éditer le texte du commentaire
+ """
+ self.frame_valeur = Frame(page)
+ self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
+ self.widget_text = Pmw.ScrolledText(self.frame_valeur,
+ borderframe=1,
+ labelpos='n',
+ label_text = 'Texte du commentaire\n ')
+ self.widget_text.pack(side='top',expand=1,fill='both')
+ self.widget_text.configure(hscrollmode='dynamic',
+ vscrollmode='dynamic')
+ self.make_buttons()
+ self.display_valeur()
+
+ def make_buttons(self):
+ """
+ Crée les boutons du panneau
+ """
+ #self.bouton_sup.place_forget()
+ #self.bouton_doc.place_forget()
+ #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
+ #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
+
+ #self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
+ #self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
+ #self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
+
+ self.bouton_sup.pack_forget()
+ self.bouton_doc.pack_forget()
+ self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
+ self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
+
+ self.bouton_val.pack(side='left',padx=5, pady=5)
+ self.bouton_ann.pack(side='left',padx=5, pady=5)
+ self.bouton_sup.pack(side='right',padx=5, pady=5)
+
+ def change_valeur(self):
+ """
+ Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du commentaire
+ """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ new_valeur = self.widget_text.get()
+ self.node.item.set_valeur(new_valeur)
+ self.node.update()
+
+ def display_valeur(self):
+ """
+ Affiche dans self.widget_text la valeur de l'objet commentaire
+ (annule d'éventuelles modifications faite par l'utilisateur)
+ """
+ t=self.node.item.get_valeur()
+ try:
+ self.widget_text.settext(unicode(t))
+ except:
+ # Si probleme avec unicode
+ self.widget_text.settext(t)
+
+class COMMTreeItem(Objecttreeitem.ObjectTreeItem):
+ panel = COMMPanel
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icône associée au noeud qui porte self,
+ dépendant de la validité de l'objet
+ NB : un commentaire est toujours valide ...
+ """
+ return "ast-white-percent"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ return 'commentaire',Fonte_Commentaire,None
+
+ def get_valeur(self):
+ """
+ Retourne la valeur de l'objet Commentaire cad son texte
+ """
+ return self.object.get_valeur() or ''
+
+ def GetText(self):
+ texte = self.object.valeur
+ texte = string.split(texte,'\n')[0]
+ if len(texte) < 25 :
+ return texte
+ else :
+ return texte[0:24]
+
+ def set_valeur(self,valeur):
+ """
+ Afefcte valeur à l'objet COMMENTAIRE
+ """
+ self.object.set_valeur(valeur)
+
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ """
+ return []
+
+
+ def get_objet_commentarise(self):
+ """
+ La méthode get_objet_commentarise() de la classe compocomm.COMMTreeItem
+ surcharge la méthode get_objet_commentarise de la classe Objecttreeitem.ObjectTreeItem
+ elle a pour but d'empecher l'utilisateur final de commentariser un commentaire.
+ """
+ raise Exception( 'Citoyen : tu peux "commentariser" une commande MAIS PAS UN COMMENTAIRE' )
+
+import Extensions
+treeitem =COMMTreeItem
+objet = Extensions.commentaire.COMMENTAIRE
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 traceback
+from Tkinter import *
+import Pmw
+import string
+from widgets import showerror
+
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+
+Fonte_Commentaire = fontes.standard_italique
+
+class COMMANDE_COMMPanel(panels.OngletPanel):
+ """
+ Classe servant à définir le panel associé à une commande commentarisée
+ """
+ def init(self):
+ """
+ Initialise les frame des panneaux contextuels relatifs à une commande commentarisée
+ """
+ panneau=Frame(self)
+ panneau.pack(expand=1,fill='both')
+ self.make_buttons()
+ self.makeCOMMPage(panneau)
+ self.enlevebind()
+
+ def makeCOMMPage(self,page):
+ """
+ Crée la page qui permet d'afficher et d'éditer le texte de la commande commentarisée
+ """
+ self.frame_valeur = Frame(page)
+ self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
+ self.widget_text = Pmw.ScrolledText(self.frame_valeur,
+ borderframe=1,
+ labelpos='n',
+ label_text = 'Texte de la commande\n ')
+ self.widget_text.pack(side='top',expand=1,fill='both')
+ self.widget_text.configure(hscrollmode='dynamic',
+ vscrollmode='dynamic')
+ self.display_valeur()
+
+ def make_buttons(self):
+ """
+ Crée les boutons du panneau
+ """
+ #self.bouton_sup.place_forget()
+ #self.bouton_doc.place_forget()
+ #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
+ #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
+ #self.bouton_unc = Button(self.fr_but,text='Décommentariser',command=self.uncomment,width=14)
+
+ #self.bouton_val.place(relx=0.1,rely=0.5,relheight=1,relwidth=0.20,anchor='center')
+ #self.bouton_ann.place(relx=0.30,rely=0.5,relheight=1,relwidth=0.20,anchor='center')
+ #self.bouton_sup.place(relx=0.50,rely=0.5,relheight=1,relwidth=0.20,anchor='center')
+ #self.bouton_unc.place(relx=0.75,rely=0.5,relheight=1,relwidth=0.25,anchor='center')
+
+ self.bouton_sup.pack_forget()
+ self.bouton_doc.pack_forget()
+ self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
+ self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
+ self.bouton_unc = Button(self.fr_but,text='Décommentariser',command=self.uncomment)
+ self.bouton_val.pack(side='left',padx=5, pady=5)
+ self.bouton_ann.pack(side='left',padx=5, pady=5)
+ self.bouton_sup.pack(side='left',padx=5, pady=5)
+ self.bouton_unc.pack(side='right',padx=5, pady=5)
+
+ def change_valeur(self):
+ """
+ Stocke la nouvelle valeur donnée par l'utilisateur comme valeur de la commande commentarisée
+ """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ new_valeur = self.widget_text.get()
+ self.node.item.set_valeur(new_valeur)
+ self.node.update()
+
+ def display_valeur(self):
+ """
+ Affiche dans self.widget_text la valeur de la commande commentarisée
+ (annule d'éventuelles modifications faite par l'utilisateur)
+ """
+ self.widget_text.settext(self.node.item.get_valeur())
+
+ def uncomment(self):
+ """
+ Réalise la décommentarisation de self
+ """
+ try:
+ pos=self.node.parent.children.index(self.node)
+ commande,nom = self.node.item.uncomment()
+ self.node.parent.children[pos].select()
+ except Exception,e:
+ showerror("Erreur !",str(e))
+ return
+ #self.parent.appli.bureau.JDCDisplay_courant.ReplaceObjectNode(self.node,commande,nom)
+
+class COMMANDE_COMMTreeItem(Objecttreeitem.ObjectTreeItem):
+ panel = COMMANDE_COMMPanel
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icône associée au noeud qui porte self,
+ dépendant de la validité de l'objet
+ NB : une commande commentarisée est toujours valide ...
+ """
+ if self.isvalid():
+ return "ast-green-percent"
+ else:
+ return "ast-red-percent"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ return 'commande commentarisée',Fonte_Commentaire,None
+
+ def get_valeur(self):
+ """
+ Retourne la valeur de la commande commentarisée cad son texte
+ """
+ return self.object.get_valeur() or ''
+
+ def GetText(self):
+ texte = self.object.valeur
+ texte = string.split(texte,'\n')[0]
+ if len(texte) < 25 :
+ return texte
+ else :
+ return texte[0:24]
+
+ def set_valeur(self,valeur):
+ """
+ Afefcte valeur à l'objet commande commentarisée
+ """
+ self.object.set_valeur(valeur)
+
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ """
+ return []
+
+ def uncomment(self):
+ """
+ Demande à l'objet commande commentarisée de se décommentariser.
+ Si l'opération s'effectue correctement, retourne l'objet commande
+ et éventuellement le nom de la sd produite, sinon lève une exception
+ """
+ try:
+ commande,nom = self.object.uncomment()
+ except Exception,e:
+ traceback.print_exc()
+ raise e
+ return commande,nom
+
+import Accas
+treeitem =COMMANDE_COMMTreeItem
+objet = Accas.COMMANDE_COMM
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+from Tkinter import Label,Button
+
+#Modules Eficas
+from Noyau.N_OBJECT import ErrorObj
+from Editeur import Objecttreeitem
+import panels
+
+class ERRORPanel(panels.Panel_Inactif):
+ def creer_texte(self):
+ texte = """Le noeud sélectionné correspond à un objet erroné """
+ label = Label(self,text=texte,justify='center')
+ label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
+ bouton = Button(self,text = "Supprimer", command=self.supprimer)
+ bouton.place(relx=0.5,rely=0.5,anchor='center')
+
+class ERRORTreeItem(Objecttreeitem.AtomicObjectTreeItem):
+ panel = ERRORPanel
+ def GetIconName(self):
+ return "ast-red-ball"
+
+
+treeitem =ERRORTreeItem
+objet = ErrorObj
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 Pmw
+from Editeur import Objecttreeitem
+import panels
+
+class FACTPanel(panels.OngletPanel) :
+ def init(self) :
+ nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+ nb.pack(fill = 'both', expand = 1)
+ self.nb=nb
+ nb.add('Mocles', tab_text='Ajouter mots-clés')
+ panneau=Pmw.PanedWidget(nb.page("Mocles"),
+ orient='horizontal')
+ panneau.add('left',min=0.4,max=0.6,size=0.5)
+ panneau.add('right',min=0.4,max=0.6,size=0.5)
+ panneau.pack(expand=1,fill='both')
+ self.makeMoclesPage(panneau.pane('left'))
+ self.makeReglesPage(panneau.pane('right'))
+ nb.tab('Mocles').focus_set()
+ nb.setnaturalsize()
+ self.enlevebind()
+ self.creebind()
+ self.affiche()
+
+import treewidget
+class Node(treewidget.Node):
+ def doPaste(self,node_selected):
+ objet_a_copier = self.item.get_copie_objet()
+ child=node_selected.doPaste_MCF(objet_a_copier)
+ return child
+
+ def doPaste_MCF(self,objet_a_copier):
+ child = self.parent.append_child(objet_a_copier,
+ pos=self.item,
+ retour='oui')
+ return child
+
+
+class FACTTreeItem(Objecttreeitem.ObjectTreeItem):
+ panel = FACTPanel
+ itemNode=Node
+
+ def IsExpandable(self):
+ return 1
+
+ def GetText(self):
+ return ''
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ # None --> fonte et couleur par défaut
+ return self.object.getlabeltext(),None,None
+
+ def isvalid(self):
+ return self.object.isvalid()
+
+ def iscopiable(self):
+ return 1
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return "ast-green-los"
+ elif self.object.isoblig():
+ return "ast-red-los"
+ else:
+ return "ast-yel-los"
+
+ def keys(self):
+ keys=self.object.mc_dict.keys()
+ return keys
+
+ def GetSubList(self):
+ """
+ Reactualise la liste des items fils stockes dans self.sublist
+ """
+ liste=self.object.mc_liste
+ sublist=[None]*len(liste)
+ # suppression des items lies aux objets disparus
+ for item in self.sublist:
+ old_obj=item.getObject()
+ if old_obj in liste:
+ pos=liste.index(old_obj)
+ sublist[pos]=item
+ else:
+ pass # objets supprimes ignores
+ # ajout des items lies aux nouveaux objets
+ pos=0
+ for obj in liste:
+ if sublist[pos] is None:
+ # nouvel objet : on cree un nouvel item
+ def setfunction(value, object=obj):
+ object.setval(value)
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+ sublist[pos]=item
+ pos=pos+1
+
+ self.sublist=sublist
+ return self.sublist
+
+ def additem(self,name,pos):
+ #print "compofact.additem",name,pos
+ objet = self.object.addentite(name,pos)
+ return objet
+
+ def suppitem(self,item) :
+ """
+ Cette methode a pour fonction de supprimer l'item passé en argument
+ des fils de l'item FACT qui est son pere
+ - item = item du MOCLE à supprimer du MOCLE père
+ - item.getObject() = MCSIMP ou MCBLOC
+ """
+ itemobject=item.getObject()
+ if itemobject.isoblig() :
+ self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
+ return 0
+
+ if self.object.suppentite(itemobject):
+ message = "Mot-clé " + itemobject.nom + " supprimé"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
+ return 0
+
+import Accas
+objet = Accas.MCFACT
+treeitem = FACTTreeItem
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 les classes permettant de définir les objets graphiques
+représentant un objet de type FORMULE, cad le panneau et l'item de l'arbre
+d'EFICAS
+"""
+
+# import modules Python
+from Tkinter import *
+import Pmw
+import string
+
+# import modules EFICAS
+import widgets
+import panels
+from InterfaceTK import fontes
+import compooper
+
+Fonte_TITRE = fontes.standard_gras_souligne
+
+
+class FORMULEPanel(panels.OngletPanel):
+ """
+ Classe servant à construire le panneau associé à un paramètre.
+ C'est au moyen de ce panneau que l'utilisateur peut accéder
+ aux nom et valeur du paramètre en vue éventuellement de les
+ modifier.
+ """
+
+ def init(self):
+ nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+ nb.pack(fill = 'both', expand = 1)
+ self.nb=nb
+ nb.add('Formule', tab_text='Définition Formule')
+ nb.add('Commande', tab_text='Nouvelle Commande')
+ nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+ self.makeFormulePage(nb.page("Formule"))
+ self.makeCommandePage(nb.page("Commande"))
+ self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+ nb.tab('Formule').focus_set()
+ self.enlevebind()
+ self.creebind()
+ nb.setnaturalsize()
+
+ def makeFormulePage(self,page):
+ """
+ Crée la page qui permet d'afficher et d'éditer le texte de la FORMULE
+ """
+ self.frame_valeur = Frame(page)
+ self.frame_valeur.pack(fill='both',expand=1)
+ #self.frame_valeur.place(relwidth=0.95,relheight=0.95,relx=0.05,rely=0.05,anchor='nw')
+ #self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
+ # affichage du titre du panneau
+ self.titre = StringVar()
+ self.titre.set("FORMULE "+self.node.item.get_nom())
+
+ self.entry_nom = Entry(self.frame_valeur)
+ #Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.,anchor='n')
+ Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).grid(row=0,columnspan=2,padx=5,pady=5)
+ # création des labels et entries associés aux nom, type retourné, arguments et corps de la FORMULE
+
+ #Label(self.frame_valeur,text= 'Nom de la formule : ').place(relx=0.,rely=0.1)
+ Label(self.frame_valeur,text= 'Nom de la formule : ').grid(row=1,sticky=W,padx=5,pady=5)
+ #Label(self.frame_valeur,text= 'Arguments : ').place(relx=0.,rely=0.40)
+ Label(self.frame_valeur,text= 'Arguments : ').grid(row=2,sticky=W,padx=5,pady=5)
+ self.entry_arg = Entry(self.frame_valeur)
+ #Label(self.frame_valeur,text= 'Expression : ').place(relx=0.,rely=0.65)
+ Label(self.frame_valeur,text= 'Expression : ').grid(row=4,sticky=W,padx=5,pady=5)
+ self.entry_exp = Entry(self.frame_valeur)
+
+ # binding sur les entries
+ self.entry_nom.bind("<Return>",self.verif_nom)
+ self.entry_nom.bind("<KP_Enter>",self.verif_nom)
+ self.entry_arg.bind("<Return>",self.verif_arguments)
+ self.entry_arg.bind("<KP_Enter>",self.verif_arguments)
+ self.entry_exp.bind("<Return>",self.verif_corps)
+ self.entry_exp.bind("<KP_Enter>",self.verif_corps)
+ # affichage des entries
+ #self.entry_nom.place(relx=0.35,rely=0.10,relwidth=0.2)
+ self.entry_nom.grid(row=1,column=1,sticky=W,padx=5,pady=5)
+ #self.entry_arg.place(relx=0.35,rely=0.40,relwidth=0.4)
+ self.entry_arg.grid(row=2,column=1,sticky=W,padx=5,pady=5)
+
+ # affichage d'une phrase d'aide pour les arguments
+ aide = """Entrer les arguments sous la forme
+de VARIABLES séparées par des virgules (,)
+Exemple X,Y,Z """
+ #Label(self.frame_valeur,text=aide, justify="l").place(relx=0.5,rely=0.47,anchor='n')
+ Label(self.frame_valeur,text=aide, justify="l").grid(row=3,columnspan=2,padx=5,pady=5)
+
+ #self.entry_exp.place(relx=0.35,rely=0.65,relwidth=0.60)
+ self.entry_exp.grid(row=4,column=1,sticky=W,padx=5,pady=5)
+ # affichage d'une phrase d'aide pour l'expression
+ aide = """Un retour de chariot dans une zone de saisie vous permet de vérifier si
+la valeur que vous avez entrée est valide.
+Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
+valeurs seront effectivement prises en compte."""
+ #Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.75,anchor='n')
+ Label(self.frame_valeur,text=aide).grid(row=5,columnspan=2,padx=5,pady=5)
+ self.frame_valeur.columnconfigure(1,weight=1)
+
+ # affichage des nom, type retourné, arguments et corps de la FORMULE
+ self.display_valeur()
+ # affichage des boutons
+ self.make_buttons()
+ # entry_nom prend le focus
+ self.entry_nom.focus()
+
+ def make_buttons(self):
+ """
+ Crée les boutons du panneau
+ """
+ #self.bouton_sup.place_forget()
+ #self.bouton_doc.place_forget()
+ #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
+ #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
+
+ #self.bouton_val.place(relx=0.15,rely=0.5,relheight=0.8,anchor='center')
+ #self.bouton_ann.place(relx=0.40,rely=0.5,relheight=0.8,anchor='center')
+ #self.bouton_sup.place(relx=0.65,rely=0.5,relheight=0.8,anchor='center')
+ #self.bouton_doc.place(relx=0.90,rely=0.5,relheight=0.8,anchor='center')
+
+ self.bouton_sup.pack_forget()
+ self.bouton_doc.pack_forget()
+ self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
+ self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
+
+ self.bouton_val.pack(side='left',padx=5, pady=5)
+ self.bouton_ann.pack(side='left',padx=5, pady=5)
+ self.bouton_sup.pack(side='left',padx=5, pady=5)
+ self.bouton_doc.pack(side='right',padx=5, pady=5)
+
+ def change_valeur(self):
+ """
+ Stocke la nouvelle FORMULE décrite par l'utilisateur
+ """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ # on récupère les nouveaux nom, type retourné, arguments et corps de la FORMULE
+ new_nom = self.entry_nom.get()
+ new_typ="REEL"
+ new_arg = self.entry_arg.get()
+ new_exp = self.entry_exp.get()
+ self.verif_arguments()
+ self.verif_corps()
+ # on essaie de les stocker
+ test,erreur = self.node.item.save_formule(new_nom,new_typ,new_arg,new_exp)
+ if test :
+ # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
+ self.node.update()
+ self.display_valeur()
+ self.parent.appli.affiche_infos("FORMULE %s modifiée" %self.node.item.get_nom())
+ else:
+ # la formule est incorrecte : on affiche les erreurs
+ widgets.showerror("Formule incorrecte",erreur)
+ self.parent.appli.affiche_infos("FORMULE %s non modifiée" %self.node.item.get_nom())
+
+ def display_valeur(self):
+ """
+ Affiche dans self.widget_text de la valeur de l'objet FORMULE
+ (annule d'éventuelles modifications faite par l'utilisateur)
+ """
+ # on efface tout texte affiché dans les entries
+ self.entry_nom.delete(0,END)
+ self.entry_arg.delete(0,END)
+ self.entry_exp.delete(0,END)
+ # on rafraîchit le titre du panneau
+ self.titre.set('FORMULE '+self.node.item.get_nom())
+ # on insére les nouveaux nom, type retourné, arguments et corps de la FORMULE
+ nom = self.node.item.get_nom()
+ if nom != '':
+ self.entry_nom.insert(END,nom)
+ args = self.node.item.get_args()
+ if args:
+ texte_args=""
+ for i in args :
+ if texte_args != "" :
+ texte_args = texte_args +","
+ texte_args=texte_args + i
+ self.entry_arg.insert(END,texte_args)
+ corps = self.node.item.get_corps()
+ if corps :
+ self.entry_exp.insert(END,self.node.item.get_corps())
+
+ def verif_nom(self,event=None):
+ """
+ Lance la vérification du nom présent dans entry_nom
+ """
+ nom = self.entry_nom.get()
+ if nom == '':
+ test,erreur = 0,"Aucun nom fourni !"
+ else:
+ test,erreur = self.node.item.verif_nom(nom)
+ if not test:
+ widgets.showerror("Nom invalide",erreur)
+ self.entry_nom.focus()
+ self.entry_nom.selection_range(0,END)
+ self.parent.appli.affiche_infos("%s n'est pas un nom valide pour une FORMULE" %nom)
+ else:
+ self.parent.appli.affiche_infos("%s est un nom valide pour une FORMULE" %nom)
+ self.entry_arg.focus()
+
+ def verif_arguments(self,event=None):
+ """
+ Lance la vérification des arguments présents dans entry_arg
+ """
+ arguments = self.entry_arg.get()
+ if arguments == '' :
+ test,erreur = 0,"Aucun argument fourni"
+ else:
+ test,erreur = self.node.item.verif_arguments(arguments)
+ if not test:
+ widgets.showerror("Argument(s) invalide(s)",erreur)
+ self.entry_arg.focus()
+ self.entry_arg.selection_range(0,END)
+ self.parent.appli.affiche_infos("Argument(s) invalide(s) pour une FORMULE")
+ else:
+ self.parent.appli.affiche_infos("Argument(s) valide(s) pour une FORMULE")
+ self.entry_exp.focus()
+
+ def verif_corps(self,event=None):
+ """
+ Lance la vérification du corps de formule présent dans entry_exp
+ """
+ new_nom = self.entry_nom.get()
+ new_typ="REEL"
+ new_arg = self.entry_arg.get()
+ new_exp = self.entry_exp.get()
+ if new_exp == '':
+ test,erreur = 0,"Aucune expression fournie !"
+ else:
+ test,erreur = self.node.item.verif_formule_python((new_nom,new_typ,new_arg,new_exp))
+
+ if not test:
+ widgets.showerror("Corps de FORMULE invalide",erreur)
+ self.entry_exp.focus()
+ self.entry_exp.selection_range(0,END)
+ self.parent.appli.affiche_infos("Corps de FORMULE invalide")
+ else:
+ self.parent.appli.affiche_infos("Corps de FORMULE valide")
+
+class FORMULETreeItem(compooper.EtapeTreeItem):
+ """
+ Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
+ qui représente la FORMULE
+ """
+ panel = FORMULEPanel
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+# API de FORMULE pour l'arbre
+# ---------------------------------------------------------------------------
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ On considère que FORMULE n'a pas de fils
+ --> modification par rapport à MACRO classique
+ """
+ # dans EFICAS on ne souhaite pas afficher les mots-clés fils de FORMULE
+ # de façon traditionnelle
+ return []
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icône à afficher dans l'arbre
+ Ce nom dépend de la validité de l'objet
+ """
+ if self.object.isactif():
+ self.object.state="modified"
+ if self.object.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+ else:
+ return "ast-white-text"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ if self.object.isactif():
+ # None --> fonte et couleur par défaut
+ return self.labeltext,None,None
+ else:
+ return self.labeltext,fontes.standard_italique,None
+
+# ---------------------------------------------------------------------------
+# Méthodes permettant la modification et la lecture des attributs
+# du paramètre = API graphique de la FORMULE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+ def get_nom(self):
+ """
+ Retourne le nom de la FORMULE
+ """
+ return self.object.get_nom()
+
+ def get_type(self):
+ """
+ Retourne le type de la valeur retournée par la FORMULE
+ """
+ return self.object.type_retourne
+
+ def get_args(self):
+ """
+ Retourne les arguments de la FORMULE
+ """
+ args=""
+ for mot in self.object.mc_liste:
+ if mot.nom == 'NOM_PARA':
+ args=mot.valeur
+ break
+ if args :
+ if args[0] == "(" and args[-1] ==")":
+ args=args[1:-1]
+ # transforme en tuple si ce n est pas déjà le casa
+ try :
+ args=string.split(args,',')
+ except :
+ pass
+ return args
+
+ def get_corps(self):
+ """
+ Retourne le corps de la FORMULE
+ """
+ corps=""
+ for mot in self.object.mc_liste:
+ if mot.nom == 'VALE':
+ corps=mot.valeur
+ break
+ return corps
+
+
+ def get_liste_types_autorises(self):
+ """
+ Retourne la liste des types autorises pour les valeurs de sortie
+ d'une FORMULE
+ """
+ return self.object.l_types_autorises
+
+ def save_formule(self,new_nom,new_typ,new_arg,new_exp):
+ """
+ Vérifie si (new_nom,new_typ,new_arg,new_exp) définit bien une FORMULE
+ licite :
+ - si oui, stocke ces paramètres comme nouveaux paramètres de la
+ FORMULE courante et retourne 1
+ - si non, laisse les paramètres anciens de la FORMULE inchangés et
+ retourne 0
+ """
+ test,erreur = self.object.verif_formule_python(formule=(new_nom,new_typ,new_arg,
+ new_exp))
+ if test :
+ # la formule est bien correcte : on sauve les nouveaux paramètres
+ test=self.object.update_formule_python(formule=(new_nom,new_typ,new_exp,new_arg))
+ return test,erreur
+
+# ---------------------------------------------------------------------------
+# Accès aux méthodes de vérification de l'objet FORM_ETAPE
+# ---------------------------------------------------------------------------
+
+ def verif_nom(self,nom):
+ """
+ Lance la vérification du nom passé en argument
+ """
+ return self.object.verif_nom(nom)
+
+ def verif_arguments(self,arguments):
+ """
+ Lance la vérification des arguments passés en argument
+ """
+ return self.object.verif_arguments('('+arguments+')')
+
+ def verif_formule(self,formule):
+ """
+ Lance la vérification de FORMULE passée en argument
+ """
+ return self.object.verif_formule(formule=formule)
+
+
+ def verif_formule_python(self,formule):
+ """
+ Lance la vérification de FORMULE passée en argument
+ """
+ return self.object.verif_formule_python(formule=formule)
+
+import Accas
+treeitem =FORMULETreeItem
+objet = Accas.FORM_ETAPE
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 Pmw
+from Editeur import Objecttreeitem
+import panels
+
+from widgets import ListeChoix
+
+class JDCPanel(panels.OngletPanel):
+ def init(self):
+ """ Initialise les frame des panneaux contextuels relatifs à un JDC """
+ panneau=Pmw.PanedWidget(self,orient='horizontal')
+ panneau.add('left',min=0.4,max=0.6,size=0.5)
+ panneau.add('right',min=0.4,max=0.6,size=0.5)
+ panneau.pack(expand=1,fill='both')
+ self.bouton_com.pack_forget()
+ self.makeJDCPage(panneau.pane('left'))
+ self.makeReglesPage(panneau.pane('right'))
+ self.enlevebind()
+
+ def makeReglesPage(self,page) :
+ regles = []
+ regles = self.node.item.get_regles()
+ texte_regles = []
+ l_regles_en_defaut=[]
+ if len(regles) > 0:
+ l_noms_etapes = self.node.item.get_l_noms_etapes()
+ i = 0
+ for regle in regles :
+ texte_regles.append(regle.gettext())
+ texte,test = regle.verif(l_noms_etapes)
+ if test == 0 : l_regles_en_defaut.append(i)
+ i = i+1
+ Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
+ Liste.affiche_liste()
+ # aide associée au panneau
+ bulle_aide="""Ce panneau contient la liste des règles qui s'appliquent à l'objet
+ en cours d'édition.
+ - en noir : règles valides
+ - en rouge : règles violées"""
+ Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+import treewidget
+class Node(treewidget.Node):
+ def doPaste_Commande(self,objet_a_copier):
+ """
+ Réalise la copie de l'objet passé en argument qui est nécessairement
+ une commande
+ """
+ #child = self.item.append_child(objet_a_copier,pos='first')
+ child = self.append_child(objet_a_copier,pos='first',retour='oui')
+ #if child is None : return 0
+ return child
+
+
+class JDCTreeItem(Objecttreeitem.ObjectTreeItem):
+ panel = JDCPanel
+ itemNode=Node
+
+ def IsExpandable(self):
+ return 1
+
+ def GetText(self):
+ return " "
+
+ def GetLabelText(self):
+ # None --> fonte et couleur par défaut
+ return self.object.nom,None,None
+
+ def get_jdc(self):
+ """
+ Retourne l'objet pointé par self
+ """
+ return self.object
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+
+ def keys(self):
+ if self.object.etapes_niveaux != []:
+ return range(len(self.object.etapes_niveaux))
+ else:
+ return range(len(self.object.etapes))
+
+ def additem(self,name,pos):
+ cmd = self._object.addentite(name,pos)
+ return cmd
+
+ def suppitem(self,item) :
+ # item = item de l'ETAPE à supprimer du JDC
+ # item.getObject() = ETAPE ou COMMENTAIRE
+ # self.object = JDC
+ itemobject=item.getObject()
+ if self.object.suppentite(itemobject):
+ if itemobject.nature == "COMMENTAIRE" :
+ message = "Commentaire supprimé"
+ else :
+ message = "Commande " + itemobject.nom + " supprimée"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos("Pb interne : impossible de supprimer cet objet")
+ return 0
+
+ def GetSubList(self):
+ """
+ Retourne la liste des items fils de l'item jdc.
+ Cette liste est conservee et mise a jour a chaque appel
+ """
+ if self.object.etapes_niveaux != []:
+ liste = self.object.etapes_niveaux
+ else:
+ liste = self.object.etapes
+ sublist=[None]*len(liste)
+ # suppression des items lies aux objets disparus
+ for item in self.sublist:
+ old_obj=item.getObject()
+ if old_obj in liste:
+ pos=liste.index(old_obj)
+ sublist[pos]=item
+ else:
+ pass # objets supprimes ignores
+ # ajout des items lies aux nouveaux objets
+ pos=0
+ for obj in liste:
+ if sublist[pos] is None:
+ # nouvel objet : on cree un nouvel item
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj)
+ sublist[pos]=item
+ pos=pos+1
+
+ self.sublist=sublist
+ return self.sublist
+
+ def get_l_noms_etapes(self):
+ """ Retourne la liste des noms des étapes de self.object"""
+ return self.object.get_l_noms_etapes()
+
+ def get_liste_cmd(self):
+ #print "get_liste_cmd",self.object.niveau.definition
+ listeCmd = self.object.niveau.definition.get_liste_cmd()
+ return listeCmd
+
+import Accas
+treeitem =JDCTreeItem
+objet = Accas.JDC
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 os,sys,string
+import types
+import Tkinter
+import Pmw
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+import compooper
+import convert
+from widgets import askopenfilename
+from widgets import Fenetre,FenetreYesNo
+from widgets import showinfo,showerror
+
+#
+__version__="$Name: BR_V1_12qt $"
+__Id__="$Id: compomacro.py,v 1.26 2006-12-15 16:00:21 cchris Exp $"
+#
+
+class MACROPanel(panels.OngletPanel):
+ def init(self):
+ nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+ nb.pack(fill = 'both', expand = 1)
+ self.nb=nb
+ nb.add('Mocles', tab_text='Ajouter mots-clés')
+ typsd=self.node.item.object.get_type_produit()
+ ficini = self.node.item.wait_fichier_init()
+ if typsd != None:
+ 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='Nouvelle Commande')
+ nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+ panneau=Pmw.PanedWidget(nb.page("Mocles"),
+ orient='horizontal')
+ panneau.add('left',min=0.4,max=0.6,size=0.5)
+ panneau.add('right',min=0.4,max=0.6,size=0.5)
+ panneau.pack(expand=1,fill='both')
+ self.makeCommandePage(nb.page("Commande"))
+ if typsd != None:
+ self.makeConceptPage(nb.page("Concept"))
+ if ficini == 1 :
+ self.makeFichierPage(nb.page('Fichierinit'))
+ self.makeMoclesPage(panneau.pane('left'))
+ self.makeReglesPage(panneau.pane('right'))
+ self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+ nb.tab('Mocles').focus_set()
+ nb.setnaturalsize()
+ self.enlevebind()
+ self.creebind()
+ self.affiche()
+
+ def makeFichierPage(self,page):
+ """
+ Affiche la page d'onglet correspondant au changement du fichier
+ dont a besoin la macro
+ """
+ titre = Tkinter.Label(page,text="La commande %s requiert un fichier " %self.node.item.get_nom())
+ titre.place(relx=0.5,rely=0.2,anchor='center')
+ frameMain=Tkinter.Frame(page)
+ frameMain.place(relx=0.5,rely=0.4,anchor='center',relwidth=1.)
+ Tkinter.Label(frameMain,text="Fichier :").pack(side='left',padx=5)
+ self.entry = Tkinter.Entry(frameMain,relief='sunken',bg='white')
+ self.entry.pack(side='left',padx=5,fill='x',expand=1)
+ frameButtons=Tkinter.Frame(page)
+ but1=Tkinter.Button(frameButtons,text='Valider',command = self.change_fichier_init)
+ but2=Tkinter.Button(frameButtons,text='Browse',command = self.browse_fichier_init)
+ but3=Tkinter.Button(frameButtons,text='Annuler',command = self.annule_fichier_init)
+ but1.grid(row=0,column=0,padx=5,pady=5)
+ but2.grid(row=0,column=1,padx=5,pady=5)
+ but3.grid(row=0,column=2,padx=5,pady=5)
+ frameButtons.place(relx=0.5,rely=0.6,anchor='center')
+
+ if hasattr(self.node.item.object,'fichier_ini'):
+ if self.node.item.object.fichier_ini :
+ self.entry.insert(0,self.node.item.object.fichier_ini)
+ self.entry.focus()
+
+ def convert_file(self,file):
+ """
+ Methode pour convertir le fichier file dans le format courant
+ """
+ format=self.parent.appli.format_fichier.get()
+ if convert.plugins.has_key(format):
+ # Le convertisseur existe on l'utilise
+ p=convert.plugins[format]()
+ p.readfile(file)
+ text=p.convert('execnoparseur')
+ if not p.cr.estvide():
+ self.parent.appli.affiche_infos("Erreur à la conversion")
+ Fenetre(self,
+ titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
+ texte = str(p.cr))
+ return None
+ return text
+ else:
+ # Il n'existe pas c'est une erreur
+ self.parent.appli.affiche_infos("Type de fichier non reconnu")
+ showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
+ return None
+
+ def change_fichier_init(self,event=None):
+ """
+ Effectue le changement de fichier d'initialisation s'il est valide
+ """
+ new_fic = self.entry.get()
+ if not os.path.isfile(new_fic) :
+ showinfo("Fichier introuvable","Le fichier que vous avez saisi\n"+
+ "n'est pas un nom de fichier valide !")
+ self.parent.appli.affiche_infos("Fichier introuvable")
+ return
+ # On convertit le fichier
+ text=self.convert_file(new_fic)
+ # Si probleme a la lecture-conversion on arrete le traitement
+ if not text:
+ return
+
+ try:
+ self.node.item.object.change_fichier_init(new_fic,text)
+ self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
+ except:
+ # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
+ self.parent.appli.affiche_infos("Fichier invalide")
+ l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
+ f=FenetreYesNo(self.parent.appli,titre="Fichier invalide : voulez vous retablir l ancien fichier ?",
+ texte="Erreur dans l'interprétation du nouveau fichier ...\n\n"+string.join(l),
+ yes="Retablir",no="Changer")
+ f.wait()
+ reponse=f.result
+ if reponse:
+ # On retablit l'ancien fichier
+ self.entry.delete(0,Tkinter.END)
+ self.node.item.object.restore_fichier_init()
+ self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
+ fic=self.node.item.object.fichier_ini
+ if fic:
+ self.entry.insert(0,fic)
+ else:
+ self.node.item.object.force_fichier_init()
+ self.parent.appli.affiche_infos("Fichier invalide ... Nouveau fichier mémorisé")
+
+ def annule_fichier_init(self,event=None):
+ """ Restaure dans self.entry le nom de fichier_init"""
+ self.entry.delete(0,Tkinter.END)
+ if self.node.item.object.fichier_ini:
+ self.entry.insert(0,self.node.item.object.fichier_ini)
+
+ def browse_fichier_init(self,event=None):
+ """
+ Propose à l'utilisateur une Bsf et retourne le fichier
+ sélectionné dans self.entry
+ """
+ file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
+ if file :
+ self.entry.delete(0,Tkinter.END)
+ self.entry.insert(0,file)
+
+ def update_panel(self):
+ if hasattr(self,"entry"):
+ self.annule_fichier_init()
+
+class MACROTreeItem(compooper.EtapeTreeItem):
+ """ Cette classe hérite d'une grande partie des comportements
+ de la classe compooper.EtapeTreeItem
+ """
+ panel=MACROPanel
+
+class INCLUDETreeItemBase(MACROTreeItem):
+ rmenu_specs=[("View","makeView"),
+ ("Edit","makeEdit"),
+ ]
+
+ def __init__(self,appli, labeltext, object, setfunction):
+ MACROTreeItem.__init__(self,appli, labeltext, object, setfunction)
+
+ def iscopiable(self):
+ """
+ Retourne 1 si l'objet est copiable, 0 sinon
+ """
+ return 0
+
+ def makeEdit(self,appli,node):
+ #print "makeEdit",self.object,self.object.nom
+ #print "makeEdit",self.object.jdc_aux,self.object.jdc_aux.nom
+ #print "makeEdit",self.object.jdc_aux.context_ini
+ if self.object.text_converted == 0:
+ # Le texte du fichier inclus n'a pas pu etre converti par le module convert
+ msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
+ msg=msg+self.object.text_error
+ Fenetre(self,titre="Include non editable",texte=msg,wrap='none')
+ return
+
+ if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
+ #L'include n'est pas initialise
+ self.object.build_include(None,"")
+
+ # On cree un nouvel onglet dans le bureau
+ appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
+ label_onglet=None,
+ JDCDISPLAY=macrodisplay.MACRODISPLAY)
+
+ def makeView(self,appli,node):
+ if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
+ showerror("Include vide",
+ "L'include doit etre correctement initialisé pour etre visualisé")
+ return
+
+ nom=self.object.nom
+ if hasattr(self.object,'fichier_ini'):
+ if self.object.fichier_ini is None:
+ nom=nom+' '+"Fichier non défini"
+ else:
+ nom=nom+' '+self.object.fichier_ini
+ macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
+
+class INCLUDEPanel(MACROPanel):
+ def makeFichierPage(self,page):
+ """
+ Affiche la page d'onglet correspondant au changement du fichier INCLUDE
+ """
+ if not hasattr(self.node.item.object,'fichier_ini'):
+ titre = Tkinter.Label(page,text="L'INCLUDE n'a pas de fichier associé\nIl faut d'abord choisir un numero d'unité " )
+ titre.place(relx=0.5,rely=0.5,anchor='center')
+ else:
+ MACROPanel.makeFichierPage(self,page)
+
+class INCLUDETreeItem(INCLUDETreeItemBase):
+ panel=INCLUDEPanel
+
+class POURSUITETreeItem(INCLUDETreeItemBase):
+ def makeEdit(self,appli,node):
+ if self.object.text_converted == 0:
+ # Le texte du fichier inclus n'a pas pu etre converti par le module convert
+ msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
+ msg=msg+self.object.text_error
+ Fenetre(self,titre="Poursuite non editable",texte=msg,wrap='none')
+ return
+
+ if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
+ #La poursuite n'est pas initialisee
+ text="""DEBUT()
+FIN()"""
+ self.object.build_poursuite(None,text)
+
+ # On cree un nouvel onglet dans le bureau
+ appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
+ label_onglet=None,
+ JDCDISPLAY=macrodisplay.MACRODISPLAY)
+
+ def makeView(self,appli,node):
+ if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
+ showerror("Poursuite vide","Une POURSUITE doit etre correctement initialisée pour etre visualisée")
+ return
+ nom=self.object.nom
+ if hasattr(self.object,'fichier_ini'):
+ if self.object.fichier_ini is None:
+ nom=nom+' '+"Fichier non défini"
+ else:
+ nom=nom+' '+self.object.fichier_ini
+ macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
+
+class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
+ rmenu_specs=[("View","makeView"),
+ ]
+ def iscopiable(self):
+ """
+ Retourne 1 si l'objet est copiable, 0 sinon
+ """
+ return 1
+
+
+def treeitem(appli, labeltext, object, setfunction=None):
+ """ Factory qui retourne l'item adapté au type de macro :
+ INCLUDE, POURSUITE, MACRO
+ """
+ if object.nom == "INCLUDE_MATERIAU":
+ return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
+ elif object.nom == "INCLUDE":
+ return INCLUDETreeItem(appli, labeltext, object, setfunction)
+ elif object.nom == "POURSUITE":
+ return POURSUITETreeItem(appli, labeltext, object, setfunction)
+ else:
+ return MACROTreeItem(appli, labeltext, object, setfunction)
+
+import Accas
+objet=Accas.MACRO_ETAPE
+
+import macrodisplay
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+from Tkinter import *
+import Pmw
+
+from Noyau.N_OBJECT import ErrorObj
+from Editeur import Objecttreeitem
+import panels
+import traceback
+
+class MCLISTPanel(panels.Panel):
+ def init(self):
+ test_ajout = self.node.item.ajout_possible()
+ nom_mcfact = self.node.item.get_nom()
+ if test_ajout:
+ texte = "Pour ajouter une autre occurrence du mot-clé facteur %s, cliquez ci-dessous" %nom_mcfact
+ else:
+ texte = "Vous ne pouvez pas ajouter une autre occurrence du mot-clé facteur %s ?" %nom_mcfact
+ self.label = Label(self,text = texte)
+ self.label.place(relx=0.5,rely=0.4,anchor='center')
+ if test_ajout:
+ self.but=Button(self,text="AJOUTER",command=self.ajout_occurrence)
+ self.but.place(relx=0.5,rely=0.6,anchor='center')
+ #Button(self,text="NON",command=None).place(relx=0.6,rely=0.6,anchor='center')
+
+ def ajout_occurrence(self,event=None):
+ self.node.parent.append_child(self.node.item.get_nom())
+
+import compofact
+import compoerror
+import treewidget
+
+class Node(treewidget.Node):
+ def doPaste(self,node_selected):
+ objet_a_copier = self.item.get_copie_objet()
+ child=node_selected.doPaste_MCF(objet_a_copier)
+ #print "doPaste",child
+ return child
+
+ def doPaste_MCF(self,objet_a_copier):
+ if self.item.isMCList() :
+ # le noeud courant est une MCList
+ child = self.append_child(objet_a_copier,pos='first',retour='oui')
+ #child = self.parent.append_child(objet_a_copier,pos='first',retour='oui')
+ elif self.item.isMCFact() :
+ # le noeud courant est un MCFACT
+ if self.parent.item.isMCList():
+ # le noeud selectionne est un MCFACT dans une MCList
+ child = self.parent.append_child(objet_a_copier,
+ pos=self.item,
+ retour='oui')
+ else:
+ # le noeud MCFACT selectionne n'est pas dans une MCList
+ child = self.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 !")
+ self.appli.affiche_infos("Copie refusée")
+ child=None
+ #print "doPaste_MCF",child
+ return child
+
+class MCListTreeItem(Objecttreeitem.SequenceTreeItem,compofact.FACTTreeItem):
+ """ La classe MCListTreeItem joue le role d'un adaptateur pour les objets
+ du noyau Accas instances de la classe MCLIST.
+ Elle adapte ces objets pour leur permettre d'etre intégrés en tant que
+ noeuds dans un arbre graphique (voir treewidget.py et ObjectTreeItem.py).
+ Cette classe délègue les appels de méthode et les accès
+ aux attributs à l'objet du noyau soit manuellement soit
+ automatiquement (voir classe Delegate et attribut object).
+ """
+ itemNode=Node
+
+ def init(self):
+ # Si l'objet Accas (MCList) a moins d'un mot cle facteur
+ # on utilise directement ce mot cle facteur comme delegue
+ self.updateDelegate()
+
+ def updateDelegate(self):
+ if len(self._object) > 1:
+ self.setdelegate(self._object)
+ else:
+ self.setdelegate(self._object.data[0])
+
+ def panel(self,jdcdisplay,pane,node):
+ """ Retourne une instance de l'objet panneau associe a l'item (self)
+ Si la liste ne contient qu'un mot clé facteur, on utilise le panneau
+ FACTPanel.
+ Si la liste est plus longue on utilise le panneau MCLISTPanel.
+ """
+ if len(self._object) > 1:
+ return MCLISTPanel(jdcdisplay,pane,node)
+ elif isinstance(self._object.data[0],ErrorObj):
+ return compoerror.ERRORPanel(jdcdisplay,pane,node)
+ else:
+ return compofact.FACTPanel(jdcdisplay,pane,node)
+
+ def IsExpandable(self):
+ if len(self._object) > 1:
+ return Objecttreeitem.SequenceTreeItem.IsExpandable(self)
+ else:
+ return compofact.FACTTreeItem.IsExpandable(self)
+
+ def GetSubList(self):
+ self.updateDelegate()
+ if len(self._object) <= 1:
+ self._object.data[0].alt_parent=self._object
+ return compofact.FACTTreeItem.GetSubList(self)
+
+ liste=self._object.data
+ sublist=[None]*len(liste)
+ # suppression des items lies aux objets disparus
+ for item in self.sublist:
+ old_obj=item.getObject()
+ if old_obj in liste:
+ pos=liste.index(old_obj)
+ sublist[pos]=item
+ else:
+ pass # objets supprimes ignores
+ # ajout des items lies aux nouveaux objets
+ pos=0
+ for obj in liste:
+ if sublist[pos] is None:
+ # nouvel objet : on cree un nouvel item
+ def setfunction(value, object=obj):
+ object=value
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+ sublist[pos]=item
+ #Attention : on ajoute une information supplementaire pour l'actualisation de
+ # la validite. L'attribut parent d'un MCFACT pointe sur le parent de la MCLISTE
+ # et pas sur la MCLISTE elle meme ce qui rompt la chaine de remontee des
+ # informations de validite. alt_parent permet de remedier a ce defaut.
+ obj.alt_parent=self._object
+ pos=pos+1
+
+ self.sublist=sublist
+ return self.sublist
+
+ def GetIconName(self):
+ if self._object.isvalid():
+ return "ast-green-los"
+ elif self._object.isoblig():
+ return "ast-red-los"
+ else:
+ return "ast-yel-los"
+
+ def get_docu(self):
+ """ Retourne la clé de doc de l'objet pointé par self """
+ return self.object.get_docu()
+
+ def iscopiable(self):
+ if len(self._object) > 1:
+ return Objecttreeitem.SequenceTreeItem.iscopiable(self)
+ else:
+ return compofact.FACTTreeItem.iscopiable(self)
+
+ def isMCFact(self):
+ """
+ Retourne 1 si l'objet pointé par self est un MCFact, 0 sinon
+ """
+ return len(self._object) <= 1
+
+ def isMCList(self):
+ """
+ Retourne 1 si l'objet pointé par self est une MCList, 0 sinon
+ """
+ return len(self._object) > 1
+
+ def get_copie_objet(self):
+ return self._object.data[0].copy()
+
+ def additem(self,obj,pos):
+ #print "compomclist.additem",obj,pos
+ if len(self._object) <= 1:
+ return compofact.FACTTreeItem.additem(self,obj,pos)
+
+ o= self.object.addentite(obj,pos)
+ return o
+
+ def suppitem(self,item):
+ """
+ Retire un objet MCFACT de la MCList (self.object)
+ """
+ #print "compomclist.suppitem",item
+ obj=item.getObject()
+ if len(self._object) <= 1:
+ return compofact.FACTTreeItem.suppitem(self,item)
+
+ if self.object.suppentite(obj):
+ if len(self._object) == 1: self.updateDelegate()
+ message = "Mot-clé " + obj.nom + " supprimé"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos('Impossible de supprimer ce mot-clé')
+ return 0
+
+
+import Accas
+objet = Accas.MCList
+
+def treeitem(appli,labeltext,object,setfunction):
+ """ Factory qui produit un objet treeitem adapte a un objet
+ Accas.MCList (attribut objet de ce module)
+ """
+ return MCListTreeItem(appli,labeltext,object,setfunction)
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 *
+import Pmw
+
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+from Extensions import commentaire
+
+Fonte_Niveau = fontes.canvas_gras_italique
+Fonte_Niveau_inactif = fontes.canvas_italique
+
+class NIVEAUPanel(panels.OngletPanel):
+ def init(self):
+ """ Initialise les frame des panneaux contextuels relatifs à un JDC """
+ panneau=Pmw.PanedWidget(self,orient='horizontal')
+ panneau.add('left',min=0.4,max=0.6,size=0.5)
+ panneau.add('right',min=0.4,max=0.6,size=0.5)
+ panneau.pack(expand=1,fill='both')
+ self.bouton_com.pack_forget()
+ self.makeJDCPage(panneau.pane('left'))
+ self.enlevebind()
+
+
+import treewidget
+class Node(treewidget.Node):pass
+
+
+class NIVEAUTreeItem(Objecttreeitem.ObjectTreeItem):
+ panel = NIVEAUPanel
+ itemNode=Node
+
+ def isactif(self):
+ return self.object.isactif()
+
+ def IsExpandable(self):
+ return 1
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ if self.isactif():
+ fonte = Fonte_Niveau
+ else :
+ fonte = Fonte_Niveau_inactif
+ return self.labeltext,fonte,'#00008b'
+
+ def GetIconName(self):
+ if self.isactif():
+ if self.object.isvalid():
+ return "ast-green-text"
+ else:
+ return "ast-red-text"
+ else:
+ return "ast-white-text"
+
+ def keys(self):
+ if self.object.etapes_niveaux != []:
+ return range(len(self.object.etapes_niveaux))
+ else:
+ return range(len(self.object.etapes))
+
+ def GetSubList(self):
+ sublist=[]
+ for key in self.keys():
+ if self.object.etapes_niveaux != []:
+ liste = self.object.etapes_niveaux
+ else:
+ liste = self.object.etapes
+ try:
+ value = liste[key]
+ except KeyError:
+ continue
+ def setfunction(value, key=key, object=liste):
+ object[key] = value
+ item =self.make_objecttreeitem(self.appli,value.ident() + " : ", value, setfunction)
+ sublist.append(item)
+ return sublist
+
+ def additem(self,name,pos):
+ if isinstance(name,Objecttreeitem.TreeItem) :
+ cmd=self.object.addentite(name.getObject(),pos)
+ else :
+ cmd = self.object.addentite(name,pos)
+ item = self.make_objecttreeitem(self.appli,cmd.nom + " : ", cmd)
+ return item
+
+ def suppitem(self,item) :
+ # item = item de l'ETAPE à supprimer du JDC
+ # item.getObject() = ETAPE ou COMMENTAIRE
+ # self.object = JDC
+ itemobject=item.getObject()
+ if self.object.suppentite(itemobject):
+ if isinstance(item.object,commentaire.COMMENTAIRE):
+ message = "Commentaire supprimé"
+ else :
+ message = "Commande " + itemobject.nom + " supprimée"
+ self.appli.affiche_infos(message)
+ return 1
+ else:
+ self.appli.affiche_infos("Pb interne : impossible de supprimer cet objet")
+ return 0
+
+ def GetText(self):
+ return ''
+
+
+import Accas
+treeitem = NIVEAUTreeItem
+objet = Accas.ETAPE_NIVEAU
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 types
+import Tkinter
+import Pmw
+from repr import Repr
+from copy import copy,deepcopy
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+import panels
+
+#
+__version__="$Name: BR_V1_12qt $"
+__Id__="$Id: componuplet.py,v 1.9 2005-12-07 10:20:34 eficas Exp $"
+#
+
+myrepr = Repr()
+myrepr.maxstring = 100
+myrepr.maxother = 100
+
+# Si Expandable vaut 1 les éléments du nuplet apparaissent dans l'arbre
+# Si Expandable vaut 0 les éléments n'apparaissent pas
+Expandable=1
+
+class NUPLETPanel(panels.OngletPanel):
+ def init(self):
+ """ Initialise les frame des panneaux contextuels relatifs \340 un NUPLET """
+ self.nb=Pmw.NoteBook(self,raisecommand=self.raisecmd)
+ self.nb.pack(fill = 'both', expand = 1)
+ self.nb.add("Valeurs",tab_text="Saisir valeurs")
+ self.makeValeurPage(self.nb.page('Valeurs'))
+ self.enlevebind()
+ self.creebind()
+ self.nb.setnaturalsize()
+
+ def makeValeurPage(self,page):
+ label = Tkinter.Label(page,text='Valeurs :').pack(side=Tkinter.LEFT)
+ i=0
+ for obj in self.node.item.object.mc_liste:
+ frame_valeur=Tkinter.Frame(page)
+ frame_valeur.pack(side=Tkinter.LEFT)
+ if hasattr(obj,'definition'):
+ objet_mc=obj.definition
+ else:
+ objet_mc=None
+ valeur=obj.valeur
+ if type(valeur) == types.InstanceType :
+ valeur=obj.getval()
+ aide=self.gen_aide(obj)
+ if objet_mc.into != None :
+ l_choix=list(objet_mc.into)
+ #obj.set_valeur(l_choix[0],evaluation='non')
+ obj.set_valeur(l_choix[0])
+ option=Pmw.OptionMenu (frame_valeur,
+ items = l_choix,
+ menubutton_width = 10,
+ command = lambda e,obj=obj,s=self:s.record_valeur(val=e,obj=obj),
+ )
+ option.pack(side=Tkinter.LEFT,padx=1)
+ else :
+ entry = Tkinter.Entry(frame_valeur,relief='sunken',width=10)
+ entry.pack(side=Tkinter.LEFT,padx=1)
+ entry.bind("<Return>",
+ lambda e,obj=obj,s=self:s.valid_valeur(e,obj=obj))
+ entry.bind("<KP_Enter>",
+ lambda e,obj=obj,s=self:s.valid_valeur(e,obj=obj))
+ if i==0:entry.focus_set()
+ #aide = Tkinter.Label(frame_valeur, text = aide)
+ #aide.place(relx=0.5,rely=0.55,anchor='n')
+ if valeur != None :
+ entry.delete(0,Tkinter.END)
+ entry.insert(0,obj.getval())
+ i=i+1
+
+ def record_valeur(self,val=None,obj=None,mess='Valeur du mot-cl\351 enregistr\351e'):
+ """
+ Enregistre val comme valeur de self.node.item.object SANS faire de
+ test de validité
+ """
+ #obj.set_valeur(val,evaluation='non')
+ obj.set_valeur(val)
+ self.parent.appli.affiche_infos(mess)
+ #self.node.parent.verif()
+ #self.node.update()
+
+ def valid_valeur(self,e,obj=None,mess='Valeur du mot-cl\351 enregistr\351e'):
+ """
+ Enregistre val comme valeur de self.node.item.object avec
+ test de validité
+ """
+ valeur=e.widget.get()
+ e.widget.delete(0,Tkinter.END)
+ anc_val=obj.getval()
+ if anc_val == None:anc_val=''
+ test=obj.set_valeur(valeur)
+ if test:
+ if obj.isvalid():
+ self.parent.appli.affiche_infos('Valeur du mot-cl\351 enregistr\351e')
+ e.widget.insert(0,obj.getval())
+ else:
+ #obj.set_valeur(anc_val,evaluation='non')
+ obj.set_valeur(anc_val)
+ self.parent.appli.affiche_infos("valeur du mot-cl\351 non autoris\351e")
+ e.widget.insert(0,anc_val)
+ else:
+ print "impossible d'\351valuer : %s " %valeur
+ print "test =",test
+ self.parent.appli.affiche_infos("valeur du mot-cl\351 non autoris\351e")
+ e.widget.delete(0,Tkinter.END)
+ e.widget.insert(0,anc_val)
+
+ #self.node.parent.verif()
+ #self.node.update()
+
+ def gen_aide(self,obj):
+ return ""
+
+
+class NUPLETTreeItem(Objecttreeitem.ObjectTreeItem):
+ panel=NUPLETPanel
+
+ def IsExpandable(self):
+ return Expandable
+
+ def GetText(self):
+ return ''
+
+ def isvalid(self):
+ return self.object.isvalid()
+
+ def GetIconName(self):
+ if self.object.isvalid():
+ return "ast-green-los"
+ elif self.object.isoblig():
+ return "ast-red-los"
+ else:
+ return "ast-yel-los"
+
+ def GetSubList(self):
+ if not Expandable:return []
+ sublist=[]
+ for obj in self.object.mc_liste:
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, None)
+ sublist.append(item)
+ return sublist
+
+ def additem(self,name,pos):
+ raise "NUPLET"
+
+ def suppitem(self,item) :
+ raise "NUPLET"
+
+import Accas
+treeitem=NUPLETTreeItem
+objet=Accas.MCNUPLET
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 *
+import Pmw
+import traceback
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+
+class OPERPanel(panels.OngletPanel):
+
+ def init(self):
+ nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+ nb.pack(fill = 'both', expand = 1)
+ self.nb=nb
+ nb.add('Mocles', tab_text='Nouveau mot-clé')
+ nb.add('Concept', tab_text='Nommer concept')
+ nb.add('Commande', tab_text='Nouvelle Commande')
+ nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+ panneau=Pmw.PanedWidget(nb.page("Mocles"),
+ orient='horizontal')
+ panneau.add('left',min=0.4,max=0.60,size=0.50)
+ panneau.add('right',min=0.4,max=0.60,size=0.50)
+ panneau.pack(expand=1,fill='both')
+ panneau.setnaturalsize()
+ self.makeCommandePage(nb.page("Commande"))
+ self.makeConceptPage_oper(nb.page("Concept"))
+ self.makeMoclesPage(panneau.pane('left'))
+ self.makeReglesPage(panneau.pane('right'))
+ #self.makeCommentairePage(nb.page("Commentaire"))
+ self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+ nb.tab('Mocles').focus_set()
+ self.nb.setnaturalsize()
+ self.enlevebind()
+ self.creebind()
+ self.affiche()
+
+ def makeConceptPage_oper(self,page):
+ """ Crée la page de saisie du nom du concept """
+ if self.node.item.is_reentrant():
+ # commande obligatoirement reentrante
+ self.makeConceptPage_reentrant(page)
+ else:
+ # commande non reentrante ou facultativement reentrante
+ self.makeConceptPage(page)
+
+ def makeConceptPage_reentrant(self,page):
+ """ Crée la page de saisie du nom de concept pour un opérateur reentrant
+ cad propose dans la liste des SD utilisées dans la commande celle(s) dont le
+ type est compatible avec celui que retourne l'opérateur """
+ liste_noms_sd = self.node.item.get_noms_sd_oper_reentrant()
+ self.listbox = Pmw.ScrolledListBox(page,
+ items=liste_noms_sd,
+ labelpos='n',
+ label_text="Structure(s) de données à enrichir par l'opérateur courant :",
+ listbox_height = 6,
+ selectioncommand=self.select_valeur_from_list,
+ dblclickcommand=lambda s=self,c=self.execConcept : s.choose_valeur_from_list(c))
+ self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
+ Label(page,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
+ self.valeur_choisie = StringVar()
+ self.label_valeur = Label(page,textvariable=self.valeur_choisie)
+ self.label_valeur.place(relx=0.45,rely=0.6)
+ if len(liste_noms_sd) == 1 :
+ self.valeur_choisie.set(liste_noms_sd[0])
+
+ def select_valeur_from_list(self):
+ try:
+ choix = self.listbox.getcurselection()[0]
+ self.valeur_choisie.set(choix)
+ except:
+ traceback.print_exc()
+
+
+ def choose_valeur_from_list(self,command):
+ try:
+ choix = self.listbox.getcurselection()[0]
+ self.valeur_choisie.set(choix)
+ apply(command,(),{})
+ except:
+ traceback.print_exc()
+
+import treewidget
+class Node(treewidget.Node):
+ def doPaste(self,node_selected):
+ """
+ Déclenche la copie de l'objet item avec pour cible
+ l'objet passé en argument : node_selected
+ """
+ objet_a_copier = self.item.get_copie_objet()
+ child=node_selected.doPaste_Commande(objet_a_copier)
+ return child
+
+ def doPaste_Commande(self,objet_a_copier):
+ """
+ Réalise la copie de l'objet passé en argument qui est nécessairement
+ une commande
+ """
+ parent=self.parent
+ #child = parent.item.append_child(objet_a_copier,self.item.getObject())
+ child = self.append_brother(objet_a_copier,retour='oui')
+ #if child is None:return 0
+ return child
+
+ def doPaste_MCF(self,objet_a_copier):
+ """
+ Réalise la copie de l'objet passé en argument (objet_a_copier)
+ Il s'agit forcément d'un mot clé facteur
+ """
+ child = self.append_child(objet_a_copier,pos='first',retour='oui')
+ return child
+
+
+class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
+ """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
+ Accas. Elle leur permet d'etre affichés comme des noeuds
+ d'un arbre graphique.
+ Cette classe a entre autres deux attributs importants :
+ - _object qui est un pointeur vers l'objet du noyau
+ - object qui pointe vers l'objet auquel sont délégués les
+ appels de méthode et les accès aux attributs
+ Dans le cas d'une ETAPE, _object et object pointent vers le
+ meme objet.
+ """
+ panel = OPERPanel
+ itemNode=Node
+
+ def IsExpandable(self):
+ return 1
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icône à afficher dans l'arbre
+ Ce nom dépend de la validité de l'objet
+ """
+ if not self.object.isactif():
+ return "ast-white-square"
+ elif self.object.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ if self.object.isactif():
+ # None --> fonte et couleur par défaut
+ return self.labeltext,None,None
+ else:
+ return self.labeltext,fontes.standard_italique,None
+
+ def get_objet(self,name) :
+ for v in self.object.mc_liste:
+ if v.nom == name : return v
+ return None
+
+ def get_type_sd_prod(self):
+ """
+ Retourne le nom du type du concept résultat de l'étape
+ """
+ sd_prod=self.object.get_type_produit()
+ if sd_prod:
+ return sd_prod.__name__
+ else:
+ return ""
+
+ def additem(self,name,pos):
+ #print "compooper.additem",name,pos
+ mcent = self._object.addentite(name,pos)
+ return mcent
+
+ def suppitem(self,item) :
+ # item : item du MOCLE de l'ETAPE à supprimer
+ # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList
+ itemobject=item.getObject()
+ if itemobject.isoblig() :
+ self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
+ return 0
+ if self.object.suppentite(itemobject):
+ message = "Mot-clé " + itemobject.nom + " supprimé"
+ self.appli.affiche_infos(message)
+ return 1
+ else :
+ self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
+ return 0
+
+ def GetText(self):
+ try:
+ return self.object.get_sdname()
+ except:
+ return ''
+
+ def keys(self):
+ keys=self.object.mc_dict.keys()
+ return keys
+
+ def GetSubList(self):
+ """
+ Reactualise la liste des items fils stockes dans self.sublist
+ """
+ if self.isactif():
+ liste=self.object.mc_liste
+ else:
+ liste=[]
+
+ sublist=[None]*len(liste)
+ # suppression des items lies aux objets disparus
+ for item in self.sublist:
+ old_obj=item.getObject()
+ if old_obj in liste:
+ pos=liste.index(old_obj)
+ sublist[pos]=item
+ else:
+ pass # objets supprimes ignores
+
+ # ajout des items lies aux nouveaux objets
+ pos=0
+ for obj in liste:
+ if sublist[pos] is None:
+ # nouvel objet : on cree un nouvel item
+ def setfunction(value, object=obj):
+ object.setval(value)
+ item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+ sublist[pos]=item
+ pos=pos+1
+
+ self.sublist=sublist
+ return self.sublist
+
+ def isvalid(self):
+ return self.object.isvalid()
+
+ def iscopiable(self):
+ """
+ Retourne 1 si l'objet est copiable, 0 sinon
+ """
+ return 1
+
+ def update(self,item):
+ if item.sd and item.sd.nom:
+ self.nomme_sd(item.sd.nom)
+
+ def nomme_sd(self,nom):
+ """ Lance la méthode de nommage de la SD """
+ oldnom=""
+ if self.object.sd != None :
+ oldnom=self.object.sd.nom
+ test,mess= self.object.nomme_sd(nom)
+ if test:self.object.parent.reset_context()
+ if (test and self.appli.dict_reels.has_key(oldnom) ):
+ self.appli.dict_reels[nom]=self.appli.dict_reels[oldnom]
+ return test,mess
+
+ def is_reentrant(self):
+ return self.object.is_reentrant()
+
+ def get_noms_sd_oper_reentrant(self):
+ return self.object.get_noms_sd_oper_reentrant()
+
+ def get_objet_commentarise(self):
+ """
+ Cette méthode retourne un objet commentarisé
+ représentatif de self.object
+ """
+ # Format de fichier utilisé
+ format=self.appli.format_fichier.get()
+ return self.object.get_objet_commentarise(format)
+
+ def get_objet_commentarise_BAK(self):
+ """
+ Cette méthode retourne un objet commentarisé
+ représentatif de self.object
+ """
+ import generator,string,Accas
+ # Format de fichier utilisé
+ format=self.appli.format_fichier.get()
+ g=generator.plugins[format]()
+ texte_commande = g.gener(self.object,format='beautifie')
+ # Il faut enlever la première ligne vide de texte_commande que
+ # rajoute le generator
+ rebut,texte_commande = string.split(texte_commande,'\n',1)
+ # on construit l'objet COMMANDE_COMM repésentatif de self mais non
+ # enregistré dans le jdc
+ commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
+ parent=self.object.parent)
+ commande_comment.niveau = self.object.niveau
+ commande_comment.jdc = commande_comment.parent = self.object.jdc
+
+ pos=self.object.parent.etapes.index(self.object)
+ parent=self.object.parent
+ self.object.parent.suppentite(self.object)
+ parent.addentite(commande_comment,pos)
+
+ return commande_comment
+
+ def visu_3D(self,appli,node) :
+ import TroisDPal
+ troisD=TroisDPal.TroisDPilote(node.item,appli,node.parent)
+ troisD.envoievisu()
+
+import Accas
+treeitem = EtapeTreeItem
+objet = Accas.ETAPE
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 les classes permettant de définir les objets graphiques
+ représentant un objet de type PARAMETRE, cad le panneau et l'item de l'arbre
+ d'EFICAS
+"""
+
+# import modules Python
+from Tkinter import *
+import Pmw
+import string
+
+# import modules EFICAS
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+
+
+Fonte_PARAMETRE = fontes.standard_italique
+Fonte_TITRE = fontes.standard_gras_souligne
+
+
+class PARAMPanel(panels.OngletPanel):
+ """
+ Classe servant à construire le panneau associé à un paramètre.
+ C'est au moyen de ce panneau que l'utilisateur peut accéder
+ aux nom et valeur du paramètre en vue éventuellement de les
+ modifier.
+ """
+
+ def init(self):
+ """
+ Initialise les frame des panneaux contextuels relatifs à un PARAMETRE
+ """
+ nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+ nb.pack(fill = 'both', expand = 1)
+ self.nb=nb
+ nb.add('Parametre', tab_text='Valeur Paramètre')
+ nb.add('Commande', tab_text='Nouvelle Commande')
+ nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+ self.makeParametrePage(nb.page("Parametre"))
+ self.makeCommandePage(nb.page("Commande"))
+ self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+ nb.tab('Parametre').focus_set()
+ nb.setnaturalsize()
+ self.make_buttons()
+ self.enlevebind()
+ self.creebind()
+
+ def makeParametrePage(self,page):
+ """
+ Crée la page qui permet d'afficher et d'éditer le texte du PARAMETRE
+ """
+ self.frame_valeur = Frame(page)
+ #self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
+ self.frame_valeur.pack(expand=1)
+ # affichage du titre du panneau
+ self.titre = StringVar()
+ self.titre.set("PARAMETRE "+self.node.item.get_nom())
+ #Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.1,anchor='n')
+ Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).grid(row=0,columnspan=2,padx=5,pady=5)
+ # création des labels et entries associés aux nom et valeur du paramètre
+ #Label(self.frame_valeur,text= 'Nom du paramètre : ').place(relx=0.,rely=0.3)
+ Label(self.frame_valeur,text= 'Nom du paramètre : ').grid(row=1,sticky=W,padx=5,pady=5)
+ self.entry_nom = Entry(self.frame_valeur)
+ #Label(self.frame_valeur,text= 'Valeur du paramètre : ').place(relx=0.,rely=0.5)
+ Label(self.frame_valeur,text= 'Valeur du paramètre : ').grid(row=2,sticky=W,padx=5,pady=5)
+ self.entry_val = Entry(self.frame_valeur)
+ # binding sur entry_nom
+ self.entry_nom.bind("<Return>",lambda e,s=self : s.entry_val.focus())
+ self.entry_val.bind("<Return>",lambda e,s=self : s.change_valeur())
+ self.entry_nom.bind("<KP_Enter>",lambda e,s=self : s.entry_val.focus())
+ self.entry_val.bind("<KP_Enter>",lambda e,s=self : s.change_valeur())
+ # affichage des entries
+ #self.entry_nom.place(relx=0.35,rely=0.3,relwidth=0.3)
+ self.entry_nom.grid(row=1,column=1,sticky=W,padx=5,pady=5)
+ #self.entry_val.place(relx=0.35,rely=0.5,relwidth=0.5)
+ self.entry_val.grid(row=2,column=1,sticky=W,padx=5,pady=5)
+ # affichage d'une phrase d'aide
+ aide = """
+ Un retour de chariot dans une zone de saisie vous permet de vérifier si
+ la valeur que vous avez entrée est valide.
+ Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
+ valeurs seront effectivement prises en compte
+ """
+ #Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.65,anchor='n')
+ Label(self.frame_valeur,text=aide).grid(row=3,columnspan=2,padx=5,pady=5)
+ self.frame_valeur.columnconfigure(1,weight=1)
+ # affichage des nom et valeur du paramètre
+ self.display_valeur()
+ self.entry_nom.focus()
+
+ def make_buttons(self):
+ """
+ Crée les boutons du panneau
+ """
+ #self.bouton_sup.place_forget()
+ #self.bouton_doc.place_forget()
+ #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
+ #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
+ #self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
+ #self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
+ #self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
+
+ self.bouton_sup.pack_forget()
+ self.bouton_doc.pack_forget()
+ self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
+ self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
+ self.bouton_val.pack(side='left',padx=5, pady=5)
+ self.bouton_ann.pack(side='left',padx=5, pady=5)
+ self.bouton_sup.pack(side='right',padx=5, pady=5)
+
+ def change_valeur(self):
+ """
+ Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du PARAMETRE
+ """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ new_nom = self.entry_nom.get()
+ new_val = self.entry_val.get()
+ self.node.item.set_nom(new_nom)
+ self.node.item.set_valeur(new_val)
+ self.node.update()
+ self.display_valeur()
+
+ def display_valeur(self):
+ """
+ Affiche dans self.widget_text la valeur de l'objet PARAMETRE
+ (annule d'éventuelles modifications faite par l'utilisateur)
+ """
+ self.entry_nom.delete(0,END)
+ self.entry_val.delete(0,END)
+ self.titre.set('PARAMETRE '+self.node.item.get_nom())
+ self.entry_nom.insert(END,self.node.item.get_nom())
+ self.entry_val.insert(END,self.node.item.get_valeur())
+
+class PARAMTreeItem(Objecttreeitem.ObjectTreeItem):
+ """
+ Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
+ qui représente le PARAMETRE
+ """
+ panel = PARAMPanel
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+# API du PARAMETRE pour l'arbre
+# ---------------------------------------------------------------------------
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icône associée au noeud qui porte self,
+ dépendant de la validité de l'objet
+ NB : un PARAMETRE est toujours valide ...
+ """
+ if self.isactif():
+ if self.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+ else:
+ return "ast-white-square"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ return 'Paramètre',Fonte_PARAMETRE,None
+
+ def GetText(self):
+ """
+ Retourne le texte à afficher après le nom de la commande (ici après 'paramètre')
+ Ce texte est tronqué à 25 caractères
+ """
+ texte = repr(self.object)
+ texte = string.split(texte,'\n')[0]
+ if len(texte) < 25 :
+ return texte
+ else :
+ return texte[0:24]+'...'
+
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ """
+ return []
+
+# ---------------------------------------------------------------------------
+# Méthodes permettant la modification et la lecture des attributs
+# du paramètre = API graphique du PARAMETRE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+ def get_valeur(self):
+ """
+ Retourne la valeur de l'objet PARAMETRE cad son texte
+ """
+ if self.object.valeur is None: return ''
+ else: return self.object.valeur
+
+ def get_nom(self):
+ """
+ Retourne le nom du paramètre
+ """
+ return self.object.nom
+
+ def set_valeur(self,new_valeur):
+ """
+ Affecte valeur à l'objet PARAMETRE
+ """
+ self.object.set_valeur(new_valeur)
+
+ def set_nom(self,new_nom):
+ """
+ Renomme le paramètre
+ """
+ self.object.set_nom(new_nom)
+ #self.object.set_attribut('nom',new_nom)
+
+ def get_fr(self):
+ """
+ Retourne le fr associé au paramètre, cad la bulle d'aide pour EFICAS
+ """
+ return "Définition d'un paramètre"
+
+import Extensions.parametre
+treeitem =PARAMTreeItem
+objet = Extensions.parametre.PARAMETRE
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 les classes permettant de définir les objets graphiques
+représentant un objet de type PARAMETRE_EVAL, cad le panneau et l'item de l'arbre
+d'EFICAS
+"""
+
+# import modules Python
+from Tkinter import *
+import Pmw
+import string
+
+# import modules EFICAS
+import widgets
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+
+
+Fonte_PARAMETRE = fontes.standard_italique
+Fonte_TITRE = fontes.standard_gras_souligne
+
+
+class PARAM_EVALPanel(panels.OngletPanel):
+ """
+ Classe servant à construire le panneau associé à un paramètre.
+ C'est au moyen de ce panneau que l'utilisateur peut accéder
+ aux nom et valeur du paramètre en vue éventuellement de les
+ modifier.
+ """
+
+ def init(self):
+ """
+ Initialise les frame des panneaux contextuels relatifs à un PARAMETRE
+ """
+ nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+ nb.pack(fill = 'both', expand = 1)
+ self.nb=nb
+ nb.add('Parametre', tab_text='Paramètre EVAL')
+ nb.add('Commande', tab_text='Nouvelle Commande')
+ nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+ self.makeParametrePage(nb.page("Parametre"))
+ self.makeCommandePage(nb.page("Commande"))
+ self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+ nb.tab('Parametre').focus_set()
+ nb.setnaturalsize()
+ self.make_buttons()
+
+ def makeParametrePage(self,page):
+ """
+ Crée la page qui permet d'afficher et d'éditer le texte du PARAMETRE
+ """
+ self.frame_valeur = Frame(page)
+ self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
+ # affichage du titre du panneau
+ self.titre = StringVar()
+ self.titre.set("PARAMETRE EVAL "+self.node.item.get_nom())
+ Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.1,anchor='n')
+ # création des labels et entries associés aux nom et valeur du paramètre
+ Label(self.frame_valeur,text= 'Nom du paramètre : ').place(relx=0.,rely=0.3)
+ self.entry_nom = Entry(self.frame_valeur)
+ Label(self.frame_valeur,text= 'Valeur du paramètre : ').place(relx=0.,rely=0.5)
+ self.entry_val = Entry(self.frame_valeur)
+ # binding sur entry_nom
+ self.entry_nom.bind("<Return>",lambda e,s=self : s.verif_nom())
+ self.entry_val.bind("<Return>",lambda e,s=self : s.verif_eval())
+ self.entry_nom.bind("<KP_Enter>",lambda e,s=self : s.verif_nom())
+ self.entry_val.bind("<KP_Enter>",lambda e,s=self : s.verif_eval())
+ # affichage des entries
+ self.entry_nom.place(relx=0.35,rely=0.3,relwidth=0.3)
+ self.entry_val.place(relx=0.35,rely=0.5,relwidth=0.5)
+ # affichage d'une phrase d'aide
+ aide = """
+ Un retour de chariot dans une zone de saisie vous permet de vérifier si
+ la valeur que vous avez entrée est valide.
+ Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
+ valeurs seront effectivement prises en compte
+ """
+ Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.65,anchor='n')
+ # affichage des nom et valeur du paramètre
+ self.display_valeur()
+ self.entry_nom.focus()
+
+ def make_buttons(self):
+ """
+ Crée les boutons du panneau
+ """
+ #self.bouton_sup.place_forget()
+ #self.bouton_doc.place_forget()
+ self.bouton_sup.pack_forget()
+ self.bouton_doc.pack_forget()
+ #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
+ #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
+ self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
+ self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
+ self.bouton_val.bind("<Return>",lambda e,s=self : s.bouton_val.invoke())
+ self.bouton_val.bind("<KP_Enter>",lambda e,s=self : s.bouton_val.invoke())
+ #self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
+ #self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
+ #self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
+ self.bouton_val.pack(side='left',padx=5, pady=5)
+ self.bouton_ann.pack(side='left',padx=5, pady=5)
+ self.bouton_sup.pack(side='left',padx=5, pady=5)
+
+ def change_valeur(self):
+ """
+ Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du PARAMETRE
+ """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ new_nom = self.entry_nom.get()
+ new_val = self.entry_val.get()
+ #self.node.item.set_nom(new_nom)
+ #self.node.item.set_valeur(new_val)
+ #self.node.update()
+ #self.display_valeur()
+ # on essaie de stocker les noms et valeurs
+ test,erreur = self.node.item.save_parametre_eval(new_nom,new_val)
+ if test :
+ # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
+ self.node.update()
+ self.display_valeur()
+ self.parent.appli.affiche_infos("Expression EVAL %s modifiée" %self.node.item.get_nom())
+ else:
+ # la formule est incorrecte : on affiche les erreurs
+ widgets.showerror("Expression EVAL incorrecte",erreur)
+ self.parent.appli.affiche_infos("Expression EVAL %s non modifiée" %self.node.item.get_nom())
+
+ def display_valeur(self):
+ """
+ Affiche dans self.widget_text la valeur de l'objet PARAMETRE
+ (annule d'éventuelles modifications faite par l'utilisateur)
+ """
+ self.entry_nom.delete(0,END)
+ self.entry_val.delete(0,END)
+ self.titre.set('PARAMETRE '+self.node.item.get_nom())
+ self.entry_nom.insert(END,self.node.item.get_nom())
+ self.entry_val.insert(END,self.node.item.get_valeur())
+
+ def verif_nom(self):
+ """
+ Lance la vérification du nom donné par l'utilisateur dans entry_nom
+ """
+ nom = self.entry_nom.get()
+ test,erreur = self.node.item.verif_nom(nom)
+ if not test :
+ widgets.showerror("Nom invalide",erreur)
+ self.entry_nom.focus()
+ self.entry_nom.selection_range(0,END)
+ self.parent.appli.affiche_infos("Nom du paramètre refusé")
+ else:
+ self.parent.appli.affiche_infos("Nom du paramètre accepté")
+
+ def verif_eval(self,event=None):
+ """
+ Lance la vérification de l'expression EVAL présente dans entry_val
+ """
+ exp_eval = self.entry_val.get()
+ test,erreur = self.node.item.verif_eval(exp_eval)
+ if not test:
+ widgets.showerror("Expression EVAL invalide",erreur)
+ self.entry_val.focus()
+ self.entry_val.selection_range(0,END)
+ self.parent.appli.affiche_infos("Expression EVAL refusée")
+ else:
+ self.parent.appli.affiche_infos("Expression EVAL acceptée")
+
+class PARAM_EVALTreeItem(Objecttreeitem.ObjectTreeItem):
+ """
+ Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
+ qui représente le PARAMETRE
+ """
+ panel = PARAM_EVALPanel
+
+ def init(self):
+ self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+# API du PARAMETRE pour l'arbre
+# ---------------------------------------------------------------------------
+
+ def GetIconName(self):
+ """
+ Retourne le nom de l'icône associée au noeud qui porte self,
+ dépendant de la validité de l'objet
+ NB : un PARAMETRE est toujours valide ...
+ """
+ if self.isactif():
+ if self.isvalid():
+ return "ast-green-square"
+ else:
+ return "ast-red-square"
+ else:
+ return "ast-white-square"
+
+ def GetLabelText(self):
+ """ Retourne 3 valeurs :
+ - le texte à afficher dans le noeud représentant l'item
+ - la fonte dans laquelle afficher ce texte
+ - la couleur du texte
+ """
+ return 'EVAL',Fonte_PARAMETRE,None
+
+ def GetText(self):
+ """
+ Retourne le texte à afficher après le nom de la commande (ici après 'paramètre')
+ Ce texte est tronqué à 25 caractères
+ """
+ texte = repr(self.object)
+ texte = string.split(texte,'\n')[0]
+ if len(texte) < 25 :
+ return texte
+ else :
+ return texte[0:24]+'...'
+
+ def GetSubList(self):
+ """
+ Retourne la liste des fils de self
+ """
+ return []
+
+# ---------------------------------------------------------------------------
+# Méthodes permettant la modification et la lecture des attributs
+# du paramètre = API graphique du PARAMETRE pour Panel et EFICAS
+# ---------------------------------------------------------------------------
+
+ def isvalid(self):
+ """
+ Indique si l'objet pointé par self est valide
+ """
+ return self.object.isvalid()
+
+ def get_valeur(self):
+ """
+ Retourne une chaîne représentant la valeur de l'objet PARAMETRE
+ cad de l'objet class_eval.EVAL
+ """
+ return self.object.get_valeur() or ''
+
+ def get_nom(self):
+ """
+ Retourne le nom du paramètre
+ """
+ return self.object.get_nom()
+
+ def set_valeur(self,new_valeur):
+ """
+ Affecte new_valeur à l'objet PARAMETRE_EVAL
+ """
+ # on construit le texte de la nouvelle valeur
+ new_valeur = 'EVAL("""'+new_valeur+'""")'
+ # on affecte la nouvelle valeur à self.object
+ self.object.set_valeur(new_valeur)
+
+ def set_nom(self,new_nom):
+ """
+ Renomme le paramètre
+ """
+ self.object.set_nom(new_nom)
+
+ def get_fr(self):
+ """
+ Retourne le fr associé au paramètre, cad la bulle d'aide pour EFICAS
+ """
+ return "Définition d'un paramètre de type EVAL"
+
+ def verif_nom(self,nom):
+ """
+ Lance la vérification de validité du nom passé en argument
+ """
+ return self.object.verif_nom(nom = nom)
+
+ def verif_eval(self,valeur):
+ """
+ Lance la vérification de validité de l'expression EVAL passée en argument
+ """
+ return self.object.verif_eval(exp_eval = valeur)
+
+ def save_parametre_eval(self,new_nom,new_val):
+ """
+ Vérifie si (new_nom,new_val) définit bien un EVAL licite :
+ - si oui, stocke ces paramètres comme nouveaux paramètres de l'EVAL courant et retourne 1
+ - si non, laisse les paramètres anciens de EVAL inchangés et retourne 0
+ """
+ test,erreur = self.object.verif_parametre_eval(param=(new_nom,new_val))
+ if test :
+ # la formule est bien correcte : on sauve les nouveaux paramètres
+ self.object.update(param=(new_nom,new_val))
+ return test,erreur
+
+import Extensions.parametre_eval
+treeitem =PARAM_EVALTreeItem
+objet = Extensions.parametre_eval.PARAMETRE_EVAL
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 *
+import Pmw
+
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+import compooper
+
+class PROCPanel(panels.OngletPanel):
+ def init(self):
+ nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+ self.nb=nb
+ nb.pack(fill = 'both', expand = 1)
+ nb.add('Mocles', tab_text='Ajouter mots-clés')
+ nb.add('Commande', tab_text='Nouvelle Commande')
+ nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+ panneau=Pmw.PanedWidget(nb.page("Mocles"),
+ orient='horizontal')
+ panneau.add('left',min=0.4,max=0.6,size=0.5)
+ panneau.add('right',min=0.4,max=0.6,size=0.5)
+ panneau.pack(expand=1,fill='both')
+ self.makeCommandePage(nb.page("Commande"))
+ self.makeMoclesPage(panneau.pane('left'))
+ self.makeReglesPage(panneau.pane('right'))
+ self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+ nb.setnaturalsize()
+ self.enlevebind()
+ self.creebind()
+ self.affiche()
+
+class ProcEtapeTreeItem(compooper.EtapeTreeItem):
+ panel = PROCPanel
+
+import Accas
+treeitem = ProcEtapeTreeItem
+objet = Accas.PROC_ETAPE
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+
+class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
+ from newsimppanel import newSIMPPanel
+ panel = newSIMPPanel
+
+ def init(self) :
+ self.expandable = 0
+ self.affect_panel()
+
+
+ def affect_panel(self):
+ """
+ Cette méthode attribue le panel à l'objet pointé par self en fonction de la
+ nature de la valeur demandée pour cet objet
+ """
+ from uniquepanel import UNIQUE_Panel
+ from plusieurspanel import PLUSIEURS_Panel
+
+ #print "affect_panel : ",self.nom,self.is_list(),self.has_into()
+ # Attention l ordre des if est important
+
+ if self.wait_shell():
+ # l'objet attend un shell
+ from shellpanel import SHELLPanel
+ self.panel = SHELLPanel
+ elif self.has_into():
+ # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
+ if self.is_list() :
+ from plusieursintopanel import PLUSIEURS_INTO_Panel
+ self.panel = PLUSIEURS_INTO_Panel
+ else:
+ from uniqueintopanel import UNIQUE_INTO_Panel
+ self.panel = UNIQUE_INTO_Panel
+ else:
+ # l'objet prend une ou des valeurs à priori quelconques
+ if self.is_list() :
+ # on attend une liste de valeurs mais de quel type ?
+ if self.wait_assd():
+ # on attend une liste de SD
+ from plusieursassdpanel import PLUSIEURS_ASSD_Panel
+ self.panel = PLUSIEURS_ASSD_Panel
+ else:
+ # on attend une liste de valeurs de types debase (entiers, réels,...)
+ #from plusieursbasepanel import PLUSIEURS_BASE_OR_UNELISTE_Panel
+ #self.panel = PLUSIEURS_BASE_OR_UNELISTE_Panel
+ from plusieursbasepanel import PLUSIEURS_BASE_Panel
+ self.panel = PLUSIEURS_BASE_Panel
+ else:
+ # on n'attend qu'une seule valeur mais de quel type ?
+ if self.wait_co():
+ # on attend une SD ou un objet de la classe CO (qui n'existe pas encore)
+ from uniquesdcopanel import UNIQUE_SDCO_Panel
+ self.panel = UNIQUE_SDCO_Panel
+ elif self.wait_assd():
+ # on attend une SD
+ from uniqueassdpanel import UNIQUE_ASSD_Panel
+ from uniqueassdpanel import UNIQUE_ASSD_Panel_Reel
+ if 'R' in self.GetType():
+ self.panel = UNIQUE_ASSD_Panel_Reel
+ else :
+ self.panel = UNIQUE_ASSD_Panel
+ else:
+ # on attend une valeur d'un type de base (entier,réel,...)
+ if self.wait_complex():
+ # on attend un complexe
+ from uniquecomppanel import UNIQUE_COMP_Panel
+ self.panel = UNIQUE_COMP_Panel
+ else:
+ # on attend un entier, un réel ou une string
+ from uniquebasepanel import UNIQUE_BASE_Panel
+ self.panel = UNIQUE_BASE_Panel
+ # cas particulier des fonctions
+ genea = self.get_genealogie()
+ if "VALE" in genea or "VALE_C" in genea:
+ if "DEFI_FONCTION" in genea :
+ from fonctionpanel import FONCTION_Panel
+ self.panel=FONCTION_Panel
+ #---------------------------------------------------------
+ # PN ajout pour lancement de Salome
+ #---------------------------------------------------------
+ if hasattr( self.appli, 'salome' ):
+ import panelsSalome
+
+ self.select_noeud_maille=0
+ self.clef_fonction="SALOME"
+ for i in range(0,len( genea )) :
+ self.clef_fonction=self.clef_fonction+"_"+ genea[i]
+ #if genea[i] == "GROUP_NO" or genea[i] == "GROUP_MA":
+ if "GROUP_NO" in genea[len(genea)-1] or "GROUP_MA" in genea[len(genea)-1]:
+ self.select_noeud_maille=1
+
+ recherche=panelsSalome.dict_classes_salome[self.panel]
+ if hasattr(recherche,self.clef_fonction):
+ self.panel=recherche
+ if self.select_noeud_maille==1 :
+ self.panel=recherche
+
+
+ #-----------------------------------------------
+ #
+ # Methodes liees aux informations sur le Panel
+ # ou au mot-clef simple
+ #
+ #-----------------------------------------------
+ # is_list
+ # get_into a priori inutile --> commentee
+ # has_into
+ # wait_into a priori inutile --> commentee
+ # GetMinMax
+ # GetMultiplicite
+ # GetIntervalle
+ # GetListeValeurs
+ # get_liste_possible
+
+ def is_list(self):
+ """
+ Cette méthode indique si le mot cle simple attend une liste (valeur de retour 1)
+ ou s'il n'en attend pas (valeur de retour 0)
+
+ Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
+ Dans le cas sans validateur, l'information est donnée par l'attribut max
+ de la definition du mot cle.
+ Dans le cas avec validateur, il faut combiner l'information précédente avec
+ celle issue de l'appel de la méthode is_list sur le validateur.On utilisera
+ l'operateur ET pour effectuer cette combinaison (AndVal).
+ """
+ is_a_list=0
+ min,max = self.GetMinMax()
+ assert (min <= max)
+ if max > 1 :
+ is_a_list=1
+ # Dans le cas avec validateurs, pour que le mot cle soit considéré
+ # comme acceptant une liste, il faut que max soit supérieur a 1
+ # ET que la méthode is_list du validateur retourne 1. Dans les autres cas
+ # on retournera 0 (n'attend pas de liste)
+ if self.definition.validators :
+ is_a_list= self.definition.validators.is_list() * is_a_list
+ return is_a_list
+
+ #def get_into(self,liste_courante=None):
+ # """
+ # Cette méthode retourne la liste de choix proposée par le mot cle. Si le mot cle ne propose
+ # pas de liste de choix, la méthode retourne None.
+ # L'argument d'entrée liste_courante, s'il est différent de None, donne la liste des choix déjà
+ # effectués par l'utilisateur. Dans ce cas, la méthode get_into doit calculer la liste des choix
+ # en en tenant compte.
+ # Cette méthode part du principe que la relation entre into du mot clé et les validateurs est
+ # une relation de type ET (AndVal).
+ # """
+ # if not self.object.definition.validators :
+ # return self.object.definition.into
+ # else:
+ # return self.object.definition.validators.get_into(liste_courante,self.definition.into)
+
+ def has_into(self):
+ """
+ Cette méthode indique si le mot cle simple propose un choix (valeur de retour 1)
+ ou s'il n'en propose pas (valeur de retour 0)
+
+ Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
+ Dans le cas sans validateur, l'information est donnée par l'attribut into
+ de la definition du mot cle.
+ Dans le cas avec validateurs, pour que le mot cle soit considéré
+ comme proposant un choix, il faut que into soit présent OU
+ que la méthode has_into du validateur retourne 1. Dans les autres cas
+ on retournera 0 (ne propose pas de choix)
+ """
+ has_an_into=0
+ if self.definition.into:
+ has_an_into=1
+ elif self.definition.validators :
+ has_an_into= self.definition.validators.has_into()
+ return has_an_into
+
+# def wait_into(self):
+# """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+# prend ses valeurs dans un ensemble discret (into), 0 sinon """
+# if self.object.definition.into != None :
+# return 1
+# else:
+# return 0
+
+ def GetMinMax(self):
+ """ Retourne les valeurs min et max de la définition de object """
+ return self.object.get_min_max()
+
+ 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 GetIntervalle(self):
+ """
+ Retourne le domaine de valeur attendu par l'objet représenté
+ par l'item.
+ """
+ return self.object.getintervalle()
+
+ def GetListeValeurs(self) :
+ """ Retourne la liste des valeurs de object """
+ valeurs=self.object.get_liste_valeurs()
+ try :
+ if "R" in self.object.definition.type:
+ clef=self.object.GetNomConcept()
+ if self.appli.dict_reels.has_key(clef):
+ if type(valeurs) == types.TupleType:
+ valeurs_reelles=[]
+ for val in valeurs :
+ if self.appli.dict_reels[clef].has_key(val) :
+ valeurs_reelles.append(self.appli.dict_reels[clef][val])
+ else :
+ valeurs_reelles.append(val)
+ else :
+ if self.appli.dict_reels[clef].has_key(valeurs):
+ valeurs_reelles=self.appli.dict_reels[clef][valeurs]
+ valeurs=valeurs_reelles
+ except :
+ pass
+ return valeurs
+
+ def get_liste_possible(self,listeActuelle=[]):
+ if hasattr(self.definition.validators,'into'):
+ valeurspossibles = self.definition.validators.into
+ else:
+ valeurspossibles = self.get_definition().into
+
+ #On ne garde que les items valides
+ listevalideitem=[]
+ for item in valeurspossibles:
+ encorevalide=self.valide_item(item)
+ if encorevalide :
+ listevalideitem.append(item)
+
+ #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
+ listevalideliste=[]
+ for item in listevalideitem:
+ encorevalide=self.valide_liste_partielle(item,listeActuelle)
+ if encorevalide :
+ listevalideliste.append(item)
+ return listevalideliste
+
+ def get_liste_param_possible(self):
+ liste_param=[]
+ for param in self.object.jdc.params:
+ encorevalide=self.valide_item(param.valeur)
+ if encorevalide:
+ type_param=param.valeur.__class__.__name__
+ for typ in self.definition.type:
+ if typ=='R':
+ liste_param.append(param)
+ if typ=='I' and type_param=='int':
+ liste_param.append(param)
+ if typ=='TXM' and type_param=='str':
+ liste_param.append(repr(param))
+ return liste_param
+
+ #--------------------------------------------------
+ #
+ # Methodes liees a la validite des valeurs saisies
+ #
+ #---------------------------------------------------
+ # valide_item
+ # valide_liste_partielle
+ # valide_liste_complete
+ # info_erreur_item
+ # info_erreur_liste
+ # IsInIntervalle
+ # isvalid
+
+ def valide_item(self,item):
+ """
+ La validation est réalisée directement par l'objet
+ """
+ return self.object.valide_item(item)
+
+ def valide_liste_partielle(self,item,listecourante):
+ #On protege la liste en entree en la copiant
+ valeur=listecourante[:]
+ valeur.append(item)
+ return self.object.valid_valeur_partielle(valeur)
+
+ def valide_liste_complete (self,valeur):
+ return self.object.valid_valeur(valeur)
+
+ def valide_val (self,valeur):
+ return self.object.valid_val(valeur)
+
+ def info_erreur_item(self) :
+ commentaire=""
+ if self.definition.validators :
+ commentaire=self.definition.validators.info_erreur_item()
+ return commentaire
+
+ def aide(self) :
+ commentaire=""
+ if self.definition.validators :
+ commentaire=self.definition.validators.aide()
+ return commentaire
+
+ def info_erreur_liste(self) :
+ commentaire=""
+ if self.definition.validators :
+ commentaire=self.definition.validators.info_erreur_liste()
+ return commentaire
+
+ def IsInIntervalle(self,valeur):
+ """
+ Retourne 1 si la valeur est dans l'intervalle permis par
+ l'objet représenté par l'item.
+ """
+ return self.valide_item(valeur)
+
+ def isvalid(self):
+ valide=self.object.isvalid()
+ return valide
+
+ #--------------------------------------------------
+ #
+ # Autres ...
+ #
+ #---------------------------------------------------
+ # SetText a priori inutilisee --> commentee
+ # GetIconName
+ # GetText
+ # getval a priori inutilisee --> commentee
+ # set_valeur_co
+ # get_sd_avant_du_bon_type
+ # verif a priori inutilisee --> commentee
+ # delete_valeur_co
+
+ #def SetText(self, text):
+ # try:
+ # value = eval(text)
+ # self.object.setval(value)
+ # except:
+ # pass
+
+ def GetIconName(self):
+ if self.isvalid():
+ return "ast-green-ball"
+ elif self.object.isoblig():
+ return "ast-red-ball"
+ else:
+ return "ast-yel-ball"
+
+ def GetText(self):
+ """
+ Classe SIMPTreeItem
+ Retourne le texte à afficher dans l'arbre représentant la valeur de l'objet
+ pointé par self
+ """
+ text= self.object.GetText()
+ return text
+
+ #def getval(self):
+ # return self.object.getval()
+
+ def set_valeur_co(self,nom_co):
+ """
+ Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
+ """
+ ret = self.object.set_valeur_co(nom_co)
+ #print "set_valeur_co",ret
+ return ret
+
+ 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
+ """
+ a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
+ return a
+
+ def get_sd_avant_du_bon_type_pour_type_de_base(self):
+ a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
+ return a
+
+
+
+ #def verif(self):
+ # pass
+
+ 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)
+
+ #-----------------------------------------------
+ #
+ # Methodes liees au type de l objet attendu
+ #
+ #-----------------------------------------------
+ # wait_co
+ # wait_geom
+ # wait_complex
+ # wait_reel
+ # wait_shell
+ # wait_assd
+ # GetType
+
+ def wait_co(self):
+ """
+ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un objet de type ASSD qui n'existe pas encore (type CO()),
+ 0 sinon
+ """
+ return self.object.wait_co()
+
+ def wait_geom(self):
+ """
+ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un objet GEOM, 0 sinon
+ """
+ return self.object.wait_geom()
+
+ def wait_complex(self):
+ """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un complexe, 0 sinon """
+ if 'C' in self.object.definition.type:
+ return 1
+ else:
+ return 0
+
+ def wait_reel(self):
+ """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un réel, 0 sinon """
+ if 'R' in self.object.definition.type:
+ return 1
+ else:
+ return 0
+
+ def wait_shell(self):
+ """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un shell, 0 sinon """
+ if 'shell' in self.object.definition.type:
+ return 1
+ else:
+ return 0
+
+ def wait_assd(self):
+ """Méthode booléenne qui retourne 1 si l'objet pointé par self
+ attend un objet de type ASSD ou dérivé, 0 sinon """
+ return self.object.wait_assd()
+
+ def wait_assd_or_type_base(self) :
+ boo=0
+ if len(self.object.definition.type) > 1 :
+ if self.wait_reel() :
+ boo = 1
+ if 'I' in self.object.definition.type :
+ boo = 1
+ return boo
+
+
+ def GetType(self):
+ """
+ Retourne le type de valeur attendu par l'objet représenté par l'item.
+ """
+ return self.object.get_type()
+
+ #-----------------------------------------------------
+ #
+ # Methodes liees a l evaluation de la valeur saisie
+ #
+ #-----------------------------------------------------
+ # eval_valeur
+ # eval_valeur_item
+ # is_CO
+ # traite_reel
+
+ def eval_valeur(self,valeur):
+ """ Lance l'interprétation de 'valeur' (chaîne de caractères) comme valeur de self :
+ - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
+ - retourne 'valeur' (chaîne de caractères) sinon
+ """
+ newvaleur=self.eval_val(valeur)
+ return newvaleur,1
+
+ def eval_valeur_BAK(self,valeur):
+ """ Lance l'interprétation de 'valeur' (chaîne de caractères) comme valeur
+ de l'objet pointé par self :
+ - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
+ - retourne 'valeur' (chaîne de caractères) sinon
+ - retourne None en cas d invalidite
+ - retourne invalide si 1 des objets du tuple l est
+ """
+ validite=1
+ if type(valeur) in (types.ListType,types.TupleType) :
+ valeurretour=[]
+ for item in valeur :
+ newvaleur,validiteitem=self.eval_valeur_item(item)
+ valeurretour.append(newvaleur)
+ if validiteitem == 0:
+ validite=0
+ else :
+ valeurretour,validite= self.eval_valeur_item(valeur)
+ if validite == 0 :
+ valeurretour = None
+ return valeurretour,validite
+
+ def eval_valeur_item(self,valeur):
+ """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
+ - va retourner la valeur de retour et la validite
+ selon le type de l objet attendu
+ - traite les reels et les parametres
+ """
+ #print "eval_valeur_item",valeur
+ if valeur==None or valeur == "" :
+ return None,0
+ validite=1
+ if self.wait_reel():
+ valeurinter = self.traite_reel(valeur)
+ if valeurinter != None :
+ valeurretour,validite= self.object.eval_valeur(valeurinter)
+ else:
+ valeurretour,validite= self.object.eval_valeur(valeur)
+ elif self.wait_geom():
+ valeurretour,validite = valeur,1
+ else :
+ valeurretour,validite= self.object.eval_valeur(valeur)
+ #print "eval_valeur_item",valeurretour,validite
+
+ if validite == 0:
+ if type(valeur) == types.StringType and self.object.wait_TXM():
+ essai_valeur="'" + valeur + "'"
+ valeurretour,validite= self.object.eval_valeur(essai_valeur)
+
+ if hasattr(valeurretour,'__class__'):
+ #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
+ if valeurretour.__class__.__name__ in ('PARAMETRE',):
+ validite=1
+
+ #if self.wait_co():
+ # CCAR : il ne faut pas essayer de creer un concept
+ # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
+ #try:
+ #valeurretour=Accas.CO(valeur)
+ #except:
+ #valeurretour=None
+ #validite=0
+ # on est dans le cas où on a évalué et où on n'aurait pas du
+ if self.object.wait_TXM() :
+ if type(valeurretour) != types.StringType:
+ valeurretour=str(valeur)
+ validite=1
+ return valeurretour,validite
+
+ 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.InstanceType:return 0
+ if valeur.__class__.__name__ == 'CO':return 1
+ return 0
+
+ def is_param(self,valeur) :
+ for param in self.jdc.params:
+ if (repr(param) == valeur):
+ return 1
+ return 0
+
+ def traite_reel(self,valeur):
+ """
+ Cette fonction a pour but de rajouter le '.' en fin de chaîne pour un réel
+ ou de détecter si on fait référence à un concept produit par DEFI_VALEUR
+ ou un EVAL ...
+ """
+ valeur = string.strip(valeur)
+ liste_reels = self.get_sd_avant_du_bon_type()
+ if valeur in liste_reels:
+ return valeur
+ if len(valeur) >= 3 :
+ if valeur[0:4] == 'EVAL' :
+ # on a trouvé un EVAL --> on retourne directement la valeur
+ return valeur
+ if string.find(valeur,'.') == -1 :
+ # aucun '.' n'a été trouvé dans valeur --> on en rajoute un à la fin
+ if (self.is_param(valeur)):
+ return valeur
+ else:
+ if string.find(valeur,'e') != -1:
+ # Notation scientifique ?
+ try :
+ r=eval(valeur)
+ return valeur
+ except :
+ return None
+ else :
+ return valeur+'.'
+ else:
+ return valeur
+
+
+import Accas
+treeitem = SIMPTreeItem
+objet = Accas.MCSIMP
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 types
+
+# Modules Eficas
+import Accas
+from Noyau.N_CR import CR
+
+class CATALOGUE:
+ def __init__(self,modules_cata):
+ self.modules_cata = modules_cata # tuple de modules...
+ self.cr = CR()
+ self.state='undetermined'
+ self.entites_attributs = {}
+ self.entites_fils = []
+ self.build_entites_attributs()
+ self.build_entites_fils()
+
+ def build_entites_attributs(self):
+ pass
+
+ def build_entites_fils(self):
+ niv_types = Accas.NIVEAU(nom="types",label="Liste des types")
+ niv_commandes = Accas.NIVEAU(nom="commandes",label="Liste des commandes")
+ self.entites_fils.append(make_commande_cata(niv_types,self))
+ self.entites_fils.append(make_commande_cata(niv_commandes,self))
+ for module_cata in self.modules_cata:
+ for e in dir(module_cata):
+ obj = getattr(module_cata,e)
+ if isCMD(obj):
+ self.entites_fils[1].register(make_commande_cata(obj,self.entites_fils[1]))
+ elif type(obj) == types.ClassType:
+ if issubclass(obj,Accas.ASSD):
+ self.entites_fils[0].register(TYPE_CATA(obj))
+
+ def init_modif(self):
+ self.state = 'modified'
+
+ def report(self):
+ """ Classe CATALOGUE
+ Methode pour generation d un rapport de validite
+ """
+ self.cr.purge()
+ self.cr.debut="DEBUT CR validation : "
+ self.cr.fin="FIN CR validation :"
+ self.state = 'modified'
+ self.isvalid(cr='oui')
+ for fils in self.entites_fils[1].entites :
+ self.cr.add(fils.report())
+ return self.cr
+
+ def isvalid(self,cr='non'):
+ if self.state != 'unchanged':
+ valid=1
+ for fils in self.entites_fils[1].entites_fils:
+ if not fils.isvalid():
+ valid=0
+ break
+ self.valid = valid
+ self.state='unchanged'
+ return self.valid
+
+def make_commande_cata(objet,pere):
+ if isinstance(objet,Accas.OPER):
+ return OPER_CATA(objet,pere,objet.nom)
+ elif isinstance(objet,Accas.PROC):
+ return PROC_CATA(objet,pere,objet.nom)
+ elif isinstance(objet,Accas.MACRO):
+ return MACRO_CATA(objet,pere,objet.nom)
+ elif isinstance(objet,Accas.FORM):
+ return MACRO_CATA(objet,pere,objet.nom)
+ elif isinstance(objet,Accas.NIVEAU):
+ return NIVEAU_CATA(objet,pere,objet.nom)
+ else:
+ print "Erreur dans make_commande_cata : on cherche à évaluer un objet non référencé ",objet
+
+def make_mc_cata(objet,pere,nom=''):
+ if isinstance(objet,Accas.BLOC):
+ return BLOC_CATA(objet,pere,nom)
+ elif isinstance(objet,Accas.FACT):
+ return FACT_CATA(objet,pere,nom)
+ elif isinstance(objet,Accas.SIMP):
+ return SIMP_CATA(objet,pere,nom)
+ else:
+ print "Erreur dans make_mc_cata : on cherche à évaluer un objet non référencé ",objet
+
+class TYPE_CATA:
+ def __init__(self,objet):
+ self.objet = objet
+ self.nom = objet.__name__
+
+ def isvalid(self,cr='non'):
+ return 1
+
+ def get_valeur_attribut(self,nom_attr):
+ if nom_attr == 'nom':return self.nom
+ return None
+
+class OBJET_CATA:
+ attributs=[]
+ attributs_defauts={}
+ def __init__(self,objet,pere,nom):
+ self.objet = objet
+ self.nom = nom
+ self.pere = pere
+ self.cr = CR()
+ self.state='undetermined'
+ self.entites_fils = []
+ self.entites_attributs = {}
+ self.build_entites_attributs()
+ self.build_entites_fils()
+
+ def __str__(self):
+ s=''
+ s=self.__class__.__name__+' : '+self.nom
+ return s
+
+ def build_entites_attributs(self):
+ for attribut in self.attributs:
+ if hasattr(self.objet,attribut):
+ self.entites_attributs[attribut]=ATTR_CATA(attribut,getattr(self.objet,attribut))
+ else:
+ if self.attributs_defauts.has_key(attribut):
+ self.entites_attributs[attribut]=ATTR_CATA(attribut,self.attributs_defauts[attribut])
+ else:
+ self.entites_attributs[attribut]=ATTR_CATA(attribut,None)
+
+ def build_entites_fils(self):
+ for k,v in self.objet.entites.items():
+ self.entites_fils.append(make_mc_cata(v,self,nom=k))
+
+ def get_valeur_attribut(self,nom_attr):
+ if nom_attr in self.entites_attributs.keys():
+ return self.entites_attributs[nom_attr].valeur
+ elif nom_attr in self.attributs_defauts.keys():
+ return self.attributs_defauts[nom_attr]
+ elif nom_attr == 'domaine_validité':
+ if self.entites_attributs['into'].valeur != None :
+ return 'discret'
+ else:
+ return 'continu'
+
+ def isvalid(self,cr='non'):
+ if self.state =='unchanged':
+ return self.valid
+ else:
+ valid = 1
+ if hasattr(self,'valid'):
+ old_valid = self.valid
+ else:
+ old_valid = None
+ # on teste self lui-meme
+ if self.nom == '' or self.nom == None : valid=0
+ # on teste les attributs
+ for attribut in self.entites_attributs.values():
+ if not attribut.isvalid() : valid =0
+ break
+ # on teste les fils
+ for fils in self.entites_fils:
+ if not fils.isvalid(): valid = 0
+ break
+ self.valid = valid
+ self.state = 'unchanged'
+ if old_valid:
+ if old_valid != self.valid : self.init_modif_up()
+ return self.valid
+
+ def init_modif_up(self):
+ self.pere.state='modified'
+
+ def report(self):
+ self.cr.purge()
+ self.cr.debut="Debut "+self.__class__.__name__+' : '+self.nom
+ self.cr.fin = "Fin "+self.__class__.__name__+' : '+self.nom
+ self.isvalid(cr='oui')
+ for attribut in self.entites_attributs.values():
+ self.cr.add(attribut.report())
+ for fils in self.entites_fils :
+ self.cr.add(fils.report())
+ return self.cr
+
+ def set_valeur_attribut(self,nom_attr,valeur):
+ """
+ Affecte la valeur 'valeur' à l'attribut de nom 'nom-attr'
+ """
+ # il faudra être prudent sur les changements de nom : interdire de changer
+ # le nom d'un mot-clé qui serait utilisé dans une règle ???
+ self.entites_attributs[nom_attr].valeur = valeur
+
+ def addentite(self,name,pos):
+ """
+ Permet d'ajouter un nouveau fils a self
+ """
+ self.init_modif()
+ if name == 'new_simp':
+ objet = Accas.SIMP(typ=('bidon',))
+ objet_cata = make_mc_cata(objet,self)
+ self.entites_fils.insert(pos,objet_cata)
+ return objet_cata
+
+ def init_modif(self):
+ self.state = 'modified'
+ if hasattr(self,'pere'):
+ self.pere.init_modif()
+
+ def verif_nom(self,cr='non'):
+ """
+ Méthode appelée par EFICAS et ACCAS
+ Booléenne : retourne 1 si l'attribut nom est valide, 0 sinon
+ """
+ if self.entites_attributs['nom'].valeur == '':
+ if cr == 'oui' : self.cr.fatal("L'objet de type %s n'est pas nommé" %self.__class__.__name__)
+ return 0
+ return 1
+
+ def verif_defaut(self,cr='non'):
+ """
+ Méthode de vérification de validité du défaut
+ """
+ defaut = self.get_valeur_attribut('defaut')
+ if self.get_valeur_attribut('domaine_validite') == 'discret' :
+ if defaut not in self.get_valeur_attribut('into'):
+ if cr == 'oui' : self.cr.fatal("La valeur %s n'est pas autorisée" %str(defaut))
+ return 0
+ return 1
+ else:
+ if defaut == None : return 1
+ typ = self.get_valeur_attribut('type')
+ # on attend un TXM ?
+ if 'TXM' in typ :
+ if type(defaut) == types.StringType : return 1
+ val_min = self.get_valeur_attribut('val_min')
+ val_max = self.get_valeur_attribut('val_max')
+ # on attend un reel ?
+ if 'R' in typ :
+ if type(defaut) == types.StringType:
+ try :
+ nb = string.atof(defaut)
+ except:
+ nb=None
+ else:
+ nb = defaut
+ if nb != None :
+ test = 1
+ if val_min != '**' : test = (nb >= val_min)
+ if val_max != '**' : test = test*(nb <= val_max)
+ if test : return 1
+ # on attend un entier ?
+ if 'I' in typ :
+ if type(defaut)==types.StringType:
+ try:
+ nb = string.atoi(defaut)
+ except:
+ pass
+ else:
+ nb = defaut
+ if nb != None :
+ test = 1
+ if val_min != '**' : test = (nb >= val_min)
+ if val_max != '**' : test = test*(nb <= val_max)
+ if test : return 1
+ # si on passe par là, c'est que l'on n'a pas su évaluer defaut
+ if cr == 'oui' : self.cr.fatal("La valeur %s n'est pas une valeur permise" %str(defaut))
+ return 0
+
+ def verif_val_min(self,cr='non'):
+ """
+ Méthode de vérification de val_min.
+ Booléenne : retourne 1 si val_min est valide, 0 sinon
+ """
+ val_min = self.get_valeur_attribut('val_min')
+ if not val_min :
+ if cr == 'oui' : self.cr.fatal('val_min ne peut valoir None')
+ return 0
+ if val_min == '**': return 1
+ # val_min doit à ce stade être :
+ # - soit un entier ou un réel
+ # - soit une chaîne de caractères représentant un entier ou un réel (provient d'EFICAS)
+ if type(val_min) == types.StringType :
+ try :
+ val_min = string.atoi(val_min)
+ except:
+ try:
+ val_min = string.atof(val_min)
+ except:
+ if cr == 'oui' : self.cr.fatal("%s n'est ni un entier ni un réel" %str(val_min))
+ return 0
+ # A ce stade, val_min doit être un entier ou un réel : on vérifie ...
+ if type(val_min) not in (types.IntType,types.FloatType) :
+ if cr == 'oui' : self.cr.fatal("%s n'est pas d'un type autorisé" %str(val_min))
+ return 0
+ # A ce stade valeur est un entier ou un réel : on peut comparer à val_max
+ val_max = self.get_valeur_attribut('val_max')
+ if val_max == '**' or val_min < val_max : return 1
+ # erreur : val_min est supérieur à val_max !!!
+ if cr == 'oui' : self.cr.fatal("%s n'est pas inférieur à %s" %(str(val_min),str(val_max)))
+ return 0
+
+ def verif_val_max(self,cr='non'):
+ """
+ Méthode de vérification de val_max.
+ Booléenne : retourne 1 si val_max est valide, 0 sinon
+ """
+ val_max = self.get_valeur_attribut('val_max')
+ if not val_max :
+ if cr == 'oui' : self.cr.fatal('val_max ne peut valoir None')
+ return 0
+ if val_max == '**': return 1
+ # val_max doit à ce stade être :
+ # - soit un entier ou un réel
+ # - soit une chaîne de caractères représentant un entier ou un réel (provient d'EFICAS)
+ if type(val_max) == types.StringType :
+ try :
+ val_max = string.atoi(val_max)
+ except:
+ try:
+ val_max = string.atof(val_max)
+ except:
+ if cr == 'oui' : self.cr.fatal("%s n'est ni un entier ni un réel" %str(val_max))
+ return 0
+ # A ce stade, val_max doit être un entier ou un réel : on vérifie ...
+ if type(val_max) not in (types.IntType,types.FloatType) :
+ if cr == 'oui' : self.cr.fatal("%s n'est pas d'un type autorisé" %str(val_max))
+ return 0
+ # A ce stade valeur est un entier ou un réel : on peut comparer à val_max
+ val_min = self.get_valeur_attribut('val_min')
+ if val_min == '**' or val_min < val_max : return 1
+ # erreur : val_min est supérieur à val_max !!!
+ if cr == 'oui' : self.cr.fatal("%s n'est pas supérieur à %s" %(str(val_max),str(val_min)))
+ return 0
+
+class OPER_CATA(OBJET_CATA):
+ attributs = ['ang','docu','fr','niveau','nom','op','op_init','reentrant','regles','repetable','sd_prod']
+
+class PROC_CATA(OBJET_CATA):
+ attributs = ['ang','docu','fr','niveau','nom','op','op_init','regles','repetable']
+
+class MACRO_CATA(OBJET_CATA):
+ attributs = ['ang','docu','fr','niveau','nom','op','op_init','reentrant','regles','repetable','sd_prod']
+
+class BLOC_CATA(OBJET_CATA):
+ attributs = ['ang','condition','docu','fr','nom','regles']
+
+class FACT_CATA(OBJET_CATA):
+ attributs=['ang','defaut','docu','fr','max','min','nom','regles','statut']
+
+class SIMP_CATA(OBJET_CATA):
+ attributs=['ang','defaut','docu','fr','homo','into','max','min','nom','position','statut','type','val_min','val_max']
+ attributs_defauts={'ang':'','defaut':None,'fr':'','homo':1,'into':None,'max':1,'min':1,'nom' : '','position':'local',
+ 'regles':None,'statut':'f','type':None,'val_min':'**','val_max':'**','docu':''}
+
+ def build_entites_fils(self):
+ pass
+
+ def isvalid(self,cr='non'):
+ """
+ Mde appelpar l'externe (EFICAS et ACCAS).
+ Boolne : retourne 1 si l'objet est valide, 0 sinon
+ """
+ if self.state == 'unchanged':
+ return self.valid
+ else:
+ valid = 1
+ valid = valid*self.verif_nom(cr=cr)
+ valid = valid*self.verif_defaut(cr=cr)
+ valid = valid*self.verif_val_min(cr=cr)*self.verif_val_max(cr=cr)
+ if hasattr(self,'valid'):
+ old_valid = self.valid
+ else:
+ old_valid = None
+ self.valid = valid
+ self.state='unchanged'
+ if old_valid :
+ if old_valid != self.valid : self.init_modif_up()
+ return self.valid
+
+class NIVEAU_CATA(OBJET_CATA):
+ def __init__(self,objet,pere,nom):
+ self.pere = pere
+ self.nom = nom
+ self.state = 'undetermined'
+ self.cr = CR()
+ self.objet = objet
+ self.entites_fils=[]
+ self.entites_attributs = {}
+
+ def register(self,fils):
+ """
+ Enregistre la commande 굡pe :
+ - si editmode = 0 : on est en mode relecture d'un fichier de commandes
+ auquel cas on ajoute etape a fin de la liste self.etapes
+ - si editmode = 1 : on est en mode ajout d'굡pe depuis eficas auquel cas
+ cette mode ne fait rien, c'est addentité enregistre etape ࡬a bonne place
+ dans self.etapes
+ """
+ self.entites_fils.append(fils)
+
+ def unregister(self,etape):
+ self.entites_fils.remove(etape)
+
+ def isvalid(self,cr='non'):
+ """ Mode boolne qui retourne 0 si le niveau est invalide, 1 sinon """
+ if self.state == 'unchanged':
+ return self.valid
+ else:
+ valid = 1
+ if len(self.entites_fils) == 0:
+ #valid = self.Accas.valide_vide
+ valid = 1
+ else:
+ for commande in self.entites_fils :
+ if hasattr(commande,'isvalid'):
+ if not commande.isvalid() :
+ valid = 0
+ break
+ else:
+ print str(commande)," n'a pas de methode isvalid"
+ if hasattr(self,'valid'):
+ old_valid = self.valid
+ else:
+ old_valid = None
+ self.valid = valid
+ self.state='unchanged'
+ if old_valid:
+ if old_valid != self.valid : self.init_modif_up()
+ return self.valid
+
+
+class ATTR_CATA(OBJET_CATA):
+ def __init__(self,nom,valeur=None):
+ self.nom = nom
+ self.valeur = valeur
+ self.cr = CR()
+ self.state='undetermined'
+ self.entites_attributs={}
+ self.entites_fils=()
+
+ def isvalid(self,cr='non'):
+ return 1
+
+def isCMD(cmd):
+ return isinstance(cmd,Accas.OPER) or isinstance(cmd,Accas.PROC) or isinstance(cmd,Accas.MACRO) or isinstance(cmd,Accas.FORM)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+"""
+# Modules Python
+import string
+from Tkinter import Label
+import Pmw
+import traceback
+
+# Modules Eficas
+from widgets import showerror
+from widgets import askopenfilename
+import patches
+import appli
+from widgets import Fenetre
+
+class EFICAS(appli.APPLI):
+
+ 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)
+ texte = texte + 'Catalogue utilisé : %s\n' % self.bureau.fic_cata
+ return texte
+
+ def exitEFICAS(self):
+ self.bureau.exitEFICAS()
+
+ def getBureau(self):
+ return self.bureau
+
+ def browse(self,result):
+ if result == 'Browse':
+ self.ulfile = askopenfilename(parent=self.dialog.component('hull'),title="Choix fichier :")
+ self._ulfile.setentry(self.ulfile)
+ elif result == 'OK':
+ self.ulfile = self._ulfile.get()
+ # On utilise le convertisseur défini par format_fichier
+ source=self.get_source(self.ulfile)
+ if source:
+ # On a réussi à convertir le fichier self.ulfile
+ self.dialog.deactivate(result)
+ self.text=source
+ else:
+ # Une erreur a été rencontrée
+ self.text=''
+ elif result == 'Cancel':
+ self._ulfile.setentry('')
+ self.dialog.deactivate(result)
+ self.ulfile = None
+ self.text=""
+
+ def get_file(self,unite=None,fic_origine = ''):
+ """
+ Retourne le nom du fichier correspondant a l unite logique unite (entier)
+ """
+ if unite :
+ titre = "Choix unite %d " %unite
+ else:
+ titre = "Choix d'un fichier de poursuite"
+ self.dialog=Pmw.Dialog(self.top,
+ title = titre,
+ buttons = ('OK', 'Browse','Cancel'),
+ defaultbutton='OK',
+ command=self.browse,
+ )
+ self.dialog.withdraw()
+ if unite :
+ texte = "Le fichier %s contient une commande INCLUDE \n" % fic_origine
+ texte = texte+'Donnez le nom du fichier correspondant\n à l unité logique %d' % unite
+ else:
+ texte="Le fichier %s contient une commande %s\n" %(fic_origine,'POURSUITE')
+ texte = texte+'Donnez le nom du fichier dont vous \n voulez faire une poursuite'
+ if self.test == 1: raise Exception("Erreur: "+texte)
+ w = Label(self.dialog.interior(),
+ text = texte)
+ w.pack(padx = 10, pady = 10)
+ if unite != None :
+ labeltexte = 'Fichier pour unite %d :' % unite
+ else:
+ labeltexte = 'Fichier à poursuivre :'
+ self._ulfile=Pmw.EntryField(self.dialog.interior(),
+ labelpos = 'w',
+ label_text = labeltexte,
+ )
+ self._ulfile.pack(fill='x', expand=1, padx=10, pady=5)
+ self._ulfile.component('entry').focus_set()
+ self.dialog.activate(geometry='centerscreenalways')
+ return self.ulfile,self.text
+
+ def get_source(self,file):
+ import convert
+ format=self.format_fichier.get()
+ # Il faut convertir le contenu du fichier en fonction du format
+ if convert.plugins.has_key(format):
+ # Le convertisseur existe on l'utilise
+ p=convert.plugins[format]()
+ p.readfile(file)
+ text=p.convert('execnoparseur')
+ if not p.cr.estvide():
+ self.affiche_infos("Erreur à la conversion")
+ Fenetre(self,
+ titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
+ texte = str(p.cr)).wait()
+ return text
+ return text
+ else:
+ # Il n'existe pas c'est une erreur
+ self.affiche_infos("Type de fichier non reconnu")
+ showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
+ return None
+
+ def affiche_texte(self,entete,texte):
+ """Cette methode ouvre une fenetre modale dans laquelle on affiche un texte
+ """
+ self.affiche_infos(entete)
+ f=Fenetre(self, titre=entete, texte = texte)
+ f.wait()
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 patienter l'utilisateur
+"""
+# Modules Python
+import sys
+import Tkinter
+
+# Modules Eficas
+from Aster import prefs
+if hasattr(prefs,'encoding'):
+ # Hack pour changer le codage par defaut des strings
+ import sys
+ reload(sys)
+ sys.setdefaultencoding(prefs.encoding)
+ del sys.setdefaultencoding
+ # Fin hack
+
+import styles
+from Editeur import import_code
+from InterfaceTK import splash
+from Editeur import session
+
+def lance_eficas(code=None,fichier=None):
+ """
+ Lance l'appli EFICAS
+ """
+ # Analyse des arguments de la ligne de commande
+ options=session.parse(sys.argv)
+ code=options.code
+
+ root = Tkinter.Tk()
+ splash.init_splash(root,code=code,titre="Lancement d'EFICAS pour %s" %code)
+ splash._splash.configure(text="Chargement d'EFICAS en cours.\n Veuillez patienter ...")
+ import eficas
+ eficas.EFICAS(root,code=code,ihm="TK")
+
+ root.mainloop()
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+"""
+# Modules Python
+import sys
+import Tkinter
+
+# Modules Eficas
+from Editeur import import_code
+from Editeur import session
+
+def lance_eficas(code,fichier=None):
+ """
+ Lance l'appli EFICAS
+ """
+ options=session.parse(sys.argv)
+ root = Tkinter.Tk()
+ import eficas
+ if fichier :
+ a=eficas.EFICAS(root,code=code,fichier = fichier,test=1)
+ bureau=a.getBureau()
+ else:
+ eficas.EFICAS(root,code=code)
+
+ print bureau.JDC.report()
+ bureau.closeJDC()
+
+def duplique_fichier(code,fichier=None,root=None):
+ print code
+ print fichier
+ if root == None :
+ root = Tkinter.Tk()
+ import eficas
+ import convert
+ import generator
+ import Editeur.utils
+ import string
+
+ if fichier != None :
+ options=session.parse(sys.argv+[fichier])
+ else :
+ options=session.parse(sys.argv)
+
+ appli=eficas.EFICAS(root,code=code,fichier = fichier,test=1)
+ format='homard'
+ if convert.plugins.has_key(format):
+ p=convert.plugins[format]()
+ p.readfile(fichier)
+ text=p.convert('exec',appli)
+ print text
+ text2=convertir(text)
+ print text2
+ cata=appli.readercata.cata
+ J=cata[0].JdC(procedure=text2,cata=cata)
+ J.analyse()
+ fileName=fichier+"_init"
+ if generator.plugins.has_key(format):
+ g=generator.plugins[format]()
+ jdc_formate=g.gener(J,format='beautifie')
+ jdc_fini = string.replace(jdc_formate,'\r\n','\n')
+ utils.save_in_file(fileName+".comm",jdc_fini,None)
+
+def convertir(texte):
+ import re
+ dict_change={"FICHIER_MED_MAILLAGE_N=":"FICHIER_MED_MAILLAGE_NP1","NOM_MED_MAILLAGE_N=":"NOM_MED_MAILLAGE_NP1"}
+ for mot in dict_change.keys():
+ if( re.search(mot,texte)):
+ indicenouveau=re.search(mot,texte).end()
+ indicefinnouveau= texte.find(",",indicenouveau)
+ avant=dict_change[mot]
+ if( re.search(avant,texte)):
+ indiceancien=re.search(avant,texte).end()+1
+ indicefinancien= texte.find(",",indiceancien)
+ valeur=texte[indiceancien:indicefinancien]
+ texte=texte[0:indicenouveau]+valeur+texte[indicefinnouveau:]
+ liste_mot_clef_None=['CRIT_RAFF_ABS','CRIT_RAFF_REL','CRIT_RAFF_PE','CRIT_DERA_ABS','CRIT_DERA_REL','CRIT_DERA_PE','NITER','NOM_MED_MAILLAGE_NP1','FICHIER_MED_MAILLAGE_NP1']
+
+ for mot in liste_mot_clef_None:
+ if( re.search(mot,texte)):
+ indice=re.search(mot,texte).end()+1
+ indicefin= texte.find(",",indice)
+ texte=texte[0:indice]+"None"+texte[indicefin:]
+ return texte
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+"""
+# Modules Python
+import os
+import Pmw
+from Tkinter import END
+
+# Modules Eficas
+from Aster import prefs
+from InterfaceTK import fontes
+
+class FAQ:
+ def __init__(self,parent):
+ self.parent=parent
+ self.Dialog = Pmw.Dialog(parent,
+ buttons=('Lu',),
+ title="FAQs et limitations d'EFICAS",
+ command = self.lu_FAQ)
+ txt = open(os.path.join(prefs.INSTALLDIR,'Editeur','faqs.txt'),'r').read()
+ Texte = Pmw.ScrolledText(self.Dialog.interior(),
+ text_font=fontes.standard)
+ Texte.insert(END,txt)
+ Texte.pack(expand=1,fill='both')
+ self.Dialog.activate(geometry = 'centerscreenalways')
+
+ def lu_FAQ(self,event=None):
+ self.Dialog.destroy()
+
+def affiche(parent):
+ FAQ(parent)
--- /dev/null
+
+-------------------------------------------------------------------------------------------------------------
+ FAQs et Limitations d'EFICAS
+-------------------------------------------------------------------------------------------------------------
+
+
+1. Mots réservés :
+
+ Tous les mots du langage Python sont des mots réservés.
+ On ne peut donc pas appeler une variable ou un concept 'fin' ou 'dir'
+ Pour la liste complète de ces mots-clés, veuillez vous référer à la
+ documentation Python
+
+2. Concepts réentrants :
+
+ Ne pas indiquer par un '&' devant son nom qu'un concept est utilisé comme
+ concept réentrant. En effet EFICAS le sait !
+
+3. Carte commentaire :
+
+ La carte commentaire est désormais le '#' (dièse) au lieu du '%' (pourcent)
+ Les commentaires sont gérés comme des objets de même niveau que les
+ commandes ; il n'est plus possible de placer des commentaires "dans"
+ une commande. Attention, lors de la traduction d'un fichier de version 5
+ en 6, les commentaires "dans" les commandes seront perdus.
+
+4. Nommer le concept produit par un opérateur :
+
+ Vous ne pouvez nommer le concept produit d'un opérateur que lorsque
+ celui-ci aura été entièrement et correctement rempli.
+
+5. Règle de rémanence dans les mots-clés facteurs répétés :
+
+ La règle de rémanence qui permettait pour certains mots-clés facteurs
+ et pour certains de leurs mots-clés simples de ne pas répeter la valeur
+ de ces derniers dans toutes les occurrences du mot-clé facteur n'est pas
+ connue d'EFICAS.
+ En conséquence, vous devez répéter les mots-clés simples concernés dans
+ toutes les occurrences des mots-clés facteurs.
+
+6. Besoin d'aide ?
+
+ La documentation d'utilisation d'EFICAS a pris un peu de retard sur le produit ...
+ Néanmoins, vous disposez sur la plupart des panneaux contextuels ( les panneaux à
+ droite de l'arbre) d'une aide en ligne que vous pouvez activer en maintenant le
+ bouton droit de votre souris enfoncé.
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+from Tkinter import *
+import copy
+
+# Modules Eficas
+from centerwindow import centerwindow
+
+class fenetre_mc_inconnus :
+ """
+ Cette classe sert à construire la fenêtre qui apparaît dans EFICAS
+ lorsque des mots-clés inconnus ont été trouvés dans le fichier de
+ commandes que l'on est en train de lire
+ """
+ def __init__(self,l_mc):
+ self.l_mc = l_mc
+ self.fenetre = Toplevel()
+ self.fenetre.withdraw()
+ self.fenetre.geometry("400x400+0+0")
+ self.fenetre.title("Mots-clés inconnus dans le fichier de commandes")
+ self.init()
+ self.init_frames()
+ self.init_label()
+ self.init_liste_mc()
+ self.init_boutons()
+ centerwindow(self.fenetre)
+ self.fenetre.deiconify()
+
+ def init(self) :
+ """
+ Initialise les structures de données
+ """
+ self.new_l_mc = []
+ for mc in self.l_mc :
+ self.new_l_mc.append(copy.copy(mc))
+ self.mc_courant = None
+ self.var_quit = IntVar(0)
+ self.entry_courante = None
+
+ def init_frames(self):
+ """
+ Création des 2 frames devant contenir le label et la liste des MC inconnus
+ """
+ self.frame1 = Frame(self.fenetre)
+ self.frame2 = Frame(self.fenetre)
+ self.frame3 = Frame(self.fenetre)
+ 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)
+
+ 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é"
+ self.fenetre.update_idletasks()
+ Label(self.frame1,
+ text = txt,
+ wraplength = int(self.frame1.winfo_width()*0.8),
+ justify = 'center').place(relx=0.5,rely=0.5,anchor='center')
+
+
+ def init_liste_mc(self):
+ """
+ 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]
+ 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.configure(relief='flat',state='disabled')
+ self.widgets.append((e,lab))
+ i=i+1
+
+ def init_boutons(self):
+ """
+ Construit les boutons Modifier,Supprimer et Fermer
+ Les deux premiers sont inactifs tant qu'aucun mot-clé n'est sélectionné
+ """
+ self.b_mod = Button(self.frame3,
+ text = "Modifier",
+ disabledforeground = 'grey35',
+ state='disabled',
+ command = self.modifie_mc)
+ self.b_sup = Button(self.frame3,
+ text = "Supprimer",
+ disabledforeground = 'grey35',
+ state='disabled',
+ command = self.supprime_mc)
+ 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_quit.place(relx=0.50,rely=0.5,anchor='center')
+
+ def wait_new_list(self):
+ """
+ Cette méthode rend cette toplevel bloquante.
+ Dès que la variable var_quit est modifiée, on continue l'exécution de cette
+ méthode (et on quitte)
+ """
+ self.fenetre.wait_variable(self.var_quit)
+ self.fenetre.destroy()
+ return self.new_l_mc
+
+ def get_path(self,l_o):
+ """
+ Construit la chaîne de caractère contenant le chemin d'accès complet du mot-clé
+ """
+ txt = ''
+ for o in l_o :
+ txt = txt + o.nom+'/'
+ # on enlève le dernier slash en trop
+ txt = txt[0:-1]
+ return txt
+
+ def select_mc(self,mc,entry):
+ """
+ Enregistre le mot-clé passé en argument comme mot-clé courant
+ Active les boutons Modifier et Supprimer
+ """
+ self.desactive_entry()
+ self.mc_courant = mc
+ self.entry_courante = entry
+ self.active_boutons()
+ self.active_entry()
+
+ def modifie_mc(self):
+ """
+ Modifie le nom du mot-clé en prenant la nouvelle valeur lue dans entry_courante
+ """
+ new_nom_mc = self.entry_courante.get()
+ index = self.l_mc.index(self.mc_courant)
+ new_mc = self.new_l_mc[index]
+ new_mc[-2] = new_nom_mc
+ objet_pere = self.mc_courant[-3]
+
+ self.desactive_boutons()
+ self.desactive_entry()
+
+ def supprime_mc(self):
+ """
+ Supprime le mot-clé courant de la liste
+ """
+ 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()
+
+ def desactive_boutons(self):
+ """
+ Désactive les boutons Modifier et Supprimer
+ """
+ self.b_mod.configure(state='disabled')
+ self.b_sup.configure(state='disabled')
+
+ def active_boutons(self):
+ """
+ Active les boutons Modifier et Supprimer
+ """
+ self.b_mod.configure(state='normal')
+ self.b_sup.configure(state='normal')
+
+ def desactive_entry(self):
+ """
+ Désactive l'entry courante si elle existe
+ """
+ if self.entry_courante :
+ self.entry_courante.configure(state='disabled',relief='flat')
+
+ def active_entry(self):
+ """
+ Active l'entry courante si elle existe
+ """
+ if self.entry_courante :
+ self.entry_courante.configure(state='normal',relief='sunken')
+
+ def quit(self):
+ """
+ Permet de fermer la fenêtre
+ """
+ self.var_quit.set(1)
+
+if __name__ == '__main__':
+ fenetre_mc_inconnus(('toto','titi'))
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+from widgets import askopenfilename
+from widgets import showinfo
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+from plusieursbasepanel import PLUSIEURS_BASE_Panel
+
+
+class FONCTION_Panel(PLUSIEURS_BASE_Panel):
+ def makeValeurPage(self,page):
+ """
+ Crée la page de saisie d'une liste de valeurs à priori quelconques,
+ cad qui ne sont pas à choisir dans une liste prédéfinie
+ """
+ genea=self.node.item.get_genealogie()
+ if "VALE" in genea:
+ self.nb_valeurs=2
+ if "VALE_C" in genea:
+ self.nb_valeurs=3
+ # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
+ # et la liste des valeurs déjà affectées à l'objet courant
+ bulle_aide=self.get_bulle_aide()
+ objet_mc = self.node.item.get_definition()
+ aide = self.get_aide()
+ aide = justify_text(texte=aide)
+ min,max = self.node.item.GetMinMax()
+ l_valeurs = self.node.item.GetListeValeurs()
+ l2_valeurs=self.decoupeListeValeurs(l_valeurs)
+
+ # création des frames globales
+ self.frame1 = Frame(page,relief='groove',bd=2)
+ self.frame2 = Frame(page)
+ self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
+ self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
+ self.frame_right = Frame(self.frame1)
+ self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
+
+ # création des frames internes
+ self.frame_valeurs = Frame(self.frame1)
+ self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
+ self.frame_boutons_fleches = Frame(self.frame_right)
+ self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
+ self.frame_choix = Frame(self.frame_right)
+ self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.5)
+ self.frame_aide = Frame(self.frame_right)
+ self.frame_aide.place(relx=0.1,rely=0.7,relwidth=0.8,relheight=0.3)
+ self.frame_boutons = Frame(self.frame2)
+ self.frame_boutons.place(relx=0.35,rely=0.,relwidth=0.5,relheight=1.)
+ for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
+ self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
+ fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+ # création des objets dans les frames
+ liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+ ("<Button-3>",self.deselectValeur),
+ ("<Double-Button-1>",self.afficheValeurListe))
+ self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l2_valeurs,liste_commandes = liste_commandes_valeurs,
+ titre="Valeur(s) actuelle(s)")
+
+ # 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_double_valeur_plusieurs_base)
+ 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
+ self.bouton_add = Button(self.frame_boutons_fleches,
+ image = images.get_image('arrow_left'),
+ command = self.add_double_valeur_plusieurs_base)
+ self.bouton_sup = Button(self.frame_boutons_fleches,
+ image = images.get_image('arrow_right'),
+ command = self.sup_valeur_sans_into)
+ self.bouton_add.place(relx=0.3,rely=0.35)
+ self.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',
+ 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
+ self.bouton_accepter = Button(self.frame_boutons,
+ text='Valider',
+ command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur_recolle(m,M))
+ self.bouton_annuler = Button(self.frame_boutons,
+ text = 'Annuler',
+ command = self.annule_modifs_valeur)
+ for but in (self.bouton_accepter,self.bouton_annuler):
+ but.pack(side='left',padx=4)
+
+
+ def afficheValeurListe(self,name):
+ self.display_valeur(name)
+
+ def decoupeListeValeurs(self,liste):
+ #decoupe la liste des valeurs en n ( les x puis les y)
+ nb=self.nb_valeurs
+ l_valeurs=[]
+ if (len(liste)%nb != 0):
+ message="La cardinalité n'est pas correcte, la dernière valeur est ignorée"
+ showinfo("Problème",message)
+ for i in range(len(liste)/nb) :
+ if (nb==2):
+ t=(liste[i*nb], liste[i*nb+1])
+ else:
+ t=(liste[i*nb], liste[i*nb+1], liste[i*nb+2])
+ l_valeurs.append(t)
+ return l_valeurs
+
+
+ def accepte_modifs_valeur_recolle(self,min,max):
+ l_valeurs=[]
+ l1_valeurs = self.Liste_valeurs.get_liste()
+ for val in l1_valeurs :
+ for item in val :
+ l_valeurs.append(item)
+ self.accepte_modifs_valeur(min,max,l_valeurs)
+
+
+ def add_double_valeur_plusieurs_base(self):
+ # on verifie qu'il s agit bien d un tuple
+ # on enleve les parentheses eventuelles
+ #doublevaleur_entree,validite,commentaire=self.get_valeur_double()
+ doublevaleur_entree= self.entry.get()
+ try:
+ if doublevaleur_entree[0]=='(' :
+ doublevaleur_entree=doublevaleur_entree[1:-1]
+ if doublevaleur_entree[-1]==')' :
+ doublevaleur_entree=doublevaleur_entree[0:-2]
+ val1=doublevaleur_entree.split(',')[0]
+ val2=doublevaleur_entree.split(',')[1]
+ saisie=(val1,val2)
+ if (self.nb_valeurs==3):
+ val3=doublevaleur_entree.split(',')[2]
+ saisie=(val1,val2,val3)
+ self.entry.delete(0,END)
+ except :
+ commentaire = "%s n est pas un tuple de la forme (x,y)" %`doublevaleur_entree`
+ if (self.nb_valeurs==3):
+ commentaire = "%s n est pas un tuple de la forme (x,y,z)" %`doublevaleur_entree`
+ self.parent.appli.affiche_infos(commentaire)
+ return
+
+ # et seulement d un tuple
+ try:
+ val=doublevaleur_entree.split(',')[self.nb_valeurs]
+ commentaire = "%s n est pas un tuple de la forme (x,y)" %`doublevaleur_entree`
+ if (self.nb_valeurs==3):
+ commentaire = "%s n est pas un tuple de la forme (x,y,z)" %`doublevaleur_entree`
+ self.parent.appli.affiche_infos(commentaire)
+ self.parent.appli.affiche_infos(commentaire)
+ return
+ except :
+ # c est la le cas normal
+ pass
+
+ # on verifie la validite des valeurs sont correctes
+ valeur,validite=self.node.item.eval_valeur(saisie)
+ if not validite :
+ commentaire = "impossible d'évaluer : %s " %`doublevaleur_entree`
+ self.parent.appli.affiche_infos(commentaire)
+ return
+
+ # on verifie la validite de la liste
+ liste=[]
+ l1_valeurs = self.Liste_valeurs.get_liste()
+ for val in l1_valeurs :
+ for item in val :
+ liste.append(item)
+ validite_liste=self.node.item.valide_liste_partielle(valeur[0],liste)
+ if not validite_liste:
+ commentaire = "impossible d'ajouter %s a la liste " %`doublevaleur_entree`
+ self.parent.appli.affiche_infos(commentaire)
+ return
+ # liste a deja ete modifiee par l appel precedent a valide_liste_partielle
+ # et contient deja valeur[0]
+ validite_liste=self.node.item.valide_liste_partielle(valeur[1],liste)
+ if not validite_liste:
+ commentaire = "impossible d'ajouter %s a la liste " %`doublevaleur_entree`
+ self.parent.appli.affiche_infos(commentaire)
+ return
+
+ # si une valeur est selectionnee on insere apres
+ # sinon on ajoute la valeur à la fin
+ if (self.Liste_valeurs.selection != None):
+ ligne=self.Liste_valeurs.cherche_selected_item()
+ if self.nb_valeurs==2:
+ l1_valeurs.insert(ligne,(valeur[0],valeur[1]))
+ else :
+ l1_valeurs.insert(ligne,(valeur[0],valeur[1],valeur[2]))
+ else :
+ if self.nb_valeurs==2:
+ l1_valeurs.append((valeur[0],valeur[1]))
+ else :
+ l1_valeurs.append((valeur[0],valeur[1],valeur[2]))
+ i = 0
+ while i < self.nb_valeurs :
+ self.set_valeur_texte(saisie[i])
+ i=i+1
+ self.Liste_valeurs.put_liste(l1_valeurs)
+ self.Liste_valeurs.affiche_liste()
+
+
+ def display_valeur(self,val=None):
+ """
+ Affiche la valeur passée en argument dans l'entry de saisie.
+ Par défaut affiche la valeur du mot-clé simple
+ Doit être redéfinie pour un pb avec les parametres dans un tuple
+ """
+ if not val :
+ valeur = self.node.item.object.getval()
+ else:
+ valeur = val
+ if not valeur : return
+
+ try:
+ affiche="("
+ separe=""
+ for val in valeur:
+ affiche=affiche+separe+str(val)
+ separe=","
+ affiche=affiche+")"
+ self.entry.delete(0,END)
+ self.entry.insert(0,affiche)
+ except :
+ self.entry.delete(0,END)
+
+# Surcharge de select in file pour prendre en compte la saisie de tuple
+ def select_in_file(self):
+ """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
+ nom_fichier = askopenfilename(title="Choix fichier :")
+
+ if not nom_fichier:
+ return
+
+ try:
+ f = open(nom_fichier, "rb")
+ selection_texte = f.read()
+ f.close()
+ self.add_double_valeur_plusieurs_base = FenetreDeSelection(self,
+ self.node.item,
+ self.parent.appli,
+ titre="Sélection de valeurs",
+ texte=selection_texte,
+ cardinal = self.nb_valeurs)
+ except:
+ traceback.print_exc()
+ showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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')
+standard_gras_souligne = ("Times",10,'bold','underline')
+
+canvas = ('times',8)
+canvas_italique = ('times',8,'italic')
+canvas_gras = ("Times",8,'bold')
+canvas_gras_italique = ("Times",10,'bold','italic')
+
+standard12 = ("Times",12)
+standard12_gras = ("Times",12,'bold')
+standard12_gras_italique = ( "times",12,'bold','italic')
+
+standardcourier10 = ("Courier",10)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+"""
+
+import os
+import Tkinter
+
+if __name__ == '__main__':
+ # Programme de test
+ import sys
+ import images
+ root=Tkinter.Tk()
+ frame = Tkinter.Frame(root)
+ frame.pack(expand=1,fill='both')
+
+ for name in ('About24','Save24'):
+ Tkinter.Label(frame, image=images.get_image(name)).pack(side=Tkinter.TOP)
+
+ root.mainloop()
+ sys.exit()
+
+try:
+ from Aster import prefs
+ ICONDIR=prefs.ICONDIR
+except:
+ # Par defaut on utilise le repertoire local icons
+ ICONDIR=os.path.join(os.path.abspath(os.path.dirname(__file__)),'/Editeur/icons')
+
+
+dico_images={}
+
+def get_image(name):
+ if dico_images.has_key(name):
+ return dico_images[name]
+ else :
+ fic_image = os.path.join(ICONDIR,name)
+ if not os.path.isfile(fic_image):
+ file, ext = os.path.splitext(fic_image)
+ fic_image = file + '.gif'
+ image = Tkinter.PhotoImage(file=fic_image)
+ dico_images[name]=image
+ return image
+
+def update_cache():
+ global dico_images
+ dico_images={}
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+ les informations attachées au noeud de l'arbre sélectionné
+"""
+# Modules Python
+import types,sys
+import traceback
+import Tkinter
+import Pmw
+
+# Modules Eficas
+import panels
+from treeitemincanvas import TREEITEMINCANVAS
+from widgets import showinfo,showerror
+
+class CONFIG:
+ isdeveloppeur='NON'
+
+class JDCDISPLAY:
+ """
+ Cette classe ajoute à la class TREEITEMINCANVAS l'affichage des infos
+ attachées au noeud sélectionné dans un notebook
+ L'objet item associé au jdc est créé par la classe TREEITEMINCANVAS
+ """
+ def __init__(self,jdc,nom_jdc,appli=None,parent=None):
+ self.jdc=jdc
+ self.nom_jdc=nom_jdc
+ self.fichier=None
+ self.panel_courant=None
+
+ if not appli:
+ class Appli:
+ def __init__(self):
+ self.CONFIGURATION=CONFIG()
+ def affiche_infos(self,message):
+ print message
+ return
+
+ def efface_aide(self,event):
+ return
+
+ def affiche_aide(self,event,aide):
+ print aide
+ return
+
+ appli=Appli()
+ self.appli=appli
+
+ if not parent:
+ parent=Tkinter.Tk()
+ Pmw.initialise(parent)
+ self.parent=parent
+ self.node_selected = None
+ self.modified='n'
+
+ self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
+ 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,self.make_rmenu)
+
+ def make_rmenu(self,node,event):
+ if hasattr(node.item,'rmenu_specs'):
+ rmenu = Tkinter.Menu(self.pane.pane('treebrowser'), tearoff=0)
+ #node.select()
+ self.cree_menu(rmenu,node.item.rmenu_specs,node)
+ rmenu.tk_popup(event.x_root,event.y_root)
+
+ def cree_menu(self,menu,itemlist,node):
+ """
+ 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,node)
+ elif method[0] == '&':
+ # On a une chaine avec & en tete => on cree un radiobouton
+ try:
+ command=getattr(node.item,method[1:])
+ menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
+ if radio == None:radio=number_item
+ except:pass
+ else:
+ try:
+ command=getattr(node.item,method)
+ menu.add_command(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
+ except:pass
+ # Si au moins un radiobouton existe on invoke le premier
+ if radio:menu.invoke(radio)
+
+ def select(self):
+ return
+
+ def unselect(self):
+ return
+
+ def select_node(self,node):
+ """
+ Cette méthode est appelée à chaque fois qu'un noeud est sélectionné
+ dans l'arbre.
+ Elle permet l'affichage du panneau correspondant au noeud sélectionné
+ """
+ if node is not self.node_selected :
+ #ATTENTION: il faut affecter l'attribut node_selected avant d'appeler
+ # create_panel pour eviter une recursion infinie entre create_panel,
+ # Emit, onValid, select_node
+ self.node_selected = node
+ self.create_panel(node)
+ elif self.panel_courant:
+ self.panel_courant.update_panel()
+
+ def create_panel(self,node):
+ """
+ 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 is None:
+ self.panel_courant=None
+ return self.panel_courant
+
+ if node.item.isactif():
+ if hasattr(node.item,"panel"):
+ 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:
+ self.panel_courant = panels.Panel_Inactif(self,self.pane.pane('selected'),node)
+ return self.panel_courant
+
+ def init_modif(self):
+ """
+ Met l'attribut modified à 'o' : utilisé par Eficas pour savoir
+ si un JDC doit être sauvegardé avant destruction ou non
+ """
+ self.modified = 'o'
+
+ def stop_modif(self):
+ """
+ Met l'attribut modified à 'n' : utilisé par Eficas pour savoir
+ si un JDC doit être sauvegardé avant destruction ou non
+ """
+ self.modified = 'n'
+
+ def mainloop(self):
+ self.parent.mainloop()
+
+ def ReplaceObjectNode(self,node,new_object,nom_sd=None):
+ """
+ Cette méthode sert à remplacer l'objet pointé par node par
+ new_object.
+ Si nom_sd : on remplace un OPER et on essaie de renommer la
+ nouvelle sd par nom_sd
+ """
+ child = node.append_brother(new_object,retour='oui')
+ if child == 0:
+ self.appli.affiche_infos("Impossible de remplacer l'objet du noeud courant")
+ else:
+ self.init_modif()
+ node.delete()
+ #if nom_sd:
+ #child.item.nomme_sd(nom_sd)
+ child.select()
+ #child.update()
+
+ def doCut(self):
+ """
+ Stocke dans Eficas.noeud_a_editer le noeud à couper
+ """
+ if not self.node_selected.item.iscopiable():
+ showinfo("Copie impossible",
+ "Cette version d'EFICAS ne permet que la copie d'objets de type 'Commande' ou mot-clé facteur")
+ return
+ self.appli.edit="couper"
+ self.appli.noeud_a_editer = self.node_selected
+
+ def doCopy(self):
+ """
+ Stocke dans Eficas.noeud_a_editer le noeud à copier
+ """
+ if not self.node_selected.item.iscopiable():
+ showinfo("Copie impossible",
+ "La copie d'un tel objet n'est pas permise")
+ return
+ self.appli.edit="copier"
+ self.appli.noeud_a_editer = self.node_selected
+
+ def doPaste(self):
+ """
+ Lance la copie de l'objet placé dans self.appli.noeud_a_editer
+ Ne permet que la copie d'objets de type Commande ou MCF
+ """
+ try:
+ child=self.appli.noeud_a_editer.doPaste(self.node_selected)
+ except:
+ traceback.print_exc()
+ showinfo("Action de coller impossible",
+ "L'action de coller apres un tel objet n'est pas permise")
+ return
+
+ if child == 0:
+ if self.appli.message != '':
+ showerror("Copie refusée",self.appli.message)
+ self.appli.message = ''
+ self.appli.affiche_infos("Copie refusée")
+ return
+
+ # il faut déclarer le JDCDisplay_courant modifié
+ self.init_modif()
+ # suppression éventuelle du noeud sélectionné
+ # si possible on renomme l objet comme le noeud couper
+ if self.appli.edit == "couper":
+ #nom = self.appli.noeud_a_editer.item.object.sd.nom
+ item=self.appli.noeud_a_editer.item
+ self.appli.noeud_a_editer.delete()
+ child.item.update(item)
+ #test,mess = child.item.nomme_sd(nom)
+ child.select()
+ # on rend la copie à nouveau possible en libérant le flag edit
+ self.appli.edit="copier"
+
+ def update(self):
+ """Cette methode est utilisee par le JDC associe pour
+ signaler des modifications globales du JDC
+ """
+ self.tree.update()
+
+ def supprime(self):
+ #print "supprime",self
+ self.select_node(None)
+ self.tree.supprime()
+ self.tree=None
+ self.pane.destroy()
+
+ #def __del__(self):
+ # print "__del__",self
--- /dev/null
+import string
+
+class listeFichiers :
+
+ def __init__(self,appli):
+ self.appli=appli
+ self.premiere=1
+ self.nbfich=0
+ self.rep=self.appli.CONFIGURATION.rep_user
+ self.menuFichier=self.appli.menubar.menudict['Fichier']
+ self.monFichier=self.rep+"/listefichiers"
+ self.liste_Fichiers=[]
+ self.init_Fichier()
+ self.traite_liste()
+
+ def init_Fichier(self):
+ index=0
+ try :
+ f=open(self.monFichier)
+ while ( index < 5) :
+ ligne=f.readline()
+ if ligne != "" :
+ l=(ligne.split("\n"))[0]
+ self.liste_Fichiers.append(l)
+ index=index+1
+ except :
+ pass
+ try :
+ f.close()
+ except :
+ pass
+
+ def sauve_Fichier(self):
+ try :
+ if len(self.liste_Fichiers) == 0 :
+ return
+ f=open(self.monFichier,'w')
+ index=0
+ while ( index < len(self.liste_Fichiers)):
+ ligne=self.liste_Fichiers[index]+"\n"
+ f.write(ligne)
+ index=index+1
+ except :
+ pass
+ try :
+ f.close()
+ except :
+ pass
+
+ def traite_liste(self):
+ index=0
+ for index in range(self.nbfich):
+ self.menuFichier.delete(9)
+ self.nbfich = 0
+ index = 0
+ while( index < len(self.liste_Fichiers)) :
+ self.ajout_item(index)
+ index=index+1
+
+ def ajout_item(self,index):
+ if self.premiere and (len(self.liste_Fichiers)!=0):
+ self.premiere=0
+ self.menuFichier.add_separator()
+ label=self.liste_Fichiers[index]
+ self.menuFichier.insert_command(8,label=label,command= lambda self=self, l=label:self.coucou (l));
+ self.nbfich=self.nbfich+1
+
+ def coucou(self,label):
+ self.appli.bureau.openJDC(file=label)
+
+ def aOuvert(self,file):
+ if file not in self.liste_Fichiers :
+ if (len(self.liste_Fichiers) > 4) :
+ f=self.liste_Fichiers[0]
+ self.liste_Fichiers.remove(f)
+ self.liste_Fichiers.insert(len(self.liste_Fichiers),file)
+ else:
+ self.liste_Fichiers.remove(file)
+ self.liste_Fichiers.insert(len(self.liste_Fichiers),file)
+ self.traite_liste()
+ self.sauve_Fichier()
--- /dev/null
+import os
+import re
+import Tkinter
+
+
+from Editeur import listePatrons
+
+class listePatronsTK(listePatrons.listePatrons) :
+
+ def __init__(self,appli):
+ self.appli=appli
+ listePatrons.listePatrons.__init__(self)
+ self.ajout_menu()
+
+ def ajout_menu(self):
+ menuFichier=self.appli.menubar.menubar
+ menu_cascade=Tkinter.Menu(menuFichier,tearoff=0)
+ menuFichier.add_cascade(label="Patrons",menu=menu_cascade)
+ for ss_menu in self.liste.keys():
+ ssmenu=Tkinter.Menu(menu_cascade,tearoff=0)
+ menu_cascade.add_cascade(label=ss_menu,menu=ssmenu)
+ for fichier in self.liste[ss_menu]:
+ ssmenu.add_command(label=fichier,command= lambda self=self, l=fichier:self.ouvre(l));
+
+ def ouvre(self,label):
+ fichier=self.rep_patrons+"/"+label
+ self.appli.bureau.openJDC(file=fichier,enregistre="non")
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 MacroDisplay qui realise l'affichage
+ des sous commandes d'une macro sous forme d'arbre
+"""
+# Modules Python
+import types,sys
+import Tkinter,Pmw
+
+# Modules EFICAS
+import images
+import tooltip
+from Editeur import Objecttreeitem
+import compojdc
+import treewidget
+from widgets import Fenetre
+from Ihm import CONNECTOR
+
+class MACRO2TreeItem(compojdc.JDCTreeItem):
+ pass
+
+class MacroDisplay:
+ def __init__(self,appli,macroitem,nom_jdc):
+ self.fenetre = Tkinter.Toplevel()
+ self.fenetre.configure(width = 800,height=500)
+ self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+ self.fenetre.title("Visualisation Macro_Etape")
+ self.macroitem=macroitem
+ self.jdc=macroitem.object.jdc_aux
+ self.nom_jdc=nom_jdc
+ self.appli=appli
+ self.barre=Tkinter.Frame(self.fenetre,relief="ridge",bd=2)
+ self.barre.pack(expand=0,fill=Tkinter.X)
+ if self.macroitem.object.fichier_text is not None:
+ b=Tkinter.Button(self.barre,image=images.get_image("Zoom24"),command=self.visufile)
+ b.pack(side='left')
+ tp=tooltip.TOOLTIP(b,"View file")
+ self.mainPart=Pmw.ScrolledCanvas(self.fenetre,
+ hull_width=600,
+ hull_height=500,
+ borderframe=1)
+ self.canvas=self.mainPart.component('canvas')
+ Pmw.Color.changecolor(self.canvas,background='gray95')
+ self.mainPart.pack(padx=10,pady=10,fill = 'both', expand = 1)
+ self.item=MACRO2TreeItem(self.appli,nom_jdc,self.jdc)
+ self.tree = treewidget.Tree(self.appli,self.item,self.mainPart,command=None,rmenu=self.make_rmenu)
+ self.tree.draw()
+ CONNECTOR.Connect(self.jdc,"close",self.onCloseView,())
+
+ def onCloseView(self):
+ self.quit()
+
+ def visufile(self):
+ Fenetre(self.appli,titre="Source du fichier inclus",texte=self.macroitem.object.fichier_text)
+
+ def make_rmenu(self,node,event):
+ if hasattr(node.item,'rmenu_specs'):
+ rmenu = Tkinter.Menu(self.canvas, tearoff=0)
+ self.cree_menu(rmenu,node.item.rmenu_specs,node)
+ rmenu.tk_popup(event.x_root,event.y_root)
+
+ def cree_menu(self,menu,itemlist,node):
+ """
+ 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,node)
+ elif method[0] == '&':
+ # On a une chaine avec & en tete => on cree un radiobouton
+ try:
+ command=getattr(node.item,method[1:])
+ menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
+ if radio == None:radio=number_item
+ except:pass
+ else:
+ try:
+ command=getattr(node.item,method)
+ menu.add_command(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
+ except:pass
+ # Si au moins un radiobouton existe on invoke le premier
+ if radio:menu.invoke(radio)
+
+ def quit(self):
+ #print "quit",self
+ self.tree.supprime()
+ self.tree=None
+ self.fenetre.destroy()
+
+ #def __del__(self):
+ # print "__del__",self
+
+def makeMacroDisplay(appli,macroitem,nom_item):
+ return MacroDisplay(appli,macroitem,nom_item)
+
+import treeitemincanvas
+
+class TREEITEMINCANVAS(treeitemincanvas.TREEITEMINCANVAS):
+ def __init__(self,object,nom="",parent=None,appli=None,sel=None,rmenu=None):
+ #print "TREEITEMINCANVAS",object
+ self.object=object
+ self.nom=nom
+ self.appli=appli
+ self.parent=parent
+
+ self.item=MACRO2TreeItem(self.appli,self.nom,self.object)
+ 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):
+ return
+ self.tree=treewidget.Tree(self.appli,self.item,self.canvas,command=sel,rmenu=rmenu)
+ self.tree.draw()
+
+import jdcdisplay
+
+class MACRODISPLAY(jdcdisplay.JDCDISPLAY):
+ def __init__(self,jdc,nom_jdc,appli=None,parent=None):
+ #print "MACRODISPLAY",jdc
+ self.jdc=jdc
+ self.nom_jdc=nom_jdc
+ self.fichier=None
+ self.panel_courant=None
+ self.appli=appli
+ self.parent=parent
+ self.node_selected = None
+ self.modified='n'
+
+ self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
+ 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,self.make_rmenu)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+
+class MENUBAR:
+ def __init__(self,appli,parent):
+ # L'attribut appli pointe vers l'objet application qui détient la menubar et les autres composants
+ self.appli=appli
+ # L'attribut parent pointe vers l'objet graphique parent de la menubar
+ self.parent=parent
+ self.menubar=Menu(self.parent)
+ self.parent.configure(menu=self.menubar)
+ self.init()
+
+ try:
+ from prefs import labels
+ except:
+ labels= ('Fichier','Edition','Jeu de commandes','Catalogue','Options','Aide','Traducteur')
+
+ def init(self):
+ self.menudict={}
+ for label in self.labels:
+ menu=Menu(self.menubar,tearoff=0)
+ self.menudict[label]=menu
+ self.menubar.add_cascade(label=label,menu=menu)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+import composimp
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+
+class newSIMPPanel(panels.OngletPanel):
+ """
+ Classe virtuelle servant de classe mère à toutes les classes Panel
+ servant à afficher et récupérer la valeur d'un mot-clé simple.
+ Le panel est différent suivant le type de la valeur attendu
+ """
+ def init(self):
+ """
+ Méthode appelée par le constructeur de OngletPanel :
+ construit le notebook à 2 onglets utilisé par tous les panels de
+ tous les mots-clés simples
+ """
+ nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+ nb.pack(fill = 'both', expand = 1)
+ self.nb=nb
+ nb.add('Valeur', tab_text='Saisir valeur')
+ self.makeValeurPage(nb.page('Valeur'))
+ self.enlevebind()
+ self.creebind()
+ nb.setnaturalsize()
+
+# ----------------------------------------------------------------------------------------
+# Méthodes utilisées pour l'affectation de la valeur donnée par l'utilisateur
+# au mot-clé courant
+# ----------------------------------------------------------------------------------------
+
+ def reset_old_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é ni ré-évaluer l'ancienne valeur
+ permet de rester avec des valeurs non entrees et de ne pas
+ ré-évaluer des entiers par exemple
+ """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ self.node.item.set_valeur(name)
+ self.parent.appli.affiche_infos(mess)
+
+ def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
+ """
+ Enregistre val comme valeur de self.node.item.object
+ en evaluant l item et en le validant
+ Si name n'est pas renseigné, la valeur
+ """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ if name != None:
+ valeur = name
+ validite = 1
+ else :
+ valeurentree= self.entry.get()
+ self.entry.delete(0,END)
+ if valeurentree == '': valeurentree=None
+ valeur,validite=self.node.item.eval_valeur(valeurentree)
+ if not validite :
+ valeur= self.entry.get()
+ commentaire = "impossible d'évaluer : %s " %`valeurentree`
+ self.parent.appli.affiche_infos(commentaire)
+
+ if validite :
+ validite,commentaire=self.node.item.valide_val(valeur)
+
+ if validite :
+ self.node.item.set_valeur(valeur)
+ self.parent.appli.affiche_infos(mess)
+ else :
+ self.parent.appli.affiche_infos(commentaire)
+
+# ----------------------------------------------------------------------------------------
+# Méthodes utilisées pour la manipulation des items dans les listes de choix
+# ----------------------------------------------------------------------------------------
+ def selectValeur(self,name):
+ self.selected_valeur = name
+
+ def deselectValeur(self,name):
+ self.selectValeur = None
+
+ def sup_valeur(self,name=None):
+ """
+ Supprime la valeur selectionnée de la liste des valeurs et la rajoute
+ à la liste des choix possibles
+ """
+ if hasattr(self,'selected_valeur') :
+ if ( self.selected_valeur != None and self.selected_valeur != ''):
+ liste_valeurs = self.Liste_valeurs.get_liste()
+ liste_valeurs.remove(self.selected_valeur)
+ self.Liste_valeurs.put_liste(liste_valeurs)
+ listeActuelle=self.Liste_valeurs.get_liste()
+ liste_choix=self.node.item.get_liste_possible(listeActuelle)
+ self.Liste_choix.put_liste(liste_choix)
+ self.selected_valeur = None
+
+ def add_choix(self,name=None):
+ """
+ Ajoute le choix selectionné à la liste des valeurs et le retire
+ de la liste des choix possibles
+ """
+
+ if hasattr(self,'selected_choix') :
+ if (self.selected_choix != None and self.selected_choix != ''):
+ min,max = self.node.item.GetMinMax()
+ liste_valeurs = self.Liste_valeurs.get_liste()
+ if len(liste_valeurs) >= max :
+ self.parent.appli.affiche_infos("La liste ne peut pas avoir plus de %d éléments" %max)
+ return
+ if (self.Liste_valeurs.selection != None):
+ ligne=self.Liste_valeurs.cherche_selected_item()
+ liste_valeurs.insert(ligne,self.selected_choix)
+ else :
+ liste_valeurs.append(self.selected_choix)
+ self.Liste_valeurs.put_liste(liste_valeurs)
+ listeActuelle=self.Liste_valeurs.get_liste()
+ liste_choix=self.node.item.get_liste_possible(listeActuelle)
+ self.Liste_choix.put_liste(liste_choix)
+ self.selected_choix = None
+
+ def selectChoix(self,name):
+ self.selected_choix = name
+
+ def deselectChoix(self,name):
+ self.selectChoix = None
+
+ def raisecmd(self,page):
+ try:
+ self.entry.focus()
+ except:
+ pass
+
+# ----------------------------------------------------------------------------------------
+# Méthodes utilisées pour la manipulation des items en notation scientifique
+# ----------------------------------------------------------------------------------------
+ def set_valeur_texte(self,texte_valeur) :
+ """ Sert à mettre à jour la notation scientifique"""
+ try :
+ if "R" in self.node.item.object.definition.type:
+ if texte_valeur[0] != "'":
+ clef=eval(texte_valeur)
+ if str(clef) != str(texte_valeur) :
+ self.node.item.object.init_modif()
+ clefobj=self.node.item.object.GetNomConcept()
+ if not self.parent.appli.dict_reels.has_key(clefobj):
+ self.parent.appli.dict_reels[clefobj] = {}
+ self.parent.appli.dict_reels[clefobj][clef]=texte_valeur
+ self.parent.appli.dict_reels[clefobj]
+ self.node.item.object.fin_modif()
+ except:
+ pass
+
+
+ def get_valeur_texte(self,valeur) :
+ valeur_texte=""
+ if "R" in self.node.item.object.definition.type:
+ clefobj=self.node.item.object.GetNomConcept()
+ if self.parent.appli.dict_reels.has_key(clefobj):
+ if self.parent.appli.dict_reels[clefobj].has_key(valeur):
+ valeur_texte=self.parent.appli.dict_reels[clefobj][valeur]
+ return valeur_texte
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 os,string
+
+# Modules Eficas
+from widgets import askopenfilename
+import panels
+
+# l'option affichage_commandes peut prendre les valeurs "groupes" ou "alphabetic"
+affichage_commandes="alphabetic"
+
+class OPTIONS:
+
+ menu_defs=[
+ ('Options',[
+ ("Affichage commandes",(("alphabétique",'&affichage_alpha'),("groupes",'&affichage_grp'))),
+ #("Couleur",(("fond",'change_fond'),("barre",'change_barre'))),
+ # ("Catalogue développeur",'choix_cata_developpeur'),
+ ('Paramètres Eficas','affichage_fichier_ini'),
+ ('Paramètres Affichage','affichage_style_ini'),
+
+ ]
+ )
+ ]
+
+ button_defs=[]
+
+ def __init__(self,appli,parent):
+ self.appli=appli
+ self.parent=parent
+
+
+ def affichage_grp(self):
+ global affichage_commandes
+ affichage_commandes="groupes"
+ if hasattr(panels,'panneauCommande'):
+ panel=panels.panneauCommande
+ parent=panel.parent
+ if parent != None :
+ parent.create_panel(parent.node_selected)
+ # si on a un panel avec plusieurs onglets
+ # on affiche Commande
+ try :
+ parent.panel_courant.nb.selectpage("Commande")
+ except :
+ pass
+
+ def affichage_alpha(self):
+
+ global affichage_commandes
+ affichage_commandes="alphabetic"
+ if hasattr(panels,'panneauCommande'):
+ panel=panels.panneauCommande
+ parent=panel.parent
+ if parent != None :
+ parent.create_panel(parent.node_selected)
+ # si on a un panel avec plusieurs onglets
+ # on affiche Commande
+ try :
+ parent.panel_courant.nb.selectpage("Commande")
+ except :
+ pass
+
+ def change_fond(self):
+ from tkColorChooser import askcolor
+ #nouvelle=askcolor(self.appli.background)
+ nouvelle=askcolor('grey')
+
+ def change_barre(self):
+ pass
+
+ def choix_cata_developpeur(self):
+ """
+ Cette méthode demande à l'utilisateur-développeur d'indiquer quel catalogue
+ il veut utiliser en remplacement du catalogue standard du code
+ NB : il faut que le développeur ait les droits d'écriture dans le répertoire où
+ se trouve le catalogue
+ """
+ file = askopenfilename(title="Choix d'un catalogue personnel",
+ defaultextension=".py",
+ filetypes = ( ("Catalogue", "cata*.py"),))
+ if file :
+ self.parent.update_idletasks()
+ self.appli.reset_affichage_infos()
+ rep_fic = os.path.dirname(file)
+ nom_fic = string.split(os.path.basename(file),'.')[0]
+ rep_courant = os.getcwd()
+ os.chdir(rep_fic)
+ self.cata = __import__(nom_fic)
+ self.code = self.cata.CODE
+ os.chdir(rep_courant)
+ self.fic_cata = file
+ fic_cata_p = nom_fic+'_pickled.py'
+ self.fic_cata_p = os.path.join(rep_fic,fic_cata_p)
+ pile_erreurs = self.cata.erreurs_cata
+ if pile_erreurs.existe_message() :
+ messages = pile_erreurs.retourne_messages()
+ print messages
+ else :
+ # XXX ne doit pas fonctionner
+ self.catalo = catabrowser.CataItem(cata=self.cata)
+ self.Retrouve_Ordre_Cata('personnel')
+ pile_erreurs.efface()
+
+
+ def affichage_fichier_ini(self):
+ self.appli.CONFIGURATION.affichage_fichier_ini()
+
+
+ def affichage_style_ini(self):
+ self.appli.CONFIGStyle.affichage_style_ini()
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 os
+from Tkinter import *
+import Pmw
+import time
+import traceback
+
+import widgets
+from widgets import ListeChoix
+from widgets import ListeChoixParGroupes
+from Aster import prefs
+import options
+
+SEPARATEUR = '-'*30
+
+
+class Panel(Frame) :
+ """
+ Classe servant de classe mère à toutes celles représentant les
+ panneaux à afficher en fonction de la nature de l'objet en cours
+ Elle est toujours dérivée.
+ """
+ def __init__(self,parent,panneau,node) :
+ # Le parent d'un panel est un objet de la classe JDCDISPLAY ou derivee
+ # ou un objet qui a les attributs : appli (de classe APPLI ou derivee),
+ # modified et la methode init_modif
+ self.parent=parent
+ self.panneau = panneau
+ self.node=node
+ Frame.__init__(self,self.panneau)
+ self.place(x=0,y=0,relheight=1,relwidth=1)
+ self.creer_boutons()
+ self.init()
+ global panneauCommande
+ panneauCommande=self
+
+ #def __del__(self):
+ # print "__del__",self
+
+ def update_panel(self):
+ """Methode appele pour demander une mise a jour du panneau"""
+
+ 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
+ (à droite sous les onglets )
+ """
+ self.fr_but = Frame(self,height=30)
+ self.fr_but.pack(side='bottom')
+ #self.fr_but.pack(side='bottom',fill='x')
+ #self.bouton_com = Button(self.fr_but, text = 'Commentariser', command = self.ajout_commentaire, width=14)
+ #self.bouton_sup = Button(self.fr_but, text = "Supprimer", command=self.supprimer, width=14)
+ #self.bouton_doc = Button(self.fr_but, text="Documentation", command=self.visu_doc, width=14)
+ #self.bouton_cata = Button(self.fr_but, text = "Catalogue", command = self.show_catalogue, width=14)
+ self.bouton_com = Button(self.fr_but, text = 'Commentariser', command = self.ajout_commentaire)
+ self.bouton_sup = Button(self.fr_but, text = "Supprimer", command=self.supprimer)
+ self.bouton_doc = Button(self.fr_but, text="Documentation", command=self.visu_doc)
+ self.bouton_cata = Button(self.fr_but, text = "Catalogue", command = self.show_catalogue)
+
+ if self.parent.appli.CONFIGURATION.isdeveloppeur == 'OUI':
+ self.bouton_sup.pack(side='left',padx=5, pady=5)
+ self.bouton_cata.pack(side='left',padx=5, pady=5)
+ self.bouton_doc.pack(side='right',padx=5, pady=5)
+ #self.bouton_sup.place(relx=0.25,rely = 0.5,relheight = 0.8,anchor='center')
+ #self.bouton_cata.place(relx=0.5,rely = 0.5,relheight = 0.8,anchor='center')
+ #self.bouton_doc.place(relx=0.75,rely = 0.5,relheight = 0.8,anchor='center')
+ else:
+ self.bouton_sup.pack(side='left',padx=5, pady=5)
+ self.bouton_doc.pack(side='right',padx=5, pady=5)
+ #self.bouton_sup.place(relx=0.3,rely = 0.5,relheight = 0.8,anchor='center')
+ #self.bouton_doc.place(relx=0.7,rely = 0.5,relheight = 0.8,anchor='center')
+
+ def show_catalogue(self):
+ try:
+ genea = self.node.item.get_genealogie()
+ self.parent.appli.browser_catalogue_objet(genea)
+ except Exception,e:
+ traceback.print_exc()
+
+ def efface(self):
+ self.node.efface()
+
+# ------------------------------------------------------------------------
+# Méthodes permettant d'ajouter des commentaires, des paramètres
+# et des objets EVAL.
+# Ces méthodes sont utilisées par les panneaux des JDC,ETAPE,
+# COMMENTAIRE et PARAMETRE
+# ------------------------------------------------------------------------
+
+ def ajout_commentaire(self,ind='after'):
+ """
+ Ajoute un commentaire à l'intérieur du JDC :
+ - si ind='after' : l'ajoute après l'objet courant
+ - si ind='before' : l'ajoute avant.
+ """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ return self.node.append_brother("COMMENTAIRE",ind)
+
+ def ajout_commentaire_first(self):
+ """
+ Ajoute un commentaire en début de JDC
+ """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ return self.node.append_child("COMMENTAIRE",'first')
+
+ def ajout_parametre(self,ind='after'):
+ """
+ Ajoute un parametre à l'intérieur du JDC :
+ - si ind='after' : l'ajoute après l'objet courant
+ - si ind='before' : l'ajoute avant.
+ """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ return self.node.append_brother("PARAMETRE",ind)
+
+ def ajout_parametre_first(self):
+ """
+ Ajoute un parametre en début de JDC
+ """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ return self.node.append_child("PARAMETRE",'first')
+
+# def ajout_parametre_eval(self,ind='after'):
+# """
+# Ajoute un paramètre EVAL à l'intérieur du JDC :
+# - si ind='after' : l'ajoute après l'objet courant
+# - si ind='before' : l'ajoute avant.
+# """
+# if self.parent.modified == 'n' : self.parent.init_modif()
+# return self.node.append_brother("PARAMETRE_EVAL",ind)
+
+# def ajout_parametre_eval_first(self):
+# """
+# Ajoute un paramètre EVAL en début de JDC
+# """
+# if self.parent.modified == 'n' : self.parent.init_modif()
+# return self.node.append_child("PARAMETRE_EVAL",'first')
+
+# ------------------------------------------------------------------------
+
+ def visu_doc(self):
+ """ Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
+ - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
+ - indication du chemin d'accès aux fichiers pdf à revoir : trop statique"""
+ cle_doc = self.node.item.get_docu()
+ if cle_doc == None : return
+ cle_doc = string.replace(cle_doc,'.','')
+ cle_doc = string.replace(cle_doc,'-','')
+ commande = self.parent.appli.CONFIGURATION.exec_acrobat
+ nom_fichier = cle_doc+".pdf"
+ fichier = os.path.abspath(os.path.join(self.parent.appli.CONFIGURATION.path_doc,
+ nom_fichier))
+ if os.name == 'nt':
+ os.spawnv(os.P_NOWAIT,commande,(commande,fichier,))
+ elif os.name == 'posix':
+ script ="#!/usr/bin/sh \n%s %s&" %(commande,fichier)
+ pid = os.system(script)
+
+ def supprimer(self):
+ """
+ Suppression du noeud courant
+ """
+ # On signale au parent du panel (le JDCDisplay) une modification
+ self.parent.init_modif()
+ self.node.delete()
+
+ def affiche(self):
+ """ Force l'affichage des fenêtres en cours """
+ self.tkraise()
+
+ def selectMC(self,name):
+ """ On retrouve le mot-clé sous le curseur pour affichage du fr """
+ cmd=self.node.item.get_definition()
+ texte_infos = ''
+ for e in cmd.entites.keys() :
+ if e == name :
+ texte_infos=getattr(cmd.entites[e],prefs.lang)
+ break
+ if texte_infos == '' : texte_infos="Pas d'infos disponibles"
+ self.parent.appli.affiche_infos(texte_infos)
+
+ def defMC(self,name):
+ """ On ajoute un mot-clé à la commande : subnode """
+ if name == SEPARATEUR:return
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ if name != "COMMENTAIRE":
+ self.node.append_child(name)
+ else :
+ self.ajout_commentaire()
+
+ def selectCmd(self,name):
+ """ On retrouve la commande sous le curseur pour affichage du fr """
+ if name != 'COMMENTAIRE' and name != SEPARATEUR:
+ texte_infos=getattr(self.parent.jdc.get_cmd(name),prefs.lang)
+ self.parent.appli.affiche_infos(texte_infos)
+
+ def defCmd(self,name):
+ """
+ On ajoute une commande après la commande selectionnée : after
+ ou bien on ajoute un commentaire
+ """
+ if name == SEPARATEUR:return
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ if name != "COMMENTAIRE":
+ #parent=self.node.parent
+ #new_obj = parent.item.append_child(name,self.node.item.getObject())
+ #parent.children[parent.children.index(self.node)+1].select()
+ new_node = self.node.append_brother(name,'after')
+ else :
+ new_node = self.ajout_commentaire()
+
+ def defCmdFirst(self,name):
+ """ On ajoute une commande ou un commentaire au début du fichier de commandes """
+ if name == SEPARATEUR:return
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ if name != "COMMENTAIRE":
+ #new_obj = self.node.item.append_child(name,'first')
+ #self.node.children[0].select()
+ new_node = self.node.append_child(name,'first')
+ else :
+ new_node = self.ajout_commentaire_first()
+
+class OngletPanel(Panel) :
+ """ Cette classe est virtuelle et doit être dérivée
+ Elle contient les principales méthodes d'affichage des différents onglets"""
+
+ global panelbind
+
+ def raisecmd(self,page):
+ self.nb.page(page).focus_set()
+ if page == 'Concept':
+ try:
+ self._any.focus()
+ except:
+ pass
+ elif page == 'Commande':
+ try:
+ self.command_entry.component('entry').focus()
+ except:
+ pass
+
+ def creebind(self):
+ self.nb.bind_all("<F1>",lambda e,s=self,num=0:s.commande_up(num))
+ self.nb.bind_all("<F2>",lambda e,s=self,num=1:s.commande_up(num))
+ self.nb.bind_all("<F3>",lambda e,s=self,num=2:s.commande_up(num))
+ self.nb.bind_all("<F4>",lambda e,s=self,num=3:s.commande_up(num))
+ OngletPanel.panelbind=self.nb
+
+ def enlevebind(self):
+ if not hasattr(OngletPanel,"panelbind"):
+ return
+ if OngletPanel.panelbind == None:
+ return
+ try:
+ OngletPanel.panelbind.unbind_all("<F1>")
+ OngletPanel.panelbind.unbind_all("<F2>")
+ OngletPanel.panelbind.unbind_all("<F3>")
+ OngletPanel.panelbind.unbind_all("<F4>")
+ except:
+ pass
+ OngletPanel.panelbind = None
+
+ def commande_up(self,num):
+ #print "commande_up de panels pour ", num
+ try :
+ OngletPanel.panelbind.selectpage(num)
+ pageNew=OngletPanel.panelbind.page(num)
+ pageNew.focus_set()
+ except :
+ pass
+
+ def affiche(self):
+ page=self.nb.getcurselection()
+ self.nb.page(page).focus_set()
+ if page == 'Concept':
+ try:
+# _any est un pointeur sur entry
+# component est une methode de pmw
+# a priori, jamais ok
+ self._any.component('entry').focus_set()
+ except:
+ pass
+ self.tkraise()
+
+# ------------------------------------------------------------------------
+# Méthodes permettant d'afficher des pages partagées par différents
+# types d'objets (règles,mots-clés,concept,...)
+# ------------------------------------------------------------------------
+
+ def makeConceptPage(self,page):
+ """
+ Crée la page de saisie du nom du concept
+ """
+ self.label = Label(page,text='Nom du concept :')
+ self.label.place(relx=0.1,rely=0.4)
+ self._any = Entry(page,relief='sunken')
+ self._any.place(relx=0.35,rely=0.4,relwidth=0.5)
+ self._any.bind("<Return>",lambda e,s=self:s.execConcept())
+ self._any.bind("<KP_Enter>",lambda e,s=self:s.execConcept())
+ self._any.insert(0,self.node.item.GetText())
+ self.but_ok=Button(page,text = "Valider",command=self.execConcept)
+ self.but_ok.place(relx=0.35,rely=0.8, relwidth=0.35)
+ type_sd = self.node.item.get_type_sd_prod()
+ if type_sd :
+ txt = "L'opérateur courant retourne un objet de type %s" %type_sd
+ self.label = Label(page, text = txt)
+ self.label.place(relx=0.5,rely=0.55,anchor='n')
+ self._any.focus()
+ # aide associée au panneau
+ bulle_aide="""Tapez dans la zone de saisie le nom que vous voulez donner
+ au concept retounré par l'opérateur courant et pressez <Return> pour valider"""
+ page.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ page.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+
+ def makeMoclesPage(self,page):
+ """
+ Crée la page qui affiche la liste des mots-clés que l'on peut
+ encore ajouter
+ """
+ genea =self.node.item.get_genealogie()
+ jdc = self.node.item.get_jdc()
+ liste_mc=self.node.item.get_liste_mc_ordonnee(genea,jdc.cata_ordonne_dico)
+ liste_commandes = (("<Enter>",self.selectMC),
+ ("<Leave>",self.deselectMC),
+ ("<Double-Button-1>",self.defMC))
+ Liste = ListeChoix(self,page,liste_mc,liste_commandes = liste_commandes,titre = "Mots-clés permis",optionReturn="oui")
+ Liste.affiche_liste()
+ # aide associée au panneau
+ bulle_aide="""Double-cliquez sur le mot-clé que vous voulez ajouter à
+ la commande en cours d'édition"""
+ Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+ if len(liste_mc) > 0 :
+ Liste.surligne(liste_mc[0])
+ self.Liste=Liste
+
+ def makeCommentairePage(self,page):
+ label = Label(page,text = "Insérer un commentaire :")
+ label.grid(column = 0, row = 2)
+ but_avant = Button(page,text = "AVANT",command = lambda s=self :s.ajout_commentaire(ind = 'before'))
+ but_apres = Button(page,text = "APRES",command = self.ajout_commentaire)
+ but_avant.grid(column = 1,row =2)
+ 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_commandes = (("<Enter>",self.selectCmd),
+ ("<Leave>",self.deselectCmd),
+ ("<Double-Button-1>",self.defCmd))
+ 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",optionReturn="oui")
+ else:
+ liste_commandes=liste_commandes+(("<Return>",self.defCmd),)
+ liste_groupes,dict_groupes=self.get_groups()
+ Liste = ListeChoixParGroupes(self,frame2,liste_groupes,dict_groupes,
+ liste_commandes = liste_commandes,
+ filtre='oui',titre = "Commandes",optionReturn="oui")
+ Liste.affiche_liste()
+ self.command_entry=Liste.entry
+ # aide associée au panneau
+ bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
+ Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+ self.liste_command=Liste
+ global panneauCommande
+ panneauCommande=self
+
+ def makeJDCPage(self,page):
+ """
+ Crée la page correspondant à un objet de type JDC
+ """
+ liste_commandes = (("<Enter>",self.selectCmd),
+ ("<Leave>",self.deselectCmd),
+ ("<Double-Button-1>",self.defCmdFirst))
+ 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",optionReturn="oui")
+ else:
+ liste_commandes=liste_commandes+(("<Return>",self.defCmdFirst),)
+ liste_groupes,dict_groupes=self.get_groups()
+ Liste = ListeChoixParGroupes(self,page,liste_groupes,dict_groupes,
+ liste_commandes = liste_commandes,
+ filtre='oui',titre = "Commandes",optionReturn="oui")
+ Liste.affiche_liste()
+ # aide associée au panneau
+ bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
+ Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+ def makeReglesPage(self,page) :
+ """
+ Crée la page qui affiche la liste des règles avec celle qui ne sont
+ pas respectées en rouge
+ """
+ regles = []
+ regles = self.node.item.get_regles()
+ dictionnaire = self.node.item.get_mc_presents()
+ texte_regles = []
+ l_regles_en_defaut=[]
+ if len(regles) > 0:
+ i = 0
+ for regle in regles :
+ texte_regles.append(regle.gettext())
+ texte,test = regle.verif(dictionnaire)
+ if test == 0 : l_regles_en_defaut.append(i)
+ i = i+1
+ Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
+ Liste.affiche_liste()
+ # aide associée au panneau
+ bulle_aide="""Ce panneau contient la liste des règles qui s'appliquent à l'objet
+ en cours d'édition.
+ - en noir : règles valides
+ - en rouge : règles violées"""
+ Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+ def makeParamCommentPage_for_etape(self,page):
+ """
+ Crée la page qui offre le choix à l'utilisateur d'ajouter un commentaire
+ ou un paramètre, avant ou après le noeud courant dans l'arbre.
+ Cette page est destinée aux objets de niveau ETAPE cad à toutes les CMD,
+ les commentaires inter commandes et les paramètres
+ """
+ # les frame ...
+ self.frame_comment = Frame(page,bd=1,relief='raised')
+ self.frame_param = Frame(page,bd=1,relief='raised')
+ self.frame_boutons = Frame(page,bd=1,relief='raised')
+ self.frame_comment.place(relx=0,rely=0,relwidth=1,relheight=0.40)
+ self.frame_param.place(relx=0,rely=0.40,relwidth=1,relheight=0.40)
+ self.frame_boutons.place(relx=0,rely=0.84,relwidth=1,relheight=0.16)
+ # remplissage de la frame commentaire
+ Label(self.frame_comment,text = "Insérer un commentaire :").place(relx=0.1,rely=0.5,anchor='w')
+ but_comment_avant = Button(self.frame_comment,
+ text = "AVANT "+self.node.item.get_nom(),
+ command = lambda s=self :s.ajout_commentaire(ind = 'before'))
+ but_comment_apres = Button(self.frame_comment,
+ text = "APRES "+self.node.item.get_nom(),
+ command = self.ajout_commentaire)
+ but_comment_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
+ but_comment_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
+ # remplissage de la frame paramètre
+ Label(self.frame_param,text = "Insérer un paramètre :").place(relx=0.1,rely=0.5,anchor='w')
+ but_param_avant = Button(self.frame_param,
+ text = "AVANT "+self.node.item.get_nom(),
+ command = lambda s=self :s.ajout_parametre(ind = 'before'))
+ but_param_apres = Button(self.frame_param,
+ text = "APRES "+self.node.item.get_nom(),
+ command = self.ajout_parametre)
+ but_param_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
+ but_param_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
+ # remplissage de la frame boutons
+ Button(self.frame_boutons,
+ text="Commentariser toute la commande",
+ command = self.comment_commande).place(relx=0.5,rely=0.5,anchor='center')
+
+ def deselectMC(self,name):
+ self.parent.appli.affiche_infos('')
+
+ def get_groups(self):
+ jdc=self.node.item.object.get_jdc_root()
+ return jdc.get_groups()
+
+ def get_liste_cmd(self):
+ #print "get_liste_cmd",self.node.item.object
+ jdc=self.node.item.object.get_jdc_root()
+ listeCmd = jdc.get_liste_cmd()
+ return listeCmd
+
+ def deselectCmd(self,name):
+ self.parent.appli.affiche_infos('')
+
+ def execConcept(self):
+ """
+ Nomme le concept SD retourné par l'étape
+ """
+ if not hasattr(self,'valeur_choisie'):
+ nom = self._any.get()
+ else:
+ nom = self.valeur_choisie.get()
+ nom = string.strip(nom)
+ if nom == '' : return # si pas de nom, on ressort sans rien faire ...
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ test,mess = self.node.item.nomme_sd(nom)
+ #self.node.verif()
+ #self.node.racine.update()
+ self.parent.appli.affiche_infos(mess)
+
+ def changed(self):
+ pass
+
+ def comment_commande(self):
+ """
+ Cette méthode a pour but de commentariser la commande pointée par self.node
+ """
+ # On traite par une exception le cas où l'utilisateur final cherche à désactiver
+ # (commentariser) un commentaire.
+ try :
+ pos=self.node.parent.children.index(self.node)
+ commande_comment = self.node.item.get_objet_commentarise()
+ # On signale au parent du panel (le JDCDisplay) une modification
+ self.parent.init_modif()
+ self.node.parent.children[pos].select()
+ except Exception,e:
+ traceback.print_exc()
+ widgets.showerror("TOO BAD",str(e))
+ return
+
+
+class Panel_Inactif(Panel):
+ """
+ Cette classe sert à définir un panneau dans lequel on dit que le noeud
+ sélectionné n'est pas actif
+ """
+ def __init__(self,parent,panneau,node) :
+ self.parent=parent
+ self.panneau = panneau
+ self.node=node
+ Frame.__init__(self,self.panneau)
+ self.place(x=0,y=0,relheight=1,relwidth=1)
+ self.creer_texte()
+
+ def creer_texte(self):
+ texte = "Le noeud sélectionné ne correspond pas à un objet actif\n"
+ texte = texte + "Seules les commandes placées entre \nDEBUT/POURSUITE et FIN sont actives"
+ longueur = int(self.panneau.winfo_width()*0.8)
+ self.label = Label(self,text=texte,wraplength=longueur,justify='center')
+ self.label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
+ self.bouton_sup = Button(self,
+ text = "Supprimer",
+ command=self.supprimer,
+ width=14)
+ self.bouton_sup.place(relx=0.5,rely=0.8,anchor='center')
+
+
+if __name__ == "__main__" : pass
--- /dev/null
+# -*- coding: utf-8 -*-
+print "Import de panelsSalome"
+
+from Tkinter import *
+from widgets import ListeChoix
+from widgets import showerror
+
+from fonctionpanel import FONCTION_Panel
+from shellpanel import SHELLPanel
+from plusieursintopanel import PLUSIEURS_INTO_Panel
+from plusieursassdpanel import PLUSIEURS_ASSD_Panel
+from plusieursbasepanel import PLUSIEURS_BASE_Panel
+from plusieursbasepanel import PLUSIEURS_BASE_OR_UNELISTE_Panel
+from uniquesdcopanel import UNIQUE_SDCO_Panel
+from uniqueassdpanel import UNIQUE_ASSD_Panel
+from uniqueintopanel import UNIQUE_INTO_Panel
+from uniquecomppanel import UNIQUE_COMP_Panel
+from uniquebasepanel import UNIQUE_BASE_Panel
+from uniqueassdpanel import UNIQUE_ASSD_Panel_Reel
+
+from Noyau.N_CR import justify_text
+
+import traceback
+import salome # CS_pbruno à poubelliser
+import images
+
+
+
+# 2 types de commandes vont etre particularisees dans Salome
+#
+# - un cas general :
+# Toutes les commandes possedant GROUP_NO ou GROUP_MA
+# seront surchargees d office
+# pour cela on va utiliser le dictionnaire dict_classes_salome
+# qui va permettre de changer la classe de la commande
+# ainsi si un panel en dehors de salome a pour classe PLUSIEURS_BASE_Panel
+# la classe de ce panel devient alors SALOME_PLUSIEURS_BASE_Panel
+# (pour cela voir composimp)
+
+# des commandes "autres" ne pouvant pas etre identifiées par leur nom
+# il suffit de creer dans la classe SALOME de la commande
+# une fonction portant son nom
+# Exemple de particularisation d un panel :
+# Supposons que l on veuille particulariser la commande
+# - LIRE_MAILLAGE_UNITE
+# le panel initial a pour classe UNIQUE_BASE_Panel
+# il suffit d'ajouter dans la classe derivée SALOME_UNIQUE_BASE_Panel
+# une fonction SALOME_LIRE_MAILLAGE_UNITE
+# la classe de ce panel devient alors SALOME_UNIQUE_BASE_Panel
+# on peut surcharger les methodes nécessaires (affichage par exemple)
+
+
+class SALOME_SHELLPanel (SHELLPanel):
+ ""
+
+class SALOME_FONCTION_Panel (FONCTION_Panel):
+ ""
+
+class SALOME_PLUSIEURS_INTO_Panel (PLUSIEURS_INTO_Panel):
+ ""
+
+class SALOME_PLUSIEURS_ASSD_Panel (PLUSIEURS_ASSD_Panel):
+ ""
+
+class SALOME_UNIQUE_INTO_Panel (UNIQUE_INTO_Panel):
+ ""
+
+class SALOME_UNIQUE_SDCO_Panel (UNIQUE_SDCO_Panel):
+ ""
+
+class SALOME_UNIQUE_ASSD_Panel (UNIQUE_ASSD_Panel):
+ ""
+
+class SALOME_UNIQUE_COMP_Panel (UNIQUE_COMP_Panel):
+ ""
+
+class SALOME_UNIQUE_ASSD_Panel_Reel (UNIQUE_ASSD_Panel_Reel):
+ ""
+
+# ------------------------------------------------------------------------------#
+# classe SALOME_PLUSIEURS_BASE_Panel
+#
+# Commandes modifiées :
+# - AFFE_CHAR_MECA_DDL_IMPO_GROUP_NO
+# Methodes surchargées :
+# - makeValeurPage(self,page)
+#
+# ------------------------------------------------------------------------------#
+
+class SALOME_PLUSIEURS_BASE_OR_UNELISTE_Panel(PLUSIEURS_BASE_OR_UNELISTE_Panel):
+ ""
+
+class SALOME_PLUSIEURS_BASE_Panel(PLUSIEURS_BASE_Panel):
+
+ def __init__(self,parent,panneau,node):
+ PLUSIEURS_BASE_Panel.__init__( self, parent, panneau, node )
+ #self.selected_valeur = None
+
+ def add_valeur_plusieurs_base(self,name=None):
+ try:
+ valeur,validite,commentaire=self.get_valeur()
+ if not valeur: # sélection dans salome
+ strSelection = ''
+
+ genea=self.node.item.get_genealogie()
+ kwType = None
+ for e in genea:
+ if "GROUP_NO" in e:
+ kwType = "GROUP_NO"
+ if "GROUP_MA" in e:
+ kwType = "GROUP_MA"
+
+ selection, msg = self.parent.appli.selectGroupFromSalome(kwType)
+ if selection:
+ for oneSelection in selection:
+ strSelection +=str( oneSelection )
+ strSelection +=','
+
+ strSelection = strSelection.rstrip(',')
+ self.display_valeur( strSelection )
+
+ PLUSIEURS_BASE_Panel.add_valeur_plusieurs_base( self, name )
+ if msg:
+ self.parent.appli.affiche_infos(msg)
+ self.erase_valeur()
+ except:
+ print ' erreur add_valeur_plusieurs_base' #CS_pbruno : afficher boite de dialogue ici ?
+
+ def makeValeurPage(self,page):
+ """
+ Crée la page de saisie d'une liste de valeurs à priori quelconques,
+ cad qui ne sont pas à choisir dans une liste prédéfinie
+ """
+ PLUSIEURS_BASE_Panel.makeValeurPage(self,page)
+ self.c = Button( self.frame_choix, text='Visualiser',command=self.displayInSalomeGeom )
+ self.c.place( relx=0.3, rely=0.0,relwidth=0.55)
+
+
+ def displayInSalomeGeom( self ):
+ if self.selected_valeur:
+ ok, msgError = self.parent.appli.displayShape( self.selected_valeur )
+ if not ok:
+ self.parent.appli.affiche_infos(msgError)
+
+
+
+
+# ------------------------------------------------------------------------------#
+# classe SALOME_UNIQUE_BASE_Panel
+#
+# Commandes modifiées :
+# - LIRE_MAILLAGE_UNITE
+# Methodes surchargées :
+# - makeValeurPage(self,page)
+#
+# ------------------------------------------------------------------------------#
+
+class SALOME_UNIQUE_BASE_Panel(UNIQUE_BASE_Panel):
+
+# ce dictionnaire va servir lors de la sortie d efficas
+# a creer le fichier qui sera integre au config.txt
+# pour relier une unite logique et un nom de fichier
+
+ dict_fichier_unite={}
+
+
+ def SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_N(self):
+ entrychaine=salome.sg.getAllSelected()
+ if entrychaine != '':
+ self.entry2.delete(0,END)
+ try:
+ SO = salome.myStudy.FindObjectID(entrychaine[0])
+ except:
+ boo = 0
+ SO = None
+
+ FileName=''
+ if SO != None:
+ myBuilder = salome.myStudy.NewBuilder()
+ boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeFileType")
+ if boo:
+ val=FileAttr.Value()
+ if (val !="FICHIERMED" and val != "FICHIER_RESU_MED"):
+ boo=0
+ showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
+ else:
+ boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeExternalFileDef")
+ if boo :
+ FileName=FileAttr.Value()
+ else:
+ showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
+ if FileName != '' :
+ self.entry.delete(0,END)
+ self.entry2.delete(0,END)
+ self.entry.insert(0,FileName)
+ self.entry2.insert(0,FileName)
+ self.valid_valeur()
+
+
+ def SALOME_DONNEES_HOMARD_TRAITEMENT_NOM_MED_MAILLAGE_N(self):
+ EntryName=''
+ entrychaine=salome.sg.getAllSelected()
+ if entrychaine != '':
+ self.entry2.delete(0,END)
+ try:
+ SO = salome.myStudy.FindObjectID(entrychaine[0])
+ except:
+ boo = 0
+ SO = None
+
+ if SO is not None:
+ myBuilder = salome.myStudy.NewBuilder()
+ ok, AtName = myBuilder.FindAttribute(SO,"AttributeName")
+ if ok:
+ EntryName=AtName.Value()
+
+ if EntryName != '':
+ self.entry.delete(0,END)
+ self.entry2.delete(0,END)
+ self.entry.insert(0,EntryName)
+ self.entry2.insert(0,EntryName)
+ self.valid_valeur()
+
+ def SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_NP1(self):
+ self.SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_N()
+
+ def SALOME_DEFI_GROUP_CREA_GROUP_MA_GROUP_MA(self):
+ #try:
+ if ( 1 == 1 ) :
+ selection, msg = self.parent.appli.selectGroupFromSalome()
+ if selection:
+ strSelection =str( selection )
+ UNIQUE_BASE_Panel.valid_valeur(self,strSelection)
+ if msg:
+ self.parent.appli.affiche_infos(msg)
+ self.erase_valeur()
+ #except:
+ else :
+ print ' erreur '
+
+
+ def redistribue_selon_simp(self):
+ genea = self.node.item.get_genealogie()
+ commande="SALOME"
+ for i in range(0,len( genea )) :
+ commande=commande+"_"+ genea[i]
+ # --------------------------------------------------------------
+ # on verifie que la methode n est pas particularise
+ # sinon on appelle SALOME_DEFI_GROUP_CREA_GROUP_MA_GROUP_MA qui
+ # sert comme methode par defaut
+ # --------------------------------------------------------------
+ try :
+ SALOME_UNIQUE_BASE_Panel.__dict__[commande](self)
+ except :
+ SALOME_UNIQUE_BASE_Panel.SALOME_DEFI_GROUP_CREA_GROUP_MA_GROUP_MA(self)
+
+
+
+ def makeValeurPage(self,page):
+ """
+ Crée la page de saisie d'une valeur à priori quelconque,
+ cad qui ne sont pas à choisir dans une liste prédéfinie
+ Ajout d'un bouton pour selectionner à partir de Salome
+ """
+ UNIQUE_BASE_Panel.makeValeurPage(self,page)
+ self.b = Button(self.frame_valeur,text='Relier selection',command=self.redistribue_selon_simp)
+ self.b.place(relx=0.28,rely=0.4,relwidth=0.4)
+
+#---------------------------------------------------------------------------------------
+# Correspondances entre les classes eficas et les classes salome_eficas
+#______________________________________________________________________________________
+dict_classes_salome = { SHELLPanel : SALOME_SHELLPanel,
+ FONCTION_Panel : SALOME_FONCTION_Panel,
+ PLUSIEURS_INTO_Panel : SALOME_PLUSIEURS_INTO_Panel,
+ PLUSIEURS_ASSD_Panel : SALOME_PLUSIEURS_ASSD_Panel,
+ PLUSIEURS_BASE_Panel : SALOME_PLUSIEURS_BASE_Panel,
+ PLUSIEURS_BASE_OR_UNELISTE_Panel : SALOME_PLUSIEURS_BASE_OR_UNELISTE_Panel,
+ UNIQUE_INTO_Panel : SALOME_UNIQUE_INTO_Panel,
+ UNIQUE_SDCO_Panel : SALOME_UNIQUE_SDCO_Panel,
+ UNIQUE_ASSD_Panel : SALOME_UNIQUE_ASSD_Panel,
+ UNIQUE_ASSD_Panel_Reel : SALOME_UNIQUE_ASSD_Panel_Reel,
+ UNIQUE_COMP_Panel : SALOME_UNIQUE_COMP_Panel,
+ UNIQUE_BASE_Panel : SALOME_UNIQUE_BASE_Panel}
+
+dict_geom_numgroupe = { }
+dict_geom_numface = { }
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 modifications mineures du comportement
+ du noyau ou de validation
+"""
+import string
+
+if __name__ == "__main__":
+ import Noyau.N_CR
+ print Noyau.N_CR.encadre_message(motif='!',
+texte="""- Il faut au moins un mot-clé parmi : ('DEBUT', 'POURSUITE')
+- Il faut au moins un mot-clé parmi : ('FIN',)
+- Il faut qu'au moins un objet de la liste : ('DEBUT', 'POURSUITE') soit suivi d'au moins un objet de la liste : ('FIN',)
+ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,yyyyyyyyyyyyyyyy
+""")
+
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from plusieurspanel import PLUSIEURS_Panel
+
+class PLUSIEURS_ASSD_Panel(PLUSIEURS_Panel):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de donner une liste de valeurs qui ne sont pas
+ à choisir dans une liste discrètes et qui sont de type dérivé d'ASSD
+ """
+ def makeValeurPage(self,page):
+ """
+ Génère la page de saisie de plusieurs noms de SD parmi un ensemble discret
+ de SD possibles, cad d'un type cohérent avec les types attendus par le mot-clé simple
+ """
+ # On récupère la bulle d'aide du panneau, l'objet, l'aide, min et max (cardinalité de la liste),
+ # la liste des valeurs déjà affectées à l'objet courant et la liste des SD du bon type
+ bulle_aide=self.get_bulle_aide()
+ self.ajout_valeurs=None
+ objet_mc = self.node.item.get_definition()
+ aide = self.get_aide()
+ aide = justify_text(texte=aide)
+ min,max = self.node.item.GetMinMax()
+ l_valeurs = self.node.item.GetListeValeurs()
+ l_choix=self.node.item.get_sd_avant_du_bon_type()
+ l_choix.sort()
+ # remplissage du panneau
+ self.frame_valeurs = Frame(page)
+ self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
+ self.frame_boutons_fleches = Frame(page)
+ self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
+ self.frame_choix = Frame(page)
+ self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
+ self.frame_boutons = Frame(page)
+ self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=0.5,relheight=0.1)
+ liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+ ("<Button-3>",self.deselectValeur),
+ ("<Double-Button-1>",self.sup_valeur_sans_into))
+ liste_commandes_choix = (("<Button-1>",self.selectChoix),
+ ("<Button-3>",self.deselectChoix),
+ ("<Double-Button-1>",self.add_eval_valeur_sans_into))
+ self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
+ titre="Valeur(s) actuelle(s)")
+ self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,liste_commandes = liste_commandes_choix,
+ titre= "Valeurs possibles")
+ self.bouton_add = Button(self.frame_boutons_fleches,
+ image = images.get_image('arrow_left'),
+ command = self.add_eval_valeur_sans_into)
+ self.bouton_sup = Button(self.frame_boutons_fleches,
+ image = images.get_image('arrow_right'),
+ command = self.sup_valeur_sans_into)
+ self.bouton_accepter = Button(self.frame_boutons,
+ text='Valider',
+ command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
+ self.bouton_annuler = Button(self.frame_boutons,
+ text = 'Annuler',
+ command = self.annule_modifs_valeur)
+ self.bouton_add.place(relx=0.3,rely=0.35)
+ self.bouton_sup.place(relx=0.3,rely=0.65)
+ for but in (self.bouton_accepter,self.bouton_annuler):
+ but.pack(side='left',padx=4)
+ self.Liste_valeurs.affiche_liste()
+ if len(l_valeurs) > 0 :
+ liste_marque=l_valeurs[-1]
+ self.Liste_valeurs.surligne(liste_marque)
+ self.Liste_choix.affiche_liste()
+ for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
+ fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+ def add_eval_valeur_sans_into(self,valeurentree=None):
+ if valeurentree == None:
+ valeurentree = self.get_valeur()
+ valeur,validite=self.node.item.eval_valeur(valeurentree)
+ if not validite :
+ commentaire = "impossible d'évaluer : %s " %`valeurentree`
+ self.parent.appli.affiche_infos(commentaire)
+ return
+ self.add_valeur_sans_into(valeur)
+
+ def get_bulle_aide(self):
+ """
+ Retourne la bulle d'aide associée au panneau
+ """
+ return """Un clic sur une valeur des deux listes la sélectionne.
+ - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
+ dans la liste des valeurs que vous voulez affecter au mot-clé simple
+ - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
+ sélectionnée (elle apparaît alors à nouveau comme choix possible
+ dans la liste des choix à droite)
+ - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
+ au mot-clé simple courant
+ - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
+ avant toute modification depuis le dernier 'Valider'"""
+
+ def get_aide(self):
+ """
+ Retourne la phrase d'aide indiquant de quel type doivent être les
+ valeurs que doit entrer l'utilisateur
+ """
+ commentaire=""
+ mc = self.node.item.get_definition()
+ type = mc.type[0].__name__
+ if len(mc.type)>1 :
+ for typ in mc.type[1:] :
+ type = type + ' ou '+typ.__name__
+ if mc.min == mc.max:
+ commentaire="Une liste de "+`mc.min`+" objets de type "+type+" est attendue"
+ else :
+ commentaire="Une liste d'objets de type "+type+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
+ aideval=self.node.item.aide()
+ commentaire=commentaire +"\n"+ aideval
+ return commentaire
+
+
+ def sup_valeur(self,name=None):
+ """
+ Supprime la valeur selectionnée de la liste des valeurs et la rajoute
+ à la liste des choix possibles
+ """
+ liste_valeurs = self.Liste_valeurs.get_liste()
+ liste_valeurs.remove(self.selected_valeur)
+ liste_choix = self.node.item.get_definition().into
+ liste_choix = substract_list(liste_choix,liste_valeurs)
+ self.Liste_valeurs.put_liste(liste_valeurs)
+ self.Liste_choix.put_liste(liste_choix)
+ self.selected_valeur = None
+
+ def erase_valeur(self):
+ pass
+
+ def get_valeur(self):
+ """
+ Retourne la valeur sélectionnée dans la liste des choix
+ """
+ return self.selected_choix
+
+ def display_valeur(self,val=None):
+ """
+ Affiche la valeur passée en argument dans l'entry de saisie.
+ Par défaut affiche la valeur du mot-clé simple
+ """
+ # Il n'y a pas d'entry pour ce type de panneau
+ return
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import showinfo
+from widgets import askopenfilename
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+from widgets import FenetreDeParametre
+
+from Noyau.N_CR import justify_text
+from Ihm.I_LASSD import LASSD
+from Extensions.parametre import PARAMETRE
+
+from Editeur.utils import substract_list
+from plusieurspanel import PLUSIEURS_Panel
+from uniqueassdpanel import UNIQUE_ASSD_Panel
+
+from InterfaceTK import fontes
+import math
+
+class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de donner une liste de valeurs qui ne sont pas
+ à choisir dans une liste discrètes et qui sont de type de base :
+ entier, réel, string,...
+ """
+ def makeValeurPage(self,page):
+ """
+ Crée la page de saisie d'une liste de valeurs à priori quelconques,
+ cad qui ne sont pas à choisir dans une liste prédéfinie
+ """
+ #print "Methode Utilisée par Salome"
+ # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
+ # et la liste des valeurs déjà affectées à l'objet courant
+ bulle_aide=self.get_bulle_aide()
+ objet_mc = self.node.item.get_definition()
+ aide = self.get_aide()
+ aide = justify_text(texte=aide)
+ min,max = self.node.item.GetMinMax()
+ l_valeurs = self.node.item.GetListeValeurs()
+
+ # création des frames globales
+ self.frame1 = Frame(page,relief='groove',bd=2)
+ self.frame2 = Frame(page)
+ self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
+ self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
+ self.frame_right = Frame(self.frame1)
+ self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
+
+ # création des frames internes
+ self.frame_valeurs = Frame(self.frame1)
+ self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
+ self.frame_boutons_fleches = Frame(self.frame_right)
+ self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
+ self.frame_choix = Frame(self.frame_right)
+ self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.8)
+ self.frame_aide = Frame(self.frame_right)
+ self.frame_aide.place(relx=0.1,rely=0.8,relwidth=0.8,relheight=0.2)
+ self.frame_boutons = Frame(self.frame2)
+ self.frame_boutons.place(relx=0.2,rely=0.,relwidth=1,relheight=1.)
+ for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
+ self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
+ fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+ # création des objets dans les frames
+ liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+ ("<Button-3>",self.deselectValeur),
+ ("<Double-Button-1>",self.sup_valeur_sans_into))
+ self.Liste_valeurs=ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
+ titre="Valeur(s) actuelle(s)")
+
+ # Création de l'entry ou de la liste des SD
+ # PN : pour ajouter les validators
+ self.label = Label(self.frame_choix,text="Valeur :")
+ self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
+ self.label.place(relx=0.05,rely=0.2)
+
+ # Création d'un bouton "Importer ..." et d'un bouton "Paramatres" 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.4,relwidth=0.6)
+ bouton_parametres = Button(self.frame_choix, text="Parametres", command=self.affiche_parametre)
+ bouton_parametres.place(relx=0.28,rely=0.6,relwidth=0.6)
+ self.ajout_valeurs = None
+
+ # boutons Ajouter et Supprimer
+ self.bouton_add = Button(self.frame_boutons_fleches,
+ image = images.get_image('arrow_left'),
+ command = self.add_valeur_plusieurs_base)
+ self.bouton_sup = Button(self.frame_boutons_fleches,
+ image = images.get_image('arrow_right'),
+ command = self.sup_valeur_sans_into)
+ self.bouton_add.place(relx=0.3,rely=0.35)
+ self.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',
+ 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()
+ if len(l_valeurs) > 0 :
+ liste_marque=l_valeurs[-1]
+ self.Liste_valeurs.surligne(liste_marque)
+ self.selectValeur(liste_marque)
+ # boutons Accepter et Annuler
+ self.bouton_accepter = Button(self.frame_boutons,
+ text='Valider',
+ command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
+ self.bouton_annuler = Button(self.frame_boutons,
+ text = 'Annuler',
+ command = self.annule_modifs_valeur)
+ self.bouton_accepter.place(relx=0.2, rely=0.2,relwidth=0.25)
+ self.bouton_annuler.place(relx=0.5, rely=0.2,relwidth=0.25)
+
+ def affiche_parametre(self) :
+ if self.node.item.get_liste_param_possible() != [ ]:
+ txtparam=""
+ for param in self.node.item.get_liste_param_possible():
+ txtparam=txtparam+repr(param)+"\n"
+ if txtparam=="":
+ showerror("Aucun parametre ","Pas de parametre de ce type")
+ else :
+ try :
+ self.self.fenetreparam.destroy()
+ except:
+ pass
+ self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
+
+ def valid_valeur(self):
+ self.add_valeur_plusieurs_base()
+
+ def add_valeur_plusieurs_base(self,name=None):
+ if name != None :
+ valeur = name
+ else:
+ valeur,validite,commentaire=self.get_valeur()
+ if not validite :
+ self.parent.appli.affiche_infos(commentaire)
+ return
+
+ atraiter=[]
+ if type(valeur) in (types.ListType,types.TupleType) :
+ indice = 0
+ while (indice < len(valeur)):
+ v=valeur[indice]
+ if self.node.item.wait_complex :
+ if (v== 'RI' or v == 'MP'):
+ try :
+ t=tuple([v,valeur[indice+1],valeur[indice+2]])
+ atraiter.append(t)
+ indice=indice+3
+ except :
+ validite=0
+ commentaire = "Veuillez entrer le complexe sous forme aster ou sous forme python"
+ self.parent.appli.affiche_infos(commentaire)
+ return
+ else : # ce n'est pas un tuple à la mode aster
+ atraiter.append(v)
+ indice = indice + 1
+ else: # on n'attend pas un complexe
+ atraiter.append(v)
+ indice=indice+1
+ else:
+ atraiter.append(valeur)
+
+ for valeur in atraiter :
+ encorevalide=self.node.item.valide_item(valeur)
+ if encorevalide :
+ listecourante=self.Liste_valeurs.get_liste()
+ encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
+ if not encorevalide : encorevalide = -1
+ self.add_valeur_sans_into(valeur,encorevalide)
+
+ def select_in_file(self):
+ """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
+ nom_fichier = askopenfilename(title="Choix fichier :")
+
+ if not 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):
+ """
+ Retourne l'aide associée au panneau courant
+ """
+ return """Taper dans la boîte de saisie de droite la valeur que
+ vous voulez affecter au mot-clé simple.
+ - Cliquez sur la flèche gauche ou pressez <Return> pour la faire glisser
+ dans la liste des valeurs que vous voulez affecter au mot-clé simple
+ - Un clic sur une valeur de la liste la sélectionne
+ - Un clic sur la flèche droite ou un double-clic retire la valeur
+ sélectionnée de la liste
+ - Cliquez sur 'Valider' pour que la nouvelle valeur désirée soit affectée
+ au mot-clé simple
+ - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
+ depuis le dernier clic sur 'Valider'"""
+
+ def get_aide(self):
+ """
+ Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
+ que saisit l'utilisateur
+ """
+ commentaire=""
+ mc = self.node.item.get_definition()
+ d_aides = { 'TXM' : 'chaînes de caractères',
+ 'R' : 'réels',
+ 'I' : 'entiers',
+ 'C' : 'complexes'}
+ type = mc.type[0]
+ if not d_aides.has_key(type) : return 'Type de base inconnu'
+ if mc.min == mc.max:
+ commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min` + " est attendue"
+ else :
+ commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
+
+ aideval=self.node.item.aide()
+ commentaire=commentaire +"\n"+aideval
+ return commentaire
+
+ def make_entry(self,frame,command,x=0.28,y=0.2):
+ self.entry = Entry(frame,relief='sunken')
+ self.entry.place(relx=0.28,rely=y,relwidth=0.6)
+ self.entry.bind("<Return>",lambda e,c=command:c())
+ self.entry.bind("<KP_Enter>",lambda e,c=command:c())
+ self.entry.focus()
+
+ def get_valeur(self):
+ """
+ Retourne la valeur saisie par l'utilisateur dans self.entry
+ """
+ commentaire = ""
+ if hasattr(self,'entry'):
+ # Traitement d'une entree unique
+ valeurentree = self.entry.get()
+ if (valeurentree == None or valeurentree ==""):
+ return None,0,""
+
+ #On tente une evaluation globale (ne fait pas de vérification de validité
+ #seulement une transformation de la chaine en objet équivalent)
+ valeur,validite=self.node.item.eval_valeur(valeurentree)
+ if valeur == valeurentree:
+ #L'evaluation n'a rien donné : on a toujours la string
+ #on découpe la string sur le séparateur , si c'est possible
+ if valeurentree.find(',') != -1:
+ valeur=[]
+ for v in valeurentree.split(','):
+ vsimple,validite=self.node.item.eval_valeur(v)
+ valeur.append(vsimple)
+
+ return valeur,validite,commentaire
+
+
+ # if (valeurentree[0] != "(") and (valeurentree.find(',') < len(valeurentree)):
+ # valeurs=[]
+ # for v in valeurentree.split(','):
+ # vsimple,validite=self.node.item.eval_valeur(v)
+ # Pn If ajoute pour le panneau "double"
+ #if isinstance(vsimple,LASSD) :
+ # commentaire = "impossible de mélanger reels et liste prédéfinie"
+ # validite = 0
+ # break
+ # if validite :
+ # valeurs.append(vsimple)
+ # else:
+ # commentaire = "impossible d'évaluer : %s " %`valeurentree`
+ # break
+ # valeur=valeurs
+ # else:
+ # valeur,validite=self.node.item.eval_valeur(valeurentree)
+ # if not validite and commentaire == "":
+ # commentaire = "impossible d'évaluer : %s " %`valeurentree`
+ # return valeur,validite,commentaire
+ #else:
+ # # Traitement d'une entree de type complexe
+ # try:
+ # valeur= (self.typ_cplx.get(),
+ # string.atof(self.entry1.get()),
+ # string.atof(self.entry2.get()))
+ # return valeur,1,""
+ # except:
+ # #traceback.print_exc()
+ # return None,0,"impossible d'évaluer la valeur d'entree"
+
+ def erase_valeur(self):
+ """
+ Efface la valeur donnée par l'utilisateur dans l'entry
+ """
+ if hasattr(self,'entry'):
+ self.entry.delete(0,END)
+ else:
+ self.typ_cplx.set('RI')
+ self.entry1.delete(0,END)
+ self.entry2.delete(0,END)
+
+
+ def display_valeur(self,val=None):
+ """
+ Affiche la valeur passée en argument dans l'entry de saisie.
+ Par défaut affiche la valeur du mot-clé simple
+ """
+ if not val :
+ valeur = self.node.item.object.getval()
+ else:
+ valeur = val
+ if not valeur : return
+
+ if hasattr(self,'entry'):
+ # Traitement d'une entree unique
+ self.entry.delete(0,END)
+ self.entry.insert(0,str(valeur))
+ else:
+ # Traitement d'une entree de type complexe
+ typ_cplx,x1,x2=valeur
+ self.entry1.delete(0,END)
+ self.entry2.delete(0,END)
+ self.typ_cplx.set(typ_cplx)
+ self.entry1.setentry(x1)
+ self.entry2.setentry(x2)
+
+class PLUSIEURS_BASE_OR_UNELISTE_Panel(PLUSIEURS_BASE_Panel,UNIQUE_ASSD_Panel):
+
+ def makeValeurPage(self,page):
+ """
+ Crée la page de saisie d'une liste de valeurs à priori quelconques,
+ cad qui ne sont pas à choisir dans une liste prédéfinie
+ """
+ # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
+ # et la liste des valeurs déjà affectées à l'objet courant
+ bulle_aide=self.get_bulle_aide()
+ objet_mc = self.node.item.get_definition()
+ aide = self.get_aide()
+ aide = justify_text(texte=aide)
+ aide2 = self.get_aide2()
+ aide2 = justify_text(texte=aide2)
+ min,max = self.node.item.GetMinMax()
+ l_valeurs = self.node.item.GetListeValeurs()
+ for i in l_valeurs:
+ if isinstance(i,LASSD) :
+ affiche_entry=l_valeurs
+ l_valeurs=()
+
+ # Il faut traiter ici pour avoir le choix entre une liste
+ # deja constituee (listr8aster) ou manuelle
+
+ # création des frames globales
+ self.frame1 = Frame(page,relief='groove',bd=2)
+ self.frame2 = Frame(page)
+ self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.9)
+ self.frame2.place(relx=0.,rely=0.9,relwidth=1,relheight=0.1)
+
+ # création des frames internes dans frame1
+ self.frame_valeurs = Frame(self.frame1)
+ self.frame_valeurs.place(relx=0.02,rely=0.55,relwidth=0.35,relheight=0.45)
+ self.frame_haut = Frame(self.frame1)
+ self.frame_haut.place(relx=0.02,rely=0.02,relwidth=0.98,relheight=0.45)
+ self.frame_bas = Frame(self.frame1)
+ self.frame_bas.place(relx=0.37,rely=0.55,relwidth=0.63,relheight=0.45)
+
+ # création des frames internes dans frame_right
+ self.frame_fleches = Frame(self.frame_bas)
+ self.frame_fleches.place(relx=0.,rely=0.4,relwidth=0.2,relheight=0.5)
+ self.frame_choix = Frame(self.frame_bas)
+ self.frame_choix.place(relx=0.2,rely=0.1,relwidth=0.75,relheight=1)
+
+ # affichage de l'aide
+ self.aide = Label(self.frame_haut, text = aide, justify='center', anchor='center',)
+ self.aide.place(relx=0.72,rely=0.25,anchor='center',relwidth=1)
+ self.aide2 = Label(self.frame2, text = aide2,)
+ self.aide2.place(relx=0.4,rely=0.01,relwidth=0.6)
+
+ # Création d'un bouton "Importer ..." et d'un bouton "Parametres" 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.0,relwidth=0.6)
+ bouton_parametres = Button(self.frame_choix, text="Parametres", command=self.affiche_parametre)
+ bouton_parametres.place(relx=0.28,rely=0.25,relwidth=0.6)
+ self.ajout_valeurs = None
+
+
+ # Création de la liste des SD
+ liste_noms_sd = self.node.item.get_sd_avant_du_bon_type_pour_type_de_base()
+ liste_noms_sd = self.tri(liste_noms_sd)
+ self.listbox = Pmw.ScrolledListBox(self.frame_haut,
+ items=liste_noms_sd,
+ labelpos='n',
+ #label_text="Structures de données du type\n requis parl'objet courant :",
+ label_text="Listes du type\n requis parl'objet courant :",
+ listbox_height = 6,
+ dblclickcommand=lambda s=self,c=UNIQUE_ASSD_Panel.valid_valeur : s.choose_valeur_from_list(c))
+ self.listbox.place(relx=0.00,rely=0.00,relwidth=0.4)
+
+ # On eneleve le label pour gagner de la place
+ #self.label = Label(self.frame_choix,text="Valeur :")
+ #self.label.place(relx=0.05,rely=0.85)
+ self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base,x=0.28,y=0.55)
+
+ # boutons Ajouter et Supprimer
+ bouton_add = Button(self.frame_fleches, image = images.get_image('arrow_left'),
+ command = self.add_valeur_plusieurs_base)
+ bouton_sup = Button(self.frame_fleches, image = images.get_image('arrow_right'),
+ command = self.sup_valeur_sans_into)
+ bouton_add.place(relx=0.2,rely=0.25)
+ bouton_sup.place(relx=0.2,rely=0.70)
+
+
+ # boutons Accepter et Annuler dans frame2
+ bouton_accepter = Button(self.frame2, text='Valider',
+ command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
+ bouton_annuler = Button(self.frame2, text = 'Annuler',
+ command = self.annule_modifs_valeur)
+ for but in (bouton_accepter,bouton_annuler):
+ but.pack(side='left',padx=5)
+
+ # création des objets dans les frames
+ liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+ ("<Button-3>",self.deselectValeur),
+ ("<Double-Button-1>",self.sup_valeur_sans_into))
+ self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,
+ liste_commandes = liste_commandes_valeurs,
+ titre="Valeur(s) non-prédéfinies(s)",
+ fonte_titre=None
+ )
+
+ for fram in (self.frame1,self.frame2,self.frame_bas,self.frame_haut,self.frame_valeurs,
+ self.frame_fleches,self.frame_choix):
+ fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide: s.parent.appli.affiche_aide(e,a))
+ fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+ self.Liste_valeurs.affiche_liste()
+ if len(l_valeurs) > 0 :
+ liste_marque=l_valeurs[-1]
+ self.Liste_valeurs.surligne(liste_marque)
+
+ def get_aide(self):
+ """
+ Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
+ saisies par l'utilisateur
+ """
+ commentaire="Ce motclef accepte soit un nom de liste déja définie soit une liste manuelle de valeurs"
+ return commentaire
+
+ def get_aide2(self):
+ min,max = self.node.item.GetMinMax()
+ aideval=self.node.item.aide()
+ commentaire="min : " + str(min) + ", max : " + str(max)
+ aideval=commentaire + aideval
+ return aideval
+
+ def choose_valeur_from_list(self,command):
+ """
+ Affecte à valeur choisie la sélection courante dans la liste des choix proposés
+ Exécute command
+ """
+ self.Liste_valeurs.liste=[]
+ self.Liste_valeurs.affiche_liste()
+ if len(self.listbox.get()) == 0 : return
+ choix = self.listbox.getcurselection()[0]
+ d={}
+ d["valeurentree"]=choix
+ apply(command,(self,),d)
+
+
+
+ def tri(self,liste_noms_sd):
+ a=(3+8j)
+ d_types = { 'TXM' : type('A'),
+ 'R' : type(3.),
+ 'I' : type(0),
+ 'C' : type(a)}
+
+ # On enleve seulement ceux qu'on peut
+ # Sur certaines listes, il est possible qu'on ne
+ # sache pas déterminer le type
+ listefinale=[]
+ typespossibles=self.node.item.object.definition.type
+ typecherche = None
+ for t in typespossibles:
+ if t in d_types.keys() :
+ typecherche = d_types[t]
+ break
+ for liste in liste_noms_sd:
+ valeur,validite=self.node.item.eval_valeur(liste)
+ for mc in valeur.etape.mc_liste :
+ try :
+ if type(mc.valeur) in (types.ListType,types.TupleType) :
+ typeliste=type(mc.valeur[0])
+ else :
+ typeliste=type(mc.valeur)
+ if type(mc.valeur[0]) == typecherche:
+ listefinale.append(liste)
+ except:
+ listefinale.append(liste)
+ return listefinale
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from plusieurspanel import PLUSIEURS_Panel
+
+class PLUSIEURS_INTO_Panel(PLUSIEURS_Panel):
+ """
+ Classe servant à définir le panneau permettant d'afficher et de saisir une
+ liste de valeurs à choisir parmi une liste discrètes de valeurs possibles
+ """
+ def makeValeurPage(self,page):
+ """
+ Génère la page de saisie de plusieurs valeurs parmi un ensemble discret
+ de possibles
+ """
+ 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
+ aide = self.get_aide()
+ aide = justify_text(texte=aide)
+ bulle_aide=self.get_bulle_aide()
+ objet_mc = self.node.item.get_definition()
+ min,max = self.node.item.GetMinMax()
+ #l_choix=list(objet_mc.into)
+ l_valeurs = self.node.item.GetListeValeurs()
+ l_choix= self.node.item.get_liste_possible(l_valeurs)
+ # reinitialisation de l_valeurs
+ l_valeurs = self.node.item.GetListeValeurs()
+
+ # remplissage du panneau
+ self.frame_valeurs = Frame(page)
+ self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
+ self.frame_boutons_fleches = Frame(page)
+ self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
+ self.frame_choix = Frame(page)
+ self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
+ self.frame_boutons = Frame(page)
+ self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=1,relheight=0.1)
+ self.frame_aide = Frame(page)
+ self.frame_aide.place(relx=0.1,rely=0.75,relwidth=1,relheight=0.15)
+ liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+ ("<Button-3>",self.deselectValeur),
+ ("<Double-Button-1>",self.sup_valeur))
+ liste_commandes_choix = (("<Button-1>",self.selectChoix),
+ ("<Button-3>",self.deselectChoix),
+ ("<Double-Button-1>",self.add_choix))
+ self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,
+ l_valeurs,liste_commandes = liste_commandes_valeurs,
+ titre="Valeur(s) actuelle(s)")
+ self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,
+ liste_commandes = liste_commandes_choix,
+ titre= "Valeurs possibles")
+ self.bouton_add = Button(self.frame_boutons_fleches,
+ #text="<--",
+ image = images.get_image('arrow_left'),
+ command = self.add_choix)
+ self.bouton_sup = Button(self.frame_boutons_fleches,
+ #text="-->",
+ image = images.get_image('arrow_right'),
+ command = self.sup_valeur)
+ self.bouton_accepter = Button(self.frame_boutons,
+ text='Valider',
+ command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
+ self.bouton_annuler = Button(self.frame_boutons,
+ text = 'Annuler',
+ command = self.annule_modifs_valeur)
+ self.bouton_add.place(relx=0.3,rely=0.35)
+ self.bouton_sup.place(relx=0.3,rely=0.65)
+ for but in (self.bouton_accepter,self.bouton_annuler):
+ but.pack(side='left',padx=3)
+ self.Liste_valeurs.affiche_liste()
+ if len(l_valeurs) > 0 :
+ liste_marque=l_valeurs[-1]
+ self.Liste_valeurs.surligne(liste_marque)
+ self.selectValeur(l_valeurs[-1])
+ self.Liste_choix.affiche_liste()
+ for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
+ fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+ self.frame_aide.update()
+ self.aide = Label(self.frame_aide,
+ text = aide,
+ justify='center',
+ anchor='center')
+ #wraplength=int(self.frame_aide.winfo_width()*0.8))
+ self.aide.place(relx=0.3,rely=0.5,anchor='center',relwidth=1)
+
+ def get_aide(self):
+ """
+ Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
+ que saisit l'utilisateur
+ """
+ commentaire=""
+ mc = self.node.item.get_definition()
+ d_aides = { 'TXM' : 'chaînes de caractères',
+ 'R' : 'réels',
+ 'I' : 'entiers',
+ 'C' : 'complexes'}
+ type = mc.type[0]
+ if not d_aides.has_key(type) :
+ if mc.min == mc.max:
+ return str(mc.min)+" valeur(s) est(sont) attendue(s)"
+ else :
+ return "entrez entre "+str(mc.min)+" et "+str(mc.max)+" valeurs"
+ if mc.min == mc.max:
+ commentaire="Une liste de "+str(mc.min)+" "+d_aides[type]+" est attendue"
+ else :
+ commentaire="Entre "+str(mc.min)+" et "+str(mc.max)+" valeurs de type "+d_aides[type]+" sont attendues"
+ aideval=self.node.item.aide()
+ commentaire=commentaire + "\n" + aideval
+ return commentaire
+
+ def get_bulle_aide(self):
+ """
+ Retourne la bulle d'aide du panneau (affichée par clic droit)
+ """
+ return """Un clic sur une valeur des deux listes la sélectionne.
+ - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
+ dans la liste des valeurs que vous voulez affecter au mot-clé simple
+ - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
+ sélectionnée (elle apparaît alors à nouveau comme choix possible
+ dans la liste des choix à droite)
+ - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
+ au mot-clé simple courant
+ - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
+ avant toute modification depuis le dernier 'Valider'"""
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from newsimppanel import newSIMPPanel
+
+
+class PLUSIEURS_Panel(newSIMPPanel):
+ """
+ Classe virtuelle servant de classe mère à toutes celles définissant
+ un panneau pour un mot-clé simple qui attend une liste de valeurs
+ """
+ def accepte_modifs_valeur(self,min,max,liste=None):
+ """
+ Méthode qui récupère la liste des valeurs donnée par l'utilisateur
+ et l'affecte au mot-clé courant.
+ le parametre None n'est pas rempli sauf par l appel a partir de fonctionpanel
+ """
+ if liste==None:
+ l1_valeurs = self.Liste_valeurs.get_liste()
+ else:
+ l1_valeurs = liste
+
+ #nettoyage de la liste
+ l_valeurs=[]
+ for val in l1_valeurs :
+ if val != '' and val != None :
+ l_valeurs.append(val)
+
+ longueur = len(l_valeurs)
+ if longueur < min or longueur > max :
+ self.parent.appli.affiche_infos("Valeur refusée : nombre d'éléments incorrect dans la liste")
+ return
+ if longueur > 1:
+ valeur = tuple(l_valeurs)
+ elif longueur == 1:
+ valeur = l_valeurs[0]
+ else:
+ valeur = None
+
+ self.parent.appli.affiche_infos("Valeur acceptée")
+ self.record_valeur(valeur)
+ # 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
+ if self.ajout_valeurs:
+ self.ajout_valeurs.quit()
+
+ def add_valeur_sans_into(self,name=None,encorevalide=1):
+ """
+ Tente d'ajouter la valeur fournie (name) à la liste courante :
+ - si la valeur est acceptable, elle est ajoutée dans la liste des valeurs
+ - sinon elle est refusée
+
+ encorevalide peut prendre les valeurs suivantes :
+
+ - valeur 1 si le validateur trouve l item et la liste correctes
+ - valeur 0 si le validateur trouve la valeur de l item incorrecte
+ - valeur -1 si le validateur trouve la liste incorrecte
+ """
+ valeur = name
+ commentaire="Valeur incorrecte : ajout à la liste refusé"
+ testvalide=1
+
+ # Pas de traitement des valeurs nulles ( a priori clic involontaire
+ if (valeur == None or valeur =="") :
+ commentaire = "Pas de saisie des valeurs nulles"
+ encorevalide = -2
+ testtype=0
+ else :
+ testtype,comment = self.node.item.object.verif_type(valeur)
+ if not testtype :
+ commentaire =comment
+ encorevalide=-2
+
+ if (encorevalide ==0) :
+ commentaire=self.node.item.info_erreur_item()
+ if (encorevalide == -1) :
+ commentaire=self.node.item.info_erreur_liste()
+ # On traite le cas ou la liste n est pas valide pour un pb de cardinalite
+ min,max = self.node.item.GetMinMax()
+ if len(self.Liste_valeurs.get_liste()) >= max :
+ commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
+
+ if testvalide and (encorevalide == 1):
+ min,max = self.node.item.GetMinMax()
+
+ if testtype :
+ liste_valeurs = self.Liste_valeurs.get_liste()
+ if len(liste_valeurs) >= max :
+ commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
+ else :
+ if (self.Liste_valeurs.selection != None):
+ ligne=self.Liste_valeurs.cherche_selected_item()
+ liste_valeurs.insert(ligne,valeur)
+ else :
+ liste_valeurs.append(valeur)
+ try :
+ self.set_valeur_texte(str(self.entry.get()))
+ except :
+ pass
+ self.Liste_valeurs.put_liste(liste_valeurs)
+ self.erase_valeur()
+ commentaire="Nouvelle valeur acceptée"
+ else :
+ commentaire ="Type de la valeur incorrecte"
+
+ self.parent.appli.affiche_infos(commentaire)
+
+ def sup_valeur_sans_into(self,name=None):
+ """
+ Méthode qui sert à retirer de la liste des valeurs la valeur sélectionnée
+ """
+ try:
+ self.Liste_valeurs.remove_selected_item()
+ self.display_valeur(self.selected_valeur)
+ self.selected_valeur = None
+ except:
+ # la valeur sélectionnée n'est pas dans la liste
+ return
+
+ def display_valeur(self,val=None):
+ """
+ Affiche la valeur passée en argument dans l'entry de saisie.
+ Par défaut affiche la valeur du mot-clé simple
+ """
+ if not val :
+ #valeur = self.node.item.getval()
+ valeur = self.node.item.object.getval()
+ else:
+ valeur = val
+ self.entry.delete(0,END)
+ if not valeur : return
+ self.entry.insert(0,str(valeur))
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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.
+#
+#
+# ======================================================================
+
+
+labels= ('Fichier','Edition','Jeu de commandes',
+ 'Options',
+ 'Aide',
+ 'Traduction',
+ )
+
+appli_composants=['readercata','bureau',
+ 'options',
+ ]
+
+menu_defs={ 'bureau': [
+ ('Fichier',[
+ ('Nouveau','newJDC','<Control-n>','Ctrl+N'),
+ ('Nouvel INCLUDE','newJDC_include'),
+ ('Ouvrir','openJDC','<Control-o>','Ctrl+O'),
+ ('Enregistrer','saveJDC','<Control-s>','Ctrl+S'),
+ ('Enregistrer sous','saveasJDC','<Control-e>','Ctrl+E'),
+ None,
+ ('Fermer','closeJDC','<Control-w>','Ctrl+W'),
+ ('Quitter','exitEFICAS','<Control-q>','Ctrl+Q'),
+ ]
+ ),
+ ('Edition',[
+ ('Copier','copy','<Control-c>','Ctrl+C'),
+ ('Couper','cut','<Control-x>','Ctrl+X'),
+ ('Coller','paste','<Control-v>','Ctrl+V'),
+ ]
+ ),
+ ('Jeu de commandes',[
+ ('Rapport de validation','visuCRJDC','<Control-r>','Ctrl+R'),
+ ('Fichier source','visu_txt_brut_JDC','<Control-b>','Ctrl+B'),
+ #('Paramètres Eficas','affichage_fichier_ini'),
+ ]
+ ),
+ ('Traduction',[
+ ('Traduction v7 en v8','TraduitFichier','<Control-t>','Ctrl+T'),
+ ]
+ ),
+ ('Aide',[
+ ('Aide EFICAS','aideEFICAS','<Control-a>','Ctrl+A'),
+ ]
+ ),
+ ]
+ }
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+import Pmw
+import re
+
+# Modules Eficas
+from Editeur import analyse_catalogue
+from Editeur import autre_analyse_cata
+from Editeur import uiinfo
+from Noyau.N_CR import CR
+from InterfaceTK.widgets import showinfo,showerror
+from InterfaceTK.widgets import Fenetre
+from InterfaceTK import fontes
+
+from utils import init_rep_cata_dev
+
+
+class READERCATA:
+
+ menu_defs=[
+ ('Catalogue',[
+ ("Rapport de validation catalogue",'visuCRCATA'),
+ ]
+ )
+ ]
+
+ button_defs=[]
+
+ def __init__(self,appli,parent):
+ self.appli=appli
+ self.parent=parent
+ self.code=self.appli.code
+ self.appli.format_fichier.set('python')
+ self.version_code=self.appli.version_code
+ self.fic_cata=None
+ self.version_cata=None
+ self.OpenCata()
+ self.cataitem=None
+
+ def OpenCata(self):
+ """
+ Ouvre le catalogue standard du code courant, cad le catalogue présent
+ dans le répertoire Cata
+ """
+ if self.appli.ihm == "TK" :
+ from InterfaceTK import splash
+ message1 = "Compilation des fichiers Eficas \n\n Veuillez patienter ..."
+ if self.appli.test == 0 and self.appli.ihm=="TK" :
+ splash._splash.configure(text = message1)
+ self.configure_barre(4)
+
+ liste_cata_possibles=[]
+ for catalogue in self.appli.CONFIGURATION.catalogues:
+ if catalogue[0] == self.code :
+ liste_cata_possibles.append(catalogue)
+
+ if len(liste_cata_possibles)==0:
+ showerror("Import du catalogue","Pas de catalogue defini pour le code %s" % self.code)
+ self.appli.quit()
+ sys.exit(1)
+
+ if self.version_code is not None:
+ # La version a ete fixee
+ for cata in liste_cata_possibles:
+ if self.version_code == cata[1]:
+ self.fic_cata = cata[2]
+ self.appli.format_fichier.set(cata[3])
+ elif len(liste_cata_possibles)==1:
+ self.fic_cata = liste_cata_possibles[0][2]
+ self.code = self.appli.CONFIGURATION.catalogues[0][0]
+ self.version_code = liste_cata_possibles[0][1]
+ self.appli.format_fichier.set(liste_cata_possibles[0][3])
+ else:
+ # plusieurs catalogues sont disponibles : il faut demander à l'utilisateur
+ # lequel il veut utiliser ...
+ self.ask_choix_catalogue()
+
+ if self.fic_cata == None :
+ print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
+ sys.exit(0)
+
+ # Determinination du repertoire materiau
+ v_codeSansPoint=self.version_code
+ v_codeSansPoint=re.sub("\.","",v_codeSansPoint)
+ chaine="rep_mat_"+v_codeSansPoint
+ if hasattr(self.appli.CONFIGURATION,chaine):
+ a=getattr(self.appli.CONFIGURATION,chaine)
+ else :
+ try :
+ a=self.appli.CONFIGURATION.dRepMat[self.version_code]
+ except :
+ print "Probleme avec le repertoire materiau"
+ a='.'
+ self.appli.CONFIGURATION.rep_mat=a
+
+ # 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'
+
+ # import du catalogue
+ if self.appli.test == 0 and self.appli.ihm=="TK" :
+ splash._splash.configure(text = "Debut import_cata: %d s" % time.clock())
+ self.cata = self.import_cata(self.fic_cata)
+ self.update_barre()
+ if self.appli.test == 0 and self.appli.ihm=="TK" :
+ splash._splash.configure(text = "Fin import_cata: %d s" % time.clock())
+ if not self.cata :
+ showerror("Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
+ self.appli.quit()
+ sys.exit(1)
+ #
+ # analyse du catalogue (ordre des mots-clés)
+ #
+ if self.appli.test == 0 and self.appli.ihm=="TK" :
+ splash._splash.configure(text = "Debut Retrouve_Ordre: %d s" % 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()
+ self.update_barre()
+ if self.appli.test == 0 and self.appli.ihm=="TK" :
+ splash._splash.configure(text = "Fin Retrouve_Ordre: %d s" % time.clock())
+ #
+ # analyse des données liées à l'IHM : UIinfo
+ #
+ uiinfo.traite_UIinfo(self.cata)
+ self.update_barre()
+
+ #
+ # traitement des clefs documentaires
+ #
+ self.traite_clefs_documentaires()
+
+ # 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')
+ if os.path.isfile(fic_cata_dev):
+ # il y a bien un catalogue développeur : il faut récupérer le module_object associé ...
+ test = self.compile_cata(fic_cata_dev,fic_cata_dev+'c')
+ if not test :
+ showinfo("Compilation catalogue développeur",
+ "Erreur dans la compilation du catalogue développeur")
+ self.cata = (self.cata,)
+ else:
+ self.cata_dev =self.import_cata(fic_cata_dev)
+ #self.Retrouve_Ordre_Cata_Developpeur()
+ self.Retrouve_Ordre_Cata_Developpeur_autre()
+ self.cata = (self.cata,self.cata_dev)
+ else:
+ self.cata = (self.cata,)
+ else:
+ self.cata = (self.cata,)
+ titreSuite=" avec le catalogue " + os.path.basename(self.fic_cata)
+ titre=self.appli.titre+titreSuite
+ if self.appli.top:
+ self.appli.top.title(titre)
+ self.appli.titre=titre
+
+
+ def import_cata(self,cata):
+ """
+ Réalise l'import du catalogue dont le chemin d'accès est donné par cata
+ """
+ if self.appli.test == 0 and self.appli.ihm=="TK" :
+ from InterfaceTK import splash
+ splash._splash.configure(text = "Chargement du catalogue")
+ nom_cata = os.path.splitext(os.path.basename(cata))[0]
+ rep_cata = os.path.dirname(cata)
+ sys.path[:0] = [rep_cata]
+ try :
+ o=__import__(nom_cata)
+ return o
+ except Exception,e:
+ 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,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
+
+ def Retrouve_Ordre_Cata_Standard(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
+ """
+ time1 = os.path.getmtime(self.fic_cata)
+ try :
+ time2 = os.path.getmtime(self.fic_cata_p)
+ except:
+ time2 = 0
+ if time2 > time1 :
+ # l'objet catalogue n'a pas été modifié depuis le dernier "pickle"
+ self.Get_Ordre_Cata()
+ else :
+ # le catalogue a été modifié depuis le dernier "pickle" :
+ # il faut retrouver l'ordre du catalogue et refaire pickle
+ 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
+ if self.appli.test == 0 and self.appli.ihm=="TK" :
+ 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
+ if self.appli.test == 0 and self.appli.ihm=="TK":
+ splash._splash.configure(text = message,barre='oui')
+ cata_dev_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
+ 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 :
+ - mode='pickle ': tente de relire le fichier pickle et sinon lance l'analyse du catalogue
+ - mode='cata' : force l'analyse du catalogue directement sans relire le pickle
+ """
+ if mode == 'pickle' :
+ try:
+ f = open(self.fic_cata_p)
+ u = cPickle.Unpickler(f)
+ if self.appli.test == 0 and self.appli.ihm=="TK" :
+ splash._splash.configure(text = "Analyse du catalogue")
+ self.cata_ordonne_dico = u.load()
+ f.close()
+ except :
+ # on peut ne pas arriver à relire le fichier pickle s'il a été altéré
+ # ou (le plus probable) s'il a été créé sous un autre OS
+ self.Get_Ordre_Cata(mode='cata')
+ elif mode == 'cata':
+ if self.appli.test == 0 and self.appli.ihm=="TK" :
+ 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.entites
+ splash._splash.configure(text = "Sauvegarde des informations sur le catalogue")
+ f = open(self.fic_cata_p,'w+')
+ p = cPickle.Pickler(f)
+ p.dump(self.cata_ordonne_dico)
+ f.close()
+ else :
+ raise Exception("Appel à un mode inconnu de Get_Ordre_Cata : %s" % mode)
+ return
+
+ def ask_choix_catalogue(self):
+ """
+ Ouvre une fenêtre de sélection du catalogue dans le cas où plusieurs
+ ont été définis dans Accas/editeur.ini
+ """
+ # construction du dictionnaire et de la liste des catalogues
+ self.dico_catalogues = {}
+ defaut = None
+ for catalogue in self.appli.CONFIGURATION.catalogues:
+ if catalogue[0] == self.code :
+ self.dico_catalogues[catalogue[1]] = catalogue
+ if len(catalogue) == 5 :
+ if catalogue[4]=='defaut' : defaut = catalogue[1]
+ liste_choix = self.dico_catalogues.keys()
+ liste_choix.sort()
+ # test si plusieurs catalogues ou non
+ if len(liste_choix) == 0:
+ showerror("Aucun catalogue déclaré pour %s" %self.code)
+ self.appli.quit()
+ sys.exit(1)
+ elif len(liste_choix) == 1:
+ self.fic_cata = self.dico_catalogues[liste_choix[0]][2]
+ self.version_code = liste_choix[0]
+ return
+ # création d'une boîte de dialogue modale
+ from InterfaceTK import splash
+ self.fenetre_choix_cata = Pmw.Dialog(splash._splash, #avec self.parent, ne marche pas sous Windows
+ buttons=('OK','ANNULER'),
+ defaultbutton = 'OK',
+ title = "Choix d'une version du code %s" %self.code,
+ command = self.chooseCata)
+ # construction des radioboutons
+ label = `len(liste_choix)`+' versions du code %s sont disponibles\n' %self.code
+ label = label + 'Veuillez choisir celle avec laquelle vous souhaitez travailler :'
+ self.radiobutton = Pmw.RadioSelect(self.fenetre_choix_cata.interior(),
+ buttontype='radiobutton',
+ labelpos = 'w',
+ label_text = label,
+ label_font = fontes.standard,
+ orient='vertical')
+ for choix in liste_choix :
+ self.radiobutton.add(choix)
+ if defaut == None :
+ # aucun catalogue par défaut n'a été spécifié dans Accas/editeur.ini
+ defaut = liste_choix[0]
+ self.radiobutton.invoke(defaut)
+ self.radiobutton.pack(fill='x',padx=10,pady=10)
+ # centrage de la fenêtre
+ self.fenetre_choix_cata.activate(geometry='centerscreenalways')
+
+ def chooseCata(self,txt):
+ """
+ Méthode activée lorsque l'utilisateur a fait son choix et cliqué sur 'OK' ou sur 'ANNULER'
+ """
+ if txt == 'OK' :
+ version_cata = self.radiobutton.getcurselection()
+ self.fic_cata = self.dico_catalogues[version_cata][2]
+ self.version_code = version_cata
+ self.appli.format_fichier.set(self.dico_catalogues[version_cata][3])
+ self.fenetre_choix_cata.destroy()
+ else:
+ self.parent.destroy()
+
+ def compile_cata(self,cata,catac):
+ """
+ Teste si le catalogue a bien besoin d'être recompilé et si oui, le compile et
+ affiche un message dans le splash . Retourne 1 si la compilation s'est bien déroulée,
+ 0 sinon.
+ """
+ time1 = os.path.getmtime(cata)
+ try:
+ time2 = os.path.getmtime(catac)
+ except:
+ time2 = 0
+ if time1 > time2:
+ try:
+ # le catalogue doit être recompilé avant d'être importé
+ if self.appli.test == 0 and self.appli.ihm=="TK" :
+ splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
+ py_compile.compile(cata)
+ except:
+ return 0
+ return 1
+
+
+#--------------------------------------------------------------------------------
+# Méthodes concernant la barre de progression lors de l'analyse du catalogue
+#--------------------------------------------------------------------------------
+
+ def configure_barre(self,nbcommandes):
+ """ Configure la barre de progression en lui passant comme paramètre le
+ nombre de commandes du catalogue qui lui sert à déterminer la longueur de son incrément """
+ try:
+ if self.appli.test == 0 and self.appli.ihm=="TK" :
+ splash._splash.configure(barre='oui',ratio = nbcommandes)
+ except:
+ pass
+
+ def update_barre(self):
+ """ Update la position de la barre de progression : la fait progresser de son incrément """
+ try:
+ if self.appli.test == 0 and self.appli.ihm=="TK" :
+ splash._splash.update_barre()
+ except:
+ pass
+
+ def visuCRCATA(self):
+ """
+ Méthode permettant l'affichage du rapport de validation
+ """
+ cr = CR( debut = "Début rapport de validation du catalogue",
+ fin = "Fin rapport de validation du catalogue")
+ titre="rapport de validation du catalogue"
+ if hasattr(self,'cata_ordonne_cr') :
+ cr.add(self.cata_ordonne_cr)
+ if hasattr(self,'cata_dev_ordonne_cr') :
+ cr.add(self.cata_dev_ordonne_cr)
+ for cata in self.cata:
+ if hasattr(cata,'JdC'):
+ cr.add(cata.JdC.report())
+ texte_cr = str(cr)
+ self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
+
+
+ def traite_clefs_documentaires(self):
+ try:
+ self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
+ f=open(self.fic_cata_clef)
+ except:
+ #print "Pas de fichier associé contenant des clefs documentaires"
+ return
+
+ dict_clef_docu={}
+ for l in f.readlines():
+ clef=l.split(':')[0]
+ docu=l.split(':')[1]
+ docu=docu[0:-1]
+ dict_clef_docu[clef]=docu
+ for oper in self.cata.JdC.commandes:
+ if dict_clef_docu.has_key(oper.nom):
+ oper.docu=dict_clef_docu[oper.nom]
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+#import prefs
+#import panels
+#import images
+#from widgets import ListeChoix
+#from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+from newsimppanel import newSIMPPanel
+
+
+class SHELLPanel(newSIMPPanel):
+ """
+ Classe Panel utilisé pour les mots-clés simples qui attendent un shell pour valeur
+ """
+
+ def makeValeurPage(self,page):
+ """
+ Affiche la page concernant l'objet pointé par self qui attend un shell
+ """
+ objet_mc = self.node.item.get_definition()
+ aide = self.gen_aide()
+ aide = justify_text(texte=aide)
+ self.frame = Frame(page)
+ self.frame.place(relx=0,rely=0,relwidth=1,relheight=1)
+ label_aide = Label(self.frame,text = aide)
+ label_aide.place(relx=0.5,rely=0.1,anchor='center')
+ self.text = Text(self.frame,bg='gray95')
+ self.text.place(relx=0.2,rely=0.2,relwidth=0.6,relheight=0.6)
+ but_val = Button(self.frame,text='Valider',command = self.valide_shell)
+ but_ann = Button(self.frame,text='Annuler',command = self.annule_shell)
+ but_val.place(relx=0.35,rely=0.9,anchor='center')
+ but_ann.place(relx=0.65,rely=0.9,anchor='center')
+ self.display_valeur()
+
+ def gen_aide(self):
+ """
+ Retourne une chaîne de caractères d'aide sur la valeur qu'attend l'objet
+ pointé par self
+ """
+ return "Un shell est attendu"
+
+ def valide_shell(self,event=None):
+ """
+ Récupère la valeur saisie par l'utilisateur dans self.text
+ et la stocke dans l'objet MCSIMP courant
+ """
+ texte = self.text.get(1.0,END)
+ self.record_valeur(texte)
+
+ def annule_shell(self,event=None):
+ """
+ Annule toute saisie dans self.text
+ """
+ self.text.delete(0,END)
+
+ def display_valeur(self,val=None):
+ """
+ Affiche la valeur de l'objet pointé par self
+ """
+ if val != None :
+ valeur = val
+ else:
+ valeur = self.node.item.get_valeur()
+ if valeur == None or valeur == '': return
+ self.text.insert(END,valeur)
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+"""
+from Tkinter import *
+
+from centerwindow import centerwindow
+from Tools.foztools.foztools import Slider
+from InterfaceTK import fontes
+import images
+
+_splash=None
+
+def init_splash(*pos,**args):
+ global _splash
+ _splash=SplashScreen(*pos,**args)
+
+def fini_splash():
+ global _splash
+ _splash.quit()
+ _splash=None
+
+class SplashScreen(Toplevel):
+ """
+ Provides a splash screen. Usage:
+ Subclass and override 'CreateWidgets()'
+ In constructor of main window/application call
+ - S = SplashScreen(main=self) (if caller is Toplevel)
+ - S = SplashScreen(main=self.master) (if caller is Frame)
+ - S.quit() after you are done creating your widgets etc.
+ """
+ def __init__(self, master=None,**args):
+ Toplevel.__init__(self, master, relief='groove',
+ borderwidth=5)
+ self.main = master
+ if self.main != None :
+ self.main.iconify()
+ self.withdraw()
+ self.frame = Frame(self)
+ self.frame.pack(expand=1,fill='both')
+ self.init(args)
+ self.geometry("300x200")
+ self.resizable(0,0)
+ centerwindow(self)
+ self.CreateWidgets()
+ self.deiconify()
+
+ def init(self,args={}):
+ self.text = StringVar()
+ self.text.set('')
+ self.text2 = StringVar()
+ self.text2.set('')
+ self.icone = 'logo_edf.gif'
+ self.barre = 'non'
+ if args == {} : return
+ if args.has_key('text'):
+ self.text.set(args['text'])
+ if args.has_key('info'):
+ self.text2.set(args['info'])
+ if args.has_key('titre'):
+ self.title(args['titre'])
+ if args.has_key('code'):
+ self.code = args['code']
+ else:
+ self.code = 'inconnu'
+ if args.has_key('icone'):
+ self.icone = args['icone']
+ if self.code == 'ASTER' :
+ self.icone = 'code_aster.gif'
+ elif self.code == 'SATURNE':
+ self.icone = 'code_saturne.gif'
+ elif self.code == 'DESCARTES':
+ self.icone = 'code_descartes.gif'
+
+ def CreateWidgets(self):
+ self.catIcon = images.get_image(self.icone)
+ self.label = Label(self.frame, image=self.catIcon)
+ self.label.pack(side=TOP)
+ self.label = Label(self.frame, textvariable=self.text,font = fontes.standard_gras)
+ self.label.pack(side=TOP,expand=1,fill='both')
+ self.label2 = Label(self.frame, textvariable=self.text2,font = fontes.standard_italique)
+ self.label2.pack(side=TOP,expand=1,fill='both')
+ self.progress = Slider(self.frame,value=0,max=100,orientation='horizontal',
+ fillColor='#00008b',width=200,height=30,
+ background='white',labelColor='red')
+ centerwindow(self)
+
+ def update_barre(self,event=None):
+ """ Permet de faire avancer la barre de progression """
+ try:
+ self.progress.value = self.progress.value+self.increment
+ self.progress.update()
+ except:
+ pass
+
+ def configure_barre(self):
+ """
+ Calcule l'incrément de progression de la barre en fonction
+ du nombre d'opérations à effectuer afin que le compteur
+ soit à 100% à la fin des opérations
+ """
+ self.increment = 100./self.ratio
+ self.progress.update()
+
+ def configure(self,**args):
+ if args.has_key('text'):
+ self.text.set(args['text'])
+ if args.has_key('info'):
+ self.text2.set(args['info'])
+ if args.has_key('titre'):
+ self.title(args['titre'])
+ if args.has_key('barre'):
+ old = self.barre
+ self.barre = args['barre']
+ if self.barre == 'oui' and old == 'non':
+ self.progress.frame.pack(in_=self.frame,side='top')
+ elif self.barre == 'non' and old == 'oui':
+ self.progress.frame.pack_forget()
+ if args.has_key('ratio'):
+ self.ratio = args['ratio']
+ self.configure_barre()
+ self.update()
+
+ def quit(self):
+ self.progress = None
+ self.destroy()
+ if self.main:
+ centerwindow(self.main,parent='sans')
+ self.main.deiconify()
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 Tkinter
+import types
+
+class STATUSBAR:
+ def __init__(self,parent,police):
+ self.parent=parent
+ self.police=police
+ self.frame = Tkinter.Frame(parent,bd=1, relief=Tkinter.RAISED)
+ self.frame.pack(side=Tkinter.BOTTOM, fill=Tkinter.X)
+ self.label = Tkinter.Label (self.frame,
+ fg='black',
+ text='',
+ justify='left',
+ relief='sunken',
+ height=3,
+ bg='gray95')
+ self.label.pack(side='left',expand=1,fill='both')
+
+ def affiche_infos(self,texte):
+ if len(texte)>150 :
+ texte_infos=texte[0:150]
+ else :
+ texte_infos=texte
+ self.label.configure(text=texte_infos,font=self.police)
+
+ def reset_affichage_infos(self):
+ """ Efface tout message présent dans le panneau en bas d'EFICAS """
+ self.affiche_infos('')
+
--- /dev/null
+# -*- coding: utf-8 -*-
+import os
+from Aster import prefs
+import basestyle
+from basestyle import STYLE,style
+
+inistylefile=os.path.join(prefs.REPINI,"style.py")
+if os.path.isfile(inistylefile):
+ execfile(inistylefile)
+
+userstylefile=os.path.expanduser("~/Eficas_install/style.py")
+if os.path.isfile(userstylefile):
+ execfile(userstylefile)
+
+from InterfaceTK import fontes
+for attr in dir(style):
+ if attr[0]=='_':continue
+ if not hasattr(fontes,attr):continue
+ setattr(fontes,attr,getattr(style,attr))
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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
+from Tkinter import *
+import Pmw
+
+# Modules Eficas
+import images
+
+class TOOLBAR:
+ def __init__(self,appli,parent):
+ # parent représente l'objet graphique parent
+ self.parent=parent
+ # appli représente l'objet application parent
+ self.appli=appli
+ self.balloon = None
+ self.l_boutons_a_activer = []
+ self.barreboutons=Frame(self.parent,relief='ridge',bd=2)
+ self.barreboutons.pack(anchor='nw',expand=0,fill=X)
+ # bouton Infos à l'extrême droite de la barre des boutons
+ b = Button(self.barreboutons,
+ image = images.get_image('About24'),
+ command = self.view_infos)
+ b.pack(side='right')
+ texte = "Infos EFICAS"
+ b.bind("<Enter>",lambda e,s=self,but=b,t=texte : s.affiche_balloon(e,but,t,pos='right'))
+ b.bind("<Leave>", self.efface_balloon)
+
+ def appelle_commande(self,e,b,c):
+ try :
+ c()
+ except :
+ pass
+
+ def inactive_boutons(self):
+ """
+ Inactive les boutons de la liste self.l_boutons_a_activer
+ --> cette méthode est appelée dès qu'il n'y a pas de JDC courant
+ """
+ for but in self.l_boutons_a_activer:
+ but.configure(state='disabled')
+
+ def active_boutons(self):
+ """
+ Active les boutons de la liste self.l_boutons_a_activer
+ --> cette méthode est appelée dès qu'il y a un JDC courant
+ """
+ for but in self.l_boutons_a_activer:
+ but.configure(state='normal')
+
+ def affiche_balloon(self,event,bouton,bulle,pos='left'):
+ """
+ Affiche le balloon bulle associé au bouton bouton
+ """
+ etat = bouton.cget('state')
+ if etat != 'normal' : return
+ geom = bouton.winfo_geometry()
+ l_args = string.split(geom,'+')
+ x = eval(l_args[1])+event.x+10
+ self.balloon = Label(self.parent,
+ text = bulle,
+ background="yellow",
+ borderwidth=2,
+ relief='ridge')
+ if pos == 'left':
+ self.balloon.place(in_=self.parent,x=x,y=32)
+ else:
+ self.balloon.place(in_=self.parent,x=x,y=32,anchor='ne')
+
+ def efface_balloon(self,event=None):
+ """
+ Efface le balloon courant
+ """
+ if self.balloon :
+ self.balloon.destroy()
+ self.balloon = None
+
+ def view_infos(self):
+ """
+ Permet d'afficher des infos sur la session courante d'EFICAS
+ """
+ self.fen_infos = Pmw.Dialog(self.parent,
+ title = 'Informations session EFICAS',
+ buttons = ('Fermer',),
+ command = self.close_infos)
+ self.fen_infos.withdraw()
+ texte_infos = self.appli.get_texte_infos()
+ Label(self.fen_infos.interior(),
+ text = texte_infos,
+ anchor='center').pack(side='top',anchor='center')
+ self.fen_infos.activate(geometry = 'centerscreenalways')
+
+ def close_infos(self,lbl):
+ """
+ Ferme la fenêtre des infos
+ """
+ self.fen_infos.destroy()
+
+ 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)
+ Button(self.barreboutons,
+ image = images.get_image('Sep'),
+ state='disabled',
+ relief = 'flat').pack(side='left')
+ continue
+ nom_fic,commande,texte,statut = bouton
+ commande=getattr(appli_composant,commande)
+ b = Button(self.barreboutons,
+ image = images.get_image(nom_fic),
+ command = commande,
+ relief='flat')
+ b.pack(side='left')
+ b.bind("<Enter>",lambda e,s=self,but=b,t=texte : s.affiche_balloon(e,but,t))
+ b.bind("<Leave>", self.efface_balloon)
+ b.bind("<Return>", lambda e,s=self,but=b,c=commande:s.appelle_commande(e,but,c))
+ if statut != 'always':
+ self.l_boutons_a_activer.append(b)
+
+ # inactive les boutons qui doivent l'être tant qu'aucun JDC courant
+ self.inactive_boutons()
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,text=None):
+ self.widget=widget
+ self.text = text
+ self.timer = None
+ self.tooltip = None
+ self.label = None
+ self.bindings = []
+ self.bindings.append(self.widget.bind("<Enter>", self._enter))
+ self.bindings.append(self.widget.bind("<Leave>", self._leave))
+ self.bindings.append(self.widget.bind("<ButtonPress>", self._leave))
+ # user overrideable settings
+ self.time = 1000 # milliseconds
+ self.relief = Tkinter.SOLID
+ self.justify = Tkinter.LEFT
+ self.fg = "#000000"
+ self.bg = "#ffffe0"
+ self.xoffset = 20
+ self.yoffset = 1
+
+ def setText(self, text):
+ self.text = text
+
+ def _unbind(self):
+ if self.bindings and self.widget:
+ self.widget.unbind("<Enter>", self.bindings[0])
+ self.widget.unbind("<Leave>", self.bindings[1])
+ self.widget.unbind("<ButtonPress>", self.bindings[2])
+ self.bindings = []
+
+ def destroy(self):
+ self._unbind()
+ self._leave()
+
+ def _enter(self, *event):
+ after_cancel(self.timer)
+ self.timer = after(self.widget, self.time, self._showTip)
+
+ def _leave(self, *event):
+ after_cancel(self.timer)
+ self.timer = None
+ if self.tooltip:
+ self.label.destroy()
+ destruct(self.label)
+ self.label = None
+ self.tooltip.destroy()
+ destruct(self.tooltip)
+ self.tooltip = None
+
+ def _showTip(self):
+ if self.tooltip or not self.text:
+ return
+ c = self.widget.__class__
+ if c in (Tkinter.Button,):
+ if self.widget["state"] == Tkinter.DISABLED:
+ return
+ x = self.widget.winfo_rootx()
+ y = self.widget.winfo_rooty() + self.widget.winfo_height()
+ x = x + self.xoffset
+ y = y + self.yoffset
+ self.tooltip = Tkinter.Toplevel()
+ self.tooltip.wm_iconify()
+ self.tooltip.wm_overrideredirect(1)
+ self.tooltip.wm_protocol("WM_DELETE_WINDOW", self.destroy)
+ self.label = Tkinter.Label(self.tooltip, text=self.text,
+ relief=self.relief, justify=self.justify,
+ fg=self.fg, bg=self.bg, bd=1, takefocus=0)
+ self.label.pack(ipadx=1, ipady=1)
+ self.tooltip.wm_geometry("%+d%+d" % (x, y))
+ self.tooltip.wm_deiconify()
+
+if __name__ == "__main__":
+ root=Tkinter.Tk()
+ label = Tkinter.Label(root, text="coucou")
+ label.pack()
+ tp=TOOLTIP(label,"texte d'aide")
+ root.mainloop()
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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 Tkinter,Pmw
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+import treewidget
+
+class TREEITEMINCANVAS:
+ def __init__(self,object,nom="",parent=None,appli=None,sel=None,rmenu=None):
+ self.object=object
+ self.nom=nom
+
+ if not appli:
+ class Appli:
+ def affiche_infos(self,message):
+ pass
+ appli=Appli()
+ self.appli=appli
+
+ if not parent:
+ parent=Tkinter.Tk()
+ Pmw.initialise(parent)
+ self.parent=parent
+
+ self.item=Objecttreeitem.make_objecttreeitem(self.appli,self.nom,self.object)
+ 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):
+ return
+ self.tree=treewidget.Tree(self.appli,self.item,self.canvas,command=sel,rmenu=rmenu)
+ self.tree.draw()
+
+ def mainloop(self):
+ self.parent.mainloop()
+
+ def update(self):
+ """Cette methode est utilisee pour signaler une mise a jour des objets associes"""
+ self.tree.update()
+
+ def supprime(self):
+ #print "supprime",self
+ self.tree.supprime()
+ self.tree=None
+ self.canvas.destroy()
+ self.canvas=None
+
+ #def __del__(self):
+ # print "__del__",self
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,sys,string,re,types,traceback
+from Tkinter import *
+
+
+from InterfaceTK import fontes
+import images
+from Ihm import CONNECTOR
+
+#
+__version__="$Name: BR_V1_12qt $"
+__Id__="$Id: treewidget.py,v 1.32 2007-06-15 15:52:04 cchris Exp $"
+#
+
+Fonte_Standard = fontes.standard
+
+class Tree :
+ def __init__(self,appli,jdc_item,scrolledcanvas,command = None,rmenu=None):
+ self.item = jdc_item
+ self.scrolledcanvas = scrolledcanvas
+ self.canvas = self.scrolledcanvas.component('canvas')
+ #resolution
+ resolution= self.canvas.winfo_screenwidth()/(self.canvas.winfo_screenmmwidth()/25.4*72)
+ self.DDY=max(20,resolution*(Fonte_Standard[1]+4))
+ self.id_up=self.canvas.bind("<F11>", self.page_up)
+ self.id_down=self.canvas.bind("<F12>", self.page_down)
+ self.id_um=self.canvas.bind("<Key-Left>", self.mot_up)
+ self.id_dm=self.canvas.bind("<Key-Right>", self.mot_down)
+ self.id_s=self.canvas.bind("<1>", self.canvas_select)
+ self.tree = self
+ self.command = command
+ self.rmenu=rmenu
+ self.appli = appli
+ self.parent = None
+ self.racine = self
+ self.node_selected = None
+ self.build_children()
+
+ def canvas_select(self,event):
+ self.canvas.focus_set()
+
+ def page_up(self,event):
+ event.widget.yview_scroll(-1, "page")
+
+ def page_down(self,event):
+ event.widget.yview_scroll(1, "page")
+
+ def unit_up(self,event):
+ event.widget.yview_scroll(-1, "unit")
+
+ def unit_down(self,event):
+ event.widget.yview_scroll(1, "unit")
+
+ def mot_down(self,event):
+ self.select_next(None)
+ self.canvas.focus_set()
+
+ def mot_down_force(self):
+ self.select_next(None)
+ self.canvas.focus_set()
+
+ def mot_up(self,event):
+ self.node_selected.select_mot_previous()
+ self.canvas.focus_set()
+
+ def mot_up_force(self):
+ self.node_selected.select_mot_prev()
+ self.canvas.focus_set()
+
+ def deplieReplieNode(self):
+ self.node_selected.deplieReplieNode()
+
+ def build_children(self):
+ """ Construit la liste des enfants de self """
+ self.children = []
+ child = self.item.itemNode(self,self.item,self.command,self.rmenu)
+ self.children.append(child)
+ child.state='expanded'
+
+ def draw(self):
+ """ Dessine l'arbre """
+ lasty = 8
+ x = 5
+ for child in self.children:
+ child.draw(x,lasty)
+ lasty = child.lasty + 15
+ self.children[0].select()
+ self.resizescrollregion()
+
+ def deselectall(self):
+ """ déselectionne tous les éléments de l'arbre """
+ if self.node_selected :
+ self.node_selected.deselect()
+
+ def update(self):
+ """ Update tous les éléments de l'arbre """
+ for child in self.children:
+ child.update()
+
+ def supprime(self):
+ """ supprime tous les éléments de l'arbre """
+ #print "supprime",self
+ self.canvas.unbind("<F11>",self.id_up)
+ self.canvas.unbind("<F12>",self.id_down)
+ self.canvas.unbind("<Key-Left>",self.id_um)
+ self.canvas.unbind("<Key-Right>",self.id_dm)
+ self.canvas.unbind("<1>",self.id_s)
+ self.tree = None
+ self.racine = None
+ self.node_selected = None
+ self.item = None
+ self.scrolledcanvas = None
+ self.canvas = None
+ self.command = None
+ self.rmenu=None
+ for child in self.children:
+ child.supprime()
+ self.children=[]
+
+ def update_valid(self) :
+ """Cette methode a pour but de mettre a jour la validite du noeud
+ et de propager la demande de mise à jour à son parent
+ """
+ pass
+
+ def resizescrollregion(self):
+ x0,y0,x1,y1=self.canvas.bbox(ALL)
+ # On ajoute une marge approximativement de la moitié du canvas
+ y1=y1+self.canvas.winfo_height()/2
+ self.canvas.configure(scrollregion = (x0,y0,x1,y1))
+
+ def select_next(self,event):
+ self.node_selected.select_next()
+ self.canvas.focus_set()
+
+ def select_previous(self,event):
+ self.node_selected.select_previous()
+
+ def see(self,items):
+ x1, y1, x2, y2=apply(self.canvas.bbox, items)
+ while x2 > self.canvas.canvasx(0)+self.canvas.winfo_width():
+ old=self.canvas.canvasx(0)
+ self.canvas.xview_scroll( 1, 'units')
+ # avoid endless loop if we can't scroll
+ if old == self.canvas.canvasx(0):
+ break
+ while y2 > self.canvas.canvasy(0)+self.canvas.winfo_height():
+ old=self.canvas.canvasy(0)
+ self.canvas.yview_scroll( 1, 'units')
+ if old == self.canvas.canvasy(0):
+ break
+ # done in this order to ensure upper-left of object is visible
+ while x1 < self.canvas.canvasx(0):
+ old=self.canvas.canvasx(0)
+ self.canvas.xview_scroll( -1, 'units')
+ if old == self.canvas.canvasx(0):
+ break
+ while y1 < self.canvas.canvasy(0):
+ old=self.canvas.canvasy(0)
+ self.canvas.yview_scroll( -1, 'units')
+ if old == self.canvas.canvasy(0):
+ break
+
+ #def __del__(self):
+ # print "__del__",self
+
+
+class Node :
+ def __init__(self,parent,item,command=None,rmenu=None):
+ self.parent = parent
+ self.item = item
+ self.connect()
+ self.command = command
+ self.rmenu=rmenu
+ self.tree = self.parent.tree
+ self.appli = self.parent.appli
+ self.canvas = self.parent.canvas
+ self.init()
+
+ def init(self):
+ self.state='collapsed'
+ self.displayed = 0
+ self.selected = 0
+ self.x = self.y =None
+ self.lasty = 0
+ self.children = None
+ self.id = []
+ if self.parent is self.tree:
+ self.racine=self
+ else:
+ self.racine = self.parent.racine
+
+ def connect(self):
+ self.item.connect("add",self.onAdd,())
+ self.item.connect("supp",self.onSupp,())
+ self.item.connect("valid",self.onValid,())
+
+ #def __del__(self):
+ # print "__del__",self
+
+ def force_select(self):
+ if self.selected:
+ # le noeud est selectionné. On force la reconstruction du panel associé
+ if self.command:apply(self.command,(None,))
+ self.select()
+
+ def onValid(self):
+ #print "onValid : l'item a changé de validité ",self.item,self.item.object,self.item.object.isvalid()
+ self.update_node_valid()
+ self.update_node_label()
+ self.update_node_texte()
+ if self.selected and self.command:
+ self.command(self)
+
+ def onAdd(self,objet):
+ #print "onAdd : un objet a été ajouté aux fils de l'item ",self.item.object,objet
+ self.expand_node()
+ old_nodes=self.children
+ self.update_nodes()
+ self.redraw_children(old_nodes)
+ self.force_select()
+
+ def onSupp(self,objet):
+ #print "onSupp : un objet a été supprimé des fils de l'item ",self.item.object,objet
+ self.expand_node()
+ old_nodes=self.children
+ self.update_nodes()
+ self.redraw_children(old_nodes)
+ self.force_select()
+
+ def update_nodes(self):
+ #print "update_nodes",self
+ newnodes=[]
+ inodes=iter(self.children)
+ sublist=self.item._GetSubList()
+ iliste=iter(sublist)
+
+ while(1):
+ old_item=item=None
+ for node in inodes:
+ old_item=node.item
+ if old_item in sublist:break
+ #print "item supprime",old_item
+ for item in iliste:
+ if item is old_item:break
+ #print "item ajoute",item
+ child = item.itemNode(self,item,self.command,self.rmenu)
+ newnodes.append(child)
+
+ if old_item is None and item is None:break
+ if old_item is item:
+ #print "item conserve",item
+ newnodes.append(node)
+
+ self.children=newnodes
+ self.connect()
+
+ def supprime(self):
+ #print "supprime",self
+ self.efface_node()
+ self.racine = None
+ self.command = None
+ self.rmenu=None
+ if not self.children : return
+ for child in self.children:
+ child.supprime()
+ self.children=None
+
+ def redraw_children(self,old_nodes):
+ #print "redraw_children",old_nodes
+ #print self.children
+ y = self.y + self.tree.DDY
+ x = self.x + 15
+ supp_nodes=[]
+
+ inodes=iter(old_nodes)
+ iliste=iter(self.children)
+ # on parcourt la liste des anciens noeuds (node)
+ # et la liste des nouveaux noeuds (new_node) en parallele (iterateurs)
+
+ while(1):
+ new_node=node=None
+ for node in inodes:
+ #print "ancien noeud",node
+ if node in self.children:break # ancien noeud toujours present
+ #print "noeud supprime",node,node.item.GetLabelText()[0]
+ dy=node.y-node.lasty -self.tree.DDY
+ #print "deplacer noeuds",y,dy
+ node.move_nodes(y,dy)
+ node.supprime()
+ #supp_nodes.append(node)
+
+ for new_node in iliste:
+ #print "nouveau noeud",new_node
+ if new_node in old_nodes: break # nouveau noeud deja present
+ #print "noeud ajoute",new_node,new_node.item.GetLabelText()[0]
+ y=self.draw_node(new_node,x,y)
+
+ if node is None and new_node is None : break
+
+ if node is new_node: # ancien noeud
+ #print "noeud conserve",node
+ node.update_node_label()
+ y=y+node.lasty-node.y +self.tree.DDY
+
+ self.racine.update_coords()
+ self.canvas.delete('line')
+ self.racine.trace_ligne()
+ self.tree.resizescrollregion()
+ # Mettre à 1 pour verifier les cycles entre objets node
+ #withCyclops=0
+ #if withCyclops:
+ #from Misc import Cyclops
+ #z = Cyclops.CycleFinder()
+ #print supp_nodes
+ #for o in supp_nodes:
+ #z.register(o)
+ #del supp_nodes
+ #del o
+ #z.find_cycles()
+ #z.show_stats()
+ #z.show_cycles()
+
+ def tag_move_nodes(self,y):
+ """ Marque pour deplacement tous les noeuds au dela de l'ordonnée y """
+ #print "tag_move_nodes",y
+ self.canvas.dtag(ALL,'move')
+ # on marque tous les ids au dela de y
+ x0, y0, x1, y1 = self.canvas.bbox(ALL)
+ if y > y1: # pas d'objet a deplacer
+ return
+ self.canvas.addtag_overlapping('move',x0,y,x1,y1)
+
+ def move_nodes(self,y,dy):
+ """ Déplace de l'incrément dy les noeuds au dela de l'ordonnée y """
+ #print "move_nodes",y,dy
+ self.tag_move_nodes(y)
+ # on déplace tous les items de dy
+ self.canvas.move('move',0,dy)
+
+ def draw_node(self,new_node,x,y):
+ """ Dessine le noeud new_node en x,y en deplacant les noeuds existants
+ en y et au dela
+ Retourne la position du premier des noeuds deplaces
+ """
+ #print "draw_node",new_node,x,y
+ self.tag_move_nodes(y)
+ #if new_node.item.isactif():
+ #new_node.state = 'expanded'
+ new_node.state = 'expanded'
+ new_node.draw(x,y)
+ dy=(new_node.get_nb_children()+1)*self.tree.DDY
+ #print "deplacer noeuds",y,dy
+ self.canvas.move('move',0,dy)
+ return new_node.lasty+self.tree.DDY
+
+ def build_children(self):
+ """ Construit la liste des enfants de self """
+ self.children = []
+ sublist = self.item._GetSubList()
+ if not sublist : return
+ for item in sublist :
+ child = item.itemNode(self,item,self.command,self.rmenu)
+ self.children.append(child)
+
+ #-----------------------------------------------
+ # Méthodes de sélection/déselection d'un noeud
+ #-----------------------------------------------
+
+ def select(self, event=None):
+ """
+ Rend le noeud courant (self) sélectionné et déselectionne
+ tous les autres
+ """
+ #print "SELECT",self
+ if not self.children : self.build_children()
+ self.tree.deselectall()
+ self.selected = 1
+ self.tree.node_selected = self
+ if self.command:apply(self.command,(self,))
+ self.highlight()
+ self.make_visible()
+
+ def deselect(self, event=None):
+ """ Déselectionne self """
+ self.selected = 0
+ if self.displayed == 1 : self.dehighlight()
+
+ def make_visible(self):
+ """ Rend l'objet self visible cad déplace le scroll pour que self
+ soit dans la fenêtre de visu
+ """
+ lchild=self.last_child()
+ self.tree.see((self.image_id,lchild.image_id))
+
+ def select_next(self,ind=0):
+ """ on doit chercher à sélectionner dans l'ordre:
+ - son premier fils s'il est affiché
+ - son frère cadet s'il existe
+ - son oncle (benjamin de son père)
+ - ... appel récursif ...
+ """
+ if self.state=='expanded' and len(self.children) > ind:
+ self.children[ind].select()
+ else :
+ index = self.parent.children.index(self) + 1
+ try :
+ if isinstance(self.parent,TREE) :
+ try:
+ self.children[ind].select()
+ except:
+ self.children[0].select()
+ except :
+ if self.parent is self.tree:
+ pass
+ else :
+ self.parent.select_next(index)
+
+ def select_mot_prev(self):
+ index = self.parent.children.index(self) - 1
+ try :
+ if index > -1 :
+ self.parent.children[index].select()
+ if self.parent.children[index].state=="expanded":
+ print len(self.parent.children[index].children)
+ if len(self.parent.children[index].children)!=0 :
+ max=len(self.parent.children[index].children) - 1
+ self.parent.children[index].children[max].select()
+ else :
+ self.parent.children[index].select()
+ else :
+ self.parent.children[index].select()
+ elif self.parent is self.tree:
+ pass
+ else :
+ self.parent.select()
+ except:
+ if self.parent is self.tree:
+ pass
+ else :
+ self.parent.select_previous()
+
+
+ def select_mot_previous(self):
+ index = self.parent.children.index(self) - 1
+ try :
+ if index > -1 :
+ self.parent.children[index].select()
+ elif self.parent is self.tree:
+ pass
+ else :
+ self.parent.select()
+ except:
+ if self.parent is self.tree:
+ pass
+ else :
+ self.parent.select_previous()
+
+ def select_previous(self):
+ """ on doit d'abord sélectionner(dans l'ordre) :
+ - son frère aîné
+ - son père
+ """
+ index = self.parent.children.index(self) - 1
+ try :
+ self.parent.children[index].select()
+ except:
+ #self.parent.select()
+ if self.parent is self.tree:
+ pass
+ else :
+ self.parent.select_previous()
+
+ def popup(self,event=None):
+ """
+ Declenche le traitement associé au clic droit de la souris
+ sur l'icone du Node
+ """
+ if not self.rmenu:return
+ apply(self.rmenu,(self,event))
+
+ #-----------------------------------------------
+ # Méthodes de recherche d'informations
+ #-----------------------------------------------
+ def geticonimage(self,name=None):
+ """
+ Retourne l'image qui doit être associée à self
+ """
+ if not name :
+ name = self.item.GetIconName()
+ if not name or name == 'aucune' :
+ return None
+ return images.get_image(name)
+
+ def get_nb_children(self):
+ """ Retourne le nombre d'enfants affichés de self """
+ nb = 0
+ if self.state =='collapsed' : return nb
+ for child in self.children :
+ nb = nb + 1 + child.get_nb_children()
+ return nb
+
+ def get_liste_id(self):
+ """ Retourne la liste de tous les id (filiation comprise) de self """
+ liste = self.id
+ for child in self.children:
+ liste.extend(child.get_liste_id())
+ return liste
+
+ def get_node_fils(self,name) :
+ """ Retourne le fils de self de nom name s'il existe"""
+ for child in self.children:
+ if child.item.get_nom() == name: return child
+ return None
+
+ #-----------------------------------------------
+ # Méthodes d'affichage d'un noeud
+ #-----------------------------------------------
+ def draw(self,x,y):
+ """ Permet de tracer le noeud self """
+ # le début du noeud est en x,y
+ self.x = x
+ self.y = y
+ self.lasty = y
+ self.displayed = 1
+ self.id=[]
+ # choix de l'icone à afficher : + ou -
+ if self.item.IsExpandable():
+ if self.state == 'expanded':
+ iconname = "minusnode"
+ callback = self.collapse
+ else:
+ iconname = "plusnode"
+ callback = self.expand
+ image = self.geticonimage(name=iconname)
+ self.icone_id = self.canvas.create_image(self.x, self.y, image=image)
+ self.callback_id=self.canvas.tag_bind(self.icone_id, "<1>", callback)
+ self.id.append(self.icone_id)
+ # création de la ligne horizontale
+ self.ligne_id = self.canvas.create_line(self.x,self.y,self.x+10,self.y)
+ self.id.append(self.ligne_id)
+ self.canvas.tag_lower(self.ligne_id)
+ # affichage de l'icone (carre ,rond, ovale ...) de couleur
+ image = self.geticonimage()
+ if image != None :
+ self.image_id = self.canvas.create_image(self.x+15,self.y,image = image)
+ self.select_id2=self.canvas.tag_bind(self.image_id,"<1>",self.select)
+ self.popup_id2=self.canvas.tag_bind(self.image_id,"<3>",self.popup)
+ self.id.append(self.image_id)
+ else:
+ self.image_id = None
+ # affichage du texte : nom de l'objet (ETAPE ou MOT-CLE) et sa valeur
+ self.drawtext()
+ if self.state == 'expanded' :
+ if not self.children : self.build_children()
+ if len(self.children) > 0:
+ self.drawchildren()
+ self.lasty = self.children[-1].lasty
+
+ def drawchildren(self):
+ """ Dessine les enfants de self """
+ y = self.y + self.tree.DDY
+ x = self.x + 15
+ for child in self.children:
+ child.draw(x,y)
+ nb = child.get_nb_children()
+ y = y + self.tree.DDY*(nb+1)
+ self.trace_ligne()
+
+ def drawtext(self):
+ """ Affiche les deux zones de texte après l'icône de couleur de l'objet """
+ if self.image_id != None :
+ textx = self.x + 30
+ else:
+ textx = self.x + 15
+ texty = self.y
+ # nom,fonte et couleur de l'objet du noeud à afficher
+ labeltext,fonte,couleur = self.item.GetLabelText()
+ if labeltext == '' : labeltext = ' '
+ if fonte == None : fonte = Fonte_Standard
+ if couleur == None : couleur = 'black'
+ # création du widget label
+ self.label = Label(self.canvas,
+ text = labeltext,
+ fg = couleur,
+ bg = 'gray95',
+ font=fonte)
+ self.label_id = self.canvas.create_window(textx,texty,window=self.label,anchor='w')
+ self.id.append(self.label_id)
+ # bindings sur le widget label
+ self.select_id=self.label.bind("<1>", self.select)
+ self.popup_id=self.label.bind("<3>", self.popup)
+ self.enter_id=self.label.bind("<Enter>",self.enter)
+ self.leave_id=self.label.bind("<Leave>",self.leave)
+ # valeur de cet objet à afficher
+ x0, y0, x1, y1 = self.canvas.bbox(self.label_id)
+ textx = max(x1, 200) + 10
+ text = self.item.GetText() or " "
+ self.text = Label(self.canvas, text=text,
+ bd=0, padx=2, pady=2,background='gray95',
+ font=fonte)
+ if self.selected:
+ self.highlight()
+ else:
+ self.dehighlight()
+ self.text_id = self.canvas.create_window(textx, texty,anchor="w", window=self.text)
+ self.id.append(self.text_id)
+
+ def highlight(self,event=None):
+ """ Met en surbrillance self"""
+ if hasattr(self,'label'):
+ self.label.configure(fg='white',bg='#00008b')
+ if (hasattr(self.item,'get_nom') and hasattr( self.appli, 'salome')) :
+ if self.item.get_nom() == "AFFE_CARA_ELEM":
+ self.item.rmenu_specs=[("View3D", "visu_3D")]
+ self.tree.rmenu
+
+
+ def dehighlight(self,event=None):
+ """ Rétablit l'affichage normal de self"""
+ if hasattr(self,'label'):
+ self.label.configure(fg='black',bg='gray95')
+
+ def enter(self,event=None):
+ """ Met en surbrillance self et affiche le fr de l'objet """
+ self.highlight()
+ fr = self.item.get_fr()
+ self.appli.affiche_infos(fr)
+
+ def leave(self,event=None):
+ """ Rétablit l'affichage normal de self et efface le fr de l'objet """
+ if not self.selected :
+ self.dehighlight()
+ self.appli.affiche_infos('')
+
+ def collapse_children(self):
+ """ Collapse récursivement tous les descendants de self """
+ if not self.children : return
+ for child in self.children:
+ child.state='collapsed'
+ child.collapse_children()
+
+ def deplieReplieNode(self):
+ if self.state == 'expanded':
+ self.collapse()
+ else :
+ self.expand_node()
+
+ def collapse(self,event = None):
+ """ Collapse self et descendants et retrace self """
+ nb = self.get_nb_children()
+ self.state = 'collapsed'
+ self.collapse_children()
+ self.redraw(-nb)
+ self.select()
+
+ def expand_node(self,event = None):
+ """ Expanse self et le retrace """
+ if self.state == 'expanded':return
+ #if not self.item.isactif() : return
+ if not self.children : self.build_children()
+ self.state = 'expanded'
+ nb = self.get_nb_children()
+ self.redraw(nb)
+
+ def expand(self,event = None):
+ """ Expanse self et le retrace """
+ self.expand_node()
+ self.select()
+
+ def redraw(self,nb):
+ """ Redessine self : nb est le décalage à introduire
+ en dessous de self pour le redessiner """
+ # nb = nombre d'items de décalage
+ self.move(self.tree.DDY*nb)
+ # on efface self et on le redessine
+ self.efface()
+ self.draw(self.x,self.y)
+ # Il n'est pas nécessaire d'appeler update
+ # il suffit d'updater les coordonnees et de retracer les lignes
+ self.racine.update_coords()
+ self.racine.trace_ligne()
+ self.update_valid()
+ self.tree.resizescrollregion()
+
+ def update_coords(self):
+ """ Permet d'updater les coordonnes de self et de tous ses enfants"""
+ if self.displayed == 0 : return
+ if self.image_id != None :
+ coords = self.canvas.coords(self.image_id)
+ self.x = coords[0]-15
+ else:
+ coords = self.canvas.coords(self.label_id)
+ self.x = coords[0]-15
+ self.y = coords[1]
+ self.lasty = self.y
+ if self.state == 'expanded' :
+ for child in self.children:
+ if child.displayed != 0:
+ child.update_coords()
+ self.lasty = child.lasty
+
+ def update_icone(self):
+ """ Met à jour les icônes de tous les noeuds : teste la validité de l'objet
+ Cette méthode est très lente, trop !!"""
+ if self.image_id != None :
+ image = self.geticonimage()
+ self.canvas.itemconfig(self.image_id,image=image)
+ if self.state == 'expanded':
+ for child in self.children:
+ if child.displayed != 0:
+ child.update_icone()
+
+ def update_label_texte(self):
+ """ Met a jour le label du noeud et celui de tous ses fils ouverts """
+ self.update_node_label()
+ if self.state == 'expanded' :
+ for child in self.children:
+ if child.displayed != 0 : child.update_label_texte()
+
+ def update_texte(self):
+ """ Met à jour les noms des SD et valeurs des mots-clés """
+ self.update_node_texte()
+ if self.state == 'expanded' :
+ for child in self.children:
+ if child.displayed != 0 : child.update_texte()
+
+ def update_node_label(self):
+ """ Met a jour le label du noeud """
+ if self.displayed == 0 : return
+ # nom,fonte et couleur de l'objet du noeud à afficher
+ labeltext,fonte,couleur = self.item.GetLabelText()
+ if labeltext == '' : labeltext = ' '
+ if fonte == None : fonte = Fonte_Standard
+ if couleur == None : couleur = 'black'
+ self.label.configure(text=labeltext,font=fonte)
+
+ def update_node_texte(self):
+ """ Met à jour les noms des SD et valeurs des mots-clés """
+ if self.displayed == 0 : return
+ text = self.item.GetText()
+ if text == None : text = ''
+ self.text.configure(text=text)
+
+ def update_node_valid(self) :
+ """Cette methode remet a jour la validite du noeud (icone)
+ Elle appelle isvalid
+ """
+ if self.displayed == 0 : return
+ if self.image_id != None :
+ image = self.geticonimage()
+ self.canvas.itemconfig(self.image_id,image=image)
+
+ def update_valid(self) :
+ """Cette methode a pour but de mettre a jour la validite du noeud
+ et de propager la demande de mise à jour à son parent
+ """
+ self.update_node_valid()
+ self.parent.update_valid()
+
+ def update(self,event=None) :
+ """ Classe Node :
+ Cette méthode est appelée pour demander l update d un noeud
+ d'un jeu de commandes
+ Cette demande est transmise au noeud racine (le JDC) qui update
+ tout l arbre représentant le jeu de commandes
+ Pendant cette mise à jour, on appelle la méthode isvalid qui
+ fera l update de tous les objets déclarés modifiés lors des
+ actions précédentes
+ La métode isvalid est en général appelée par l intermédiaire de
+ update_icone -> geticonimage -> GetIconName
+ """
+ #print "update",self
+ #traceback.print_stack()
+ self.racine.update_coords()
+ self.racine.trace_ligne()
+ self.racine.update_icone()
+ self.racine.update_texte()
+ self.racine.update_label_texte()
+ self.tree.resizescrollregion()
+
+ def efface_node(self):
+ if self.displayed != 0:
+ self.label.unbind("<1>", self.select_id)
+ self.label.unbind("<3>", self.popup_id)
+ self.label.unbind("<Enter>",self.enter_id)
+ self.label.unbind("<Leave>",self.leave_id)
+ self.canvas.tag_unbind(self.image_id,"<1>",self.select_id2)
+ self.canvas.tag_unbind(self.image_id,"<3>",self.popup_id2)
+ if self.item.IsExpandable():
+ self.canvas.tag_unbind(self.icone_id, "<1>", self.callback_id)
+ self.label.destroy()
+ self.text.destroy()
+
+ for id in self.id :
+ self.canvas.delete(id)
+ self.id=[]
+ self.label_id=None
+ self.text_id=None
+ self.image_id=None
+ self.icone_id=None
+ self.label=None
+ self.text=None
+ self.displayed=0
+
+ def efface(self):
+ """ Efface du canvas les id associés à self : cad les siens et ceux
+ de ses enfants """
+ self.efface_node()
+ if not self.children : return
+ for child in self.children:
+ child.efface()
+
+ def move(self,dy):
+ """ Déplace de l'incrément dy tous les id en dessous de self """
+ # il faut marquer tous les suivants de self
+ bbox1 = self.canvas.bbox(ALL)
+ self.canvas.dtag(ALL,'move')
+ self.canvas.delete('line')
+ 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.getObject()
+ print self.item.getObject().definition.label
+ print 'y=',self.y
+ print 'dy=',dy
+ # on déplace tous les items de dy
+ self.canvas.move('move',0,dy)
+
+ def trace_ligne(self):
+ """ Dessine les lignes verticales entre frères et entre père et premier fils"""
+ if self.state=='collapsed' : return
+ if len(self.children)==0 : return
+ # on est bien dans le cas d'un noeud expansé avec enfants ...
+ # il faut rechercher l'ordonnée du dernier fils de self
+ y_end = self.children[-1].y
+ ligne = self.canvas.create_line(self.x+15,self.y,self.x+15,y_end,tags='line')
+ self.canvas.tag_lower(ligne)
+ for child in self.children :
+ try:
+ child.trace_ligne()
+ except:
+ print "Erreur dans trace_ligne :"
+ print child
+ print child.item.getObject()
+
+ def last_child(self):
+ lchild=self
+ if self.state == 'expanded' and self.children:
+ lchild= self.children[-1].last_child()
+ return lchild
+
+ #------------------------------------------------------------------
+ # Méthodes de création et destruction de noeuds
+ # Certaines de ces méthodes peuvent être appelées depuis l'externe
+ #------------------------------------------------------------------
+ def append_brother(self,name,pos='after',retour='non'):
+ """
+ Permet d'ajouter un objet frère à l'objet associé au noeud self
+ par défaut on l'ajoute immédiatement après
+ Méthode externe
+ """
+ # on veut ajouter le frère de nom name directement avant ou après self
+ index = self.parent.children.index(self)
+ if pos == 'before':
+ index = index
+ elif pos == 'after':
+ index = index +1
+ else:
+ print str(pos)," n'est pas un index valide pour append_brother"
+ return 0
+ return self.parent.append_child(name,pos=index)
+
+ def append_child(self,name,pos=None,verif='oui',retour='non'):
+ """
+ Methode pour ajouter un objet fils à l'objet associé au noeud self.
+ On peut l'ajouter en début de liste (pos='first'), en fin (pos='last')
+ ou en position intermédiaire.
+ Si pos vaut None, on le place à la position du catalogue.
+ """
+ #print "append_child",self,self.children
+ if pos == 'first':
+ index = 0
+ elif pos == 'last':
+ index = len(self.children)
+ elif type(pos) == types.IntType :
+ # position fixee
+ index = pos
+ elif type(pos) == types.InstanceType:
+ # pos est un item. Il faut inserer name apres pos
+ index = self.item.get_index(pos) +1
+ elif type(name) == types.InstanceType:
+ index = self.item.get_index_child(name.nom)
+ else:
+ index = self.item.get_index_child(name)
+ obj=self.item.additem(name,index)
+ #print obj
+ if obj is None:obj=0
+ if obj == 0:return 0
+ #print "append_child",index,self.children
+ child=self.children[index]
+ child.select()
+ return child
+
+ def delete(self):
+ """
+ Méthode externe pour la destruction de l'objet associé au noeud
+ La mise à jour des noeuds est faite par onSupp sur notification
+ """
+ index = self.parent.children.index(self) - 1
+ if index < 0 : index =0
+
+ parent=self.parent
+ ret=parent.item.suppitem(self.item)
+ if ret == 0:return
+
+ brothers=parent.children
+ if brothers:
+ toselect=brothers[index]
+ else:
+ toselect=parent
+ toselect.select()
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# ======================================================================
+# 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 copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from uniquepanel import UNIQUE_Panel
+
+
+class UNIQUE_ASSD_Panel(UNIQUE_Panel):
+ """
+ Classe servant à définir le panneau associé aux objets qui attendent une valeur unique
+ d'un type dérivé d'ASSD
+ """
+ def valid_valeur_automatique(self):
+ """
+ Réalise la validation d'un concept sans remonter dans le
+ node parent dans le cas ou il n'y a qu'un concept possible (liste de longueur 1)
+ Identique à valid_valeur moins appel de self.node.parent.select()
+ On pourrait supposer que le seul concept présent est valide et donc ne pas
+ réaliser tous les tests de vérification.
+ """
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ valeur = self.get_valeur()
+ self.erase_valeur()
+ anc_val = self.node.item.get_valeur()
+ valeur,validite=self.node.item.eval_valeur_item(valeur)
+ 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)
+ 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()
+ else :
+ cr = self.node.item.get_cr()
+ mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
+ self.reset_old_valeur(anc_val,mess=mess)
+
+ def makeValeurPage(self,page,reel="non"):
+ """
+ Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une
+ SD de type dérivé d'ASSD
+ """
+ # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
+ # et de la liste des SD du bon type (constituant la liste des choix)
+ bulle_aide=self.get_bulle_aide()
+ aide=self.get_aide()
+ aide= justify_text(texte=aide)
+ liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
+
+ # Remplissage du panneau
+ self.valeur_choisie = StringVar()
+ self.valeur_choisie.set('')
+ min,max = self.node.item.GetMinMax()
+ if (min == 1 and min == max and len(liste_noms_sd)==1 ):
+ if self.valeur_choisie.get() != liste_noms_sd[0]:
+ if ('R' not in self.node.item.get_type()) :
+ self.valeur_choisie.set(liste_noms_sd[0])
+ self.valid_valeur_automatique()
+
+ self.frame_valeur = Frame(page)
+ self.frame_valeur.pack(fill='both',expand=1)
+ self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+ self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
+ items=liste_noms_sd,
+ labelpos='n',
+ label_text="Structures de données du type\n requis par l'objet courant :",
+ listbox_height = 6,
+ selectioncommand=self.select_valeur_from_list,
+ dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
+ self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
+ Label(self.frame_valeur,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
+ Label(self.frame_valeur,textvariable=self.valeur_choisie).place(relx=0.5,rely=0.6)
+ self.but_val = Button(self.frame_valeur,text = "Valider",command= self.Choisir)
+ self.but_val.place(relx=0.3,rely=0.8,relwidth=0.35)
+
+ # affichage de la valeur courante
+ self.display_valeur()
+ if self.__class__.__name__ == 'UNIQUE_ASSD_Panel_Reel' :
+ Label(self.frame_valeur,text='Valeur Réelle').place(relx=0.1,rely=0.9)
+ self.entry = Entry(self.frame_valeur,relief='sunken')
+ self.entry.place(relx=0.28,rely=0.9,relwidth=0.6)
+ self.entry.bind("<Return>",lambda e,c=self.valid_valeur_reel:c())
+ self.entry.bind("<KP_Enter>",lambda e,c=self.valid_valeur_reel:c())
+
+
+
+ def get_bulle_aide(self):
+ """
+ Retourne l'aide associée au panneau
+ """
+ return "Double-cliquez sur la structure de donnée désirée pour valoriser le mot-clé simple courant"
+
+ def get_aide(self):
+ """
+ Retourne la phrase d'aide indiquant de quel type doit être la valeur à donner par l'utilisateur
+ """
+ mc = self.node.item.get_definition()
+ try :
+ type = mc.type[0].__name__
+ except :
+ type = str(mc.type[0])
+ if len(mc.type)>1 :
+ for typ in mc.type[1:] :
+ try :
+ l=typ.__name__
+ except:
+ l=str(typ)
+ type = type + ' ou '+l
+ commentaire="Un objet de type "+type+" est attendu"
+ aideval=self.node.item.aide()
+ commentaire=commentaire +"\n"+ aideval
+ return commentaire
+
+
+ def select_valeur_from_list(self):
+ """
+ Affecte à valeur choisie la sélection courante dans la liste des choix proposée
+ """
+ if len(self.listbox.get()) == 0 : return
+ if len(self.listbox.getcurselection()) == 0 : return
+ choix = self.listbox.getcurselection()[0]
+ self.valeur_choisie.set(choix)
+ self.listbox.component("listbox").focus_set()
+
+ def choose_valeur_from_list(self,command):
+ """
+ Affecte à valeur choisie la sélection courante dans la liste des choix proposée
+ Exécute command
+ """
+ if len(self.listbox.get()) == 0 : return
+ if len(self.listbox.getcurselection()) == 0 : return
+ choix = self.listbox.getcurselection()[0]
+ self.valeur_choisie.set(choix)
+ apply(command,(),{})
+
+ def Choisir(self) :
+ #Appeler par le bouton Valider
+ self.choose_valeur_from_list(self.valid_valeur)
+
+ def get_valeur(self):
+ """
+ Retourne la valeur donnée par l'utilisateur au MCS
+ """
+ return self.valeur_choisie.get()
+
+ def display_valeur(self):
+ """
+ Affiche la valeur de l'objet pointé par self
+ """
+ valeur = self.node.item.get_valeur()
+ if valeur == None or valeur == '' : return # pas de valeur à afficher ...
+ self.valeur_choisie.set(getattr(valeur,"nom","unknown"))
+
+ def erase_valeur(self):
+ pass
+
+ def appel_make(self,page):
+ self.makeValeurPage(page,reel="oui")
+
+class UNIQUE_ASSD_Panel_Reel(UNIQUE_ASSD_Panel):
+
+ def valid_valeur_reel(self):
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ anc_val = self.node.item.get_valeur()
+ valeurentree = self.entry.get()
+ self.valeur_choisie.set(valeurentree)
+ self.valid_valeur()
+
+ def display_valeur(self):
+ valeur = self.node.item.get_valeur()
+ if valeur == None or valeur == '' : return # pas de valeur à afficher ...
+ if type(valeur) == types.FloatType :
+ self.valeur_choisie.set(valeur)
+ else :
+ self.valeur_choisie.set(valeur.nom)
+
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+from Tkinter import Widget
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import FenetreDeParametre
+from widgets import showerror
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from uniquepanel import UNIQUE_Panel
+
+
+class UNIQUE_BASE_Panel(UNIQUE_Panel):
+ """
+ Classe servant à définir le panneau associé aux mots-clés simples qui attendent
+ une valeur d'un type de base (entier, réel ou string).
+ """
+ def makeValeurPage(self,page):
+ """
+ Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
+ de base cad entier, réel, string ou complexe
+ """
+ # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
+ # et de la liste des SD du bon type (constituant la liste des choix)
+ bulle_aide=self.get_bulle_aide()
+ aide=self.get_aide()
+ aide= justify_text(texte=aide)
+ liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
+ # Remplissage du panneau
+ self.frame_valeur = Frame(page)
+ self.frame_valeur.pack(fill='both',expand=1)
+ self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+ self.label = Label(self.frame_valeur,text='Valeur :')
+ #self.label.place(relx=0.1,rely=0.2)
+ self.label.grid(row=0,padx=5,pady=5)
+ self.entry = Entry(self.frame_valeur,relief='sunken')
+ #self.entry.place(relx=0.28,rely=0.2,relwidth=0.6)
+ self.entry.grid(row=0,column=1,padx=5,pady=5)
+ self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
+ self.entry.bind("<KP_Enter>",lambda e,c=self.valid_valeur:c())
+ # aide associée au panneau
+ 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.9,anchor='n')
+ self.aide.grid(row=4,columnspan=2,padx=5,pady=5)
+ # bouton parametre
+ bouton_parametres = Button(self.frame_valeur, text="Parametres", command=self.affiche_parametre)
+ #bouton_parametres.place(relx=0.28,rely=0.5,relwidth=0.4)
+ bouton_parametres.grid(row=2,columnspan=2,padx=5,pady=5)
+ bouton_val = Button(self.frame_valeur, text="Valider", command=self.valide)
+ #bouton_val.place(relx=0.28,rely=0.6,relwidth=0.4)
+ bouton_val.grid(row=3,columnspan=2,padx=5,pady=5)
+ # affichage de la valeur du MCS
+ self.display_valeur()
+
+ def valide(self):
+ self.valid_valeur()
+
+ def affiche_parametre(self) :
+ if self.node.item.get_liste_param_possible() != [ ]:
+ txtparam=""
+ for param in self.node.item.get_liste_param_possible():
+ txtparam=txtparam+repr(param)+"\n"
+ if txtparam=="":
+ showerror("Aucun parametre ","Pas de parametre de ce type")
+ else :
+ try :
+ self.fenetreparam.destroy()
+ except :
+ pass
+ self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
+
+ def destroy(self):
+ try :
+ self.fenetreparam.destroy()
+ except :
+ pass
+ Widget.destroy(self)
+
+ def get_aide(self):
+ """
+ Retourne la phrase d'aide indiquant de quel type doit être la valeur
+ du mot-clé simple fournie par l'utilisateur
+ """
+ mc = self.node.item.get_definition()
+ d_aides = { 'TXM' : "Une chaîne de caractères est attendue",
+ 'R' : "Un réel est attendu",
+ 'I' : "Un entier est attendu"}
+ type = mc.type[0]
+ commentaire=d_aides.get(type,"Type de base inconnu")
+ aideval=self.node.item.aide()
+ commentaire=commentaire +"\n"+ aideval
+ return commentaire
+
+ def get_bulle_aide(self):
+ """
+ Retourne la bulle d'aide associée au panneau et affichée par clic droit
+ """
+ return """Saisissez la valeur que vous voulez affecter au mot-clé simple
+ dans la zone de saisie et pressez <Return>"""
+
+ def display_valeur(self):
+ """
+ Affiche la valeur de l'objet pointé par self
+ """
+ valeur = self.node.item.get_valeur()
+ if valeur == None or valeur == '' : # pas de valeur à afficher ...
+ self.entry.delete(0,END)
+ self.entry.focus()
+ return
+
+ valeur_texte=self.get_valeur_texte(valeur)
+ if valeur_texte != "":
+ valeur=valeur_texte
+ self.entry.delete(0,END)
+ self.entry.insert(0,valeur)
+ self.entry.focus()
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from uniquepanel import UNIQUE_Panel
+
+
+class UNIQUE_COMP_Panel(UNIQUE_Panel):
+ """
+ Classe servant à définir le panneau associé aux mots-clés simples
+ qui attendent une valeur de type complexe
+ """
+ def makeValeurPage(self,page):
+ """
+ Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
+ de base cad entier, réel, string ou complexe
+ """
+ # Récupération de l'aide associée au panneau et de l'aide destinée à l'utilisateur
+ bulle_aide=self.get_bulle_aide()
+ aide=self.get_aide()
+ aide= justify_text(texte=aide)
+ # Remplissage du panneau
+ self.frame_valeur = Frame(page)
+ self.frame_valeur.pack(fill='both',expand=1)
+ self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+ self.label = Label(self.frame_valeur,text='Complexe de la forme : a+bj')
+ self.label1 = Label(self.frame_valeur,text='Imaginaire')
+ self.label2 = Label(self.frame_valeur,text='Phase')
+ self.label3 = Label(self.frame_valeur,text='OU')
+ self.label.place (relx=0.15,rely=0.1)
+ self.label1.place(relx=0.6,rely=0.50)
+ self.label2.place(relx=0.6,rely=0.57)
+ self.label3.place(relx=0.15,rely=0.4)
+ self.typ_cplx=StringVar()
+ self.typ_cplx.set('RI')
+ rb1 = Radiobutton(self.frame_valeur, text='RI : Réel',variable=self.typ_cplx,value='RI')
+ rb2 = Radiobutton(self.frame_valeur, text='MP : Module',variable=self.typ_cplx,value='MP')
+ rb1.place(relx=0.15,rely = 0.50)
+ rb2.place(relx=0.15,rely = 0.57)
+ self.entry1 = Pmw.EntryField(self.frame_valeur,validate='real')
+ self.entry2 = Pmw.EntryField(self.frame_valeur,validate='real')
+ self.entry3 = Pmw.EntryField(self.frame_valeur)
+ self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus())
+ self.entry1.component('entry').bind("<KP_Enter>",lambda e,s=self:s.entry2.component('entry').focus())
+ self.entry2.component('entry').bind("<Return>",lambda e,c=self.valid_valeur:c())
+ self.entry2.component('entry').bind("<KP_Enter>",lambda e,c=self.valid_valeur:c())
+ self.entry3.component('entry').bind("<Return>",lambda e,c=self.valid_complexe:c())
+ self.entry3.component('entry').bind("<KP_Enter>",lambda e,c=self.valid_complexe:c())
+ self.entry1.place(relx=0.15,rely = 0.65,relwidth=0.35)
+ self.entry2.place(relx=0.60,rely = 0.65,relwidth=0.35)
+ self.entry3.place(relx=0.15,rely = 0.20,relwidth=0.60)
+ self.entry1.focus()
+ self.bouton_val=Button(self.frame_valeur,text="Valider",command=self.valider,width=14)
+ self.bouton_val.place(relx=0.4,rely=0.8)
+ 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.9,anchor='n')
+ # affichage de la valeur du MCS
+ self.display_valeur()
+
+ def valider(self):
+ if ((self.entry3.get() != None) and (self.entry3.get() != "" )):
+ self.erase_valeur()
+ self.valid_complexe()
+ else :
+ self.valid_valeur()
+
+
+ def display_valeur(self):
+ """
+ Affiche la valeur de l'objet pointé par self
+ """
+ valeur = self.node.item.get_valeur()
+ if valeur == None or valeur == '' : return # pas de valeur à afficher ...
+ self.entry1.delete(0,END)
+ self.entry2.delete(0,END)
+ self.entry3.delete(0,END)
+ if type(valeur) not in (types.ListType,types.TupleType) :
+ self.display_complexe()
+ else:
+ typ_cplx,x1,x2=valeur
+ self.typ_cplx.set(typ_cplx)
+ self.entry1.setentry(x1)
+ self.entry2.setentry(x2)
+
+ def display_complexe(self):
+ valeur = self.node.item.get_valeur()
+ self.entry3.setentry(valeur)
+
+ def get_bulle_aide(self):
+ """
+ Retourne la bulle d'aide du panneau
+ """
+ return """-Choisissez votre format de saisie du complexe :
+ \t 'RI' = parties réelle et imaginaire
+ \t 'MP' = module/phase (en degrés)
+ - Saisissez ensuite dans les deux zones de saisie les deux nombres attendus"""
+
+ def get_aide(self):
+ """
+ Retourne la phrase d'aide décrivant le type de la valeur que peut prendre
+ le mot-clé simple courant
+ """
+ commentaire='Un complexe est attendu'
+ aideval=self.node.item.aide()
+ commentaire=commentaire +"\n"+ aideval
+ return commentaire
+
+ def get_valeur(self):
+ """
+ Retourne le complexe saisi par l'utilisateur
+ """
+ l=[]
+ l.append(self.typ_cplx.get())
+ try :
+ l.append(string.atof(self.entry1.get()))
+ l.append(string.atof(self.entry2.get()))
+ except :
+ return None
+ return `tuple(l)`
+
+ def erase_valeur(self):
+ """
+ Efface les entries de saisie
+ """
+ self.typ_cplx.set('RI')
+ self.entry1.delete(0,END)
+ self.entry2.delete(0,END)
+
+ def valid_complexe(self):
+ valeurentree=self.entry3.get()
+ self.valid_valeur(valeurentree=valeurentree)
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from uniquepanel import UNIQUE_Panel
+
+class UNIQUE_INTO_Panel(UNIQUE_Panel):
+ """
+ Classe définissant le panel associé aux mots-clés qui demandent
+ à l'utilisateur de choisir une seule valeur parmi une liste de valeurs
+ discrètes
+ """
+ def makeValeurPage(self,page):
+ """
+ Génère la page de saisie d'une seule valeur parmi un ensemble
+ discret de possibles
+ """
+ # récupération de la bulle d'aide et de l'objet mc
+ bulle_aide=self.get_bulle_aide()
+ objet_mc = self.node.item.get_definition()
+ # remplissage du panel
+ self.frame_valeur = Frame(page)
+ self.frame_valeur.pack(fill='both',expand=1)
+ self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide :
+ s.parent.appli.affiche_aide(e,a))
+ self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+ #l_choix=list(objet_mc.into)
+ #l_choix.sort()
+ l_choix=self.node.item.get_liste_possible([])
+ self.label = Label(self.frame_valeur,text='Choisir une valeur :')
+ self.label.pack(side='top')
+ self.frame = Frame(page)
+ self.frame.place(relx=0.33,rely=0.2,relwidth=0.33,relheight=0.6)
+
+
+ liste_commandes = (("<Button-1>",self.selectChoix),
+ ("<Button-3>",self.deselectChoix),
+ ("<Double-Button-1>",self.record_valeur))
+ self.Liste_choix = ListeChoix(self,self.frame,l_choix,
+ liste_commandes = liste_commandes,
+ titre="Valeurs possibles",optionReturn="oui")
+ self.Liste_choix.affiche_liste()
+ self.bouton_val = Button(self.frame_valeur,
+ text = "Valider",
+ command=self.record_valeur_ligne,
+ width=14)
+ self.bouton_val.place(relx=0.33,rely=0.85)
+
+ def record_valeur_ligne(self):
+ valeur=self.Liste_choix.arg_selected
+ self.record_valeur(valeur)
+
+ def get_bulle_aide(self):
+ """
+ Retourne la bulle d'aide affectée au panneau courant (affichée par clic droit)
+ """
+ return """Double-cliquez sur la valeur désirée
+ pour valoriser le mot-clé simple courant"""
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from newsimppanel import newSIMPPanel
+
+
+class UNIQUE_Panel(newSIMPPanel):
+ """
+ Classe virtuelle servant de classe mère à toutes celles définissant un panneau
+ permettant l'affichage et la saisie d'une valeur unique pour le mot-clé simple
+ """
+
+ def erase_valeur(self):
+ """
+ Efface l'entry de saisie
+ """
+ self.entry.delete(0,END)
+
+ def get_valeur(self):
+ """
+ Retourne la valeur donnée par l'utilisateur
+ """
+ return self.entry.get()
+
+
+ def valid_valeur(self,valeurentree=None):
+ """
+ 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()
+ anc_val = self.node.item.get_valeur()
+ if valeurentree== None :
+ valeurentree = self.get_valeur()
+ valeur,validite=self.node.item.eval_valeur(valeurentree)
+ if not validite :
+ commentaire = "impossible d'évaluer : %s " %`valeurentree`
+ self.display_valeur()
+ self.parent.appli.affiche_infos(commentaire)
+ return
+
+ test = self.node.item.set_valeur(valeur)
+ if test :
+ self.set_valeur_texte(str(valeurentree))
+
+ if not test :
+ mess = "impossible d'évaluer : %s " %`valeur`
+ self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée : "+mess)
+ elif self.node.item.isvalid() :
+ self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+ else :
+ cr = self.node.item.get_cr()
+ mess = "Valeur du mot-clé non autorisée "+cr.get_mess_fatal()
+ self.reset_old_valeur(anc_val,mess=mess)
+
+ self.display_valeur()
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from uniqueassdpanel import UNIQUE_ASSD_Panel
+
+
+class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
+ """
+ Classe servant à définir le panneau correspondant à un mot-clé simple
+ qui attend une valeur unique de type dérivé d'ASSD ou non encore
+ existante (type CO(...) utilisé dans les macros uniquement)
+ """
+ def makeValeurPage(self,page):
+ """
+ Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une SD de type dérivé
+ d'ASSD
+ """
+ # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
+ # et de la liste des SD du bon type (constituant la liste des choix)
+ bulle_aide=self.get_bulle_aide()
+ aide=self.get_aide()
+ aide= justify_text(texte=aide)
+ liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
+ # Remplissage du panneau
+ self.frame_valeur = Frame(page)
+ self.frame_valeur.pack(fill='both',expand=1)
+ self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+ self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+ # affichage de la liste des SD existantes et du bon type
+ self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
+ items=liste_noms_sd,
+ labelpos='n',
+ label_text="Structures de données du type\n requis par l'objet courant :",
+ listbox_height = 6,
+ selectioncommand=self.select_valeur_from_list,
+ dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
+ self.listbox.component("listbox").bind("<Return>",lambda e,s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
+ if liste_noms_sd != [] :
+ self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
+ self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ", items = ('NON','OUI'),
+ menubutton_width=10)
+ else :
+ self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ", items = ('OUI',),
+ menubutton_width=10)
+ # affichage du bouton 'Nouveau concept'
+ self.b_co.configure(command = self.ask_new_concept)
+ if liste_noms_sd != [] :
+ self.b_co.place(relx=0.05,rely=0.6,anchor='w')
+ else :
+ self.b_co.place(relx=0.05,rely=0.3,anchor='w')
+ self.label_co = Label(self.frame_valeur,text='Nom du nouveau concept :')
+ self.entry_co = Entry(self.frame_valeur)
+ self.entry_co.bind('<Return>',self.valid_nom_concept_co)
+ self.entry_co.bind('<KP_Enter>',self.valid_nom_concept_co)
+ # affichage du label de la structure de donnée choisie
+ 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.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.but_val = Button(self.fr_but,text = "Valider",command= self.valid_nom_concept_co)
+ self.but_val.pack(side='right',padx=5, pady=5)
+
+ # affichage de la valeur courante
+ self.display_valeur()
+ if liste_noms_sd == [] :
+ self.b_co.invoke('OUI')
+
+ def get_bulle_aide(self):
+ """
+ Retourne la bulle d'aide du panneau
+ """
+ return """Double-cliquez sur la structure de donnée désirée
+ 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()
+ #print "valid_valeur",valeur
+
+ self.erase_valeur()
+ anc_val = self.node.item.get_valeur()
+ test_CO=self.node.item.is_CO(anc_val)
+ #PN essai pour bug dans MACRO_PROJ_BASE
+ valeur,validite=self.node.item.eval_valeur(valeur)
+ 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
+ #PN essai pour bug dans MACRO_PROJ_BASE
+ #elif self.node.item.isvalid() :
+ elif validite:
+ 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.reset_old_valeur(anc_val,mess=mess)
+ return
+
+ 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
+ """
+ #print "valid_nom_concept_co"
+ if self.parent.modified == 'n' : self.parent.init_modif()
+ anc_val = self.node.item.get_valeur()
+ if anc_val != None:
+ # 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()
+ nom_concept = self.entry_co.get()
+ #print "valid_nom_concept_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.reset_old_valeur(anc_val,mess=mess)
+ return
+
+ def ask_new_concept(self,tag):
+ """
+ Crée une entry dans le panneau d'un MCS qui attend un concept OU un CO() afin de
+ permettre à l'utilisateur de donner le nom du nouveau concept
+ """
+ new_concept = self.b_co.getcurselection()
+ if new_concept == 'OUI':
+ self.label_co.place(relx=0.05,rely=0.7)
+ self.entry_co.place(relx=0.45,rely=0.7,relwidth=0.25)
+ self.l_resu.place_forget()
+ self.label_valeur.place_forget()
+ self.entry_co.focus()
+ elif new_concept == 'NON':
+ # On est passe de OUI à NON, on supprime la valeur
+# PN correction de bug (on passe de non a non et cela supprime la valeur)
+# ajout du if de le ligne suivane
+ if self.node.item.is_CO():
+ 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)
+ self.label_valeur.place(relx=0.45,rely=0.7)
+
+ def display_valeur(self):
+ """
+ Affiche la valeur de l'objet pointé par self
+ """
+ valeur = self.node.item.get_valeur()
+ #print "display_valeur",valeur
+ 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 self.node.item.is_CO():
+ #print "display_valeur.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.isvalid():
+ self.node.parent.select()
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+# 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.
+#
+#
+# ======================================================================
+# ----------------------------------------------------------
+# Cette classe sert à définir les widgets utilisés par
+# EFICAS
+# ----------------------------------------------------------
+
+import Tkinter
+from Tkinter import *
+import Pmw
+import os,sys,re,string
+import types,fnmatch
+import traceback
+from tkFileDialog import *
+from tkMessageBox import showinfo,askyesno,showerror,askretrycancel
+
+from InterfaceTK import fontes
+from Aster import prefs
+from Editeur.utils import save_in_file
+from centerwindow import centerwindow
+
+from Noyau.N_utils import repr_float
+from Accas import AsException
+
+# Surcharge de la fonction askyesno qui retourne un resultat errone en Python 2.3 avec Tk 8.4
+# et Tkinter.wantobject==1
+import tkMessageBox
+def askyesno(title=None, message=None, **options):
+ "Ask a question; return true if the answer is yes"
+ s = tkMessageBox._show(title, message, tkMessageBox.QUESTION, tkMessageBox.YESNO, **options)
+ if s == tkMessageBox.YES:return 1
+ if s == tkMessageBox.NO:return 0
+ if s:return 1
+ return 0
+
+
+class Fenetre :
+ """ Cette classe permet de créer une fenêtre Toplevel dans laquelle
+ on peut afficher un texte et qui permet de le sauver"""
+ def __init__(self,appli,titre="",texte="",wrap=WORD,width=100,height=30):
+ self.appli=appli
+ if self.appli.test==1 : return
+ self.fenetre = Toplevel()
+ self.fenetre.withdraw()
+ #self.fenetre.configure(width = 800,height=500)
+ self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+ self.fenetre.title("Visualisation du "+titre)
+ self.texte = string.replace(texte,'\r\n','\n')
+ self.titre = titre
+ fonte=fontes.standardcourier10
+ # définition des frames
+ self.frame_texte = Frame(self.fenetre)
+ self.frame_boutons = Frame(self.fenetre)
+ #self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.9)
+ #self.frame_boutons.place(relheight=0.1,relx=0,rely=0.9,relwidth=1.)
+ # définition de la zone texte et du scrollbar
+ self.zone_texte = Text(self.frame_texte,font=fonte,wrap=wrap,
+ height=height,width=width)
+ self.zone_texte.bind("<Key-Prior>", self.page_up)
+ self.zone_texte.bind("<Key-Next>", self.page_down)
+ self.zone_texte.bind("<Key-Up>", self.unit_up)
+ self.zone_texte.bind("<Key-Down>", self.unit_down)
+ self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
+ #self.scroll_h = Scrollbar (self.frame_texte,command = self.zone_texte.xview)
+ self.scroll_v.pack(side='right',fill ='y')
+ #self.scroll_h.pack(side='bottom',fill ='x')
+ self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
+ self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
+ # définition des boutons
+ self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit,
+ default='active')
+ self.but_save = Button(self.frame_boutons,text = "Sauver",command = self.save)
+ #self.but_quit.place(relx=0.4,rely=0.5,anchor='center')
+ #self.but_save.place(relx=0.6,rely=0.5,anchor='center')
+ self.but_quit.pack(side='left',padx=25, pady=5)
+ self.but_save.pack(side='right',padx=25, pady=5)
+ self.frame_texte.pack(side='top',fill='both',expand=1)
+ self.frame_boutons.pack(side='bottom')
+ self.zone_texte.focus_set()
+ self.fenetre.bind('<Return>',self.quit) #dismiss window
+
+ # affichage du texte
+ self.affiche_texte(self.texte)
+ self.zone_texte.config(state=DISABLED)
+ centerwindow(self.fenetre)
+ self.fenetre.deiconify()
+
+ def page_up(self,event):
+ event.widget.yview_scroll(-1, "page")
+ return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
+ def page_down(self,event):
+ event.widget.yview_scroll(1, "page")
+ return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
+ def unit_up(self,event):
+ event.widget.yview_scroll(-1, "unit")
+ return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
+ def unit_down(self,event):
+ event.widget.yview_scroll(1, "unit")
+ return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
+
+ def wait(self):
+ self.fenetre.grab_set()
+ self.zone_texte.focus_set()
+ self.fenetre.wait_window(self.fenetre)
+
+ def quit(self,event=None):
+ self.fenetre.destroy()
+ return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
+
+ def efface_scroll(self):
+ """ Efface le scroll lorsqu'il n'est pas nécessaire : ne marche pas"""
+ self.scroll_v.pack_forget()
+ #self.scroll_h.pack_forget()
+
+ def affiche_texte(self,texte):
+ """ Affiche le texte dans la fenêtre """
+ if texte != "" :
+ self.zone_texte.insert(END,texte)
+ try:
+ self.fenetre.update_idletasks()
+ x0,y0,x1,y1 = self.zone_texte.bbox(END)
+ if (y1-y0) < 300 : self.efface_scroll()
+ except:
+ pass
+
+ def save(self):
+ """ Permet de sauvegarder le texte dans un fichier dont on a demandé le nom
+ à l'utilisateur """
+ file = asksaveasfilename(parent=self.fenetre,defaultextension = '.comm',
+ #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,None) :
+ showerror("Sauvegarde impossible",
+ "Impossible de sauvegarder le texte dans le fichier spécifié\n"+
+ "Vérifiez les droits d'écriture",parent=self.fenetre)
+ else:
+ showinfo("Sauvegarde effectuée","Sauvegarde effectuée dans le fichier %s" %file,parent=self.fenetre)
+
+ def destroy(self):
+ try :
+ self.fenetre.destroy()
+ except :
+ pass
+
+class FenetreSurLigneWarning(Fenetre):
+
+ def affiche_texte(self,texte):
+ """ Affiche le texte dans la fenêtre """
+ ligne=0
+ if texte != "" :
+ texte_cr=texte.splitlines()
+ for l in texte_cr:
+ ligne=ligne+1
+ l=l+"\n"
+ self.zone_texte.insert(END,l)
+ if (l.find("WARNING") > -1) or (l.find("ERROR") > -1) :
+ self.zone_texte.tag_add( "Rouge", str(ligne)+".0", "end-1c" )
+ self.zone_texte.tag_config("Rouge", foreground='red')
+ try:
+ self.fenetre.update_idletasks()
+ x0,y0,x1,y1 = self.zone_texte.bbox(END)
+ if (y1-y0) < 300 : self.efface_scroll()
+ except:
+ pass
+
+class FenetreYesNo(Fenetre):
+ def __init__(self,appli,titre="",texte="",yes="Yes",no="No"):
+ self.appli=appli
+ self.fenetre = Toplevel()
+ self.fenetre.configure(width = 800,height=500)
+ self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+ self.fenetre.title(titre)
+ self.texte = string.replace(texte,'\r\n','\n')
+ self.titre = titre
+ fonte=fontes.standardcourier10
+ # définition des frames
+ self.frame_texte = Frame(self.fenetre)
+ self.frame_boutons = Frame(self.fenetre)
+ self.frame_boutons.place(relx=0,rely=0, relwidth=1.,relheight=0.1)
+ self.frame_texte.place( relx=0,rely=0.1, relwidth=1, relheight=0.9)
+ # définition de la zone texte et du scrollbar
+ self.zone_texte = Text(self.frame_texte,font=fonte)
+ self.zone_texte.bind("<Key-Prior>", self.page_up)
+ self.zone_texte.bind("<Key-Next>", self.page_down)
+ self.zone_texte.bind("<Key-Up>", self.unit_up)
+ self.zone_texte.bind("<Key-Down>", self.unit_down)
+ self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
+ #self.scroll_h = Scrollbar (self.frame_texte,command = self.zone_texte.xview)
+ self.scroll_v.pack(side='right',fill ='y')
+ #self.scroll_h.pack(side='bottom',fill ='x')
+ self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
+ self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
+ # définition des boutons
+ self.but_yes = Button(self.frame_boutons,text = yes,command=self.yes)
+ self.but_no = Button(self.frame_boutons,text = no,command = self.no)
+ self.but_yes.place(relx=0.4,rely=0.5,anchor='center')
+ self.but_no.place(relx=0.6,rely=0.5,anchor='center')
+ # affichage du texte
+ self.affiche_texte(self.texte)
+ centerwindow(self.fenetre)
+
+ def yes(self):
+ self.result=1
+ self.quit()
+
+ def no(self):
+ self.result=0
+ self.quit()
+
+class FenetreDeSelection(Fenetre):
+ """ Classe dérivée de Fenêtre permettant la récupération d'une zone de texte sélectionnée.
+ Cette classe est utilisée pour affecter une liste de valeurs à un mot-clé.
+ """
+ def __init__(self,panel,item,appli,titre="",texte="",cardinal=1):
+ Fenetre.__init__(self,appli,titre=titre,texte=texte)
+ self.frame_boutons.place_forget()
+ self.frame_texte.place_forget()
+ self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.8)
+ self.frame_boutons.place(relheight=0.2,relx=0,rely=0.8,relwidth=1.)
+
+ self.cardinal=cardinal
+ self.fenetre.configure(width = 320,height=400)
+ centerwindow(self.fenetre)
+ self.panel = panel
+ self.item = item
+ self.fenetre.title(titre)
+ self.but_save.configure(text="Ajouter",command=self.traite_selection)
+ # séparateur par défaut
+ self.separateur = ';'
+ # création de la zone de saisie du séparateur
+ l_separateurs_autorises = self.get_separateurs_autorises()
+ self.choix_sep = Pmw.ComboBox(self.frame_boutons,
+ label_text = "Séparateur :",
+ labelpos = 'w',
+ listheight = 100,
+ selectioncommand = self.choose_separateur,
+ scrolledlist_items = l_separateurs_autorises)
+ self.choix_sep.component('entry').configure(width=6)
+ self.choix_sep.place(relx=0.01,rely=0.5,anchor='w')
+ self.choix_sep.selectitem(self.separateur)
+ # Replacement
+ self.but_quit.place_forget()
+ self.but_save.place_forget()
+ self.but_all = Button(self.frame_boutons,text = "Tout Sélectionner", command=self.tout)
+ self.but_save.place(relx=0.6,rely=0.6,anchor='center')
+ self.but_quit.place(relx=0.8,rely=0.6,anchor='center')
+ self.but_all.place(relx=0.7,rely=0.2,anchor='center')
+ self.choose_separateur('espace')
+
+
+ def get_separateurs_autorises(self):
+ """
+ Retourne la liste des séparateurs autorisés
+ """
+ return ['espace',';',',']
+
+ def choose_separateur(self,nom_sep):
+ """
+ Affecte à self.separateur le caractère séparateur correspondant à nom_sep
+ """
+ if nom_sep == 'espace' :
+ self.separateur = ' '
+ else:
+ self.separateur = nom_sep
+
+ def tout(self):
+ liste=[]
+ texte=self.texte.splitlines()
+ for l in texte :
+ for mot in string.split(l,self.separateur):
+ if mot != '' and mot != ' ' and mot != self.separateur :
+ liste.append(mot)
+ self.traite_selection(liste)
+
+ def traite_selection(self,liste=None):
+ """ Cette méthode effectue tous les traitements nécessaires pour vérifier
+ et affecter la liste de valeurs à l'objet réprésenté par self.item
+ """
+ # Récupère la liste des chaines de caractères de la zone sélectionnée
+ message=""
+ if liste == None:
+ message,liste = self.recupere_liste()
+ if self.test_probleme(message,"Sélectionnez des données") == 0:
+ return
+ # Vérifie que le nombre de données est dans les limites attendues
+ message = self.verif_liste(liste)
+ if self.test_probleme(message,"Vérifiez le nombre de données") == 0:
+ return
+ # Crée une liste de valeurs du type attendu
+ message,liste_valeurs = self.creation_liste_valeurs(liste)
+ if self.test_probleme(message,"Vérifiez le type des données") == 0:
+ return
+ # Vérifie que chaque valeur est dans le domaine exigé
+ message = self.verif_valeurs(liste_valeurs)
+ if self.test_probleme(message,"Vérifiez le domaine des valeurs") == 0:
+ return
+ # Ajoute les valeurs dans la liste de valeurs du mot-clé
+ if self.cardinal != 1 :
+ nb=self.cardinal
+ l_valeurs=[]
+ # a ameliorer
+ if (len(liste_valeurs)%nb != 0):
+ message="La cardinalité n'est pas correcte"
+ self.test_probleme(message,"On attend des tuples")
+ return
+ for i in range(len(liste_valeurs)/nb) :
+ if (nb==2):
+ t=(liste_valeurs[i*nb], liste_valeurs[i*nb+1])
+ elif (nb ==3):
+ t=(liste_valeurs[i*nb], liste_valeurs[i*nb+1], liste_valeurs[i*nb+2])
+ else :
+ print "probleme : prevenir la maintenance Eficas"
+ return
+ l_valeurs.append(t)
+ liste_valeurs=l_valeurs
+ self.ajouter_valeurs(liste_valeurs)
+ self.appli.affiche_infos("Liste de valeurs acceptée")
+
+ def test_probleme(self, message, message_eficas):
+ """ Cette méthode affiche un message d'erreur si message != ''
+ et retourne 0, sinon retourne 1 sans rien afficher.
+ """
+ if message != "":
+ showinfo("Problème",message,parent=self.fenetre)
+ self.fenetre.tkraise()
+ self.appli.affiche_infos(message_eficas)
+ return 0
+ else:
+ return 1
+
+ def recupere_liste(self):
+ """ Cette méthode récupère le texte de la zone sélectionnée, construit et
+ retourne une liste avec les chaines qui se trouvent entre les séparateurs.
+ S'il n'y a pas de données selectionnées, elle retourne un message d'erreur
+ et une liste vide.
+ """
+ message = ""
+ try:
+ selection=self.fenetre.selection_get()
+ except:
+ message = "Pas de donnée sélectionnée"
+ return message,None
+ # les retours chariots doivent être interprétés comme des séparateurs
+ selection = string.replace(selection,'\n',self.separateur)
+ # on splitte la sélection suivant le caractère séparateur
+ liste_chaines = string.split(selection,self.separateur)
+ l_chaines = []
+ for chaine in liste_chaines:
+ chaine = string.strip(chaine)
+ if chaine != '' : l_chaines.append(chaine)
+ return message,l_chaines
+
+ def verif_liste(self, liste):
+ """ Cette méthode effectue des tests sur le nombre d'éléments de la liste
+ et retourne 1 si la liste est correcte, sinon 0 et le message d'erreur
+ correspondant.
+ """
+ message = ""
+ # nombre d'éléments sélectionnés
+ nombre_elements = len(liste)
+ # nombre d'éléments déja dans la liste du panel
+ nombre_in_liste = len(self.panel.Liste_valeurs.get_liste())
+ multiplicite = self.item.GetMultiplicite()
+ if (nombre_elements % multiplicite) != 0:
+ message = "Vous devez sélectionner "+str(multiplicite)+" * n données"
+ return message
+ nombre_valeurs = nombre_elements / multiplicite
+ cardinalite = self.item.GetMinMax()
+ if nombre_valeurs < cardinalite[0]:
+ message = "Vous devez sélectionner au moins "+str(cardinalite[0])+" valeurs"
+ return message
+ if cardinalite[1] != "**" and nombre_valeurs > (long(cardinalite[1])-nombre_in_liste):
+ message = "La liste ne peut avoir plus de "+str(cardinalite[1])+" valeurs"
+ return message
+
+ return message
+
+ def creation_liste_valeurs(self, liste):
+ """ Cette méthode crée et retourne une liste de valeurs du type attendu
+ par le mot-clé. La liste de valeurs est créée à partir de la liste
+ de chaines de caractères transmise.
+ """
+ type_attendu = self.item.GetType()[0]
+ if type_attendu == 'R':
+ return self.convertir(liste, f_conversion= float)
+ elif type_attendu == 'I':
+ return self.convertir(liste, f_conversion= int)
+ elif type_attendu == 'TXM':
+ return self.convertir(liste)
+ else:
+ message = "Seuls les entiers, les réels et les chaines de caractères sont convertis"
+ return message,None
+
+ def convertir(self, liste, f_conversion=None):
+ """ Cette méthode essaie de convertir les éléments de la liste avec la
+ fonction f_conversion si elle existe, et retourne la liste des
+ éléments dans le type voulu en cas de succès, sinon retourne None.
+ """
+ liste_valeurs = []
+ message = ""
+ for chaine in liste:
+ if f_conversion:
+ try:
+ liste_valeurs.append(f_conversion(chaine))
+ except:
+ message = "Impossible de convertir "+chaine+" dans le type attendu"
+ return message,None
+ else:
+ liste_valeurs.append(chaine)
+ return message,liste_valeurs
+
+ def verif_valeurs(self, liste_valeurs):
+ """ Cette méthode teste la validité de tous les éléments de la liste,
+ retourne un message vide s'ils sont valides
+ ou un message non vide au premier élément non valide rencontré
+ """
+ message = ""
+ for valeur in liste_valeurs:
+ test,message = self.item.object.verif_type(valeur)
+ if test == 0: return message
+ return message
+
+ def ajouter_valeurs(self, liste_valeurs):
+ """ Cette méthode ajoute les nouvelles valeurs à la liste existante."""
+ liste = self.panel.Liste_valeurs.get_liste()
+ liste.extend(liste_valeurs)
+ self.panel.Liste_valeurs.put_liste(liste)
+
+class FenetreDeParametre(Fenetre) :
+ def __init__(self,parent,item,appli,texte):
+ self.parent=parent
+ self.appli=appli
+ self.fenetre = Toplevel()
+ self.fenetre.configure(width = 250,height=100)
+ self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+ self.fenetre.title("Parametres")
+ self.titre = "Parametres"
+ self.texte = string.replace(texte,'\r\n','\n')
+ fonte=fontes.standardcourier10
+
+ # définition des frames
+ self.frame_texte = Frame(self.fenetre)
+ self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.7)
+ # définition de la zone texte et du scrollbar
+ self.zone_texte = Text(self.frame_texte,font=fonte)
+ self.zone_texte.bind("<Key-Prior>", self.page_up)
+ self.zone_texte.bind("<Key-Next>", self.page_down)
+ self.zone_texte.bind("<Key-Up>", self.unit_up)
+ self.zone_texte.bind("<Key-Down>", self.unit_down)
+ self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
+ self.scroll_v.pack(side='right',fill ='y')
+ self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
+ self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
+ # affichage du texte
+ self.affiche_texte(self.texte)
+ self.zone_texte.config(state="disabled")
+
+ # définition des boutons
+ self.frame_boutons = Frame(self.fenetre)
+ self.frame_boutons.place(relheight=0.3,relx=0,rely=0.65,relwidth=1.)
+ self.label1 = Label(self.frame_boutons,text="surligner la")
+ self.label2 = Label(self.frame_boutons,text="ligne entière")
+ self.label1.place(relx=0.1,rely=0)
+ self.label2.place(relx=0.1,rely=0.5)
+ self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit)
+ self.but_save = Button(self.frame_boutons,text = "Choisir",command = self.Choisir)
+ self.but_save.place(relx=0.6,rely=0,relheight=1)
+ self.but_quit.place(relx=0.8,rely=0,relheight=1)
+
+
+ def Choisir(self):
+ try:
+ selection=self.zone_texte.selection_get()
+ except:
+ showerror("Pas de donnée sélectionnée",
+ "Selectionner un parametre")
+ l_param = ""
+ for param in selection.splitlines():
+ nomparam=param[0:param.find("=")-1]
+ if nomparam != '' :
+ l_param=l_param+nomparam+','
+ self.parent.entry.delete(0,Tkinter.END)
+ self.parent.entry.insert(0,l_param[0:-1])
+ self.parent.valid_valeur()
+ self.quit()
+
+class Formulaire:
+ """
+ Cette classe permet de créer une boîte Dialog dans laquelle
+ on affiche un formulaire à remplir par l'utilisateur
+ """
+ def __init__(self,fen_pere,obj_pere=None,titre="",texte="",items=(),mode='query',commande=None):
+ self.resultat=0
+ if items in ((),[]) : return
+ self.items = items
+ self.titre = titre
+ self.texte = texte
+ self.fen_pere = fen_pere
+ self.obj_pere = obj_pere
+ self.mode= mode
+ self.command = commande
+ self.display()
+
+ def display(self):
+ self.init_validateurs()
+ self.init_fenetre()
+ self.init_texte()
+ self.init_items_formulaire()
+ self.fenetre.activate(geometry='centerscreenalways')
+
+ def init_validateurs(self):
+ """
+ Crée le dictionnaire des validateurs des objets reconnus par le formulaire
+ """
+ self.d_validateurs = {}
+ self.d_validateurs['rep'] = self.repvalidator
+ self.d_validateurs['file'] = self.filevalidator
+ self.d_validateurs['cata']= self.catavalidator
+ self.d_validateurs['mot']= self.motvalidator
+ self.d_validateurs['mot2']= self.mot2validator
+ self.d_validateurs['mot3']= self.mot3validator
+ self.d_validateurs['mot4']= self.mot4validator
+
+ def init_fenetre(self):
+ """
+ Crée la fenêtre Dialog
+ """
+ if self.mode == 'query':
+ buttons=('Valider','Annuler')
+ defaultbutton = 'Valider'
+ elif self.mode == 'display':
+ if self.command :
+ buttons=(self.command[0],'OK')
+ defaultbutton = 'OK'
+ else:
+ buttons=('OK')
+ defaultbutton = 'OK'
+ self.fenetre = Pmw.Dialog(self.fen_pere,
+ buttons=buttons,
+ defaultbutton = defaultbutton,
+ title = self.titre,
+ command = self.execute)
+ self.fenetre.withdraw()
+
+ def init_texte(self):
+ """
+ Crée le label qui affiche le texte à l'intérieur du panneau
+ """
+ fonte=fontes.standard
+ fr_texte = Frame(self.fenetre.interior(),height=60)
+ fr_texte.pack(side='top',fill='x',expand=1)
+ Label(fr_texte,text = self.texte, font=fonte).place(relx=0.5,rely=0.5,anchor='center')
+
+ def init_items_formulaire(self):
+ """
+ Crée et affiche les items dans la boîte de dialogue
+ """
+ self.radiobut = 0
+ self.widgets = []
+ self.item_widgets = {}
+ length_maxi = 0
+ for item in self.items:
+ if len(item[0])>length_maxi : length_maxi = len(item[0])
+ window = self.fenetre.interior()
+ for item in self.items :
+ if len(item) == 4 :
+ label,nature,nom_var,defaut = item
+ chaine="Yes"
+ chaine2="No"
+ else :
+ label,nature,nom_var,defaut,chaine,chaine2 = item
+
+ # création de la frame
+ fr_item = Frame(window,height=40,width=700)
+ fr_item.pack(side='top',fill='x',expand=1)
+ # création du label
+ Label(fr_item,text = label).place(relx=0.05,rely=0.4)
+ if nature in ('rep','file','cata','mot','mot2','mot3','mot4'):
+ # création de l'entry
+ e_item = Entry(fr_item)
+ e_item.place(relx=0.5,rely=0.4,relwidth=0.45)
+ self.widgets.append(e_item)
+ self.item_widgets[item] = e_item
+ if defaut : e_item.insert(0,str(defaut))
+ elif nature == 'YesNo':
+ # création de la StringVar
+ var = StringVar()
+ setattr(self,'item_'+nom_var,var)
+ var.set(defaut)
+ # création du radiobouton
+ rb1 = Radiobutton(fr_item,text=chaine,variable=var,value='OUI')
+ rb2 = Radiobutton(fr_item,text=chaine2,variable=var,value='NON')
+ rb1.place(relx=0.65,rely=0.5,anchor='center')
+ rb2.place(relx=0.80,rely=0.5,anchor='center')
+ self.widgets.append((rb1,rb2))
+ self.item_widgets[item] = var
+ # détermination de la méthode à appliquer sur les boutons
+ if self.mode == 'query':
+ function = self.active
+ elif self.mode == 'display':
+ function = self.inactive
+ else:
+ return
+ # on applique la méthode sur les boutons (activation ou désactivation)
+ for widget in self.widgets :
+ if type(widget) == types.TupleType:
+ for widg in widget :
+ apply(function,(widg,),{})
+ else:
+ apply(function,(widget,),{})
+
+ def active(self,widget):
+ """
+ Active le widget passé en argument
+ """
+ widget.configure(state='normal',bg='white')
+
+ def inactive(self,widget):
+ """
+ Inactive le widget passé en argument
+ """
+ if not isinstance(widget,Radiobutton) :
+ widget.configure(state='disabled',bg='gray95')
+ else :
+ widget.configure(state='disabled')
+
+# --------------------------------------------------------------------------------
+# Validateurs des noms de répertoire, de fichiers et de catalogues
+# -------------------------------------------------------------------------------
+
+ def motvalidator(self,text):
+ text2="("+text+")"
+ return self.motlongueurvalidator(text2,1)
+
+ def mot2validator(self,text):
+ return self.motlongueurvalidator(text,2)
+
+ def mot3validator(self,text):
+ return self.motlongueurvalidator(text,3)
+
+ def mot4validator(self,text):
+ return self.motlongueurvalidator(text,4)
+
+ def motlongueurvalidator(self,text,longueur):
+ try :
+ if ((text[0] != "(") or (text[-1] != ")")) : return 0
+ if len(text.split(",")) != longueur : return 0
+ return 1
+ except :
+ return 0
+
+ def repvalidator(self,text):
+ """
+ Teste si text peut faire référence à un répertoire ou non
+ Retourne 1 si valide, 0 sinon
+ """
+ return os.path.isdir(text),'Répertoire introuvable : %s' %text
+
+ def filevalidator(self,text):
+ """
+ Teste si text peut faire référence à un fichier ou non
+ Retourne 1 si valide, 0 sinon
+ """
+ return os.path.isfile(text),'Fichier introuvable : %s' %text
+
+ def catavalidator(self,text):
+ """
+ Teste si text est un chemin d'accès valide à un catalogue
+ Retourne 1 si valide, 0 sinon
+ """
+ return os.path.isfile(text),"Catalogue introuvable : %s" %text
+
+# --------------------------------------------------------------------------------
+# Méthodes callbacks des boutons et de fin
+# --------------------------------------------------------------------------------
+
+ def execute(self,txt):
+ """
+ Cette commande est activée à chaque clic sur un bouton.
+ Redirige l'action sur la bonne méthode en fonction du bouton activé
+ """
+ if txt == 'Valider':
+ self.fini()
+ elif txt in ('OK','Annuler'):
+ self.quit()
+ elif txt == 'Modifier':
+ self.resultat = apply(self.command[1],(),{})
+ self.fenetre.destroy()
+ else :
+ print "Nom de bouton inconnu"
+ self.quit()
+
+ def fini(self):
+ """
+ Commande qui termine le panneau et sauvegarde les nouvelles options
+ dans l'objet resultat (dictionnaire)
+ """
+ dico={}
+ for item,widget in self.item_widgets.items():
+ nom_var = item[2]
+ type_var = item[1]
+ valeur = widget.get()
+ if self.d_validateurs.has_key(type_var):
+ test = self.d_validateurs[type_var](valeur)
+ if not test :
+ # une entrée n'est pas valide --> on la met en surbrillance et on quitte la méthode
+ # sans tuer la fenêtre bien sûr
+ widget.selection_range(0,END)
+ return
+ dico[nom_var] = valeur
+ self.fenetre.destroy()
+ self.resultat=dico
+
+ def quit(self):
+ self.fenetre.destroy()
+ self.resultat=None
+
+class ListeChoix :
+ """ Cette classe est utilisée pour afficher une liste de choix passée en paramètre
+ en passant les commandes à lancer suivant différents bindings """
+ def __init__(self,parent,page,liste,liste_commandes=[],liste_marques =[],active ='oui',filtre='non',titre='',
+ optionReturn=None, fonte_titre=fontes.standard_gras_souligne):
+ self.parent = parent
+ self.page = page
+ self.liste = liste
+ self.dico_labels={}
+ self.dico_mots={}
+ self.nBlabel = 0
+ self.dico_place={}
+ self.dico_mots={}
+ 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.optionReturn = optionReturn
+ self.fonte_titre=fonte_titre
+ self.init()
+
+ def init(self):
+ self.make_label_titre()
+ self.make_entry_filtre()
+ self.make_text_box()
+ try:
+ self.entry.component('entry').focus()
+ except:
+ pass
+
+ def make_label_titre(self):
+ """ Crée le label correspondant au titre """
+ if self.titre == '' : return
+ self.label = Label(self.page,
+ text = self.titre,
+ font = self.fonte_titre)
+ self.label.pack(side='top',pady=2)
+
+ def make_entry_filtre(self):
+ """ Crée l'entry permettant à l'utilisateur d'entrer un filtre de sélection dans la liste """
+ if self.filtre != 'oui' : return
+ self.entry = Pmw.EntryField(self.page,labelpos='w',
+ label_text="Filtre :",
+ command=self.entry_changed)
+ self.entry.pack(side='top',pady=2)
+
+ def make_text_box(self):
+ """ Crée la fenêtre texte dans laquelle sera affichée la liste """
+ self.MCbox = Text (self.page,relief='sunken',bg='gray95',bd=2)
+ self.MCscroll = Scrollbar (self.page,command = self.MCbox.yview)
+ self.MCscroll.pack(side='right',fill ='y',pady=2)
+ self.MCbox.pack(fill='y',expand=1,padx=2,pady=2)
+ self.MCbox.configure(yscrollcommand=self.MCscroll.set)
+
+
+ def affiche_liste(self):
+ """ Affiche la liste dans la fenêtre"""
+ liste_labels=[]
+ self.MCbox.config(state=NORMAL)
+ self.MCbox.delete(1.0,END)
+ self.nBlabel = 0
+ self.dico_place={}
+ for objet in self.liste :
+ if type(objet) == types.InstanceType:
+ try:
+ mot = objet.nom
+ except:
+ mot = str(objet)
+ elif type(objet) in (types.StringType,types.IntType):
+ mot = objet
+ elif type(objet) == types.FloatType :
+ mot = self.parent.get_valeur_texte(objet)
+ if mot == "" :
+ mot = str(objet)
+ elif type(objet) == types.TupleType :
+ mot="("
+ premier=1
+ for val in objet:
+ if (not premier):
+ mot=mot+","
+ else:
+ premier=0
+ valtexte = self.parent.get_valeur_texte(val)
+ if valtexte != "" :
+ mot=mot+valtexte
+ else:
+ mot=mot+str(val)
+ mot=mot+")"
+ else:
+ mot=`objet`
+ label = Label(self.MCbox,
+ text = mot,
+ fg = 'black',bg = 'gray95',justify = 'left')
+ self.dico_labels[mot]=label
+ self.dico_place[mot]=self.nBlabel
+ self.dico_mots[label]=mot
+ self.nBlabel=self.nBlabel+1
+ liste_labels.append(label)
+ self.MCbox.window_create(END,
+ window=label,
+ stretch = 1)
+ self.MCbox.insert(END,'\n')
+ if self.optionReturn != None :
+ label.bind("<Return>",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c))
+ label.bind("<KP_Enter>",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c))
+ label.bind("<Key-Right>",lambda e,s=self,x=objet,l=label : s.selectNextItem(x,l))
+ label.bind("<Key-Down>",lambda e, s=self,x=objet,l=label : s.selectNextItem(x,l))
+ label.bind("<Key-Left>" ,lambda e,s=self,x=objet,l=label : s.selectPrevItem(x,l))
+ label.bind("<Key-Up>" ,lambda e,s=self,x=objet,l=label : s.selectPrevItem(x,l))
+ if self.active == 'oui':
+ label.bind(self.liste_commandes[0][0],lambda e,s=self,c=self.liste_commandes[0][1],x=objet,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=objet,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=objet,l=label : s.chooseitem(x,l,c))
+
+ for marque in self.liste_marques:
+ try:
+ self.markitem(liste_labels[marque])
+ except:
+ pass
+
+ self.MCbox.config(state=DISABLED)
+ self.selection = None
+ self.dontselect=0
+ for event,callback in self.liste_commandes:
+ if event == "<Enter>":
+ self.selection=None,None,callback
+ break
+
+ def clear_marque(self):
+ try:
+ self.dico_labels[self.arg_selected].configure(bg='gray95',fg='black')
+ self.arg_selected = ''
+ except :
+ pass
+
+ def surligne(self,marque):
+ try :
+ self.highlightitem(self.dico_labels[marque])
+ self.arg_selected = marque
+ except:
+ pass
+
+ def chooseitemsurligne(self,mot,label,commande):
+ """ Active la méthode de choix passée en argument"""
+ try:
+ mot=self.arg_selected
+ commande(mot)
+ except AsException,e:
+ raison=str(e)
+ showerror(raison.split('\n')[0],raison)
+
+ def chooseitem(self,mot,label,commande):
+ """ Active la méthode de choix passée en argument"""
+ try:
+ commande(mot)
+ except AsException,e:
+ raison=str(e)
+ showerror(raison.split('\n')[0],raison)
+
+ def afficheMot(self,mot):
+ """ Pour contourner le bug sur l index
+ on commence par la methode dite normale
+ puis par la methode de contournement
+ puis rien du tout
+ """
+ try:
+ labelsuivant=self.dico_labels[mot]
+ index = self.MCbox.index(labelsuivant)
+ self.MCbox.see(index)
+ except :
+ posmot=self.dico_place[mot]
+ totale=self.nBlabel + 0.0
+ self.MCbox.yview_moveto(posmot/totale)
+
+ def selectNextItem(self,mot,label):
+ index=self.liste.index(mot)
+ indexsuivant=index+1
+ if indexsuivant > len(self.liste) -1:
+ indexsuivant=0
+ motsuivant=self.liste[indexsuivant]
+ labelsuivant=self.dico_labels[motsuivant]
+ self.afficheMot(motsuivant)
+ self.selectthis(motsuivant,labelsuivant,self.selection[2],)
+ self.dontselect=1
+
+ def selectPrevItem(self,mot,label):
+ index=self.liste.index(mot)
+ indexprec=index-1
+ motprec=self.liste[indexprec]
+ labelprec=self.dico_labels[motprec]
+ self.afficheMot(motprec)
+ self.selectthis(motprec,labelprec,self.selection[2],)
+ self.dontselect=1
+
+ def selectthis(self,mot,label,commande) :
+ self.clear_marque()
+ if self.selection != None :
+ self.deselectitem(self.selection[1],self.selection[0],self.selection[2],)
+ self.highlightitem(label)
+ self.selection = (mot,label,commande)
+ self.arg_selected = mot
+ if commande : commande(mot)
+
+ def selectitem(self,mot,label,commande) :
+ """ Met l'item sélectionné (représenté par son label) en surbrillance
+ et lance la commande associée au double-clic"""
+ if self.dontselect:
+ self.dontselect=0
+ return
+ self.selectthis(mot,label,commande)
+
+ def highlightitem(self,label) :
+ """ Met l'item représenté par son label en surbrillance """
+ label.focus_set()
+ label.configure(bg='#00008b',fg='white')
+
+ def markitem(self,label):
+ """ Met l'item (représenté par son label) en rouge """
+ label.configure(bg='gray95',fg='red')
+
+ def deselectitem(self,label,mot='',commande=None) :
+ """ Remet l'item (représenté par son label) en noir"""
+ if label:label.configure(bg='gray95',fg='black')
+ self.arg_selected = ''
+ if commande and mot : commande(mot)
+
+ def cherche_selected_item(self):
+ try :
+ index=self.MCbox.index(self.selection[1])
+ lign,col=map(int,string.split(index,'.'))
+ except :
+ label=self.dico_labels[self.arg_selected]
+ mot=self.dico_mots[label]
+ lign=self.dico_place[mot]+1
+ return lign
+
+ def remove_selected_item(self):
+ try :
+ index=self.MCbox.index(self.selection[1])
+ lign,col=map(int,string.split(index,'.'))
+ except :
+ label=self.dico_labels[self.arg_selected]
+ mot=self.dico_mots[label]
+ lign=self.dico_place[mot]+1
+ del self.liste[lign-1]
+ self.affiche_liste()
+
+ 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)
+ self.dontselect=0
+ for arg in self.liste :
+ if fnmatch.fnmatch(arg,filtre) or fnmatch.fnmatch(arg,FILTRE) :
+ label=self.dico_labels[arg]
+ self.afficheMot(arg)
+ self.selectitem(arg,label,self.selection[2])
+ break
+
+ #try :
+ #self.dico_labels[self.arg_selected].focus_set()
+ #except :
+ #pass
+
+
+ # PN attention à la gestion des paramétres
+ # cela retourne H = 1 , et ni H, ni 1
+ # print repr(val)
+ # print val.__class__.__name__
+ def get_liste(self):
+ l=[]
+ for val in self.liste:
+# try:
+# v = eval(val)
+# l.append(v)
+# except:
+ l.append(val)
+ return l
+
+ def put_liste(self,liste):
+ self.liste = liste
+ self.affiche_liste()
+
+class Affichage :
+ """ Cette classe permet d'afficher au lancement d'EFICAS le message
+ d'attente et la barre de progression"""
+ def __init__(self,master,message,barre ='oui'):
+ from Tools.foztools.foztools import Slider
+ fonte=fontes.standard12_gras
+ self.master=master
+ self.frame = Frame(self.master)
+ self.frame.pack(expand=1,fill='both')
+ self.mess = Label(self.frame,text=message,justify='center',
+ bd=2,relief='groove',font=fonte)
+ self.mess.pack(in_ = self.frame,side='top',expand=1,fill='both')
+ self.progress = Slider(self.frame,value=0,max=100,orientation='horizontal',
+ fillColor='#00008b',width=200,height=30,
+ background='white',labelColor='red')
+ if barre == 'oui':
+ self.progress.frame.pack(in_=self.frame,side='top')
+ self.master.update()
+ if barre == 'oui':
+ self.progress.frame.after(1000,self.update)
+
+ def configure(self,**options):
+ if options.has_key('message'):
+ self.mess.configure(text=options['message'])
+ if options.has_key('barre'):
+ if options['barre'] == 'oui' :
+ self.progress.frame.pack(in_=self.frame,side='top')
+ elif options['barre'] == 'non' :
+ self.progress.frame.pack_forget()
+ self.master.update_idletasks()
+
+ def quit(self):
+ self.frame.destroy()
+ self.master.update()
+
+ def update(self,event=None):
+ """ Permet de faire avancer la barre de progression """
+ try :
+ bar=self.progress
+ bar.value = bar.value+self.increment
+ bar.update()
+ self.master.after(100,self.update)
+ except:
+ pass
+
+ def configure_barre(self,nb):
+ """ Calcule l'incrément de progression de la barre en fonction
+ du nombre d'opérations à effectuer afin que le compteur
+ soit à 100% à la fin des opérations"""
+ self.increment = 100./nb
+ self.progress.update()
+
+class Ask_Format_Fichier :
+ """
+ Cette classe permet de créer une fenêtre Toplevel dans laquelle
+ on propose le choix du format de fichier de commandes à ouvrir
+ """
+ def __init__(self,appli):
+ self.fenetre = Toplevel()
+ self.fenetre.configure(width = 250,height=150)
+ self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+ self.fenetre.title("Choix du format du fichier de commandes")
+ # définition des frames
+ self.frame_texte = Frame(self.fenetre)
+ self.frame_radioboutons = Frame(self.fenetre)
+ self.frame_bouton_ok = Frame(self.fenetre)
+ self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.3)
+ self.frame_radioboutons.place(relheight=0.5,relx=0,rely=0.3,relwidth=1.)
+ self.frame_bouton_ok.place(relheight=0.2,relx=0,rely=0.8,relwidth=1.)
+ # définition de la zone texte et du scrollbar
+ zone_texte = Label(self.frame_texte,text = "Format du fichier à ouvrir :")
+ zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
+ # définition des radioboutons
+ Radiobutton(self.frame_radioboutons,text='Format Aster (Code_Aster --> v5)',
+ variable=appli.format_fichier,value='Aster').pack(anchor='n')
+ Radiobutton(self.frame_radioboutons,text='Format Python (Code_Aster v6-->)',
+ variable=appli.format_fichier,value='Python').pack(anchor='n')
+ # création du bouton OK
+ Button(self.frame_bouton_ok,text='OK',command=self.quit).pack(anchor='n')
+ # centrage de la fenêtre
+ centerwindow(self.fenetre)
+
+ def quit(self):
+ self.fenetre.destroy()
+
+class BARRE_K2000(Toplevel):
+ def __init__(self,master=None,text = ""):
+ Toplevel.__init__(self,master,relief='groove')
+ self.master.iconify()
+ self.geometry("250x100+0+0")
+ self.protocol("WM_DELETE_WINDOW",self.quit)
+ # frame principale dans self (= Toplevel)
+ self.frame = Frame(self)
+ self.frame.place(relwidth=1,relheight=1)
+ # frame contenant le texte à afficher
+ self.frame_text = Frame(self.frame)
+ self.frame_text.place(relwidth=1,relheight=0.75,rely=0)
+ # frame contenant le canvas de la barre
+ self.frame_canv = Frame(self.frame)
+ self.frame_canv.place(relwidth=1,relheight=0.25,rely=0.75)
+ # canvas dans lequel sera affichée la barre K2000
+ self.canvas = Canvas(self.frame_canv)
+ self.canvas.place(relx=0.5,rely=0.5,relheight=0.8,relwidth=0.8,anchor='center')
+ # on affiche le texte et la barre
+ self.build_text(text)
+ self.build_batons()
+ #self.overrideredirect(1)
+ # on active la barre ...
+ self.master.after(1000,self.launch)
+ # on centre la fenêtre
+ centerwindow(self)
+ self.focus()
+
+ def build_text(self,text):
+ """
+ Affichage de text dans frame_text
+ """
+ self.texte_var = StringVar()
+ self.texte_var.set(text)
+ Label(self.frame_text,textvariable=self.texte_var).place(relx=0.5,rely=0.5,anchor='center')
+
+ def build_batons(self):
+ """
+ Construit la suite de bâtons dans le canvas
+ """
+ self.l_batons=[]
+ self.black = -1
+ self.sens = 'D'
+ self.quit = 0
+ for i in range(0,40):
+ id = self.canvas.create_rectangle(i*5,0,(i+1)*5,20,fill='gray90',outline='')
+ self.l_batons.append(id)
+
+ def launch(self):
+ """
+ Active la barre K2000 en affichant les bâtons avec des couleurs en dégradé
+ """
+ if self.quit == 1 :
+ self.destroy()
+ self.master.deiconify()
+ return
+ if self.sens == 'D':
+ self.black = self.black+1
+ l_bat = self.l_batons[0:self.black+1]
+ l_bat.reverse()
+ elif self.sens == 'G':
+ self.black = self.black-1
+ l_bat = self.l_batons[self.black:]
+ i=0
+ for bat in l_bat :
+ num_color = 5+i*10
+ if num_color < 10 : color = 'black'
+ elif num_color > 90 : color = 'white'
+ else: color = 'gray'+`num_color`
+ self.canvas.itemconfigure(bat,fill=color)
+ i=i+1
+ if self.black == len(self.l_batons) :
+ self.sens = 'G'
+ if self.black == 0 and self.sens == 'G':self.sens = 'D'
+ self.after(80,self.launch)
+
+ def update_text(self,new_text):
+ """
+ Remplace le texte affiché par new_text
+ """
+ self.texte_var.set(new_text)
+
+ 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
+ Exemple de binding:
+ liste_commandes = (("<Enter>",self.selectCmd),
+ ("<Leave>",self.deselectCmd),
+ ("<Double-Button-1>",self.defCmd))
+ Il s'agit d'une liste de doublets dont le premier element est un evenement et le
+ deuxieme un callback a appeler sur l'evenement en question.
+
+ """
+ def __init__(self,parent,page,liste_groupes,dict_groupes,liste_commandes=[],liste_marques =[],
+ active ='oui',filtre='non',titre='',optionReturn=None,fonte_titre=fontes.standard_gras_souligne):
+ 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.optionReturn = optionReturn
+ self.fonte_titre=fonte_titre
+ self.init()
+
+ def affiche_liste(self):
+ """ Affiche la liste dans la fenêtre"""
+ liste_labels=[]
+ self.dico_mots={}
+ 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
+ liste_labels.append(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.dico_mots[label]=cmd
+ self.MCbox.window_create(END,
+ window=label,
+ stretch = 1)
+ self.MCbox.insert(END,'\n')
+
+ def null(*tp,**args): return
+
+ if self.active == 'oui':
+ # Traitement par defaut des evenements
+ label.bind("<Enter>",lambda e,s=self,c=null,x=cmd,l=label: s.selectitem(x,l,c))
+ label.bind("<Leave>",lambda e,s=self,c=null,x=cmd,l=label: s.deselectitem(l,x,c))
+ label.bind("<Double-Button-1>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
+ label.bind("<Return>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
+ label.bind("<KP_Enter>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
+ label.bind("<Key-Right>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x))
+ label.bind("<Key-Down>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x))
+ label.bind("<Key-Left>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x))
+ label.bind("<Key-Up>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x))
+
+ # Si des callbacks sont definis on les utilise
+ for event,callback in self.liste_commandes:
+ if event == "<Enter>":
+ label.bind("<Enter>",lambda e,s=self,c=callback,x=cmd,l=label: s.selectitem(x,l,c))
+ elif event == "<Leave>":
+ label.bind("<Leave>",lambda e,s=self,c=callback,x=cmd,l=label: s.deselectitem(l,x,c))
+ elif event == "<Double-Button-1>":
+ label.bind("<Double-Button-1>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
+ elif event == "<Return>":
+ label.bind("<Return>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
+ elif event == "<KP_Enter>":
+ label.bind("<KP_Enter>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
+ elif event == "<Key-Right>":
+ label.bind("<Key-Right>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x))
+ elif event == "<Key-Down>":
+ label.bind("<Key-Down>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x))
+ elif event == "<Key-Left>":
+ label.bind("<Key-Left>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x))
+ elif event == "<Key-Up>":
+ label.bind("<Key-Up>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x))
+ else:
+ label.bind(event,lambda e,s=self,c=callback,x=cmd,l=label: c())
+
+ for marque in self.liste_marques:
+ try:
+ self.markitem(liste_labels[marque])
+ except:
+ pass
+
+ self.MCbox.config(state=DISABLED)
+ self.selection = None
+ self.dontselect=0
+ for event,callback in self.liste_commandes:
+ if event == "<Enter>":
+ self.selection=None,None,callback
+ break
+
+ def selectPrevItem(self,mot,label,callback,group,cmd):
+ g=self.liste_groupes.index(group)
+ liste_commandes=self.dict_groupes[group]
+ c=liste_commandes.index(cmd)
+ if c > 0:
+ co=liste_commandes[c-1]
+ else:
+ # debut de liste. On passe au groupe precedent
+ if g > 0:
+ gr=self.liste_groupes[g-1]
+ co=self.dict_groupes[gr][-1]
+ else:
+ # debut des groupes. On ne fait rien
+ return
+ # On a trouve l'item precedent
+ labelsuivant=self.dico_labels[co]
+ index = self.MCbox.index(labelsuivant)
+ self.MCbox.see(index)
+ self.selectthis(co,labelsuivant,self.selection[2],)
+ self.dontselect=1
+
+ def selectNextItem(self,mot,label,callback,group,cmd):
+ g=self.liste_groupes.index(group)
+ liste_commandes=self.dict_groupes[group]
+ c=liste_commandes.index(cmd)
+ try:
+ co=liste_commandes[c+1]
+ except:
+ # fin de liste. On passe au groupe suivant
+ try:
+ gr=self.liste_groupes[g+1]
+ co=self.dict_groupes[gr][0]
+ except:
+ # fin des groupes. On ne fait rien
+ return
+ # On a trouve l'item suivant
+ labelsuivant=self.dico_labels[co]
+ index = self.MCbox.index(labelsuivant)
+ self.MCbox.see(index)
+ self.selectthis(co,labelsuivant,self.selection[2],)
+ self.dontselect=1
+
+ 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) :
+ cmd=self.dict_groupes[grp][0]
+ label=self.dico_labels[cmd]
+ index = self.MCbox.index(label)
+ self.MCbox.see(index)
+ self.selectitem(cmd,label,self.selection[2])
+ # 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) :
+ label=self.dico_labels[cmd]
+ index = self.MCbox.index(label)
+ self.MCbox.see(index)
+ self.selectitem(cmd,label,self.selection[2])
+ # On a trouve une commande on arrete la recherche
+ return
+
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desChoixCata.ui'
+#
+# Created: mer mai 23 10:40:48 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DChoixCata(QDialog):
+ def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+ QDialog.__init__(self,parent,name,modal,fl)
+
+ if not name:
+ self.setName("DChoixCata")
+
+ self.setSizeGripEnabled(1)
+
+
+ self.frame3 = QFrame(self,"frame3")
+ self.frame3.setGeometry(QRect(0,120,540,50))
+ self.frame3.setFrameShape(QFrame.StyledPanel)
+ self.frame3.setFrameShadow(QFrame.Raised)
+
+ self.buttonCancel = QPushButton(self.frame3,"buttonCancel")
+ self.buttonCancel.setGeometry(QRect(370,10,90,30))
+ self.buttonCancel.setAutoDefault(1)
+
+ self.buttonOk = QPushButton(self.frame3,"buttonOk")
+ self.buttonOk.setGeometry(QRect(80,10,90,30))
+ self.buttonOk.setAutoDefault(1)
+ self.buttonOk.setDefault(1)
+
+ self.textLabel1_2 = QLabel(self,"textLabel1_2")
+ self.textLabel1_2.setGeometry(QRect(40,50,340,20))
+
+ self.CBChoixCata = QComboBox(0,self,"CBChoixCata")
+ self.CBChoixCata.setEnabled(1)
+ self.CBChoixCata.setGeometry(QRect(400,41,101,30))
+
+ self.TLNb = QLabel(self,"TLNb")
+ self.TLNb.setGeometry(QRect(110,30,210,20))
+ self.TLNb.setMinimumSize(QSize(30,0))
+
+ self.languageChange()
+
+ self.resize(QSize(547,172).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.buttonOk,SIGNAL("clicked()"),self.BOkPressed)
+ self.connect(self.buttonCancel,SIGNAL("clicked()"),self.BCancelPressed)
+ self.connect(self.CBChoixCata,SIGNAL("textChanged(const QString&)"),self.CataChoisi)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("Choix d'une version du code Aster"))
+ self.buttonCancel.setText(self.__tr("&Cancel"))
+ self.buttonCancel.setAccel(QString.null)
+ self.buttonOk.setText(self.__tr("&OK"))
+ self.buttonOk.setAccel(QString.null)
+ self.textLabel1_2.setText(self.__tr("<font size=\"+1\">Veuillez choisir celle avec laquelle vous souhaitez travailler</font>"))
+ self.TLNb.setText(self.__tr("2"))
+
+
+ def CataChoisi(self):
+ print "DChoixCata.CataChoisi(): Not implemented yet"
+
+ def BOkPressed(self):
+ print "DChoixCata.BOkPressed(): Not implemented yet"
+
+ def BCancelPressed(self):
+ print "DChoixCata.BCancelPressed(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DChoixCata",s,c)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DChoixCata</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>DChoixCata</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>547</width>
+ <height>172</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Choix d'une version du code Aster</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>frame3</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>120</y>
+ <width>540</width>
+ <height>50</height>
+ </rect>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>370</x>
+ <y>10</y>
+ <width>90</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Cancel</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>80</x>
+ <y>10</y>
+ <width>90</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&OK</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>50</y>
+ <width>340</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><font size="+1">Veuillez choisir celle avec laquelle vous souhaitez travailler</font></string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>CBChoixCata</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>400</x>
+ <y>41</y>
+ <width>101</width>
+ <height>30</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TLNb</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>110</x>
+ <y>30</y>
+ <width>210</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>2</string>
+ </property>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DChoixCata</receiver>
+ <slot>BOkPressed()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>DChoixCata</receiver>
+ <slot>BCancelPressed()</slot>
+ </connection>
+ <connection>
+ <sender>CBChoixCata</sender>
+ <signal>textChanged(const QString&)</signal>
+ <receiver>DChoixCata</receiver>
+ <slot>CataChoisi()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>CataChoisi()</slot>
+ <slot>BOkPressed()</slot>
+ <slot>BCancelPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desCommande.ui'
+#
+# Created: jeu avr 26 14:25:01 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+ "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+ "\xcf\x49\x44\x41\x54\x38\x8d\xd5\x94\xdb\x0e\xc3" \
+ "\x20\x0c\x43\xed\xfd\xf8\xd8\x97\xbb\x0f\x34\x5b" \
+ "\x48\x08\x45\xd5\x1e\xb6\x48\x88\xf4\x12\xe7\x60" \
+ "\x01\xc0\x0f\x04\x6f\xd6\xe9\x9b\xba\x77\x20\x04" \
+ "\x80\x92\x4a\x10\x32\xc9\x2e\xfb\xd8\xc7\xd5\xca" \
+ "\xbc\xc0\x25\x40\x00\x99\xe9\x57\x84\x95\x68\xfe" \
+ "\x7f\x06\xc0\xde\xd1\xde\xb3\x2b\x4a\x1e\xc4\xea" \
+ "\x82\x4b\x9e\x74\x09\x71\x65\xbd\x01\xf8\x55\x27" \
+ "\xf7\x8a\x72\x01\xe0\xa3\x12\x9f\x34\x5a\x01\x7c" \
+ "\x54\x3b\xaf\xdc\x98\x3d\x0f\x71\x09\xd1\x5a\x33" \
+ "\x1b\x47\x1f\x47\x07\x2c\x17\x49\x4a\x82\x33\x8f" \
+ "\x61\x78\x20\x3a\x88\x17\xe6\x73\x06\xb1\xf0\x8b" \
+ "\x07\xba\x03\xe6\x02\xc9\xb8\x31\x07\x7e\x37\xe0" \
+ "\x20\x9e\x67\xe3\x38\x67\x10\x97\x7b\x17\xde\x80" \
+ "\xc1\x85\xad\x38\x69\x5a\x51\xd5\x22\xc8\x2c\xe7" \
+ "\x79\x12\xe2\xfe\xd8\xbe\x83\x76\x20\x92\xf5\x2b" \
+ "\x18\x20\xdd\x11\xbb\x10\xe5\x65\xb5\x3a\x5a\x3b" \
+ "\xba\xff\x13\x07\x13\xd6\x6f\xa6\x98\x18\x57\x06" \
+ "\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
+
+class DComm(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ self.image0 = QPixmap()
+ self.image0.loadFromData(image0_data,"PNG")
+ if not name:
+ self.setName("DComm")
+
+ self.setMinimumSize(QSize(505,0))
+
+
+ self.Commentaire = QLabel(self,"Commentaire")
+ self.Commentaire.setGeometry(QRect(10,410,490,20))
+ self.Commentaire.setFrameShape(QLabel.NoFrame)
+ self.Commentaire.setFrameShadow(QLabel.Plain)
+
+ self.bSup = QPushButton(self,"bSup")
+ self.bSup.setGeometry(QRect(320,440,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.bOk = QPushButton(self,"bOk")
+ self.bOk.setGeometry(QRect(170,440,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.bHelp = QPushButton(self,"bHelp")
+ self.bHelp.setGeometry(QRect(10,440,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.TWChoix = QTabWidget(self,"TWChoix")
+ self.TWChoix.setGeometry(QRect(0,0,500,400))
+
+ self.MotClef = QWidget(self.TWChoix,"MotClef")
+
+ self.LBMCPermis = QListBox(self.MotClef,"LBMCPermis")
+ self.LBMCPermis.setGeometry(QRect(10,40,220,290))
+ self.LBMCPermis.setMinimumSize(QSize(0,0))
+
+ self.LBRegles = QListBox(self.MotClef,"LBRegles")
+ self.LBRegles.setGeometry(QRect(260,40,230,290))
+
+ self.textLabel1 = QLabel(self.MotClef,"textLabel1")
+ self.textLabel1.setGeometry(QRect(50,10,140,20))
+ self.textLabel1.setMinimumSize(QSize(0,0))
+
+ self.textLabel1_2 = QLabel(self.MotClef,"textLabel1_2")
+ self.textLabel1_2.setGeometry(QRect(360,0,50,37))
+ self.TWChoix.insertTab(self.MotClef,QString(""))
+
+ self.Concept = QWidget(self.TWChoix,"Concept")
+
+ self.groupBox1 = QGroupBox(self.Concept,"groupBox1")
+ self.groupBox1.setGeometry(QRect(0,10,520,380))
+
+ self.textLabel1_3 = QLabel(self.groupBox1,"textLabel1_3")
+ self.textLabel1_3.setGeometry(QRect(80,50,82,31))
+
+ self.textLabel1_3_2 = QLabel(self.groupBox1,"textLabel1_3_2")
+ self.textLabel1_3_2.setGeometry(QRect(80,170,82,31))
+
+ self.textLabel3 = QLabel(self.groupBox1,"textLabel3")
+ self.textLabel3.setGeometry(QRect(80,200,230,31))
+
+ self.LENomConcept = QLineEdit(self.groupBox1,"LENomConcept")
+ self.LENomConcept.setGeometry(QRect(80,110,310,30))
+
+ self.typeConcept = QLabel(self.groupBox1,"typeConcept")
+ self.typeConcept.setGeometry(QRect(320,200,100,31))
+ self.TWChoix.insertTab(self.Concept,QString(""))
+
+ self.Commande = QWidget(self.TWChoix,"Commande")
+
+ self.textLabel6 = QLabel(self.Commande,"textLabel6")
+ self.textLabel6.setGeometry(QRect(10,60,60,30))
+
+ self.textLabel4 = QLabel(self.Commande,"textLabel4")
+ self.textLabel4.setGeometry(QRect(90,340,300,30))
+
+ self.LBNouvCommande = QListBox(self.Commande,"LBNouvCommande")
+ self.LBNouvCommande.setGeometry(QRect(50,100,410,240))
+
+ self.buttonGroup1 = QButtonGroup(self.Commande,"buttonGroup1")
+ self.buttonGroup1.setGeometry(QRect(298,17,151,70))
+
+ self.RBGroupe = QRadioButton(self.buttonGroup1,"RBGroupe")
+ self.RBGroupe.setGeometry(QRect(20,40,101,20))
+
+ self.RBalpha = QRadioButton(self.buttonGroup1,"RBalpha")
+ self.RBalpha.setGeometry(QRect(20,20,101,20))
+ self.RBalpha.setChecked(1)
+
+ self.LEFiltre = QLineEdit(self.Commande,"LEFiltre")
+ self.LEFiltre.setGeometry(QRect(50,60,160,30))
+
+ self.BNext = QToolButton(self.Commande,"BNext")
+ self.BNext.setGeometry(QRect(220,60,30,31))
+ self.BNext.setIconSet(QIconSet(self.image0))
+
+ self.textLabel1_4 = QLabel(self.Commande,"textLabel1_4")
+ self.textLabel1_4.setGeometry(QRect(50,20,171,21))
+ self.TWChoix.insertTab(self.Commande,QString(""))
+
+ self.languageChange()
+
+ self.resize(QSize(505,483).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.LBNouvCommande,SIGNAL("clicked(QListBoxItem*)"),self.LBNouvCommandeClicked)
+ self.connect(self.LEFiltre,SIGNAL("textChanged(const QString&)"),self.LEFiltreTextChanged)
+ self.connect(self.LEFiltre,SIGNAL("returnPressed()"),self.LEfiltreReturnPressed)
+ self.connect(self.bSup,SIGNAL("pressed()"),self.BSupPressed)
+ self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+ self.connect(self.LENomConcept,SIGNAL("returnPressed()"),self.LENomConceptReturnPressed)
+ self.connect(self.RBGroupe,SIGNAL("clicked()"),self.BuildTabCommand)
+ self.connect(self.RBalpha,SIGNAL("clicked()"),self.BuildTabCommand)
+ self.connect(self.bHelp,SIGNAL("clicked()"),self.BHelpPressed)
+ self.connect(self.BNext,SIGNAL("pressed()"),self.BNextPressed)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("DComm"))
+ self.Commentaire.setText(QString.null)
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.textLabel1.setText(self.__tr("<h3><p align=\"center\"><u><b>Mots Clefs Permis</b></u></p></h3>"))
+ self.textLabel1_2.setText(self.__trUtf8("\x3c\x68\x33\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x3c\x75\x3e\x3c\x62\x3e\x52\xc3\xa8\x67\x6c\x65\x73\x3c\x2f\x62\x3e\x3c\x2f\x75\x3e\x3c\x2f\x70\x3e\x3c\x2f\x68\x33\x3e"))
+ self.TWChoix.changeTab(self.MotClef,self.__tr("Ajouter Mot-Clef"))
+ self.groupBox1.setTitle(self.__tr("Concept"))
+ self.textLabel1_3.setText(self.__tr("<u>Nom du concept :</u>"))
+ self.textLabel1_3_2.setText(self.__tr("<u>Type du concept :</u>"))
+ self.textLabel3.setText(self.__trUtf8("\x4c\x27\x6f\x70\xc3\xa9\x72\x61\x74\x65\x75\x72\x20\x63\x6f\x75\x72\x61\x6e\x74\x20\x72\x65\x74\x6f\x75\x72\x6e\x65\x20\x75\x6e\x20\x63\x6f\x6e\x63\x65\x70\x74\x20\x64\x65\x20\x74\x79\x70\x65\x20\x3a"))
+ self.typeConcept.setText(self.__tr("TypeDuConcept"))
+ self.TWChoix.changeTab(self.Concept,self.__tr("Nommer Concept"))
+ self.textLabel6.setText(self.__tr("Filtre"))
+ self.textLabel4.setText(self.__trUtf8("\x4c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x63\x68\x6f\x69\x73\x69\x65\x20\x73\x65\x72\x61\x20\x61\x6a\x6f\x75\x74\xc3\xa9\x65\x20\x41\x50\x52\x45\x53\x20\x6c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x63\x6f\x75\x72\x61\x6e\x74\x65"))
+ self.buttonGroup1.setTitle(self.__tr("Affichage"))
+ self.RBGroupe.setText(self.__tr("par groupe"))
+ self.RBalpha.setText(self.__trUtf8("\x61\x6c\x70\x68\x61\x62\xc3\xa9\x74\x69\x71\x75\x65"))
+ self.BNext.setText(QString.null)
+ QToolTip.add(self.BNext,self.__tr("affiche la prochaine occurence"))
+ self.textLabel1_4.setText(self.__tr("<b><u>Commandes :</u></b>"))
+ self.TWChoix.changeTab(self.Commande,self.__tr("Nouvelle Commande"))
+
+
+ def LBNouvCommandeClicked(self):
+ print "DComm.LBNouvCommandeClicked(): Not implemented yet"
+
+ def LEFiltreTextChanged(self):
+ print "DComm.LEFiltreTextChanged(): Not implemented yet"
+
+ def LEfiltreReturnPressed(self):
+ print "DComm.LEfiltreReturnPressed(): Not implemented yet"
+
+ def BSupPressed(self):
+ print "DComm.BSupPressed(): Not implemented yet"
+
+ def LENomConceptReturnPressed(self):
+ print "DComm.LENomConceptReturnPressed(): Not implemented yet"
+
+ def BOkPressed(self):
+ print "DComm.BOkPressed(): Not implemented yet"
+
+ def BuildTabCommand(self):
+ print "DComm.BuildTabCommand(): Not implemented yet"
+
+ def BHelpPressed(self):
+ print "DComm.BHelpPressed(): Not implemented yet"
+
+ def BNextPressed(self):
+ print "DComm.BNextPressed(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DComm",s,c)
+
+ def __trUtf8(self,s,c = None):
+ return qApp.translate("DComm",s,c,QApplication.UnicodeUTF8)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DComm</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DComm</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>505</width>
+ <height>483</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>505</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>DComm</string>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Commentaire</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>410</y>
+ <width>490</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>170</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>TWChoix</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>500</width>
+ <height>400</height>
+ </rect>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>MotClef</cstring>
+ </property>
+ <attribute name="title">
+ <string>Ajouter Mot-Clef</string>
+ </attribute>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBMCPermis</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>220</width>
+ <height>290</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBRegles</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>260</x>
+ <y>40</y>
+ <width>230</width>
+ <height>290</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>10</y>
+ <width>140</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string><h3><p align="center"><u><b>Mots Clefs Permis</b></u></p></h3></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>360</x>
+ <y>0</y>
+ <width>50</width>
+ <height>37</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><h3><p align="center"><u><b>Règles</b></u></p></h3></string>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Concept</cstring>
+ </property>
+ <attribute name="title">
+ <string>Nommer Concept</string>
+ </attribute>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>10</y>
+ <width>520</width>
+ <height>380</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Concept</string>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>80</x>
+ <y>50</y>
+ <width>82</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><u>Nom du concept :</u></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>80</x>
+ <y>170</y>
+ <width>82</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><u>Type du concept :</u></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>80</x>
+ <y>200</y>
+ <width>230</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>L'opérateur courant retourne un concept de type :</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LENomConcept</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>80</x>
+ <y>110</y>
+ <width>310</width>
+ <height>30</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>typeConcept</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>200</y>
+ <width>100</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>TypeDuConcept</string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Commande</cstring>
+ </property>
+ <attribute name="title">
+ <string>Nouvelle Commande</string>
+ </attribute>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>60</y>
+ <width>60</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Filtre</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>90</x>
+ <y>340</y>
+ <width>300</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>La commande choisie sera ajoutée APRES la commande courante</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBNouvCommande</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>100</y>
+ <width>410</width>
+ <height>240</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>298</x>
+ <y>17</y>
+ <width>151</width>
+ <height>70</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Affichage</string>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RBGroupe</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>40</y>
+ <width>101</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>par groupe</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RBalpha</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>20</y>
+ <width>101</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>alphabétique</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LEFiltre</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>60</y>
+ <width>160</width>
+ <height>30</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>BNext</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>220</x>
+ <y>60</y>
+ <width>30</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>image0</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affiche la prochaine occurence</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>20</y>
+ <width>171</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><b><u>Commandes :</u></b></string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+<images>
+ <image name="image0">
+ <data format="PNG" length="264">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>LBNouvCommande</sender>
+ <signal>clicked(QListBoxItem*)</signal>
+ <receiver>DComm</receiver>
+ <slot>LBNouvCommandeClicked()</slot>
+ </connection>
+ <connection>
+ <sender>LEFiltre</sender>
+ <signal>textChanged(const QString&)</signal>
+ <receiver>DComm</receiver>
+ <slot>LEFiltreTextChanged()</slot>
+ </connection>
+ <connection>
+ <sender>LEFiltre</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DComm</receiver>
+ <slot>LEfiltreReturnPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bSup</sender>
+ <signal>pressed()</signal>
+ <receiver>DComm</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DComm</receiver>
+ <slot>BOkPressed()</slot>
+ </connection>
+ <connection>
+ <sender>LENomConcept</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DComm</receiver>
+ <slot>LENomConceptReturnPressed()</slot>
+ </connection>
+ <connection>
+ <sender>RBGroupe</sender>
+ <signal>clicked()</signal>
+ <receiver>DComm</receiver>
+ <slot>BuildTabCommand()</slot>
+ </connection>
+ <connection>
+ <sender>RBalpha</sender>
+ <signal>clicked()</signal>
+ <receiver>DComm</receiver>
+ <slot>BuildTabCommand()</slot>
+ </connection>
+ <connection>
+ <sender>bHelp</sender>
+ <signal>clicked()</signal>
+ <receiver>DComm</receiver>
+ <slot>BHelpPressed()</slot>
+ </connection>
+ <connection>
+ <sender>BNext</sender>
+ <signal>pressed()</signal>
+ <receiver>DComm</receiver>
+ <slot>BNextPressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>LBNouvCommandeClicked()</slot>
+ <slot>LEFiltreTextChanged()</slot>
+ <slot>LEfiltreReturnPressed()</slot>
+ <slot>BSupPressed()</slot>
+ <slot>LENomConceptReturnPressed()</slot>
+ <slot>BOkPressed()</slot>
+ <slot>BuildTabCommand()</slot>
+ <slot>BHelpPressed()</slot>
+ <slot>BNextPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desCommentaire.ui'
+#
+# Created: lun mar 19 11:05:34 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DComment(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ if not name:
+ self.setName("DComment")
+
+ self.setMinimumSize(QSize(350,0))
+
+
+ self.bSup = QPushButton(self,"bSup")
+ self.bSup.setGeometry(QRect(310,420,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.bHelp = QPushButton(self,"bHelp")
+ self.bHelp.setGeometry(QRect(10,420,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+ self.textLabel1.setGeometry(QRect(160,10,120,21))
+
+ self.textCommentaire = QTextEdit(self,"textCommentaire")
+ self.textCommentaire.setGeometry(QRect(10,40,451,360))
+
+ self.bOk = QPushButton(self,"bOk")
+ self.bOk.setGeometry(QRect(160,420,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.languageChange()
+
+ self.resize(QSize(475,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.textCommentaire,SIGNAL("returnPressed()"),self.TexteCommentaireEntre)
+ self.connect(self.bOk,SIGNAL("clicked()"),self.TexteCommentaireEntre)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("Form1"))
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.textLabel1.setText(self.__tr("<p align=\"center\"><b>Texte du Commentaire</b></p>"))
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+
+
+ def TexteCommentaireEntre(self):
+ print "DComment.TexteCommentaireEntre(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DComment",s,c)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DComment</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DComment</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>475</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>350</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>Form1</string>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>310</x>
+ <y>420</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>420</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>160</x>
+ <y>10</y>
+ <width>120</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><p align="center"><b>Texte du Commentaire</b></p></string>
+ </property>
+ </widget>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>textCommentaire</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>451</width>
+ <height>360</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>160</x>
+ <y>420</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>textCommentaire</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DComment</receiver>
+ <slot>TexteCommentaireEntre()</slot>
+ </connection>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DComment</receiver>
+ <slot>TexteCommentaireEntre()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>TexteCommentaireEntre()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desFormule.ui'
+#
+# Created: mar aoû 7 16:45:45 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+ "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+ "\xcf\x49\x44\x41\x54\x38\x8d\xd5\x94\xdb\x0e\xc3" \
+ "\x20\x0c\x43\xed\xfd\xf8\xd8\x97\xbb\x0f\x34\x5b" \
+ "\x48\x08\x45\xd5\x1e\xb6\x48\x88\xf4\x12\xe7\x60" \
+ "\x01\xc0\x0f\x04\x6f\xd6\xe9\x9b\xba\x77\x20\x04" \
+ "\x80\x92\x4a\x10\x32\xc9\x2e\xfb\xd8\xc7\xd5\xca" \
+ "\xbc\xc0\x25\x40\x00\x99\xe9\x57\x84\x95\x68\xfe" \
+ "\x7f\x06\xc0\xde\xd1\xde\xb3\x2b\x4a\x1e\xc4\xea" \
+ "\x82\x4b\x9e\x74\x09\x71\x65\xbd\x01\xf8\x55\x27" \
+ "\xf7\x8a\x72\x01\xe0\xa3\x12\x9f\x34\x5a\x01\x7c" \
+ "\x54\x3b\xaf\xdc\x98\x3d\x0f\x71\x09\xd1\x5a\x33" \
+ "\x1b\x47\x1f\x47\x07\x2c\x17\x49\x4a\x82\x33\x8f" \
+ "\x61\x78\x20\x3a\x88\x17\xe6\x73\x06\xb1\xf0\x8b" \
+ "\x07\xba\x03\xe6\x02\xc9\xb8\x31\x07\x7e\x37\xe0" \
+ "\x20\x9e\x67\xe3\x38\x67\x10\x97\x7b\x17\xde\x80" \
+ "\xc1\x85\xad\x38\x69\x5a\x51\xd5\x22\xc8\x2c\xe7" \
+ "\x79\x12\xe2\xfe\xd8\xbe\x83\x76\x20\x92\xf5\x2b" \
+ "\x18\x20\xdd\x11\xbb\x10\xe5\x65\xb5\x3a\x5a\x3b" \
+ "\xba\xff\x13\x07\x13\xd6\x6f\xa6\x98\x18\x57\x06" \
+ "\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
+
+class DFormule(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ self.image0 = QPixmap()
+ self.image0.loadFromData(image0_data,"PNG")
+ if not name:
+ self.setName("DFormule")
+
+ self.setMinimumSize(QSize(505,0))
+
+
+ self.bSup = QPushButton(self,"bSup")
+ self.bSup.setGeometry(QRect(320,440,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.bHelp = QPushButton(self,"bHelp")
+ self.bHelp.setGeometry(QRect(10,440,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.Commentaire = QLabel(self,"Commentaire")
+ self.Commentaire.setGeometry(QRect(-8,404,490,20))
+
+ self.bOk = QPushButton(self,"bOk")
+ self.bOk.setGeometry(QRect(170,440,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.TWChoix = QTabWidget(self,"TWChoix")
+ self.TWChoix.setGeometry(QRect(0,0,500,400))
+
+ self.Formule = QWidget(self.TWChoix,"Formule")
+
+ self.textLabel1_2 = QLabel(self.Formule,"textLabel1_2")
+ self.textLabel1_2.setGeometry(QRect(290,10,80,20))
+
+ self.textLabel1 = QLabel(self.Formule,"textLabel1")
+ self.textLabel1.setGeometry(QRect(30,10,160,30))
+ self.textLabel1.setMinimumSize(QSize(0,0))
+
+ self.textLabel2 = QLabel(self.Formule,"textLabel2")
+ self.textLabel2.setGeometry(QRect(220,40,220,20))
+
+ self.textLabel1_5 = QLabel(self.Formule,"textLabel1_5")
+ self.textLabel1_5.setGeometry(QRect(30,180,420,20))
+ self.textLabel1_5.setMinimumSize(QSize(0,0))
+
+ self.textLabel1_3_2 = QLabel(self.Formule,"textLabel1_3_2")
+ self.textLabel1_3_2.setGeometry(QRect(28,306,401,31))
+
+ self.textLabel1_6 = QLabel(self.Formule,"textLabel1_6")
+ self.textLabel1_6.setGeometry(QRect(210,60,20,50))
+
+ self.textLabel2_2 = QLabel(self.Formule,"textLabel2_2")
+ self.textLabel2_2.setGeometry(QRect(210,130,49,20))
+
+ self.textLabel1_6_2 = QLabel(self.Formule,"textLabel1_6_2")
+ self.textLabel1_6_2.setGeometry(QRect(450,60,20,50))
+
+ self.LENomFormule = QLineEdit(self.Formule,"LENomFormule")
+ self.LENomFormule.setGeometry(QRect(30,70,171,31))
+
+ self.LENomsArgs = QLineEdit(self.Formule,"LENomsArgs")
+ self.LENomsArgs.setGeometry(QRect(220,70,230,31))
+
+ self.textLabel1_3 = QLabel(self.Formule,"textLabel1_3")
+ self.textLabel1_3.setGeometry(QRect(90,260,300,20))
+
+ self.LECorpsFormule = QLineEdit(self.Formule,"LECorpsFormule")
+ self.LECorpsFormule.setGeometry(QRect(20,220,440,31))
+ self.TWChoix.insertTab(self.Formule,QString(""))
+
+ self.Commande = QWidget(self.TWChoix,"Commande")
+
+ self.textLabel6 = QLabel(self.Commande,"textLabel6")
+ self.textLabel6.setGeometry(QRect(10,60,60,30))
+
+ self.textLabel4 = QLabel(self.Commande,"textLabel4")
+ self.textLabel4.setGeometry(QRect(90,340,300,30))
+
+ self.LBNouvCommande = QListBox(self.Commande,"LBNouvCommande")
+ self.LBNouvCommande.setGeometry(QRect(50,100,410,240))
+
+ self.buttonGroup1 = QButtonGroup(self.Commande,"buttonGroup1")
+ self.buttonGroup1.setGeometry(QRect(300,20,151,70))
+
+ self.RBGroupe = QRadioButton(self.buttonGroup1,"RBGroupe")
+ self.RBGroupe.setGeometry(QRect(20,40,101,20))
+
+ self.RBalpha = QRadioButton(self.buttonGroup1,"RBalpha")
+ self.RBalpha.setGeometry(QRect(20,20,101,20))
+ self.RBalpha.setChecked(1)
+
+ self.LEFiltre = QLineEdit(self.Commande,"LEFiltre")
+ self.LEFiltre.setGeometry(QRect(50,60,160,30))
+
+ self.textLabel1_4 = QLabel(self.Commande,"textLabel1_4")
+ self.textLabel1_4.setGeometry(QRect(50,20,171,21))
+
+ self.BNext = QToolButton(self.Commande,"BNext")
+ self.BNext.setGeometry(QRect(220,60,30,31))
+ self.BNext.setIconSet(QIconSet(self.image0))
+ self.TWChoix.insertTab(self.Commande,QString(""))
+
+ self.languageChange()
+
+ self.resize(QSize(529,484).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.LBNouvCommande,SIGNAL("clicked(QListBoxItem*)"),self.LBNouvCommandeClicked)
+ self.connect(self.LEFiltre,SIGNAL("textChanged(const QString&)"),self.LEFiltreTextChanged)
+ self.connect(self.LEFiltre,SIGNAL("returnPressed()"),self.LEfiltreReturnPressed)
+ self.connect(self.bSup,SIGNAL("pressed()"),self.BSupPressed)
+ self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+ self.connect(self.RBalpha,SIGNAL("clicked()"),self.BuildTabCommand)
+ self.connect(self.RBGroupe,SIGNAL("clicked()"),self.BuildTabCommand)
+ self.connect(self.BNext,SIGNAL("clicked()"),self.BNextPressed)
+ self.connect(self.LENomFormule,SIGNAL("returnPressed()"),self.NomFormuleSaisi)
+ self.connect(self.LENomsArgs,SIGNAL("returnPressed()"),self.argsSaisis)
+ self.connect(self.LECorpsFormule,SIGNAL("returnPressed()"),self.FormuleSaisie)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("DMacro"))
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.Commentaire.setText(QString.null)
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+ self.textLabel1_2.setText(self.__tr("<h3><p align=\"center\"><u><b>Arguments</b></u></p></h3>"))
+ self.textLabel1.setText(self.__tr("<h3><p align=\"center\"><u><b>Nom de la formule</b></u></p></h3>"))
+ self.textLabel2.setText(self.__trUtf8("\x76\x61\x72\x69\x61\x62\x6c\x65\x73\x20\x73\xc3\xa9\x70\x61\x72\xc3\xa9\x65\x73\x20\x70\x61\x72\x20\x64\x65\x73\x20\x22\x2c\x22\x20\x70\x61\x72\x20\x65\x78\x2e\x20\x3a\x20\x78\x2c\x79\x2c\x7a"))
+ self.textLabel1_5.setText(self.__tr("<h3><p align=\"center\"><u><b>Corps de la formule</b></u></p></h3>"))
+ self.textLabel1_3_2.setText(self.__trUtf8("\x43\x65\x20\x6e\x27\x65\x73\x74\x20\x71\x75\x27\x61\x70\x72\xc3\xa8\x73\x20\x61\x76\x6f\x69\x72\x20\x61\x70\x70\x75\x79\xc3\xa9\x20\x73\x75\x72\x20\x6c\x65\x20\x62\x6f\x75\x74\x6f\x6e\x20\x56\x61\x6c\x69\x64\x65\x72\x20\x71\x75\x65\x20\x6c\x65\x73\x20\x6e\x6f\x75\x76\x65\x6c\x6c\x65\x73\x0a\x76\x61\x65\x6c\x75\x72\x73\x20\x73\x65\x72\x6f\x6e\x74\x20\x65\x66\x66\x65\x63\x74\x69\x76\x65\x6d\x65\x6e\x74\x20\x70\x72\x69\x73\x65\x73\x20\x65\x6e\x20\x63\x6f\x6d\x70\x74\x65"))
+ self.textLabel1_6.setText(self.__tr("<h1><b>(</b></h1>"))
+ self.textLabel2_2.setText(self.__tr("<font size=\"+4\" face=\"Helvetica\"><b>=</b></font>"))
+ self.textLabel1_6_2.setText(self.__tr("<h1><b>)</b></h1>"))
+ self.textLabel1_3.setText(self.__trUtf8("\x52\x65\x74\x6f\x75\x72\x2d\x43\x68\x61\x72\x69\x6f\x74\x20\x70\x65\x72\x6d\x65\x74\x20\x64\x65\x20\x76\xc3\xa9\x72\x69\x66\x69\x65\x72\x20\x71\x75\x65\x20\x6c\x27\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x20\x65\x73\x74\x20\x76\x61\x6c\x69\x64\x65\x2e"))
+ self.TWChoix.changeTab(self.Formule,self.__trUtf8("\x44\xc3\xa9\x66\x69\x6e\x69\x74\x69\x6f\x6e\x20\x46\x6f\x72\x6d\x75\x6c\x65"))
+ self.textLabel6.setText(self.__tr("Filtre"))
+ self.textLabel4.setText(self.__trUtf8("\x4c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x63\x68\x6f\x69\x73\x69\x65\x20\x73\x65\x72\x61\x20\x61\x6a\x6f\x75\x74\xc3\xa9\x65\x20\x41\x50\x52\x45\x53\x20\x6c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x63\x6f\x75\x72\x61\x6e\x74\x65"))
+ self.buttonGroup1.setTitle(self.__tr("Affichage"))
+ self.RBGroupe.setText(self.__tr("par groupe"))
+ self.RBalpha.setText(self.__trUtf8("\x61\x6c\x70\x68\x61\x62\xc3\xa9\x74\x69\x71\x75\x65"))
+ self.textLabel1_4.setText(self.__tr("<b><u>Commandes :</u></b>"))
+ self.BNext.setText(QString.null)
+ QToolTip.add(self.BNext,self.__tr("affiche la prochaine occurence"))
+ self.TWChoix.changeTab(self.Commande,self.__tr("Nouvelle Commande"))
+
+
+ def LBNouvCommandeClicked(self):
+ print "DFormule.LBNouvCommandeClicked(): Not implemented yet"
+
+ def LEFiltreTextChanged(self):
+ print "DFormule.LEFiltreTextChanged(): Not implemented yet"
+
+ def LEfiltreReturnPressed(self):
+ print "DFormule.LEfiltreReturnPressed(): Not implemented yet"
+
+ def BSupPressed(self):
+ print "DFormule.BSupPressed(): Not implemented yet"
+
+ def BOkPressed(self):
+ print "DFormule.BOkPressed(): Not implemented yet"
+
+ def BuildTabCommand(self):
+ print "DFormule.BuildTabCommand(): Not implemented yet"
+
+ def BNextPressed(self):
+ print "DFormule.BNextPressed(): Not implemented yet"
+
+ def NomFormuleSaisi(self):
+ print "DFormule.NomFormuleSaisi(): Not implemented yet"
+
+ def argsSaisis(self):
+ print "DFormule.argsSaisis(): Not implemented yet"
+
+ def FormuleSaisie(self):
+ print "DFormule.FormuleSaisie(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DFormule",s,c)
+
+ def __trUtf8(self,s,c = None):
+ return qApp.translate("DFormule",s,c,QApplication.UnicodeUTF8)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DFormule</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DFormule</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>529</width>
+ <height>484</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>505</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>DMacro</string>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Commentaire</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>-8</x>
+ <y>404</y>
+ <width>490</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>170</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>TWChoix</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>500</width>
+ <height>400</height>
+ </rect>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Formule</cstring>
+ </property>
+ <attribute name="title">
+ <string>Définition Formule</string>
+ </attribute>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>290</x>
+ <y>10</y>
+ <width>80</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><h3><p align="center"><u><b>Arguments</b></u></p></h3></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>10</y>
+ <width>160</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string><h3><p align="center"><u><b>Nom de la formule</b></u></p></h3></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>220</x>
+ <y>40</y>
+ <width>220</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>variables séparées par des "," par ex. : x,y,z</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_5</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>180</y>
+ <width>420</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string><h3><p align="center"><u><b>Corps de la formule</b></u></p></h3></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>28</x>
+ <y>306</y>
+ <width>401</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
+vaelurs seront effectivement prises en compte</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_6</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>210</x>
+ <y>60</y>
+ <width>20</width>
+ <height>50</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><h1><b>(</b></h1></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>210</x>
+ <y>130</y>
+ <width>49</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><font size="+4" face="Helvetica"><b>=</b></font></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_6_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>450</x>
+ <y>60</y>
+ <width>20</width>
+ <height>50</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><h1><b>)</b></h1></string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LENomFormule</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>70</y>
+ <width>171</width>
+ <height>31</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LENomsArgs</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>220</x>
+ <y>70</y>
+ <width>230</width>
+ <height>31</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>90</x>
+ <y>260</y>
+ <width>300</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Retour-Chariot permet de vérifier que l'expression est valide.</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LECorpsFormule</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>220</y>
+ <width>440</width>
+ <height>31</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Commande</cstring>
+ </property>
+ <attribute name="title">
+ <string>Nouvelle Commande</string>
+ </attribute>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>60</y>
+ <width>60</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Filtre</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>90</x>
+ <y>340</y>
+ <width>300</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>La commande choisie sera ajoutée APRES la commande courante</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBNouvCommande</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>100</y>
+ <width>410</width>
+ <height>240</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>300</x>
+ <y>20</y>
+ <width>151</width>
+ <height>70</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Affichage</string>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RBGroupe</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>40</y>
+ <width>101</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>par groupe</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RBalpha</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>20</y>
+ <width>101</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>alphabétique</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LEFiltre</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>60</y>
+ <width>160</width>
+ <height>30</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>20</y>
+ <width>171</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><b><u>Commandes :</u></b></string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>BNext</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>220</x>
+ <y>60</y>
+ <width>30</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>image0</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affiche la prochaine occurence</string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+<images>
+ <image name="image0">
+ <data format="PNG" length="264">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>LBNouvCommande</sender>
+ <signal>clicked(QListBoxItem*)</signal>
+ <receiver>DFormule</receiver>
+ <slot>LBNouvCommandeClicked()</slot>
+ </connection>
+ <connection>
+ <sender>LEFiltre</sender>
+ <signal>textChanged(const QString&)</signal>
+ <receiver>DFormule</receiver>
+ <slot>LEFiltreTextChanged()</slot>
+ </connection>
+ <connection>
+ <sender>LEFiltre</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DFormule</receiver>
+ <slot>LEfiltreReturnPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bSup</sender>
+ <signal>pressed()</signal>
+ <receiver>DFormule</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DFormule</receiver>
+ <slot>BOkPressed()</slot>
+ </connection>
+ <connection>
+ <sender>RBalpha</sender>
+ <signal>clicked()</signal>
+ <receiver>DFormule</receiver>
+ <slot>BuildTabCommand()</slot>
+ </connection>
+ <connection>
+ <sender>RBGroupe</sender>
+ <signal>clicked()</signal>
+ <receiver>DFormule</receiver>
+ <slot>BuildTabCommand()</slot>
+ </connection>
+ <connection>
+ <sender>BNext</sender>
+ <signal>clicked()</signal>
+ <receiver>DFormule</receiver>
+ <slot>BNextPressed()</slot>
+ </connection>
+ <connection>
+ <sender>LENomFormule</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DFormule</receiver>
+ <slot>NomFormuleSaisi()</slot>
+ </connection>
+ <connection>
+ <sender>LENomsArgs</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DFormule</receiver>
+ <slot>argsSaisis()</slot>
+ </connection>
+ <connection>
+ <sender>LECorpsFormule</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DFormule</receiver>
+ <slot>FormuleSaisie()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>LBNouvCommandeClicked()</slot>
+ <slot>LEFiltreTextChanged()</slot>
+ <slot>LEfiltreReturnPressed()</slot>
+ <slot>BSupPressed()</slot>
+ <slot>BOkPressed()</slot>
+ <slot>BuildTabCommand()</slot>
+ <slot>BNextPressed()</slot>
+ <slot>NomFormuleSaisi()</slot>
+ <slot>argsSaisis()</slot>
+ <slot>FormuleSaisie()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desInactif.ui'
+#
+# Created: lun mar 5 14:01:29 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DInactif(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ if not name:
+ self.setName("DInactif")
+
+ self.setMinimumSize(QSize(350,0))
+
+
+ self.textLabel1_4 = QLabel(self,"textLabel1_4")
+ self.textLabel1_4.setGeometry(QRect(30,240,420,20))
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+ self.textLabel1.setGeometry(QRect(30,220,420,20))
+
+ self.textLabel1_4_2 = QLabel(self,"textLabel1_4_2")
+ self.textLabel1_4_2.setGeometry(QRect(30,260,420,20))
+
+ self.bSup = QPushButton(self,"bSup")
+ self.bSup.setGeometry(QRect(170,430,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.textLabel1_3 = QLabel(self,"textLabel1_3")
+ self.textLabel1_3.setGeometry(QRect(20,130,420,20))
+
+ self.languageChange()
+
+ self.resize(QSize(482,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+
+
+ def languageChange(self):
+ self.setCaption(QString.null)
+ self.textLabel1_4.setText(self.__tr("<font size=\"+2\"><p align=\"center\">\n"
+" DEBUT / POURSUITE et FIN\n"
+"</p></font>"))
+ self.textLabel1.setText(self.__trUtf8("\x3c\x66\x6f\x6e\x74\x20\x73\x69\x7a\x65\x3d\x22\x2b\x32\x22\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x0a\x53\x65\x75\x6c\x65\x73\x20\x6c\x65\x73\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x73\x20\x70\x6c\x61\x63\xc3\xa9\x65\x73\x20\x65\x6e\x74\x72\x65\x20\x3a\x0a\x3c\x2f\x70\x3e\x3c\x2f\x66\x6f\x6e\x74\x3e"))
+ self.textLabel1_4_2.setText(self.__tr("<font size=\"+2\"><p align=\"center\">\n"
+"sont actives\n"
+"</p></font>"))
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.textLabel1_3.setText(self.__trUtf8("\x3c\x66\x6f\x6e\x74\x20\x73\x69\x7a\x65\x3d\x22\x2b\x32\x22\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x4c\x65\x20\x6e\x6f\x65\x75\x64\x20\x73\xc3\xa9\x6c\x65\x63\x74\x69\x6f\x6e\x6e\xc3\xa9\x20\x6e\x65\x20\x63\x6f\x72\x72\x65\x73\x70\x6f\x6e\x64\x20\x70\x61\x73\x20\xc3\xa0\x20\x75\x6e\x20\x6f\x62\x6a\x65\x74\x20\x61\x63\x74\x69\x66\x2e\x3c\x2f\x70\x3e\x3c\x2f\x66\x6f\x6e\x74\x3e"))
+
+
+ def BSupPressed(self):
+ print "DInactif.BSupPressed(): Not implemented yet"
+
+ def ViewDoc(self):
+ print "DInactif.ViewDoc(): Not implemented yet"
+
+ def BOkPressed(self):
+ print "DInactif.BOkPressed(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DInactif",s,c)
+
+ def __trUtf8(self,s,c = None):
+ return qApp.translate("DInactif",s,c,QApplication.UnicodeUTF8)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DInactif</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DInactif</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>482</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>350</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string></string>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>240</y>
+ <width>420</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><font size="+2"><p align="center">
+ DEBUT / POURSUITE et FIN
+</p></font></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>220</y>
+ <width>420</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><font size="+2"><p align="center">
+Seules les commandes placées entre :
+</p></font></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>260</y>
+ <width>420</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><font size="+2"><p align="center">
+sont actives
+</p></font></string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>170</x>
+ <y>430</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>130</y>
+ <width>420</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><font size="+2"><p align="center">Le noeud sélectionné ne correspond pas à un objet actif.</p></font></string>
+ </property>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>bSup</sender>
+ <signal>clicked()</signal>
+ <receiver>DInactif</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>BSupPressed()</slot>
+ <slot>ViewDoc()</slot>
+ <slot>BOkPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desMCFact.ui'
+#
+# Created: mer mar 21 12:08:55 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DMCFact(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ if not name:
+ self.setName("DMCFact")
+
+ self.setMinimumSize(QSize(505,0))
+
+
+ self.Commentaire = QLabel(self,"Commentaire")
+ self.Commentaire.setGeometry(QRect(10,410,490,20))
+
+ self.bSup = QPushButton(self,"bSup")
+ self.bSup.setGeometry(QRect(320,440,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.bOk = QPushButton(self,"bOk")
+ self.bOk.setGeometry(QRect(170,440,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.bHelp = QPushButton(self,"bHelp")
+ self.bHelp.setGeometry(QRect(10,440,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.TWChoix = QTabWidget(self,"TWChoix")
+ self.TWChoix.setGeometry(QRect(0,0,500,400))
+
+ self.MotClef = QWidget(self.TWChoix,"MotClef")
+
+ self.textLabel1_2 = QLabel(self.MotClef,"textLabel1_2")
+ self.textLabel1_2.setGeometry(QRect(360,0,50,37))
+
+ self.LBRegles = QListBox(self.MotClef,"LBRegles")
+ self.LBRegles.setGeometry(QRect(260,40,230,290))
+
+ self.textLabel1 = QLabel(self.MotClef,"textLabel1")
+ self.textLabel1.setGeometry(QRect(50,10,120,20))
+ self.textLabel1.setMinimumSize(QSize(0,0))
+
+ self.LBMCPermis = QListBox(self.MotClef,"LBMCPermis")
+ self.LBMCPermis.setGeometry(QRect(10,40,220,290))
+ self.LBMCPermis.setMinimumSize(QSize(0,0))
+ self.TWChoix.insertTab(self.MotClef,QString(""))
+
+ self.languageChange()
+
+ self.resize(QSize(521,499).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.bSup,SIGNAL("pressed()"),self.BSupPressed)
+ self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("DMacro"))
+ self.Commentaire.setText(QString.null)
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.textLabel1_2.setText(self.__trUtf8("\x3c\x68\x33\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x3c\x75\x3e\x3c\x62\x3e\x52\xc3\xa9\x67\x6c\x65\x73\x3c\x2f\x62\x3e\x3c\x2f\x75\x3e\x3c\x2f\x70\x3e\x3c\x2f\x68\x33\x3e"))
+ self.textLabel1.setText(self.__tr("<h3><p align=\"center\"><u><b>Mots Clefs Permis</b></u></p></h3>"))
+ self.TWChoix.changeTab(self.MotClef,self.__tr("Ajouter Mot-Clef"))
+
+
+ def LBNouvCommandeClicked(self):
+ print "DMCFact.LBNouvCommandeClicked(): Not implemented yet"
+
+ def LEFiltreTextChanged(self):
+ print "DMCFact.LEFiltreTextChanged(): Not implemented yet"
+
+ def LEfiltreReturnPressed(self):
+ print "DMCFact.LEfiltreReturnPressed(): Not implemented yet"
+
+ def BSupPressed(self):
+ print "DMCFact.BSupPressed(): Not implemented yet"
+
+ def BOkPressed(self):
+ print "DMCFact.BOkPressed(): Not implemented yet"
+
+ def buildTabCommand(self):
+ print "DMCFact.buildTabCommand(): Not implemented yet"
+
+ def BNextPressed(self):
+ print "DMCFact.BNextPressed(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DMCFact",s,c)
+
+ def __trUtf8(self,s,c = None):
+ return qApp.translate("DMCFact",s,c,QApplication.UnicodeUTF8)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DMCFact</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DMCFact</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>521</width>
+ <height>499</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>505</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>DMacro</string>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Commentaire</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>410</y>
+ <width>490</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>170</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>TWChoix</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>500</width>
+ <height>400</height>
+ </rect>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>MotClef</cstring>
+ </property>
+ <attribute name="title">
+ <string>Ajouter Mot-Clef</string>
+ </attribute>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>360</x>
+ <y>0</y>
+ <width>50</width>
+ <height>37</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><h3><p align="center"><u><b>Régles</b></u></p></h3></string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBRegles</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>260</x>
+ <y>40</y>
+ <width>230</width>
+ <height>290</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBMCPermis</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>220</width>
+ <height>290</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>10</y>
+ <width>140</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string><h3><p align="center"><u><b>Mots Clefs Permis</b></u></p></h3></string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>bSup</sender>
+ <signal>pressed()</signal>
+ <receiver>DMCFact</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DMCFact</receiver>
+ <slot>BOkPressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>LBNouvCommandeClicked()</slot>
+ <slot>LEFiltreTextChanged()</slot>
+ <slot>LEfiltreReturnPressed()</slot>
+ <slot>BSupPressed()</slot>
+ <slot>BOkPressed()</slot>
+ <slot>buildTabCommand()</slot>
+ <slot>BNextPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desMCListAjout.ui'
+#
+# Created: ven mar 23 12:13:13 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DMCListAjout(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ if not name:
+ self.setName("DMCListAjout")
+
+ self.setMinimumSize(QSize(350,0))
+
+
+ self.bSup = QPushButton(self,"bSup")
+ self.bSup.setGeometry(QRect(310,420,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.bOk = QPushButton(self,"bOk")
+ self.bOk.setGeometry(QRect(160,420,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.bHelp = QPushButton(self,"bHelp")
+ self.bHelp.setGeometry(QRect(10,420,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.bAjout = QPushButton(self,"bAjout")
+ self.bAjout.setGeometry(QRect(160,260,142,30))
+ self.bAjout.setAutoDefault(1)
+ self.bAjout.setDefault(1)
+
+ self.textLabel1_2_2 = QLabel(self,"textLabel1_2_2")
+ self.textLabel1_2_2.setGeometry(QRect(180,170,89,33))
+
+ self.textLabel1 = QLabel(self,"textLabel1")
+ self.textLabel1.setGeometry(QRect(160,50,140,36))
+
+ self.textLabel1_2 = QLabel(self,"textLabel1_2")
+ self.textLabel1_2.setGeometry(QRect(170,80,120,20))
+
+ self.MCFacteur = QLabel(self,"MCFacteur")
+ self.MCFacteur.setGeometry(QRect(200,120,50,20))
+
+ self.languageChange()
+
+ self.resize(QSize(459,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.bOk,SIGNAL("clicked()"),self.BAjoutClicked)
+ self.connect(self.bAjout,SIGNAL("clicked()"),self.BAjoutClicked)
+ self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("Form1"))
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.bAjout.setText(self.__tr("&Ajouter"))
+ self.bAjout.setAccel(self.__tr("Alt+A"))
+ QToolTip.add(self.bAjout,self.__tr("validation de la saisie"))
+ self.textLabel1_2_2.setText(self.__tr("<p align=\"center\"><font size=\"+1\">cliquez ci-dessous</font> </p>"))
+ self.textLabel1.setText(self.__tr("<p align=\"center\"><font size=\"+1\">Pour ajouter une autre occurrence</font></p>"))
+ self.textLabel1_2.setText(self.__tr("<p align=\"center\"><font size=\"+1\">du mot clef-facteur</font> </p>"))
+ self.MCFacteur.setText(self.__tr("<p align=\"center\">AFFE</p>"))
+
+
+ def BAjoutClicked(self):
+ print "DMCListAjout.BAjoutClicked(): Not implemented yet"
+
+ def BSupPressed(self):
+ print "DMCListAjout.BSupPressed(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DMCListAjout",s,c)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DMCListAjout</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DMCListAjout</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>459</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>350</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>Form1</string>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>310</x>
+ <y>420</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>160</x>
+ <y>420</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>420</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bAjout</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>160</x>
+ <y>260</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Ajouter</string>
+ </property>
+ <property name="accel">
+ <string>Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>170</y>
+ <width>89</width>
+ <height>33</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><p align="center"><font size="+1">cliquez ci-dessous</font> </p></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>160</x>
+ <y>50</y>
+ <width>140</width>
+ <height>36</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><p align="center"><font size="+1">Pour ajouter une autre occurrence</font></p></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>170</x>
+ <y>80</y>
+ <width>120</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><p align="center"><font size="+1">du mot clef-facteur</font> </p></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>MCFacteur</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>200</x>
+ <y>120</y>
+ <width>50</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><p align="center">AFFE</p></string>
+ </property>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DMCListAjout</receiver>
+ <slot>BAjoutClicked()</slot>
+ </connection>
+ <connection>
+ <sender>bAjout</sender>
+ <signal>clicked()</signal>
+ <receiver>DMCListAjout</receiver>
+ <slot>BAjoutClicked()</slot>
+ </connection>
+ <connection>
+ <sender>bSup</sender>
+ <signal>clicked()</signal>
+ <receiver>DMCListAjout</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>BAjoutClicked()</slot>
+ <slot>BSupPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desMacro.ui'
+#
+# Created: jeu avr 26 14:25:17 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+ "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+ "\xcf\x49\x44\x41\x54\x38\x8d\xd5\x94\xdb\x0e\xc3" \
+ "\x20\x0c\x43\xed\xfd\xf8\xd8\x97\xbb\x0f\x34\x5b" \
+ "\x48\x08\x45\xd5\x1e\xb6\x48\x88\xf4\x12\xe7\x60" \
+ "\x01\xc0\x0f\x04\x6f\xd6\xe9\x9b\xba\x77\x20\x04" \
+ "\x80\x92\x4a\x10\x32\xc9\x2e\xfb\xd8\xc7\xd5\xca" \
+ "\xbc\xc0\x25\x40\x00\x99\xe9\x57\x84\x95\x68\xfe" \
+ "\x7f\x06\xc0\xde\xd1\xde\xb3\x2b\x4a\x1e\xc4\xea" \
+ "\x82\x4b\x9e\x74\x09\x71\x65\xbd\x01\xf8\x55\x27" \
+ "\xf7\x8a\x72\x01\xe0\xa3\x12\x9f\x34\x5a\x01\x7c" \
+ "\x54\x3b\xaf\xdc\x98\x3d\x0f\x71\x09\xd1\x5a\x33" \
+ "\x1b\x47\x1f\x47\x07\x2c\x17\x49\x4a\x82\x33\x8f" \
+ "\x61\x78\x20\x3a\x88\x17\xe6\x73\x06\xb1\xf0\x8b" \
+ "\x07\xba\x03\xe6\x02\xc9\xb8\x31\x07\x7e\x37\xe0" \
+ "\x20\x9e\x67\xe3\x38\x67\x10\x97\x7b\x17\xde\x80" \
+ "\xc1\x85\xad\x38\x69\x5a\x51\xd5\x22\xc8\x2c\xe7" \
+ "\x79\x12\xe2\xfe\xd8\xbe\x83\x76\x20\x92\xf5\x2b" \
+ "\x18\x20\xdd\x11\xbb\x10\xe5\x65\xb5\x3a\x5a\x3b" \
+ "\xba\xff\x13\x07\x13\xd6\x6f\xa6\x98\x18\x57\x06" \
+ "\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
+
+class DMacro(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ self.image0 = QPixmap()
+ self.image0.loadFromData(image0_data,"PNG")
+ if not name:
+ self.setName("DMacro")
+
+ self.setMinimumSize(QSize(505,0))
+
+
+ self.Commentaire = QLabel(self,"Commentaire")
+ self.Commentaire.setGeometry(QRect(10,410,490,20))
+
+ self.bSup = QPushButton(self,"bSup")
+ self.bSup.setGeometry(QRect(320,440,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.bOk = QPushButton(self,"bOk")
+ self.bOk.setGeometry(QRect(170,440,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.bHelp = QPushButton(self,"bHelp")
+ self.bHelp.setGeometry(QRect(10,440,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.TWChoix = QTabWidget(self,"TWChoix")
+ self.TWChoix.setGeometry(QRect(0,0,500,400))
+
+ self.MotClef = QWidget(self.TWChoix,"MotClef")
+
+ self.textLabel1_2 = QLabel(self.MotClef,"textLabel1_2")
+ self.textLabel1_2.setGeometry(QRect(360,0,50,37))
+
+ self.LBMCPermis = QListBox(self.MotClef,"LBMCPermis")
+ self.LBMCPermis.setGeometry(QRect(10,40,220,290))
+ self.LBMCPermis.setMinimumSize(QSize(0,0))
+
+ self.LBRegles = QListBox(self.MotClef,"LBRegles")
+ self.LBRegles.setGeometry(QRect(260,40,230,290))
+
+ self.textLabel1 = QLabel(self.MotClef,"textLabel1")
+ self.textLabel1.setGeometry(QRect(50,10,120,20))
+ self.textLabel1.setMinimumSize(QSize(0,0))
+ self.TWChoix.insertTab(self.MotClef,QString(""))
+
+ self.Commande = QWidget(self.TWChoix,"Commande")
+
+ self.textLabel6 = QLabel(self.Commande,"textLabel6")
+ self.textLabel6.setGeometry(QRect(10,60,60,30))
+
+ self.textLabel4 = QLabel(self.Commande,"textLabel4")
+ self.textLabel4.setGeometry(QRect(90,340,300,30))
+
+ self.LBNouvCommande = QListBox(self.Commande,"LBNouvCommande")
+ self.LBNouvCommande.setGeometry(QRect(50,100,410,240))
+
+ self.buttonGroup1 = QButtonGroup(self.Commande,"buttonGroup1")
+ self.buttonGroup1.setGeometry(QRect(300,20,151,70))
+
+ self.RBGroupe = QRadioButton(self.buttonGroup1,"RBGroupe")
+ self.RBGroupe.setGeometry(QRect(20,40,101,20))
+
+ self.RBalpha = QRadioButton(self.buttonGroup1,"RBalpha")
+ self.RBalpha.setGeometry(QRect(20,20,101,20))
+ self.RBalpha.setChecked(1)
+
+ self.LEFiltre = QLineEdit(self.Commande,"LEFiltre")
+ self.LEFiltre.setGeometry(QRect(50,60,160,30))
+
+ self.textLabel1_4 = QLabel(self.Commande,"textLabel1_4")
+ self.textLabel1_4.setGeometry(QRect(50,20,171,21))
+
+ self.BNext = QToolButton(self.Commande,"BNext")
+ self.BNext.setGeometry(QRect(220,60,30,31))
+ self.BNext.setIconSet(QIconSet(self.image0))
+ self.TWChoix.insertTab(self.Commande,QString(""))
+
+ self.languageChange()
+
+ self.resize(QSize(521,499).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.LBNouvCommande,SIGNAL("clicked(QListBoxItem*)"),self.LBNouvCommandeClicked)
+ self.connect(self.LEFiltre,SIGNAL("textChanged(const QString&)"),self.LEFiltreTextChanged)
+ self.connect(self.LEFiltre,SIGNAL("returnPressed()"),self.LEfiltreReturnPressed)
+ self.connect(self.bSup,SIGNAL("pressed()"),self.BSupPressed)
+ self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+ self.connect(self.RBalpha,SIGNAL("clicked()"),self.BuildTabCommand)
+ self.connect(self.RBGroupe,SIGNAL("clicked()"),self.BuildTabCommand)
+ self.connect(self.BNext,SIGNAL("clicked()"),self.BNextPressed)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("DMacro"))
+ self.Commentaire.setText(QString.null)
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.textLabel1_2.setText(self.__trUtf8("\x3c\x68\x33\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x3c\x75\x3e\x3c\x62\x3e\x52\xc3\xa9\x67\x6c\x65\x73\x3c\x2f\x62\x3e\x3c\x2f\x75\x3e\x3c\x2f\x70\x3e\x3c\x2f\x68\x33\x3e"))
+ self.textLabel1.setText(self.__tr("<h3><p align=\"center\"><u><b>Mots Clefs Permis</b></u></p></h3>"))
+ self.TWChoix.changeTab(self.MotClef,self.__tr("Ajouter Mot-Clef"))
+ self.textLabel6.setText(self.__tr("Filtre"))
+ self.textLabel4.setText(self.__trUtf8("\x4c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x63\x68\x6f\x69\x73\x69\x65\x20\x73\x65\x72\x61\x20\x61\x6a\x6f\x75\x74\xc3\xa9\x65\x20\x41\x50\x52\x45\x53\x20\x6c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x63\x6f\x75\x72\x61\x6e\x74\x65"))
+ self.buttonGroup1.setTitle(self.__tr("Affichage"))
+ self.RBGroupe.setText(self.__tr("par groupe"))
+ self.RBalpha.setText(self.__trUtf8("\x61\x6c\x70\x68\x61\x62\xc3\xa9\x74\x69\x71\x75\x65"))
+ self.textLabel1_4.setText(self.__tr("<b><u>Commandes :</u></b>"))
+ self.BNext.setText(QString.null)
+ QToolTip.add(self.BNext,self.__tr("affiche la prochaine occurence"))
+ self.TWChoix.changeTab(self.Commande,self.__tr("Nouvelle Commande"))
+
+
+ def LBNouvCommandeClicked(self):
+ print "DMacro.LBNouvCommandeClicked(): Not implemented yet"
+
+ def LEFiltreTextChanged(self):
+ print "DMacro.LEFiltreTextChanged(): Not implemented yet"
+
+ def LEfiltreReturnPressed(self):
+ print "DMacro.LEfiltreReturnPressed(): Not implemented yet"
+
+ def BSupPressed(self):
+ print "DMacro.BSupPressed(): Not implemented yet"
+
+ def BOkPressed(self):
+ print "DMacro.BOkPressed(): Not implemented yet"
+
+ def BuildTabCommand(self):
+ print "DMacro.BuildTabCommand(): Not implemented yet"
+
+ def BNextPressed(self):
+ print "DMacro.BNextPressed(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DMacro",s,c)
+
+ def __trUtf8(self,s,c = None):
+ return qApp.translate("DMacro",s,c,QApplication.UnicodeUTF8)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DMacro</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DMacro</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>521</width>
+ <height>499</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>505</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>DMacro</string>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Commentaire</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>410</y>
+ <width>490</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>170</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>TWChoix</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>500</width>
+ <height>400</height>
+ </rect>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>MotClef</cstring>
+ </property>
+ <attribute name="title">
+ <string>Ajouter Mot-Clef</string>
+ </attribute>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>360</x>
+ <y>0</y>
+ <width>50</width>
+ <height>37</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><h3><p align="center"><u><b>Régles</b></u></p></h3></string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBMCPermis</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>220</width>
+ <height>290</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBRegles</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>260</x>
+ <y>40</y>
+ <width>230</width>
+ <height>290</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>10</y>
+ <width>120</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string><h3><p align="center"><u><b>Mots Clefs Permis</b></u></p></h3></string>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Commande</cstring>
+ </property>
+ <attribute name="title">
+ <string>Nouvelle Commande</string>
+ </attribute>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>60</y>
+ <width>60</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Filtre</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>90</x>
+ <y>340</y>
+ <width>300</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>La commande choisie sera ajoutée APRES la commande courante</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBNouvCommande</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>100</y>
+ <width>410</width>
+ <height>240</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>300</x>
+ <y>20</y>
+ <width>151</width>
+ <height>70</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Affichage</string>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RBGroupe</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>40</y>
+ <width>101</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>par groupe</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RBalpha</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>20</y>
+ <width>101</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>alphabétique</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LEFiltre</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>60</y>
+ <width>160</width>
+ <height>30</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>20</y>
+ <width>171</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><b><u>Commandes :</u></b></string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>BNext</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>220</x>
+ <y>60</y>
+ <width>30</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>image0</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affiche la prochaine occurence</string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+<images>
+ <image name="image0">
+ <data format="PNG" length="264">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>LBNouvCommande</sender>
+ <signal>clicked(QListBoxItem*)</signal>
+ <receiver>DMacro</receiver>
+ <slot>LBNouvCommandeClicked()</slot>
+ </connection>
+ <connection>
+ <sender>LEFiltre</sender>
+ <signal>textChanged(const QString&)</signal>
+ <receiver>DMacro</receiver>
+ <slot>LEFiltreTextChanged()</slot>
+ </connection>
+ <connection>
+ <sender>LEFiltre</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DMacro</receiver>
+ <slot>LEfiltreReturnPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bSup</sender>
+ <signal>pressed()</signal>
+ <receiver>DMacro</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DMacro</receiver>
+ <slot>BOkPressed()</slot>
+ </connection>
+ <connection>
+ <sender>RBalpha</sender>
+ <signal>clicked()</signal>
+ <receiver>DMacro</receiver>
+ <slot>BuildTabCommand()</slot>
+ </connection>
+ <connection>
+ <sender>RBGroupe</sender>
+ <signal>clicked()</signal>
+ <receiver>DMacro</receiver>
+ <slot>BuildTabCommand()</slot>
+ </connection>
+ <connection>
+ <sender>BNext</sender>
+ <signal>clicked()</signal>
+ <receiver>DMacro</receiver>
+ <slot>BNextPressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>LBNouvCommandeClicked()</slot>
+ <slot>LEFiltreTextChanged()</slot>
+ <slot>LEfiltreReturnPressed()</slot>
+ <slot>BSupPressed()</slot>
+ <slot>BOkPressed()</slot>
+ <slot>BuildTabCommand()</slot>
+ <slot>BNextPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desPlusieursBase.ui'
+#
+# Created: lun avr 23 09:30:04 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+ "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+ "\xc7\x49\x44\x41\x54\x38\x8d\xcd\x94\x59\x0e\xc3" \
+ "\x20\x0c\x44\x71\xd5\x7b\xc7\x3d\xf9\xf4\x07\xd3" \
+ "\x31\xb1\x59\xa2\x28\xaa\x25\x44\x48\xbc\x3c\xc6" \
+ "\x81\x52\xfe\xc0\xe4\x42\x0c\xee\xce\xb9\x12\xe0" \
+ "\x8a\x02\x39\x83\x88\x48\xf5\xdf\x02\xc9\x9c\x11" \
+ "\xf8\x60\x04\x30\x01\x19\x05\x4a\xe8\x68\xc5\x6a" \
+ "\xc2\x06\xc0\x6b\x4b\x10\x91\x11\xc8\x02\x87\x4f" \
+ "\x3a\x52\xa5\x87\x75\x71\x23\x89\x7e\x40\x39\xc4" \
+ "\x6b\x50\xd8\x86\x5b\x07\xf5\x40\x0a\x45\x00\x53" \
+ "\x33\x08\x93\xcf\x86\x74\xa3\x00\x28\xd4\x92\xde" \
+ "\xef\x04\x62\x6b\x55\x9d\xfe\x48\xac\x84\x2b\x1a" \
+ "\x6d\xaa\xe6\x85\x01\x55\x03\x3b\x99\xc5\x00\x9f" \
+ "\x70\xce\xda\x11\x1a\xab\x41\x3b\x6f\x6a\x70\xd1" \
+ "\x18\xe0\x08\xe6\xfd\x8b\xc5\x1d\x5d\x00\xa0\xf6" \
+ "\x14\x55\x6d\x1f\xf9\xb9\xbe\x49\x52\xaa\xbc\x37" \
+ "\x21\xf8\xf8\xb6\xf6\x24\xc5\x57\xef\x89\x47\xaf" \
+ "\xed\xf4\x8c\x5e\x60\xb8\xdf\xbe\xb8\x1d\x6d\xab" \
+ "\x9a\xff\x99\x27\x00\x00\x00\x00\x49\x45\x4e\x44" \
+ "\xae\x42\x60\x82"
+image1_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+ "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+ "\xcf\x49\x44\x41\x54\x38\x8d\xd5\x94\xdb\x0e\xc3" \
+ "\x20\x0c\x43\xed\xfd\xf8\xd8\x97\xbb\x0f\x34\x5b" \
+ "\x48\x08\x45\xd5\x1e\xb6\x48\x88\xf4\x12\xe7\x60" \
+ "\x01\xc0\x0f\x04\x6f\xd6\xe9\x9b\xba\x77\x20\x04" \
+ "\x80\x92\x4a\x10\x32\xc9\x2e\xfb\xd8\xc7\xd5\xca" \
+ "\xbc\xc0\x25\x40\x00\x99\xe9\x57\x84\x95\x68\xfe" \
+ "\x7f\x06\xc0\xde\xd1\xde\xb3\x2b\x4a\x1e\xc4\xea" \
+ "\x82\x4b\x9e\x74\x09\x71\x65\xbd\x01\xf8\x55\x27" \
+ "\xf7\x8a\x72\x01\xe0\xa3\x12\x9f\x34\x5a\x01\x7c" \
+ "\x54\x3b\xaf\xdc\x98\x3d\x0f\x71\x09\xd1\x5a\x33" \
+ "\x1b\x47\x1f\x47\x07\x2c\x17\x49\x4a\x82\x33\x8f" \
+ "\x61\x78\x20\x3a\x88\x17\xe6\x73\x06\xb1\xf0\x8b" \
+ "\x07\xba\x03\xe6\x02\xc9\xb8\x31\x07\x7e\x37\xe0" \
+ "\x20\x9e\x67\xe3\x38\x67\x10\x97\x7b\x17\xde\x80" \
+ "\xc1\x85\xad\x38\x69\x5a\x51\xd5\x22\xc8\x2c\xe7" \
+ "\x79\x12\xe2\xfe\xd8\xbe\x83\x76\x20\x92\xf5\x2b" \
+ "\x18\x20\xdd\x11\xbb\x10\xe5\x65\xb5\x3a\x5a\x3b" \
+ "\xba\xff\x13\x07\x13\xd6\x6f\xa6\x98\x18\x57\x06" \
+ "\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
+
+class DPlusBase(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ self.image0 = QPixmap()
+ self.image0.loadFromData(image0_data,"PNG")
+ self.image1 = QPixmap()
+ self.image1.loadFromData(image1_data,"PNG")
+ if not name:
+ self.setName("DPlusBase")
+
+ self.setMinimumSize(QSize(350,0))
+
+
+ self.tabuniqueinto = QTabWidget(self,"tabuniqueinto")
+ self.tabuniqueinto.setGeometry(QRect(20,20,450,440))
+
+ self.Widget8 = QWidget(self.tabuniqueinto,"Widget8")
+
+ self.bHelp = QPushButton(self.Widget8,"bHelp")
+ self.bHelp.setGeometry(QRect(0,370,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.bOk = QPushButton(self.Widget8,"bOk")
+ self.bOk.setGeometry(QRect(150,370,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.bSup = QPushButton(self.Widget8,"bSup")
+ self.bSup.setGeometry(QRect(300,370,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.bParam = QPushButton(self.Widget8,"bParam")
+ self.bParam.setGeometry(QRect(290,240,142,30))
+ self.bParam.setAutoDefault(1)
+
+ self.bImport = QPushButton(self.Widget8,"bImport")
+ self.bImport.setGeometry(QRect(290,280,142,30))
+ self.bImport.setAutoDefault(1)
+
+ self.Commentaire = QLabel(self.Widget8,"Commentaire")
+ self.Commentaire.setGeometry(QRect(38,337,381,20))
+
+ self.textLabel1 = QLabel(self.Widget8,"textLabel1")
+ self.textLabel1.setGeometry(QRect(40,20,120,21))
+
+ self.textLabel1_2 = QLabel(self.Widget8,"textLabel1_2")
+ self.textLabel1_2.setGeometry(QRect(330,80,45,21))
+
+ self.BAjout1Val = QToolButton(self.Widget8,"BAjout1Val")
+ self.BAjout1Val.setGeometry(QRect(230,120,40,31))
+ self.BAjout1Val.setIconSet(QIconSet(self.image0))
+
+ self.BSup1Val = QToolButton(self.Widget8,"BSup1Val")
+ self.BSup1Val.setGeometry(QRect(230,80,40,31))
+ self.BSup1Val.setIconSet(QIconSet(self.image1))
+
+ self.LBValeurs = QListBox(self.Widget8,"LBValeurs")
+ self.LBValeurs.setGeometry(QRect(20,50,180,280))
+
+ self.LEValeur = QLineEdit(self.Widget8,"LEValeur")
+ self.LEValeur.setGeometry(QRect(280,110,150,30))
+ self.tabuniqueinto.insertTab(self.Widget8,QString(""))
+
+ self.languageChange()
+
+ self.resize(QSize(482,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.bHelp,SIGNAL("clicked()"),self.ViewDoc)
+ self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPourListePressed)
+ self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+ self.connect(self.bParam,SIGNAL("clicked()"),self.BParametresPressed)
+ self.connect(self.bImport,SIGNAL("clicked()"),self.BImportPressed)
+ self.connect(self.BAjout1Val,SIGNAL("clicked()"),self.Ajout1Valeur)
+ self.connect(self.BSup1Val,SIGNAL("clicked()"),self.Sup1Valeur)
+ self.connect(self.LEValeur,SIGNAL("returnPressed()"),self.LEValeurPressed)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("DUnIn"))
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.bParam.setText(self.__tr("&Parametres"))
+ self.bParam.setAccel(self.__tr("Alt+P"))
+ QToolTip.add(self.bParam,self.__tr("suppression du mot clef"))
+ self.bImport.setText(self.__tr("&Importer"))
+ self.bImport.setAccel(self.__tr("Alt+I"))
+ QToolTip.add(self.bImport,self.__tr("suppression du mot clef"))
+ self.Commentaire.setText(QString.null)
+ self.textLabel1.setText(self.__tr("<u><font size=\"+1\">Valeur(s) actuelle(s)</font></u>"))
+ self.textLabel1_2.setText(self.__tr("<font size=\"+1\">Valeur</font>"))
+ self.BAjout1Val.setText(QString.null)
+ QToolTip.add(self.BAjout1Val,self.__trUtf8("\x61\x6a\x6f\x75\x74\x65\x20\x6c\x61\x20\x76\x61\x6c\x65\x75\x72\x20\x73\x61\x69\x73\x69\x65\x20\x73\x6f\x75\x73\x20\x6c\x20\x6f\x63\x63\x75\x72\x65\x6e\x63\x65\x20\x73\x65\x6c\x65\x63\x74\x69\x6f\x6e\x6e\xc3\xa9\x65\x20\x28\x65\x6e\x20\x66\x69\x6e\x20\x64\x65\x20\x6c\x69\x73\x74\x65\x20\x73\x69\x20\x69\x6c\x20\x6e\x20\x79\x20\x61\x20\x70\x61\x73\x20\x64\x65\x20\x73\x65\x6c\x65\x63\x74\x69\x6f\x6e\x29"))
+ self.BSup1Val.setText(QString.null)
+ QToolTip.add(self.BSup1Val,self.__tr("enleve l occurence selectionnee"))
+ self.tabuniqueinto.changeTab(self.Widget8,self.__tr("Saisir Valeur"))
+
+
+ def BSupPressed(self):
+ print "DPlusBase.BSupPressed(): Not implemented yet"
+
+ def ViewDoc(self):
+ print "DPlusBase.ViewDoc(): Not implemented yet"
+
+ def BOkPourListePressed(self):
+ print "DPlusBase.BOkPourListePressed(): Not implemented yet"
+
+ def BParametresPressed(self):
+ print "DPlusBase.BParametresPressed(): Not implemented yet"
+
+ def LEValeurPressed(self):
+ print "DPlusBase.LEValeurPressed(): Not implemented yet"
+
+ def Ajout1Valeur(self):
+ print "DPlusBase.Ajout1Valeur(): Not implemented yet"
+
+ def Sup1Valeur(self):
+ print "DPlusBase.Sup1Valeur(): Not implemented yet"
+
+ def BImportPressed(self):
+ print "DPlusBase.BImportPressed(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DPlusBase",s,c)
+
+ def __trUtf8(self,s,c = None):
+ return qApp.translate("DPlusBase",s,c,QApplication.UnicodeUTF8)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DPlusBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DPlusBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>482</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>350</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>DUnIn</string>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabuniqueinto</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>20</y>
+ <width>450</width>
+ <height>440</height>
+ </rect>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget8</cstring>
+ </property>
+ <attribute name="title">
+ <string>Saisir Valeur</string>
+ </attribute>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>150</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>300</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bParam</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>290</x>
+ <y>240</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Parametres</string>
+ </property>
+ <property name="accel">
+ <string>Alt+P</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bImport</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>290</x>
+ <y>280</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Importer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+I</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Commentaire</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>38</x>
+ <y>337</y>
+ <width>381</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>20</y>
+ <width>120</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><u><font size="+1">Valeur(s) actuelle(s)</font></u></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>330</x>
+ <y>80</y>
+ <width>45</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><font size="+1">Valeur</font></string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>BAjout1Val</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>230</x>
+ <y>120</y>
+ <width>40</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>image0</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>ajoute la valeur saisie sous l occurence selectionnée (en fin de liste si il n y a pas de selection)</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>BSup1Val</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>230</x>
+ <y>80</y>
+ <width>40</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>image1</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>enleve l occurence selectionnee</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBValeurs</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>50</y>
+ <width>180</width>
+ <height>280</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LEValeur</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>280</x>
+ <y>110</y>
+ <width>150</width>
+ <height>30</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+<images>
+ <image name="image0">
+ <data format="PNG" length="256">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000c749444154388dcd94590ec3200c4471d57bc73df9f407d331b159a228aa254448bc3cc68152fec0e4420ceeceb912e08a0239838848f5df02c99c11f86004300119054ae868c56ac206c06b4b109111c802874f3a52a587757123897e4039c46b50d8865b07f5400a450053330893cf8674a30028d492deef04626b559dfe48ac842b1a6daae6850155033b99c5009f70ceda111aab413b6f6a70d118e008e6fd8bc51d5d00a0f614556d1ff9b9be4952aabc3721f8f8b6f624c557ef8947afedf48c5e60b8dfbeb81d6dab9aff99270000000049454e44ae426082</data>
+ </image>
+ <image name="image1">
+ <data format="PNG" length="264">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>bHelp</sender>
+ <signal>clicked()</signal>
+ <receiver>DPlusBase</receiver>
+ <slot>ViewDoc()</slot>
+ </connection>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DPlusBase</receiver>
+ <slot>BOkPourListePressed()</slot>
+ </connection>
+ <connection>
+ <sender>bSup</sender>
+ <signal>clicked()</signal>
+ <receiver>DPlusBase</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bParam</sender>
+ <signal>clicked()</signal>
+ <receiver>DPlusBase</receiver>
+ <slot>BParametresPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bImport</sender>
+ <signal>clicked()</signal>
+ <receiver>DPlusBase</receiver>
+ <slot>BImportPressed()</slot>
+ </connection>
+ <connection>
+ <sender>BAjout1Val</sender>
+ <signal>clicked()</signal>
+ <receiver>DPlusBase</receiver>
+ <slot>Ajout1Valeur()</slot>
+ </connection>
+ <connection>
+ <sender>BSup1Val</sender>
+ <signal>clicked()</signal>
+ <receiver>DPlusBase</receiver>
+ <slot>Sup1Valeur()</slot>
+ </connection>
+ <connection>
+ <sender>LEValeur</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DPlusBase</receiver>
+ <slot>LEValeurPressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>BSupPressed()</slot>
+ <slot>ViewDoc()</slot>
+ <slot>BOkPourListePressed()</slot>
+ <slot>BParametresPressed()</slot>
+ <slot>LEValeurPressed()</slot>
+ <slot>Ajout1Valeur()</slot>
+ <slot>Sup1Valeur()</slot>
+ <slot>BImportPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desPlusieursInto.ui'
+#
+# Created: mer avr 25 09:04:00 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+ "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+ "\xcf\x49\x44\x41\x54\x38\x8d\xd5\x94\xdb\x0e\xc3" \
+ "\x20\x0c\x43\xed\xfd\xf8\xd8\x97\xbb\x0f\x34\x5b" \
+ "\x48\x08\x45\xd5\x1e\xb6\x48\x88\xf4\x12\xe7\x60" \
+ "\x01\xc0\x0f\x04\x6f\xd6\xe9\x9b\xba\x77\x20\x04" \
+ "\x80\x92\x4a\x10\x32\xc9\x2e\xfb\xd8\xc7\xd5\xca" \
+ "\xbc\xc0\x25\x40\x00\x99\xe9\x57\x84\x95\x68\xfe" \
+ "\x7f\x06\xc0\xde\xd1\xde\xb3\x2b\x4a\x1e\xc4\xea" \
+ "\x82\x4b\x9e\x74\x09\x71\x65\xbd\x01\xf8\x55\x27" \
+ "\xf7\x8a\x72\x01\xe0\xa3\x12\x9f\x34\x5a\x01\x7c" \
+ "\x54\x3b\xaf\xdc\x98\x3d\x0f\x71\x09\xd1\x5a\x33" \
+ "\x1b\x47\x1f\x47\x07\x2c\x17\x49\x4a\x82\x33\x8f" \
+ "\x61\x78\x20\x3a\x88\x17\xe6\x73\x06\xb1\xf0\x8b" \
+ "\x07\xba\x03\xe6\x02\xc9\xb8\x31\x07\x7e\x37\xe0" \
+ "\x20\x9e\x67\xe3\x38\x67\x10\x97\x7b\x17\xde\x80" \
+ "\xc1\x85\xad\x38\x69\x5a\x51\xd5\x22\xc8\x2c\xe7" \
+ "\x79\x12\xe2\xfe\xd8\xbe\x83\x76\x20\x92\xf5\x2b" \
+ "\x18\x20\xdd\x11\xbb\x10\xe5\x65\xb5\x3a\x5a\x3b" \
+ "\xba\xff\x13\x07\x13\xd6\x6f\xa6\x98\x18\x57\x06" \
+ "\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
+image1_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+ "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+ "\xc7\x49\x44\x41\x54\x38\x8d\xcd\x94\x59\x0e\xc3" \
+ "\x20\x0c\x44\x71\xd5\x7b\xc7\x3d\xf9\xf4\x07\xd3" \
+ "\x31\xb1\x59\xa2\x28\xaa\x25\x44\x48\xbc\x3c\xc6" \
+ "\x81\x52\xfe\xc0\xe4\x42\x0c\xee\xce\xb9\x12\xe0" \
+ "\x8a\x02\x39\x83\x88\x48\xf5\xdf\x02\xc9\x9c\x11" \
+ "\xf8\x60\x04\x30\x01\x19\x05\x4a\xe8\x68\xc5\x6a" \
+ "\xc2\x06\xc0\x6b\x4b\x10\x91\x11\xc8\x02\x87\x4f" \
+ "\x3a\x52\xa5\x87\x75\x71\x23\x89\x7e\x40\x39\xc4" \
+ "\x6b\x50\xd8\x86\x5b\x07\xf5\x40\x0a\x45\x00\x53" \
+ "\x33\x08\x93\xcf\x86\x74\xa3\x00\x28\xd4\x92\xde" \
+ "\xef\x04\x62\x6b\x55\x9d\xfe\x48\xac\x84\x2b\x1a" \
+ "\x6d\xaa\xe6\x85\x01\x55\x03\x3b\x99\xc5\x00\x9f" \
+ "\x70\xce\xda\x11\x1a\xab\x41\x3b\x6f\x6a\x70\xd1" \
+ "\x18\xe0\x08\xe6\xfd\x8b\xc5\x1d\x5d\x00\xa0\xf6" \
+ "\x14\x55\x6d\x1f\xf9\xb9\xbe\x49\x52\xaa\xbc\x37" \
+ "\x21\xf8\xf8\xb6\xf6\x24\xc5\x57\xef\x89\x47\xaf" \
+ "\xed\xf4\x8c\x5e\x60\xb8\xdf\xbe\xb8\x1d\x6d\xab" \
+ "\x9a\xff\x99\x27\x00\x00\x00\x00\x49\x45\x4e\x44" \
+ "\xae\x42\x60\x82"
+
+class DPlusInto(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ self.image0 = QPixmap()
+ self.image0.loadFromData(image0_data,"PNG")
+ self.image1 = QPixmap()
+ self.image1.loadFromData(image1_data,"PNG")
+ if not name:
+ self.setName("DPlusInto")
+
+ self.setMinimumSize(QSize(350,0))
+
+
+ self.tabuniqueinto = QTabWidget(self,"tabuniqueinto")
+ self.tabuniqueinto.setGeometry(QRect(20,20,450,440))
+
+ self.Widget8 = QWidget(self.tabuniqueinto,"Widget8")
+
+ self.bHelp = QPushButton(self.Widget8,"bHelp")
+ self.bHelp.setGeometry(QRect(0,370,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.bOk = QPushButton(self.Widget8,"bOk")
+ self.bOk.setGeometry(QRect(150,370,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.bSup = QPushButton(self.Widget8,"bSup")
+ self.bSup.setGeometry(QRect(300,370,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.LBValeurs = QListBox(self.Widget8,"LBValeurs")
+ self.LBValeurs.setGeometry(QRect(10,50,180,280))
+
+ self.BSup1Val = QToolButton(self.Widget8,"BSup1Val")
+ self.BSup1Val.setGeometry(QRect(200,70,40,31))
+ self.BSup1Val.setIconSet(QIconSet(self.image0))
+
+ self.BAjout1Val = QToolButton(self.Widget8,"BAjout1Val")
+ self.BAjout1Val.setGeometry(QRect(200,110,40,31))
+ self.BAjout1Val.setIconSet(QIconSet(self.image1))
+
+ self.textLabel1 = QLabel(self.Widget8,"textLabel1")
+ self.textLabel1.setGeometry(QRect(40,20,120,21))
+
+ self.textLabel1_2 = QLabel(self.Widget8,"textLabel1_2")
+ self.textLabel1_2.setGeometry(QRect(278,16,130,21))
+
+ self.Commentaire = QLabel(self.Widget8,"Commentaire")
+ self.Commentaire.setGeometry(QRect(30,340,381,20))
+
+ self.listBoxVal = QListBox(self.Widget8,"listBoxVal")
+ self.listBoxVal.setGeometry(QRect(250,50,180,280))
+ self.tabuniqueinto.insertTab(self.Widget8,QString(""))
+
+ self.languageChange()
+
+ self.resize(QSize(482,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.bHelp,SIGNAL("clicked()"),self.ViewDoc)
+ self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPourListePressed)
+ self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+ self.connect(self.LBValeurs,SIGNAL("doubleClicked(QListBoxItem*)"),self.Sup1Valeur)
+ self.connect(self.BAjout1Val,SIGNAL("clicked()"),self.Ajout1Valeur)
+ self.connect(self.BSup1Val,SIGNAL("clicked()"),self.Sup1Valeur)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("DUnIn"))
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.BSup1Val.setText(QString.null)
+ QToolTip.add(self.BSup1Val,self.__tr("enleve l occurence selectionnee"))
+ self.BAjout1Val.setText(QString.null)
+ QToolTip.add(self.BAjout1Val,self.__trUtf8("\x61\x6a\x6f\x75\x74\x65\x20\x6c\x61\x20\x76\x61\x6c\x65\x75\x72\x20\x73\x61\x69\x73\x69\x65\x20\x73\x6f\x75\x73\x20\x6c\x20\x6f\x63\x63\x75\x72\x65\x6e\x63\x65\x20\x73\x65\x6c\x65\x63\x74\x69\x6f\x6e\x6e\xc3\xa9\x65\x20\x28\x65\x6e\x20\x66\x69\x6e\x20\x64\x65\x20\x6c\x69\x73\x74\x65\x20\x73\x69\x20\x69\x6c\x20\x6e\x20\x79\x20\x61\x20\x70\x61\x73\x20\x64\x65\x20\x73\x65\x6c\x65\x63\x74\x69\x6f\x6e\x29"))
+ self.textLabel1.setText(self.__tr("<u><font size=\"+1\">Valeur(s) actuelle(s)</font></u>"))
+ self.textLabel1_2.setText(self.__tr("<u><font size=\"+1\">Valeur(s) possibles(s)</font></u>"))
+ self.Commentaire.setText(QString.null)
+ self.tabuniqueinto.changeTab(self.Widget8,self.__tr("Saisir Valeur"))
+
+
+ def BSupPressed(self):
+ print "DPlusInto.BSupPressed(): Not implemented yet"
+
+ def ViewDoc(self):
+ print "DPlusInto.ViewDoc(): Not implemented yet"
+
+ def BOkPourListePressed(self):
+ print "DPlusInto.BOkPourListePressed(): Not implemented yet"
+
+ def Ajout1Valeur(self):
+ print "DPlusInto.Ajout1Valeur(): Not implemented yet"
+
+ def Sup1Valeur(self):
+ print "DPlusInto.Sup1Valeur(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DPlusInto",s,c)
+
+ def __trUtf8(self,s,c = None):
+ return qApp.translate("DPlusInto",s,c,QApplication.UnicodeUTF8)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DPlusInto</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DPlusInto</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>482</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>350</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>DUnIn</string>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabuniqueinto</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>20</y>
+ <width>450</width>
+ <height>440</height>
+ </rect>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget8</cstring>
+ </property>
+ <attribute name="title">
+ <string>Saisir Valeur</string>
+ </attribute>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>150</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>300</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBValeurs</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>50</y>
+ <width>180</width>
+ <height>280</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>BSup1Val</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>200</x>
+ <y>70</y>
+ <width>40</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>image0</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>enleve l occurence selectionnee</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>BAjout1Val</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>200</x>
+ <y>110</y>
+ <width>40</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>image1</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>ajoute la valeur saisie sous l occurence selectionnée (en fin de liste si il n y a pas de selection)</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>20</y>
+ <width>120</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><u><font size="+1">Valeur(s) actuelle(s)</font></u></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>278</x>
+ <y>16</y>
+ <width>130</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><u><font size="+1">Valeur(s) possibles(s)</font></u></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Commentaire</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>340</y>
+ <width>381</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>listBoxVal</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>250</x>
+ <y>50</y>
+ <width>180</width>
+ <height>280</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+<images>
+ <image name="image0">
+ <data format="PNG" length="264">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082</data>
+ </image>
+ <image name="image1">
+ <data format="PNG" length="256">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000c749444154388dcd94590ec3200c4471d57bc73df9f407d331b159a228aa254448bc3cc68152fec0e4420ceeceb912e08a0239838848f5df02c99c11f86004300119054ae868c56ac206c06b4b109111c802874f3a52a587757123897e4039c46b50d8865b07f5400a450053330893cf8674a30028d492deef04626b559dfe48ac842b1a6daae6850155033b99c5009f70ceda111aab413b6f6a70d118e008e6fd8bc51d5d00a0f614556d1ff9b9be4952aabc3721f8f8b6f624c557ef8947afedf48c5e60b8dfbeb81d6dab9aff99270000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>bHelp</sender>
+ <signal>clicked()</signal>
+ <receiver>DPlusInto</receiver>
+ <slot>ViewDoc()</slot>
+ </connection>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DPlusInto</receiver>
+ <slot>BOkPourListePressed()</slot>
+ </connection>
+ <connection>
+ <sender>bSup</sender>
+ <signal>clicked()</signal>
+ <receiver>DPlusInto</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+ <connection>
+ <sender>LBValeurs</sender>
+ <signal>doubleClicked(QListBoxItem*)</signal>
+ <receiver>DPlusInto</receiver>
+ <slot>Sup1Valeur()</slot>
+ </connection>
+ <connection>
+ <sender>BAjout1Val</sender>
+ <signal>clicked()</signal>
+ <receiver>DPlusInto</receiver>
+ <slot>Ajout1Valeur()</slot>
+ </connection>
+ <connection>
+ <sender>BSup1Val</sender>
+ <signal>clicked()</signal>
+ <receiver>DPlusInto</receiver>
+ <slot>Sup1Valeur()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>BSupPressed()</slot>
+ <slot>ViewDoc()</slot>
+ <slot>BOkPourListePressed()</slot>
+ <slot>Ajout1Valeur()</slot>
+ <slot>Sup1Valeur()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desRacine.ui'
+#
+# Created: jeu avr 26 14:24:43 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+ "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+ "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+ "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+ "\xcf\x49\x44\x41\x54\x38\x8d\xd5\x94\xdb\x0e\xc3" \
+ "\x20\x0c\x43\xed\xfd\xf8\xd8\x97\xbb\x0f\x34\x5b" \
+ "\x48\x08\x45\xd5\x1e\xb6\x48\x88\xf4\x12\xe7\x60" \
+ "\x01\xc0\x0f\x04\x6f\xd6\xe9\x9b\xba\x77\x20\x04" \
+ "\x80\x92\x4a\x10\x32\xc9\x2e\xfb\xd8\xc7\xd5\xca" \
+ "\xbc\xc0\x25\x40\x00\x99\xe9\x57\x84\x95\x68\xfe" \
+ "\x7f\x06\xc0\xde\xd1\xde\xb3\x2b\x4a\x1e\xc4\xea" \
+ "\x82\x4b\x9e\x74\x09\x71\x65\xbd\x01\xf8\x55\x27" \
+ "\xf7\x8a\x72\x01\xe0\xa3\x12\x9f\x34\x5a\x01\x7c" \
+ "\x54\x3b\xaf\xdc\x98\x3d\x0f\x71\x09\xd1\x5a\x33" \
+ "\x1b\x47\x1f\x47\x07\x2c\x17\x49\x4a\x82\x33\x8f" \
+ "\x61\x78\x20\x3a\x88\x17\xe6\x73\x06\xb1\xf0\x8b" \
+ "\x07\xba\x03\xe6\x02\xc9\xb8\x31\x07\x7e\x37\xe0" \
+ "\x20\x9e\x67\xe3\x38\x67\x10\x97\x7b\x17\xde\x80" \
+ "\xc1\x85\xad\x38\x69\x5a\x51\xd5\x22\xc8\x2c\xe7" \
+ "\x79\x12\xe2\xfe\xd8\xbe\x83\x76\x20\x92\xf5\x2b" \
+ "\x18\x20\xdd\x11\xbb\x10\xe5\x65\xb5\x3a\x5a\x3b" \
+ "\xba\xff\x13\x07\x13\xd6\x6f\xa6\x98\x18\x57\x06" \
+ "\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
+
+class DRac(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ self.image0 = QPixmap()
+ self.image0.loadFromData(image0_data,"PNG")
+ if not name:
+ self.setName("DRac")
+
+ self.setMinimumSize(QSize(505,0))
+
+
+ self.bHelp = QPushButton(self,"bHelp")
+ self.bHelp.setGeometry(QRect(10,440,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.textLabel6 = QLabel(self,"textLabel6")
+ self.textLabel6.setGeometry(QRect(10,70,30,30))
+
+ self.textLabel1_4_2 = QLabel(self,"textLabel1_4_2")
+ self.textLabel1_4_2.setGeometry(QRect(350,0,50,21))
+
+ self.LEFiltre = QLineEdit(self,"LEFiltre")
+ self.LEFiltre.setGeometry(QRect(50,70,140,30))
+
+ self.BNext = QToolButton(self,"BNext")
+ self.BNext.setGeometry(QRect(200,70,30,31))
+ self.BNext.setIconSet(QIconSet(self.image0))
+
+ self.textLabel1_4 = QLabel(self,"textLabel1_4")
+ self.textLabel1_4.setGeometry(QRect(90,0,75,21))
+
+ self.buttonGroup1 = QButtonGroup(self,"buttonGroup1")
+ self.buttonGroup1.setGeometry(QRect(10,20,230,40))
+
+ self.RBGroupe = QRadioButton(self.buttonGroup1,"RBGroupe")
+ self.RBGroupe.setGeometry(QRect(20,10,101,20))
+
+ self.RBalpha = QRadioButton(self.buttonGroup1,"RBalpha")
+ self.RBalpha.setGeometry(QRect(140,10,80,20))
+ self.RBalpha.setChecked(1)
+
+ self.bOk = QPushButton(self,"bOk")
+ self.bOk.setGeometry(QRect(180,440,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.bSup = QPushButton(self,"bSup")
+ self.bSup.setGeometry(QRect(350,440,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.LBNouvCommande = QListBox(self,"LBNouvCommande")
+ self.LBNouvCommande.setGeometry(QRect(10,110,230,320))
+
+ self.LBRegles = QListBox(self,"LBRegles")
+ self.LBRegles.setGeometry(QRect(260,30,230,400))
+
+ self.languageChange()
+
+ self.resize(QSize(505,499).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.LBNouvCommande,SIGNAL("clicked(QListBoxItem*)"),self.LBNouvCommandeClicked)
+ self.connect(self.LEFiltre,SIGNAL("textChanged(const QString&)"),self.LEFiltreTextChanged)
+ self.connect(self.LEFiltre,SIGNAL("returnPressed()"),self.LEfiltreReturnPressed)
+ self.connect(self.bSup,SIGNAL("pressed()"),self.BSupPressed)
+ self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+ self.connect(self.RBalpha,SIGNAL("clicked()"),self.BuildTabCommand)
+ self.connect(self.RBGroupe,SIGNAL("clicked()"),self.BuildTabCommand)
+ self.connect(self.BNext,SIGNAL("clicked()"),self.BNextPressed)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("DMacro"))
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.textLabel6.setText(self.__tr("Filtre"))
+ self.textLabel1_4_2.setText(self.__trUtf8("\x3c\x62\x3e\x3c\x75\x3e\x52\xc3\xa9\x67\x6c\x65\x73\x20\x3a\x3c\x2f\x75\x3e\x3c\x2f\x62\x3e"))
+ self.BNext.setText(QString.null)
+ QToolTip.add(self.BNext,self.__tr("affiche la prochaine occurence"))
+ self.textLabel1_4.setText(self.__tr("<b><u>Commandes :</u></b>"))
+ self.buttonGroup1.setTitle(self.__tr("Affichage"))
+ self.RBGroupe.setText(self.__tr("par groupe"))
+ self.RBalpha.setText(self.__trUtf8("\x61\x6c\x70\x68\x61\x62\xc3\xa9\x74\x69\x71\x75\x65"))
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+
+
+ def LBNouvCommandeClicked(self):
+ print "DRac.LBNouvCommandeClicked(): Not implemented yet"
+
+ def LEFiltreTextChanged(self):
+ print "DRac.LEFiltreTextChanged(): Not implemented yet"
+
+ def LEfiltreReturnPressed(self):
+ print "DRac.LEfiltreReturnPressed(): Not implemented yet"
+
+ def BSupPressed(self):
+ print "DRac.BSupPressed(): Not implemented yet"
+
+ def BOkPressed(self):
+ print "DRac.BOkPressed(): Not implemented yet"
+
+ def BuildTabCommand(self):
+ print "DRac.BuildTabCommand(): Not implemented yet"
+
+ def BNextPressed(self):
+ print "DRac.BNextPressed(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DRac",s,c)
+
+ def __trUtf8(self,s,c = None):
+ return qApp.translate("DRac",s,c,QApplication.UnicodeUTF8)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DRac</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DRac</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>505</width>
+ <height>499</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>505</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>DMacro</string>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>70</y>
+ <width>30</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Filtre</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>350</x>
+ <y>0</y>
+ <width>50</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><b><u>Régles :</u></b></string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LEFiltre</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>70</y>
+ <width>140</width>
+ <height>30</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>BNext</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>200</x>
+ <y>70</y>
+ <width>30</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>image0</iconset>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affiche la prochaine occurence</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>90</x>
+ <y>0</y>
+ <width>75</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><b><u>Commandes :</u></b></string>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>230</width>
+ <height>40</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Affichage</string>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RBGroupe</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>10</y>
+ <width>101</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>par groupe</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RBalpha</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>140</x>
+ <y>10</y>
+ <width>80</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>alphabétique</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>180</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>350</x>
+ <y>440</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBNouvCommande</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>110</y>
+ <width>230</width>
+ <height>320</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>LBRegles</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>260</x>
+ <y>30</y>
+ <width>230</width>
+ <height>400</height>
+ </rect>
+ </property>
+ </widget>
+</widget>
+<images>
+ <image name="image0">
+ <data format="PNG" length="264">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>LBNouvCommande</sender>
+ <signal>clicked(QListBoxItem*)</signal>
+ <receiver>DRac</receiver>
+ <slot>LBNouvCommandeClicked()</slot>
+ </connection>
+ <connection>
+ <sender>LEFiltre</sender>
+ <signal>textChanged(const QString&)</signal>
+ <receiver>DRac</receiver>
+ <slot>LEFiltreTextChanged()</slot>
+ </connection>
+ <connection>
+ <sender>LEFiltre</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DRac</receiver>
+ <slot>LEfiltreReturnPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bSup</sender>
+ <signal>pressed()</signal>
+ <receiver>DRac</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DRac</receiver>
+ <slot>BOkPressed()</slot>
+ </connection>
+ <connection>
+ <sender>RBalpha</sender>
+ <signal>clicked()</signal>
+ <receiver>DRac</receiver>
+ <slot>BuildTabCommand()</slot>
+ </connection>
+ <connection>
+ <sender>RBGroupe</sender>
+ <signal>clicked()</signal>
+ <receiver>DRac</receiver>
+ <slot>BuildTabCommand()</slot>
+ </connection>
+ <connection>
+ <sender>BNext</sender>
+ <signal>clicked()</signal>
+ <receiver>DRac</receiver>
+ <slot>BNextPressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>LBNouvCommandeClicked()</slot>
+ <slot>LEFiltreTextChanged()</slot>
+ <slot>LEfiltreReturnPressed()</slot>
+ <slot>BSupPressed()</slot>
+ <slot>BOkPressed()</slot>
+ <slot>BuildTabCommand()</slot>
+ <slot>BNextPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desUniqueASSD.ui'
+#
+# Created: mer mar 21 10:41:08 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DUnASSD(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ if not name:
+ self.setName("DUnASSD")
+
+ self.setMinimumSize(QSize(350,0))
+
+
+ self.tabuniqueinto = QTabWidget(self,"tabuniqueinto")
+ self.tabuniqueinto.setGeometry(QRect(10,20,460,440))
+
+ self.Widget8 = QWidget(self.tabuniqueinto,"Widget8")
+
+ self.bSup = QPushButton(self.Widget8,"bSup")
+ self.bSup.setGeometry(QRect(310,370,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.bOk = QPushButton(self.Widget8,"bOk")
+ self.bOk.setGeometry(QRect(160,370,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.bHelp = QPushButton(self.Widget8,"bHelp")
+ self.bHelp.setGeometry(QRect(10,370,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.textLabel2 = QLabel(self.Widget8,"textLabel2")
+ self.textLabel2.setGeometry(QRect(140,20,160,60))
+
+ self.Commentaire = QLabel(self.Widget8,"Commentaire")
+ self.Commentaire.setGeometry(QRect(40,311,381,30))
+
+ self.listBoxASSD = QListBox(self.Widget8,"listBoxASSD")
+ self.listBoxASSD.setGeometry(QRect(40,100,380,180))
+ self.tabuniqueinto.insertTab(self.Widget8,QString(""))
+
+ self.languageChange()
+
+ self.resize(QSize(482,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.bHelp,SIGNAL("clicked()"),self.ViewDoc)
+ self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+ self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("DUnIn"))
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.textLabel2.setText(self.__trUtf8("\x3c\x66\x6f\x6e\x74\x20\x73\x69\x7a\x65\x3d\x22\x2b\x31\x22\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x53\x74\x72\x75\x63\x74\x75\x72\x65\x73\x20\x64\x65\x20\x64\x6f\x6e\x6e\xc3\xa9\x65\x73\x20\x64\x75\x20\x74\x79\x70\x65\x0a\x72\x65\x71\x75\x69\x73\x20\x70\x61\x72\x20\x6c\x27\x6f\x62\x6a\x65\x74\x20\x63\x6f\x75\x72\x61\x6e\x74\x20\x3a\x3c\x2f\x70\x3e\x3c\x2f\x66\x6f\x6e\x74\x3e"))
+ self.Commentaire.setText(QString.null)
+ self.tabuniqueinto.changeTab(self.Widget8,self.__tr("Saisir Valeur"))
+
+
+ def BSupPressed(self):
+ print "DUnASSD.BSupPressed(): Not implemented yet"
+
+ def ViewDoc(self):
+ print "DUnASSD.ViewDoc(): Not implemented yet"
+
+ def BOkPressed(self):
+ print "DUnASSD.BOkPressed(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DUnASSD",s,c)
+
+ def __trUtf8(self,s,c = None):
+ return qApp.translate("DUnASSD",s,c,QApplication.UnicodeUTF8)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DUnASSD</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DUnASSD</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>482</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>350</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>DUnIn</string>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabuniqueinto</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>460</width>
+ <height>440</height>
+ </rect>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget8</cstring>
+ </property>
+ <attribute name="title">
+ <string>Saisir Valeur</string>
+ </attribute>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>310</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>160</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>140</x>
+ <y>20</y>
+ <width>160</width>
+ <height>60</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><font size="+1"><p align="center">Structures de données du type
+requis par l'objet courant :</p></font></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Commentaire</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>311</y>
+ <width>381</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>listBoxASSD</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>100</y>
+ <width>380</width>
+ <height>180</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>bHelp</sender>
+ <signal>clicked()</signal>
+ <receiver>DUnASSD</receiver>
+ <slot>ViewDoc()</slot>
+ </connection>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DUnASSD</receiver>
+ <slot>BOkPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bSup</sender>
+ <signal>clicked()</signal>
+ <receiver>DUnASSD</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>BSupPressed()</slot>
+ <slot>ViewDoc()</slot>
+ <slot>BOkPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desUniqueBasePanel.ui'
+#
+# Created: mar mar 20 14:05:29 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DUnBase(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ if not name:
+ self.setName("DUnBase")
+
+ self.setMinimumSize(QSize(350,0))
+
+
+ self.tabuniqueinto = QTabWidget(self,"tabuniqueinto")
+ self.tabuniqueinto.setGeometry(QRect(10,20,460,440))
+
+ self.Widget8 = QWidget(self.tabuniqueinto,"Widget8")
+
+ self.bSup = QPushButton(self.Widget8,"bSup")
+ self.bSup.setGeometry(QRect(310,370,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.bOk = QPushButton(self.Widget8,"bOk")
+ self.bOk.setGeometry(QRect(160,370,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.bHelp = QPushButton(self.Widget8,"bHelp")
+ self.bHelp.setGeometry(QRect(10,370,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.Commentaire = QLabel(self.Widget8,"Commentaire")
+ self.Commentaire.setGeometry(QRect(38,316,381,41))
+
+ self.textLabel2 = QLabel(self.Widget8,"textLabel2")
+ self.textLabel2.setGeometry(QRect(40,160,50,21))
+
+ self.lineEditVal = QLineEdit(self.Widget8,"lineEditVal")
+ self.lineEditVal.setGeometry(QRect(120,150,231,31))
+
+ self.bParametres = QPushButton(self.Widget8,"bParametres")
+ self.bParametres.setGeometry(QRect(300,10,140,30))
+ self.tabuniqueinto.insertTab(self.Widget8,QString(""))
+
+ self.languageChange()
+
+ self.resize(QSize(482,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.bHelp,SIGNAL("clicked()"),self.ViewDoc)
+ self.connect(self.bOk,SIGNAL("clicked()"),self.BOk2Pressed)
+ self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+ self.connect(self.lineEditVal,SIGNAL("returnPressed()"),self.LEValeurPressed)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("DUnIn"))
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.Commentaire.setText(QString.null)
+ self.textLabel2.setText(self.__tr("<b><u><p align=\"center\">Valeur: </p></u></b>"))
+ self.bParametres.setText(self.__tr("Parametres"))
+ self.tabuniqueinto.changeTab(self.Widget8,self.__tr("Saisir Valeur"))
+
+
+ def BSupPressed(self):
+ print "DUnBase.BSupPressed(): Not implemented yet"
+
+ def ViewDoc(self):
+ print "DUnBase.ViewDoc(): Not implemented yet"
+
+ def BOk2Pressed(self):
+ print "DUnBase.BOk2Pressed(): Not implemented yet"
+
+ def BParametresPressed(self):
+ print "DUnBase.BParametresPressed(): Not implemented yet"
+
+ def LEValeurPressed(self):
+ print "DUnBase.LEValeurPressed(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DUnBase",s,c)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DUnBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DUnBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>482</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>350</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>DUnIn</string>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabuniqueinto</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>460</width>
+ <height>440</height>
+ </rect>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget8</cstring>
+ </property>
+ <attribute name="title">
+ <string>Saisir Valeur</string>
+ </attribute>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>310</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>160</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Commentaire</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>38</x>
+ <y>316</y>
+ <width>381</width>
+ <height>41</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>160</y>
+ <width>50</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><b><u><p align="center">Valeur: </p></u></b></string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>lineEditVal</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>120</x>
+ <y>150</y>
+ <width>231</width>
+ <height>31</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bParametres</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>300</x>
+ <y>10</y>
+ <width>140</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Parametres</string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>bHelp</sender>
+ <signal>clicked()</signal>
+ <receiver>DUnBase</receiver>
+ <slot>ViewDoc()</slot>
+ </connection>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DUnBase</receiver>
+ <slot>BOk2Pressed()</slot>
+ </connection>
+ <connection>
+ <sender>bSup</sender>
+ <signal>clicked()</signal>
+ <receiver>DUnBase</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+ <connection>
+ <sender>lineEditVal</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DUnBase</receiver>
+ <slot>LEValeurPressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>BSupPressed()</slot>
+ <slot>ViewDoc()</slot>
+ <slot>BOk2Pressed()</slot>
+ <slot>BParametresPressed()</slot>
+ <slot>LEValeurPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desUniqueComp.ui'
+#
+# Created: mar aoû 7 16:45:58 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DUnComp(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ if not name:
+ self.setName("DUnComp")
+
+ self.setMinimumSize(QSize(350,0))
+
+
+ self.tabuniqueinto = QTabWidget(self,"tabuniqueinto")
+ self.tabuniqueinto.setGeometry(QRect(10,20,460,440))
+
+ self.Widget8 = QWidget(self.tabuniqueinto,"Widget8")
+
+ self.bSup = QPushButton(self.Widget8,"bSup")
+ self.bSup.setGeometry(QRect(310,370,142,30))
+ self.bSup.setAutoDefault(1)
+
+ self.bOk = QPushButton(self.Widget8,"bOk")
+ self.bOk.setGeometry(QRect(160,370,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.bHelp = QPushButton(self.Widget8,"bHelp")
+ self.bHelp.setGeometry(QRect(10,370,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.textLabel1 = QLabel(self.Widget8,"textLabel1")
+ self.textLabel1.setGeometry(QRect(60,30,190,20))
+
+ self.Commentaire = QLabel(self.Widget8,"Commentaire")
+ self.Commentaire.setGeometry(QRect(140,320,170,30))
+
+ self.LEImag = QLineEdit(self.Widget8,"LEImag")
+ self.LEImag.setGeometry(QRect(240,250,170,31))
+
+ self.LEReel = QLineEdit(self.Widget8,"LEReel")
+ self.LEReel.setGeometry(QRect(50,250,170,31))
+
+ self.LEcomp = QLineEdit(self.Widget8,"LEcomp")
+ self.LEcomp.setGeometry(QRect(50,60,360,40))
+
+ self.buttonGroup1 = QButtonGroup(self.Widget8,"buttonGroup1")
+ self.buttonGroup1.setGeometry(QRect(50,160,360,70))
+
+ self.RBMP = QRadioButton(self.buttonGroup1,"RBMP")
+ self.RBMP.setGeometry(QRect(10,40,330,21))
+
+ self.RBRI = QRadioButton(self.buttonGroup1,"RBRI")
+ self.RBRI.setGeometry(QRect(10,20,330,21))
+ self.tabuniqueinto.insertTab(self.Widget8,QString(""))
+
+ self.languageChange()
+
+ self.resize(QSize(484,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.bHelp,SIGNAL("clicked()"),self.ViewDoc)
+ self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+ self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+ self.connect(self.LEImag,SIGNAL("returnPressed()"),self.LEImagRPressed)
+ self.connect(self.LEReel,SIGNAL("returnPressed()"),self.LEReelRPressed)
+ self.connect(self.LEcomp,SIGNAL("returnPressed()"),self.LEcompRPressed)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("DUnComp"))
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.textLabel1.setText(self.__tr("<font size=\"+2\">Complexe de la forme : a+bj</font>"))
+ self.Commentaire.setText(self.__tr("<font size=\"+2\">Un complexe est attendu</font>"))
+ self.buttonGroup1.setTitle(self.__tr("OU"))
+ self.RBMP.setText(self.__tr("MP : Module Phase"))
+ self.RBRI.setText(self.__trUtf8("\x52\x49\x20\x20\x20\x3a\x20\x52\xc3\xa9\x65\x6c\x09\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x49\x6d\x61\x67\x69\x6e\x61\x69\x72\x65"))
+ self.tabuniqueinto.changeTab(self.Widget8,self.__tr("Saisir Valeur"))
+
+
+ def BSupPressed(self):
+ print "DUnComp.BSupPressed(): Not implemented yet"
+
+ def ViewDoc(self):
+ print "DUnComp.ViewDoc(): Not implemented yet"
+
+ def BOkPressed(self):
+ print "DUnComp.BOkPressed(): Not implemented yet"
+
+ def LEImagRPressed(self):
+ print "DUnComp.LEImagRPressed(): Not implemented yet"
+
+ def LEReelRPressed(self):
+ print "DUnComp.LEReelRPressed(): Not implemented yet"
+
+ def LEcompRPressed(self):
+ print "DUnComp.LEcompRPressed(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DUnComp",s,c)
+
+ def __trUtf8(self,s,c = None):
+ return qApp.translate("DUnComp",s,c,QApplication.UnicodeUTF8)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DUnComp</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DUnComp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>484</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>350</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>DUnComp</string>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabuniqueinto</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>460</width>
+ <height>440</height>
+ </rect>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget8</cstring>
+ </property>
+ <attribute name="title">
+ <string>Saisir Valeur</string>
+ </attribute>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>310</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>160</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>60</x>
+ <y>30</y>
+ <width>190</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><font size="+2">Complexe de la forme : a+bj</font></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Commentaire</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>140</x>
+ <y>320</y>
+ <width>170</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><font size="+2">Un complexe est attendu</font></string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LEImag</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>240</x>
+ <y>250</y>
+ <width>170</width>
+ <height>31</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LEReel</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>250</y>
+ <width>170</width>
+ <height>31</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>LEcomp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>60</y>
+ <width>360</width>
+ <height>40</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>50</x>
+ <y>160</y>
+ <width>360</width>
+ <height>70</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>OU</string>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RBMP</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>40</y>
+ <width>330</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>MP : Module Phase</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>RBRI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>330</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>RI : Réel Imaginaire</string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>bHelp</sender>
+ <signal>clicked()</signal>
+ <receiver>DUnComp</receiver>
+ <slot>ViewDoc()</slot>
+ </connection>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DUnComp</receiver>
+ <slot>BOkPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bSup</sender>
+ <signal>clicked()</signal>
+ <receiver>DUnComp</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+ <connection>
+ <sender>LEImag</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DUnComp</receiver>
+ <slot>LEImagRPressed()</slot>
+ </connection>
+ <connection>
+ <sender>LEReel</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DUnComp</receiver>
+ <slot>LEReelRPressed()</slot>
+ </connection>
+ <connection>
+ <sender>LEcomp</sender>
+ <signal>returnPressed()</signal>
+ <receiver>DUnComp</receiver>
+ <slot>LEcompRPressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>BSupPressed()</slot>
+ <slot>ViewDoc()</slot>
+ <slot>BOkPressed()</slot>
+ <slot>LEImagRPressed()</slot>
+ <slot>LEReelRPressed()</slot>
+ <slot>LEcompRPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DUnIn</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DUnIn</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>482</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>350</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>DUnIn</string>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabuniqueinto</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>20</y>
+ <width>450</width>
+ <height>440</height>
+ </rect>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Widget8</cstring>
+ </property>
+ <attribute name="title">
+ <string>Saisir Valeur</string>
+ </attribute>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>170</x>
+ <y>30</y>
+ <width>100</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><b><u><p align="center">Valeurs possibles</p></u></b></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>170</x>
+ <y>-10</y>
+ <width>90</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string><p align="center">Choisir une valeur</p></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>Commentaire</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>38</x>
+ <y>316</y>
+ <width>381</width>
+ <height>41</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bHelp</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Documentation</string>
+ </property>
+ <property name="accel">
+ <string>Alt+D</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>affichage documentation aster</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <property name="name">
+ <cstring>listBoxVal</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>80</x>
+ <y>60</y>
+ <width>290</width>
+ <height>240</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bOk</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>150</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Valider</string>
+ </property>
+ <property name="accel">
+ <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>validation de la saisie</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>bSup</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>300</x>
+ <y>370</y>
+ <width>142</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>&Supprimer</string>
+ </property>
+ <property name="accel">
+ <string>Alt+S</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>suppression du mot clef</string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+<connections>
+ <connection>
+ <sender>bHelp</sender>
+ <signal>clicked()</signal>
+ <receiver>DUnIn</receiver>
+ <slot>ViewDoc()</slot>
+ </connection>
+ <connection>
+ <sender>bOk</sender>
+ <signal>clicked()</signal>
+ <receiver>DUnIn</receiver>
+ <slot>BOkPressed()</slot>
+ </connection>
+ <connection>
+ <sender>bSup</sender>
+ <signal>clicked()</signal>
+ <receiver>DUnIn</receiver>
+ <slot>BSupPressed()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>BSupPressed()</slot>
+ <slot>ViewDoc()</slot>
+ <slot>BOkPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
--- /dev/null
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desUniqueInto.ui'
+#
+# Created: mar mar 20 12:00:55 2007
+# by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DUnIn(QWidget):
+ def __init__(self,parent = None,name = None,fl = 0):
+ QWidget.__init__(self,parent,name,fl)
+
+ if not name:
+ self.setName("DUnIn")
+
+ self.setMinimumSize(QSize(350,0))
+ self.tabuniqueinto = QTabWidget(self,"tabuniqueinto")
+ self.tabuniqueinto.setGeometry(QRect(20,20,450,440))
+
+ self.Widget8 = QWidget(self.tabuniqueinto,"Widget8")
+
+ self.textLabel2 = QLabel(self.Widget8,"textLabel2")
+ self.textLabel2.setGeometry(QRect(170,30,100,21))
+
+ self.textLabel1 = QLabel(self.Widget8,"textLabel1")
+ self.textLabel1.setGeometry(QRect(170,-10,90,31))
+
+ self.Commentaire = QLabel(self.Widget8,"Commentaire")
+ self.Commentaire.setGeometry(QRect(38,316,381,41))
+
+ self.bHelp = QPushButton(self.Widget8,"bHelp")
+ self.bHelp.setGeometry(QRect(0,370,142,30))
+ self.bHelp.setAutoDefault(1)
+
+ self.listBoxVal = QListBox(self.Widget8,"listBoxVal")
+ self.listBoxVal.setGeometry(QRect(80,60,290,240))
+
+ self.bOk = QPushButton(self.Widget8,"bOk")
+ self.bOk.setGeometry(QRect(150,370,142,30))
+ self.bOk.setAutoDefault(1)
+ self.bOk.setDefault(1)
+
+ self.bSup = QPushButton(self.Widget8,"bSup")
+ self.bSup.setGeometry(QRect(300,370,142,30))
+ self.bSup.setAutoDefault(1)
+ self.tabuniqueinto.insertTab(self.Widget8,QString(""))
+
+ self.languageChange()
+
+ self.resize(QSize(482,480).expandedTo(self.minimumSizeHint()))
+ self.clearWState(Qt.WState_Polished)
+
+ self.connect(self.bHelp,SIGNAL("clicked()"),self.ViewDoc)
+ self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+ self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+
+
+ def languageChange(self):
+ self.setCaption(self.__tr("DUnIn"))
+ self.textLabel2.setText(self.__tr("<b><u><p align=\"center\">Valeurs possibles</p></u></b>"))
+ self.textLabel1.setText(self.__tr("<p align=\"center\">Choisir une valeur</p>"))
+ self.Commentaire.setText(QString.null)
+ self.bHelp.setText(self.__tr("&Documentation"))
+ self.bHelp.setAccel(self.__tr("Alt+D"))
+ QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+ self.bOk.setText(self.__tr("&Valider"))
+ self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+ QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+ self.bSup.setText(self.__tr("&Supprimer"))
+ self.bSup.setAccel(self.__tr("Alt+S"))
+ QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+ self.tabuniqueinto.changeTab(self.Widget8,self.__tr("Saisir Valeur"))
+
+
+ def BSupPressed(self):
+ print "DUnIn.BSupPressed(): Not implemented yet"
+
+ def ViewDoc(self):
+ print "DUnIn.ViewDoc(): Not implemented yet"
+
+ def BOkPressed(self):
+ print "DUnIn.BOkPressed(): Not implemented yet"
+
+ def __tr(self,s,c = None):
+ return qApp.translate("DUnIn",s,c)
--- /dev/null
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>Eficas</class>
+<widget class="QMainWindow">
+ <property name="name">
+ <cstring>Eficas</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>902</width>
+ <height>575</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>21</width>
+ <height>323</height>
+ </size>
+ </property>
+ <property name="backgroundOrigin">
+ <enum>WidgetOrigin</enum>
+ </property>
+ <property name="font">
+ <font>
+ </font>
+ </property>
+ <property name="caption">
+ <string>Eficas </string>
+ </property>
+ <widget class="Line">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>-30</x>
+ <y>-10</y>
+ <width>930</width>
+ <height>20</height>
+ </rect>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+</widget>
+<menubar>
+ <property name="name">
+ <cstring>MenuBar</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <item text="&Fichier" name="Fichier">
+ <action name="fileNewAction"/>
+ <action name="fileNewViewAction"/>
+ <action name="fileOpenAction"/>
+ <action name="fileSaveAction"/>
+ <action name="fileSaveAsAction"/>
+ <action name="fileCloseAction"/>
+ <action name="fileCloseAllAction"/>
+ <separator/>
+ <separator/>
+ <action name="fileExitAction"/>
+ </item>
+ <item text="&Edition" name="Edition">
+ <separator/>
+ <action name="editCutAction"/>
+ <action name="editCopyAction"/>
+ <action name="editPasteAction"/>
+ <separator/>
+ <action name="editFindAction"/>
+ </item>
+ <item text="JdC" name="JdC">
+ <action name="jdcRapportDeValidationAction"/>
+ <action name="jdcFichierSourceAction"/>
+ </item>
+ <item text="Options" name="Options">
+ </item>
+ <item text="&Aide" name="Aide">
+ </item>
+ <item text="Traduction" name="Traduction">
+ <action name="traductionnew_itemAction"/>
+ </item>
+ <item text="Patrons" name="Patrons">
+ </item>
+</menubar>
+<toolbars>
+ <toolbar dock="2">
+ <property name="name">
+ <cstring>toolBar</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>MenuBarPanel</enum>
+ </property>
+ <property name="horizontallyStretchable">
+ <bool>false</bool>
+ </property>
+ <property name="label">
+ <string>Tools</string>
+ </property>
+ <action name="fileNewAction"/>
+ <action name="fileSaveAction"/>
+ <action name="fileOpenAction"/>
+ <action name="fileSaveAsAction"/>
+ <action name="editCutAction"/>
+ <action name="editPasteAction"/>
+ <action name="editFindAction"/>
+ <action name="fileExitAction"/>
+ <separator/>
+ </toolbar>
+</toolbars>
+<actions>
+ <action>
+ <property name="name">
+ <cstring>fileNewAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image0</iconset>
+ </property>
+ <property name="text">
+ <string>New</string>
+ </property>
+ <property name="menuText">
+ <string>&New</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+N</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileOpenAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image1</iconset>
+ </property>
+ <property name="text">
+ <string>Open</string>
+ </property>
+ <property name="menuText">
+ <string>&Open...</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+O</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileSaveAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image2</iconset>
+ </property>
+ <property name="text">
+ <string>Save</string>
+ </property>
+ <property name="menuText">
+ <string>&Save</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+S</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileSaveAsAction</cstring>
+ </property>
+ <property name="text">
+ <string>Save As</string>
+ </property>
+ <property name="menuText">
+ <string>Save &As...</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileExitAction</cstring>
+ </property>
+ <property name="text">
+ <string>Exit</string>
+ </property>
+ <property name="menuText">
+ <string>E&xit</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editUndoAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image3</iconset>
+ </property>
+ <property name="text">
+ <string>Undo</string>
+ </property>
+ <property name="menuText">
+ <string>&Undo</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+Z</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editRedoAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image4</iconset>
+ </property>
+ <property name="text">
+ <string>Redo</string>
+ </property>
+ <property name="menuText">
+ <string>&Redo</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+Y</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editCutAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image5</iconset>
+ </property>
+ <property name="text">
+ <string>Cut</string>
+ </property>
+ <property name="menuText">
+ <string>Cu&t</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+X</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editCopyAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image6</iconset>
+ </property>
+ <property name="text">
+ <string>Copy</string>
+ </property>
+ <property name="menuText">
+ <string>&Copy</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+C</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editPasteAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image7</iconset>
+ </property>
+ <property name="text">
+ <string>Paste</string>
+ </property>
+ <property name="menuText">
+ <string>&Paste</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+V</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>editFindAction</cstring>
+ </property>
+ <property name="iconSet">
+ <iconset>image8</iconset>
+ </property>
+ <property name="text">
+ <string>Find</string>
+ </property>
+ <property name="menuText">
+ <string>&Find...</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+F</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpContentsAction</cstring>
+ </property>
+ <property name="text">
+ <string>Contents</string>
+ </property>
+ <property name="menuText">
+ <string>&Contents...</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpIndexAction</cstring>
+ </property>
+ <property name="text">
+ <string>Index</string>
+ </property>
+ <property name="menuText">
+ <string>&Index...</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>helpAboutAction</cstring>
+ </property>
+ <property name="text">
+ <string>About</string>
+ </property>
+ <property name="menuText">
+ <string>&About</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>traductionnew_itemAction</cstring>
+ </property>
+ <property name="text">
+ <string>new item</string>
+ </property>
+ <property name="menuText">
+ <string>new item</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileSaveCloseAction</cstring>
+ </property>
+ <property name="text">
+ <string>Close</string>
+ </property>
+ <property name="menuText">
+ <string>Close</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileCloseAction</cstring>
+ </property>
+ <property name="text">
+ <string>Close</string>
+ </property>
+ <property name="menuText">
+ <string>Close</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+W</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileNewViewAction</cstring>
+ </property>
+ <property name="text">
+ <string>New view</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>fileCloseAllAction</cstring>
+ </property>
+ <property name="text">
+ <string>Close All</string>
+ </property>
+ <property name="menuText">
+ <string>Close All</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>jdcRapportDeValidationAction</cstring>
+ </property>
+ <property name="text">
+ <string>Rapport de validation</string>
+ </property>
+ <property name="menuText">
+ <string>Rapport de validation</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+R</string>
+ </property>
+ </action>
+ <action>
+ <property name="name">
+ <cstring>jdcFichierSourceAction</cstring>
+ </property>
+ <property name="text">
+ <string>Fichier source</string>
+ </property>
+ <property name="menuText">
+ <string>Fichier source</string>
+ </property>
+ <property name="accel">
+ <string>Ctrl+B</string>
+ </property>
+ </action>
+</actions>
+<images>
+ <image name="image0">
+ <data format="PNG" length="173">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000007449444154388dedd5c109c0200c05d06fe936812c10b2ffdd85d25385b6a991480f053f081af0291210f828c5a9d9c4de96cd2b9ad9eb0000660e2fe0c2519839c4f70c4c446d5e6b3538cf928245e4b2f6f014acaa8fda1d4fc1a5741b22079f9d111d96ea8a912c78c10bee64e60719f57e9203ad452a04cc4e50200000000049454e44ae426082</data>
+ </image>
+ <image name="image1">
+ <data format="PNG" length="210">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000009949444154388ded94410e85200c445f89c7367f61bc775d2848a42860ffced9548bbe8e13043e1d928177f481a123dc2b34f6f47a3de2b865a8843f4001982a0b3d5f62c58300aa1ad70550449ab9d507a773a8a4ba4f92a2df333c64c63bebbd82e5b8addecbcc7820eb4266c639745dfa80f36faf66c66fa19c3f882fb470ec05cdc0bed07893f68e171492635f686c3eeff6ba3c8fdd366dc4c0452c8781f8080000000049454e44ae426082</data>
+ </image>
+ <image name="image2">
+ <data format="PNG" length="217">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000a049444154388dd5954d0a802010859fd14668e18de662d222bc98376a21b4ac451992c66469e0b7f187f1f11c47052a218e762daddbfb9e99f6568f80b5364b8588ce35440400e80a398ce8f99034d2292cc37c8ebd530feb583a05e954341f8a027b2a7d3a1f09bf854dc5d5d953aa396e4f38cab199e2d2e108abe156f82e30977fcb4d8ff942d75dbebed2e143953a93f6caad3d6111f44b7d4f820ff9c0069bb51ecded318c5c0000000049454e44ae426082</data>
+ </image>
+ <image name="image3">
+ <data format="PNG" length="172">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000007349444154388ded92c10e80200840b1ef661d1cff4d876aa888a17669f9360f283ed80060f159425f3a71f53602e08e992b098801d02854176ae47f21ce1fb5b05d38eddc9060d0f11379635b3bc92bd518e239a943ec1d5ab7785cee107be4b215af4091f894de47181ecea59ede9ec59f380062ac28b1e3d701d90000000049454e44ae426082</data>
+ </image>
+ <image name="image4">
+ <data format="PNG" length="173">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000007449444154388ded92c10ac02008406ddf2d3b84ffed0ea3586a26d165e0830ea53e8504487e4b910f5489f19ea5a3ca0f8a896365b306c42dd613c649bdc2598316136219f0f936c0a2ef00d75a62614d3ab22996f2a362ffa337c5ebede962aad1a2e84aaaa2f750dd12748c0fd0ab9324677800596e28b1743f46860000000049454e44ae426082</data>
+ </image>
+ <image name="image5">
+ <data format="PNG" length="187">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000008249444154388dcdd341128020080550e8e02ebc38ad3273503e48537fe3e48c4f2425fa28e29c6f39920bf9276cb60185358877611388c2576418cda015f520b4e6b55be109dc0622b8e22acf31056e18dfdff80606aa551cc63564c4dcf80cd0201d577a5c85a8845fdc025ea5307afccd07e23a1df283ec2b37d9ad5fb4dfefd49cfbf72fac98c8cc890000000049454e44ae426082</data>
+ </image>
+ <image name="image6">
+ <data format="PNG" length="248">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000bf49444154388dd593410a83301045df488ee51dbc8c3ba98bf46a9eabd385350d266362444a3f0c4266fcf3f824f06f12402b66da8c55f3de2212cf9d92cb98c0ba2d7c4544cf9a07638bbad53c4491235ecf7cc1623697a92540c11ff4fda75275015d24a9389e7d6f53df4fe4ccab323eea0f03c0c4b2a0712ce6add89b59b7661c3be095985f261679ee4ebcc22c9788551fe6a2cbc4969a894bcb6f23ee361aab62e252c57294dfbfb610bbf2c897b8a46cc6677eaa519571fa087ea83762da9abacb20235f0000000049454e44ae426082</data>
+ </image>
+ <image name="image7">
+ <data format="PNG" length="270">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000d549444154388dc5955d0a84300c8427e2a90a9e6c8b0f4b3dd982d7ca3e58d7fe4cd0ba5d7640024df265da0a057e2439c9eb8d9eaa8841a0c9aad8c82ab32f9c425be1e30e0dcf00c00308f0b3a7a07410a9d7142e00b42c5a5fab696b979b1c837fc0c316b6e4165b64f78d716359919bdc4570de47c04732dd5e5bcc35f0c97762ae787936dccf7513577e79f48c4b27aa0f1327b240f5117fcbe348aa33b6e0224b054d0746b8025e2e3b3e73cde0dd1c97f02e8ed9d0af1db381224bdf33eee698a934a0f617b45540d00bcf4ca08fc0dff406e325c1981bc418760000000049454e44ae426082</data>
+ </image>
+ <image name="image8">
+ <data format="PNG" length="662">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000025d49444154388dd593a172db4010863f670a56ecc42278d0653693a0c21c68d6c2e60df21a818111349499c254a8329b55f0e089ddb15ba602b79d6692d699b6d399fee86e67e7db7f77efe07fd3e2c74bd775b3730eef3d5115002382b5166b2d5757578b1729bf02b76d3b0f8703b92d58aed7600400ef1ce3c70306a8aa8aebebeb57c117dfa06ddb525dd754efb600a82a49138a123532ec3ac42b9bcde655ce2ffabe9f87c340fde13dcb4d8daaa24e48ee12c6823808c107969b1a8a9ce3f1f8aa515c38e7c8ada5aa6b00c45f129c67d223938c88e6c860d118b1d592d139baae9bcf83a78965b5465134801b1d2e1f4945c0e350096408ea154490c2e0bd3fef5853c2e486a0019f4d84f58418418362b0408e8b23c924501093314dd359f01b809814112025144015f1964c0bbc1b484b07e4688880c029ebd78e4141f5b434fd76864c053f1e084b0f8580265440634044ce838bbcc03987a61350a3a2285e1d5a4414d0708aa598082162ad3d0fb6d6e287cfa498508d274050447370428c91af8d10fd4481608c390b5e00dcddddcd8e80a9de420248e804840856f03e02907d729465c9ba5ae3468731e6a79fe50260b55a6102c4ee40a6894c33f2cb0cb106512814f8f899b22cb9b9b959b8d1f1f8f848d334b46dfbe29bfe5eadeffbf9783c323a871881ecb4200d1151a8eb9aed76bb00188661eeba8efd7e8f3186ed76cb6ab57ae2fe591b5dd7cdde7b628c8808799e63ada5aaaa67b9bbdd6e6e9a06ef3d755d3f29fec7eafb7ebebdbd9dadb5735996f3fdfdfdfca2e3dfd5c3c3c3dc340dd334b1d96cfe1e184e63dceff7a494fe26f61fe90bbc4c5e59d614caf40000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>fileNewAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>fileNew()</slot>
+ </connection>
+ <connection>
+ <sender>fileOpenAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>fileOpen()</slot>
+ </connection>
+ <connection>
+ <sender>fileSaveAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>fileSave()</slot>
+ </connection>
+ <connection>
+ <sender>fileSaveAsAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>fileSaveAs()</slot>
+ </connection>
+ <connection>
+ <sender>fileExitAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>fileExit()</slot>
+ </connection>
+ <connection>
+ <sender>editUndoAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>editUndo()</slot>
+ </connection>
+ <connection>
+ <sender>editRedoAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>editRedo()</slot>
+ </connection>
+ <connection>
+ <sender>editCutAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>editCut()</slot>
+ </connection>
+ <connection>
+ <sender>editPasteAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>editPaste()</slot>
+ </connection>
+ <connection>
+ <sender>editFindAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>editFind()</slot>
+ </connection>
+ <connection>
+ <sender>helpIndexAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>helpIndex()</slot>
+ </connection>
+ <connection>
+ <sender>helpContentsAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>helpContents()</slot>
+ </connection>
+ <connection>
+ <sender>helpAboutAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>helpAbout()</slot>
+ </connection>
+ <connection>
+ <sender>fileCloseAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>fileClose()</slot>
+ </connection>
+ <connection>
+ <sender>fileNewViewAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>fileNewView()</slot>
+ </connection>
+ <connection>
+ <sender>fileCloseAllAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>fileCloseAll()</slot>
+ </connection>
+ <connection>
+ <sender>editCopyAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>editCopy()</slot>
+ </connection>
+ <connection>
+ <sender>jdcRapportDeValidationAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>jdcRapport()</slot>
+ </connection>
+ <connection>
+ <sender>jdcFichierSourceAction</sender>
+ <signal>activated()</signal>
+ <receiver>Eficas</receiver>
+ <slot>jdcFichierSource()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>fileNew()</slot>
+ <slot>fileOpen()</slot>
+ <slot>fileSave()</slot>
+ <slot>fileSaveAs()</slot>
+ <slot>filePrint()</slot>
+ <slot>fileExit()</slot>
+ <slot>editUndo()</slot>
+ <slot>editRedo()</slot>
+ <slot>jdcFichierSource()</slot>
+ <slot>fileNewView()</slot>
+ <slot>editPaste()</slot>
+ <slot>editFind()</slot>
+ <slot>helpIndex()</slot>
+ <slot>helpContents()</slot>
+ <slot>helpAbout()</slot>
+ <slot>fileClose()</slot>
+ <slot>fileCloseAll()</slot>
+ <slot>jdcRapport()</slot>
+ <slot>editCut()</slot>
+ <slot>editCopy()</slot>
+</slots>
+<layoutdefaults spacing="2" margin="2"/>
+</UI>