📄 ruler.m
字号:
end
elseif ~isempty(varargin{3})
x1 = varargin{3}(1);
x2 = varargin{3}(2);
end
else % coming from horizontal to one of the verticals
if nargin < 3 | isempty(varargin{3})
x1 = 2/3*xlim(1) + 1/3*xlim(2);
x2 = 1/3*xlim(1) + 2/3*xlim(2);
elseif ~isempty(varargin{3})
x1 = varargin{3}(1);
x2 = varargin{3}(2);
end
end
end
ud.ruler.type = type;
popupExistFlag = isfield(ud.ruler.hand,'rulerpopup');
if popupExistFlag
xtra_ui = 1;
else
xtra_ui = 0;
end
showhide_ruler_labels(fig,ud.ruler.type,ud.ruler.hand)
pos_ruler_labels(fig,ud.sz,ud.ruler.type,ud.ruler.hand,xtra_ui)
if ~isempty(ud.focusline)
yd = get(ud.focusline,'ydata');
else
yd = [];
end
if isempty(yd) % nothing to look at
ud.ruler.value.x1 = NaN;
ud.ruler.value.y1 = NaN;
ud.ruler.value.x2 = NaN;
ud.ruler.value.y2 = NaN;
ud.ruler.value.dx = NaN;
ud.ruler.value.dy = NaN;
ud.ruler.value.dydx = NaN;
set(ud.ruler.hand.boxes,'string','-','userdata',NaN)
set(ud.ruler.hand.y1text,'string','-')
set(ud.ruler.hand.y2text,'string','-')
set(ud.ruler.hand.dxtext,'string','-')
set(ud.ruler.hand.dytext,'string','-')
set(ud.ruler.hand.dydxtext,'string','-')
set(ud.ruler.hand.buttons,'visible','off')
set(ud.ruler.lines,'visible','off')
set(ud.ruler.markers,'visible','off')
set(fig,'userdata',ud)
return
end
switch ud.ruler.type
case 'vertical'
y1 = NaN;
y2 = NaN;
dx = x2 - x1;
dy = NaN;
dydx = NaN;
set(ud.ruler.hand.boxes(1),'string',num2str(x1),'userdata',x1)
set(ud.ruler.hand.boxes(2),'string',num2str(x2),'userdata',x2)
set(ud.ruler.hand.dxtext,'string',num2str(dx),'userdata',dx)
set(ud.ruler.lines(1:2),'visible','on')
set(ud.ruler.lines(1),'xdata',[x1 x1])
setrulxdata(ud.ruler.lines(2),[x2 x2])
set(ud.ruler.lines([1 2]),'ydata',ud.limits(plotIndex).ylim)
set(ud.ruler.lines(3),'visible','off')
set(ud.ruler.markers,'visible','off')
case 'horizontal'
x1 = NaN;
x2 = NaN;
if nargin < 3 | isempty(varargin{3})
y1 = 2/3*ylim(1) + 1/3*ylim(2);
y2 = 1/3*ylim(1) + 2/3*ylim(2);
elseif ~isempty(varargin{3})
y1 = varargin{3}(1);
y2 = varargin{3}(2);
end
dx = NaN;
dy = y2 - y1;
dydx = NaN;
set(ud.ruler.hand.boxes(1),'string',num2str(y1),'userdata',y1)
set(ud.ruler.hand.boxes(2),'string',num2str(y2),'userdata',y2)
set(ud.ruler.hand.dytext,'string',num2str(dy),'userdata',dy)
set(ud.ruler.lines(1:2),'visible','on')
set(ud.ruler.lines(1),'ydata',[y1 y1])
set(ud.ruler.lines(2),'ydata',[y2 y2])
set(ud.ruler.lines([1 2]),'xdata',ud.limits(plotIndex).xlim)
set(ud.ruler.lines(1),'linewidth',get(ud.ruler.lines(2),'linewidth'))
set(ud.ruler.lines(3),'visible','off')
set(ud.ruler.markers,'visible','off')
case 'track'
xd = get(ud.focusline,'xdata');
if length(xd)==1
x1 = 0;
x2 = 0;
dx = 0;
y1 = yd;
y2 = yd;
dy = 0;
dydx = NaN;
else
t0 = xd(1); Ts = xd(2)-xd(1);
ind1 = round((x1 - t0)/Ts)+1;
ind2 = round((x2 - t0)/Ts)+1;
if ind1>length(xd), ind1 = length(xd); end
if ind2>length(xd), ind2 = length(xd); end
x1 = (ind1-1)*Ts + t0;
x2 = (ind2-1)*Ts + t0;
dx = x2 - x1;
y1 = yd(ind1);
y2 = yd(ind2);
dy = y2 - y1;
if dx ~= 0
dydx = dy / dx;
else
dydx = NaN;
end
end
set(ud.ruler.hand.boxes(1),'string',num2str(x1),'userdata',x1)
set(ud.ruler.hand.boxes(2),'string',num2str(x2),'userdata',x2)
set(ud.ruler.hand.y1text,'string',num2str(y1));
set(ud.ruler.hand.y2text,'string',num2str(y2));
set(ud.ruler.hand.dxtext,'string',num2str(dx),'userdata',dx)
set(ud.ruler.hand.dytext,'string',num2str(dy));
set(ud.ruler.hand.dydxtext,'string',num2str(dydx));
set(ud.ruler.markers,'visible','on')
set(ud.ruler.markers(1),'xdata',x1,'ydata',y1)
set(ud.ruler.markers(2),'xdata',x2,'ydata',y2)
set(ud.ruler.lines(1:2),'visible','on')
set(ud.ruler.lines(1),'xdata',[x1 x1])
setrulxdata(ud.ruler.lines(2),[x2 x2])
set(ud.ruler.lines([1 2]),'ydata',ud.limits(plotIndex).ylim)
set(ud.ruler.lines(3),'visible','off')
case 'slope'
xd = get(ud.focusline,'xdata');
if length(xd)==1
x1 = 0;
x2 = 0;
dx = 0;
y1 = yd;
y2 = yd;
dy = 0;
dydx = NaN;
set(ud.ruler.lines(3),'visible','off')
else
t0 = xd(1); Ts = xd(2)-xd(1);
ind1 = round((x1 - t0)/Ts)+1;
ind2 = round((x2 - t0)/Ts)+1;
if ind1>length(xd), ind1 = length(xd); end
if ind2>length(xd), ind2 = length(xd); end
x1 = (ind1-1)*Ts + t0;
x2 = (ind2-1)*Ts + t0;
dx = x2 - x1;
y1 = yd(ind1);
y2 = yd(ind2);
dy = y2 - y1;
if 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
dydx = NaN;
set(ud.ruler.lines(3),'visible','off')
end
end
set(ud.ruler.hand.boxes(1),'string',num2str(x1),'userdata',x1)
set(ud.ruler.hand.boxes(2),'string',num2str(x2),'userdata',x2)
set(ud.ruler.hand.y1text,'string',num2str(y1));
set(ud.ruler.hand.y2text,'string',num2str(y2));
set(ud.ruler.hand.dxtext,'string',num2str(dx),'userdata',dx)
set(ud.ruler.hand.dytext,'string',num2str(dy));
set(ud.ruler.hand.dydxtext,'string',num2str(dydx));
set(ud.ruler.markers,'visible','on')
set(ud.ruler.markers(1),'xdata',x1,'ydata',y1)
set(ud.ruler.markers(2),'xdata',x2,'ydata',y2)
set(ud.ruler.lines(1:2),'visible','on')
set(ud.ruler.lines(1),'xdata',[x1 x1])
setrulxdata(ud.ruler.lines(2),[x2 x2])
set(ud.ruler.lines([1 2]),'ydata',ud.limits(plotIndex).ylim)
end
ud.ruler.value.x1 = x1;
ud.ruler.value.x2 = x2;
ud.ruler.value.y1 = y1;
ud.ruler.value.y2 = y2;
ud.ruler.value.dx = dx;
ud.ruler.value.dy = dy;
ud.ruler.value.dydx = dydx;
set(fig,'userdata',ud) % save new type and position labels and edit boxes
if strcmp(type,'horizontal')
if (y1<ylim(1))|(y1>ylim(2))
set(ud.ruler.hand.buttons(1),'visible','on')
else
set(ud.ruler.hand.buttons(1),'visible','off')
end
if (y2<ylim(1))|(y2>ylim(2))
set(ud.ruler.hand.buttons(2),'visible','on')
else
set(ud.ruler.hand.buttons(2),'visible','off')
end
else
if (x1<xlim(1))|(x1>xlim(2))
set(ud.ruler.hand.buttons(1),'visible','on')
else
set(ud.ruler.hand.buttons(1),'visible','off')
end
if (x2<xlim(1))|(x2>xlim(2))
set(ud.ruler.hand.buttons(2),'visible','on')
else
set(ud.ruler.hand.buttons(2),'visible','off')
end
end
% --------------------------------------------------------------------
% ruler('newaxes',fig,plotIndex,newMainaxes)
% move the rulers to new visible mainaxes of the client
% fig - figure handle of the client
% plotIndex - index into ud.limits(plotIndex).xlim and
% ud.limits(plotIndex).ylim
% newMainaxes - new subplot that rulers should focus on
%
case 'newaxes'
if nargin >= 4
newMainaxes = varargin{4};
plotIndex = varargin{3};
fig = varargin{2};
elseif nargin == 2
fig = varargin{2};
plotIndex = 1;
else
fig = gcf;
plotIndex = 1;
end
% Set ruler lines and markers visible off and move rulers to the new
% visible axes
ud = get(fig,'userdata');
set(ud.ruler.lines,'visible', 'off','parent',newMainaxes)
set(ud.ruler.markers,'visible','off','parent',newMainaxes)
ruler('newlimits',fig,plotIndex);
ruler('newsig',fig,plotIndex);
ruler('showlines',fig,ud.focusline);
ruler('resizebtns',fig)
% --------------------------------------------------------------------
% ruler('newlimits',fig,plotIndex,focusline)
% case in which the x or y limits
% have changed, but the ydata and line pick have not necessarily changed
% plotIndex - index into ud.limits(plotIndex).xlim and
% ud.limits(plotIndex).ylim
%
case 'newlimits'
if nargin > 3
focuslineFlag = ~isempty(varargin{4});
else
focuslineFlag = 1;
end
if nargin > 2
plotIndex = varargin{3};
fig = varargin{2};
elseif nargin == 2
fig = varargin{2};
plotIndex = 1;
else
fig = gcf;
plotIndex = 1;
end
ud = get(fig,'userdata');
mainaxes = ud.mainaxes;
if strcmp(ud.ruler.type,'horizontal')
set(ud.ruler.lines([1 2]),'xdata',ud.limits(plotIndex).xlim)
set(ud.ruler.lines(1),'linewidth',get(ud.ruler.lines(2),'linewidth'))
ylim = get(mainaxes,'ylim');
if focuslineFlag % if focusline is set (not empty)
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
end
else
set(ud.ruler.lines([1 2]),'ydata',ud.limits(plotIndex).ylim)
xlim = get(mainaxes,'xlim');
if focuslineFlag % if focusline is set (not empty)
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
end
end
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;
[xd,yd,dydx] = setslopeline(mainaxes,ud.limits,...
x1,x2,y1,y2,dx,dy,plotIndex);
if focuslineFlag % if focusline is set (not empty)
set(ud.ruler.lines(3),'xdata',xd,'ydata',yd,'visible','on')
end
end
% --------------------------------------------------------------------
% ruler('newsig',fig,plotIndex)
% case in which a new line has been picked (i.e., ud.focusline
% has changed, but type hasn't changed and xlimits / ylimits have not
% necessarily changed but may have)
% plotIndex - index into ud.limits(plotIndex).xlim and
% ud.limits(plotIndex).ylim
%
case 'newsig'
if nargin >= 3
fig = varargin{2};
plotIndex = varargin{3};
elseif nargin == 2
fig = varargin{2};
plotIndex = 1;
else
fig = gcf;
plotIndex = 1;
end
ud = get(fig,'userdata');
state = btnstate(fig,'peaksgroup');
if ~isempty(ud.focusline)
xd = get(ud.focusline,'xdata');
yd = get(ud.focusline,'ydata');
else
xd = [];
yd = [];
end
if isempty(xd) % nothing to look at
ud.ruler.value.x1 = NaN;
ud.ruler.value.y1 = NaN;
ud.ruler.value.x2 = NaN;
ud.ruler.value.y2 = NaN;
ud.ruler.value.dx = NaN;
ud.ruler.value.dy = NaN;
ud.ruler.value.dydx = NaN;
set(ud.ruler.hand.boxes,'string','-','userdata',NaN)
set(ud.ruler.hand.y1text,'string','-')
set(ud.ruler.hand.y2text,'string','-')
set(ud.ruler.hand.dxtext,'string','-')
set(ud.ruler.hand.dytext,'string','-')
set(ud.ruler.hand.dydxtext,'string','-')
set(ud.ruler.hand.buttons,'visible','off')
set(ud.ruler.lines,'visible','off')
set(ud.ruler.markers,'visible','off')
set(fig,'userdata',ud)
return
elseif isnan(ud.ruler.value.x1) & isnan(ud.ruler.value.y1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -