Coverage for /Users/Newville/Codes/xraylarch/larch/wxxrd/XRDMaskFrame.py: 16%

171 statements  

« prev     ^ index     » next       coverage.py v7.3.2, created at 2023-11-09 10:08 -0600

1#!/usr/bin/env pythonw 

2''' 

3popup for 2D XRD mask file 

4 

5''' 

6 

7import os 

8import numpy as np 

9 

10import wx 

11 

12from wxmplot.imagepanel import ImagePanel 

13from .ImageControlsFrame import ImageToolboxFrame 

14 

15from larch.io import tifffile 

16from larch.utils import get_cwd 

17# HAS_pyFAI = False 

18# try: 

19# import pyFAI 

20# import pyFAI.calibrant 

21# from pyFAI.calibration import Calibration 

22# HAS_pyFAI = True 

23# except ImportError: 

24# pass 

25 

26# HAS_fabio = False 

27# try: 

28# import fabio 

29# HAS_fabio = True 

30# except ImportError: 

31# pass 

32 

33################################### 

34 

35class MaskToolsPopup(wx.Frame): 

36 

37 def __init__(self,parent): 

38 

39 self.frame = wx.Frame.__init__(self, parent, title='Create mask',size=(800,600)) 

40 

41 self.parent = parent 

42 self.statusbar = self.CreateStatusBar(2,wx.CAPTION ) 

43 

44 try: 

45 self.raw_img = parent.plt_img ## raw_img or flp_img or plt_img mkak 2016.10.28 

46 except: 

47 self.loadIMAGE() 

48 

49 

50 self.setDefaults() 

51 

52 

53 self.Init() 

54 self.Show() 

55 

56# wx.Window.GetEffectiveMinSize 

57# wx.GetBestSize(self) 

58 

59 

60 def Init(self): 

61 

62 self.panel = wx.Panel(self) 

63 

64 self.MainSizer() 

65 

66 self.framebox = wx.BoxSizer(wx.VERTICAL) 

67 self.framebox.Add(self.mainbox, flag=wx.ALL|wx.EXPAND, border=10) 

68 

69 ########################### 

70 ## Pack all together in self.panel 

71 self.panel.SetSizer(self.framebox) 

72 

73 

74 def setDefaults(self): 

75 

76 self.area_list = [] 

77 

78 def MainSizer(self): 

79 

80 self.mainbox = wx.BoxSizer(wx.VERTICAL) 

81 

82 ########################### 

83 ## -----> Main Panel 

84 self.hmain = wx.BoxSizer(wx.HORIZONTAL) 

85 

86 self.ImageSizer() 

87 self.DrawNewSizer() 

88 

89 self.hmain.Add(self.imagebox,proportion=1,flag=wx.ALL|wx.EXPAND, border=10) 

90 self.hmain.Add(self.toolbox, flag=wx.ALL, border=10) 

91 

92 self.mainbox.Add(self.hmain, flag=wx.ALL|wx.EXPAND, border=10) 

93 

94 

95 def DrawNewSizer(self): 

96 

97 self.toolbox = wx.BoxSizer(wx.VERTICAL) 

98 

99 ########################### 

100 ## Directions 

101 nwbx = wx.StaticBox(self.panel,label='Drawing Tools', size=(100, 50)) 

102 drawbox = wx.StaticBoxSizer(nwbx,wx.VERTICAL) 

103 

104 ########################### 

105 ## Drawing tools 

106 hbox_shp = wx.BoxSizer(wx.HORIZONTAL) 

107 self.txt_shp = wx.StaticText(self.panel, label='DRAWING SHAPE') 

108 shapes = ['circle','pixel','polygon','square'] 

109 

110 self.ch_shp = wx.Choice(self.panel,choices=shapes) 

111 

112 self.ch_shp.Bind(wx.EVT_CHOICE,self.ShapeChoice) 

113 

114 hbox_shp.Add(self.txt_shp, flag=wx.RIGHT, border=8) 

115 hbox_shp.Add(self.ch_shp, flag=wx.EXPAND, border=8) 

116 

117 drawbox.Add(hbox_shp, flag=wx.ALL|wx.EXPAND, border=10) 

118 

119 ########################### 

120 ## Drawn Areas 

121 vbox_areas = wx.BoxSizer(wx.VERTICAL) 

122 hbox_areas = wx.BoxSizer(wx.HORIZONTAL) 

123 

124 self.slct_area = wx.ListBox(self.panel, 26, wx.DefaultPosition, (170, 130), self.area_list, wx.LB_SINGLE) 

125 

126 self.btn_SHWarea = wx.Button(self.panel,label='SHOW') 

127 self.btn_DELarea = wx.Button(self.panel,label='DELETE') 

128 

129 self.btn_SHWarea.Bind(wx.EVT_BUTTON,self.showAREA) 

130 self.btn_DELarea.Bind(wx.EVT_BUTTON,self.deleteAREA) 

131 

132 hbox_areas.Add(self.btn_SHWarea, flag=wx.BOTTOM, border=10) 

133 hbox_areas.Add(self.btn_DELarea, flag=wx.BOTTOM, border=10) 

134 

135 self.btn_clear = wx.Button(self.panel,label='CLEAR ALL') 

136 

137 self.btn_clear.Bind(wx.EVT_BUTTON,self.clearMask) 

138 

139 vbox_areas.Add(self.slct_area, flag=wx.ALL|wx.EXPAND, border=10) 

140 vbox_areas.Add(hbox_areas, flag=wx.ALL|wx.EXPAND, border=10) 

141 vbox_areas.Add(self.btn_clear, flag=wx.ALL|wx.EXPAND, border=10) 

142 drawbox.Add(vbox_areas, flag=wx.ALL|wx.EXPAND, border=10) 

143 

144 self.toolbox.Add(drawbox, flag=wx.ALL, border=10) 

145 

146 self.btn_save = wx.Button(self.panel,label='SAVE MASK') 

147 self.btn_save.Bind(wx.EVT_BUTTON,self.saveMask) 

148 self.toolbox.Add(self.btn_save, flag=wx.ALL, border=10) 

149 

150 self.btn_SHWarea.Disable() 

151 self.btn_DELarea.Disable() 

152 self.btn_clear.Disable() 

153 self.btn_save.Disable() 

154 

155 def startIMAGE(self): 

156 

157 self.loadIMAGE() 

158 

159 def loadIMAGE(self,event=None): 

160 wildcards = 'XRD image (*.edf,*.tif,*.tiff)|*.tif;*.tiff;*.edf|All files (*.*)|*.*' 

161 dlg = wx.FileDialog(self, message='Choose XRD image', 

162 defaultDir=get_cwd(), 

163 wildcard=wildcards, style=wx.FD_OPEN) 

164 

165 path, read = None, False 

166 if dlg.ShowModal() == wx.ID_OK: 

167 read = True 

168 path = dlg.GetPath().replace('\\', '/') 

169 dlg.Destroy() 

170 

171 if read: 

172 try: 

173# self.raw_img = plt.imread(path) 

174 self.raw_img = tifffile.imread(path) 

175 #self.raw_img = fabio.open(path).data 

176 except: 

177 print('Image not properly opened.') 

178 self.raw_img = np.zeros((1024,1024)) 

179 else: 

180 print('No image selected.') 

181 self.raw_img = np.zeros((1024,1024)) 

182 

183 def ImageSizer(self): 

184 ''' 

185 Image Panel 

186 ''' 

187 self.imagebox = wx.BoxSizer(wx.VERTICAL) 

188 

189 self.plot2Dimage() 

190 

191 imagetools = wx.BoxSizer(wx.HORIZONTAL) 

192 

193 self.btn_image = wx.Button(self.panel,label='IMAGE TOOLS') 

194 self.btn_load = wx.Button(self.panel,label='CHANGE IMAGE') 

195 

196 self.btn_image.Bind(wx.EVT_BUTTON,self.onImageTools) 

197 self.btn_load.Bind(wx.EVT_BUTTON,self.loadIMAGE) 

198 

199 imagetools.Add(self.btn_load, flag=wx.ALL, border=10) 

200 imagetools.Add(self.btn_image, flag=wx.ALL, border=10) 

201 

202 

203 self.imagebox.Add(self.plot2Dimg,proportion=1,flag=wx.ALL|wx.EXPAND, border=10) 

204 self.imagebox.Add(imagetools, flag=wx.ALL, border=10) 

205 

206 def write_message(self, s, panel=0): 

207 """write a message to the Status Bar""" 

208 self.SetStatusText(s, panel) 

209 

210 def onImageTools(self,event=None): 

211 

212 self.toolbox = ImageToolboxFrame(self.plot2Dimg,self.raw_img) 

213 

214 def plot2Dimage(self): 

215 

216 self.plot2Dimg = ImagePanel(self.panel)#,size=(300, 300)) 

217 self.plot2Dimg.messenger = self.write_message 

218 

219 self.Bind(wx.EVT_PAINT, self.OnPaint) 

220 

221 self.plot2Dimg.display(self.raw_img) 

222 self.AutoContrast() 

223 

224 self.plot2Dimg.redraw() 

225 

226 def AutoContrast(self): 

227 

228 self.minINT = int(np.min(self.raw_img)) 

229 self.maxINT = int(np.max(self.raw_img)/15) # /15 scales image to viewable 

230 if self.maxINT == self.minINT: 

231 self.minINT = self.minINT-50 

232 self.maxINT = self.minINT+100 

233 

234 self.minCURRENT = self.minINT 

235 self.maxCURRENT = self.maxINT 

236 if self.maxCURRENT > self.maxINT: 

237 self.maxCURRENT = self.maxINT 

238 

239 self.plot2Dimg.conf.auto_intensity = False 

240 self.plot2Dimg.conf.int_lo[0] = self.minCURRENT 

241 self.plot2Dimg.conf.int_hi[0] = self.maxCURRENT 

242# self.plot2Dimg.conf.int_lo['int'] = self.minCURRENT 

243# self.plot2Dimg.conf.int_hi['int'] = self.maxCURRENT 

244 

245 ## vertical flip default 

246 self.plot2Dimg.conf.flip_ud = True 

247 self.plot2Dimg.conf.flip_lr = False 

248 

249 self.plot2Dimg.redraw() 

250 

251 def ShapeChoice(self,event=None): 

252 

253 print('The shape you choose: %s' % self.ch_shp.GetString(self.ch_shp.GetSelection())) 

254 

255 print() 

256 print('Not implemented: ShapeChoice') 

257 self.addAREA() 

258 

259 

260 def OnPaint(self, event=None): 

261 

262 print('Shape : %s' % self.ch_shp.GetString(self.ch_shp.GetSelection())) 

263# dc = wx.PaintDC(self) 

264# dc.Clear() 

265# dc.SetPen(wx.Pen(wx.BLACK, 4)) 

266# dc.DrawLine(0, 0, 50, 50) 

267 

268 def clearMask(self,event=None): 

269 

270 print('Clearing the mask...') 

271 ## provide a warning message? 

272 self.area_list = [] 

273 self.slct_area.Set(self.area_list) 

274 

275 self.btn_SHWarea.Disable() 

276 self.btn_DELarea.Disable() 

277 self.btn_clear.Disable() 

278 self.btn_save.Disable() 

279 

280 

281 def saveMask(self,event=None): 

282 

283 print('This will trigger the saving of a mask.') 

284 

285 def addAREA(self,event=None): 

286 area_name = 'area %i (%s)' % (len(self.area_list),self.ch_shp.GetString(self.ch_shp.GetSelection())) 

287 self.area_list.append(area_name) 

288 self.slct_area.Set(self.area_list) 

289 

290 

291 if len(self.area_list) > 0: 

292 self.btn_SHWarea.Enable() 

293 self.btn_DELarea.Enable() 

294 self.btn_clear.Enable() 

295 self.btn_save.Enable() 

296 

297 def showAREA(self,event=None): 

298 

299 if len(self.area_list) > 0: 

300 area_str = self.slct_area.GetString(self.slct_area.GetSelection()) 

301 str_msg = 'Displaying: %s' % area_str 

302 self.write_message(str_msg,panel=0) 

303 

304 ## show area on map, image 

305 

306 def deleteAREA(self,event=None): 

307 

308 if len(self.area_list) > 0: 

309 area_str = self.slct_area.GetString(self.slct_area.GetSelection()) 

310 str_msg = 'Deleting: %s' % area_str 

311 self.write_message(str_msg,panel=0) 

312 

313 self.area_list.remove(self.slct_area.GetString(self.slct_area.GetSelection())) 

314 self.slct_area.Set(self.area_list) 

315 

316 if len(self.area_list) == 0: 

317 self.btn_SHWarea.Disable() 

318 self.btn_DELarea.Disable() 

319 self.btn_clear.Disable() 

320 self.btn_save.Disable() 

321 

322# class diFFit_XRDmask(wx.App): 

323# def __init__(self): 

324# wx.App.__init__(self) 

325# 

326# def run(self): 

327# self.MainLoop() 

328# 

329# def createApp(self): 

330# frame = MaskToolsPopup(None) 

331# frame.Show() 

332# self.SetTopWindow(frame) 

333# 

334# def OnInit(self): 

335# self.createApp() 

336# return True 

337# 

338# class DebugViewer(diFFit_XRDmask): 

339# def __init__(self, **kws): 

340# diFFit_XRDmask.__init__(self, **kws) 

341# 

342# def OnInit(self): 

343# #self.Init() 

344# self.createApp() 

345# #self.ShowInspectionTool() 

346# return True 

347# 

348# if __name__ == '__main__': 

349# diFFit_XRDmask().run()