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

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

restore mode for model page

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