Changeset 12f7f24 in sasview for src/sas/sasgui
- Timestamp:
- Aug 17, 2017 10:14:37 AM (7 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, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- e61f668
- Parents:
- 6b7d3c2 (diff), a06ee7e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Location:
- src/sas/sasgui
- Files:
-
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sasgui/perspectives/calculator/model_editor.py
ra1b8fee r07ec714 643 643 self.name_hsizer = None 644 644 self.name_tcl = None 645 self.overwrite_cb = None 645 646 self.desc_sizer = None 646 647 self.desc_tcl = None … … 657 658 self.warning = "" 658 659 #This does not seem to be used anywhere so commenting out for now 659 # -- PDB 2/26/17 660 # -- PDB 2/26/17 660 661 #self._description = "New Plugin Model" 661 662 self.function_tcl = None … … 689 690 #title name [string] 690 691 name_txt = wx.StaticText(self, -1, 'Function Name : ') 691 overwrite_cb = wx.CheckBox(self, -1, "Overwrite existing plugin model of this name?", (10, 10))692 overwrite_cb.SetValue(False)693 overwrite_cb.SetToolTipString("Overwrite it if already exists?")694 wx.EVT_CHECKBOX(self, overwrite_cb.GetId(), self.on_over_cb)692 self.overwrite_cb = wx.CheckBox(self, -1, "Overwrite existing plugin model of this name?", (10, 10)) 693 self.overwrite_cb.SetValue(False) 694 self.overwrite_cb.SetToolTipString("Overwrite it if already exists?") 695 wx.EVT_CHECKBOX(self, self.overwrite_cb.GetId(), self.on_over_cb) 695 696 self.name_tcl = wx.TextCtrl(self, -1, size=(PANEL_WIDTH * 3 / 5, -1)) 696 697 self.name_tcl.Bind(wx.EVT_TEXT_ENTER, self.on_change_name) … … 700 701 self.name_tcl.SetToolTipString(hint_name) 701 702 self.name_hsizer.AddMany([(self.name_tcl, 0, wx.LEFT | wx.TOP, 0), 702 ( overwrite_cb, 0, wx.LEFT, 20)])703 (self.overwrite_cb, 0, wx.LEFT, 20)]) 703 704 self.name_sizer.AddMany([(name_txt, 0, wx.LEFT | wx.TOP, 10), 704 705 (self.name_hsizer, 0, … … 740 741 self.param_sizer.AddMany([(param_txt, 0, wx.LEFT, 10), 741 742 (self.param_tcl, 1, wx.EXPAND | wx.ALL, 10)]) 742 743 743 744 # Parameters with polydispersity 744 745 pd_param_txt = wx.StaticText(self, -1, 'Fit Parameters requiring ' + \ … … 755 756 self.pd_param_tcl.setDisplayLineNumbers(True) 756 757 self.pd_param_tcl.SetToolTipString(pd_param_tip) 757 758 758 759 self.param_sizer.AddMany([(pd_param_txt, 0, wx.LEFT, 10), 759 760 (self.pd_param_tcl, 1, wx.EXPAND | wx.ALL, 10)]) … … 995 996 info = 'Error' 996 997 color = 'red' 998 self.overwrite_cb.SetValue(True) 999 self.overwrite_name = True 997 1000 else: 998 1001 self._notes = result … … 1030 1033 if has_scipy: 1031 1034 lines.insert(0, 'import scipy') 1032 1033 # Think about 2D later 1035 1036 # Think about 2D later 1034 1037 #self.is_2d = func_str.count("#self.ndim = 2") 1035 1038 #line_2d = '' 1036 1039 #if self.is_2d: 1037 1040 # line_2d = CUSTOM_2D_TEMP.split('\n') 1038 1039 # Also think about test later 1041 1042 # Also think about test later 1040 1043 #line_test = TEST_TEMPLATE.split('\n') 1041 1044 #local_params = '' … … 1043 1046 spaces4 = ' '*4 1044 1047 spaces13 = ' '*13 1045 spaces16 = ' '*16 1048 spaces16 = ' '*16 1046 1049 param_names = [] # to store parameter names 1047 1050 has_scipy = func_str.count("scipy.") … … 1055 1058 out_f.write(line + '\n') 1056 1059 if line.count('#name'): 1057 out_f.write('name = "%s" \n' % name) 1060 out_f.write('name = "%s" \n' % name) 1058 1061 elif line.count('#title'): 1059 out_f.write('title = "User model for %s"\n' % name) 1062 out_f.write('title = "User model for %s"\n' % name) 1060 1063 elif line.count('#description'): 1061 out_f.write('description = "%s"\n' % desc_str) 1064 out_f.write('description = "%s"\n' % desc_str) 1062 1065 elif line.count('#parameters'): 1063 1066 out_f.write('parameters = [ \n') … … 1065 1068 p_line = param_line.lstrip().rstrip() 1066 1069 if p_line: 1067 pname, pvalue = self.get_param_helper(p_line)1070 pname, pvalue, desc = self.get_param_helper(p_line) 1068 1071 param_names.append(pname) 1069 out_f.write("%s['%s', '', %s, [-numpy.inf, numpy.inf], '', ' '],\n" % (spaces16, pname, pvalue))1072 out_f.write("%s['%s', '', %s, [-numpy.inf, numpy.inf], '', '%s'],\n" % (spaces16, pname, pvalue, desc)) 1070 1073 for param_line in pd_param_str.split('\n'): 1071 1074 p_line = param_line.lstrip().rstrip() 1072 1075 if p_line: 1073 pname, pvalue = self.get_param_helper(p_line)1076 pname, pvalue, desc = self.get_param_helper(p_line) 1074 1077 param_names.append(pname) 1075 out_f.write("%s['%s', '', %s, [-numpy.inf, numpy.inf], 'volume', ' '],\n" % (spaces16, pname, pvalue))1078 out_f.write("%s['%s', '', %s, [-numpy.inf, numpy.inf], 'volume', '%s'],\n" % (spaces16, pname, pvalue, desc)) 1076 1079 out_f.write('%s]\n' % spaces13) 1077 1080 1078 1081 # No form_volume or ER available in simple model editor 1079 1082 out_f.write('def form_volume(*arg): \n') … … 1082 1085 out_f.write('def ER(*arg): \n') 1083 1086 out_f.write(' return 1.0 \n') 1084 1087 1085 1088 # function to compute 1086 1089 out_f.write('\n') … … 1091 1094 for func_line in func_str.split('\n'): 1092 1095 out_f.write('%s%s\n' % (spaces4, func_line)) 1093 1096 1094 1097 Iqxy_string = 'return Iq(numpy.sqrt(x**2+y**2) ' 1095 1098 1096 1099 out_f.write('\n') 1097 1100 out_f.write('def Iqxy(x, y ') … … 1113 1116 items = line.split(";") 1114 1117 for item in items: 1115 name = item.split("=")[0].lstrip().rstrip() 1118 name = item.split("=")[0].strip() 1119 description = "" 1116 1120 try: 1117 value = item.split("=")[1].lstrip().rstrip() 1121 value = item.split("=")[1].strip() 1122 if value.count("#"): 1123 # If line ends in a comment, remove it before parsing float 1124 index = value.index("#") 1125 description = value[(index + 1):].strip() 1126 value = value[:value.index("#")].strip() 1118 1127 float(value) 1119 except :1128 except ValueError: 1120 1129 value = 1.0 # default 1121 1130 1122 return name, value 1131 return name, value, description 1123 1132 1124 1133 def set_function_helper(self, line): … … 1204 1213 import numpy 1205 1214 1206 #name 1215 #name 1207 1216 1208 1217 #title … … 1210 1219 #description 1211 1220 1212 #parameters 1221 #parameters 1213 1222 1214 1223 """ -
src/sas/sasgui/perspectives/calculator/pyconsole.py
r7432acb r4627657 37 37 Iqxy = model.evalDistribution([qx, qy]) 38 38 39 result = """ 40 Iq(%s) = %s 41 Iqxy(%s, %s) = %s 42 """%(q, Iq, qx, qy, Iqxy) 39 # check the model's unit tests run 40 from sasmodels.model_test import run_one 41 result = run_one(path) 43 42 44 43 return result … … 89 88 ok = wx.Button(self, wx.ID_OK, "OK") 90 89 91 # Mysterious constraint layouts from 90 # Mysterious constraint layouts from 92 91 # https://www.wxpython.org/docs/api/wx.lib.layoutf.Layoutf-class.html 93 92 lc = layoutf.Layoutf('t=t5#1;b=t5#2;l=l5#1;r=r5#1', (self,ok)) -
src/sas/sasgui/perspectives/fitting/fitting.py
ra534432 r489f53a 257 257 toks = os.path.splitext(label) 258 258 path = os.path.join(models.find_plugins_dir(), toks[0]) 259 message = "Are you sure you want to delete the file {}?".format(path) 260 dlg = wx.MessageDialog(self.frame, message, '', wx.YES_NO | wx.ICON_QUESTION) 261 if not dlg.ShowModal() == wx.ID_YES: 262 return 259 263 try: 260 264 for ext in ['.py', '.pyc']: 261 265 p_path = path + ext 266 if ext == '.pyc' and not os.path.isfile(path + ext): 267 # If model is invalid, .pyc file may not exist as model has 268 # never been compiled. Don't try and delete it 269 continue 262 270 os.remove(p_path) 263 271 self.update_custom_combo() … … 361 369 'Add a new model function') 362 370 wx.EVT_MENU(owner, wx_id, self.make_new_model) 363 371 364 372 wx_id = wx.NewId() 365 373 self.edit_model_menu.Append(wx_id, 'Sum|Multi(p1, p2)', … … 383 391 '(Re)Load all models present in user plugin_models folder') 384 392 wx.EVT_MENU(owner, wx_id, self.load_plugin_models) 385 393 386 394 def set_edit_menu_helper(self, owner=None, menu=None): 387 395 """ … … 1734 1742 @param unsmeared_error: data error, rescaled to unsmeared model 1735 1743 """ 1736 1737 number_finite = np.count_nonzero(np.isfinite(y)) 1744 1745 number_finite = np.count_nonzero(np.isfinite(y)) 1738 1746 np.nan_to_num(y) 1739 1747 new_plot = self.create_theory_1D(x, y, page_id, model, data, state, … … 1794 1802 msg = "Computing Error: Model did not return any finite value." 1795 1803 wx.PostEvent(self.parent, StatusEvent(status = msg, info="error")) 1796 else: 1804 else: 1797 1805 msg = "Computation completed!" 1798 1806 if number_finite != y.size: … … 1824 1832 that can be plot. 1825 1833 """ 1826 number_finite = np.count_nonzero(np.isfinite(image)) 1834 number_finite = np.count_nonzero(np.isfinite(image)) 1827 1835 np.nan_to_num(image) 1828 1836 new_plot = Data2D(image=image, err_image=data.err_data) … … 1927 1935 ## and may be the cause of other noted instabilities 1928 1936 ## 1929 ## -PDB August 12, 2014 1937 ## -PDB August 12, 2014 1930 1938 while self.calc_2D.isrunning(): 1931 1939 time.sleep(0.1) … … 1969 1977 if (self.calc_1D is not None) and self.calc_1D.isrunning(): 1970 1978 self.calc_1D.stop() 1971 ## stop just raises the flag -- the thread is supposed to 1979 ## stop just raises the flag -- the thread is supposed to 1972 1980 ## then kill itself but cannot. Paul Kienzle came up with 1973 1981 ## this fix to prevent threads from stepping on each other … … 1981 1989 ## a request to stop the computation. 1982 1990 ## It seems thus that the whole thread approach used here 1983 ## May need rethinking 1991 ## May need rethinking 1984 1992 ## 1985 1993 ## -PDB August 12, 2014 … … 2146 2154 residuals.dxw = None 2147 2155 residuals.ytransform = 'y' 2148 # For latter scale changes 2156 # For latter scale changes 2149 2157 residuals.xaxis('\\rm{Q} ', 'A^{-1}') 2150 2158 residuals.yaxis('\\rm{Residuals} ', 'normalized') -
src/sas/sasgui/perspectives/fitting/models.py
r7df0ccd r12f7f24 186 186 try: 187 187 model = load_custom_model(path) 188 model.name = PLUGIN_NAME_BASE + model.name 188 if not model.name.count(PLUGIN_NAME_BASE): 189 model.name = PLUGIN_NAME_BASE + model.name 189 190 plugins[model.name] = model 190 191 except Exception: -
src/sas/sasgui/perspectives/pr/inversion_panel.py
r7432acb rcb62bd5 70 70 self.rg_ctl = None 71 71 self.iq0_ctl = None 72 self.bck_chk = None 72 self.bck_value = None 73 self.bck_est_ctl = None 74 self.bck_man_ctl = None 75 self.est_bck = True 76 self.bck_input = None 73 77 self.bck_ctl = None 74 78 … … 312 316 # Read the panel's parameters 313 317 flag, alpha, dmax, nfunc, qmin, \ 314 qmax, height, width = self._read_pars()318 qmax, height, width, bck = self._read_pars() 315 319 316 320 state.nfunc = nfunc … … 326 330 327 331 # Background evaluation checkbox 328 state.estimate_bck = self.bck_chk.IsChecked() 332 state.estimate_bck = self.est_bck 333 state.bck_value = bck 329 334 330 335 # Estimates … … 371 376 self.plot_data.SetValue(str(state.file)) 372 377 373 # Background evaluation checkbox 374 self.bck_chk.SetValue(state.estimate_bck) 378 # Background value 379 self.bck_est_ctl.SetValue(state.estimate_bck) 380 self.bck_man_ctl.SetValue(not state.estimate_bck) 381 if not state.estimate_bck: 382 self.bck_input.Enable() 383 self.bck_input.SetValue(str(state.bck_value)) 384 self.est_bck = state.estimate_bck 385 self.bck_value = state.bck_value 375 386 376 387 # Estimates … … 431 442 wx.EXPAND | wx.LEFT | wx.RIGHT | wx.ADJUST_MINSIZE, 15) 432 443 433 self.bck_chk = wx.CheckBox(self, -1, "Estimate background level") 434 hint_msg = "Check box to let the fit estimate " 435 hint_msg += "the constant background level." 436 self.bck_chk.SetToolTipString(hint_msg) 437 self.bck_chk.Bind(wx.EVT_CHECKBOX, self._on_pars_changed) 444 radio_sizer = wx.GridBagSizer(5, 5) 445 446 self.bck_est_ctl = wx.RadioButton(self, -1, "Estimate background level", 447 name="estimate_bck", style=wx.RB_GROUP) 448 self.bck_man_ctl = wx.RadioButton(self, -1, "Input manual background level", 449 name="manual_bck") 450 451 self.bck_est_ctl.Bind(wx.EVT_RADIOBUTTON, self._on_bck_changed) 452 self.bck_man_ctl.Bind(wx.EVT_RADIOBUTTON, self._on_bck_changed) 453 454 radio_sizer.Add(self.bck_est_ctl, (0,0), (1,1), wx.LEFT | wx.EXPAND) 455 radio_sizer.Add(self.bck_man_ctl, (0,1), (1,1), wx.RIGHT | wx.EXPAND) 456 438 457 iy += 1 439 pars_sizer.Add( self.bck_chk, (iy, 0), (1, 2),458 pars_sizer.Add(radio_sizer, (iy, 0), (1, 2), 440 459 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 460 461 background_label = wx.StaticText(self, -1, "Background: ") 462 self.bck_input = PrTextCtrl(self, -1, style=wx.TE_PROCESS_ENTER, 463 size=(60, 20), value="0.0") 464 self.bck_input.Disable() 465 self.bck_input.Bind(wx.EVT_TEXT, self._read_pars) 466 background_units = wx.StaticText(self, -1, "[A^(-1)]", size=(55, 20)) 467 iy += 1 468 469 background_sizer = wx.GridBagSizer(5, 5) 470 471 background_sizer.Add(background_label, (0, 0), (1,1), 472 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 23) 473 background_sizer.Add(self.bck_input, (0, 1), (1,1), 474 wx.LEFT | wx.ADJUST_MINSIZE, 5) 475 background_sizer.Add(background_units, (0, 2), (1,1), 476 wx.LEFT | wx.ADJUST_MINSIZE, 5) 477 pars_sizer.Add(background_sizer, (iy, 0), (1, 2), 478 wx.LEFT | wx.EXPAND | wx.ADJUST_MINSIZE, 15) 479 441 480 boxsizer1.Add(pars_sizer, 0, wx.EXPAND) 442 481 vbox.Add(boxsizer1, (iy_vb, 0), (1, 1), … … 764 803 self._on_pars_changed() 765 804 805 def _on_bck_changed(self, evt=None): 806 self.est_bck = self.bck_est_ctl.GetValue() 807 if self.est_bck: 808 self.bck_input.Disable() 809 else: 810 self.bck_input.Enable() 811 766 812 def _on_pars_changed(self, evt=None): 767 813 """ … … 770 816 scenes. 771 817 """ 772 flag, alpha, dmax, nfunc, qmin, qmax, height, width = self._read_pars() 773 has_bck = self.bck_chk.IsChecked() 818 flag, alpha, dmax, nfunc, qmin, qmax, height, width, bck = self._read_pars() 774 819 775 820 # If the pars are valid, estimate alpha … … 783 828 d_max=dmax, 784 829 q_min=qmin, q_max=qmax, 785 bck=has_bck, 830 est_bck=self.est_bck, 831 bck_val=bck, 786 832 height=height, 787 833 width=width) … … 797 843 height = 0 798 844 width = 0 845 background = 0 799 846 flag = True 800 847 # Read slit height … … 890 937 self.qmax_ctl.Refresh() 891 938 892 return flag, alpha, dmax, nfunc, qmin, qmax, height, width 939 # Read background 940 if not self.est_bck: 941 try: 942 bck_str = self.bck_input.GetValue() 943 if len(bck_str.strip()) == 0: 944 background = 0.0 945 else: 946 background = float(bck_str) 947 self.bck_input.SetBackgroundColour(wx.WHITE) 948 except ValueError: 949 background = 0.0 950 self.bck_input.SetBackgroundColour("pink") 951 self.bck_input.Refresh() 952 953 return flag, alpha, dmax, nfunc, qmin, qmax, height, width, background 893 954 894 955 def _on_explore(self, evt): … … 915 976 # Push it to the manager 916 977 917 flag, alpha, dmax, nfunc, qmin, qmax, height, width = self._read_pars() 918 has_bck = self.bck_chk.IsChecked() 978 flag, alpha, dmax, nfunc, qmin, qmax, height, width, bck = self._read_pars() 919 979 920 980 if flag: … … 928 988 d_max=dmax, 929 989 q_min=qmin, q_max=qmax, 930 bck=has_bck, 990 est_bck=self.est_bck, 991 bck_val = bck, 931 992 height=height, 932 993 width=width) -
src/sas/sasgui/perspectives/pr/inversion_state.py
r7432acb ra0e6b1b 36 36 ["qmin", "qmin"], 37 37 ["qmax", "qmax"], 38 ["estimate_bck", "estimate_bck"]] 38 ["estimate_bck", "estimate_bck"], 39 ["bck_value", "bck_value"]] 39 40 40 41 ## List of P(r) inversion outputs … … 62 63 self.estimate_bck = False 63 64 self.timestamp = time.time() 65 self.bck_value = 0.0 64 66 65 67 # Inversion parameters … … 109 111 state += "Timestamp: %s\n" % self.timestamp 110 112 state += "Estimate bck: %s\n" % str(self.estimate_bck) 113 state += "Bck Value: %s\n" % str(self.bck_value) 111 114 state += "No. terms: %s\n" % str(self.nfunc) 112 115 state += "D_max: %s\n" % str(self.d_max) … … 296 299 self.coefficients.append(float(c)) 297 300 except: 298 # Bad data, skip. We will count the number of 299 # coefficients at the very end and deal with 301 # Bad data, skip. We will count the number of 302 # coefficients at the very end and deal with 300 303 # inconsistencies then. 301 304 pass … … 329 332 cov_row.append(float(c)) 330 333 except: 331 # Bad data, skip. We will count the number of 332 # coefficients at the very end and deal with 334 # Bad data, skip. We will count the number of 335 # coefficients at the very end and deal with 333 336 # inconsistencies then. 334 337 pass … … 461 464 tree = etree.parse(path, parser=etree.ETCompatXMLParser()) 462 465 # Check the format version number 463 # Specifying the namespace will take care of the file 464 #format version 466 # Specifying the namespace will take care of the file 467 #format version 465 468 root = tree.getroot() 466 469 -
src/sas/sasgui/perspectives/pr/media/pr_help.rst
r1221196 r1abd19c 49 49 P(r) inversion requires that the background be perfectly subtracted. This is 50 50 often difficult to do well and thus many data sets will include a background. 51 For those cases, the user should check the "estimate background" box and the 52 module will do its best to estimate it. 51 For those cases, the user should check the "Estimate background level" option 52 and the module will do its best to estimate it. If you know the background value 53 for your data, select the "Input manual background level" option. Note that 54 this value will be treated as having 0 error. 53 55 54 56 The P(r) module is constantly computing in the background what the optimum -
src/sas/sasgui/perspectives/pr/pr.py
ra1b8fee rcb62bd5 68 68 self.q_min = None 69 69 self.q_max = None 70 self.has_bck = False 70 self.est_bck = False 71 self.bck_val = 0 71 72 self.slit_height = 0 72 73 self.slit_width = 0 … … 828 829 self.control_panel.iq0 = pr.iq0(out) 829 830 self.control_panel.bck = pr.background 831 self.control_panel.bck_input.SetValue("{:.2g}".format(pr.background)) 830 832 831 833 # Show I(q) fit … … 907 909 908 910 def setup_plot_inversion(self, alpha, nfunc, d_max, q_min=None, q_max=None, 909 bck=False, height=0, width=0):911 est_bck=False, bck_val=0, height=0, width=0): 910 912 """ 911 913 Set up inversion from plotted data … … 916 918 self.q_min = q_min 917 919 self.q_max = q_max 918 self.has_bck = bck 920 self.est_bck = est_bck 921 self.bck_val = bck_val 919 922 self.slit_height = height 920 923 self.slit_width = width … … 930 933 def estimate_plot_inversion(self, alpha, nfunc, d_max, 931 934 q_min=None, q_max=None, 932 bck=False, height=0, width=0):935 est_bck=False, bck_val=0, height=0, width=0): 933 936 """ 934 937 Estimate parameters from plotted data … … 939 942 self.q_min = q_min 940 943 self.q_max = q_max 941 self.has_bck = bck 944 self.est_bck = est_bck 945 self.bck_val = bck_val 942 946 self.slit_height = height 943 947 self.slit_width = width … … 973 977 pr.x = self.current_plottable.x 974 978 pr.y = self.current_plottable.y 975 pr. has_bck = self.has_bck979 pr.est_bck = self.est_bck 976 980 pr.slit_height = self.slit_height 977 981 pr.slit_width = self.slit_width 982 pr.background = self.bck_val 978 983 979 984 # Keep track of the plot window title to ensure that … … 1019 1024 self.q_min = q_min 1020 1025 self.q_max = q_max 1021 self. has_bck = bck1026 self.est_bck = bck 1022 1027 self.slit_height = height 1023 1028 self.slit_width = width … … 1042 1047 self.q_min = q_min 1043 1048 self.q_max = q_max 1044 self. has_bck = bck1049 self.est_bck = bck 1045 1050 self.slit_height = height 1046 1051 self.slit_width = width … … 1115 1120 pr.y = y 1116 1121 pr.err = err 1117 pr. has_bck = self.has_bck1122 pr.est_bck = self.est_bck 1118 1123 pr.slit_height = self.slit_height 1119 1124 pr.slit_width = self.slit_width -
src/sas/sasgui/__init__.py
rd7bb526 rc6bdb3b 1 import sys 2 import os 3 from os.path import exists, expanduser, dirname, realpath, join as joinpath 4 5 6 def dirn(path, n): 7 path = realpath(path) 8 for _ in range(n): 9 path = dirname(path) 10 return path 11 12 # Set up config directories 13 def make_user_folder(): 14 path = joinpath(expanduser("~"),'.sasview') 15 if not exists(path): 16 os.mkdir(path) 17 return path 18 19 20 def find_app_folder(): 21 # We are starting out with the following info: 22 # __file__ = .../sas/sasgui/__init__.pyc 23 # Check if the sister path .../sas/sasview exists, and use it as the 24 # app directory. This will only be the case if the app is not frozen. 25 path = joinpath(dirn(__file__, 2), 'sasview') 26 if exists(path): 27 return path 28 29 # If we are running frozen, then root is a parent directory 30 if sys.platform == 'darwin': 31 # Here is the path to the file on the mac: 32 # .../Sasview.app/Contents/Resources/lib/python2.7/site-packages.zip/sas/sasgui/__init__.pyc 33 # We want the path to the Resources directory. 34 path = dirn(__file__, 6) 35 elif os.name == 'nt': 36 # Here is the path to the file on windows: 37 # ../Sasview/library.zip/sas/sasgui/__init__.pyc 38 # We want the path to the Sasview directory. 39 path = dirn(__file__, 4) 40 else: 41 raise RuntimeError("Couldn't find the app directory") 42 return path 43 44 USER_FOLDER = make_user_folder() 45 APP_FOLDER = find_app_folder() 46 47 48 def get_app_dir(): 49 return APP_FOLDER 50 51 def get_user_dir(): 52 return USER_FOLDER 53 54 def get_custom_config_path(): 55 dirname = os.path.join(get_user_dir(), 'config') 56 # If the directory doesn't exist, create it 57 if not os.path.exists(dirname): 58 os.makedirs(dirname) 59 path = os.path.join(dirname, "custom_config.py") 60 return path 61 62 _config_cache = None 63 def get_local_config(): 64 global _config_cache 65 if not _config_cache: 66 _config_cache = _load_config() 67 return _config_cache 68 69 def _load_config(): 70 import os 71 import sys 72 import logging 73 from sasmodels.custom import load_module_from_path 74 75 logger = logging.getLogger(__name__) 76 dirname = get_app_dir() 77 filename = 'local_config.py' 78 path = os.path.join(dirname, filename) 79 try: 80 module = load_module_from_path('sas.sasgui.local_config', path) 81 logger.info("GuiManager loaded %s", path) 82 return module 83 except Exception as exc: 84 logger.critical("Error loading %s: %s", path, exc) 85 sys.exit() -
src/sas/sasgui/guiframe/CategoryInstaller.py
r235f514 r914ba0a 14 14 import logging 15 15 from collections import defaultdict, OrderedDict 16 17 from sas.sasgui import get_user_dir 16 18 17 19 USER_FILE = 'categories.json' … … 69 71 70 72 @staticmethod 71 def _get_home_dir():72 """73 returns the users sasview config dir74 """75 return os.path.join(os.path.expanduser("~"), ".sasview")76 77 @staticmethod78 73 def _regenerate_model_dict(master_category_dict): 79 74 """ … … 85 80 by_model_dict = defaultdict(list) 86 81 model_enabled_dict = defaultdict(bool) 87 82 88 83 for category in master_category_dict: 89 84 for (model, enabled) in master_category_dict[category]: … … 96 91 def _regenerate_master_dict(by_model_dict, model_enabled_dict): 97 92 """ 98 regenerates master_category_dict from by_model_dict 93 regenerates master_category_dict from by_model_dict 99 94 and model_enabled_dict 100 95 returns the master category dictionary … … 112 107 returns the user data file, eg .sasview/categories.json.json 113 108 """ 114 return os.path.join( CategoryInstaller._get_home_dir(), USER_FILE)109 return os.path.join(get_user_dir(), USER_FILE) 115 110 116 111 @staticmethod … … 150 145 model_name, enabled = master_category_dict[cat][ind] 151 146 if model_name not in _model_list: 152 del_name = True 147 del_name = True 153 148 try: 154 149 by_model_dict.pop(model_name) -
src/sas/sasgui/guiframe/aboutbox.py
r959eb01 r914ba0a 24 24 import os.path 25 25 import os 26 try: 27 # Try to find a local config 28 import imp 29 path = os.getcwd() 30 if(os.path.isfile("%s/%s.py" % (path, 'local_config'))) or \ 31 (os.path.isfile("%s/%s.pyc" % (path, 'local_config'))): 32 fObj, path, descr = imp.find_module('local_config', [path]) 33 config = imp.load_module('local_config', fObj, path, descr) 34 else: 35 # Try simply importing local_config 36 import local_config as config 37 except: 38 # Didn't find local config, load the default 39 import config 26 27 from sas.sasgui import get_local_config 28 config = get_local_config() 40 29 41 30 def launchBrowser(url): 42 31 """ 43 32 Launches browser and opens specified url 44 33 45 34 In some cases may require BROWSER environment variable to be set up. 46 35 47 36 :param url: URL to open 48 37 49 38 """ 50 39 import webbrowser … … 55 44 """ 56 45 "About" Dialog 57 46 58 47 Shows product name, current version, authors, and link to the product page. 59 48 Current version is taken from version.py 60 61 """ 62 49 50 """ 51 63 52 def __init__(self, *args, **kwds): 64 53 … … 66 55 kwds["style"] = wx.DEFAULT_DIALOG_STYLE 67 56 wx.Dialog.__init__(self, *args, **kwds) 68 57 69 58 file_dir = os.path.dirname(__file__) 70 59 71 60 # Mac doesn't display images with transparent background so well, 72 61 # keep it for Windows 73 62 image = file_dir + "/images/angles_flat.png" 74 63 75 64 if os.path.isfile(config._corner_image): 76 65 image = config._corner_image … … 80 69 else: 81 70 self.bitmap_logo = wx.StaticBitmap(self, -1, wx.Bitmap(image)) 82 71 83 72 self.label_title = wx.StaticText(self, -1, config.__appname__) 84 73 self.label_version = wx.StaticText(self, -1, "") … … 112 101 #self.bitmap_button_danse = wx.BitmapButton(self, -1, wx.NullBitmap) 113 102 self.bitmap_button_msu = wx.BitmapButton(self, -1, wx.NullBitmap) 114 103 115 104 self.bitmap_button_isis = wx.BitmapButton(self, -1, wx.NullBitmap) 116 105 self.bitmap_button_ess = wx.BitmapButton(self, -1, wx.NullBitmap) … … 119 108 self.bitmap_button_tudelft = wx.BitmapButton(self, -1, wx.NullBitmap) 120 109 self.bitmap_button_dls = wx.BitmapButton(self, -1, wx.NullBitmap) 121 110 122 111 self.static_line_3 = wx.StaticLine(self, -1) 123 112 self.button_OK = wx.Button(self, wx.ID_OK, "OK") … … 125 114 self.__set_properties() 126 115 self.__do_layout() 127 116 128 117 self.Bind(wx.EVT_BUTTON, self.onNistLogo, self.bitmap_button_nist) 129 118 self.Bind(wx.EVT_BUTTON, self.onUmdLogo, self.bitmap_button_umd) … … 145 134 random.shuffle(config._authors) 146 135 strLabel = ", ".join(config._authors) 147 136 148 137 # display version and svn revison numbers 149 138 verwords = config.__version__.split('.') … … 157 146 self.label_version.SetLabel(config.__version__)#(version) 158 147 self.label_svnrevision.SetLabel(build_num) 159 148 160 149 # set bitmaps for logo buttons 161 150 image = file_dir + "/images/nist_logo.png" 162 151 if os.path.isfile(config._nist_logo): 163 152 image = config._nist_logo 164 logo = wx.Bitmap(image) 153 logo = wx.Bitmap(image) 165 154 self.bitmap_button_nist.SetBitmapLabel(logo) 166 155 167 156 image = file_dir + "/images/umd_logo.png" 168 157 if os.path.isfile(config._umd_logo): 169 158 image = config._umd_logo 170 logo = wx.Bitmap(image) 159 logo = wx.Bitmap(image) 171 160 self.bitmap_button_umd.SetBitmapLabel(logo) 172 161 … … 174 163 if os.path.isfile(config._ornl_logo): 175 164 image = config._ornl_logo 176 logo = wx.Bitmap(image) 165 logo = wx.Bitmap(image) 177 166 self.bitmap_button_ornl.SetBitmapLabel(logo) 178 167 … … 181 170 if os.path.isfile(config._sns_logo): 182 171 image = config._sns_logo 183 logo = wx.Bitmap(image) 172 logo = wx.Bitmap(image) 184 173 self.bitmap_button_sns.SetBitmapLabel(logo) 185 174 186 175 image = file_dir + "/images/nsf_logo.png" 187 176 if os.path.isfile(config._nsf_logo): 188 177 image = config._nsf_logo 189 logo = wx.Bitmap(image) 178 logo = wx.Bitmap(image) 190 179 self.bitmap_button_nsf.SetBitmapLabel(logo) 191 180 … … 201 190 logo = wx.Bitmap(image) 202 191 self.bitmap_button_msu.SetBitmapLabel(logo) 203 192 204 193 image = file_dir + "/images/isis_logo.png" 205 194 if os.path.isfile(config._isis_logo): 206 195 image = config._isis_logo 207 logo = wx.Bitmap(image) 196 logo = wx.Bitmap(image) 208 197 self.bitmap_button_isis.SetBitmapLabel(logo) 209 198 … … 213 202 logo = wx.Bitmap(image) 214 203 self.bitmap_button_ess.SetBitmapLabel(logo) 215 204 216 205 image = file_dir + "/images/ill_logo.png" 217 206 if os.path.isfile(config._ill_logo): … … 219 208 logo = wx.Bitmap(image) 220 209 self.bitmap_button_ill.SetBitmapLabel(logo) 221 210 222 211 image = file_dir + "/images/ansto_logo.png" 223 212 if os.path.isfile(config._ansto_logo): … … 225 214 logo = wx.Bitmap(image) 226 215 self.bitmap_button_ansto.SetBitmapLabel(logo) 227 216 228 217 image = file_dir + "/images/tudelft_logo.png" 229 218 if os.path.isfile(config._tudelft_logo): … … 231 220 logo = wx.Bitmap(image) 232 221 self.bitmap_button_tudelft.SetBitmapLabel(logo) 233 222 234 223 image = file_dir + "/images/dls_logo.png" 235 224 if os.path.isfile(config._dls_logo): … … 237 226 logo = wx.Bitmap(image) 238 227 self.bitmap_button_dls.SetBitmapLabel(logo) 239 228 240 229 # resize dialog window to fit version number nicely 241 230 if wx.VERSION >= (2, 7, 2, 0): … … 244 233 size = [self.GetBestFittingSize()[0], self.GetSize()[1]] 245 234 self.Fit() 246 235 247 236 def __set_properties(self): 248 237 """ … … 310 299 sizer_main.Add(self.static_line_2, 0, wx.EXPAND, 0) 311 300 312 sizer_logos.Add(self.bitmap_button_msu, 0, 301 sizer_logos.Add(self.bitmap_button_msu, 0, 313 302 wx.LEFT|wx.ADJUST_MINSIZE, 2) 314 303 #sizer_logos.Add(self.bitmap_button_danse, 0, 315 304 # wx.LEFT|wx.ADJUST_MINSIZE, 2) 316 #sizer_logos.Add(self.bitmap_button_nsf, 0, 305 #sizer_logos.Add(self.bitmap_button_nsf, 0, 317 306 # wx.LEFT|wx.ADJUST_MINSIZE, 2) 318 sizer_logos.Add(self.bitmap_button_umd, 0, 319 wx.LEFT|wx.ADJUST_MINSIZE, 2) 320 sizer_logos.Add(self.bitmap_button_nist, 0, 321 wx.LEFT|wx.ADJUST_MINSIZE, 2) 322 #sizer_logos.Add(self.bitmap_button_sns, 0, 307 sizer_logos.Add(self.bitmap_button_umd, 0, 308 wx.LEFT|wx.ADJUST_MINSIZE, 2) 309 sizer_logos.Add(self.bitmap_button_nist, 0, 310 wx.LEFT|wx.ADJUST_MINSIZE, 2) 311 #sizer_logos.Add(self.bitmap_button_sns, 0, 323 312 # wx.LEFT|wx.ADJUST_MINSIZE, 2) 324 sizer_logos.Add(self.bitmap_button_ornl, 0, 325 wx.LEFT|wx.ADJUST_MINSIZE, 2) 326 sizer_logos.Add(self.bitmap_button_isis, 0, 327 wx.LEFT|wx.ADJUST_MINSIZE, 2) 328 sizer_logos.Add(self.bitmap_button_ess, 0, 329 wx.LEFT|wx.ADJUST_MINSIZE, 2) 330 sizer_logos.Add(self.bitmap_button_ill, 0, 331 wx.LEFT|wx.ADJUST_MINSIZE, 2) 332 sizer_logos.Add(self.bitmap_button_ansto, 0, 333 wx.LEFT|wx.ADJUST_MINSIZE, 2) 334 sizer_logos.Add(self.bitmap_button_tudelft, 0, 335 wx.LEFT|wx.ADJUST_MINSIZE, 2) 336 sizer_logos.Add(self.bitmap_button_dls, 0, 337 wx.LEFT|wx.ADJUST_MINSIZE, 2) 338 313 sizer_logos.Add(self.bitmap_button_ornl, 0, 314 wx.LEFT|wx.ADJUST_MINSIZE, 2) 315 sizer_logos.Add(self.bitmap_button_isis, 0, 316 wx.LEFT|wx.ADJUST_MINSIZE, 2) 317 sizer_logos.Add(self.bitmap_button_ess, 0, 318 wx.LEFT|wx.ADJUST_MINSIZE, 2) 319 sizer_logos.Add(self.bitmap_button_ill, 0, 320 wx.LEFT|wx.ADJUST_MINSIZE, 2) 321 sizer_logos.Add(self.bitmap_button_ansto, 0, 322 wx.LEFT|wx.ADJUST_MINSIZE, 2) 323 sizer_logos.Add(self.bitmap_button_tudelft, 0, 324 wx.LEFT|wx.ADJUST_MINSIZE, 2) 325 sizer_logos.Add(self.bitmap_button_dls, 0, 326 wx.LEFT|wx.ADJUST_MINSIZE, 2) 327 339 328 sizer_logos.Add((10, 50), 0, wx.ADJUST_MINSIZE, 0) 340 329 sizer_main.Add(sizer_logos, 0, wx.EXPAND, 0) 341 330 sizer_main.Add(self.static_line_3, 0, wx.EXPAND, 0) 342 331 sizer_button.Add((20, 40), 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) 343 sizer_button.Add(self.button_OK, 0, 332 sizer_button.Add(self.button_OK, 0, 344 333 wx.RIGHT|wx.ADJUST_MINSIZE|wx.CENTER, 10) 345 334 sizer_main.Add(sizer_button, 0, wx.EXPAND, 0) … … 350 339 # end wxGlade 351 340 352 def onNistLogo(self, event): 341 def onNistLogo(self, event): 353 342 """ 354 343 """ … … 356 345 launchBrowser(config._nist_url) 357 346 event.Skip() 358 359 def onUmdLogo(self, event): 347 348 def onUmdLogo(self, event): 360 349 """ 361 350 """ … … 363 352 launchBrowser(config._umd_url) 364 353 event.Skip() 365 366 def onOrnlLogo(self, event): 354 355 def onOrnlLogo(self, event): 367 356 """ 368 357 """ … … 370 359 launchBrowser(config._ornl_url) 371 360 event.Skip() 372 373 def onSnsLogo(self, event): 361 362 def onSnsLogo(self, event): 374 363 """ 375 364 """ … … 377 366 launchBrowser(config._sns_url) 378 367 event.Skip() 379 380 def onNsfLogo(self, event): 368 369 def onNsfLogo(self, event): 381 370 """ 382 371 """ … … 394 383 def onUTLogo(self, event): 395 384 """ 396 """ 385 """ 397 386 # wxGlade: DialogAbout.<event_handler> 398 387 launchBrowser(config._inst_url) 399 388 event.Skip() 400 389 401 def onIsisLogo(self, event): 390 def onIsisLogo(self, event): 402 391 """ 403 392 """ … … 415 404 def onIllLogo(self, event): 416 405 """ 417 """ 406 """ 418 407 # wxGlade: DialogAbout.<event_handler> 419 408 launchBrowser(config._ill_url) … … 422 411 def onAnstoLogo(self, event): 423 412 """ 424 """ 413 """ 425 414 # wxGlade: DialogAbout.<event_handler> 426 415 launchBrowser(config._ansto_url) … … 429 418 def onTudelftLogo(self, event): 430 419 """ 431 """ 420 """ 432 421 # wxGlade: DialogAbout.<event_handler> 433 422 launchBrowser(config._tudelft_url) … … 436 425 def onDlsLogo(self, event): 437 426 """ 438 """ 427 """ 439 428 # wxGlade: DialogAbout.<event_handler> 440 429 launchBrowser(config._dls_url) … … 462 451 app = MyApp(0) 463 452 app.MainLoop() 464 465 ##### end of testing code ##################################################### 453 454 ##### end of testing code ##################################################### -
src/sas/sasgui/guiframe/acknowledgebox.py
r74c8cd0 r914ba0a 12 12 import wx.lib.hyperlink 13 13 from wx.lib.expando import ExpandoTextCtrl 14 import random15 import os.path16 import os17 try:18 # Try to find a local config19 import imp20 path = os.getcwd()21 if(os.path.isfile("%s/%s.py" % (path, 'local_config'))) or \22 (os.path.isfile("%s/%s.pyc" % (path, 'local_config'))):23 fObj, path, descr = imp.find_module('local_config', [path])24 config = imp.load_module('local_config', fObj, path, descr)25 else:26 # Try simply importing local_config27 import local_config as config28 except:29 # Didn't find local config, load the default30 import config31 14 15 from sas.sasgui import get_local_config 16 config = get_local_config() 32 17 33 18 class DialogAcknowledge(wx.Dialog): -
src/sas/sasgui/guiframe/config.py
ra1b8fee rc6bdb3b 1 1 """ 2 2 Application settings 3 3 """ 4 4 from __future__ import print_function … … 6 6 import time 7 7 import os 8 import logging 9 8 10 from sas.sasgui.guiframe.gui_style import GUIFRAME 9 11 import sas.sasview 10 import logging11 12 12 13 13 logger = logging.getLogger(__name__) … … 75 75 _ansto_logo = os.path.join(icon_path, "ansto_logo.png") 76 76 _tudelft_logo = os.path.join(icon_path, "tudelft_logo.png") 77 _dls_logo = os.path.join(icon_path, "dls_logo.png") 77 78 _nsf_logo = os.path.join(icon_path, "nsf_logo.png") 78 79 _danse_logo = os.path.join(icon_path, "danse_logo.png") … … 147 148 SAS_OPENCL = None 148 149 150 # Time out for updating sasview 151 UPDATE_TIMEOUT = 2 152 149 153 def printEVT(message): 150 154 if __EVT_DEBUG__: -
src/sas/sasgui/guiframe/customdir.py
r959eb01 rc6bdb3b 1 1 # Setup and find Custom config dir 2 from __future__ import print_function 3 2 4 import os.path 5 import logging 3 6 import shutil 4 7 5 CONF_DIR = 'config' 6 APPLICATION_NAME = 'sasview' 8 from sasmodels.custom import load_module_from_path 7 9 8 def _find_usersasview_dir(): 9 """ 10 Find and return user/.sasview dir 11 """ 12 return os.path.join(os.path.expanduser("~"), ("." + APPLICATION_NAME)) 10 from sas.sasgui import get_custom_config_path, get_app_dir 13 11 14 def _find_customconf_dir(): 15 """ 16 Find path of the config directory. 17 The plugin directory is located in the user's home directory. 18 """ 19 u_dir = _find_usersasview_dir() 20 return os.path.join(u_dir, CONF_DIR) 12 logger = logging.getLogger(__name__) 21 13 22 def _setup_conf_dir(path): 14 _config_cache = None 15 def setup_custom_config(): 23 16 """ 24 17 Setup the custom config dir and cat file 25 18 """ 26 conf_dir = _find_customconf_dir() 27 # If the plugin directory doesn't exist, create it 28 if not os.path.isdir(conf_dir): 29 os.makedirs(conf_dir) 30 config_file = os.path.join(conf_dir, "custom_config.py") 31 32 # Place example user models as needed 33 try: 34 if not os.path.isfile(config_file): 35 shutil.copyfile(os.path.join(path, "custom_config.py"), config_file) 36 37 #Adding SAS_OPENCL if it doesn't exist in the config file 38 # - to support backcompability 39 if not "SAS_OPENCL" in open(config_file).read(): 40 open(config_file,"a+").write("SAS_OPENCL = \"None\"\n") 41 except: 42 # Check for data path next to exe/zip file. 43 #Look for maximum n_dir up of the current dir to find plugins dir 44 n_dir = 12 45 is_dir = False 46 f_dir = path 47 for i in range(n_dir): 48 if i > 1: 49 f_dir, _ = os.path.split(f_dir) 50 temp_path = os.path.join(f_dir, "custom_config.py") 51 if os.path.isfile(temp_path): 52 shutil.copyfile(temp_path, config_file) 53 is_dir = True 54 break 55 if not is_dir: 56 raise 57 return conf_dir 19 global _config_cache 20 if not _config_cache: 21 _config_cache = _setup_custom_config() 22 return _config_cache 58 23 59 24 60 class SetupCustom(object): 61 """ 62 implement custom config dir 63 """ 64 def find_dir(self): 65 return _find_customconf_dir() 66 67 def setup_dir(self, path): 68 return _setup_conf_dir(path) 25 def _setup_custom_config(): 26 path = get_custom_config_path() 27 if not os.path.isfile(path): 28 try: 29 # if the custom config file does not exist, copy the default from 30 # the app dir 31 shutil.copyfile(os.path.join(get_app_dir(), "custom_config.py"), 32 path) 33 except Exception: 34 logger.error("Could not copy default custom config.") 35 36 #Adding SAS_OPENCL if it doesn't exist in the config file 37 # - to support backcompability 38 if not "SAS_OPENCL" in open(path).read(): 39 try: 40 open(config_file, "a+").write("SAS_OPENCL = \"None\"\n") 41 except Exception: 42 logger.error("Could not update custom config with SAS_OPENCL.") 43 44 custom_config = _load_config(path) 45 return custom_config 46 47 48 def _load_config(path): 49 if os.path.exists(path): 50 try: 51 module = load_module_from_path('sas.sasview.custom_config', path) 52 logger.info("GuiManager loaded %s", path) 53 return module 54 except Exception as exc: 55 logger.error("Error loading %s: %s", path, exc) 56 57 from sas.sasview import custom_config 58 logger.info("GuiManager custom_config defaults to sas.sasview.custom_config") 59 return custom_config -
src/sas/sasgui/guiframe/data_panel.py
ra1b8fee rc6bdb3b 33 33 from sas.sasgui.guiframe.local_perspectives.plotting.SimplePlot \ 34 34 import PlotFrame as QucikPlotDialog 35 import sas.sasgui.guiframe.config as config 35 from sas.sasgui import get_local_config 36 37 config = get_local_config() 36 38 37 39 # Check version -
src/sas/sasgui/guiframe/documentation_window.py
r959eb01 rd66dbcc 16 16 import os 17 17 import logging 18 import wx19 18 import webbrowser 20 19 import urllib 21 20 import sys 22 21 22 import wx 23 try: 24 import wx.html2 as html 25 WX_SUPPORTS_HTML2 = True 26 except: 27 WX_SUPPORTS_HTML2 = False 28 29 from sas.sasgui import get_app_dir 30 23 31 logger = logging.getLogger(__name__) 24 32 25 33 SPHINX_DOC_ENV = "SASVIEW_DOC_PATH" 26 WX_SUPPORTS_HTML2 = True27 try:28 import wx.html2 as html29 except:30 WX_SUPPORTS_HTML2 = False31 32 33 from gui_manager import get_app_dir34 35 34 36 35 class DocumentationWindow(wx.Frame): -
src/sas/sasgui/guiframe/gui_manager.py
r2f22db9 r914ba0a 22 22 import re 23 23 import logging 24 import httplib25 24 import traceback 26 25 import urllib 27 import urllib228 26 import json 29 27 28 from matplotlib import _pylab_helpers 29 30 from sas.sasgui import get_local_config, get_app_dir, get_user_dir 30 31 from sas.sasgui.guiframe.events import EVT_CATEGORY 31 32 from sas.sasgui.guiframe.events import EVT_STATUS … … 46 47 from sas.sascalc.dataloader.loader import Loader 47 48 from sas.sasgui.guiframe.proxy import Connection 48 from matplotlib import _pylab_helpers49 from sas.sasgui.guiframe.customdir import setup_custom_config 49 50 50 51 logger = logging.getLogger(__name__) 51 52 52 warnings.simplefilter("ignore") 53 53 54 def get_app_dir(): 55 """ 56 The application directory is the one where the default custom_config.py 57 file resides. 58 59 :returns: app_path - the path to the applicatin directory 60 """ 61 # First, try the directory of the executable we are running 62 app_path = sys.path[0] 63 if os.path.isfile(app_path): 64 app_path = os.path.dirname(app_path) 65 if os.path.isfile(os.path.join(app_path, "custom_config.py")): 66 app_path = os.path.abspath(app_path) 67 logger.info("Using application path: %s", app_path) 68 return app_path 69 70 # Next, try the current working directory 71 if os.path.isfile(os.path.join(os.getcwd(), "custom_config.py")): 72 logger.info("Using application path: %s", os.getcwd()) 73 return os.path.abspath(os.getcwd()) 74 75 # Finally, try the directory of the sasview module 76 # TODO: gui_manager will have to know about sasview until we 77 # clean all these module variables and put them into a config class 78 # that can be passed by sasview.py. 79 logger.debug(sys.executable) 80 logger.debug(str(sys.argv)) 81 from sas import sasview as sasview 82 app_path = os.path.dirname(sasview.__file__) 83 logger.debug("Using application path: %s", app_path) 84 return app_path 85 86 87 def get_user_directory(): 88 """ 89 Returns the user's home directory 90 """ 91 userdir = os.path.join(os.path.expanduser("~"), ".sasview") 92 if not os.path.isdir(userdir): 93 os.makedirs(userdir) 94 return userdir 95 96 97 def _find_local_config(file, path): 98 """ 99 Find configuration file for the current application 100 """ 101 config_module = None 102 fObj = None 103 try: 104 fObj, path_config, descr = imp.find_module(file, [path]) 105 config_module = imp.load_module(file, fObj, path_config, descr) 106 except: 107 logger.error("Error loading %s/%s: %s" % (path, file, sys.exc_value)) 108 finally: 109 if fObj is not None: 110 fObj.close() 111 logger.debug("GuiManager loaded %s/%s" % (path, file)) 112 return config_module 113 114 # Get APP folder 115 PATH_APP = get_app_dir() 116 DATAPATH = PATH_APP 117 118 # GUI always starts from the App folder 119 # os.chdir(PATH_APP) 120 # Read in the local config, which can either be with the main 121 # application or in the installation directory 122 config = _find_local_config('local_config', PATH_APP) 123 if config is None: 124 config = _find_local_config('local_config', os.getcwd()) 125 if config is None: 126 # Didn't find local config, load the default 127 import sas.sasgui.guiframe.config as config 128 logger.debug("using default local_config") 129 else: 130 logger.debug("found local_config in %s" % os.getcwd()) 131 else: 132 logger.debug("found local_config in %s" % PATH_APP) 133 134 from sas.sasgui.guiframe.customdir import SetupCustom 135 c_conf_dir = SetupCustom().setup_dir(PATH_APP) 136 custom_config = _find_local_config('custom_config', c_conf_dir) 137 if custom_config is None: 138 custom_config = _find_local_config('custom_config', os.getcwd()) 139 if custom_config is None: 140 msgConfig = "Custom_config file was not imported" 141 logger.debug(msgConfig) 142 else: 143 logger.debug("using custom_config in %s" % os.getcwd()) 144 else: 145 logger.debug("using custom_config from %s" % c_conf_dir) 54 config = get_local_config() 55 custom_config = setup_custom_config() 146 56 147 57 # read some constants from config … … 177 87 DEFAULT_OPEN_FOLDER = os.path.abspath(open_folder) 178 88 else: 179 DEFAULT_OPEN_FOLDER = PATH_APP89 DEFAULT_OPEN_FOLDER = get_app_dir() 180 90 SAS_OPENCL = custom_config.SAS_OPENCL 181 91 except: … … 192 102 DEFAULT_PERSPECTIVE = None 193 103 CLEANUP_PLOT = False 104 DEFAULT_OPEN_FOLDER = get_app_dir() 194 105 DEFAULT_OPEN_FOLDER = PATH_APP 195 106 SAS_OPENCL = None … … 265 176 if os.path.isfile(ico_file): 266 177 self.SetIcon(wx.Icon(ico_file, wx.BITMAP_TYPE_ICO)) 267 self.path = PATH_APP178 self.path = get_app_dir() 268 179 self.application_name = APPLICATION_NAME 269 180 # Application manager … … 540 451 try: 541 452 fd = open(file_name, 'w') 542 except :453 except Exception: 543 454 # On Permission denied: IOError 544 temp_dir = get_user_dir ectory()455 temp_dir = get_user_dir() 545 456 temp_file_name = os.path.join(temp_dir, name) 546 457 fd = open(temp_file_name, 'w') … … 1532 1443 # want Analysis. This is NOT an issue on the Mac which does not 1533 1444 # have the extra Window menu item. 1534 # March 2016 Code Camp -- PDB 1445 # March 2016 Code Camp -- PDB 1535 1446 Tools_pos = self._menubar.FindMenu("Tools") 1536 1447 self._menubar.Insert(Tools_pos+1, self._applications_menu, … … 2163 2074 logger.info("Failed to connect to www.sasview.org") 2164 2075 self._process_version(version_info, standalone=event is None) 2076 2165 2077 2166 2078 def _process_version(self, version_info, standalone=True): … … 3351 3263 if basename.lower() in [app_py, app_exe, app_app, app_base]: 3352 3264 data_base = sys.argv[1] 3353 input_file = os.path.normpath(os.path.join( DATAPATH,3265 input_file = os.path.normpath(os.path.join(get_app_dir(), 3354 3266 data_base)) 3355 3267 if input_file is None: … … 3366 3278 # do it only the first time app loaded 3367 3279 # delete unused model folder 3368 model_folder = os.path.join( PATH_APP, path)3280 model_folder = os.path.join(get_app_dir(), path) 3369 3281 if os.path.exists(model_folder) and os.path.isdir(model_folder): 3370 3282 if len(os.listdir(model_folder)) > 0: -
src/sas/sasgui/guiframe/local_perspectives/data_loader/data_loader.py
r235f514 r914ba0a 11 11 12 12 from sas.sascalc.dataloader.loader import Loader 13 14 from sas.sasgui import get_local_config 13 15 from sas.sasgui.guiframe.plugin_base import PluginBase 14 16 from sas.sasgui.guiframe.events import StatusEvent 15 17 from sas.sasgui.guiframe.gui_style import GUIFRAME 16 18 from sas.sasgui.guiframe.gui_manager import DEFAULT_OPEN_FOLDER 17 try: 18 # Try to find a local config 19 import imp 20 path = os.getcwd() 21 if(os.path.isfile("%s/%s.py" % (path, 'local_config'))) or \ 22 (os.path.isfile("%s/%s.pyc" % (path, 'local_config'))): 23 fObj, path, descr = imp.find_module('local_config', [path]) 24 config = imp.load_module('local_config', fObj, path, descr) 25 else: 26 # Try simply importing local_config 27 import local_config as config 28 except: 29 # Didn't find local config, load the default 30 import sas.sasgui.guiframe.config as config 31 32 if config is None: 33 import sas.sasgui.guiframe.config as config 34 35 19 20 config = get_local_config() 36 21 extension_list = [] 37 22 if config.APPLICATION_STATE_EXTENSION is not None: -
src/sas/sasgui/guiframe/startup_configuration.py
r7432acb r914ba0a 1 2 1 ################################################################################ 3 2 #This software was developed by the University of Tennessee as part of the 4 3 #Distributed Data Analysis of Neutron Scattering Experiments (DANSE) 5 #project funded by the US National Science Foundation. 4 #project funded by the US National Science Foundation. 6 5 # 7 6 #See the license text in license.txt … … 9 8 #copyright 2009, University of Tennessee 10 9 ################################################################################ 10 import os 11 import copy 12 11 13 import wx 12 import os 13 import sys 14 import copy 15 #import sas.sasgui.guiframe.gui_manager as gui 16 from sas.sasgui.guiframe.events import StatusEvent 14 15 from sas.sasgui import get_custom_config_path 16 from sas.sasgui.guiframe.events import StatusEvent 17 17 from sas.sasgui.guiframe.gui_style import GUIFRAME 18 18 from sas.sasgui.guiframe import gui_manager as CURRENT 19 from sas.sasgui.guiframe.customdir import SetupCustom 19 20 20 21 # default configuration 21 22 DEFAULT_STRINGS = {'GUIFRAME_WIDTH':-1, … … 62 63 """ 63 64 def __init__(self, parent, gui, id=-1, title="Startup Setting"): 64 wx.Dialog.__init__(self, parent, id, title, 65 wx.Dialog.__init__(self, parent, id, title, 65 66 size=(PANEL_WIDTH, PANEL_HEIGHT)) 66 67 # parent 67 68 self.parent = parent 68 self.path = SetupCustom().find_dir()69 69 self._gui = gui 70 # font size 70 # font size 71 71 self.SetWindowVariant(variant=FONT_VARIANT) 72 72 self.current_string = copy.deepcopy(CURRENT_STRINGS) … … 76 76 title_text = wx.StaticText(self, id=wx.NewId(), label='Set interface configuration') 77 77 78 default_bt = wx.RadioButton(self, -1, 'Default View', (15, 30), 78 default_bt = wx.RadioButton(self, -1, 'Default View', (15, 30), 79 79 style=wx.RB_GROUP) 80 80 default_bt.Bind(wx.EVT_RADIOBUTTON, self.OnDefault) … … 87 87 note_txt = wx.StaticText(self, -1, msg, (15, 75)) 88 88 note_txt.SetForegroundColour("black") 89 89 90 90 hbox = wx.BoxSizer(wx.HORIZONTAL) 91 91 okButton = wx.Button(self, wx.ID_OK, 'Set', size=(70, 25)) 92 closeButton = wx.Button(self, wx.ID_CANCEL, 'Cancel', size=(70, 25))92 closeButton = wx.Button(self, wx.ID_CANCEL, 'Cancel', size=(70, 25)) 93 93 hbox.Add(closeButton, 1, wx.RIGHT, 5) 94 94 hbox.Add(okButton, 1, wx.RIGHT, 5) … … 102 102 self.SetSizer(vbox) 103 103 104 104 105 105 def OnDefault(self, event=None): 106 106 """ … … 111 111 self.return_string = copy.deepcopy(DEFAULT_STRINGS) 112 112 return self.return_string 113 113 114 114 def OnCurrent(self, event=None): 115 115 """ … … 134 134 p_size = CURRENT_STRINGS['PLOPANEL_WIDTH'] 135 135 self.current_string['PLOPANEL_WIDTH'] = p_size 136 136 137 137 try: 138 138 control_frame = self.parent.get_current_perspective().frame … … 143 143 self.current_string['CONTROL_WIDTH'] = -1 144 144 self.current_string['CONTROL_HEIGHT'] = -1 145 145 146 146 data_pw, _ = self.parent.panels["data_panel"].frame.GetSizeTuple() 147 147 if data_pw is None: 148 148 data_pw = CURRENT_STRINGS['DATAPANEL_WIDTH'] 149 149 self.current_string['DATAPANEL_WIDTH'] = data_pw 150 150 151 151 #label = self.parent._data_panel_menu.GetText() 152 152 label = self.parent.panels['data_panel'].frame.IsShown() … … 155 155 else: 156 156 self.current_string['DATALOADER_SHOW'] = False 157 157 158 158 if self.parent._toolbar.IsShown(): 159 159 self.current_string['TOOLBAR_SHOW'] = True 160 160 else: 161 161 self.current_string['TOOLBAR_SHOW'] = False 162 162 163 163 style = self._gui & GUIFRAME.FLOATING_PANEL 164 if style == GUIFRAME.FLOATING_PANEL: 164 if style == GUIFRAME.FLOATING_PANEL: 165 165 self.current_string['FIXED_PANEL'] = False 166 166 else: 167 167 self.current_string['FIXED_PANEL'] = True 168 168 169 169 if self.parent.panels['default'].frame.IsShown(): 170 170 self.current_string['WELCOME_PANEL_SHOW'] = True … … 182 182 self.current_string['DEFAULT_OPEN_FOLDER'] = location 183 183 #self.parent._default_save_location.ascii_letters 184 184 185 185 except: 186 186 raise … … 188 188 self.return_string = self.current_string 189 189 return self.return_string 190 190 191 191 192 def write_custom_config(self): 192 193 """ 193 Write custom configuration 194 """ 195 fname = os.path.join(self.path, 'custom_config.py') 196 self.write_string(fname, self.return_string) 197 198 def write_string(self, fname, strings): 199 """ 200 Write and Save file 201 """ 202 203 try: 204 out_f = open(fname,'w') 205 except : 206 raise #RuntimeError, "Error: Can not change the configuration..." 207 out_f.write("#Application appearance custom configuration\n" ) 208 for key, item in strings.iteritems(): 209 if (key == 'DEFAULT_PERSPECTIVE') or \ 210 (key == 'DEFAULT_OPEN_FOLDER' and item is not None): 211 out_f.write("%s = \"%s\"\n" % (key,str(item))) 212 else: 213 out_f.write("%s = %s\n" % (key,str(item))) 214 215 out_f.close() 216 194 Write custom configuration 195 """ 196 path = get_custom_config_path() 197 with open(path, 'w') as out_f: 198 out_f.write("#Application appearance custom configuration\n") 199 for key, item in self.return_string.iteritems(): 200 if (key == 'DEFAULT_PERSPECTIVE') or \ 201 (key == 'DEFAULT_OPEN_FOLDER' and item != None): 202 out_f.write("%s = \"%s\"\n" % (key, str(item))) 203 else: 204 out_f.write("%s = %s\n" % (key, str(item))) -
src/sas/sasgui/plottools/__init__.py
rd7bb526 refe730d 1 import config2 1 from PlotPanel import PlotPanel 3 2 from plottables import Data1D, Theory1D
Note: See TracChangeset
for help on using the changeset viewer.