Coverage for larch/wxxrd/XRDMaskFrame.py: 16%
170 statements
« prev ^ index » next coverage.py v7.6.0, created at 2024-10-16 21:04 +0000
« prev ^ index » next coverage.py v7.6.0, created at 2024-10-16 21:04 +0000
1#!/usr/bin/env python3
2'''
3popup for 2D XRD mask file
5'''
7import os
8import numpy as np
10import wx
12from wxmplot.imagepanel import ImagePanel
13from .ImageControlsFrame import ImageToolboxFrame
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
26# HAS_fabio = False
27# try:
28# import fabio
29# HAS_fabio = True
30# except ImportError:
31# pass
33###################################
35class MaskToolsPopup(wx.Frame):
37 def __init__(self,parent):
39 self.frame = wx.Frame.__init__(self, parent, title='Create mask',size=(800,600))
41 self.parent = parent
42 self.statusbar = self.CreateStatusBar(2,wx.CAPTION )
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()
50 self.setDefaults()
53 self.Init()
54 self.Show()
56# wx.Window.GetEffectiveMinSize
57# wx.GetBestSize(self)
60 def Init(self):
62 self.panel = wx.Panel(self)
64 self.MainSizer()
66 self.framebox = wx.BoxSizer(wx.VERTICAL)
67 self.framebox.Add(self.mainbox, flag=wx.ALL|wx.EXPAND, border=10)
69 ###########################
70 ## Pack all together in self.panel
71 self.panel.SetSizer(self.framebox)
74 def setDefaults(self):
76 self.area_list = []
78 def MainSizer(self):
80 self.mainbox = wx.BoxSizer(wx.VERTICAL)
82 ###########################
83 ## -----> Main Panel
84 self.hmain = wx.BoxSizer(wx.HORIZONTAL)
86 self.ImageSizer()
87 self.DrawNewSizer()
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)
92 self.mainbox.Add(self.hmain, flag=wx.ALL|wx.EXPAND, border=10)
95 def DrawNewSizer(self):
97 self.toolbox = wx.BoxSizer(wx.VERTICAL)
99 ###########################
100 ## Directions
101 nwbx = wx.StaticBox(self.panel,label='Drawing Tools', size=(100, 50))
102 drawbox = wx.StaticBoxSizer(nwbx,wx.VERTICAL)
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']
110 self.ch_shp = wx.Choice(self.panel,choices=shapes)
112 self.ch_shp.Bind(wx.EVT_CHOICE,self.ShapeChoice)
114 hbox_shp.Add(self.txt_shp, flag=wx.RIGHT, border=8)
115 hbox_shp.Add(self.ch_shp, flag=wx.EXPAND, border=8)
117 drawbox.Add(hbox_shp, flag=wx.ALL|wx.EXPAND, border=10)
119 ###########################
120 ## Drawn Areas
121 vbox_areas = wx.BoxSizer(wx.VERTICAL)
122 hbox_areas = wx.BoxSizer(wx.HORIZONTAL)
124 self.slct_area = wx.ListBox(self.panel, 26, wx.DefaultPosition, (170, 130), self.area_list, wx.LB_SINGLE)
126 self.btn_SHWarea = wx.Button(self.panel,label='SHOW')
127 self.btn_DELarea = wx.Button(self.panel,label='DELETE')
129 self.btn_SHWarea.Bind(wx.EVT_BUTTON,self.showAREA)
130 self.btn_DELarea.Bind(wx.EVT_BUTTON,self.deleteAREA)
132 hbox_areas.Add(self.btn_SHWarea, flag=wx.BOTTOM, border=10)
133 hbox_areas.Add(self.btn_DELarea, flag=wx.BOTTOM, border=10)
135 self.btn_clear = wx.Button(self.panel,label='CLEAR ALL')
137 self.btn_clear.Bind(wx.EVT_BUTTON,self.clearMask)
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)
144 self.toolbox.Add(drawbox, flag=wx.ALL, border=10)
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)
150 self.btn_SHWarea.Disable()
151 self.btn_DELarea.Disable()
152 self.btn_clear.Disable()
153 self.btn_save.Disable()
155 def startIMAGE(self):
157 self.loadIMAGE()
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)
165 path, read = None, False
166 if dlg.ShowModal() == wx.ID_OK:
167 read = True
168 path = dlg.GetPath().replace('\\', '/')
169 dlg.Destroy()
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))
183 def ImageSizer(self):
184 '''
185 Image Panel
186 '''
187 self.imagebox = wx.BoxSizer(wx.VERTICAL)
189 self.plot2Dimage()
191 imagetools = wx.BoxSizer(wx.HORIZONTAL)
193 self.btn_image = wx.Button(self.panel,label='IMAGE TOOLS')
194 self.btn_load = wx.Button(self.panel,label='CHANGE IMAGE')
196 self.btn_image.Bind(wx.EVT_BUTTON,self.onImageTools)
197 self.btn_load.Bind(wx.EVT_BUTTON,self.loadIMAGE)
199 imagetools.Add(self.btn_load, flag=wx.ALL, border=10)
200 imagetools.Add(self.btn_image, flag=wx.ALL, border=10)
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)
206 def write_message(self, s, panel=0):
207 """write a message to the Status Bar"""
208 self.SetStatusText(s, panel)
210 def onImageTools(self,event=None):
212 self.toolbox = ImageToolboxFrame(self.plot2Dimg,self.raw_img)
214 def plot2Dimage(self):
216 self.plot2Dimg = ImagePanel(self.panel)#,size=(300, 300))
217 self.plot2Dimg.messenger = self.write_message
219 self.Bind(wx.EVT_PAINT, self.OnPaint)
221 self.plot2Dimg.display(self.raw_img)
222 self.AutoContrast()
224 self.plot2Dimg.redraw()
226 def AutoContrast(self):
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
234 self.minCURRENT = self.minINT
235 self.maxCURRENT = self.maxINT
236 if self.maxCURRENT > self.maxINT:
237 self.maxCURRENT = self.maxINT
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
245 ## vertical flip default
246 self.plot2Dimg.conf.flip_ud = True
247 self.plot2Dimg.conf.flip_lr = False
249 self.plot2Dimg.redraw()
251 def ShapeChoice(self,event=None):
253 print('The shape you choose: %s' % self.ch_shp.GetString(self.ch_shp.GetSelection()))
255 print()
256 print('Not implemented: ShapeChoice')
257 self.addAREA()
260 def OnPaint(self, event=None):
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)
268 def clearMask(self,event=None):
270 print('Clearing the mask...')
271 ## provide a warning message?
272 self.area_list = []
273 self.slct_area.Set(self.area_list)
275 self.btn_SHWarea.Disable()
276 self.btn_DELarea.Disable()
277 self.btn_clear.Disable()
278 self.btn_save.Disable()
281 def saveMask(self,event=None):
283 print('This will trigger the saving of a mask.')
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)
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()
297 def showAREA(self,event=None):
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)
304 ## show area on map, image
306 def deleteAREA(self,event=None):
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)
313 self.area_list.remove(self.slct_area.GetString(self.slct_area.GetSelection()))
314 self.slct_area.Set(self.area_list)
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()
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()