Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 0f5959fc authored by DIB Elian's avatar DIB Elian
Browse files

WIP

parent df62d418
Branches feature_lfv4
No related tags found
No related merge requests found
classdef Viewer4 < handle
%VIEWER Summary of this class goes here
% Detailed explanation goes here
properties(SetObservable)
data
dims = 'xy'
name = 'LightField'
range = 'class'
cv = [1,1,1,1,1]
cmap = gray
slice1
slice2
slice3
slice4
clim
title1
title2
title3
title4
end
properties
h = []
im1 = []
im2 = []
im3 = []
im4 = []
ax = []
ax1 = []
ax2 = []
ax3 = []
ax4 = []
end
properties(Hidden)
validDims = {'xy','uv','ux','vy','yx','vu','xu','yv'};
validRanges = {'class','slice','data'};
climClass
climData
gv
perm = [1,2,3,4,5]
minView
maxView
end
methods
function obj = Viewer4(data,varargin)
p = inputParser; p.StructExpand = true; p.KeepUnmatched = true;
p.addRequired('data');
p.addParameter('dims' , obj.dims ,@(dims) any(strcmpi(dims,obj.validDims)));
p.addParameter('name' , obj.name ,@ischar);
p.addParameter('range', obj.range ,@(range) any(strcmpi(range,obj.validRanges)));
p.addParameter('cv' , obj.cv ,@isnumeric);
p.addParameter('cmap' , obj.cmap ,@isnumeric);
p.parse(data,varargin{:});
res = p.Results;
for fname = fieldnames(res)'
fn = fname{:};
obj.(fn) = res.(fn);
end
obj.updateData();
obj.updateDims();
obj.updateSlices();
obj.updateCLim();
obj.updateTitles();
addlistener(obj, 'data' , 'PostSet', @(src,evnt) obj.updateData);
addlistener(obj, 'dims' , 'PostSet', @(src,evnt) obj.updateDims);
addlistener(obj, 'name' , 'PostSet', @(src,evnt) obj.updateName);
addlistener(obj, 'range' , 'PostSet', @(src,evnt) obj.updateRange);
addlistener(obj, 'cv' , 'PostSet', @(src,evnt) obj.updateCV);
addlistener(obj, 'cmap' , 'PostSet', @(src,evnt) obj.updateCMap);
addlistener(obj, 'slice4', 'PostSet', @(src,evnt) obj.updateSlices);
addlistener(obj, 'title4', 'PostSet', @(src,evnt) obj.updateTitles);
addlistener(obj, 'clim' , 'PostSet', @(src,evnt) obj.updateCLim);
obj.view();
end
function view(obj)
if ~obj.validFigure()
obj.h = figure;
obj.ax1 = subplot(2,2,1);
obj.ax2 = subplot(2,2,2);
obj.ax3 = subplot(2,2,3);
obj.ax4 = subplot(2,2,4);
obj.ax = obj.ax1;
obj.im1 = imagesc(obj.ax1,obj.slice1);
obj.im2 = imagesc(obj.ax2,obj.slice2);
obj.im3 = imagesc(obj.ax3,obj.slice3);
obj.im4 = imagesc(obj.ax4,obj.slice4);
obj.ax1.Colormap = obj.cmap;
obj.ax2.Colormap = obj.cmap;
obj.ax3.Colormap = obj.cmap;
obj.ax4.Colormap = obj.cmap;
obj.h.KeyPressFcn = @obj.KeyPressCallback;
obj.h.WindowButtonDownFcn = @obj.ButtonDownCallback;
obj.h.WindowButtonUpFcn = @obj.ButtonUpCallback;
end
obj.updateFigure();
end
end
methods(Hidden)
function updateData(obj)
if islogical(obj.data)
data_ = obj.data;
data_ = uint8(data_);
obj.data = [];
obj.data = data_;
end
obj.gv = arrayfun(@(x) 1:x,size(obj.data),'UniformOutput',false);
obj.minView = cellfun(@min,obj.gv);
obj.maxView = cellfun(@max,obj.gv);
obj.climClass = getrangefromclass(obj.data);
obj.climData = [min(obj.data(:)) max(obj.data(:))];
obj.updateCV();
end
function updateDims(obj)
obj.updatePerm();
obj.updateCV();
end
function updatePerm(obj)
switch lower(obj.dims)
case 'xu'
obj.perm = [1,4,3,2,5];
case 'ux'
obj.perm = [4,1,3,2,5];
case 'yv'
obj.perm = [2,5,3,1,4];
case 'vy'
obj.perm = [5,2,3,1,4];
case 'xy'
obj.perm = [1,2,3,4,5];
case 'yx'
obj.perm = [2,1,3,4,5];
case 'uv'
obj.perm = [4,5,3,1,2];
case 'vu'
obj.perm = [5,4,3,1,2];
end
end
function updateName(obj)
obj.updateTitles();
end
function updateRange(obj)
obj.updateCLim();
end
function updateCV(obj)
obj.cv = min(obj.maxView,max(obj.minView,obj.cv));
obj.updateTitles();
obj.updateSlices();
end
function updateCLim(obj)
switch lower(obj.range)
case 'class'
obj.clim = obj.climClass;
case 'slice'
if isequal(obj.ax,obj.ax1)
obj.clim = [min(obj.slice1(:)) max(obj.slice1(:))];
elseif isequal(obj.ax,obj.ax2)
obj.clim = [min(obj.slice2(:)) max(obj.slice2(:))];
elseif isequal(obj.ax,obj.ax3)
obj.clim = [min(obj.slice3(:)) max(obj.slice3(:))];
else
obj.clim = [min(obj.slice4(:)) max(obj.slice4(:))];
end
case 'data'
obj.clim = obj.climData;
end
if diff(obj.clim)<=0
obj.clim(2) = obj.clim(1) + diff(getrangefromclass(obj.clim))/2;
end
if obj.validFigure()
obj.ax1.CLim = obj.clim;
obj.ax2.CLim = obj.clim;
obj.ax3.CLim = obj.clim;
obj.ax4.CLim = obj.clim;
end
end
function updateSlices(obj)
gv1 = obj.gv;
gv2 = obj.gv;
gv3 = obj.gv;
gv4 = obj.gv;
ccv = num2cell(obj.cv);
perm1 = obj.perm;
perm2 = obj.perm([1,4,3,2,5]);
perm3 = obj.perm([5,2,3,4,1]);
perm4 = obj.perm([4,5,3,1,2]);
[gv1{perm1(4:5)}] = deal(ccv{perm1(4:5)});
[gv2{perm2(4:5)}] = deal(ccv{perm2(4:5)});
[gv3{perm3(4:5)}] = deal(ccv{perm3(4:5)});
[gv4{perm4(4:5)}] = deal(ccv{perm4(4:5)});
obj.slice1 = permute(obj.data(gv1{:}),perm1);
obj.slice2 = permute(obj.data(gv2{:}),perm2);
obj.slice3 = permute(obj.data(gv3{:}),perm3);
obj.slice4 = permute(obj.data(gv4{:}),perm4);
if obj.validFigure()
obj.im1.CData = obj.slice1;
obj.im2.CData = obj.slice2;
obj.im3.CData = obj.slice3;
obj.im4.CData = obj.slice4;
obj.im1.AlphaData = double(any(~isnan(obj.im1.CData),3));
obj.im2.AlphaData = double(any(~isnan(obj.im2.CData),3));
obj.im3.AlphaData = double(any(~isnan(obj.im3.CData),3));
obj.im4.AlphaData = double(any(~isnan(obj.im4.CData),3));
end
end
function updateTitles(obj)
coordVec1 = false(1,5);
coordVec2 = false(1,5);
coordVec3 = false(1,5);
coordVec4 = false(1,5);
perm1 = obj.perm;
perm2 = obj.perm([1,4,3,2,5]);
perm3 = obj.perm([5,2,3,4,1]);
perm4 = obj.perm([4,5,3,1,2]);
coordVec1(perm1(4:5)) = true;
coordVec2(perm2(4:5)) = true;
coordVec3(perm3(4:5)) = true;
coordVec4(perm4(4:5)) = true;
coordStr1 = {':',':',':',':',':'};
coordStr2 = {':',':',':',':',':'};
coordStr3 = {':',':',':',':',':'};
coordStr4 = {':',':',':',':',':'};
coordStr1(coordVec1) = arrayfun(@num2str,obj.cv(coordVec1),'UniformOutput',false);
coordStr2(coordVec2) = arrayfun(@num2str,obj.cv(coordVec2),'UniformOutput',false);
coordStr3(coordVec3) = arrayfun(@num2str,obj.cv(coordVec3),'UniformOutput',false);
coordStr4(coordVec4) = arrayfun(@num2str,obj.cv(coordVec4),'UniformOutput',false);
coordStr1 = ['(' strjoin(coordStr1,','),')'];
coordStr2 = ['(' strjoin(coordStr2,','),')'];
coordStr3 = ['(' strjoin(coordStr3,','),')'];
coordStr4 = ['(' strjoin(coordStr4,','),')'];
obj.title1 = [obj.name,' ',coordStr1];
obj.title2 = [obj.name,' ',coordStr2];
obj.title3 = [obj.name,' ',coordStr3];
obj.title4 = [obj.name,' ',coordStr4];
if obj.validFigure()
obj.ax1.Title.String = obj.title1;
obj.ax2.Title.String = obj.title2;
obj.ax3.Title.String = obj.title3;
obj.ax4.Title.String = obj.title4;
end
end
function updateCMap(obj)
if obj.validFigure()
obj.ax1.Colormap = obj.cmap;
obj.ax2.Colormap = obj.cmap;
obj.ax3.Colormap = obj.cmap;
obj.ax4.Colormap = obj.cmap;
end
end
function updateFigure(obj)
if ~obj.validFigure()
return
end
obj.im1.CData = obj.slice1;
obj.im2.CData = obj.slice2;
obj.im3.CData = obj.slice3;
obj.im4.CData = obj.slice4;
obj.im1.AlphaData = double(any(~isnan(obj.im1.CData),3));
obj.im2.AlphaData = double(any(~isnan(obj.im2.CData),3));
obj.im3.AlphaData = double(any(~isnan(obj.im3.CData),3));
obj.im4.AlphaData = double(any(~isnan(obj.im4.CData),3));
obj.ax1.CLim = obj.clim;
obj.ax2.CLim = obj.clim;
obj.ax3.CLim = obj.clim;
obj.ax4.CLim = obj.clim;
obj.ax1.Title.String = obj.title1;
obj.ax2.Title.String = obj.title2;
obj.ax3.Title.String = obj.title3;
obj.ax4.Title.String = obj.title4;
obj.ax1.Colormap = obj.cmap;
obj.ax2.Colormap = obj.cmap;
obj.ax3.Colormap = obj.cmap;
obj.ax4.Colormap = obj.cmap;
end
function KeyPressCallback(obj,~,evnt)
cv_ = obj.cv(obj.perm);
switch evnt.Key
case 'uparrow'
cv_(4) = cv_(4)-1;
case 'downarrow'
cv_(4) = cv_(4)+1;
case 'leftarrow'
cv_(5) = cv_(5)-1;
case 'rightarrow'
cv_(5) = cv_(5)+1;
case 'space'
rangeInd = find(strcmp(obj.range,obj.validRanges));
rangeInd = mod(rangeInd,3)+1;
obj.range = obj.validRanges{rangeInd};
end
obj.cv(obj.perm) = cv_;
end
function ButtonDownCallback(obj,~,~)
figPos = obj.h.Position;
mousePos = obj.h.CurrentPoint;
axs = findobj(obj.h,'type','axes');
for ax_ = axs'
axPos = ax_.Position';
if ...
mousePos(1)>= axPos(1)*figPos(3) &&...
mousePos(1)<=(axPos(1)+axPos(3))*figPos(3) &&...
mousePos(2)>= axPos(2)*figPos(4) &&...
mousePos(2)<=(axPos(2)+axPos(4))*figPos(4)
break
end
end
obj.ax = ax_;
perm_ = obj.perm;
if isequal(obj.ax,obj.ax2)
perm_ = perm_([1,4,3,2,5]);
elseif isequal(obj.ax,obj.ax3)
perm_ = perm_([5,2,3,4,1]);
elseif isequal(obj.ax,obj.ax4)
perm_ = perm_([4,5,3,1,2]);
end
refView = obj.cv(perm_(4:5));
refPos = obj.ax.CurrentPoint(1,[2 1]);
obj.h.WindowButtonMotionFcn = ...
@(src,evnt) (obj.ButtonMotionCallback(src,evnt,refView,refPos));
end
function ButtonUpCallback(obj,~,~)
obj.h.WindowButtonMotionFcn = '';
end
function ButtonMotionCallback(obj,~,~,refView,refPos)
axSize = [diff(obj.ax.YLim),diff(obj.ax.XLim)];
axPos = obj.ax.CurrentPoint(1,[2,1]);
perm_ = obj.perm;
if isequal(obj.ax,obj.ax2)
perm_ = perm_([1,4,3,2,5]);
elseif isequal(obj.ax,obj.ax3)
perm_ = perm_([5,2,3,4,1]);
elseif isequal(obj.ax,obj.ax4)
perm_ = perm_([4,5,3,1,2]);
end
switch obj.h.SelectionType
case 'normal'
mv = 2.*(axPos - refPos)./axSize.*obj.maxView(perm_(4:5));
obj.cv(perm_(4:5)) = refView + round(mv);
case 'alt'
end
end
function bool = validFigure(obj)
bool = ~isempty(obj.im1) && isvalid(obj.im1);
end
end
end
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment