source: sasview/sansview/perspectives/fitting/basepage.py @ 59a7f2d

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

select default value in combobox box

  • Property mode set to 100644
File size: 37.7 KB
Line 
1
2import sys
3import wx
4import numpy
5
6from sans.guiframe.utils import format_number
7from sans.guicomm.events import StatusEvent   
8
9_BOX_WIDTH = 80
10
11class BasicPage(wx.ScrolledWindow):
12    """
13        This class provide general structure of  fitpanel page
14    """
15    ## Internal name for the AUI manager
16    window_name = "Fit page"
17    ## Title to appear on top of the window
18    window_caption = "Fit Page"
19   
20    name=""
21   
22    def __init__(self,parent, pageinfo, name):
23        wx.ScrolledWindow.__init__(self, parent)
24        ## store name
25        self.name = name
26        ## store info of panel
27        self.page_info= pageinfo
28        self.page_info.page_name = name
29        ## parent of the page
30        self.parent = parent
31        ## owner of the page (fitting plugin)
32        self.event_owner= None
33        ## create the basic structure of the panel with empty sizer
34        self.define_page_structure()
35        ## dictionary containing list of models
36        self.model_list_box={}
37        ## Data member to store the dispersion object created
38        self._disp_obj_dict = {}
39        self.disp_cb_dict ={}
40        ##list of model parameters. each item must have same length
41        ## each item related to a given parameters
42        ##[cb state, name, value, "+/-", error of fit, min, max , units]
43        self.parameters=[]
44        ## list of parameters to fit , must be like self.parameters
45        self.param_toFit=[]
46        ## list of looking like parameters but with non fittable parameters info
47        self.fixed_param=[]
48        ## list of looking like parameters but with  fittable parameters info
49        self.fittable_param=[]
50        ##list of dispersion parameters
51        self.disp_list=[]
52       
53        ##enable model 2D draw
54        self.enable2D= False
55        ## check that the fit range is correct to plot the model again
56        self.fitrange= True
57        ## current model
58        self.model= None
59        ## data
60        self.data=None
61        ## Q range
62        self.qmin_x= 0.001
63        self.qmax_x= 0.1
64        self.num_points= 100
65        ## changing initial values given page_info value
66        if self.page_info !=None and len(self.page_info.model_list_box) >0:
67            self.model_list_box = self.page_info.model_list_box
68            ## current model
69            self.model=self.page_info.model
70            self.data = self.page_info.data
71            self.event_owner = self.page_info.event_owner
72           
73            if self.model !=None:
74                self.disp_list= self.model.getDispParamList()
75        ## drawing Initial dispersion parameters sizer
76        self.set_dispers_sizer()
77        self._fill_save_sizer()
78        ## layout
79        self.set_layout()
80       
81       
82    def define_page_structure(self):
83        """
84            Create empty sizer for a panel
85        """
86        self.vbox  = wx.BoxSizer(wx.VERTICAL)
87        self.sizer0 = wx.BoxSizer(wx.VERTICAL)
88        self.sizer1 = wx.BoxSizer(wx.VERTICAL)
89        self.sizer2 = wx.BoxSizer(wx.VERTICAL)
90        self.sizer3 = wx.BoxSizer(wx.VERTICAL)
91        self.sizer4 = wx.BoxSizer(wx.VERTICAL)
92        self.sizer5 = wx.BoxSizer(wx.VERTICAL)
93        self.sizer6 = wx.BoxSizer(wx.VERTICAL)
94       
95        self.sizer0.SetMinSize((375,-1))
96        self.sizer1.SetMinSize((375,-1))
97        self.sizer2.SetMinSize((375,-1))
98        self.sizer3.SetMinSize((375,-1))
99        self.sizer4.SetMinSize((375,-1))
100        self.sizer5.SetMinSize((375,-1))
101        self.sizer6.SetMinSize((375,-1))
102       
103        self.vbox.Add(self.sizer0)
104        self.vbox.Add(self.sizer1)
105        self.vbox.Add(self.sizer2)
106        self.vbox.Add(self.sizer3)
107        self.vbox.Add(self.sizer4)
108        self.vbox.Add(self.sizer5)
109        self.vbox.Add(self.sizer6)
110       
111    def set_layout(self):
112        """
113             layout
114        """
115        self.vbox.Layout()
116        self.vbox.Fit(self) 
117        self.SetSizer(self.vbox)
118       
119        self.set_scroll()
120        self.Centre()
121       
122    def set_scroll(self):
123        self.SetScrollbars(20,20,200,100)
124        self.Layout()   
125        self.SetAutoLayout(True)
126         
127    def set_owner(self,owner):
128        """
129            set owner of fitpage
130            @param owner: the class responsible of plotting
131        """
132        self.event_owner = owner   
133        self.page_info.event_owner = owner
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        self.page_info.manager = manager
142       
143    def populate_box(self, dict):
144        """
145             Store list of model
146             @param dict: dictionary containing list of models
147        """
148        self.model_list_box = dict
149        if self.page_info!=None:
150            self.page_info.model_list_box = self.model_list_box
151           
152   
153       
154    def set_dispers_sizer(self):
155        """
156            fill sizer containing dispersity info
157        """
158        self.sizer4.Clear(True)
159        box_description= wx.StaticBox(self, -1,"PolyDispersity")
160        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
161        #----------------------------------------------------
162        self.disable_disp = wx.RadioButton(self, -1, 'No', (10, 10), style=wx.RB_GROUP)
163        self.enable_disp = wx.RadioButton(self, -1, 'Yes', (10, 30))
164        self.Bind(wx.EVT_RADIOBUTTON, self._set_dipers_Param, id=self.disable_disp.GetId())
165        self.Bind(wx.EVT_RADIOBUTTON, self._set_dipers_Param, id=self.enable_disp.GetId())
166       
167        sizer_dispersion = wx.BoxSizer(wx.HORIZONTAL)
168        sizer_dispersion.Add((20,20))
169        sizer_dispersion.Add(wx.StaticText(self,-1,'Polydispersity: '))
170        sizer_dispersion.Add(self.enable_disp )
171        sizer_dispersion.Add((20,20))
172        sizer_dispersion.Add(self.disable_disp )
173        sizer_dispersion.Add((10,10))
174       
175        ## fill a sizer with the combobox to select dispersion type
176        sizer_select_dispers = wx.BoxSizer(wx.HORIZONTAL) 
177        self.model_disp = wx.StaticText(self, -1, 'Model Disp')
178           
179        import sans.models.dispersion_models 
180        self.polydisp= sans.models.dispersion_models.models
181        self.disp_box = wx.ComboBox(self, -1)
182        self.disp_box.SetValue("GaussianModel")
183       
184        for key in self.polydisp.iterkeys():
185            name = str(key.__name__)
186            if name=="ArrayDispersion":
187                # Remove the option until the rest of the code is ready for it
188                self.disp_box.Append("Select customized Model",key)
189                pass 
190            else:
191                self.disp_box.Append(name,key) 
192        wx.EVT_COMBOBOX(self.disp_box,-1, self._on_select_Disp) 
193             
194        sizer_select_dispers.Add((10,10)) 
195        sizer_select_dispers.Add(self.model_disp) 
196        sizer_select_dispers.Add(self.disp_box) 
197        sizer_select_dispers.Add((10,10)) 
198        self.model_disp.Hide()
199        self.disp_box.Hide()
200       
201        boxsizer1.Add( sizer_dispersion )
202        boxsizer1.Add( (10,10) )
203        boxsizer1.Add( sizer_select_dispers )
204        self.sizer4_4 = wx.GridBagSizer(5,5)
205        boxsizer1.Add( self.sizer4_4  )
206        #-----------------------------------------------------
207        self.sizer4.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
208        self.sizer4.Layout()
209       
210        self.SetScrollbars(20,20,200,100)
211       
212   
213    def select_disp_angle(self, event): 
214        """
215            Event for when a user select a parameter to average over.
216            @param event: check box event
217        """
218       
219       
220        # Go through the list of dispersion check boxes to identify which one has changed
221        for p in self.disp_cb_dict:
222            # Catch which one of the box was just checked or unchecked.
223            if event.GetEventObject() == self.disp_cb_dict[p]:             
224
225               
226                if self.disp_cb_dict[p].GetValue() == True:
227                    # The user wants this parameter to be averaged.
228                    # Pop up the file selection dialog.
229                    path = self._selectDlg()
230                   
231                    # If nothing was selected, just return
232                    if path is None:
233                        self.disp_cb_dict[p].SetValue(False)
234                        return
235                   
236                    try:
237                        values,weights = self.read_file(path)
238                    except:
239                        msg="Could not read input file"
240                        wx.PostEvent(self.parent.parent, StatusEvent(status= msg))
241                        return
242                   
243                    # If any of the two arrays is empty, notify the user that we won't
244                    # proceed
245                    if values is None or weights is None:
246                        wx.PostEvent(self.parent.parent, StatusEvent(status=\
247                            "The loaded %s distrubtion is corrupted or empty" % p))
248                        return
249                       
250                    # Tell the user that we are about to apply the distribution
251                    wx.PostEvent(self.parent.parent, StatusEvent(status=\
252                            "Applying loaded %s distribution: %s" % (p, path))) 
253                   
254                    # Create the dispersion objects
255                    from sans.models.dispersion_models import ArrayDispersion
256                    disp_model = ArrayDispersion()
257                    disp_model.set_weights(values, weights)
258                    # Store the object to make it persist outside the scope of this method
259                    #TODO: refactor model to clean this up?
260                    self._disp_obj_dict[p] = disp_model
261                   
262                    # Set the new model as the dispersion object for the selected parameter
263                    self.model.set_dispersion(p, disp_model)
264                         
265                else:
266                    # The parameter was un-selected. Go back to Gaussian model (with 0 pts)
267                    self._reset_dispersity()
268                   
269                ## Redraw the model
270                self._draw_model()
271        return
272   
273    def onSave(self, event):
274        """
275            save history of the data and model
276        """
277        self.page_info.model= self.model
278        self.page_info.data = self.data
279        import os
280                 
281           
282        path = None
283        dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", "*.txt", wx.SAVE)
284        if dlg.ShowModal() == wx.ID_OK:
285            path = dlg.GetPath()
286            mypath = os.path.basename(path)
287           
288        dlg.Destroy()
289           
290        if not path == None:
291            out = open(path, 'w')
292            has_data = self.data !=None
293            has_model = self.model!=None
294            import time
295            year, month, day,hour,minute,second,tda,ty,tm_isdst= time.gmtime()
296            import os.path
297            out.write("Title: State for %s\n"%os.path.basename(path))
298            out.write("Date: %g\%g\%g \n"%(year, month, day))
299            out.write("GMT Time: %g:%g:%g \n\n"%(hour,minute, second))
300            # Sanity check
301            if has_data:
302                out.write("Fit Data name: %s\n\n"%self.data.name)
303   
304            if has_model:
305                out.write("Model name: %s\n"%self.model.name)
306                if len(self.parameters)>0: 
307                    out.write("Parameters Info:\n")
308                    msg= "Name\t\tValues\t\t+\-\tErrors\t\tMin\t\tMax\t\tUnits\t\tstate\n"
309                    out.write(msg)
310                    ##self.parameters=
311                    ##[cb state, name, value, "+/-", error of fit, min, max , units]
312                    for item in self.parameters:
313                        if item[1]!=None:
314                            name= item[1]
315                        else:
316                            name=""
317                        if item[2]!=None:
318                            value= str(item[2].GetValue().rstrip().lstrip())
319                        else:
320                            value=""
321                        if item[3]!=None:
322                            sign= str(item[3].GetLabelText().rstrip().lstrip())
323                        else:
324                            sign=""
325                        if item[4]!=None:
326                            error= str(item[4].GetValue().rstrip().lstrip())
327                        else:
328                            error=""
329                        if item[5]!=None:
330                            min= str(item[5].GetValue().rstrip().lstrip())
331                        else:
332                            min=""
333                        if item[6]!=None:
334                            max= str(item[6].GetValue().rstrip().lstrip())
335                        else:
336                            max=""
337                        if item[7]!=None:
338                            unit= str(item[7].GetLabelText().rstrip().lstrip())
339                        else:
340                            unit=""
341                        if item[0]!=None:
342                            if item[0].GetValue():
343                                state= "Fitted"
344                            else:
345                                state= "Not Fitted"
346                        else:
347                            state="Not Fitted"
348   
349                        msg= "%s\t\t%s\t\t%s\t%s\t\t%s\t\t%s\t\t%s\t\t%s\n"\
350                         %(name,value,sign,error,min,max,unit,state)
351                        out.write(msg)
352                       
353               
354            out.close()
355
356   
357   
358    def read_file(self, path):
359        """
360            Read two columns file
361            @param path: the path to the file to read
362        """
363        try:
364            if path==None:
365                wx.PostEvent(self.parent.parent, StatusEvent(status=\
366                            " Selected Distribution was not loaded: %s"%path))
367                return None, None
368            input_f = open(path, 'r')
369            buff = input_f.read()
370            lines = buff.split('\n')
371           
372            angles = []
373            weights=[]
374            for line in lines:
375                toks = line.split()
376                if len(toks)==2:
377                    try:
378                        angle = float(toks[0])
379                        weight = float(toks[1])
380                    except:
381                        # Skip non-data lines
382                        pass
383                    angles.append(angle)
384                    weights.append(weight)
385            return numpy.array(angles), numpy.array(weights)
386        except:
387            raise 
388     
389   
390    def _selectDlg(self):
391        """
392            open a dialog file to selected the customized dispersity
393        """
394        import os
395        dlg = wx.FileDialog(self, "Choose a weight file", os.getcwd(), "", "*.*", wx.OPEN)
396        path = None
397        if dlg.ShowModal() == wx.ID_OK:
398            path = dlg.GetPath()
399        dlg.Destroy()
400        return path
401         
402   
403    def _onparamEnter_helper(self):
404        """
405             check if values entered by the user are changed and valid to replot
406             model
407             use : _check_value_enter
408        """
409        if self.model !=None:
410            # Flag to register when a parameter has changed.
411            is_modified = False
412            is_modified =self._check_value_enter( self.fittable_param ,is_modified)
413            is_modified =self._check_value_enter( self.fixed_param ,is_modified)
414            is_modified =self._check_value_enter( self.parameters ,is_modified)       
415           
416            self.Layout()
417            # Here we should check whether the boundaries have been modified.
418            # If qmin and qmax have been modified, update qmin and qmax and
419            # set the is_modified flag to True
420            from sans.guiframe.utils import check_value
421            if check_value( self.qmin, self.qmax):
422                if float(self.qmin.GetValue()) != self.qmin_x:
423                    self.qmin_x = float(self.qmin.GetValue())
424                    is_modified = True
425                if float(self.qmax.GetValue()) != self.qmax_x:
426                    self.qmax_x = float(self.qmax.GetValue())
427                    is_modified = True
428                self.fitrange = True
429            else:
430                self.fitrange = False
431            if self.npts != None:
432                if float(self.npts.GetValue()) !=  self.num_points:
433                    self.num_points = float(self.npts.GetValue())
434                    is_modified = True
435            ## if any value is modify draw model with new value
436            if is_modified:
437                self._draw_model() 
438               
439               
440    def _set_model_sizer_selection(self, model):
441        """
442            Display the sizer according to the type of the current model
443        """
444        if hasattr(model ,"model2"):
445           
446            class_name= model.model2.__class__
447            name= model.model2.name
448            flag= name != "NoStructure"
449            if flag and (class_name in self.model_list_box["Structure Factors"]):
450                self.structurebox.Show(True)
451                self.text2.Show(True)
452                self.multip_cb.SetValue(True)
453                items = self.structurebox.GetItems()
454                self.sizer1.Layout()
455                self.SetScrollbars(20,20,200,100)
456                for i in range(len(items)):
457                    if items[i]== str(name):
458                        self.structurebox.SetSelection(i)
459                        break
460                   
461        if hasattr(model ,"model1"):
462            class_name = model.model1.__class__
463            name = model.model1.name
464            self.formfactorbox.Clear()
465           
466            for k, list in self.model_list_box.iteritems():
467                if k == "shapes":
468                    self.shape_rbutton.SetValue(True)
469                elif k == "Shape-independent":
470                    self.shape_indep_rbutton.SetValue(True)
471                elif k == "Structure Factors":
472                     self.struct_rbutton.SetValue(True)
473                else:
474                    self.plugin_rbutton.SetValue(True)
475                   
476                if class_name in list:
477                    ## fill the form factor list with new model
478                    self._populate_box(self.formfactorbox, list)
479                    items = self.formfactorbox.GetItems()
480                    ## set comboxbox to the selected item
481                    for i in range(len(items)):
482                        if items[i]== str(name):
483                            self.formfactorbox.SetSelection(i)
484                            break
485                    break
486        else:
487            ## Select the model from the combo box
488            class_name = model.__class__
489            name = model.name
490            self.formfactorbox.Clear()
491            items = self.formfactorbox.GetItems()
492            for k, list in self.model_list_box.iteritems():
493                if k == "shapes":
494                    self.shape_rbutton.SetValue(True)
495                elif k == "Shape-independent":
496                    self.shape_indep_rbutton.SetValue(True)
497                elif k == "Structure Factors":
498                     self.struct_rbutton.SetValue(True)
499                else:
500                    self.plugin_rbutton.SetValue(True)
501                if class_name in list:
502                ## fill the form factor list with new model
503                    self._populate_box(self.formfactorbox, list)
504                    items = self.formfactorbox.GetItems()
505                    ## set comboxbox to the selected item
506                    for i in range(len(items)):
507                        if items[i]== str(name):
508                            self.formfactorbox.SetSelection(i)
509                            break
510                    break
511                   
512       
513       
514    def _draw_model(self):
515        """
516            Method to draw or refresh a plotted model.
517            The method will use the data member from the model page
518            to build a call to the fitting perspective manager.
519           
520            [Note to coder: This way future changes will be done in only one place.]
521        """
522        if self.model !=None:
523            self.manager.draw_model(self.model, data=self.data,
524                                    qmin=float(self.qmin_x), qmax=float(self.qmax_x),
525                                    qstep= float(self.num_points),
526                                    enable2D=self.enable2D) 
527       
528    def _set_model_sizer(self, sizer, title="", object=None):
529        """
530            Use lists to fill a sizer for model info
531        """
532       
533        sizer.Clear(True)
534        box_description= wx.StaticBox(self, -1,str(title))
535        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
536        #--------------------------------------------------------
537        self.shape_rbutton = wx.RadioButton(self, -1, 'Shape', style=wx.RB_GROUP)
538        self.shape_indep_rbutton = wx.RadioButton(self, -1, "Shape Independent")
539        self.struct_rbutton = wx.RadioButton(self, -1, "Structure ")
540        self.plugin_rbutton = wx.RadioButton(self, -1, "customized Model")
541        self.multip_cb = wx.CheckBox(self, -1,"P(Q)*S(Q)")
542       
543       
544       
545        self.Bind( wx.EVT_RADIOBUTTON, self._show_combox,
546                            id= self.shape_rbutton.GetId() ) 
547        self.Bind( wx.EVT_RADIOBUTTON, self._show_combox,
548                            id= self.shape_indep_rbutton.GetId() ) 
549        self.Bind( wx.EVT_RADIOBUTTON, self._show_combox,
550                            id= self.struct_rbutton.GetId() ) 
551        self.Bind( wx.EVT_RADIOBUTTON, self._show_combox,
552                            id= self.plugin_rbutton.GetId() ) 
553        wx.EVT_CHECKBOX(self, self.multip_cb.GetId() , self._show_combox )             
554        ## store state
555        self.page_info.save_radiobox_state( self.shape_rbutton )
556        self.page_info.save_radiobox_state( self.shape_indep_rbutton )
557        self.page_info.save_radiobox_state( self.struct_rbutton )
558        self.page_info.save_radiobox_state( self.plugin_rbutton )
559       
560       
561        sizer_radiobutton = wx.GridSizer(3, 3,5, 5)
562        sizer_radiobutton.Add(self.shape_rbutton)
563        sizer_radiobutton.Add(self.shape_indep_rbutton)
564        sizer_radiobutton.Add(self.multip_cb)
565        sizer_radiobutton.Add(self.plugin_rbutton)
566        sizer_radiobutton.Add(self.struct_rbutton)
567       
568        sizer_selection = wx.BoxSizer(wx.HORIZONTAL)
569       
570        self.text1 = wx.StaticText( self,-1,"P(Q)" )
571        self.text2 = wx.StaticText( self,-1,"* S(Q)" )
572       
573        self.text2.Hide()
574       
575        self.formfactorbox = wx.ComboBox(self, -1,style=wx.CB_READONLY)
576        if self.model!=None:
577            self.formfactorbox.SetValue(self.model.name)
578           
579           
580        self.structurebox = wx.ComboBox(self, -1,style=wx.CB_READONLY)
581        wx.EVT_COMBOBOX(self.formfactorbox,-1, self._on_select_model)
582        wx.EVT_COMBOBOX(self.structurebox,-1, self._on_select_model)
583        self.structurebox.Hide()
584       
585        ## fill combox box
586        if len(self.model_list_box)>0:
587            self._populate_box( self.formfactorbox,self.model_list_box["shapes"])
588       
589        if len(self.model_list_box)>0:
590            self._populate_box( self.structurebox,
591                                self.model_list_box["Structure Factors"])
592       
593        ## check model type to show sizer
594        if self.model !=None:
595            self._set_model_sizer_selection( self.model )
596       
597        sizer_selection.Add(self.text1)
598        sizer_selection.Add((5,5))
599        sizer_selection.Add(self.formfactorbox)
600        sizer_selection.Add((5,5))
601        sizer_selection.Add(self.text2)
602        sizer_selection.Add((5,5))
603        sizer_selection.Add(self.structurebox)
604        sizer_selection.Add((5,5))
605       
606        boxsizer1.Add( sizer_radiobutton )
607        boxsizer1.Add( (20,20))
608        boxsizer1.Add( sizer_selection )
609        if object !=None:
610            boxsizer1.Add( (20,20))
611            boxsizer1.Add( object )
612        #--------------------------------------------------------
613        sizer.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
614        sizer.Layout()
615        self.SetScrollbars(20,20,200,100)
616       
617       
618    def _show_combox(self, event):
619        """
620            Show combox box associate with type of model selected
621        """
622        self.page_info.save_radiobox_state( self.shape_rbutton )
623        self.page_info.save_radiobox_state( self.shape_indep_rbutton )
624        self.page_info.save_radiobox_state( self.struct_rbutton )
625        self.page_info.save_radiobox_state( self.plugin_rbutton )
626       
627       
628       
629        if self.shape_rbutton.GetValue():
630            ##fill the comboxbox with form factor list
631            self.structurebox.Hide()
632            self.text2.Hide()
633            self.formfactorbox.Clear()
634            self._populate_box( self.formfactorbox,self.model_list_box["shapes"])
635           
636        if self.shape_indep_rbutton.GetValue():
637            ##fill the comboxbox with shape independent  factor list
638            self.structurebox.Hide()
639            self.text2.Hide()
640            self.formfactorbox.Clear()
641            self._populate_box( self.formfactorbox,
642                                self.model_list_box["Shape-independent"])
643           
644        if self.struct_rbutton.GetValue():
645            ##fill the comboxbox with structure factor list
646            self.structurebox.Hide()
647            self.text2.Hide()
648            self.formfactorbox.Clear()
649            self._populate_box( self.formfactorbox,
650                                self.model_list_box["Structure Factors"])
651           
652        if self.plugin_rbutton.GetValue():
653            ##fill the comboxbox with form factor list
654            self.structurebox.Hide()
655            self.text2.Hide()
656            self.formfactorbox.Clear()
657            self._populate_box( self.formfactorbox,
658                                self.model_list_box["Added models"])
659        if not self.multip_cb.GetValue(): 
660            model = self.formfactorbox.GetClientData(0)
661            self.model = model()
662           
663        else:
664            ## multplication not available for structure factor
665            if self.struct_rbutton.GetValue():
666                self.multip_cb.SetValue(False)
667                self.structurebox.Hide()
668                return
669            ##fill the comboxbox with form factor list
670            self.structurebox.Show(True)
671            self.text2.Show(True)
672            ## draw multplication  model
673            form_factor = self.formfactorbox.GetClientData(0)
674            struct_factor = self.structurebox.GetClientData(0)
675           
676            from sans.models.MultiplicationModel import MultiplicationModel
677            self.model= MultiplicationModel(form_factor(),struct_factor())
678
679        self.set_model_param_sizer(self.model)
680        self.sizer4_4.Clear()
681        self.sizer4.Layout()
682           
683        self._draw_model()
684        self.set_scroll()
685       
686       
687   
688           
689    def _populate_box(self, combobox, list):
690        """
691            fill combox box with dict item
692            @param list: contains item to fill the combox
693            item must model class
694        """
695        for models in list:
696            model= models()
697            name = model.__class__.__name__
698            if models.__name__!="NoStructure":
699                if hasattr(model, "name"):
700                    name = model.name
701                combobox.Append(name,models)
702        try:
703            combobox.SetSelection(0)
704           
705        except:
706            pass
707        wx.EVT_COMBOBOX(combobox,-1, self._on_select_model) 
708        return 0
709   
710   
711    def _on_select_model_helper(self): 
712        """
713             call back for model selection
714        """
715        f_id = self.formfactorbox.GetCurrentSelection()
716        s_id = self.structurebox.GetCurrentSelection()
717        form_factor = self.formfactorbox.GetClientData( f_id )
718        struct_factor = self.structurebox.GetClientData( s_id )
719       
720        if self.multip_cb.GetValue():
721            from sans.models.MultiplicationModel import MultiplicationModel
722            self.model= MultiplicationModel(form_factor(),struct_factor())
723           
724        else:
725            self.model= form_factor()
726       
727       
728    def _onparamEnter(self,event):
729        """
730            when enter value on panel redraw model according to changed
731        """
732        self._onparamEnter_helper()
733       
734       
735    def _check_value_enter(self, list, modified):
736        """
737            @param list: model parameter and panel info
738            each item of the list should be as follow:
739            item=[cb state, name, value, "+/-", error of fit, min, max , units]
740        """ 
741        is_modified =  modified
742        if len(list)==0:
743            return is_modified
744        for item in list:
745            try:
746                if hasattr(self,"text2_3"):
747                    self.text2_3.Hide()
748                if item[3]!=None:
749                    item[3].Hide()
750                if item[4]!=None:
751                    item[4].Clear()
752                    item[4].Hide()
753                name = str(item[1])
754                value= float(item[2].GetValue())
755                # If the value of the parameter has changed,
756                # update the model and set the is_modified flag
757                if value != self.model.getParam(name):
758                    self.model.setParam(name,value)
759                    is_modified = True   
760            except:
761                raise
762                #msg= "Model Drawing  Error:wrong value entered : %s"% sys.exc_value
763                #wx.PostEvent(self.parent.parent, StatusEvent(status = msg ))
764                #return
765       
766        return is_modified
767       
768       
769 
770    def _set_dipers_Param(self, event):
771        """
772            Add more item to select user dispersity
773        """
774        if self.model == None:
775            msg= " Select non - model value:%s !"%self.model
776            wx.PostEvent(self.parent.parent, StatusEvent(status= msg))
777            return 
778        else:
779            if self.enable_disp.GetValue():
780                self.model_disp.Show(True)
781                self.disp_box.Show(True)
782                ## layout for model containing no dispersity parameters
783                if len(self.disp_list)==0:
784                    self._layout_sizer_noDipers() 
785                else:
786                    ## set gaussian sizer
787                    self._set_sizer_gaussian() 
788            else:
789                self.model_disp.Hide()
790                self.disp_box.Hide()
791                self.sizer4_4.Clear(True)
792                self._reset_dispersity()
793                self._draw_model()
794           
795            self.sizer4.Layout()
796            self.Layout()
797            self.SetScrollbars(20,20,200,100)
798           
799       
800       
801    def _layout_sizer_noDipers(self):
802        """
803            Draw a sizer with no dispersity info
804        """
805        ix=0
806        iy=1
807        self.fittable_param=[]
808        self.fixed_param=[]
809        self.model_disp.Hide()
810        self.disp_box.Hide()
811        self.sizer4_4.Clear(True)
812        model_disp = wx.StaticText(self, -1, 'No PolyDispersity for this model')
813        self.sizer4_4.Add(model_disp,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
814        #self.sizer4_4.Layout()
815        self.sizer4.Layout()
816        self.SetScrollbars(20,20,200,100)
817        return 
818   
819    def _reset_gaussian_dispers(self):
820        """
821            reset model paramaters to gaussian
822            TO IMPLEMENT
823        """
824        return
825        if self.model==None:
826            return
827        from sans.models.dispersion_models import GaussianDispersion
828        list = self.model.dispersion.keys()
829       
830        for key in list:
831            ## The parameter was un-selected. Go back to Gaussian model (with 0 pts)
832            disp_model = GaussianDispersion()
833            ## Set the new model as the dispersion object for the selected parameter
834            self.model.set_dispersion(key,disp_model)
835            self._draw_model()
836           
837           
838    def _reset_dispersity(self):
839        """
840             put gaussian dispersity into current model
841        """
842        self.fittable_param=[]
843        self.fixed_param=[]
844        from sans.models.dispersion_models import GaussianDispersion
845        if len(self.disp_cb_dict)==0:
846            return 
847       
848        for p in self.disp_cb_dict:
849            # The parameter was un-selected. Go back to Gaussian model (with 0 pts)
850            disp_model = GaussianDispersion()
851            # Store the object to make it persist outside the scope of this method
852            #TODO: refactor model to clean this up?
853            self._disp_obj_dict[p] = disp_model
854           
855            # Set the new model as the dispersion object for the selected parameter
856            self.model.set_dispersion(p, disp_model)
857           
858            # Redraw the model
859           
860           
861           
862    def _on_select_Disp(self,event):
863        """
864             allow selecting different dispersion
865             self.disp_list should change type later .now only gaussian
866        """
867        dispersity  =event.GetClientData()
868        name= dispersity.__name__
869       
870        if name == "GaussianModel":
871            self._set_sizer_gaussian()
872           
873        if  name=="ArrayDispersion":
874            self._set_sizer_arraydispersion()
875           
876           
877           
878   
879    def _set_sizer_arraydispersion(self):
880        """
881            draw sizer with array dispersity  parameters
882        """
883        self.sizer4_4.Clear(True) 
884        ix=0
885        iy=1     
886        disp1 = wx.StaticText(self, -1, 'Array Dispersion')
887        self.sizer4_4.Add(disp1,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
888       
889        # Look for model parameters to which we can apply an ArrayDispersion model
890        # Add a check box for each parameter.
891        self.disp_cb_dict = {}
892        for p in self.model.dispersion.keys():
893            ix+=1 
894            self.disp_cb_dict[p] = wx.CheckBox(self, -1, p, (10, 10))
895           
896            wx.EVT_CHECKBOX(self, self.disp_cb_dict[p].GetId(), self.select_disp_angle)
897            self.sizer4_4.Add(self.disp_cb_dict[p], (iy, ix), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
898       
899        ix =0
900        iy +=1 
901        self.sizer4_4.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)       
902        self.sizer4_4.Layout()
903        self.sizer4.Layout()
904        self.SetScrollbars(20,20,200,100)
905       
906       
907    def _set_range_sizer(self, title, object1=None,object=None):
908        """
909            Fill the
910        """
911        self.sizer5.Clear(True)
912        box_description= wx.StaticBox(self, -1,str(title))
913        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
914        #--------------------------------------------------------------
915        self.qmin    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
916        self.qmin.SetValue(format_number(self.qmin_x))
917        self.qmin.SetToolTipString("Minimun value of Q in linear scale.")
918        self.qmin.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
919        self.qmin.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter)
920     
921        self.qmax    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
922        self.qmax.SetValue(format_number(self.qmax_x))
923        self.qmax.SetToolTipString("Maximum value of Q in linear scale.")
924        self.qmax.Bind(wx.EVT_KILL_FOCUS, self._onparamEnter)
925        self.qmax.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter)
926     
927        sizer_horizontal=wx.BoxSizer(wx.HORIZONTAL)
928        sizer= wx.GridSizer(3, 3,5, 5)
929       
930        sizer.Add((5,5))
931        sizer.Add(wx.StaticText(self, -1, 'Min'))
932        sizer.Add(wx.StaticText(self, -1, 'Max'))
933        sizer.Add(wx.StaticText(self, -1, 'Q range'))
934             
935        sizer.Add(self.qmin)
936        sizer.Add(self.qmax)
937        sizer_horizontal.Add(sizer)
938        if object!=None:
939            sizer_horizontal.Add(object)
940       
941        if object1!=None:
942           boxsizer1.Add(object1) 
943           boxsizer1.Add((10,10))
944        boxsizer1.Add(sizer_horizontal)
945       
946        #----------------------------------------------------------------
947        self.sizer5.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
948        self.sizer5.Layout()
949        self.SetScrollbars(20,20,200,100)
950   
951    def _fill_save_sizer(self):
952        """
953            Draw the layout for saving option
954        """
955        self.sizer6.Clear(True)
956        box_description= wx.StaticBox(self, -1,"Save Options")
957        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
958        sizer_save = wx.BoxSizer(wx.HORIZONTAL)
959       
960        self.btSave = wx.Button(self,wx.NewId(),'Save')
961        self.btSave.Bind(wx.EVT_BUTTON, self.onSave,id= self.btSave.GetId())
962        self.btSave.SetToolTipString("Save current state")
963         
964        sizer_save.Add((20,20),0, wx.LEFT|wx.RIGHT|wx.EXPAND,120)       
965        sizer_save.Add(self.btSave)     
966       
967        boxsizer1.Add(sizer_save)
968        self.sizer6.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
969        self.sizer6.Layout()
970        self.SetScrollbars(20,20,200,100)
971       
972       
973               
Note: See TracBrowser for help on using the repository browser.