source: sasview/sansview/perspectives/fitting/fitpanel.py @ d4ccbb1

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 d4ccbb1 was 1b69256, checked in by Gervaise Alina <gervyh@…>, 15 years ago

working on save option

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