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

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

close and reopen model page

  • Property mode set to 100644
File size: 10.3 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   
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        selected_page = self.GetPage(self.GetSelection())
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
106       
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            self.count =0
117            ## page on menu
118            self.manager._add_page_onmenu(page_name, fitproblem)
119        else:
120            if selected_page in page_finder:
121       
122                fitproblem= page_finder[selected_page].clone()
123                ## page on menu
124                self.manager._add_page_onmenu(page_name, fitproblem)
125                del page_finder[selected_page]
126            ##remove the check box link to the model name of this page (selected_page)
127            try:
128                self.sim_page.draw_page()
129            except:
130                ## that page is already deleted no need to remove check box on
131                ##non existing page
132                pass
133               
134        #Delete the name of the page into the list of open page
135        if selected_page.window_name in self.list_fitpage_name:
136            self.list_fitpage_name.remove(selected_page.window_name)
137           
138       
139    def set_manager(self, manager):
140        """
141             set panel manager
142             @param manager: instance of plugin fitting
143        """
144        self.manager = manager
145
146       
147    def set_owner(self,owner):
148        """
149            set and owner for fitpanel
150            @param owner: the class responsible of plotting
151        """
152        self.event_owner = owner
153   
154    def set_model_list(self,dict):
155         """
156             copy a dictionary of model into its own dictionary
157             @param dict: dictionnary made of model name as key and model class
158             as value
159         """
160         self.model_list_box = dict
161       
162 
163    def get_current_page(self):
164        """
165            @return the current page selected
166        """
167        return self.GetPage(self.GetSelection() )
168   
169    def add_sim_page(self):
170        """
171            Add the simultaneous fit page
172        """
173        from simfitpage import SimultaneousFitPage
174        page_finder= self.manager.get_page_finder()
175        self.sim_page = SimultaneousFitPage(self,page_finder=page_finder, id=-1)
176       
177        self.AddPage(self.sim_page,caption="Simultaneous Fit",select=True)
178        self.sim_page.set_manager(self.manager)
179        return self.sim_page
180       
181    def add_fit_page( self,data, reset=False ):
182        """
183            Add a fitting page on the notebook contained by fitpanel
184            @param data: data to fit
185            @return panel : page just added for further used. is used by fitting module
186        """     
187        try:
188            name = data.name
189        except:
190            name = 'Fit'
191        if not name in self.list_fitpage_name:
192            myinfo = PageInfo( data=data, name=name )
193            myinfo.model_list_box = self.model_list_box.get_list()
194            myinfo.event_owner = self.event_owner
195            myinfo.manager = self.manager
196            myinfo.window_name = name
197            myinfo.window_caption = name
198       
199            #if not name in self.fit_page_name :
200            from fitpage import FitPage
201            panel = FitPage(parent= self, page_info=myinfo)
202           
203            self.AddPage(page=panel, caption=name, select=True)
204            self.list_fitpage_name.append(name)
205            if reset:
206                if name in self.fit_page_name.keys():
207                    memento= self.fit_page_name[name][0]
208                    panel.reset_page(memento)
209            else:
210                self.fit_page_name[name]=[]
211                self.fit_page_name[name].insert(0,panel.createMemento())
212         
213            return panel
214        else:
215            return None 
216       
217   
218    def add_model_page(self,model,page_title="Model", qmin=0, qmax=0.1,
219                        npts=50, topmenu=False, reset=False):
220        """
221            Add a model page only one  to display any model selected from the menu or the page combo box.
222            when this page is closed than the user will be able to open a new one
223           
224            @param model: the model for which paramters will be changed
225            @param page_title: the name of the page
226            @param page_info: contains info about the state of the page
227            @param qmin: mimimum Q
228            @param qmax: maximum Q
229            @param npts: number of Q points
230        """
231        if topmenu==True:
232            ##first time to open model page
233            if self.count==0 :
234                #if not page_title in self.list_fitpage_name :
235                self._help_add_model_page(model=model, page_title=page_title,
236                                qmin=qmin, qmax=qmax, npts=npts, reset=reset)
237                self.count +=1
238            else:
239                self.model_page.select_model(model, page_title)
240                self.fit_page_name[page_title].insert(0,self.model_page.createMemento())
241     
242           
243    def  _onGetstate(self, event):
244        """
245            copy the state of a page
246        """
247        page= event.page
248        if page.window_name in self.fit_page_name:
249            self.fit_page_name[page.window_name].insert(0,page.createMemento()) 
250           
251               
252    def _help_add_model_page(self,model,page_title="Model", qmin=0, 
253                             qmax=0.1, npts=50,reset= False):
254        """
255            #TODO: fill in description
256           
257            @param qmin: mimimum Q
258            @param qmax: maximum Q
259            @param npts: number of Q points
260        """
261        ## creating object that contaning info about model
262        myinfo = PageInfo(model= model ,name= page_title)
263        myinfo.model_list_box = self.model_list_box.get_list()
264        myinfo.event_owner = self.event_owner
265        myinfo.manager = self.manager
266        myinfo.window_name = page_title
267        myinfo.window_caption = page_title
268     
269        from modelpage import ModelPage
270        panel = ModelPage(self,myinfo)
271       
272        self.AddPage(page=panel,caption=page_title,select=True)
273
274        self.model_page_number=self.GetSelection()
275        self.model_page=self.GetPage(self.GetSelection())
276        # Set the range used to plot models
277        self.model_page.set_range(qmin, qmax, npts)
278        ##  resetting page
279        if reset:
280            if page_title in self.fit_page_name.keys():
281               
282                memento= self.fit_page_name[page_title][0]
283                panel.reset_page(memento)
284        else:
285            self.fit_page_name[page_title]=[]
286            self.fit_page_name[page_title].insert(0,panel.createMemento())
287         
288        # We just created a model page, we are ready to plot the model
289        #self.manager.draw_model(model, model.name)
290        #FOR PLUGIN  for some reason model.name is = BASEcomponent
291        self.manager.draw_model(model)
292 
293 
Note: See TracBrowser for help on using the repository browser.