# -*- coding: iso-8859-1 -*- # #------------------------------------------------------------------------------- # Code_Saturne version 1.3 # ------------------------ # # # This file is part of the Code_Saturne User Interface, element of the # Code_Saturne CFD tool. # # Copyright (C) 1998-2007 EDF S.A., France # # contact: saturne-support@edf.fr # # The Code_Saturne User Interface is free software; you can redistribute it # and/or modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # The Code_Saturne User Interface is distributed in the hope that it will be # useful, but WITHOUT ANY WARRANTY; without even the implied warranty # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the Code_Saturne Kernel; if not, write to the # Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, # Boston, MA 02110-1301 USA # #------------------------------------------------------------------------------- """ This module defines the storage system type. This module contains the following classes and function: - MatisseNetworkModel - MatisseNetworkView - PageText """ #------------------------------------------------------------------------------- # Library modules import #------------------------------------------------------------------------------- import Tix from Tkconstants import * import sys, unittest import Base.Dialog as Dialog #------------------------------------------------------------------------------- # Application modules import #------------------------------------------------------------------------------- from Base.Common import * import Base.Toolbox as Tool import Base.TkPage as TkPage import Pages.MatisseType as MatisseType import Pages.MatisseGeom as MatisseGeom #------------------------------------------------------------------------------- # Matisse thermic class #------------------------------------------------------------------------------- _MULTISEL = "************" _EPSILON = 1e-6 class MatisseNetworkModel: def __init__(self, case): """ Constructor. """ self.case = case self.node_matisse = self.case.root().xmlInitChildNode('matisse') self.node_compute = self.node_matisse.xmlInitChildNode('compute') self.node_phymodel = self.node_compute.xmlInitChildNode('physical_model') # # Vars Filters self.node_map = self.node_compute.xmlInitChildNode('map') self.node_hl = self.node_map.xmlInitChildNode('headloss') self.node_network = self.node_hl.xmlInitChildNode('network') self.node_line = self.node_network.xmlInitChildNode('line') self.node_row = self.node_network.xmlInitChildNode('row') self.list_line_area = self.node_line.xmlGetNodeList('area','label') self.list_row_area = self.node_row.xmlGetNodeList('area','label') def defaultMatisseNetworkValues(self): """ Return in a dictionnary which contains default values """ default = {} # # double modelgeom = MatisseGeom.MatisseGeomModel(self.case) hreso = modelgeom.getMatisseGeomDoubleVar('nchest') step = modelgeom.getMatisseGeomDoubleVar('epchel') default['nbcellreso'] = hreso default['nbcellplen'] = 0. default['hreso'] = hreso*step default['hplen'] = 0. return default def SetArea(self, areatype, num, label, bmin, bmax): """ Add to the XML doc the new values. """ if areatype == 'line': if label: self.list_line_area[num]['label'] = label if bmin: self.list_line_area[num].xmlSetData('min',bmin) if bmax: self.list_line_area[num].xmlSetData('max',bmax) elif areatype == 'row': if label: self.list_row_area[num]['label'] = label if bmin: self.list_row_area[num].xmlSetData('min',bmin) if bmax: self.list_row_area[num].xmlSetData('max',bmax) else : print areatype, ": Unknown area type" sys.exit(1) def NewArea(self, areatype, label, bmin, bmax): """ Add to the XML doc the new values. """ if areatype == 'line': node = self.node_line.xmlAddChild('area', label=label) elif areatype == 'row': node = self.node_row.xmlAddChild('area', label=label) else : print areatype + ": Unknown area type" sys.exit(1) node.xmlAddChild('min').xmlSetTextNode(bmin) node.xmlAddChild('max').xmlSetTextNode(bmax) if areatype == 'line': self.list_line_area.append(node) elif areatype == 'row': self.list_row_area.append(node) else : print areatype + ": Unknown area type" sys.exit(1) def GetArea(self, areatype, num): """ Get area Values. """ if areatype == 'line': label = self.list_line_area[num]['label'] bmin = self.list_line_area[num].xmlGetString('min') bmax = self.list_line_area[num].xmlGetString('max') elif areatype == 'row': label = self.list_row_area[num]['label'] bmin = self.list_row_area[num].xmlGetString('min') bmax = self.list_row_area[num].xmlGetString('max') elif areatype == 'height': label = self.list_height_area[num]['label'] bmin = self.list_height_area[num].xmlGetString('min') bmax = self.list_height_area[num].xmlGetString('max') else : print "GetArea" + areatype + " : Unknown area type" sys.exit(1) return label, bmin, bmax def GetAreas(self, areatype): """ Get areas Values. """ llabel=[] lbmin=[] lbmax=[] if areatype == 'line': nodes_nb = len(self.list_line_area) elif areatype == 'row': nodes_nb = len(self.list_row_area) else : print "GetAreas '" + areatype + "': Unknown area type" sys.exit(1) for i in range(0,nodes_nb): label, bmin, bmax = self.GetArea(areatype, i) llabel.append(label) lbmin.append(bmin) lbmax.append(bmax) return llabel, lbmin, lbmax def EraseArea(self, areatype, num): """ Remove Area. """ if areatype == 'line': node = self.list_line_area.pop(num) elif areatype == 'row': node = self.list_row_area.pop(num) else : print "EraseErea" + areatype, " : Unknown area type" sys.exit(1) node.xmlRemoveChild('min') node.xmlRemoveChild('max') node.xmlRemoveNode() def setMatisseNetworkVar(self, tag, val): """ """ if tag.find('reso') >= 0: tag = tag[:-1] self.node_phymodel.xmlSetData(tag, val) def getMatisseNetworkDoubleVar(self, tag): """ """ if tag.find('reso') >= 0: tagtmp = tag[:-1] else: tagtmp = tag val = self.node_phymodel.xmlGetDouble(tagtmp) if val == "" or val == None: self.node_phymodel.xmlInitChildNode(tagtmp) val = self.defaultMatisseNetworkValues()[tagtmp] self.setMatisseNetworkVar(tag, val) return val #------------------------------------------------------------------------------- # Main view class #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- # Hlist multi-selection class #------------------------------------------------------------------------------- class MultiSelect: """ This class is design in order to manage the storage of the selected items in the Hlist. """ def __init__(self, Hlist): """ Constructor """ self.Hlist = Hlist def _initList(self): """ For each mouse selection we do reinitialize all lists. """ self.labelL = [] self.minL = [] self.maxL = [] def areaInfo(self, entry): """ Return info from the argument entry. """ # Here we must call the tk function directly without passing in # Tix.py, because of a bug in tix8.1 in the Hlist.item_cget function # h = self.Hlist label = h.tk.call(h, 'item', 'cget', entry, 0, '-text') bmin = h.tk.call(h, 'item', 'cget', entry, 1, '-text') bmax = h.tk.call(h, 'item', 'cget', entry, 2, '-text') return label, bmin, bmax def setItems(self, entriesL): """ Store values when a new selection is done. """ self._initList() for entry in entriesL: label, bmin, bmax = self.areaInfo(entry) self.labelL.append(label) self.minL.append(bmin) self.maxL.append(bmax) def widgetText(self): """ Find the right texts for the widget layout. """ label = self.labelL[0] bmin = self.minL[0] bmax = self.maxL[0] for i in self.labelL: if label != i: label = _MULTISEL for i in self.minL: if bmin != i: bmin = _MULTISEL for i in self.maxL: if bmax != i: bmax = _MULTISEL return label, bmin, bmax class MatisseNetworkView(TkPage.Page): """ Class to open Matisse Page. """ def _tkControlVariables(self): """ Tkinter variables declaration. """ # # Double Var self.hreso1 = Tix.DoubleVar() self.hreso2 = Tix.DoubleVar() self.hplen = Tix.DoubleVar() self.nbcellreso1 = Tix.DoubleVar() self.nbcellreso2 = Tix.DoubleVar() self.nbcellplen = Tix.DoubleVar() self.label = Tix.StringVar() self.bmin = Tix.StringVar() self.bmax = Tix.StringVar() # # association between tix variable and tag self.variables=[ ['hreso1', self.hreso1, 0.], ['hreso2', self.hreso2, 0.], ['hplen', self.hplen, 0.]] self.nbcellVariables=[ ['nbcellreso1', self.nbcellreso1, 0.], ['nbcellreso2', self.nbcellreso2, 0.], ['nbcellplen', self.nbcellplen, 0.]] def ActiveWidget(self, i , stat) : if stat == 'off': self.e[i].config(state=DISABLED, fg='grey') self.e[i].unbind("<>") self.l1[i].config(fg='grey') self.l3[i].config(fg='grey') else : self.e[i].config(state=NORMAL, fg='black') self.e[i].event_add("<>", "", "", "") self.e[i].bind("<>",TkPage.Callback(self.getMatisseNetworkVar, i, self.nbcellVariables[i])) self.l1[i].config(fg='black') self.l3[i].config(fg='black') def _pageControl(self): """ Instantiate the matisse type modelling class. """ self.model = MatisseNetworkModel(self.case) model_geom = MatisseGeom.MatisseGeomModel(self.case) self.lineStep = model_geom.getMatisseGeomDoubleVar('ptrres') self.rowStep = model_geom.getMatisseGeomDoubleVar('plgres') self.heightStep = model_geom.getMatisseGeomDoubleVar('epchel') self.lineMax = model_geom.getMatisseGeomDoubleVar('nptran') self.rowMax = model_geom.getMatisseGeomDoubleVar('nplgrs') self.heightMax = model_geom.getMatisseGeomDoubleVar('nchest') model_mat_type = MatisseType.MatisseTypeModel(self.case) self.alveoStat = model_mat_type.node_alveo['status'] self.selectedEntry = None self.currentEntry = None self.entriesNumberH1 = 0 self.entriesNumberH2 = 0 def getMatisseNetworkVar(self, i, variable, event=None): """ Input thermiclic load variable. """ tag=variable[0] var=variable[1] tvar=variable[2] self.stbar.busy() if not (self.e[i].cget('state') == DISABLED) : if self.check2.hasType(self.e[i], var): t = var.get() val = float(t) * self.heightStep self.model.setMatisseNetworkVar(tag, t) tag2 = tag.replace('nbcell', 'h') self.model.setMatisseNetworkVar(tag2, val) self.l3[i].config(text=val) self.stbar.idle() def selectHlist(self, h, entry=None): """ Browsecmd: Every single Clik on the Button1 of the mouse send TWO signal to the GUI the first one when man push the button, and the second one when the button gets back. Command: Every double-Click and Return send only ONE signal to the GUI. """ self.selectedEntry = h.hlist.info_selection() if not self.selectedEntry: if h == self.h : self.hl2.config(state=NORMAL) self.hl3.config(state=NORMAL) self.e2.config(state=NORMAL) self.e3.config(state=NORMAL) self.e2.delete(0,END) self.e3.delete(0,END) elif h == self.h2 : self.h2l2.config(state=NORMAL) self.h2l3.config(state=NORMAL) self.h2e2.config(state=NORMAL) self.h2e3.config(state=NORMAL) self.h2e2.delete(0,END) self.h2e3.delete(0,END) elif self.currentEntry != self.selectedEntry: self.currentEntry = self.selectedEntry if h == self.h : if len(self.currentEntry) == 1: self.hl2.config(state=NORMAL) self.hl3.config(state=NORMAL) self.e2.config(state=NORMAL) self.e3.config(state=NORMAL) self.select.setItems(self.currentEntry) label, bmin, bmax = self.select.widgetText() self.e1.delete(0,END) self.e1.insert(0,label) self.e1.icursor(END) self.e2.delete(0,END) self.e2.insert(0,bmin) self.e2.icursor(END) self.e3.delete(0,END) self.e3.insert(0,bmax) self.e3.icursor(END) if len(self.currentEntry) > 1: self.hl2.config(state=DISABLED) self.hl3.config(state=DISABLED) self.e2.config(state=DISABLED) self.e3.config(state=DISABLED) elif h == self.h2 : if len(self.currentEntry) == 1: self.h2l2.config(state=NORMAL) self.h2l3.config(state=NORMAL) self.h2e2.config(state=NORMAL) self.h2e3.config(state=NORMAL) self.select2.setItems(self.currentEntry) label, bmin, bmax = self.select2.widgetText() self.h2e1.delete(0,END) self.h2e1.insert(0,label) self.h2e1.icursor(END) self.h2e2.delete(0,END) self.h2e2.insert(0,bmin) self.h2e2.icursor(END) self.h2e3.delete(0,END) self.h2e3.insert(0,bmax) self.h2e3.icursor(END) if len(self.currentEntry) > 1: self.h2l2.config(state=DISABLED) self.h2l3.config(state=DISABLED) self.h2e2.config(state=DISABLED) self.h2e3.config(state=DISABLED) def selectH1(self,entry=None): self.selectHlist(self.h) def selectH2(self,entry=None): self.selectHlist(self.h2) def _make_style(self): """ Define beautyfull style in order to display columns in the Hlist. """ self.style={} self.style['header'] = Tix.DisplayStyle(Tix.TEXT, refwindow=self.w2, anchor=CENTER, padx=5, pady=2, font=fB) self.style['valb'] = Tix.DisplayStyle(Tix.TEXT, refwindow=self.w2, padx=5, selectforeground='#fefefe', font=fB) self.style['val'] = Tix.DisplayStyle(Tix.TEXT, refwindow=self.w2, anchor=CENTER, padx=5, selectforeground='#fefefe', font=fN) def insertHlist(self, h, label, bmin, bmax, step ): """ Create the item Hlist associated with the new boundary definition. """ self.stbar.busy() if h == self.h : self.entriesNumberH1 = self.entriesNumberH1 +1 entriesNumber = self.entriesNumberH1 elif h == self.h2 : self.entriesNumberH2 = self.entriesNumberH2 +1 entriesNumber = self.entriesNumberH2 # if not label: label = "label" + "_" + repr(entriesNumber) name = 'item' + repr(entriesNumber) h.hlist.add(name, itemtype=Tix.TEXT, text=label, style=self.style['valb']) h.hlist.item_create(name, 1, itemtype=Tix.TEXT, text=bmin, style=self.style['val']) h.hlist.item_create(name, 2, itemtype=Tix.TEXT, text=bmax, style=self.style['val']) val=step*float(bmin) h.hlist.item_create(name, 3, itemtype=Tix.TEXT, text=val, style=self.style['val']) val=step*float(bmax) h.hlist.item_create(name, 4, itemtype=Tix.TEXT, text=val, style=self.style['val']) self.stbar.idle() return label def getLabel(self, event=None): """ Return the name of the boundary condition. It 's not allowed to have blank or not ASCII caracters in this name. """ return string.join(string.split(self.label.get()), '_') def getBmin(self, event=None): """ """ return self.bmin.get() def getBmax(self, event=None): """ """ return self.bmax.get() def eraseEntries(self,h, event=None): """ This button is for delete all caracters in the three entries. """ if h == self.h : self.e1.delete(0, END) self.e2.delete(0, END) self.e3.delete(0, END) elif h == self.h2 : self.h2e1.delete(0, END) self.h2e2.delete(0, END) self.h2e3.delete(0, END) def createHlist(self, h, areatype, step, event=None): """ Upload the contents of the definition widget when the 'create' button is pushed. Checking consistency of values and interpreting complexe entry for reference if necessary. """ self.stbar.busy() t = PageText() label = self.getLabel() sbmin = self.getBmin() sbmax = self.getBmax() # Reading and add to Hlist # if not label: label = "Default" try : bmin = float(sbmin) bmax = float(sbmax) except: Dialog.Warning(self.master, title=t.WARNING, text= "'" +label+ "'" + t.OUTOFBOUNDS) self.eraseEntries(h) self.currentEntry = None self.selectHlist(h) self.stbar.idle() return llabel, lbmin, lbmax = self.model.GetAreas(areatype) create = True # # Bounds check if (bmin > bmax) or (bmin < 0): create = False if (areatype == 'line'): if (bmax > self.lineMax) : create = False elif (areatype == 'row'): if (bmax > self.rowMax) : create = False if not label : label = "Default" for area in range(0,len(llabel)) : # # No duplicate if ((abs(bmin - float(lbmin[area])) < _EPSILON) and (abs(bmax - float(lbmax[area])) < _EPSILON)) : create = False if (((bmin > float(lbmin[area])) and (bmin < float(lbmax[area]))) or ((bmax > float(lbmin[area])) and (bmax < float(lbmax[area])))) : create = False if create : name = self.insertHlist(h, label, sbmin, sbmax,step) self.model.NewArea(areatype, label, bmin, bmax) else : Dialog.Warning(self.master, title=t.WARNING, text= "'" +label+ "'" + t.OUTOFBOUNDS) self.eraseEntries(h) self.currentEntry = None self.selectHlist(h) self.stbar.idle() def cancelHlist(self,h, areatype , event=None): """ Just delete the current selected entries from the Hlist and of course from the XML file. """ if not self.currentEntry: return self.stbar.busy() for entry in self.currentEntry: if h == self.h : label, sbmin, sbmax = self.select.areaInfo(entry) elif h == self.h2 : label, sbmin, sbmax = self.select2.areaInfo(entry) bmin = float(sbmin) bmax = float(sbmax) llabel, lbmin, lbmax = self.model.GetAreas(areatype) cancel = False for area in range(0,len(llabel)) : if ((label == llabel[area]) and (abs(bmin - float(lbmin[area])) < _EPSILON) and (abs(bmax - float(lbmax[area])) < _EPSILON)): self.model.EraseArea(areatype, area) cancel = True # Delete boundary region from the Hlist # if not cancel : print "Entry is in Hlist but not in XML" sys.exit(1) else : # # Pb : si on supprime le dernier elt : lors de la creation d'une nouvelle hlist # il recupere un nom deja donne !!! ## if h == self.h : ## self.entriesNumberH1 = self.entriesNumberH1 -1 ## elif h == self.h2 : ## self.entriesNumberH2 = self.entriesNumberH2 -1 ## elif h == self.h3 : ## self.entriesNumberH3 = self.entriesNumberH3 -1 h.hlist.delete_entry(entry) self.currentEntry = None self.selectHlist(h) self.eraseEntries(h) self.stbar.idle() def replaceHlist(self, h, entry, label, bmin, bmax, step): """ Add the item Hlist associated with the new boundary definition. """ self.stbar.busy() # Update the Hlist # h.hlist.item_configure(entry, 0, text=label, style=self.style['valb']) h.hlist.item_configure(entry, 1, text=bmin, style=self.style['val']) h.hlist.item_configure(entry, 2, text=bmax, style=self.style['val']) val=step*float(bmin) h.hlist.item_configure(entry, 3, text=val, style=self.style['val']) val=step*float(bmax) h.hlist.item_configure(entry, 4, text=val, style=self.style['val']) #self.h.hlist.config(selectbackground=self.typeColor[type]) self.stbar.idle() def editHlist(self, h, areatype, step, event = None) : """ Modify previous selected entries. """ if not self.currentEntry: return self.stbar.busy() t = PageText() new_label = self.getLabel() new_bmin = self.getBmin() new_bmax = self.getBmax() if not new_label: new_label = "Default" if areatype == 'line' : step = self.lineStep elif areatype == 'row' : step = self.rowStep if len(self.currentEntry) == 1 : entry = self.currentEntry if h == self.h : label, sbmin, sbmax = self.select.areaInfo(entry) elif h == self.h2 : label, sbmin, sbmax = self.select2.areaInfo(entry) bmin = float(sbmin) bmax = float(sbmax) llabel, lbmin, lbmax = self.model.GetAreas(areatype) # # Bounds check modify = True # # Type check try : fnew_bmin=float(new_bmin) fnew_bmax=float(new_bmax) except : Dialog.Warning(self.master, title=t.WARNING, text= "'" +label+ "'" + t.OUTOFBOUNDS) self.eraseEntries(h) self.currentEntry = None self.selectHlist(h) self.stbar.idle() return if (fnew_bmin > fnew_bmax) or (fnew_bmin < 0): modify = False if (areatype == 'line'): if fnew_bmax > self.lineMax : modify = False elif (areatype == 'row'): if (fnew_bmax > self.rowMax) : modify = False if not modify : Dialog.Warning(self.master, title=t.WARNING, text= "'" +label+ "'" + t.OUTOFBOUNDS) else : for area in range(0,len(llabel)) : if ((label == llabel[area]) and (abs(bmin - float(lbmin[area])) <= _EPSILON) and (abs(bmax - float(lbmax[area])) <= _EPSILON)): if ((label != new_label) or (abs(bmax - fnew_bmax) >= _EPSILON) or (abs(bmin - fnew_bmin) >= _EPSILON)) : for area1 in range(0,len(llabel)) : if area1 != area : if (((fnew_bmin > float(lbmin[area1])) and (fnew_bmin < float(lbmax[area1]))) or ((fnew_bmax > float(lbmin[area1])) and (fnew_bmax < float(lbmax[area1])))) : modify = False if modify : self.model.SetArea(areatype, area, new_label, new_bmin, new_bmax) self.replaceHlist(h, entry, new_label, new_bmin, new_bmax, step) else: Dialog.Warning(self.master, title=t.WARNING, text= "'" +label+ "'" + t.OUTOFBOUNDS) else : for entry in self.currentEntry: if h == self.h : label, sbmin, sbmax = self.select.areaInfo(entry) elif h == self.h2 : label, sbmin, sbmax = self.select2.areaInfo(entry) bmin = float(sbmin) bmax = float(sbmax) llabel, lbmin, lbmax = self.model.GetAreas(areatype) for area in range(0,len(llabel)) : if ((label == llabel[area]) or (abs(bmin - float(lbmin[area])) <= _EPSILON) and (abs(bmax - float(lbmax[area])) <= _EPSILON)): if (label != new_label) : if (new_label != _MULTISEL) : self.model.SetArea(areatype, area, new_label, None , None) self.replaceHlist( h, entry, new_label, bmin, bmax,step) else : pass self.eraseEntries(h) self.currentEntry = None self.selectHlist(h) self.stbar.idle() def InitHlist(self,h, areatype, step): """ Method for the _initializeWidgets method. """ if h == self.h : self.entriesNumberH1 = 0 elif h == self.h2 : self.entriesNumberH2 = 0 self.cancelSelection(h) try: h.hlist.delete_all() except: pass llabel, lbmin, lbmax = self.model.GetAreas(areatype) n = len(llabel) if ((n != len(lbmin)) or (n != len(lbmax))): print "XML format error : bad definition of " sys.exit(1) ## No default area for headloss ## if len(llabel) == 0 : ## dlabel, dmin, dmax = self.model.DefaultArea(areatype) ## self.model.NewArea(areatype, dlabel, dmin, dmax) ## llabel.append(dlabel) ## lbmin.append(dmin) ## lbmax.append(dmax) for area in range(0,len(llabel)): self.insertHlist(h,llabel[area], lbmin[area], lbmax[area],step) def cancelSelection(self,h): """ Fonction for the Popup Menu. Blank the selection. """ h.hlist.selection_clear() self.currentEntry = None self.eraseEntries(h) def cancelSelectionH1(self, event = None): self.cancelSelection(self.h) def cancelSelectionH2(self, event = None): self.cancelSelection(self.h2) def _createWidgets(self): """ Create the Page layout. """ t = PageText() # NoteBook and tabs layout # self.nb = Tix.NoteBook(self.myPage) self.nb.pack(expand=1, side=TOP, fill=BOTH) self.nb.nbframe.config(background=self.bg, backpagecolor=self.bg) self.nb.nbframe.config(focuscolor=self.bg, inactivebackground=wm['inactivebackground']) self.nb.nbframe.config(relief=RAISED) self.nb.nbframe.config(font=fT, tabpadx='10', tabpady='2') self.nb.add('page1', anchor='center', label=t.PARAMETERS) self.nb.add('page2', anchor='center', label=t.FILTER, state=NORMAL) ######################################################## # NoteBook Page 1 ######################################################## lf = Tix.LabelFrame(self.nb.page1, bd=2, label=t.MATISSE_THERMIC_TITLE, relief=FLAT) lf.label.config(font=fT) lf.pack(side=TOP, fill=X, padx=10, pady=10) self.w1 = Tix.Frame(lf.frame, relief=FLAT) self.w1.pack(side=TOP, fill=X, pady=10) # # Vars self.l1=[0]*len(self.variables) self.l2=[0]*len(self.variables) self.l3=[0]*len(self.variables) self.e=[0]*len(self.variables) for i in range(len(self.variables)): variable = self.variables[i] nbcellVariable = self.nbcellVariables[i] self.l1[i] = Tix.Label(self.w1, text=t.texts[variable[0]]) self.l1[i].grid(row=i, column=0, padx=2, pady=5, sticky=W) self.e[i] = Tix.Entry(self.w1, width=10, textvariable=nbcellVariable[1]) self.e[i].grid(row=i, column=2, padx=3, pady=5) self.e[i].event_add("<>", "", "", "") self.e[i].bind("<>",TkPage.Callback(self.getMatisseNetworkVar, i, nbcellVariable)) l5 = Tix.Label(self.w1, text='----> ').grid(row=i, column=3) self.l3[i] = Tix.Label(self.w1, text=variable[2], relief=Tix.SUNKEN) self.l3[i].config(bg=wm['background'], bd=2, width=15) self.l3[i].grid(row=i, column=4, pady=5) l6 = Tix.Label(self.w1, text='m').grid(row=i, column=5) ######################################################## # NoteBook Page 2 ######################################################## self.nb2 = Tix.NoteBook(self.nb.page2) self.nb2.pack(expand=1, side=TOP, fill=BOTH) self.nb2.nbframe.config(background=self.bg, backpagecolor=self.bg) self.nb2.nbframe.config(focuscolor=self.bg, inactivebackground=wm['inactivebackground']) self.nb2.nbframe.config(relief=RAISED) self.nb2.nbframe.config(font=fT, tabpadx='10', tabpady='2') self.nb2.add('page1', anchor='center', label=t.LINE , raisecmd=self.cancelSelectionH1) self.nb2.add('page2', anchor='center', label=t.ROW, raisecmd=self.cancelSelectionH2) ######################################################## # NoteBook Page 2.1 Hlist 1 ######################################################## lf1 = Tix.LabelFrame(self.nb2.page1, bd=2, label=t.LOADINLINE, relief=FLAT) lf1.label.config(font=fT) lf1.pack(side=TOP, fill=X, padx=10, pady=10) self.w2 = Tix.Frame(lf1.frame, relief=FLAT) self.w2.pack(side=TOP, fill=X) # Put a simple hierachy into the Hlist (two levels). # self.h = Tix.ScrolledHList(self.w2, options='hlist.columns 6 hlist.header 1 ' ) self.h.config(scrollbar="auto +y +x") self._make_style() # selectmode='extended' -> multi select with and # selectmode='multiple' -> multi select only with # self.h.hlist.config(selectmode='extended', browsecmd=self.selectH1, bg=wm['hlistbackground']) self.h.hsb.config(width=10, bd=1) self.h.vsb.config(width=10, bd=1) self.h.pack(expand=1, fill=BOTH, padx=10, pady=10, side=TOP) # Create the headers # self.h.hlist.header_create(0, itemtype=Tix.TEXT, text=t.LABEL, style=self.style['header']) self.h.hlist.header_create(1, itemtype=Tix.TEXT, text=t.LMIN, style=self.style['header']) self.h.hlist.header_create(2, itemtype=Tix.TEXT, text=t.LMAX, style=self.style['header']) self.h.hlist.header_create(3, itemtype=Tix.TEXT, text=t.LLMIN, style=self.style['header']) self.h.hlist.header_create(4, itemtype=Tix.TEXT, text=t.LLMAX, style=self.style['header']) # Notice that we use 5 columns in the Hlist widget. This way when the user # expands the windows wide, the right side of the header doesn't look # chopped off. The following line ensures that the 5 column header is # not shown unless the Hlist window is wider than its contents. # self.h.hlist.column_width(5,0) # Let configure the appearance of the Hlist subwidget # self.h.hlist.config(separator='.', width=25, height=11, drawbranch=0, indent=10) # Let configure the width of the columns # ## self.h.hlist.column_width(0, chars=16) ## self.h.hlist.column_width(1, chars=9) ## self.h.hlist.column_width(2, chars=12) ## self.h.hlist.column_width(3, chars=16) # Create the mouse selection instance # self.select = MultiSelect(self.h.hlist) # Separator # s = Tix.Frame(lf1.frame, height=2, bd=2, relief=SUNKEN) s.pack(side=TOP, fill=X) f1 = Tix.Frame(lf1.frame, relief=FLAT) f1.pack(side=TOP, fill=X) hl1 = Tix.Label(f1, text=t.LABEL) self.hl2 = Tix.Label(f1, text=t.LMIN) self.hl3 = Tix.Label(f1, text=t.LMAX) hl1.grid(row=0, column=0, padx=3, pady=5, sticky=E) self.hl2.grid(row=1, column=0, padx=3, pady=5, sticky=E) self.hl3.grid(row=2, column=0, padx=3, pady=5, sticky=E) self.e1 = Tix.Entry(f1, bd=2, width=15, textvariable=self.label) self.e2 = Tix.Entry(f1, bd=2, width=15, textvariable=self.bmin) self.e3 = Tix.Entry(f1, bd=2, width=15, textvariable=self.bmax) self.e1.grid(row=0, column=1, padx=5, pady=5, sticky=W) self.e2.grid(row=1, column=1, padx=5, pady=5, sticky=W) self.e3.grid(row=2, column=1, padx=5, pady=5, sticky=W) box1 = Tix.ButtonBox(f1, orientation=VERTICAL, relief=FLAT) box1.add('create', text=t.CREATE) box1.create.bind('',TkPage.Callback(self.createHlist, self.h,'line',self.lineStep)) #box1.create.bind("<>",TkPage.Callback(self.createHlist,self.h, 'line')) box1.add('modify', text=t.MODIFY) box1.modify.bind('',TkPage.Callback(self.editHlist, self.h,'line',self.lineStep)) box1.add('erase', text=t.ERASE) box1.erase.bind('',TkPage.Callback(self.cancelHlist, self.h,'line')) box1.grid(row=0, column=2, rowspan=4, padx=15, pady=2, sticky=W) ######################################################## # NoteBook Page 2.2 Hlist 2 ######################################################## lf2 = Tix.LabelFrame(self.nb2.page2, bd=2, label=t.LOADINROW, relief=FLAT) lf2.label.config(font=fT) lf2.pack(side=TOP, fill=X, padx=10, pady=10) self.w3 = Tix.Frame(lf2.frame, relief=FLAT) self.w3.pack(side=TOP, fill=X) # Put a simple hierachy into the Hlist (two levels). # self.h2 = Tix.ScrolledHList(self.w3, options='hlist.columns 6 hlist.header 1 ' ) self.h2.config(scrollbar="auto +y +x") self._make_style() # selectmode='extended' -> multi select with and # selectmode='multiple' -> multi select only with # self.h2.hlist.config(selectmode='extended', browsecmd=self.selectH2, bg=wm['hlistbackground']) self.h2.hsb.config(width=10, bd=1) self.h2.vsb.config(width=10, bd=1) self.h2.pack(expand=1, fill=BOTH, padx=10, pady=10, side=TOP) # Create the headers # self.h2.hlist.header_create(0, itemtype=Tix.TEXT, text=t.LABEL, style=self.style['header']) self.h2.hlist.header_create(1, itemtype=Tix.TEXT, text=t.RMIN, style=self.style['header']) self.h2.hlist.header_create(2, itemtype=Tix.TEXT, text=t.RMAX, style=self.style['header']) self.h2.hlist.header_create(3, itemtype=Tix.TEXT, text=t.RRMIN, style=self.style['header']) self.h2.hlist.header_create(4, itemtype=Tix.TEXT, text=t.RRMAX, style=self.style['header']) # Notice that we use 5 columns in the Hlist widget. This way when the user # expands the windows wide, the right side of the header doesn't look # chopped off. The following line ensures that the 5 column header is # not shown unless the Hlist window is wider than its contents. # self.h2.hlist.column_width(5,0) # Let configure the appearance of the Hlist subwidget # self.h2.hlist.config(separator='.', width=25, height=11, drawbranch=0, indent=10) # Let configure the width of the columns # ## self.h2.hlist.column_width(0, chars=16) ## self.h2.hlist.column_width(1, chars=9) ## self.h2.hlist.column_width(2, chars=12) ## self.h2.hlist.column_width(3, chars=16) # Create the mouse selection instance # self.select2 = MultiSelect(self.h2.hlist) # Separator # s = Tix.Frame(lf2.frame, height=2, bd=2, relief=SUNKEN) s.pack(side=TOP, fill=X) f2 = Tix.Frame(lf2.frame, relief=FLAT) f2.pack(side=TOP, fill=X) h2l1 = Tix.Label(f2, text=t.LABEL) self.h2l2 = Tix.Label(f2, text=t.RMIN) self.h2l3 = Tix.Label(f2, text=t.RMAX) h2l1.grid(row=0, column=0, padx=3, pady=5, sticky=E) self.h2l2.grid(row=1, column=0, padx=3, pady=5, sticky=E) self.h2l3.grid(row=2, column=0, padx=3, pady=5, sticky=E) self.h2e1 = Tix.Entry(f2, bd=2, width=15, textvariable=self.label) self.h2e2 = Tix.Entry(f2, bd=2, width=15, textvariable=self.bmin) self.h2e3 = Tix.Entry(f2, bd=2, width=15, textvariable=self.bmax) self.h2e1.grid(row=0, column=1, padx=5, pady=5, sticky=W) self.h2e2.grid(row=1, column=1, padx=5, pady=5, sticky=W) self.h2e3.grid(row=2, column=1, padx=5, pady=5, sticky=W) h2box1 = Tix.ButtonBox(f2, orientation=VERTICAL, relief=FLAT) h2box1.add('create', text=t.CREATE) h2box1.create.bind('',TkPage.Callback(self.createHlist, self.h2,'row',self.rowStep)) #box1.create.bind("<>",TkPage.Callback(self.createHlist,self.h2, 'row')) h2box1.add('modify', text=t.MODIFY) h2box1.modify.bind('',TkPage.Callback(self.editHlist, self.h2,'row',self.rowStep)) h2box1.add('erase', text=t.ERASE) h2box1.erase.bind('',TkPage.Callback(self.cancelHlist, self.h2,'row')) h2box1.grid(row=0, column=2, rowspan=4, padx=15, pady=2, sticky=W) def _initializeWidgets(self): """ Extract resquested informations from XML document. This informations are used to initialize the widgets. For this page default values of all widgets are necessary included in the XML file. """ t = PageText() invStat = 'on' if self.alveoStat == 'on' : invStat = 'off' for i in range(len(self.variables)) : nbcellVariable=self.nbcellVariables[i] variable=self.variables[i] nval = self.model.getMatisseNetworkDoubleVar(nbcellVariable[0]) nbcellVariable[1].set(nval) val = nval*self.heightStep variable[1].set(val) self.model.setMatisseNetworkVar(variable[0], val) self.l3[i].config(text=variable[1].get()) self.ActiveWidget(0,invStat) self.ActiveWidget(1,self.alveoStat) self.ActiveWidget(2,self.alveoStat) if self.alveoStat == 'on' : self.tk.call(self.nb, 'pageconfigure', 'page2', "-state", "DISABLED") self.InitHlist(self.h,'line',self.lineStep) self.InitHlist(self.h2,'row',self.rowStep) #------------------------------------------------------------------------------- # Text and messages for this page #------------------------------------------------------------------------------- class PageText: """ Storage of all texts and messages for this page. """ def __init__(self): if Tool.GuiParam.lang == 'fr': self.PARAMETERS = 'Paramètres' self.LINE = 'Ligne' self.ROW = 'Rangée' self.HEIGHT = 'Hauteur' self.FILTER = 'Reseau de conteneurs' self.LOADINLINE = 'Zones de pertes de charge en ligne' self.LOADINROW = 'Zones de pertes de charge en rangées' self.LABEL = 'Label' self.LMIN = 'Distance min \n (en lignes)' self.LMAX = 'Distance max \n (en lignes)' self.LLMIN = 'Distance min \n (m)' self.LLMAX = 'Distance max \n (m)' self.RMIN = 'Distance min \n (en rangées)' self.RMAX = 'Distance max \n (en rangées)' self.RRMIN = 'Distance min \n (m)' self.RRMAX = 'Distance max \n (m)' self.CREATE= "Créer" self.ERASE = "Effacer" self.MODIFY= "Modifier" self.WARNING = "Attention" self.OUTOFBOUNDS = " mal spécifiée : revoir la définition des bornes min et max" self.MATISSE_THERMIC_TITLE="Spécification des conteneurs" self.texts={} self.texts['hreso1'] = "Hauteur du réseau de conteneurs (en mailles)" self.texts['hreso2'] = "Hauteur max des alvéoles (en mailles)" self.texts['hplen'] = "Hauteur min des alvéoles (en mailles)" else: self.MATISSE_THERMIC_TITLE = "Thermal load" self.FILTER = 'Canisters network' self.PARAMETERS = 'Parameters' self.LINE = 'Line' self.ROW = 'Row' self.HEIGHT = 'Height' self.LOADINLINE = 'Headloss in line' self.LOADINROW = 'Headloss in row' self.LOADINHEIGHT = 'Headloss in height' self.LABEL = 'Label' self.LMIN = 'Distance min \n (in lines)' self.LMAX = 'Distance max \n (in lines)' self.LLMIN = 'Distance min \n (m)' self.LLMAX = 'Distance max \n (m)' self.RMIN = 'Distance min \n (in rows)' self.RMAX = 'Distance max \n (in rows)' self.RRMIN = 'Distance min \n (m)' self.RRMAX = 'Distance max \n (m)' self.CREATE = "Create" self.ERASE = "Erase" self.MODIFY = "Modify" self.WARNING = "Warning" self.OUTOFBOUNDS = " bad definition : see the bounds definition" self.texts={} self.texts['hreso1'] = "Height of canisters network (in cells)" self.texts['hreso2'] = "Height max of double jacketed wells (in cells)" self.texts['hplen'] = "Height min of double jacketed wells (in cells)" #------------------------------------------------------------------------------- # End #-------------------------------------------------------------------------------