📄 ruler.m
字号:
% coming from an 'unfocused' state
if strcmp(ud.ruler.type,'horizontal')
ylim = get(ud.mainaxes,'ylim');
val1 = 2/3*ylim(1) + 1/3*ylim(2);
val2 = 1/3*ylim(1) + 2/3*ylim(2);
set(ud.ruler.lines(1:2),'visible','on')
else
xlim = get(ud.mainaxes,'xlim');
val1 = 2/3*xlim(1) + 1/3*xlim(2);
val2 = 1/3*xlim(1) + 2/3*xlim(2);
if strcmp(ud.ruler.type,'track')
set(ud.ruler.lines(1:2),'visible','on')
set(ud.ruler.markers,'visible','on')
elseif strcmp(ud.ruler.type,'slope')
set(ud.ruler.lines(1:3),'visible','on')
set(ud.ruler.markers,'visible','on')
else
set(ud.ruler.lines(1:2),'visible','on')
end
end
ud = setrul(fig,ud,val1,1,0,0,plotIndex);
ud = setrul(fig,ud,val2,2,0,0,plotIndex);
if state(1)
ind = findpeaks(yd);
if isempty(ind)
btnup(fig,'peaksgroup',1)
ruler('peaks')
else
set(ud.ruler.lines(4),'visible','on','xdata',xd(ind),...
'ydata',yd(ind))
end
end
if state(2)
ind = findpeaks(-yd);
if isempty(ind)
btnup(fig,'peaksgroup',2)
ruler('valleys')
else
set(ud.ruler.lines(5),'visible','on','xdata',xd(ind),...
'ydata',yd(ind))
end
end
set(fig,'userdata',ud)
return
end
if state(1)
ind = findpeaks(yd);
if isempty(ind)
btnup(fig,'peaksgroup',1)
ruler('peaks')
else
set(ud.ruler.lines(4),'visible','on','xdata',xd(ind),...
'ydata',yd(ind))
end
end
if state(2)
ind = findpeaks(-yd);
if isempty(ind)
btnup(fig,'peaksgroup',2)
ruler('valleys')
else
set(ud.ruler.lines(5),'visible','on','xdata',xd(ind),...
'ydata',yd(ind))
end
end
mainaxes = ud.mainaxes;
xlim = get(mainaxes,'xlim');
ylim = get(mainaxes,'ylim');
% don't need to change anything if type is not 'track' or 'slope'
switch ud.ruler.type
case 'vertical'
if (ud.ruler.value.x1 > xlim(2)) | (ud.ruler.value.x1 < xlim(1))
set(ud.ruler.hand.buttons(1),'visible','on')
else
set(ud.ruler.hand.buttons(1),'visible','off')
end
if (ud.ruler.value.x2 > xlim(2)) | (ud.ruler.value.x2 < xlim(1))
set(ud.ruler.hand.buttons(2),'visible','on')
else
set(ud.ruler.hand.buttons(2),'visible','off')
end
return
case 'horizontal'
if (ud.ruler.value.y1 > ylim(2)) | (ud.ruler.value.y1 < ylim(1))
set(ud.ruler.hand.buttons(1),'visible','on')
else
set(ud.ruler.hand.buttons(1),'visible','off')
end
if (ud.ruler.value.y2 > ylim(2)) | (ud.ruler.value.y2 < ylim(1))
set(ud.ruler.hand.buttons(2),'visible','on')
else
set(ud.ruler.hand.buttons(2),'visible','off')
end
return
end
[dum,ind1] = min(abs(ud.ruler.value.x1-xd));
[dum,ind2] = min(abs(ud.ruler.value.x2-xd));
set(ud.ruler.lines(1),'xdata',[xd(ind1) xd(ind1)]);
ud.ruler.value.x1 = xd(ind1);
set(ud.ruler.hand.boxes(1),'string',num2str(ud.ruler.value.x1),...
'userdata',ud.ruler.value.x1);
if (xd(ind1) > xlim(2)) | (xd(ind1) < xlim(1))
set(ud.ruler.hand.buttons(1),'visible','on')
else
set(ud.ruler.hand.buttons(1),'visible','off')
end
setrulxdata(ud.ruler.lines(2),[xd(ind2) xd(ind2)])
ud.ruler.value.x2 = xd(ind2);
set(ud.ruler.hand.boxes(2),'string',num2str(ud.ruler.value.x2),...
'userdata',ud.ruler.value.x2);
if (xd(ind2) > xlim(2)) | (xd(ind2) < xlim(1))
set(ud.ruler.hand.buttons(2),'visible','on')
else
set(ud.ruler.hand.buttons(2),'visible','off')
end
ud.ruler.value.y1 = yd(ind1);
ud.ruler.value.y2 = yd(ind2);
ud.ruler.value.dy = ud.ruler.value.y2 - ud.ruler.value.y1;
if ud.ruler.value.dx ~= 0
ud.ruler.value.dydx = ud.ruler.value.dy / ud.ruler.value.dx;
else
ud.ruler.value.dydx = NaN;
end
set(ud.ruler.hand.y1text,'string',num2str(ud.ruler.value.y1));
set(ud.ruler.hand.y2text,'string',num2str(ud.ruler.value.y2));
set(ud.ruler.hand.dytext,'string',num2str(ud.ruler.value.dy));
set(ud.ruler.hand.dydxtext,'string',num2str(ud.ruler.value.dydx));
set(ud.ruler.markers(1),'xdata',ud.ruler.value.x1)
set(ud.ruler.markers(1),'ydata',ud.ruler.value.y1)
set(ud.ruler.markers(2),'xdata',ud.ruler.value.x2)
set(ud.ruler.markers(2),'ydata',ud.ruler.value.y2)
if strcmp(ud.ruler.type,'slope')
x1 = ud.ruler.value.x1;
x2 = ud.ruler.value.x2;
y1 = ud.ruler.value.y1;
y2 = ud.ruler.value.y2;
dx = ud.ruler.value.dx;
dy = ud.ruler.value.dy;
if ~isnan(ud.ruler.value.dydx) % <-- implies dx ~= 0
[xd,yd,dydx] = setslopeline(ud.mainaxes,ud.limits,...
x1,x2,y1,y2,dx,dy,plotIndex);
set(ud.ruler.lines(3),'xdata',xd,'ydata',yd,'visible','on')
else
set(ud.ruler.lines(3),'visible','off')
end
end
set(fig,'userdata',ud)
%------------------------------------------------------------------------
% ruler('save')
% put up dialog box asking for variable name, then save
% ruler value struct as that name in base workspace.
%
case 'save'
fig = gcf;
ud = get(fig,'userdata');
prompt={sprintf(['Enter the variable name for the ruler\n' ...
'structure to save in the workspace.'])};
def = {ud.ruler.varname};
title = 'Save Measurements';
lineNo = 1;
varname = inputdlg(prompt,title,lineNo,def);
if isempty(varname)
return
end
varstr = varname{:};
if ~isvalidvar(varstr)
errstr = 'Sorry, that''s not a valid variable name.';
msgbox(errstr,'Error','error','modal')
return
end
ud.ruler.varname = varstr;
set(fig,'userdata',ud)
val = ud.ruler.value;
if strcmp(get(ud.ruler.lines(4),'visible'),'on')
val.peaks.x = get(ud.ruler.lines(4),'xdata');
val.peaks.y = get(ud.ruler.lines(4),'ydata');
else
val.peaks.x = [];
val.peaks.y = [];
end
if strcmp(get(ud.ruler.lines(5),'visible'),'on')
val.valleys.x = get(ud.ruler.lines(5),'xdata');
val.valleys.y = get(ud.ruler.lines(5),'ydata');
else
val.valleys.x = [];
val.valleys.y = [];
end
assignin('base',varstr,val)
% --------------------------------------------------------------------
% ruler('showlines',fig,focusline)
% set the visible property of the correct lines
% Inputs:
% fig - figure handle of the client
% focusline - handle of the line currently focused by the rulers
%
case 'showlines'
fig = varargin{2};
if nargin > 2
focuslineFlag = ~isempty(varargin{3});
else
focuslineFlag = 1;
end
if focuslineFlag
ud = get(fig,'userdata');
set(ud.ruler.lines(1:2),'visible','on')
if strcmp(ud.ruler.type,'track')
set(ud.ruler.markers,'visible','on')
elseif strcmp(ud.ruler.type,'slope')
set(ud.ruler.markers,'visible','on')
set(ud.ruler.lines(3),'visible','on')
end
state = btnstate(fig,'peaksgroup');
if state(1)
set(ud.ruler.lines(4),'visible','on')
end
if state(2)
set(ud.ruler.lines(5),'visible','on')
end
end
% --------------------------------------------------------------------
% ruler('hidelines',fig,allRulerObjects)
% set the visible property to off of the correct lines. In the case where
% there's a third input argument which is the string 'all' then all ruler
% lines and markers are set to invisible.
%
% Inputs:
% fig - figure handle of the client which called ruler
% allRulerObjects - is the string 'all' when you want to set all ruler
% lines and markers to invisible
%
case 'hidelines'
fig = varargin{2};
ud = get(fig,'userdata');
if (nargin > 2) & strcmp(varargin{3}, 'all')
h = [ud.ruler.lines(:); ud.ruler.markers(:)];
set(h,'visible','off')
else
if ~strcmp(ud.ruler.type,'track') & ~strcmp(ud.ruler.type,'slope')
set(ud.ruler.markers,'visible','off')
end
if ~strcmp(ud.ruler.type,'slope')
set(ud.ruler.lines(3),'visible','off')
end
state = btnstate(fig,'peaksgroup');
if ~state(1)
set(ud.ruler.lines(4),'visible','off')
end
if ~state(2)
set(ud.ruler.lines(5),'visible','off')
end
end
%--------------------------------------------------------------------
% [RulerLinehandles] = ruler('getRulerlines',fig)
% Get the handles to the ruler lines
%
case 'getrulerlines'
fig = varargin{2};
ud = get(fig,'userdata');
varargout{1} = [ud.ruler.lines, ud.ruler.markers];
% --------------------------------------------------------------------
% ruler('peaks')
% Turn peaks on or off
%
case 'peaks'
fig = gcf;
ud = get(fig,'userdata');
if ud.pointer == 2 % help mode
% restore state:
if btnstate(fig,'peaksgroup',1)
btnup(fig,'peaksgroup',1)
else
btndown(fig,'peaksgroup',1)
end
spthelp('exit','ruler','peaks')
return
end
if btnstate(fig,'peaksgroup',1)
if strcmp(ud.ruler.Track_and_Slope_Allowed,'off')
btnup(fig,'peaksgroup',1)
return
end
% button pushed in
if isempty(ud.focusline)
return
end
xd = get(ud.focusline,'xdata');
yd = get(ud.focusline,'ydata');
if isempty(xd)
return
end
ind = findpeaks(yd);
if isempty(ind)
% line is a vector of constants (no peaks); unselect peaks btn
btnup(fig,'peaksgroup',1)
return
end
set(ud.ruler.lines(4),'xdata',xd(ind),'ydata',yd(ind))
set(ud.ruler.lines(4),'visible','on')
if strcmp(ud.ruler.type,'track') | strcmp(ud.ruler.type,'slope')
% snap rulers to peaks:
ud = setrul(fig,ud,ud.ruler.value.x1,1);
ud = setrul(fig,ud,ud.ruler.value.x2,2);
set(fig,'userdata',ud)
end
else
% button out
if isempty(ud.focusline)
return
end
xd = get(ud.focusline,'xdata');
if isempty(xd)
return
end
set(ud.ruler.lines(4),'visible','off')
if btnstate(fig,'peaksgroup',2)
if strcmp(ud.ruler.type,'track') | strcmp(ud.ruler.type,'slope')
% snap rulers to valleys:
ud = setrul(fig,ud,ud.ruler.value.x1,1);
ud = setrul(fig,ud,ud.ruler.value.x2,2);
set(fig,'userdata',ud)
end
end
end
% --------------------------------------------------------------------
% ruler('valleys')
% Turn valleys on or off
%
case 'valleys'
fig = gcf;
ud = get(fig,'userdata');
if ud.pointer == 2 % help mode
% restore state:
if btnstate(fig,'peaksgroup',2)
btnup(fig,'peaksgroup',2)
else
btndown(fig,'peaksgroup',2)
end
spthelp('exit','ruler','valleys')
return
end
if btnstate(fig,'peaksgroup',2)
% button pushed in
if strcmp(ud.ruler.Track_and_Slope_Allowed,'off')
btnup(fig,'peaksgroup',2)
return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -