source: sasview/sansview/perspectives/fitting/basepage.py @ 208de57

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

removing all codes.and add highlight for textcrtl

  • Property mode set to 100644
File size: 37.9 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    def onSetFocus(self, evt):
358        # Get a handle to the TextCtrl
359        widget = evt.GetEventObject()
360        # Select the whole control, after this event resolves
361        wx.CallAfter(widget.SetSelection, -1, -1)
362        return
363   
364    def read_file(self, path):
365        """
366            Read two columns file
367            @param path: the path to the file to read
368        """
369        try:
370            if path==None:
371                wx.PostEvent(self.parent.parent, StatusEvent(status=\
372                            " Selected Distribution was not loaded: %s"%path))
373                return None, None
374            input_f = open(path, 'r')
375            buff = input_f.read()
376            lines = buff.split('\n')
377           
378            angles = []
379            weights=[]
380            for line in lines:
381                toks = line.split()
382                if len(toks)==2:
383                    try:
384                        angle = float(toks[0])
385                        weight = float(toks[1])
386                    except:
387                        # Skip non-data lines
388                        pass
389                    angles.append(angle)
390                    weights.append(weight)
391            return numpy.array(angles), numpy.array(weights)
392        except:
393            raise 
394     
395   
396    def _selectDlg(self):
397        """
398            open a dialog file to selected the customized dispersity
399        """
400        import os
401        dlg = wx.FileDialog(self, "Choose a weight file", os.getcwd(), "", "*.*", wx.OPEN)
402        path = None
403        if dlg.ShowModal() == wx.ID_OK:
404            path = dlg.GetPath()
405        dlg.Destroy()
406        return path
407         
408   
409    def _onparamEnter_helper(self):
410        """
411             check if values entered by the user are changed and valid to replot
412             model
413             use : _check_value_enter
414        """
415        if self.model !=None:
416            # Flag to register when a parameter has changed.
417            is_modified = False
418            is_modified =self._check_value_enter( self.fittable_param ,is_modified)
419            is_modified =self._check_value_enter( self.fixed_param ,is_modified)
420            is_modified =self._check_value_enter( self.parameters ,is_modified)       
421           
422            self.Layout()
423            # Here we should check whether the boundaries have been modified.
424            # If qmin and qmax have been modified, update qmin and qmax and
425            # set the is_modified flag to True
426            from sans.guiframe.utils import check_value
427            if check_value( self.qmin, self.qmax):
428                if float(self.qmin.GetValue()) != self.qmin_x:
429                    self.qmin_x = float(self.qmin.GetValue())
430                    is_modified = True
431                if float(self.qmax.GetValue()) != self.qmax_x:
432                    self.qmax_x = float(self.qmax.GetValue())
433                    is_modified = True
434                self.fitrange = True
435            else:
436                self.fitrange = False
437            if self.npts != None:
438                if float(self.npts.GetValue()) !=  self.num_points:
439                    self.num_points = float(self.npts.GetValue())
440                    is_modified = True
441            ## if any value is modify draw model with new value
442            if is_modified:
443                self._draw_model() 
444               
445               
446    def _set_model_sizer_selection(self, model):
447        """
448            Display the sizer according to the type of the current model
449        """
450        if hasattr(model ,"model2"):
451           
452            class_name= model.model2.__class__
453            name= model.model2.name
454            flag= name != "NoStructure"
455            if flag and (class_name in self.model_list_box["Structure Factors"]):
456                self.structurebox.Show(True)
457                self.text2.Show(True)
458                self.multip_cb.SetValue(True)
459                items = self.structurebox.GetItems()
460                self.sizer1.Layout()
461                self.SetScrollbars(20,20,200,100)
462                for i in range(len(items)):
463                    if items[i]== str(name):
464                        self.structurebox.SetSelection(i)
465                        break
466                   
467        if hasattr(model ,"model1"):
468            class_name = model.model1.__class__
469            name = model.model1.name
470            self.formfactorbox.Clear()
471           
472            for k, list in self.model_list_box.iteritems():
473                if k == "shapes":
474                    self.shape_rbutton.SetValue(True)
475                elif k == "Shape-independent":
476                    self.shape_indep_rbutton.SetValue(True)
477                elif k == "Structure Factors":
478                     self.struct_rbutton.SetValue(True)
479                else:
480                    self.plugin_rbutton.SetValue(True)
481                   
482                if class_name in list:
483                    ## fill the form factor list with new model
484                    self._populate_box(self.formfactorbox, list)
485                    items = self.formfactorbox.GetItems()
486                    ## set comboxbox to the selected item
487                    for i in range(len(items)):
488                        if items[i]== str(name):
489                            self.formfactorbox.SetSelection(i)
490                            break
491                    break
492        else:
493            ## Select the model from the combo box
494            class_name = model.__class__
495            name = model.name
496            self.formfactorbox.Clear()
497            items = self.formfactorbox.GetItems()
498            for k, list in self.model_list_box.iteritems():
499                if k == "shapes":
500                    self.shape_rbutton.SetValue(True)
501                elif k == "Shape-independent":
502                    self.shape_indep_rbutton.SetValue(True)
503                elif k == "Structure Factors":
504                     self.struct_rbutton.SetValue(True)
505                else:
506                    self.plugin_rbutton.SetValue(True)
507                if class_name in list:
508                ## fill the form factor list with new model
509                    self._populate_box(self.formfactorbox, list)
510                    items = self.formfactorbox.GetItems()
511                    ## set comboxbox to the selected item
512                    for i in range(len(items)):
513                        if items[i]== str(name):
514                            self.formfactorbox.SetSelection(i)
515                            break
516                    break
517                   
518       
519       
520    def _draw_model(self):
521        """
522            Method to draw or refresh a plotted model.
523            The method will use the data member from the model page
524            to build a call to the fitting perspective manager.
525           
526            [Note to coder: This way future changes will be done in only one place.]
527        """
528        if self.model !=None:
529            self.manager.draw_model(self.model, data=self.data,
530                                    qmin=float(self.qmin_x), qmax=float(self.qmax_x),
531                                    qstep= float(self.num_points),
532                                    enable2D=self.enable2D) 
533       
534    def _set_model_sizer(self, sizer, title="", object=None):
535        """
536            Use lists to fill a sizer for model info
537        """
538       
539        sizer.Clear(True)
540        box_description= wx.StaticBox(self, -1,str(title))
541        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
542        #--------------------------------------------------------
543        self.shape_rbutton = wx.RadioButton(self, -1, 'Shape', style=wx.RB_GROUP)
544        self.shape_indep_rbutton = wx.RadioButton(self, -1, "Shape Independent")
545        self.struct_rbutton = wx.RadioButton(self, -1, "Structure ")
546        self.plugin_rbutton = wx.RadioButton(self, -1, "customized Model")
547        self.multip_cb = wx.CheckBox(self, -1,"P(Q)*S(Q)")
548       
549       
550       
551        self.Bind( wx.EVT_RADIOBUTTON, self._show_combox,
552                            id= self.shape_rbutton.GetId() ) 
553        self.Bind( wx.EVT_RADIOBUTTON, self._show_combox,
554                            id= self.shape_indep_rbutton.GetId() ) 
555        self.Bind( wx.EVT_RADIOBUTTON, self._show_combox,
556                            id= self.struct_rbutton.GetId() ) 
557        self.Bind( wx.EVT_RADIOBUTTON, self._show_combox,
558                            id= self.plugin_rbutton.GetId() ) 
559        wx.EVT_CHECKBOX(self, self.multip_cb.GetId() , self._show_combox )             
560        ## store state
561        self.page_info.save_radiobox_state( self.shape_rbutton )
562        self.page_info.save_radiobox_state( self.shape_indep_rbutton )
563        self.page_info.save_radiobox_state( self.struct_rbutton )
564        self.page_info.save_radiobox_state( self.plugin_rbutton )
565       
566       
567        sizer_radiobutton = wx.GridSizer(3, 3,5, 5)
568        sizer_radiobutton.Add(self.shape_rbutton)
569        sizer_radiobutton.Add(self.shape_indep_rbutton)
570        sizer_radiobutton.Add(self.multip_cb)
571        sizer_radiobutton.Add(self.plugin_rbutton)
572        sizer_radiobutton.Add(self.struct_rbutton)
573       
574        sizer_selection = wx.BoxSizer(wx.HORIZONTAL)
575       
576        self.text1 = wx.StaticText( self,-1,"P(Q)" )
577        self.text2 = wx.StaticText( self,-1,"* S(Q)" )
578       
579        self.text2.Hide()
580       
581        self.formfactorbox = wx.ComboBox(self, -1,style=wx.CB_READONLY)
582        if self.model!=None:
583            self.formfactorbox.SetValue(self.model.name)
584           
585           
586        self.structurebox = wx.ComboBox(self, -1,style=wx.CB_READONLY)
587        wx.EVT_COMBOBOX(self.formfactorbox,-1, self._on_select_model)
588        wx.EVT_COMBOBOX(self.structurebox,-1, self._on_select_model)
589        self.structurebox.Hide()
590       
591        ## fill combox box
592        if len(self.model_list_box)>0:
593            self._populate_box( self.formfactorbox,self.model_list_box["shapes"])
594       
595        if len(self.model_list_box)>0:
596            self._populate_box( self.structurebox,
597                                self.model_list_box["Structure Factors"])
598       
599        ## check model type to show sizer
600        if self.model !=None:
601            self._set_model_sizer_selection( self.model )
602       
603        sizer_selection.Add(self.text1)
604        sizer_selection.Add((5,5))
605        sizer_selection.Add(self.formfactorbox)
606        sizer_selection.Add((5,5))
607        sizer_selection.Add(self.text2)
608        sizer_selection.Add((5,5))
609        sizer_selection.Add(self.structurebox)
610        sizer_selection.Add((5,5))
611       
612        boxsizer1.Add( sizer_radiobutton )
613        boxsizer1.Add( (20,20))
614        boxsizer1.Add( sizer_selection )
615        if object !=None:
616            boxsizer1.Add( (20,20))
617            boxsizer1.Add( object )
618        #--------------------------------------------------------
619        sizer.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
620        sizer.Layout()
621        self.SetScrollbars(20,20,200,100)
622       
623       
624    def _show_combox(self, event):
625        """
626            Show combox box associate with type of model selected
627        """
628        self.page_info.save_radiobox_state( self.shape_rbutton )
629        self.page_info.save_radiobox_state( self.shape_indep_rbutton )
630        self.page_info.save_radiobox_state( self.struct_rbutton )
631        self.page_info.save_radiobox_state( self.plugin_rbutton )
632       
633       
634       
635        if self.shape_rbutton.GetValue():
636            ##fill the comboxbox with form factor list
637            self.structurebox.Hide()
638            self.text2.Hide()
639            self.formfactorbox.Clear()
640            self._populate_box( self.formfactorbox,self.model_list_box["shapes"])
641           
642        if self.shape_indep_rbutton.GetValue():
643            ##fill the comboxbox with shape independent  factor list
644            self.structurebox.Hide()
645            self.text2.Hide()
646            self.formfactorbox.Clear()
647            self._populate_box( self.formfactorbox,
648                                self.model_list_box["Shape-independent"])
649           
650        if self.struct_rbutton.GetValue():
651            ##fill the comboxbox with structure factor list
652            self.structurebox.Hide()
653            self.text2.Hide()
654            self.formfactorbox.Clear()
655            self._populate_box( self.formfactorbox,
656                                self.model_list_box["Structure Factors"])
657           
658        if self.plugin_rbutton.GetValue():
659            ##fill the comboxbox with form factor list
660            self.structurebox.Hide()
661            self.text2.Hide()
662            self.formfactorbox.Clear()
663            self._populate_box( self.formfactorbox,
664                                self.model_list_box["Added models"])
665        if not self.multip_cb.GetValue(): 
666            model = self.formfactorbox.GetClientData(0)
667            self.model = model()
668           
669        else:
670            ## multplication not available for structure factor
671            if self.struct_rbutton.GetValue():
672                self.multip_cb.SetValue(False)
673                self.structurebox.Hide()
674                return
675            ##fill the comboxbox with form factor list
676            self.structurebox.Show(True)
677            self.text2.Show(True)
678            ## draw multplication  model
679            form_factor = self.formfactorbox.GetClientData(0)
680            struct_factor = self.structurebox.GetClientData(0)
681           
682            from sans.models.MultiplicationModel import MultiplicationModel
683            self.model= MultiplicationModel(form_factor(),struct_factor())
684
685        self.set_model_param_sizer(self.model)
686        self.sizer4_4.Clear()
687        self.sizer4.Layout()
688           
689        self._draw_model()
690        self.set_scroll()
691       
692       
693   
694           
695    def _populate_box(self, combobox, list):
696        """
697            fill combox box with dict item
698            @param list: contains item to fill the combox
699            item must model class
700        """
701        for models in list:
702            model= models()
703            name = model.__class__.__name__
704            if models.__name__!="NoStructure":
705                if hasattr(model, "name"):
706                    name = model.name
707                combobox.Append(name,models)
708        try:
709            combobox.SetSelection(0)
710           
711        except:
712            pass
713        wx.EVT_COMBOBOX(combobox,-1, self._on_select_model) 
714        return 0
715   
716   
717    def _on_select_model_helper(self): 
718        """
719             call back for model selection
720        """
721        f_id = self.formfactorbox.GetCurrentSelection()
722        s_id = self.structurebox.GetCurrentSelection()
723        form_factor = self.formfactorbox.GetClientData( f_id )
724        struct_factor = self.structurebox.GetClientData( s_id )
725       
726        if self.multip_cb.GetValue():
727            from sans.models.MultiplicationModel import MultiplicationModel
728            self.model= MultiplicationModel(form_factor(),struct_factor())
729           
730        else:
731            self.model= form_factor()
732       
733       
734    def _onparamEnter(self,event):
735        """
736            when enter value on panel redraw model according to changed
737        """
738        self._onparamEnter_helper()
739       
740       
741    def _check_value_enter(self, list, modified):
742        """
743            @param list: model parameter and panel info
744            each item of the list should be as follow:
745            item=[cb state, name, value, "+/-", error of fit, min, max , units]
746        """ 
747        is_modified =  modified
748        if len(list)==0:
749            return is_modified
750        for item in list:
751            try:
752                if hasattr(self,"text2_3"):
753                    self.text2_3.Hide()
754                if item[3]!=None:
755                    item[3].Hide()
756                if item[4]!=None:
757                    item[4].Clear()
758                    item[4].Hide()
759                name = str(item[1])
760                value= float(item[2].GetValue())
761                # If the value of the parameter has changed,
762                # +update the model and set the is_modified flag
763                if value != self.model.getParam(name):
764                    self.model.setParam(name,value)
765                    is_modified = True   
766            except:
767                msg= "Model Drawing  Error:wrong value entered : %s"% sys.exc_value
768                wx.PostEvent(self.parent.parent, StatusEvent(status = msg ))
769                return 
770       
771        return is_modified
772       
773       
774 
775    def _set_dipers_Param(self, event):
776        """
777            Add more item to select user dispersity
778        """
779        if self.model == None:
780            msg= " Select non - model value:%s !"%self.model
781            wx.PostEvent(self.parent.parent, StatusEvent(status= msg))
782            return 
783        else:
784            if self.enable_disp.GetValue():
785                self.model_disp.Show(True)
786                self.disp_box.Show(True)
787                ## layout for model containing no dispersity parameters
788                if len(self.disp_list)==0:
789                    self._layout_sizer_noDipers() 
790                else:
791                    ## set gaussian sizer
792                    self._set_sizer_gaussian() 
793            else:
794                self.model_disp.Hide()
795                self.disp_box.Hide()
796                self.sizer4_4.Clear(True)
797                self._reset_dispersity()
798                self._draw_model()
799           
800            self.sizer4.Layout()
801            self.Layout()
802            self.SetScrollbars(20,20,200,100)
803           
804   
805       
806    def _layout_sizer_noDipers(self):
807        """
808            Draw a sizer with no dispersity info
809        """
810        ix=0
811        iy=1
812        self.fittable_param=[]
813        self.fixed_param=[]
814        self.model_disp.Hide()
815        self.disp_box.Hide()
816        self.sizer4_4.Clear(True)
817        model_disp = wx.StaticText(self, -1, 'No PolyDispersity for this model')
818        self.sizer4_4.Add(model_disp,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
819        #self.sizer4_4.Layout()
820        self.sizer4.Layout()
821        self.SetScrollbars(20,20,200,100)
822        return 
823   
824    def _reset_gaussian_dispers(self):
825        """
826            reset model paramaters to gaussian
827            TO IMPLEMENT
828        """
829        return
830        if self.model==None:
831            return
832        from sans.models.dispersion_models import GaussianDispersion
833        list = self.model.dispersion.keys()
834       
835        for key in list:
836            ## The parameter was un-selected. Go back to Gaussian model (with 0 pts)
837            disp_model = GaussianDispersion()
838            ## Set the new model as the dispersion object for the selected parameter
839            self.model.set_dispersion(key,disp_model)
840            self._draw_model()
841           
842           
843    def _reset_dispersity(self):
844        """
845             put gaussian dispersity into current model
846        """
847        self.fittable_param=[]
848        self.fixed_param=[]
849        from sans.models.dispersion_models import GaussianDispersion
850        if len(self.disp_cb_dict)==0:
851            return 
852       
853        for p in self.disp_cb_dict:
854            # The parameter was un-selected. Go back to Gaussian model (with 0 pts)
855            disp_model = GaussianDispersion()
856            # Store the object to make it persist outside the scope of this method
857            #TODO: refactor model to clean this up?
858            self._disp_obj_dict[p] = disp_model
859           
860            # Set the new model as the dispersion object for the selected parameter
861            self.model.set_dispersion(p, disp_model)
862           
863            # Redraw the model
864           
865           
866           
867    def _on_select_Disp(self,event):
868        """
869             allow selecting different dispersion
870             self.disp_list should change type later .now only gaussian
871        """
872        dispersity  =event.GetClientData()
873        name= dispersity.__name__
874       
875        if name == "GaussianModel":
876            self._set_sizer_gaussian()
877           
878        if  name=="ArrayDispersion":
879            self._set_sizer_arraydispersion()
880           
881           
882           
883   
884    def _set_sizer_arraydispersion(self):
885        """
886            draw sizer with array dispersity  parameters
887        """
888        self.sizer4_4.Clear(True) 
889        ix=0
890        iy=1     
891        disp1 = wx.StaticText(self, -1, 'Array Dispersion')
892        self.sizer4_4.Add(disp1,( iy, ix),(1,1),  wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
893       
894        # Look for model parameters to which we can apply an ArrayDispersion model
895        # Add a check box for each parameter.
896        self.disp_cb_dict = {}
897        for p in self.model.dispersion.keys():
898            ix+=1 
899            self.disp_cb_dict[p] = wx.CheckBox(self, -1, p, (10, 10))
900           
901            wx.EVT_CHECKBOX(self, self.disp_cb_dict[p].GetId(), self.select_disp_angle)
902            self.sizer4_4.Add(self.disp_cb_dict[p], (iy, ix), (1,1), wx.EXPAND|wx.ADJUST_MINSIZE, 0)
903       
904        ix =0
905        iy +=1 
906        self.sizer4_4.Add((20,20),(iy,ix),(1,1), wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)       
907        self.sizer4_4.Layout()
908        self.sizer4.Layout()
909        self.SetScrollbars(20,20,200,100)
910       
911       
912    def _set_range_sizer(self, title, object1=None,object=None):
913        """
914            Fill the
915        """
916        self.sizer5.Clear(True)
917        box_description= wx.StaticBox(self, -1,str(title))
918        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
919        #--------------------------------------------------------------
920        self.qmin    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
921        self.qmin.SetValue(format_number(self.qmin_x))
922        self.qmin.SetToolTipString("Minimun value of Q in linear scale.")
923        self.qmin.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
924        self.qmin.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter)
925     
926        self.qmax    = wx.TextCtrl(self, -1,size=(_BOX_WIDTH,20))
927        self.qmax.SetValue(format_number(self.qmax_x))
928        self.qmax.SetToolTipString("Maximum value of Q in linear scale.")
929        self.qmax.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
930        self.qmax.Bind(wx.EVT_TEXT_ENTER, self._onparamEnter)
931     
932        sizer_horizontal=wx.BoxSizer(wx.HORIZONTAL)
933        sizer= wx.GridSizer(3, 3,5, 5)
934       
935        sizer.Add((5,5))
936        sizer.Add(wx.StaticText(self, -1, 'Min'))
937        sizer.Add(wx.StaticText(self, -1, 'Max'))
938        sizer.Add(wx.StaticText(self, -1, 'Q range'))
939             
940        sizer.Add(self.qmin)
941        sizer.Add(self.qmax)
942        sizer_horizontal.Add(sizer)
943        if object!=None:
944            sizer_horizontal.Add(object)
945       
946        if object1!=None:
947           boxsizer1.Add(object1) 
948           boxsizer1.Add((10,10))
949        boxsizer1.Add(sizer_horizontal)
950       
951        #----------------------------------------------------------------
952        self.sizer5.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
953        self.sizer5.Layout()
954        self.SetScrollbars(20,20,200,100)
955   
956    def _fill_save_sizer(self):
957        """
958            Draw the layout for saving option
959        """
960        self.sizer6.Clear(True)
961        box_description= wx.StaticBox(self, -1,"Save Options")
962        boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
963        sizer_save = wx.BoxSizer(wx.HORIZONTAL)
964       
965        self.btSave = wx.Button(self,wx.NewId(),'Save')
966        self.btSave.Bind(wx.EVT_BUTTON, self.onSave,id= self.btSave.GetId())
967        self.btSave.SetToolTipString("Save current state")
968         
969        sizer_save.Add((20,20),0, wx.LEFT|wx.RIGHT|wx.EXPAND,120)       
970        sizer_save.Add(self.btSave)     
971       
972        boxsizer1.Add(sizer_save)
973        self.sizer6.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
974        self.sizer6.Layout()
975        self.SetScrollbars(20,20,200,100)
976       
977       
978               
Note: See TracBrowser for help on using the repository browser.