Skip to content

Commit d387b49

Browse files
committed
Bring loggin branch up to date
Merge remote-tracking branch 'origin/main' into logging
2 parents edf5b25 + b7bdb8b commit d387b49

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+407
-325
lines changed

GSASII/GSASIIctrlGUI.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6706,6 +6706,7 @@ def __init__(self,parent):
67066706
self.vars = GetConfigValsDocs()
67076707
self.G2frame = parent
67086708
self.restart = False
6709+
self.reload = False
67096710

67106711
label = wx.StaticText(
67116712
self, wx.ID_ANY,
@@ -6754,6 +6755,8 @@ def OnChange(self,event=None):
67546755
self.saveBtn.Enable(True)
67556756
if 'restart' in self.vars[var][3].lower():
67566757
self.restart = True
6758+
elif 'reload' in self.vars[var][3].lower():
6759+
self.reload = True
67576760
break
67586761
else:
67596762
self.saveBtn.Enable(False)

GSASII/GSASIIdataGUI.py

Lines changed: 35 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -2487,6 +2487,7 @@ def OnPreferences(self,event):
24872487
try:
24882488
dlg.ShowModal() == wx.ID_OK
24892489
restart = dlg.restart
2490+
reload = dlg.reload
24902491
finally:
24912492
dlg.Destroy()
24922493
# trigger a restart if the var description asks for that
@@ -2517,6 +2518,11 @@ def OnPreferences(self,event):
25172518
print ('exiting GSAS-II')
25182519
if hasattr(self,'logger'): self.PopEventHandler()
25192520
sys.exit()
2521+
if reload:
2522+
ans = self.OnFileSave(None)
2523+
if not ans: return
2524+
self.clearProject() # clear out data tree
2525+
self.StartProject()
25202526

25212527
def _Add_ImportMenu_smallangle(self,parent):
25222528
'''configure the Small Angle Data menus accord to the readers found in _init_Imports
@@ -3466,61 +3472,15 @@ def CheckNotebook(self):
34663472
if new:
34673473
self.GPXtree.Expand(self.GPXtree.root)
34683474

3469-
class CopyDialog(wx.Dialog):
3470-
'''Creates a dialog for copying control settings between
3471-
data tree items'''
3472-
def __init__(self,parent,title,text,data):
3473-
wx.Dialog.__init__(self,parent,-1,title,
3474-
pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
3475-
self.data = data
3476-
panel = wx.Panel(self)
3477-
mainSizer = wx.BoxSizer(wx.VERTICAL)
3478-
topLabl = wx.StaticText(panel,-1,text)
3479-
mainSizer.Add((10,10),1)
3480-
mainSizer.Add(topLabl,0,wx.ALIGN_CENTER_VERTICAL|wx.LEFT,10)
3481-
mainSizer.Add((10,10),1)
3482-
ncols = len(data)/40+1
3483-
dataGridSizer = wx.FlexGridSizer(cols=ncols,hgap=2,vgap=2)
3484-
for Id,item in enumerate(self.data):
3485-
ckbox = wx.CheckBox(panel,Id,item[1])
3486-
ckbox.Bind(wx.EVT_CHECKBOX,self.OnCopyChange)
3487-
dataGridSizer.Add(ckbox,0,wx.LEFT,10)
3488-
mainSizer.Add(dataGridSizer,0,wx.EXPAND)
3489-
OkBtn = wx.Button(panel,-1,"Ok")
3490-
OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
3491-
cancelBtn = wx.Button(panel,-1,"Cancel")
3492-
cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
3493-
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
3494-
btnSizer.Add((20,20),1)
3495-
btnSizer.Add(OkBtn)
3496-
btnSizer.Add((20,20),1)
3497-
btnSizer.Add(cancelBtn)
3498-
btnSizer.Add((20,20),1)
3499-
3500-
mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
3501-
panel.SetSizer(mainSizer)
3502-
panel.Fit()
3503-
self.Fit()
3504-
3505-
def OnCopyChange(self,event):
3506-
Id = event.GetId()
3507-
self.data[Id][0] = self.FindWindowById(Id).GetValue()
3508-
3509-
def OnOk(self,event):
3510-
parent = self.GetParent()
3511-
if parent is not None: parent.Raise()
3512-
self.EndModal(wx.ID_OK)
3513-
3514-
def OnCancel(self,event):
3515-
parent = self.GetParent()
3516-
if parent is not None: parent.Raise()
3517-
self.EndModal(wx.ID_CANCEL)
3518-
3519-
def GetData(self):
3520-
return self.data
3521-
35223475
class SumDialog(wx.Dialog):
3523-
'''Allows user to supply scale factor(s) when summing data
3476+
'''Used to sum images or powder patterns. Allows user to supply
3477+
scale factor(s) when summing data.
3478+
3479+
TODO: clean up the scrolling & resize on this dialog
3480+
Can we use the copy down button from CIF?
3481+
TODO: move it to GSASIIctrlGUI?
3482+
BHT: this class should not be in the middle of the (already too complex)
3483+
GSASIImain class.
35243484
'''
35253485
def __init__(self,parent,title,text,dataType,data,dataList,Limits=None):
35263486
wx.Dialog.__init__(self,parent,-1,title,size=(400,250),
@@ -4431,10 +4391,7 @@ def GetGPX():
44314391
GetGPX()
44324392
filename = self.GSASprojectfile
44334393
else:
4434-
try:
4435-
self.GSASprojectfile = os.path.splitext(filename)[0]+u'.gpx'
4436-
except:
4437-
self.GSASprojectfile = os.path.splitext(filename)[0]+'.gpx'
4394+
self.GSASprojectfile = os.path.splitext(filename)[0]+'.gpx'
44384395
self.dirname = os.path.split(filename)[0]
44394396

44404397
# if self.G2plotNB.plotList:
@@ -4568,21 +4525,25 @@ def OnFileClose(self, event):
45684525
self.OnFileSaveMenu(event)
45694526
if result != wx.ID_CANCEL:
45704527
self.GSASprojectfile = ''
4571-
self.GPXtree.SetItemText(self.root,'Project: ')
4572-
self.GPXtree.DeleteChildren(self.root)
4573-
self.dataWindow.ClearData()
4574-
if len(self.HKL):
4575-
self.HKL = np.array([])
4576-
self.Extinct = []
4577-
if self.G2plotNB.plotList:
4578-
self.G2plotNB.clear()
4579-
self.SetTitleByGPX()
4580-
self.EnableRefineCommand()
4581-
self.init_vars()
4582-
G2obj.IndexAllIds({},{}) # clear old index info
4528+
self.clearProject()
45834529
finally:
45844530
dlg.Destroy()
45854531

4532+
def clearProject(self):
4533+
'Initializes the data tree etc.'
4534+
self.GPXtree.SetItemText(self.root,'Project: ')
4535+
self.GPXtree.DeleteChildren(self.root)
4536+
self.dataWindow.ClearData()
4537+
if len(self.HKL):
4538+
self.HKL = np.array([])
4539+
self.Extinct = []
4540+
if self.G2plotNB.plotList:
4541+
self.G2plotNB.clear()
4542+
self.SetTitleByGPX()
4543+
self.EnableRefineCommand()
4544+
self.init_vars()
4545+
G2obj.IndexAllIds({},{}) # clear old index info
4546+
45864547
def OnFileSave(self, event):
45874548
'''Save the current project in response to the
45884549
File/Save Project menu button
@@ -9170,6 +9131,10 @@ def OnShowShift(event):
91709131
G2pdG.UpdateLimitsGrid(G2frame,data,datatype)
91719132
G2pwpl.PlotPatterns(G2frame,plotType=datatype,newPlot=True,fromTree=True)
91729133
elif G2frame.GPXtree.GetItemText(item) == 'Instrument Parameters':
9134+
# if GSASIIpath.GetConfigValue('debug'):
9135+
# from importlib import reload
9136+
# reload(G2pdG)
9137+
# print('reloading G2pwdGUI')
91739138
G2frame.PatternId = G2frame.GPXtree.GetItemParent(item)
91749139
data = G2frame.GPXtree.GetItemPyData(item)[0]
91759140
G2pdG.UpdateInstrumentGrid(G2frame,data)

GSASII/GSASIIddataGUI.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1522,6 +1522,8 @@ def OnDataApplyStrain(event):
15221522
HAPBook.AddPage(HAPtab,phaseName)
15231523
DData.append(HAPtab)
15241524
HAPBook.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED, OnPageChanged)
1525+
# must setup all Phase tabs to get the DataMenu
1526+
G2gd.SetDataMenuBar(G2frame,G2frame.dataWindow.DataGeneral)
15251527
# set up "Select tab" menu contents
15261528
G2gd.SetDataMenuBar(G2frame,G2frame.dataWindow.DataMenu)
15271529
mid = G2frame.dataWindow.DataMenu.FindMenu('Select tab')

GSASII/GSASIIpath.py

Lines changed: 16 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,51 +1132,25 @@ def exceptHook(*args):
11321132
11331133
This routine is only used when debug=True is set in the configuration settings
11341134
'''
1135-
try:
1136-
#from IPython.core import ultratb
1137-
import IPython.core.ultratb
1138-
except:
1139-
pass
1140-
1141-
try:
1142-
from IPython.terminal.embed import InteractiveShellEmbed
1143-
import IPython.core
1144-
if sys.platform.startswith('win'):
1145-
IPython.core.ultratb.FormattedTB(call_pdb=False,color_scheme='NoColor')(*args)
1146-
else:
1147-
IPython.core.ultratb.FormattedTB(call_pdb=False,color_scheme='LightBG')(*args)
1148-
from IPython.core import getipython
1149-
if getipython.get_ipython() is None:
1150-
ipshell = InteractiveShellEmbed.instance()
1151-
else:
1152-
ipshell = InteractiveShellEmbed()
1153-
except ImportError:
1154-
print ('IPython not installed or is really old')
1155-
return
1156-
except TypeError: # Ipython 9.x removes color_scheme
1157-
try:
1158-
IPython.core.ultratb.FormattedTB(call_pdb=False)(*args)
1159-
from IPython.core import getipython
1160-
if getipython.get_ipython() is None:
1161-
ipshell = InteractiveShellEmbed.instance()
1162-
else:
1163-
ipshell = InteractiveShellEmbed()
1164-
except Exception as msg:
1165-
print('IPython patch failed, msg=',msg)
1166-
import inspect
1167-
frame = inspect.getinnerframes(args[2])[-1][0]
1168-
msg = 'Entering IPython console at {0.f_code.co_filename} at line {0.f_lineno}\n'.format(frame)
1135+
import IPython.core
11691136
savehook = sys.excepthook # save the exception hook
1137+
# show the error
1138+
tb_formatter = IPython.core.ultratb.VerboseTB()
1139+
print(tb_formatter.text(*args))
1140+
# get the Ipython shell routine
1141+
if IPython.core.getipython.get_ipython() is None:
1142+
ipshell = IPython.terminal.embed.InteractiveShellEmbed.instance()
1143+
else:
1144+
ipshell = IPython.terminal.embed.InteractiveShellEmbed()
1145+
# get to the right frame
11701146
try:
1147+
import inspect
1148+
frame = inspect.getinnerframes(args[2])[-1][0]
1149+
msg = f'Entering IPython console at {frame.f_code.co_filename} at line {frame.f_lineno}\n'
11711150
ipshell(msg,local_ns=frame.f_locals,global_ns=frame.f_globals) # newest (IPython >= 8)
1172-
except DeprecationWarning: # IPython <=7
1173-
try: # IPython >=5
1174-
class c(object): pass
1175-
pseudomod = c() # create something that acts like a module
1176-
pseudomod.__dict__ = frame.f_locals
1177-
InteractiveShellEmbed(banner1=msg)(module=pseudomod,global_ns=frame.f_globals)
1178-
except: # 'IPython <5
1179-
InteractiveShellEmbed(banner1=msg)(local_ns=frame.f_locals,global_ns=frame.f_globals)
1151+
except:
1152+
msg = 'Entering IPython console (no contex)'
1153+
ipshell(msg)
11801154
sys.excepthook = savehook # reset IPython's change to the exception hook
11811155

11821156
def DoNothing():

GSASII/GSASIIphsGUI.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,7 +1560,7 @@ def updateAddRBorientText(G2frame,testRBObj,Bmat):
15601560
# sizer.SetValue(testRBObj['rbObj']['Orig'][0][i])
15611561
# redraw asymmetric unit when called on an existing body
15621562
if G2frame.testRBObjSizers.get('OnOrien') is None: return
1563-
G2frame.testRBObjSizers['OnOrien'](mode=testRBObj['rbObj']['drawMode'])
1563+
G2frame.testRBObjSizers['OnOrien'](mode=testRBObj['rbObj'].get('drawMode',DrawStyleChoice[4]))
15641564

15651565
def GetReflData(G2frame,phaseName,reflNames):
15661566
ReflData = {'RefList':[],'Type':''}
@@ -3020,15 +3020,15 @@ def _showWebPage(event):
30203020
with open(tmp.name,'w') as fp:
30213021
fp.write(txt.replace(
30223022
'<HEAD>',
3023-
'<head><base href="https://stokes.byu.edu/iso/">',
3023+
'<head><base href="https://iso.byu.edu/">',
30243024
))
30253025
fileList.append(tmp.name)
30263026
G2G.ShowWebPage('file://'+tmp.name,G2frame)
30273027
import tempfile
30283028
import re
30293029
import requests
30303030
from GSASII.exports import G2export_CIF
3031-
isosite="https://stokes.byu.edu/iso/"
3031+
isosite="https://iso.byu.edu/"
30323032
upscript='isocifuploadfile.php'
30333033
isoscript='isocifform.php'
30343034
isoSubCite = ('For use of this supergroup search, please cite:\n'+
@@ -3078,7 +3078,7 @@ def _showWebPage(event):
30783078
with open(tmp1.name,'w') as fp:
30793079
fp.write(r1.text.replace(
30803080
'<HEAD>',
3081-
'<head><base href="https://stokes.byu.edu/iso/">',
3081+
'<head><base href="https://iso.byu.edu/">',
30823082
))
30833083
G2G.ShowWebPage('file://'+tmp1.name,G2frame)
30843084
G2G.G2MessageBox(G2frame,

GSASII/GSASIIpwdGUI.py

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3227,6 +3227,15 @@ def onSelectX(event):
32273227
plotIndex['plotX'] = event.GetEventObject().rbindex
32283228
onPrmPlot(event)
32293229

3230+
def onCopySelRow(event):
3231+
row = event.GetEventObject().row
3232+
for i,h in enumerate(histnames):
3233+
if i == 0:
3234+
val = histdict[h][row][2]
3235+
else:
3236+
histdict[h][row][2] = val
3237+
wx.CallAfter(MakeMultiParameterWindow,selected)
3238+
32303239
def onPrmPlot(event):
32313240
'''Callback after a change to X or Y plot contents
32323241
plots multiple instrument param values vs selected X value.
@@ -3281,26 +3290,27 @@ def onPrmPlot(event):
32813290
parent = G2frame.dataWindow.topPanel
32823291
topSizer.Add(wx.StaticText(parent,wx.ID_ANY,lbl))
32833292
if hlist:
3284-
btn = wx.Button(parent, wx.ID_ANY,'Select\nHistograms')
3293+
btn = wx.Button(parent, wx.ID_ANY,'Select Histograms')
32853294
topSizer.Add(btn,0,wx.LEFT|wx.RIGHT,15)
32863295
btn.Bind(wx.EVT_BUTTON,onSelectHists)
3287-
topSizer.Add((20,-1))
3296+
topSizer.Add((20,-1),1,wx.EXPAND)
32883297
topSizer.Add(G2G.HelpButton(parent,helpIndex=G2frame.dataWindow.helpKey))
32893298
mainSizer = wx.BoxSizer(wx.VERTICAL)
32903299
G2frame.dataWindow.SetSizer(mainSizer)
32913300

32923301
# create table w/headers
32933302
sdlg = G2frame.dataWindow
3294-
fgs = wx.FlexGridSizer(0,len(histnames)+3,0,0)
3303+
fgs = wx.FlexGridSizer(0,len(histnames)+4,0,0)
32953304
fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,'plot\nas X'),0,wx.LEFT|wx.RIGHT,1)
32963305
fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,'plot\nas Y'),0,wx.LEFT|wx.RIGHT,1)
32973306
fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,'Histogram '),0,WACV|wx.LEFT,14)
32983307
for i,h in enumerate(histnames):
3299-
if len(h[:5].strip()) > 20:
3300-
fgs.Add(G2G.ScrolledStaticText(sdlg,label=h[5:],dots=False,lbllen=20),
3308+
if len(h[5:].strip()) > 15:
3309+
fgs.Add(G2G.ScrolledStaticText(sdlg,label=h[5:],dots=False,lbllen=15),
33013310
0,WACV|wx.LEFT|wx.RIGHT,5)
33023311
else:
33033312
fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,h[5:]),0,WACV|wx.LEFT|wx.RIGHT,5)
3313+
if i == 0: fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,'copy\nright'),0,wx.LEFT|wx.RIGHT,1)
33043314
firstRadio = wx.RB_GROUP
33053315
# put non-editable values at top of table (plot as x but not y)
33063316
keylist = ['num']
@@ -3320,14 +3330,15 @@ def onPrmPlot(event):
33203330
fgs.Add((-1,-1)) # skip y checkbutton
33213331
fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,lbl),0,WACV|wx.LEFT,14)
33223332
plotvals = []
3323-
for h in histnames:
3333+
for i,h in enumerate(histnames):
33243334
if key == 'num':
33253335
val = histnum[h]
33263336
else:
33273337
val = histdict[h][key][1]
33283338
fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,str(val)),
33293339
0,wx.ALIGN_CENTER|WACV,0)
33303340
plotvals.append(val)
3341+
if i == 0: fgs.Add((-1,-1)) # skip copy row button
33313342
plotTbl.append(plotvals)
33323343

33333344
# determine what items will be shown based on histogram type
@@ -3364,14 +3375,24 @@ def onPrmPlot(event):
33643375
plotIndex[k] = rb.rbindex
33653376
fgs.Add(wx.StaticText(sdlg,wx.ID_ANY,l),0,WACV|wx.LEFT,14)
33663377
plotvals = []
3367-
for h in histnames:
3378+
for i,h in enumerate(histnames):
33683379
miniSizer = wx.BoxSizer(wx.HORIZONTAL)
33693380
itemVal = G2G.ValidatedTxtCtrl(sdlg,histdict[h][k],1,nDig=(10,4),typeHint=float)
33703381
plotvals.append(histdict[h][k][1])
33713382
miniSizer.Add(itemVal)
33723383
miniSizer.Add((2,-1))
3373-
miniSizer.Add(G2G.G2CheckBox(sdlg,'',histdict[h][k],2),0,WACV|wx.RIGHT,15)
3374-
fgs.Add(miniSizer,0,wx.ALIGN_CENTER)
3384+
if i == 0:
3385+
miniSizer.Add(G2G.G2CheckBox(sdlg,'',histdict[h][k],2),0,WACV|wx.RIGHT,3)
3386+
fgs.Add(miniSizer,0,wx.ALIGN_RIGHT)
3387+
# copy row button
3388+
but = wx.Button(sdlg,wx.ID_ANY,'\u2192',style=wx.BU_EXACTFIT)
3389+
#but.SetBackgroundColour('yellow')
3390+
fgs.Add(but,0,wx.RIGHT,15)
3391+
but.Bind(wx.EVT_BUTTON, onCopySelRow)
3392+
but.row = k
3393+
else:
3394+
miniSizer.Add(G2G.G2CheckBox(sdlg,'',histdict[h][k],2),0,WACV|wx.RIGHT,15)
3395+
fgs.Add(miniSizer,0,wx.ALIGN_CENTER)
33753396
plotTbl.append(plotvals)
33763397

33773398
mainSizer.Add(fgs)
@@ -5185,15 +5206,15 @@ def _showWebPage(event):
51855206
txt = event.GetEventObject().page
51865207
tmp = tempfile.NamedTemporaryFile(suffix='.html',delete=False)
51875208
with open(tmp.name,'w') as fp:
5188-
fp.write(txt.replace('<HEAD>','<head><base href="https://stokes.byu.edu/">',))
5209+
fp.write(txt.replace('<HEAD>','<head><base href="https://iso.byu.edu/">',))
51895210
fileList.append(tmp.name)
51905211
G2G.ShowWebPage('file://'+tmp.name,G2frame)
51915212

51925213
def showWebtext(txt):
51935214
import tempfile
51945215
tmp = tempfile.NamedTemporaryFile(suffix='.html',delete=False)
51955216
with open(tmp.name,'w') as fp:
5196-
fp.write(txt.replace('<HEAD>','<head><base href="https://stokes.byu.edu/">',))
5217+
fp.write(txt.replace('<HEAD>','<head><base href="https://iso.byu.edu/">',))
51975218
fileList.append(tmp.name)
51985219
G2G.ShowWebPage('file://'+tmp.name,G2frame)
51995220

0 commit comments

Comments
 (0)