Changeset 2f4b430 in sasview for src/sas/perspectives/fitting/fitpage.py
- Timestamp:
- Mar 4, 2015 3:39:45 PM (9 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- 74f419d
- Parents:
- 2f732b0
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/perspectives/fitting/fitpage.py
r386ffe1 r2f4b430 32 32 FitPanel class contains fields allowing to display results when 33 33 fitting a model and one data 34 34 35 35 :note: For Fit to be performed the user should check at least one parameter 36 36 on fit Panel window. … … 42 42 """ 43 43 BasicPage.__init__(self, parent, color=color) 44 44 45 45 ## draw sizer 46 46 self._fill_data_sizer() … … 69 69 self.create_default_data() 70 70 #self._manager.frame.Bind(wx.EVT_SET_FOCUS, self.on_set_focus) 71 71 72 72 def enable_fit_button(self): 73 73 """ … … 76 76 flag = check_data_validity(self.data) & (self.model is not None) 77 77 self.btFit.Enable(flag) 78 78 79 79 def _fill_data_sizer(self): 80 80 """ … … 99 99 self.sizer0.Add(boxsizer1, 0, wx.EXPAND | wx.ALL, 10) 100 100 self.sizer0.Layout() 101 101 102 102 def enable_datasource(self): 103 103 """ … … 108 108 else: 109 109 self.dataSource.Enable() 110 110 111 111 def fill_data_combobox(self, data_list): 112 112 """ … … 143 143 if len(data_list) == 1: 144 144 self.dataSource.Disable() 145 145 146 146 def on_select_data(self, event=None): 147 147 """ … … 155 155 data = self.dataSource.GetClientData(pos) 156 156 self.set_data(data) 157 157 158 158 def _on_fit_complete(self): 159 159 """ … … 162 162 self.fit_started = False 163 163 self.set_fitbutton() 164 164 165 165 def _is_2D(self): 166 166 """ 167 167 Check if data_name is Data2D 168 168 169 169 :return: True or False 170 170 171 171 """ 172 172 if self.data.__class__.__name__ == "Data2D" or \ … … 174 174 return True 175 175 return False 176 176 177 177 def _on_engine_change(self, name): 178 178 """ … … 180 180 and update the panel accordingly 181 181 """ 182 182 183 183 self.engine_type = str(name) 184 184 self.state.engine_type = self.engine_type … … 189 189 self.Layout() 190 190 self.Refresh() 191 191 192 192 def _fill_range_sizer(self): 193 193 """ … … 196 196 """ 197 197 is_2Ddata = False 198 198 199 199 # Check if data is 2D 200 200 if self.data.__class__.__name__ == "Data2D" or \ 201 201 self.enable2D: 202 202 is_2Ddata = True 203 203 204 204 title = "Fitting" 205 205 #smear messages & titles … … 218 218 smear_message_slit_height_title = "Slit height[1/A]:" 219 219 smear_message_slit_width_title = "Slit width[1/A]:" 220 220 221 221 self._get_smear_info() 222 222 223 223 #Sizers 224 224 box_description_range = wx.StaticBox(self, -1, str(title)) … … 233 233 sizer_smearer_box = wx.StaticBoxSizer(smear_set_box, wx.HORIZONTAL) 234 234 sizer_smearer_box.SetMinSize((_DATA_BOX_WIDTH, 60)) 235 235 236 236 weighting_set_box = wx.StaticBox(self, -1, \ 237 237 'Set Weighting by Selecting dI Source') … … 268 268 self.dI_idata.Enable(False) 269 269 weighting_box.Add(sizer_weighting) 270 270 271 271 sizer_fit = wx.GridSizer(2, 4, 2, 6) 272 272 273 273 # combobox for smear2d accuracy selection 274 274 self.smear_accuracy = wx.ComboBox(self, -1, size=(50, -1), … … 279 279 self.smear_accuracy.SetToolTipString(\ 280 280 "'Higher' uses more Gaussian points for smearing computation.") 281 281 282 282 wx.EVT_COMBOBOX(self.smear_accuracy, -1, self._on_select_accuracy) 283 283 … … 287 287 self.btFit.Bind(wx.EVT_BUTTON, self._onFit, id=self.btFit.GetId()) 288 288 self.btFit.SetToolTipString("Start fitting.") 289 289 290 290 #textcntrl for custom resolution 291 291 self.smear_pinhole_max = self.ModelTextCtrl(self, -1, … … 343 343 id=self.slit_smearer.GetId()) 344 344 self.disable_smearer.SetValue(True) 345 345 346 346 # add 4 types of smearing to the sizer 347 347 sizer_smearer.Add(self.disable_smearer, 0, wx.LEFT, 10) … … 353 353 sizer_smearer.Add(self.slit_smearer) 354 354 sizer_smearer.Add((10, 10)) 355 355 356 356 # StaticText for chi2, N(for fitting), Npts + Log/linear spacing 357 357 self.tcChi = BGTextCtrl(self, -1, "-", size=(75, 20), style=0) … … 367 367 self.Npts_total.SetToolTipString(\ 368 368 " Total Npts : total number of data points") 369 369 370 370 # Update and Draw button 371 371 self.draw_button = wx.Button(self, wx.NewId(), … … 374 374 self._onDraw, id=self.draw_button.GetId()) 375 375 self.draw_button.SetToolTipString("Compute and Draw.") 376 377 self.points_sizer = wx.BoxSizer(wx.HORIZONTAL) 376 377 self.points_sizer = wx.BoxSizer(wx.HORIZONTAL) 378 378 self.pointsbox = wx.CheckBox(self, -1, 'Log?', (10, 10)) 379 379 self.pointsbox.SetValue(False) 380 380 self.pointsbox.SetToolTipString("Check mark to use log spaced points") 381 381 wx.EVT_CHECKBOX(self, self.pointsbox.GetId(), self.select_log) 382 382 383 383 self.points_sizer.Add(wx.StaticText(self, -1, 'Npts ')) 384 384 self.points_sizer.Add(self.pointsbox) … … 389 389 #box_description_3.SetToolTipString( \ 390 390 # " Total Npts : total number of data points") 391 391 392 392 sizer_fit.Add(box_description_1, 0, 0) 393 393 sizer_fit.Add(box_description_2, 0, 0) … … 404 404 smear_message_none, style=wx.ALIGN_LEFT) 405 405 self.smear_description_dqdata = wx.StaticText(self, 406 - 1, smear_message_dqdata, style=wx.ALIGN_LEFT)406 - 1, smear_message_dqdata, style=wx.ALIGN_LEFT) 407 407 self.smear_description_type = wx.StaticText(self, 408 - 1, "Type:", style=wx.ALIGN_LEFT)408 - 1, "Type:", style=wx.ALIGN_LEFT) 409 409 self.smear_description_accuracy_type = wx.StaticText(self, -1, 410 410 "Accuracy:", style=wx.ALIGN_LEFT) … … 435 435 self.smear_description_slit_width = wx.StaticText(self, -1, 436 436 smear_message_slit_width_title, style=wx.ALIGN_LEFT) 437 437 438 438 #arrange sizers 439 439 self.sizer_set_smearer.Add(sizer_smearer) … … 468 468 self.sizer_new_smear.Add((20, -1)) 469 469 self.sizer_new_smear.Add(self.smear_description_2d_y, 470 0, wx.CENTER, 10 470 0, wx.CENTER, 10) 471 471 self.sizer_new_smear.Add(self.smear_description_pin_max, 472 0, wx.CENTER, 10 472 0, wx.CENTER, 10) 473 473 self.sizer_new_smear.Add(self.smear_description_slit_width, 474 0, wx.CENTER, 10 474 0, wx.CENTER, 10) 475 475 476 476 self.sizer_new_smear.Add(self.smear_pinhole_max, 0, wx.CENTER, 10) 477 477 self.sizer_new_smear.Add(self.smear_slit_width, 0, wx.CENTER, 10) 478 478 self.sizer_new_smear.Add(self.smear_data_right, 0, wx.CENTER, 10) 479 479 480 480 self.sizer_set_smearer.Add(self.smear_message_new_s, 0, wx.CENTER, 10) 481 481 self.sizer_set_smearer.Add(self.smear_message_new_p, 0, wx.CENTER, 10) 482 482 self.sizer_set_smearer.Add((5, 2)) 483 483 self.sizer_set_smearer.Add(self.sizer_new_smear, 0, wx.CENTER, 10) 484 484 485 485 # add all to chi2 sizer 486 486 sizer_smearer_box.Add(self.sizer_set_smearer) … … 489 489 sizer_chi2.Add(weighting_box) 490 490 sizer_chi2.Add((-1, 5)) 491 491 492 492 # hide all smear messages and textctrl 493 493 self._hide_all_smear_info() 494 494 495 495 # get smear_selection 496 496 self.current_smearer = smear_selection(self.data, self.model) … … 513 513 #2D data? default 514 514 is_2Ddata = False 515 515 516 516 #check if it is 2D data 517 517 if self.data.__class__.__name__ == "Data2D" or self.enable2D: 518 518 is_2Ddata = True 519 519 520 520 self.sizer5.Clear(True) 521 521 522 522 self.qmin = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH, 20), 523 523 style=wx.TE_PROCESS_ENTER, … … 530 530 qmin_tip += q_tip 531 531 self.qmin.SetToolTipString(qmin_tip) 532 532 533 533 self.qmax = self.ModelTextCtrl(self, -1, size=(_BOX_WIDTH, 20), 534 534 style=wx.TE_PROCESS_ENTER, … … 548 548 id = wx.NewId() 549 549 self.reset_qrange = wx.Button(self, id, 'Reset', size=(77, 20)) 550 550 551 551 self.reset_qrange.Bind(wx.EVT_BUTTON, self.on_reset_clicked, id=id) 552 552 self.reset_qrange.SetToolTipString("Reset Q range to the default") 553 553 554 554 sizer = wx.GridSizer(2, 4, 2, 6) 555 555 … … 559 559 self.btEditMask.SetToolTipString("Edit Mask.") 560 560 self.EditMask_title = wx.StaticText(self, -1, ' Masking(2D)') 561 561 562 562 sizer.Add(wx.StaticText(self, -1, ' Q range')) 563 563 sizer.Add(wx.StaticText(self, -1, ' Min[1/A]')) … … 572 572 boxsizer_range.Add((10, 10)) 573 573 boxsizer_range.Add(sizer) 574 574 575 575 boxsizer_range.Add((10, 15)) 576 576 boxsizer_range.Add(sizer_fit) … … 586 586 self.sizer5.Layout() 587 587 588 588 589 589 def _set_sizer_dispersion(self): 590 590 """ … … 602 602 ## the user didn't select dispersity display 603 603 return 604 604 605 605 self._reset_dispersity() 606 606 607 607 ## fill a sizer with the combobox to select dispersion type 608 608 model_disp = wx.StaticText(self, -1, 'Function') … … 632 632 self.sizer4_4.Add(self.text_disp_1, (iy, ix), (1, 1), \ 633 633 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 634 634 635 635 ix += 1 636 636 self.text_disp_min = wx.StaticText(self, -1, 'Min') … … 642 642 self.sizer4_4.Add(self.text_disp_max, (iy, ix), (1, 1), 643 643 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 644 644 645 645 ix += 1 646 646 npts = wx.StaticText(self, -1, 'Npts') … … 660 660 self.sizer4_4.Add(model_disp, (iy, ix), (1, 1), 661 661 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 662 662 663 663 self.text_disp_max.Show(True) 664 664 self.text_disp_min.Show(True) … … 680 680 iy += 1 681 681 for p in self.model.dispersion[item].keys(): 682 682 683 683 if p == "width": 684 684 ix = 0 … … 713 713 size=(_BOX_WIDTH / 1.3, 20), 714 714 style=0) 715 715 716 716 self.sizer4_4.Add(ctl2, (iy, ix), (1, 1), 717 717 wx.EXPAND | wx.ADJUST_MINSIZE, 0) … … 724 724 style=wx.TE_PROCESS_ENTER, 725 725 text_enter_callback=self._onparamRangeEnter) 726 726 727 727 self.sizer4_4.Add(ctl3, (iy, ix), (1, 1), 728 728 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 729 729 730 730 ix = 5 731 731 ctl4 = self.ModelTextCtrl(self, -1, … … 733 733 style=wx.TE_PROCESS_ENTER, 734 734 text_enter_callback=self._onparamRangeEnter) 735 735 736 736 self.sizer4_4.Add(ctl4, (iy, ix), (1, 1), 737 737 wx.EXPAND | wx.ADJUST_MINSIZE, 0) … … 739 739 ctl3.Show(True) 740 740 ctl4.Show(True) 741 741 742 742 elif p == "npts": 743 743 ix = 6 … … 746 746 size=(_BOX_WIDTH / 2.2, 20), 747 747 style=wx.TE_PROCESS_ENTER) 748 748 749 749 Tctl.SetValue(str(format_number(value))) 750 750 self.sizer4_4.Add(Tctl, (iy, ix), (1, 1), … … 758 758 size=(_BOX_WIDTH / 2.2, 20), 759 759 style=wx.TE_PROCESS_ENTER) 760 760 761 761 Tct2.SetValue(str(format_number(value))) 762 762 self.sizer4_4.Add(Tct2, (iy, ix), (1, 1), … … 777 777 self.fittable_param.append([cb, name1, ctl1, text2, 778 778 ctl2, ctl3, ctl4, disp_box]) 779 779 780 780 ix = 0 781 781 iy += 1 … … 794 794 name2 = item + ".npts" 795 795 name3 = item + ".nsigmas" 796 796 797 797 if not name1 in self.model.details: 798 798 self.model.details[name1] = ["", None, None] 799 799 800 800 iy += 1 801 801 for p in self.model.dispersion[item].keys(): 802 802 803 803 if p == "width": 804 804 ix = 0 … … 832 832 poly_text += "It is the STD (ratio*mean)" 833 833 poly_text += " of the distribution.\n " 834 834 835 835 values.SetToolTipString(poly_text) 836 836 first_orient = False … … 838 838 elif ctl1.IsShown(): 839 839 ctl1.Hide() 840 840 841 841 self.sizer4_4.Add(ctl1, (iy, ix), (1, 1), wx.EXPAND) 842 842 ## text to show error sign … … 852 852 size=(_BOX_WIDTH / 1.3, 20), 853 853 style=0) 854 854 855 855 self.sizer4_4.Add(ctl2, (iy, ix), (1, 1), 856 856 wx.EXPAND | wx.ADJUST_MINSIZE, 0) … … 862 862 text2.Show(True) 863 863 ctl2.Show(True) 864 864 865 865 ix = 4 866 866 ctl3 = self.ModelTextCtrl(self, -1, … … 873 873 874 874 ctl3.Hide() 875 875 876 876 ix = 5 877 877 ctl4 = self.ModelTextCtrl(self, -1, … … 882 882 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 883 883 ctl4.Hide() 884 884 885 885 if self.data.__class__.__name__ == "Data2D" or \ 886 886 self.enable2D: 887 887 ctl3.Show(True) 888 888 ctl4.Show(True) 889 889 890 890 elif p == "npts": 891 891 ix = 6 … … 894 894 size=(_BOX_WIDTH / 2.2, 20), 895 895 style=wx.TE_PROCESS_ENTER) 896 896 897 897 Tctl.SetValue(str(format_number(value))) 898 898 if self.data.__class__.__name__ == "Data2D" or \ … … 914 914 size=(_BOX_WIDTH / 2.2, 20), 915 915 style=wx.TE_PROCESS_ENTER) 916 916 917 917 Tct2.SetValue(str(format_number(value))) 918 918 if self.data.__class__.__name__ == "Data2D" or \ … … 926 926 self.fixed_param.append([None, name3, Tct2, 927 927 None, None, None, None, None]) 928 928 929 929 self.orientation_params_disp.append([None, name3, 930 930 Tct2, None, None, None, None, None]) … … 943 943 self.orientation_params_disp.append([cb, name1, ctl1, 944 944 text2, ctl2, ctl3, ctl4, disp_box]) 945 945 946 946 if self.data.__class__.__name__ == "Data2D" or \ 947 947 self.enable2D: … … 949 949 else: 950 950 disp_box.Hide() 951 951 952 952 self.state.disp_cb_dict = copy.deepcopy(self.disp_cb_dict) 953 953 954 954 self.state.model = self.model.clone() 955 955 ## save state into … … 984 984 """ 985 985 flag = self._update_paramv_on_fit() 986 986 987 987 wx.CallAfter(self._onparamEnter_helper) 988 988 if not flag: … … 990 990 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 991 991 return 992 992 993 993 def _onFit(self, event): 994 994 """ … … 1015 1015 StatusEvent(status="Fit: %s" % msg, type="stop")) 1016 1016 return 1017 1017 1018 1018 if len(self.param_toFit) <= 0: 1019 1019 msg = "Select at least one parameter to fit" … … 1022 1022 StatusEvent(status=msg, type="stop")) 1023 1023 return 1024 1024 1025 1025 flag = self._update_paramv_on_fit() 1026 1026 1027 1027 if self.batch_on and not self._is_2D(): 1028 1028 if not self._validate_Npts_1D(): 1029 1029 return 1030 1030 1031 1031 if not flag: 1032 1032 msg = "Fitting range or parameters are invalid" … … 1034 1034 StatusEvent(status=msg, type="stop")) 1035 1035 return 1036 1036 1037 1037 self.select_param(event=None) 1038 1038 … … 1050 1050 self.fit_started = self._manager.onFit(uid=self.uid) 1051 1051 wx.CallAfter(self.set_fitbutton) 1052 1052 1053 1053 def set_fitbutton(self): 1054 1054 """ … … 1059 1059 if self.is_mac: 1060 1060 return 1061 1061 1062 1062 if self.fit_started: 1063 1063 label = "Stop" … … 1070 1070 self.btFit.SetForegroundColour(color) 1071 1071 self.btFit.Enable(True) 1072 1072 1073 1073 def get_weight_flag(self): 1074 1074 """ … … 1092 1092 break 1093 1093 return flag 1094 1094 1095 1095 def _StopFit(self, event=None): 1096 1096 """ … … 1102 1102 self._manager._reset_schedule_problem(value=0) 1103 1103 self._on_fit_complete() 1104 1104 1105 1105 def rename_model(self): 1106 1106 """ … … 1109 1109 if self.model is not None: 1110 1110 self.model.name = "M" + str(self.index_model) 1111 1111 1112 1112 def _on_select_model(self, event=None): 1113 1113 """ … … 1141 1141 self.state.pinhole_smearer = self.pinhole_smearer.GetValue() 1142 1142 self.state.slit_smearer = self.slit_smearer.GetValue() 1143 1143 1144 1144 self.state.structurecombobox = self.structurebox.GetLabel() 1145 1145 self.state.formfactorcombobox = self.formfactorbox.GetLabel() … … 1161 1161 self.disable_smearer.SetValue(True) 1162 1162 self.enable_smearer.SetValue(False) 1163 1163 1164 1164 # more disables for 2D 1165 1165 self._set_smear_buttons() 1166 1166 1167 1167 try: 1168 1168 # update smearer sizer … … 1180 1180 ## event to post model to fit to fitting plugins 1181 1181 (ModelEventbox, EVT_MODEL_BOX) = wx.lib.newevent.NewEvent() 1182 1182 1183 1183 ## set smearing value whether or not 1184 1184 # the data contain the smearing info … … 1190 1190 caption=self.window_caption, 1191 1191 qmax=float(self.qmax_x)) 1192 1192 1193 1193 self._manager._on_model_panel(evt=evt) 1194 self.mbox_description.SetLabel("Model [ %s ]" % str(self.model.name))1194 self.mbox_description.SetLabel("Model [ %s ]" % str(self.model.name)) 1195 1195 self.mbox_description.SetForegroundColour(wx.BLUE) 1196 1196 self.state.model = self.model.clone() … … 1225 1225 self.get_paste_params(copy_flag) 1226 1226 wx.CallAfter(self._onDraw, None) 1227 1227 1228 1228 else: 1229 1229 self._draw_model() 1230 1230 1231 1231 if self.batch_on: 1232 1232 self.slit_smearer.Enable(False) … … 1234 1234 self.btEditMask.Disable() 1235 1235 self.EditMask_title.Disable() 1236 1236 1237 1237 self.Show(True) 1238 1238 self.SetupScrolling() 1239 1239 1240 1240 def _onparamEnter(self, event): 1241 1241 """ … … 1282 1282 if flag: 1283 1283 #self.compute_chisqr(smearer= temp_smearer) 1284 1284 1285 1285 ## new state posted 1286 1286 if self.state_change: … … 1297 1297 msg = "Cannot Plot :Must enter a number!!! " 1298 1298 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 1299 1299 1300 1300 self.save_current_state() 1301 1301 return 1302 1302 1303 1303 def _onparamRangeEnter(self, event): 1304 1304 """ … … 1323 1323 else: 1324 1324 tcrtl.SetBackgroundColour(wx.WHITE) 1325 1325 1326 1326 #self._undo.Enable(True) 1327 1327 self.save_current_state() … … 1329 1329 wx.PostEvent(self.parent, event) 1330 1330 self.state_change = False 1331 1332 def qrang_set_focus(self, event=None): 1331 1332 def qrang_set_focus(self, event=None): 1333 1333 """ 1334 1334 ON Qrange focus … … 1338 1338 #tcrtl = event.GetEventObject() 1339 1339 self._validate_qrange(self.qmin, self.qmax) 1340 1340 1341 1341 def qrange_click(self, event): 1342 1342 """ … … 1352 1352 d_group_id = self.data.group_id 1353 1353 act_ctrl = event.GetEventObject() 1354 wx.PostEvent(self._manager.parent, 1355 PlotQrangeEvent(ctrl=[self.qmin, self.qmax], id=d_id, 1354 wx.PostEvent(self._manager.parent, 1355 PlotQrangeEvent(ctrl=[self.qmin, self.qmax], id=d_id, 1356 1356 group_id=d_group_id, leftdown=is_click, 1357 1357 active=act_ctrl)) 1358 1358 1359 1359 def on_qrange_text(self, event): 1360 1360 """ … … 1368 1368 d_id = self.data.id 1369 1369 d_group_id = self.data.group_id 1370 wx.PostEvent(self._manager.parent, 1371 PlotQrangeEvent(ctrl=[self.qmin, self.qmax], id=d_id, 1372 group_id=d_group_id, leftdown=False, 1370 wx.PostEvent(self._manager.parent, 1371 PlotQrangeEvent(ctrl=[self.qmin, self.qmax], id=d_id, 1372 group_id=d_group_id, leftdown=False, 1373 1373 active=act_ctrl)) 1374 1374 self._validate_qrange(self.qmin, self.qmax) 1375 1376 def on_key(self, event): 1375 1376 def on_key(self, event): 1377 1377 """ 1378 1378 On Key down … … 1385 1385 x_data = float(ctrl.GetValue()) 1386 1386 except: 1387 return 1387 return 1388 1388 key = event.GetKeyCode() 1389 1389 length = len(self.data.x) … … 1402 1402 ctrl.SetValue(str(self.data.x[indx])) 1403 1403 self._validate_qrange(self.qmin, self.qmax) 1404 1404 1405 1405 def _onQrangeEnter(self, event): 1406 1406 """ … … 1463 1463 (self.data.x <= self.qmax_x)) 1464 1464 self.Npts_fit.SetValue(str(len(self.data.x[index_data]))) 1465 1465 1466 1466 self.npts_x = self.Npts_total.GetValue() 1467 1467 self.create_default_data() … … 1471 1471 msg = "Model Error:wrong value entered!!!" 1472 1472 wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 1473 1473 1474 1474 self._draw_model() 1475 1475 self.save_current_state() … … 1478 1478 self.state_change = False 1479 1479 return 1480 1480 1481 1481 def _clear_Err_on_Fit(self): 1482 1482 """ … … 1508 1508 if item[4] != None and item[4].IsShown(): 1509 1509 item[4].Hide() 1510 1510 1511 1511 if len(self.fittable_param) > 0: 1512 1512 for item in self.fittable_param: … … 1528 1528 item[4].Hide() 1529 1529 return 1530 1530 1531 1531 def _get_defult_custom_smear(self): 1532 1532 """ … … 1542 1542 if self.dx_max == None: 1543 1543 self.dx_max = SMEAR_SIZE_H 1544 1544 1545 1545 def _get_smear_info(self): 1546 1546 """ 1547 1547 Get the smear info from data. 1548 1548 1549 1549 :return: self.smear_type, self.dq_l and self.dq_r, 1550 1550 respectively the type of the smear, dq_min and … … 1577 1577 self.dq_l = data.dx[0] 1578 1578 self.dq_r = data.dx[-1] 1579 1579 1580 1580 # check if it is slit smear and get min max if it is. 1581 1581 elif data.dxl != None or data.dxw != None: … … 1586 1586 self.dq_r = data.dxw[0] 1587 1587 #return self.smear_type,self.dq_l,self.dq_r 1588 1588 1589 1589 def _show_smear_sizer(self): 1590 1590 """ … … 1650 1650 self.smear_description_2d_y.Hide() 1651 1651 self.smear_description_2d.Hide() 1652 1652 1653 1653 self.smear_accuracy.Hide() 1654 1654 self.smear_data_left.Hide() … … 1664 1664 self.smear_message_new_p.Hide() 1665 1665 self.smear_message_new_s.Hide() 1666 1666 1667 1667 def _set_accuracy_list(self): 1668 1668 """ … … 1674 1674 for idx in range(len(list)): 1675 1675 self.smear_accuracy.Append(list[idx], idx) 1676 1676 1677 1677 def _set_fun_box_list(self, fun_box): 1678 1678 """ … … 1695 1695 break 1696 1696 ind += 1 1697 1697 1698 1698 def _on_select_accuracy(self, event): 1699 1699 """ … … 1710 1710 if self.current_smearer != None: 1711 1711 self.current_smearer.set_accuracy(accuracy=\ 1712 self.smear2d_accuracy) 1712 self.smear2d_accuracy) 1713 1713 event.Skip() 1714 1714 … … 1735 1735 # get ready for new event 1736 1736 event.Skip() 1737 1737 1738 1738 def _onMask(self, event): 1739 1739 """ … … 1742 1742 from sas.guiframe.local_perspectives.plotting.masking \ 1743 1743 import MaskPanel as MaskDialog 1744 1744 1745 1745 self.panel = MaskDialog(base=self, data=self.data, id=wx.NewId()) 1746 1746 self.panel.ShowModal() 1747 1747 1748 1748 def _draw_masked_model(self, event): 1749 1749 """ … … 1797 1797 """ 1798 1798 return self.enable2D 1799 1799 1800 1800 def compute_data_set_range(self, data_list): 1801 1801 """ … … 1810 1810 self.npts_data_set += npts 1811 1811 return self.qmin_data_set, self.qmax_data_set, self.npts_data_set 1812 1812 1813 1813 def compute_data_range(self, data): 1814 1814 """ … … 1826 1826 npts = len(data.x) 1827 1827 except: 1828 msg = "Unable to find min/max/length of \n data named %s" % \1829 data.filename 1828 msg = "Unable to find min/max/length of \n data named %s" % \ 1829 data.filename 1830 1830 wx.PostEvent(self._manager.parent, StatusEvent(status=msg, 1831 1831 info="error")) 1832 1832 raise ValueError, msg 1833 1833 1834 1834 else: 1835 1835 qmin = 0 … … 1838 1838 y = max(math.fabs(data.ymin), math.fabs(data.ymax)) 1839 1839 except: 1840 msg = "Unable to find min/max of \n data named %s" % \1841 data.filename 1840 msg = "Unable to find min/max of \n data named %s" % \ 1841 data.filename 1842 1842 wx.PostEvent(self._manager.parent, StatusEvent(status=msg, 1843 1843 info="error")) … … 1847 1847 npts = len(data.data) 1848 1848 return qmin, qmax, npts 1849 1849 1850 1850 def set_data(self, data): 1851 1851 """ … … 1874 1874 self.graph_id = data.group_id 1875 1875 self.data.group_id = self.graph_id 1876 1876 1877 1877 if self.data is None: 1878 1878 data_name = "" … … 1884 1884 self._set_bookmark_flag(not self.batch_on) 1885 1885 self._keep.Enable(not self.batch_on) 1886 if self.data.is_data: 1886 if self.data.is_data: 1887 1887 self._set_save_flag(True) 1888 1888 self._set_preview_flag(True) … … 1922 1922 self.dI_sqrdata.Enable(True) 1923 1923 self.dI_idata.Enable(True) 1924 1924 1925 1925 self.formfactorbox.Enable() 1926 1926 self.structurebox.Enable() … … 1934 1934 self.btEditMask.Enable() 1935 1935 self.EditMask_title.Enable() 1936 1936 1937 1937 self.Npts_total.SetValue(str(npts)) 1938 1938 #default:number of data points selected to fit … … 1941 1941 self.Npts_total.SetBackgroundColour(\ 1942 1942 self.GetParent().GetBackgroundColour()) 1943 1943 1944 1944 self.Npts_total.Bind(wx.EVT_MOUSE_EVENTS, self._npts_click) 1945 1945 self.pointsbox.Disable() … … 1952 1952 if check_data_validity(data): 1953 1953 self.data_box_description.SetForegroundColour(wx.BLUE) 1954 1954 1955 1955 if self.batch_on: 1956 1956 self.slit_smearer.Enable(False) … … 1988 1988 title=str(self.data.title))) 1989 1989 self._draw_model() 1990 1990 1991 1991 def _npts_click(self, event): 1992 1992 """ … … 1995 1995 """ 1996 1996 pass 1997 1997 1998 1998 def reset_page(self, state, first=False): 1999 1999 """ … … 2002 2002 try: 2003 2003 self.reset_page_helper(state) 2004 2004 2005 2005 self.select_param(event=None) 2006 2006 #Save state_fit … … 2010 2010 msg = "Error: This model state has missing or outdated " 2011 2011 msg += "information.\n" 2012 msg += "%s" % (sys.exc_value)2012 msg += "%s" % (sys.exc_value) 2013 2013 wx.PostEvent(self._manager.parent, 2014 2014 StatusEvent(status=msg, info="error")) 2015 2015 self._lay_out() 2016 2016 self.Refresh() 2017 2017 2018 2018 def get_range(self): 2019 2019 """ … … 2021 2021 """ 2022 2022 return float(self.qmin_x), float(self.qmax_x) 2023 2023 2024 2024 def get_npts2fit(self): 2025 2025 """ 2026 2026 return numbers of data points within qrange 2027 2027 2028 2028 :Note: This is to normalize chisq by Npts of fit 2029 2029 2030 2030 """ 2031 2031 if self.data is None: … … 2052 2052 """ 2053 2053 self.Npts_fit.SetValue(str(self.get_npts2fit())) 2054 2054 2055 2055 def get_chi2(self): 2056 2056 """ … … 2058 2058 """ 2059 2059 return self.tcChi.GetValue() 2060 2060 2061 2061 def onsetValues(self, chisqr, p_name, out, cov): 2062 2062 """ 2063 2063 Build the panel from the fit result 2064 2064 2065 2065 :param chisqr: Value of the goodness of fit metric 2066 2066 :param p_name: the name of parameters 2067 2067 :param out: list of parameter with the best value found during fitting 2068 2068 :param cov: Covariance matrix 2069 2070 """ 2071 2069 2070 """ 2071 2072 2072 # make sure stop button to fit button all the time 2073 2073 self._on_fit_complete() 2074 2074 if out == None or not numpy.isfinite(chisqr): 2075 2075 raise ValueError, "Fit error occured..." 2076 2076 2077 2077 is_modified = False 2078 2078 has_error = False 2079 2079 dispersity = '' 2080 2080 2081 2081 #Hide textctrl boxes of errors. 2082 2082 self._clear_Err_on_Fit() 2083 2083 2084 2084 #Check if chi2 is finite 2085 2085 if chisqr != None and numpy.isfinite(chisqr): … … 2090 2090 else: 2091 2091 self.tcChi.SetValue("-") 2092 2092 2093 2093 #Hide error title 2094 2094 if self.text2_3.IsShown() and not self.is_mac: 2095 2095 self.text2_3.Hide() 2096 2096 2097 2097 try: 2098 2098 if self.enable_disp.GetValue(): … … 2103 2103 dispersity = None 2104 2104 pass 2105 2105 2106 2106 i = 0 2107 2107 #Set the panel when fit result are list … … 2121 2121 val_out = format_number(out[ind], True) 2122 2122 item[2].SetValue(val_out) 2123 2123 2124 2124 if(cov != None and len(cov) == len(out)): 2125 2125 try: … … 2133 2133 except: 2134 2134 pass 2135 2135 2136 2136 if cov[ind] != None: 2137 2137 if numpy.isfinite(float(cov[ind])): … … 2160 2160 ## save current state 2161 2161 self.save_current_state() 2162 2162 2163 2163 if not self.is_mac: 2164 2164 self.Layout() … … 2167 2167 #plot model ( when drawing, do not update chisqr value again) 2168 2168 self._draw_model(update_chisqr=False, source='fit') 2169 2169 2170 2170 def onWeighting(self, event): 2171 2171 """ … … 2174 2174 self.weightbt_string = event.GetEventObject().GetLabelText() 2175 2175 self._set_weight() 2176 2176 2177 2177 def _set_weight(self, is_2D=None): 2178 2178 """ … … 2191 2191 is2d=is_2D, 2192 2192 fid=None) 2193 2193 2194 2194 def onPinholeSmear(self, event): 2195 2195 """ 2196 2196 Create a custom pinhole smear object that will change the way residuals 2197 2197 are compute when fitting 2198 2198 2199 2199 :Note: accuracy is given by strings'High','Med', 'Low' FOR 2d, 2200 2200 None for 1D 2201 2201 2202 2202 """ 2203 2203 if self.model == None: … … 2232 2232 # hide all silt sizer 2233 2233 self._hide_all_smear_info() 2234 2234 2235 2235 # show relevant slit sizers 2236 2236 self._show_smear_sizer() … … 2238 2238 self.sizer_set_smearer.Layout() 2239 2239 self.Layout() 2240 2240 2241 2241 if event != None: 2242 2242 event.Skip() … … 2245 2245 event = PageInfoEvent(page=self) 2246 2246 wx.PostEvent(self.parent, event) 2247 2247 2248 2248 def _is_changed_pinhole(self): 2249 2249 """ 2250 2250 check if any of pinhole smear is changed 2251 2251 2252 2252 :return: True or False 2253 2253 2254 2254 """ 2255 2255 # get the values 2256 2256 pin_min = self.smear_pinhole_min.GetValue() 2257 2257 pin_max = self.smear_pinhole_max.GetValue() 2258 2258 2259 2259 # Check changes in slit width 2260 2260 try: … … 2264 2264 if self.dx_min != dx_min: 2265 2265 return True 2266 2266 2267 2267 # Check changes in slit heigth 2268 2268 try: … … 2273 2273 return True 2274 2274 return False 2275 2275 2276 2276 def _set_pinhole_smear(self): 2277 2277 """ 2278 2278 Set custom pinhole smear 2279 2279 2280 2280 :return: msg 2281 2281 2282 2282 """ 2283 2283 # copy data … … 2295 2295 data.dxw = None 2296 2296 msg = None 2297 2297 2298 2298 get_pin_min = self.smear_pinhole_min 2299 2299 get_pin_max = self.smear_pinhole_max … … 2349 2349 get_pin_max.SetBackgroundColour("white") 2350 2350 ## set smearing value whether or not the data contain the smearing info 2351 2351 2352 2352 self._manager.set_smearer(smearer=self.current_smearer, 2353 2353 fid=self.data.id, … … 2357 2357 uid=self.uid) 2358 2358 return msg 2359 2359 2360 2360 def update_pinhole_smear(self): 2361 2361 """ 2362 2362 called by kill_focus on pinhole TextCntrl 2363 2363 to update the changes 2364 2364 2365 2365 :return: False when wrong value was entered 2366 2366 2367 2367 """ 2368 2368 # msg default … … 2377 2377 else: 2378 2378 return True 2379 2379 2380 2380 def onSlitSmear(self, event): 2381 2381 """ … … 2410 2410 else: 2411 2411 is_new_slit = True 2412 2412 2413 2413 # if any value is changed 2414 2414 if is_new_slit: 2415 2415 msg = self._set_slit_smear() 2416 2416 2417 2417 # hide all silt sizer 2418 2418 self._hide_all_smear_info() … … 2433 2433 """ 2434 2434 check if any of slit lengths is changed 2435 2435 2436 2436 :return: True or False 2437 2437 2438 2438 """ 2439 2439 # get the values 2440 2440 width = self.smear_slit_width.GetValue() 2441 2441 height = self.smear_slit_height.GetValue() 2442 2442 2443 2443 # check and change the box bg color if it was pink 2444 2444 # but it should be white now … … 2448 2448 if width.lstrip().rstrip() == "": 2449 2449 self.smear_slit_width.SetBackgroundColour(wx.WHITE) 2450 2450 2451 2451 # Check changes in slit width 2452 2452 if width == "": … … 2459 2459 if self.dxw != dxw: 2460 2460 return True 2461 2461 2462 2462 # Check changes in slit heigth 2463 2463 if height == "": … … 2472 2472 2473 2473 return False 2474 2474 2475 2475 def _set_slit_smear(self): 2476 2476 """ 2477 2477 Set custom slit smear 2478 2478 2479 2479 :return: message to inform the user about the validity 2480 2480 of the values entered for slit smear … … 2490 2490 data.dxw = None 2491 2491 msg = None 2492 2492 2493 2493 try: 2494 2494 self.dxl = float(self.smear_slit_height.GetValue()) … … 2515 2515 else: 2516 2516 self.smear_slit_width.SetBackgroundColour(wx.WHITE) 2517 2517 2518 2518 self.current_smearer = smear_selection(data, self.model) 2519 2519 ## set smearing value whether or not the data contain the smearing info … … 2525 2525 uid=self.uid) 2526 2526 return msg 2527 2527 2528 2528 def update_slit_smear(self): 2529 2529 """ 2530 2530 called by kill_focus on pinhole TextCntrl 2531 2531 to update the changes 2532 2532 2533 2533 :return: False when wrong value was entered 2534 2534 2535 2535 """ 2536 2536 # msg default … … 2546 2546 else: 2547 2547 return True 2548 2548 2549 2549 def onSmear(self, event): 2550 2550 """ … … 2572 2572 self._manager.page_finder[self.uid].add_data(data=self.data) 2573 2573 temp_smearer = self.on_smear_helper() 2574 2574 2575 2575 self.sizer_set_smearer.Layout() 2576 2576 self.Layout() 2577 2577 self._set_weight() 2578 2578 2579 2579 ## set smearing value whether or not the data contain the smearing info 2580 2580 wx.CallAfter(self._manager.set_smearer, uid=self.uid, … … 2585 2585 enable_smearer=not self.disable_smearer.GetValue(), 2586 2586 draw=True) 2587 2587 2588 2588 self.state.enable_smearer = self.enable_smearer.GetValue() 2589 2589 self.state.disable_smearer = self.disable_smearer.GetValue() 2590 2590 self.state.pinhole_smearer = self.pinhole_smearer.GetValue() 2591 2591 self.state.slit_smearer = self.slit_smearer.GetValue() 2592 2592 2593 2593 def on_smear_helper(self, update=False): 2594 2594 """ 2595 2595 Help for onSmear 2596 2596 2597 2597 :param update: force or not to update 2598 2598 """ … … 2606 2606 self._hide_all_smear_info() 2607 2607 data = copy.deepcopy(self.data) 2608 2608 2609 2609 # make sure once more if it is smearer 2610 2610 temp_smearer = smear_selection(data, self.model) … … 2629 2629 self.onSlitSmear(None) 2630 2630 self._show_smear_sizer() 2631 2631 2632 2632 return temp_smearer 2633 2633 2634 2634 def on_complete_chisqr(self, event): 2635 2635 """ … … 2648 2648 except: 2649 2649 pass 2650 2650 2651 2651 def get_all_checked_params(self): 2652 2652 """ … … 2664 2664 self.param_toFit.append(item) 2665 2665 self.save_current_state_fit() 2666 2666 2667 2667 event = PageInfoEvent(page=self) 2668 2668 wx.PostEvent(self.parent, event) … … 2672 2672 param2fit.append(item[1]) 2673 2673 self._manager.set_param2fit(self.uid, param2fit) 2674 2674 2675 2675 def select_all_param(self, event): 2676 2676 """ … … 2706 2706 except: 2707 2707 pass 2708 2708 2709 2709 else: 2710 2710 ## for 1D all parameters except orientation … … 2726 2726 item[0].SetValue(False) 2727 2727 self.param_toFit = [] 2728 2728 2729 2729 self.save_current_state_fit() 2730 2730 2731 2731 if event != None: 2732 2732 #self._undo.Enable(True) … … 2739 2739 param2fit.append(item[1]) 2740 2740 self.parent._manager.set_param2fit(self.uid, param2fit) 2741 2741 2742 2742 def select_param(self, event): 2743 2743 """ … … 2792 2792 else: 2793 2793 self.cb1.SetValue(False) 2794 2794 2795 2795 self.save_current_state_fit() 2796 2796 if event != None: … … 2798 2798 event = PageInfoEvent(page=self) 2799 2799 wx.PostEvent(self.parent, event) 2800 2800 2801 2801 param2fit = [] 2802 2802 for item in self.param_toFit: … … 2804 2804 param2fit.append(item[1]) 2805 2805 self._manager.set_param2fit(self.uid, param2fit) 2806 2806 2807 2807 def set_model_param_sizer(self, model): 2808 2808 """ 2809 2809 Build the panel from the model content 2810 2810 2811 2811 :param model: the model selected in combo box for fitting purpose 2812 2812 2813 2813 """ 2814 2814 self.sizer3.Clear(True) … … 2820 2820 self.orientation_params = [] 2821 2821 self.orientation_params_disp = [] 2822 2822 2823 2823 if model == None: 2824 2824 self.sizer3.Layout() … … 2834 2834 ## save the current model 2835 2835 self.model = model 2836 2836 2837 2837 keys = self.model.getParamList() 2838 2838 2839 2839 #list of dispersion parameters 2840 2840 self.disp_list = self.model.getDispParamList() … … 2892 2892 2893 2893 keys.sort(custom_compare) 2894 2894 2895 2895 iy = 0 2896 2896 ix = 0 … … 2900 2900 self.cb1.SetToolTipString("To check/uncheck all the boxes below.") 2901 2901 self.cb1.SetValue(True) 2902 2902 2903 2903 sizer.Add(self.cb1, (iy, ix), (1, 1), \ 2904 2904 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 5) … … 2928 2928 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 2929 2929 self.text2_4.Hide() 2930 2930 2931 2931 CHECK_STATE = self.cb1.GetValue() 2932 2932 for item in keys: 2933 2933 2934 2934 if not item in self.disp_list and not item in \ 2935 2935 self.model.orientation_params: 2936 2936 2937 2937 ##prepare a spot to store errors 2938 2938 if not item in self.model.details: 2939 2939 self.model.details[item] = ["", None, None] 2940 2940 2941 2941 iy += 1 2942 2942 ix = 0 … … 2978 2978 #cb.SetValue(True) 2979 2979 wx.EVT_CHECKBOX(self, cb.GetId(), self.select_param) 2980 2980 2981 2981 sizer.Add(cb, (iy, ix), (1, 1), 2982 2982 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 5) … … 3017 3017 sizer.Add(ctl3, (iy, ix), (1, 1), 3018 3018 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 3019 3019 3020 3020 ix += 1 3021 3021 ctl4 = self.ModelTextCtrl(self, -1, … … 3028 3028 sizer.Add(ctl4, (iy, ix), (1, 1), 3029 3029 wx.EXPAND | wx.FIXED_MINSIZE, 0) 3030 3030 3031 3031 ix += 1 3032 3032 # Units … … 3039 3039 sizer.Add(units, (iy, ix), (1, 1), 3040 3040 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 3041 3041 3042 3042 self.parameters.append([cb, item, ctl1, 3043 3043 text2, ctl2, ctl3, ctl4, units]) 3044 3044 3045 3045 iy += 1 3046 3046 sizer.Add((10, 10), (iy, ix), (1, 1), 3047 3047 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 3048 3048 3049 3049 # type can be either Guassian or Array 3050 3050 if len(self.model.dispersion.values()) > 0: … … 3052 3052 else: 3053 3053 type = "Gaussian" 3054 3054 3055 3055 iy += 1 3056 3056 ix = 0 … … 3059 3059 if item in self.model.orientation_params: 3060 3060 orient_angle = wx.StaticText(self, -1, '[For 2D only]:') 3061 mag_on_button = wx.Button(self, -1, "Magnetic ON" 3061 mag_on_button = wx.Button(self, -1, "Magnetic ON") 3062 3062 mag_on_button.Bind(wx.EVT_BUTTON, self._on_mag_on) 3063 mag_help_button = wx.Button(self, -1, "Magnetic angles?")3064 mag_help_button.Bind(wx.EVT_BUTTON, self._on_mag_help)3063 mag_help_button = wx.Button(self, -1, "Magnetic angles?") 3064 mag_help_button.Bind(wx.EVT_BUTTON, self._on_mag_help) 3065 3065 sizer.Add(orient_angle, (iy, ix), (1, 1), 3066 3066 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 3067 3067 iy += 1 3068 sizer.Add(mag_on_button, (iy, ix ),(1,1),3069 wx.LEFT |wx.EXPAND|wx.ADJUST_MINSIZE, 15)3070 sizer.Add(mag_help_button, (iy, ix + 1),(1,1),3071 wx.LEFT |wx.EXPAND|wx.ADJUST_MINSIZE, 15)3072 3068 sizer.Add(mag_on_button, (iy, ix), (1, 1), 3069 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 3070 sizer.Add(mag_help_button, (iy, ix + 1), (1, 1), 3071 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 3072 3073 3073 #handle the magnetic buttons 3074 3074 if not self._has_magnetic: … … 3082 3082 if self.magnetic_on: 3083 3083 mag_on_button.SetLabel("Magnetic OFF") 3084 mag_help_button.Show(True) 3084 mag_help_button.Show(True) 3085 3085 else: 3086 3086 mag_on_button.SetLabel("Magnetic ON") 3087 3087 mag_help_button.Show(False) 3088 3088 3089 3089 if not self.data.__class__.__name__ == "Data2D" and \ 3090 3090 not self.enable2D: … … 3093 3093 orient_angle.Show(True) 3094 3094 break 3095 3095 3096 3096 #For Gaussian only 3097 3097 if type.lower() != "array": … … 3104 3104 if not item in self.model.details: 3105 3105 self.model.details[item] = ["", None, None] 3106 3106 3107 3107 iy += 1 3108 3108 ix = 0 … … 3119 3119 sizer.Add(cb, (iy, ix), (1, 1), 3120 3120 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 5) 3121 3121 3122 3122 ## add parameter value 3123 3123 ix += 1 … … 3148 3148 3149 3149 ctl2.Hide() 3150 3150 3151 3151 ix += 1 3152 3152 ctl3 = self.ModelTextCtrl(self, -1, … … 3154 3154 style=wx.TE_PROCESS_ENTER, 3155 3155 text_enter_callback=self._onparamRangeEnter) 3156 3156 3157 3157 sizer.Add(ctl3, (iy, ix), (1, 1), 3158 3158 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 3159 3159 ctl3.Hide() 3160 3160 3161 3161 ix += 1 3162 3162 ctl4 = self.ModelTextCtrl(self, -1, … … 3166 3166 sizer.Add(ctl4, (iy, ix), (1, 1), 3167 3167 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 3168 3168 3169 3169 ctl4.Hide() 3170 3170 3171 3171 if self.data.__class__.__name__ == "Data2D" or \ 3172 3172 self.enable2D: … … 3176 3176 ctl3.Show(True) 3177 3177 ctl4.Show(True) 3178 3178 3179 3179 ix += 1 3180 3180 # Units … … 3191 3191 else: 3192 3192 units.Hide() 3193 3193 3194 3194 sizer.Add(units, (iy, ix), (1, 1), 3195 3195 wx.EXPAND | wx.ADJUST_MINSIZE, 0) 3196 3196 3197 3197 self.parameters.append([cb, item, ctl1, 3198 3198 text2, ctl2, ctl3, ctl4, units]) 3199 3199 self.orientation_params.append([cb, item, ctl1, 3200 3200 text2, ctl2, ctl3, ctl4, units]) 3201 3201 3202 3202 iy += 1 3203 3203 box_description.SetForegroundColour(wx.BLUE) … … 3235 3235 wx.PostEvent(self._manager.parent, 3236 3236 StatusEvent(status=msg, info=infor)) 3237 3237 3238 3238 def _onModel2D(self, event): 3239 3239 """ … … 3243 3243 self.model_view.SetLabel("Show 1D") 3244 3244 self.enable2D = True 3245 3245 3246 3246 else: 3247 3247 self.model_view.SetLabel("Show 2D") … … 3258 3258 self.SetupScrolling() 3259 3259 self._draw_model() 3260 3260 3261 3261 self.state.enable2D = copy.deepcopy(self.enable2D) 3262 3262 3263 3263 def _set_smear_buttons(self): 3264 3264 """ … … 3274 3274 self.slit_smearer.Enable(True) 3275 3275 self.pinhole_smearer.Enable(True) 3276 3277 3276 3277 3278 3278 class BGTextCtrl(wx.TextCtrl): 3279 3279 """ … … 3286 3286 self.SetEditable(False) 3287 3287 self.SetBackgroundColour(self.GetParent().parent.GetBackgroundColour()) 3288 3288 3289 3289 # Bind to mouse event to avoid text highlighting 3290 3290 # The event will be skipped once the call-back 3291 3291 # is called. 3292 3292 self.Bind(wx.EVT_MOUSE_EVENTS, self._click) 3293 3293 3294 3294 def _click(self, event): 3295 3295 """
Note: See TracChangeset
for help on using the changeset viewer.