source: sasview/sansview/perspectives/fitting/fitpanel.py @ 63c7d85d

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 63c7d85d was e814734, checked in by Gervaise Alina <gervyh@…>, 15 years ago

selecting tab change style

  • Property mode set to 100644
File size: 11.8 KB
RevLine 
[d89f09b]1import wx
[26bf293]2import wx.aui
[d89f09b]3import wx.lib
4import numpy
5import string ,re
6#import models
7_BOX_WIDTH = 80
[cfc0913]8import basepage
[00c3aac]9
[cfc0913]10class PageInfo(object):
11    """
12        this class contains the minimum numbers of data members
13        a fitpage or model page need to be initialized.
14    """
15    data = None
16    model= None
17    manager= None
18    event_owner= None
19    model_list_box = None
20    name=None
21     ## Internal name for the AUI manager
22    window_name = "Page"
23    ## Title to appear on top of the window
24    window_caption = "Page"
25   
26    def __init__(self, model=None,data=None, manager=None,
27                  event_owner=None,model_list_box=None , name=None):
28        """
29            Initialize data members
30        """
31        self.data = data
32        self.model= model
33        self.manager= manager
34        self.event_owner= event_owner
35        self.model_list_box = model_list_box
36        self.name=None
37        self.window_name = "Page"
38        self.window_caption = "Page"
39   
[26bf293]40class FitPanel(wx.aui.AuiNotebook):   
[925a30e]41
[d89f09b]42    """
43        FitPanel class contains fields allowing to fit  models and  data
44        @note: For Fit to be performed the user should check at least one parameter
45        on fit Panel window.
46       
47    """
48    ## Internal name for the AUI manager
49    window_name = "Fit panel"
50    ## Title to appear on top of the window
51    window_caption = "Fit Panel "
[2139c3f]52    CENTER_PANE = True
[d89f09b]53    def __init__(self, parent, *args, **kwargs):
[e814734]54        #wx.aui.AuiNotebook.__init__(self,parent,-1, style=wx.aui.AUI_NB_DEFAULT_STYLE  )
55        wx.aui.AuiNotebook.__init__(self,parent,-1,
56                    style= wx.aui.AUI_NB_WINDOWLIST_BUTTON|wx.aui.AUI_NB_DEFAULT_STYLE \
57                    |wx.CLIP_CHILDREN  )
58       
[26bf293]59       
[d89f09b]60        self.manager=None
61        self.parent=parent
62        self.event_owner=None
[26bf293]63       
64        pageClosedEvent = wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE
65        self.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.onClosePage)
[e814734]66        ##Creating the default page --welcomed page
[51d47b5]67        self.about_page=None
[1328e03]68        from welcome_panel import PanelAbout
[94999eb]69        self.about_page = PanelAbout(self, -1)
[280a14b]70        self.AddPage(self.about_page,"Welcome!")
[925a30e]71     
[51d47b5]72       
[d89f09b]73        #dictionary of miodel {model class name, model class}
74        self.model_list_box={}
[00c3aac]75        ##dictionary of page info
76        self.page_info_dict={}
[cfc0913]77        ## save the title of the last page tab added
78        self.fit_page_name={}
79        ## list of existing fit page
80        self.list_fitpage_name=[]
[6999659]81   
[f39511b]82        #model page info
83        self.model_page_number=None
[882a912]84        ## fit page number for model plot
85        self.fit_page1D_number=None
86        self.fit_page2D_number=None
[f39511b]87        self.model_page=None
[51d47b5]88        self.sim_page=None
[cfc0913]89        ## get the state of a page
90        self.Bind(basepage.EVT_PAGE_INFO, self._onGetstate)
[6bcdad1]91        # increment number for model name
92        self.count=0
[f39511b]93        #updating the panel
[26bf293]94        self.Update()
[d89f09b]95        self.Center()
[2a8fac1]96       
97       
[26bf293]98    def onClosePage(self, event):
[51d47b5]99        """
[925a30e]100             close page and remove all references to the closed page
[51d47b5]101        """
102        selected_page = self.GetPage(self.GetSelection())
[7c845cb]103        ## removing about page
104        if selected_page==self.about_page:
105            self.about_page=None
106            return 
107        ## removing sim_page
108        if selected_page == self.sim_page:
109            self.manager.sim_page=None 
110            return
[9853ad0]111       
[7c845cb]112        ## closing other pages
113        state = selected_page.createMemento()
114        page_name = selected_page.window_name
115        page_finder = self.manager.get_page_finder() 
116        fitproblem = None
117        ## removing model page
118        if selected_page == self.model_page:
119            fitproblem = selected_page.model.clone()
120            self.model_page = None
[ff36f31]121            self.count =0
[7c845cb]122            ## page on menu
[4b26f8d9]123            #self.manager._add_page_onmenu(page_name, fitproblem)
[7c845cb]124        else:
125            if selected_page in page_finder:
126       
127                fitproblem= page_finder[selected_page].clone()
[882a912]128                if self.GetPageIndex(selected_page)==self.fit_page1D_number:
129                    self.fit_page1D_number=None
130                if self.GetPageIndex(selected_page)==self.fit_page2D_number:
131                    self.fit_page2D_number=None
[7c845cb]132                ## page on menu
[4b26f8d9]133                #self.manager._add_page_onmenu(page_name, fitproblem)
[7c845cb]134                del page_finder[selected_page]
135            ##remove the check box link to the model name of this page (selected_page)
136            try:
[1d2782d]137                self.sim_page.draw_page()
[7c845cb]138            except:
139                ## that page is already deleted no need to remove check box on
140                ##non existing page
141                pass
[9853ad0]142               
[7c845cb]143        #Delete the name of the page into the list of open page
144        if selected_page.window_name in self.list_fitpage_name:
145            self.list_fitpage_name.remove(selected_page.window_name)
[a074145]146           
[d89f09b]147       
148    def set_manager(self, manager):
149        """
150             set panel manager
151             @param manager: instance of plugin fitting
152        """
153        self.manager = manager
[925a30e]154
[d89f09b]155       
156    def set_owner(self,owner):
157        """
158            set and owner for fitpanel
159            @param owner: the class responsible of plotting
160        """
[c77d859]161        self.event_owner = owner
162   
163    def set_model_list(self,dict):
164         """
165             copy a dictionary of model into its own dictionary
166             @param dict: dictionnary made of model name as key and model class
167             as value
168         """
169         self.model_list_box = dict
[51d47b5]170       
[c77d859]171 
172    def get_current_page(self):
173        """
174            @return the current page selected
175        """
176        return self.GetPage(self.GetSelection() )
177   
[51d47b5]178    def add_sim_page(self):
[925a30e]179        """
180            Add the simultaneous fit page
181        """
[51d47b5]182        from simfitpage import SimultaneousFitPage
[b28717b]183        page_finder= self.manager.get_page_finder()
184        self.sim_page = SimultaneousFitPage(self,page_finder=page_finder, id=-1)
185       
[51d47b5]186        self.AddPage(self.sim_page,caption="Simultaneous Fit",select=True)
187        self.sim_page.set_manager(self.manager)
188        return self.sim_page
[d89f09b]189       
[cfc0913]190    def add_fit_page( self,data, reset=False ):
[d89f09b]191        """
192            Add a fitting page on the notebook contained by fitpanel
[925a30e]193            @param data: data to fit
[b787e68c]194            @return panel : page just added for further used. is used by fitting module
[d89f09b]195        """     
[882a912]196        if data.is_data:
[925a30e]197            name = data.name
[882a912]198        else:
199            if data.__class__.__name__=="Data2D":
200                name = 'Model 2D Fit'
201            else:
202                name = 'Model 1D Fit'
[cfc0913]203        if not name in self.list_fitpage_name:
204            myinfo = PageInfo( data=data, name=name )
[dcf29d7]205            myinfo.model_list_box = self.model_list_box.get_list()
206            myinfo.event_owner = self.event_owner
207            myinfo.manager = self.manager
[b787e68c]208            myinfo.window_name = name
209            myinfo.window_caption = name
[6e659ae8]210       
[cfc0913]211            #if not name in self.fit_page_name :
[c77d859]212            from fitpage import FitPage
[cfc0913]213            panel = FitPage(parent= self, page_info=myinfo)
[b787e68c]214           
215            self.AddPage(page=panel, caption=name, select=True)
[882a912]216            if name == 'Model 1D Fit':
217                self.fit_page1D_number= self.GetPageIndex(panel)
218            if name =='Model 2D Fit':
219                self.fit_page2D_number= self.GetPageIndex(panel)
220               
[cfc0913]221            self.list_fitpage_name.append(name)
222            if reset:
223                if name in self.fit_page_name.keys():
224                    memento= self.fit_page_name[name][0]
225                    panel.reset_page(memento)
226            else:
227                self.fit_page_name[name]=[]
228                self.fit_page_name[name].insert(0,panel.createMemento())
[882a912]229            #GetPage(self, page_idx)
[925a30e]230            return panel
[882a912]231        elif name =='Model 1D Fit':
232            if self.fit_page1D_number!=None:
233                panel =self.GetPage(self.fit_page1D_number) 
234                self.fit_page_name[name]=[]
235                self.fit_page_name[name].insert(0,panel.createMemento())
236                return panel
237            return None
238        elif name =='Model 2D Fit':
239            if self.fit_page2D_number!=None:
240                panel =self.GetPage(self.fit_page2D_number) 
241                self.fit_page_name[name]=[]
242                self.fit_page_name[name].insert(0,panel.createMemento())
243                return panel
244            return None
245        return None
[1c66bc5]246       
[9853ad0]247   
[cd793b9]248    def add_model_page(self,model,page_title="Model", qmin=0.0001, qmax=0.13,
[b787e68c]249                        npts=50, topmenu=False, reset=False):
[9853ad0]250        """
251            Add a model page only one  to display any model selected from the menu or the page combo box.
252            when this page is closed than the user will be able to open a new one
253           
254            @param model: the model for which paramters will be changed
255            @param page_title: the name of the page
[dcf29d7]256            @param page_info: contains info about the state of the page
[9853ad0]257            @param qmin: mimimum Q
258            @param qmax: maximum Q
259            @param npts: number of Q points
260        """
261        if topmenu==True:
[ff36f31]262            ##first time to open model page
263            if self.count==0 :
264                #if not page_title in self.list_fitpage_name :
[6999659]265                self._help_add_model_page(model=model, page_title=page_title,
[b787e68c]266                                qmin=qmin, qmax=qmax, npts=npts, reset=reset)
[ff36f31]267                self.count +=1
[9853ad0]268            else:
[fbf4bf8]269                self.model_page.select_model(model)
[6999659]270                self.fit_page_name[page_title].insert(0,self.model_page.createMemento())
[b787e68c]271     
[dcf29d7]272           
[cfc0913]273    def  _onGetstate(self, event):
274        """
275            copy the state of a page
276        """
277        page= event.page
[b787e68c]278        if page.window_name in self.fit_page_name:
279            self.fit_page_name[page.window_name].insert(0,page.createMemento()) 
[cfc0913]280           
[dcf29d7]281               
[cd793b9]282    def _help_add_model_page(self,model,page_title="Model", qmin=0.0001, 
283                             qmax=0.13, npts=50,reset= False):
[3f1af74]284        """
285            #TODO: fill in description
286           
287            @param qmin: mimimum Q
288            @param qmax: maximum Q
289            @param npts: number of Q points
290        """
[dcf29d7]291        ## creating object that contaning info about model
[b787e68c]292        myinfo = PageInfo(model= model ,name= page_title)
293        myinfo.model_list_box = self.model_list_box.get_list()
294        myinfo.event_owner = self.event_owner
295        myinfo.manager = self.manager
296        myinfo.window_name = page_title
297        myinfo.window_caption = page_title
298     
[c77d859]299        from modelpage import ModelPage
[cfc0913]300        panel = ModelPage(self,myinfo)
[b787e68c]301       
302        self.AddPage(page=panel,caption=page_title,select=True)
[77e23a2]303
[bb18ef1]304        self.model_page_number=self.GetSelection()
305        self.model_page=self.GetPage(self.GetSelection())
306        # Set the range used to plot models
307        self.model_page.set_range(qmin, qmax, npts)
[b787e68c]308        ##  resetting page
309        if reset:
310            if page_title in self.fit_page_name.keys():
311               
312                memento= self.fit_page_name[page_title][0]
313                panel.reset_page(memento)
314        else:
315            self.fit_page_name[page_title]=[]
316            self.fit_page_name[page_title].insert(0,panel.createMemento())
317         
318        # We just created a model page, we are ready to plot the model
319        #self.manager.draw_model(model, model.name)
320        #FOR PLUGIN  for some reason model.name is = BASEcomponent
[cd793b9]321        self.manager.draw_model(model, qmin=qmin, qmax=qmax)
[26bf293]322 
[b787e68c]323 
Note: See TracBrowser for help on using the repository browser.