source: sasview/sansview/perspectives/fitting/fitpanel.py @ 7c845cb

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

open and closing page and simpage update

  • Property mode set to 100644
File size: 10.2 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):
[51d47b5]54        wx.aui.AuiNotebook.__init__(self,parent,-1, style=wx.aui.AUI_NB_DEFAULT_STYLE  )
[94999eb]55       
[26bf293]56       
[d89f09b]57        self.manager=None
58        self.parent=parent
59        self.event_owner=None
[26bf293]60       
61        pageClosedEvent = wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE
62        self.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.onClosePage)
[94999eb]63        #Creating the default page --welcomed page
[51d47b5]64        self.about_page=None
[1328e03]65        from welcome_panel import PanelAbout
[94999eb]66        self.about_page = PanelAbout(self, -1)
67        self.AddPage(self.about_page,"welcome!")
[925a30e]68     
[51d47b5]69       
[d89f09b]70        #dictionary of miodel {model class name, model class}
71        self.model_list_box={}
[00c3aac]72        ##dictionary of page info
73        self.page_info_dict={}
[cfc0913]74        ## save the title of the last page tab added
75        self.fit_page_name={}
76        ## list of existing fit page
77        self.list_fitpage_name=[]
[6999659]78   
[f39511b]79        #model page info
80        self.model_page_number=None
[10c43a5]81       
[f39511b]82        self.model_page=None
[51d47b5]83        self.sim_page=None
[cfc0913]84        ## get the state of a page
85        self.Bind(basepage.EVT_PAGE_INFO, self._onGetstate)
[6bcdad1]86        # increment number for model name
87        self.count=0
[f39511b]88        #updating the panel
[26bf293]89        self.Update()
[d89f09b]90        self.Center()
[2a8fac1]91       
92       
[26bf293]93    def onClosePage(self, event):
[51d47b5]94        """
[925a30e]95             close page and remove all references to the closed page
[51d47b5]96        """
97        selected_page = self.GetPage(self.GetSelection())
[7c845cb]98        ## removing about page
99        if selected_page==self.about_page:
100            self.about_page=None
101            return 
102        ## removing sim_page
103        if selected_page == self.sim_page:
104            self.manager.sim_page=None 
105            return
[9853ad0]106       
[7c845cb]107        ## closing other pages
108        state = selected_page.createMemento()
109        page_name = selected_page.window_name
110        page_finder = self.manager.get_page_finder() 
111        fitproblem = None
112        ## removing model page
113        if selected_page == self.model_page:
114            fitproblem = selected_page.model.clone()
115            self.model_page = None
116            ## page on menu
117            self.manager._add_page_onmenu(page_name, fitproblem)
118        else:
119            if selected_page in page_finder:
120       
121                fitproblem= page_finder[selected_page].clone()
122                ## page on menu
123                self.manager._add_page_onmenu(page_name, fitproblem)
124                del page_finder[selected_page]
125            ##remove the check box link to the model name of this page (selected_page)
126            try:
[1d2782d]127                self.sim_page.draw_page()
[7c845cb]128            except:
129                ## that page is already deleted no need to remove check box on
130                ##non existing page
131                pass
[9853ad0]132               
[7c845cb]133        #Delete the name of the page into the list of open page
134        if selected_page.window_name in self.list_fitpage_name:
135            self.list_fitpage_name.remove(selected_page.window_name)
136   
137       
[b787e68c]138       
[925a30e]139       
[d89f09b]140       
141    def set_manager(self, manager):
142        """
143             set panel manager
144             @param manager: instance of plugin fitting
145        """
146        self.manager = manager
[925a30e]147
[d89f09b]148       
149    def set_owner(self,owner):
150        """
151            set and owner for fitpanel
152            @param owner: the class responsible of plotting
153        """
[c77d859]154        self.event_owner = owner
155   
156    def set_model_list(self,dict):
157         """
158             copy a dictionary of model into its own dictionary
159             @param dict: dictionnary made of model name as key and model class
160             as value
161         """
162         self.model_list_box = dict
[51d47b5]163       
[c77d859]164 
165    def get_current_page(self):
166        """
167            @return the current page selected
168        """
169        return self.GetPage(self.GetSelection() )
170   
[51d47b5]171    def add_sim_page(self):
[925a30e]172        """
173            Add the simultaneous fit page
174        """
[51d47b5]175        from simfitpage import SimultaneousFitPage
[b28717b]176        page_finder= self.manager.get_page_finder()
177        self.sim_page = SimultaneousFitPage(self,page_finder=page_finder, id=-1)
178       
[51d47b5]179        self.AddPage(self.sim_page,caption="Simultaneous Fit",select=True)
180        self.sim_page.set_manager(self.manager)
181        return self.sim_page
[d89f09b]182       
[cfc0913]183    def add_fit_page( self,data, reset=False ):
[d89f09b]184        """
185            Add a fitting page on the notebook contained by fitpanel
[925a30e]186            @param data: data to fit
[b787e68c]187            @return panel : page just added for further used. is used by fitting module
[d89f09b]188        """     
[bcd6d51]189        try:
[925a30e]190            name = data.name
[bcd6d51]191        except:
192            name = 'Fit'
[cfc0913]193        if not name in self.list_fitpage_name:
194            myinfo = PageInfo( data=data, name=name )
[dcf29d7]195            myinfo.model_list_box = self.model_list_box.get_list()
196            myinfo.event_owner = self.event_owner
197            myinfo.manager = self.manager
[b787e68c]198            myinfo.window_name = name
199            myinfo.window_caption = name
[6e659ae8]200       
[cfc0913]201            #if not name in self.fit_page_name :
[c77d859]202            from fitpage import FitPage
[cfc0913]203            panel = FitPage(parent= self, page_info=myinfo)
[b787e68c]204           
205            self.AddPage(page=panel, caption=name, select=True)
[cfc0913]206            self.list_fitpage_name.append(name)
207            if reset:
208                if name in self.fit_page_name.keys():
209                    memento= self.fit_page_name[name][0]
210                    panel.reset_page(memento)
211            else:
212                self.fit_page_name[name]=[]
213                self.fit_page_name[name].insert(0,panel.createMemento())
214         
[925a30e]215            return panel
[fee6059]216        else:
[925a30e]217            return None 
[1c66bc5]218       
[9853ad0]219   
[6999659]220    def add_model_page(self,model,page_title="Model", qmin=0, qmax=0.1,
[b787e68c]221                        npts=50, topmenu=False, reset=False):
[9853ad0]222        """
223            Add a model page only one  to display any model selected from the menu or the page combo box.
224            when this page is closed than the user will be able to open a new one
225           
226            @param model: the model for which paramters will be changed
227            @param page_title: the name of the page
[dcf29d7]228            @param page_info: contains info about the state of the page
[9853ad0]229            @param qmin: mimimum Q
230            @param qmax: maximum Q
231            @param npts: number of Q points
232        """
233        if topmenu==True:
[6999659]234            if not page_title in self.fit_page_name.keys()or reset==True:
235                self._help_add_model_page(model=model, page_title=page_title,
[b787e68c]236                                qmin=qmin, qmax=qmax, npts=npts, reset=reset)
[9853ad0]237            else:
[6999659]238                self.model_page.select_model(model, page_title)
239                self.fit_page_name[page_title].insert(0,self.model_page.createMemento())
[b787e68c]240     
[dcf29d7]241           
[cfc0913]242    def  _onGetstate(self, event):
243        """
244            copy the state of a page
245        """
246        page= event.page
[b787e68c]247        if page.window_name in self.fit_page_name:
248            self.fit_page_name[page.window_name].insert(0,page.createMemento()) 
[cfc0913]249           
[dcf29d7]250               
[b787e68c]251    def _help_add_model_page(self,model,page_title="Model", qmin=0, 
252                             qmax=0.1, npts=50,reset= False):
[3f1af74]253        """
254            #TODO: fill in description
255           
256            @param qmin: mimimum Q
257            @param qmax: maximum Q
258            @param npts: number of Q points
259        """
[dcf29d7]260        ## creating object that contaning info about model
[b787e68c]261        myinfo = PageInfo(model= model ,name= page_title)
262        myinfo.model_list_box = self.model_list_box.get_list()
263        myinfo.event_owner = self.event_owner
264        myinfo.manager = self.manager
265        myinfo.window_name = page_title
266        myinfo.window_caption = page_title
267     
[c77d859]268        from modelpage import ModelPage
[cfc0913]269        panel = ModelPage(self,myinfo)
[b787e68c]270       
271        self.AddPage(page=panel,caption=page_title,select=True)
[77e23a2]272
[bb18ef1]273        self.model_page_number=self.GetSelection()
274        self.model_page=self.GetPage(self.GetSelection())
275        # Set the range used to plot models
276        self.model_page.set_range(qmin, qmax, npts)
[b787e68c]277        ##  resetting page
278        if reset:
279            if page_title in self.fit_page_name.keys():
280               
281                memento= self.fit_page_name[page_title][0]
282                panel.reset_page(memento)
283        else:
284            self.fit_page_name[page_title]=[]
285            self.fit_page_name[page_title].insert(0,panel.createMemento())
286         
287        # We just created a model page, we are ready to plot the model
288        #self.manager.draw_model(model, model.name)
289        #FOR PLUGIN  for some reason model.name is = BASEcomponent
290        self.manager.draw_model(model)
[26bf293]291 
[b787e68c]292 
Note: See TracBrowser for help on using the repository browser.