diff --git a/zUtil_Deformation/plotting/gt6DMakeClusterKAMFigureForPaper.m b/zUtil_Deformation/plotting/gt6DMakeClusterKAMFigureForPaper.m index c7f2331bef1092d63a32d17b806023f3d0d694f6..21593a88d3044bc26725646e93ee6c681ac2288f 100644 --- a/zUtil_Deformation/plotting/gt6DMakeClusterKAMFigureForPaper.m +++ b/zUtil_Deformation/plotting/gt6DMakeClusterKAMFigureForPaper.m @@ -15,7 +15,8 @@ function gt6DMakeClusterKAMFigureForPaper(cl, cl_rec, grs, varargin) 'rotation_angles', zeros(0, 1), ... 'use_slice_R_vector', false, ... 'borders', 'yes', ... - 'colorbar', 'yes' ); + 'colorbar', 'yes', ... + 'extras', [] ); conf = parse_pv_pairs(conf, varargin); if (~exist('cl_rec', 'var') || isempty(cl_rec)) @@ -29,14 +30,14 @@ function gt6DMakeClusterKAMFigureForPaper(cl, cl_rec, grs, varargin) end end + p = gtLoadParameters(); + if (isempty(conf.rotation_angles)) internal_shift = cl_rec.SEG.segbb(1:3) - cl_rec.ODF6D.shift; seg_vol_bb = [internal_shift, cl_rec.SEG.segbb(4:6)]; seg_vol = cl_rec.SEG.seg; else - p = gtLoadParameters(); - cl_rec.ODF6D = gtGrainRotateStructure(cl_rec.ODF6D, ... cl.proj, 'ODF6D', p, conf.rotation_angles, conf.rotation_axes); @@ -124,6 +125,13 @@ function gt6DMakeClusterKAMFigureForPaper(cl, cl_rec, grs, varargin) set_size(f, ax, [], conf, slice_kam); end + if (~isempty(conf.extras)) + im_props = struct( ... + 'pixel_size', p.recgeo.voxsize * 1e3, ... + 'size', [size(slice_kam, 1) size(slice_kam, 2)] ); + gtFigureAddExtras(ax, im_props, conf.extras); + end + drawnow(); clims_igm = [conf.clims(1), max(slice_igm(:))]; @@ -145,6 +153,13 @@ function gt6DMakeClusterKAMFigureForPaper(cl, cl_rec, grs, varargin) set_size(f, ax, [], conf, slice_kam); end + if (~isempty(conf.extras)) + im_props = struct( ... + 'pixel_size', p.recgeo.voxsize * 1e3, ... + 'size', [size(slice_kam, 1) size(slice_kam, 2)] ); + gtFigureAddExtras(ax, im_props, conf.extras); + end + drawnow(); % diff --git a/zUtil_Deformation/plotting/gt6DMakePhaseFigureForPaper.m b/zUtil_Deformation/plotting/gt6DMakePhaseFigureForPaper.m index 069d6e99e0a189aa31d872a832c1c99b131306f2..d3391461125b32cf98bc32140219870998e301e4 100644 --- a/zUtil_Deformation/plotting/gt6DMakePhaseFigureForPaper.m +++ b/zUtil_Deformation/plotting/gt6DMakePhaseFigureForPaper.m @@ -11,8 +11,9 @@ function gt6DMakePhaseFigureForPaper( phase_mat, phase_id, varargin ) % 'slice', 1, ... % 'clims', [], ... % 'pixel_to_cm', 0.05, ... -% 'borders', 'no', ... -% 'colorbar', 'no'); +% 'borders', false, ... +% 'colorbar', false, ... +% 'extras', []); % conf = struct( ... @@ -30,7 +31,8 @@ function gt6DMakePhaseFigureForPaper( phase_mat, phase_id, varargin ) 'clims', [], ... 'pixel_to_cm', 0.05, ... 'borders', false, ... - 'colorbar', false ); + 'colorbar', false, ... + 'extras', [] ); conf = parse_pv_pairs(conf, varargin); slice_ids = get_slice(phase_mat.vol, conf.plane, conf.slice); @@ -123,6 +125,14 @@ function gt6DMakePhaseFigureForPaper( phase_mat, phase_id, varargin ) set(ax, 'CLim', conf.clims) end + if (~isempty(conf.extras)) + p = gtLoadParameters(); + im_props = struct( ... + 'pixel_size', p.recgeo.voxsize * 1e3, ... + 'size', [size(final_slice_RGB, 2) size(final_slice_RGB, 1)] ); + gtFigureAddExtras(ax, im_props, conf.extras); + end + set(f, 'Units', 'centimeters') img_size = size(final_slice_RGB) * conf.pixel_to_cm; img_size = img_size([2 1]); diff --git a/zUtil_Deformation/plotting/gt6DRenderEBSDMapIPF.m b/zUtil_Deformation/plotting/gt6DRenderEBSDMapIPF.m index 76e699e6f5255e1e1fdb15600319132846585a74..3fb86793a27d5128be79f17f2cf88204bd6e1863 100644 --- a/zUtil_Deformation/plotting/gt6DRenderEBSDMapIPF.m +++ b/zUtil_Deformation/plotting/gt6DRenderEBSDMapIPF.m @@ -11,7 +11,8 @@ function gt6DRenderEBSDMapIPF(EBSD_struct, varargin) 'scale', [], ... 'pixel_to_cm', 0.05, ... 'borders', 'no', ... - 'colorbar', 'no' ); + 'colorbar', 'no', ... + 'extras', [] ); conf = parse_pv_pairs(conf, varargin); EBSD_r_map = EBSD_struct.map_r; @@ -86,6 +87,13 @@ function gt6DRenderEBSDMapIPF(EBSD_struct, varargin) ax = axes('Parent', f); im = imagesc(cat(3, slice_R, slice_G, slice_B), 'Parent', ax); + if (~isempty(conf.extras)) + im_props = struct( ... + 'pixel_size', EBSD_struct.pixel_size, ... + 'size', [size(slice_ids, 2) size(slice_ids, 1)] ); + gtFigureAddExtras(ax, im_props, conf.extras); + end + set(f, 'Units', 'centimeters') img_size = size(slice_ids) .* conf.pixel_to_cm; img_size = img_size([2 1]); diff --git a/zUtil_Imaging/gtFigureAddExtras.m b/zUtil_Imaging/gtFigureAddExtras.m new file mode 100644 index 0000000000000000000000000000000000000000..326cf162754788b3b7399362214a8dc346965f8b --- /dev/null +++ b/zUtil_Imaging/gtFigureAddExtras.m @@ -0,0 +1,110 @@ +function gtFigureAddExtras(ax, im_props, extras) + num_extras = numel(extras); + + for ii_ex = 1:num_extras + switch (extras{ii_ex}.type) + case 'unit_bar' + add_unit_bar(ax, im_props, extras{ii_ex}); + case {'line_vertical', 'line_horizontal'} + add_line(ax, im_props, extras{ii_ex}) + case 'box' + add_box(ax, extras{ii_ex}) + case 'text' + add_text(ax, extras{ii_ex}) + end + end +end + +function add_unit_bar(ax, im_props, ex_props) + bar_length = ex_props.line_length / im_props.pixel_size(2); + + switch (ex_props.position) + case 'north_west' + xs_l = ex_props.margin([1 1]) + [0 bar_length]; + ys_l = ex_props.margin([2 2]); + x_t = ex_props.margin(1); + y_t = ex_props.margin(2) + 1; % + ex_props.line_width + font_placing_vert = 'top'; + font_placing_horz = 'left'; + case 'south_west' + xs_l = ex_props.margin([1 1]) + [0 bar_length]; + ys_l = im_props.size([2 2]) - ex_props.margin([2 2]); + x_t = ex_props.margin(1); + y_t = im_props.size(2) - ex_props.margin(2) - 1; % - ex_props.line_width + font_placing_vert = 'bottom'; + font_placing_horz = 'left'; + case 'north_est' + xs_l = im_props.size([1 1]) - ex_props.margin([1 1]) - [0 bar_length]; + ys_l = ex_props.margin([2 2]); + x_t = im_props.size(1) - ex_props.margin(1); % - bar_length + y_t = ex_props.margin(2) + 1; % + ex_props.line_width + font_placing_vert = 'top'; + font_placing_horz = 'right'; + case 'south_est' + xs_l = im_props.size([1 1]) - ex_props.margin([1 1]) - [0 bar_length]; + ys_l = im_props.size([2 2]) - ex_props.margin([2 2]); + x_t = im_props.size(1) - ex_props.margin(1); % - bar_length + y_t = im_props.size(2) - ex_props.margin(2) - 1; % - ex_props.line_width + font_placing_vert = 'bottom'; + font_placing_horz = 'right'; + end + + line(xs_l, ys_l, 'parent', ax, 'Color', ex_props.color, 'LineWidth', ex_props.line_width) + text(x_t, y_t, sprintf('%g %s', ex_props.line_length, ex_props.base_unit), ... + 'parent', ax, 'Color', ex_props.color, ... + 'FontSize', ex_props.font_size, ... + 'FontAngle', ex_props.font_angle, ... + 'FontWeight', ex_props.font_weight, ... + 'VerticalAlignment', font_placing_vert, ... + 'HorizontalAlignment', font_placing_horz ) +end + +function add_line(ax, im_props, ex_props) + + switch (ex_props.type) + case 'line_vertical' + xs_l = ex_props.position([1 1]); + ys_l = [1 im_props.size(2)]; + case 'line_horizontal' + xs_l = [1 im_props.size(1)]; + ys_l = ex_props.position([1 1]); + end + + line(xs_l, ys_l, 'parent', ax, 'Color', ex_props.color, ... + 'LineWidth', ex_props.line_width, 'LineStyle', ex_props.line_style) +end + +function add_box(ax, ex_props) + + x_nw = ex_props.position(1); + y_nw = ex_props.position(2); + + x_sw = ex_props.position(1); + y_sw = ex_props.position(2) + ex_props.position(4) - 1; + + x_ne = ex_props.position(1) + ex_props.position(3) - 1; + y_ne = ex_props.position(2); + + x_se = ex_props.position(1) + ex_props.position(3) - 1; + y_se = ex_props.position(2) + ex_props.position(4) - 1; + + line([x_nw x_sw], [y_nw y_sw], 'parent', ax, 'Color', ex_props.color, ... + 'LineWidth', ex_props.line_width, 'LineStyle', ex_props.line_style) + line([x_ne x_se], [y_ne y_se], 'parent', ax, 'Color', ex_props.color, ... + 'LineWidth', ex_props.line_width, 'LineStyle', ex_props.line_style) + line([x_nw x_ne], [y_nw y_ne], 'parent', ax, 'Color', ex_props.color, ... + 'LineWidth', ex_props.line_width, 'LineStyle', ex_props.line_style) + line([x_sw x_se], [y_sw y_se], 'parent', ax, 'Color', ex_props.color, ... + 'LineWidth', ex_props.line_width, 'LineStyle', ex_props.line_style) +end + +function add_text(ax, ex_props) + text(ex_props.position(1), ex_props.position(2), ex_props.string, ... + 'parent', ax, 'Color', ex_props.color, ... + 'FontSize', ex_props.font_size, ... + 'FontAngle', ex_props.font_angle, ... + 'FontWeight', ex_props.font_weight, ... + 'HorizontalAlignment', ex_props.alignment_horz, ... + 'VerticalAlignment', ex_props.alignment_vert ); +end + diff --git a/zUtil_Imaging/gtFigureCreateExtras.m b/zUtil_Imaging/gtFigureCreateExtras.m new file mode 100644 index 0000000000000000000000000000000000000000..0eaa08115c553702b38dee363d21ae342c245b09 --- /dev/null +++ b/zUtil_Imaging/gtFigureCreateExtras.m @@ -0,0 +1,58 @@ +function extras = gtFigureCreateExtras(type, varargin) + switch (type) + case 'unit_bar' + extras = create_unit_bar(varargin{:}); + case {'line_vertical', 'line_horizontal'} + extras = create_line(varargin{:}); + case 'box' + extras = create_box(varargin{:}); + case 'text' + extras = create_text(varargin{:}); + end + extras.type = type; +end + +function extras = create_unit_bar(varargin) + extras = struct( ... + 'base_unit', 'um', ... % µm (\u00B5m), \mu m, mm + 'line_length', 10, ... + 'line_width', 2, ... + 'position', 'south_west', ... {'north_west', 'south_west', 'north_est', 'south_est'} + 'margin', [10 10], ... + 'font_size', 10, ... + 'font_weight', 'normal', ... {'normal', 'bold', 'light', 'demi'} + 'font_angle', 'normal', ... {'normal', 'italic', 'oblique'} + 'color', [1 1 1] ); + extras = parse_pv_pairs(extras, varargin); +end + +function extras = create_line(varargin) + extras = struct( ... + 'line_width', 2, ... + 'line_style', '-', ... + 'position', 1, ... + 'color', [1 1 1] ); + extras = parse_pv_pairs(extras, varargin); +end + +function extras = create_box(varargin) + extras = struct( ... + 'line_width', 2, ... + 'line_style', '-', ... + 'position', [1 1 10 10], ... + 'color', [1 1 1] ); + extras = parse_pv_pairs(extras, varargin); +end + +function extras = create_text(varargin) + extras = struct( ... + 'string', '', ... + 'position', [1 1], ... + 'alignment_horz', 'center', ... {'left', 'center', 'right'} + 'alignment_vert', 'middle', ... {'top', 'cap', 'middle', 'baseline', 'bottom'} + 'font_size', 10, ... + 'font_weight', 'normal', ... {'normal', 'bold', 'light', 'demi'} + 'font_angle', 'normal', ... {'normal', 'italic', 'oblique'} + 'color', [1 1 1] ); + extras = parse_pv_pairs(extras, varargin); +end diff --git a/zUtil_Imaging/gtMakeFigureFromPicture.m b/zUtil_Imaging/gtMakeFigureFromPicture.m index 37c2744639f9139f64e19789a61565842db0a801..d8f7ca31eb15d76c7b09aaa129b665e3a02a34f0 100644 --- a/zUtil_Imaging/gtMakeFigureFromPicture.m +++ b/zUtil_Imaging/gtMakeFigureFromPicture.m @@ -10,7 +10,9 @@ function gtMakeFigureFromPicture(img, mask, varargin) 'clims', [], ... 'pixel_to_cm', 0.05, ... 'borders', true, ... - 'colorbar', true ); + 'colorbar', true, ... + 'pixel_size', [], ... + 'extras', [] ); conf = parse_pv_pairs(conf, varargin); use_mask = ~isempty(mask); @@ -66,6 +68,17 @@ function gtMakeFigureFromPicture(img, mask, varargin) end colormap(ax, jet) + if (~isempty(conf.extras)) + if (isempty(conf.pixel_size)) + p = gtLoadParameters(); + conf.pixel_size = p.recgeo.voxsize * 1e3; + end + im_props = struct( ... + 'pixel_size', conf.pixel_size, ... + 'size', [size(img, 1) size(img, 2)] ); + gtFigureAddExtras(ax, im_props, conf.extras); + end + set_size(f, ax, conf, mask); end