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
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        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       
59       
60        self.manager=None
61        self.parent=parent
62        self.event_owner=None
63       
64        pageClosedEvent = wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE
65        self.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.onClosePage)
66        ##Creating the default page --welcomed page
67        self.about_page=None
68        from welcome_panel import PanelAbout
69        self.about_page = PanelAbout(self, -1)
70        self.AddPage(self.about_page,"Welcome!")
71     
72       
73        #dictionary of miodel {model class name, model class}
74        self.model_list_box={}
75        ##dictionary of page info
76        self.page_info_dict={}
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=[]
81   
82        #model page info
83        self.model_page_number=None
84        ## fit page number for model plot
85        self.fit_page1D_number=None
86        self.fit_page2D_number=None
87        self.model_page=None
88        self.sim_page=None
89        ## get the state of a page
90        self.Bind(basepage.EVT_PAGE_INFO, self._onGetstate)
91        # increment number for model name
92        self.count=0
93        #updating the panel
94        self.Update()
95        self.Center()
96       
97       
98    def onClosePage(self, event):
99        """
100             close page and remove all references to the closed page
101        """
102        selected_page = self.GetPage(self.GetSelection())
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
111       
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
121            self.count =0
122            ## page on menu
123            #self.manager._add_page_onmenu(page_name, fitproblem)
124        else:
125            if selected_page in page_finder:
126       
127                fitproblem= page_finder[selected_page].clone()
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
132                ## page on menu
133                #self.manager._add_page_onmenu(page_name, fitproblem)
134                del page_finder[selected_page]
135            ##remove the check box link to the model name of this page (selected_page)
136            try:
137                self.sim_page.draw_page()
138            except:
139                ## that page is already deleted no need to remove check box on
140                ##non existing page
141                pass
142               
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)
146           
147       
148    def set_manager(self, manager):
149        """
150             set panel manager
151             @param manager: instance of plugin fitting
152        """
153        self.manager = manager
154
155       
156    def set_owner(self,owner):
157        """
158            set and owner for fitpanel
159            @param owner: the class responsible of plotting
160        """
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
170       
171 
172    def get_current_page(self):
173        """
174            @return the current page selected
175        """
176        return self.GetPage(self.GetSelection() )
177   
178    def add_sim_page(self):
179        """
180            Add the simultaneous fit page
181        """
182        from simfitpage import SimultaneousFitPage
183        page_finder= self.manager.get_page_finder()
184        self.sim_page = SimultaneousFitPage(self,page_finder=page_finder, id=-1)
185       
186        self.AddPage(self.sim_page,caption="Simultaneous Fit",select=True)
187        self.sim_page.set_manager(self.manager)
188        return self.sim_page
189       
190    def add_fit_page( self,data, reset=False ):
191        """
192            Add a fitting page on the notebook contained by fitpanel
193            @param data: data to fit
194            @return panel : page just added for further used. is used by fitting module
195        """     
196        if data.is_data:
197            name = data.name
198        else:
199            if data.__class__.__name__=="Data2D":
200                name = 'Model 2D Fit'
201            else:
202                name = 'Model 1D Fit'
203        if not name in self.list_fitpage_name:
204            myinfo = PageInfo( data=data, name=name )
205            myinfo.model_list_box = self.model_list_box.get_list()
206            myinfo.event_owner = self.event_owner
207            myinfo.manager = self.manager
208            myinfo.window_name = name
209            myinfo.window_caption = name
210       
211            #if not name in self.fit_page_name :
212            from fitpage import FitPage
213            panel = FitPage(parent= self, page_info=myinfo)
214           
215            self.AddPage(page=panel, caption=name, select=True)
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               
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())
229            #GetPage(self, page_idx)
230            return panel
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
246       
247   
248    def add_model_page(self,model,page_title="Model", qmin=0.0001, qmax=0.13,
249                        npts=50, topmenu=False, reset=False):
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
256            @param page_info: contains info about the state of the page
257            @param qmin: mimimum Q
258            @param qmax: maximum Q
259            @param npts: number of Q points
260        """
261        if topmenu==True:
262            ##first time to open model page
263            if self.count==0 :
264                #if not page_title in self.list_fitpage_name :
265                self._help_add_model_page(model=model, page_title=page_title,
266                                qmin=qmin, qmax=qmax, npts=npts, reset=reset)
267                self.count +=1
268            else:
269                self.model_page.select_model(model)
270                self.fit_page_name[page_title].insert(0,self.model_page.createMemento())
271     
272           
273    def  _onGetstate(self, event):
274        """
275            copy the state of a page
276        """
277        page= event.page
278        if page.window_name in self.fit_page_name:
279            self.fit_page_name[page.window_name].insert(0,page.createMemento()) 
280           
281               
282    def _help_add_model_page(self,model,page_title="Model", qmin=0.0001, 
283                             qmax=0.13, npts=50,reset= False):
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        """
291        ## creating object that contaning info about model
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     
299        from modelpage import ModelPage
300        panel = ModelPage(self,myinfo)
301       
302        self.AddPage(page=panel,caption=page_title,select=True)
303
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)
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
321        self.manager.draw_model(model, qmin=qmin, qmax=qmax)
322 
323 
Note: See TracBrowser for help on using the repository browser.