Skip to content
Snippets Groups Projects
Commit 8f304318 authored by Nicola Vigano's avatar Nicola Vigano
Browse files

GtEBSDView: improved to accept and use the EBSD data structure

parent 51bf0dc0
No related branches found
No related tags found
No related merge requests found
classdef GtEBSDView < GtBaseGuiElem
properties
ebsd = [];
end
methods
function self = GtEBSDView(ebsd_map, varargin)
function self = GtEBSDView(ebsd_str, varargin)
% GTVOLVIEW/GTVOLVIEW Constructor
self = self@GtBaseGuiElem();
......@@ -11,24 +12,16 @@ classdef GtEBSDView < GtBaseGuiElem
self.conf.cmap = 'gray';
if (isstruct(ebsd_map))
ebsd = ebsd_map;
ebsd_map = ebsd.map_r;
ebsd_mask = ebsd.mask;
phase_id = ebsd.phase_id;
else
ebsd_mask = [];
phase_id = 1;
if (~isstruct(ebsd_str))
error('GtEBSDView:wrong_argument', ...
'Only an EBSD data structure is accepted')
end
self.conf.ebsd_map = ebsd_map;
self.conf.mask = ebsd_mask;
self.ebsd = ebsd_str;
self.conf.ipf_axis = [];
self.conf.phase_id = phase_id;
self.conf.horDim = 1;
self.conf.verDim = 2;
[dim(1), dim(2), dim(3)] = size(self.conf.ebsd_map);
[dim(1), dim(2), dim(3)] = size(self.ebsd.map_r);
self.conf.dim = dim(1:2);
self.conf.hordisplay = [1 self.conf.dim(1)];
self.conf.verdisplay = [1 self.conf.dim(2)];
......@@ -59,7 +52,7 @@ classdef GtEBSDView < GtBaseGuiElem
% GTVOLVIEW/GETVOLVALUE Returns the value for the given point, from the
% volume stored in the object
roundedPoint = round(point);
r_vec = obj.conf.ebsd_map(roundedPoint(1), roundedPoint(2), :);
r_vec = obj.ebsd.map_r(roundedPoint(1), roundedPoint(2), :);
r_vec = reshape(r_vec, 1, 3);
end
......@@ -84,11 +77,11 @@ classdef GtEBSDView < GtBaseGuiElem
function initParams(self, arguments)
initParams@GtBaseGuiElem(self, arguments)
bad_voxels_mask = any(abs(self.conf.ebsd_map) > eps('single'), 3);
if (isempty(self.conf.mask))
self.conf.mask = bad_voxels_mask;
bad_voxels_mask = any(abs(self.ebsd.map_r) > eps('single'), 3);
if (isempty(self.ebsd.mask))
self.ebsd.mask = bad_voxels_mask;
else
self.conf.mask = self.conf.mask & bad_voxels_mask;
self.ebsd.mask = self.ebsd.mask & bad_voxels_mask;
end
end
......@@ -186,8 +179,8 @@ classdef GtEBSDView < GtBaseGuiElem
set(obj.conf.h_im, 'UIContextMenu', obj.conf.h_context_menu);
% Copy pixel info in context menu
cbk = @(src, evt)copy3DPixInfoToClipboard(obj);
obj.conf.h_menu_items = {};
cbk = @(src, evt)copy3DPixInfoToClipboard(obj);
obj.conf.h_menu_items{end+1} = uimenu(obj.conf.h_context_menu, ...
'Label', 'Copy pixel 3D info', ...
'Callback', cbk);
......@@ -195,6 +188,14 @@ classdef GtEBSDView < GtBaseGuiElem
obj.conf.h_menu_items{end+1} = uimenu(obj.conf.h_context_menu, ...
'Label', 'Copy grain Average R-vector info', ...
'Callback', cbk);
cbk = @(src, evt)segmentGrain(obj);
obj.conf.h_menu_items{end+1} = uimenu(obj.conf.h_context_menu, ...
'Label', 'Segment grain to file...', ...
'Callback', cbk);
cbk = @(src, evt)extractBandContrastOfGrain(obj);
obj.conf.h_menu_items{end+1} = uimenu(obj.conf.h_context_menu, ...
'Label', 'Extract grain Band Contrast to file...', ...
'Callback', cbk);
end
function resetUiComponents(obj)
......@@ -230,7 +231,7 @@ classdef GtEBSDView < GtBaseGuiElem
else
point = round(self.getPixel());
end
[grain_r_vecs, grain_mask] = gtDefEBSDSegmentGrainFromSeed(self.conf.ebsd_map, self.conf.mask, point);
[grain_r_vecs, grain_mask] = gtDefEBSDSegmentGrainFromSeed(self.ebsd.map_r, self.ebsd.mask, point);
grain_r_vecs = gtDefDmvol2Gvdm(permute(grain_r_vecs, [1 2 4 3]));
avg_r_vec = sum(grain_r_vecs(:, grain_mask(:)), 2) ./ sum(grain_mask(:));
clipString = sprintf('(%d, %d) [%g, %g, %g]', point, avg_r_vec');
......@@ -240,6 +241,55 @@ classdef GtEBSDView < GtBaseGuiElem
clipboard('copy', clipString);
end
function segmentGrain(self)
if (isfield(self.conf, 'clicked_point') && ~isempty(self.conf.clicked_point))
point = round(self.conf.clicked_point);
else
point = round(self.getPixel());
end
[grain_r_vecs, grain_mask, grain_bb] = gtDefEBSDSegmentGrainFromSeed(self.ebsd.map_r, self.ebsd.mask, point);
filter = {'*.mat', 'MATLAB Files (*.mat)'};
[filename, pathname] = uiputfile( ...
filter, 'Select file...', ...
fullfile('EBSD', 'grain_seg.mat'));
grain_struct = struct( ...
'R_vectors', grain_r_vecs, ...
'mask', grain_mask, ...
'bb', grain_bb); %#ok<NASGU>
if (filename)
save(fullfile(pathname, filename), '-struct', 'grain_struct', '-v7.3');
end
end
function extractBandContrastOfGrain(self)
if (isfield(self.conf, 'clicked_point') && ~isempty(self.conf.clicked_point))
point = round(self.conf.clicked_point);
else
point = round(self.getPixel());
end
[~, grain_mask, grain_bb] = gtDefEBSDSegmentGrainFromSeed(self.ebsd.map_r, self.ebsd.mask, point);
grain_lims = grain_bb([1 2 1 2]) + [1 1 grain_bb(3:4)];
grain_bc = self.ebsd.bc(grain_lims(1):grain_lims(3), grain_lims(2):grain_lims(4));
grain_struct = struct( ...
'band_contrast', grain_bc, ...
'mask', grain_mask, ...
'bb', grain_bb); %#ok<NASGU>
filter = {'*.mat', 'MATLAB Files (*.mat)'};
[filename, pathname] = uiputfile( ...
filter, 'Select file...', ...
fullfile('EBSD', 'grain_bc.mat'));
if (filename)
save(fullfile(pathname, filename), '-struct', 'grain_struct', '-v7.3');
end
end
function doUpdateDisplay(obj)
% GTVOLVIEW/DOUPDATEDISPLAY Function that actually updates all the
% visualized GUI components of the GUI element
......@@ -288,17 +338,17 @@ classdef GtEBSDView < GtBaseGuiElem
% transformations on them, to adapt to the requested visualization needs
p = gtLoadParameters();
cryst_system = p.cryst(self.conf.phase_id).crystal_system;
cryst_spacegroup = p.cryst(self.conf.phase_id).spacegroup;
cryst_system = p.cryst(self.ebsd.phase_id).crystal_system;
cryst_spacegroup = p.cryst(self.ebsd.phase_id).spacegroup;
symm = gtCrystGetSymmetryOperators(cryst_system, cryst_spacegroup);
indx = find(self.conf.mask);
indx = find(self.ebsd.mask);
r_vecs = reshape(self.conf.ebsd_map, [], 3);
r_vecs = reshape(self.ebsd.map_r, [], 3);
r_vecs = r_vecs(indx, :);
[cmap, ~, ~] = gtIPFCmap( ...
self.conf.phase_id, self.conf.ipf_axis, ...
self.ebsd.phase_id, self.conf.ipf_axis, ...
'r_vectors', r_vecs, ...
'crystal_system', cryst_system, ...
'background', false, ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment