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

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

working on saving page status

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