📄 ruler.m
字号:
c4 = 'sbswitch(''ruler'',''newtype'',''slope'')';
r_callbackstr = str2mat(c1,c2,c3,c4);
% common btngroup param/value pairs:
group_props = {'BevelWidth',.05, 'Orientation','horizontal',...
'Units','pixels'};
id = ruler_btnid(ud.prefs.ruler.type);
initialState = [0 0 0 0];
initialState(id) = 1;
ud.ruler.hand.rulergroup = btngroup(fig,'GroupID','rulergroup',...
'IconFunctions',r_iconstr,...
'ButtonID',str2mat('vertical','track','horizontal','slope'),...
'Exclusive','yes',...
'InitialState',initialState,...
'Callbacks',r_callbackstr,...
'GroupSize',[2 2],...
group_props{:});
setFontUnitsPixels(ud.ruler.hand.rulergroup)
% ====================================================================
% Peaks and Valleys toggle buttons
s1 =['[text(.5,.15,''Peaks''' tp ')'...
' line([.1 .35 .5 .65 .9],[.4 .9 .65 .8 .4],''color'',''k'') ' ...
' line([.35 .65],[.9 .8],''linestyle'',''none'',''marker'',''o'','...
'''color'',''k'') ]'];
s2 =['[text(.5,.15,''Valleys''' tp ')' ...
' line([.1 .35 .5 .65 .9],1.35-[.4 .9 .65 .8 .4],''color'',''k'') ' ...
' line([.35 .65],1.35-[.9 .8],''linestyle'',''none'',''marker'',''o'','...
'''color'',''k'') ]'];
r_iconstr = str2mat(s1,s2);
c1 = 'sbswitch(''ruler'',''peaks'')';
c2 = 'sbswitch(''ruler'',''valleys'')';
r_callbackstr = str2mat(c1,c2,c3,c4);
ud.ruler.hand.peaksgroup = btngroup(fig,'GroupID','peaksgroup',...
'IconFunctions',r_iconstr,...
'ButtonID',str2mat('peaks','valleys'),...
'InitialState',[0 0],...
'Callbacks',r_callbackstr,...
'GroupSize',[1 2],...
group_props{:});
setFontUnitsPixels(ud.ruler.hand.peaksgroup)
ud.ruler.evenlySpaced = 1; % default value; used in rulermo;
% needs to be set by ruler's caller whenever
% ud.focusline is set
ud.ruler.Track_and_Slope_Allowed = 'on';
set(fig,'userdata',ud)
set(fig,'resizefcn',appstr(get(fig,'resizefcn'),...
'sbswitch(''ruler'',''resize'')'))
ruler('resize',1,fig)
showhide_ruler_labels(fig,ud.ruler.type,ud.ruler.hand)
% figure(save_fig)
%-----------------------------------------------------------------
% ruler('close',fig)
% shutdown code - removes ruler from browser
% Inputs:
% fig - figure handle of browser
% handle - HG handle that needs to be removed along
% with the rulers (ie rulerpopup uicontrol)
%
case 'close'
fig = varargin{2};
ud = get(fig,'userdata');
if find(strcmp('rulerpopup',fieldnames(ud.ruler.hand))); % popup exists
delete(ud.ruler.hand.rulerpopup);
end
ud.prefs.tool.ruler = 0;
delete(ud.ruler.lines)
delete(ud.ruler.markers)
h = ud.ruler.hand;
ud.ruler.lines = [];
ud.ruler.markers = [];
ud.ruler.hand = [];
delete_list = [
h.rulergroup
h.peaksgroup
h.ruleraxes
h.x1label
h.y1label
h.x2label
h.y2label
h.dxlabel
h.dylabel
h.dydxlabel
h.boxes(:)
h.buttons(:)
h.saverulerbutton
h.y1text
h.y2text
h.dxtext
h.dytext
h.dydxtext
];
delete(delete_list)
set(fig,'resizefcn',remstr(get(fig,'resizefcn'),...
'sbswitch(''ruler'',''resize'')'))
set(fig,'userdata',ud)
%-----------------------------------------------------------------
% minWidth = ruler('minWidth',sz)
% returns height of ruler INCLUDING toolbar, in pixels
% can be called before or after creation of rulers
% sz - size structure
%
case 'minwidth'
sz = varargin{2};
toolbar_ht = sz.ih;
varargout{1} = sz.fus+sz.lh+3*sz.rih+8*(sz.uh+sz.fus)+2*sz.fus + toolbar_ht;
%-----------------------------------------------------------------
% ruler('resize',create_flag,fig)
% resize ruler object
% create_flag == 1 for first time call (position ALL objects)
% == 0 to position only those that move on resize
% fig - figure handle of client, such as the signal browser, spectrum
% viewer or filter viewer
%
case 'resize'
if nargin >= 2
create_flag = varargin{2};
else
create_flag = 0;
end
if nargin >= 3
fig = varargin{3};
else
fig = gcbf;
end
ud = get(fig,'userdata');
sz = ud.sz;
fp = get(fig,'position'); % in pixels already
toolbar_ht = sz.ih;
popupExistFlag = isfield(ud.ruler.hand,'rulerpopup');
if popupExistFlag
n_ui = 9; % number of uicontrols in ruler frame
xtra_ui = 1;
else
n_ui = 8;
xtra_ui = 0;
end
minRulerHeight = sz.fus+sz.lh+3*sz.rih+n_ui*(sz.uh+sz.fus)+2*sz.fus;
if (fp(4)-toolbar_ht) < minRulerHeight
% disp(' RULER: figure too short - resizing')
w = fp(3);
h = minRulerHeight+toolbar_ht;
fp = [fp(1) fp(2)+fp(4)-h w h];
set(fig,'position',fp)
return
end
mainaxes = ud.mainaxes;
mp = get(mainaxes,'position');
hand = ud.ruler.hand;
frame_top = fp(4)-(toolbar_ht+sz.ffs+sz.lh/2);
sizes = {
hand.ruleraxes [fp(3)-sz.rw 1 sz.rw fp(4)-toolbar_ht]
hand.rulergroup [fp(3)-sz.rw/2-sz.riw ...
frame_top-(xtra_ui*(sz.uh+sz.fus)+sz.lh/2+2*sz.rih) ...
2*sz.riw 2*sz.rih]
hand.peaksgroup [fp(3)-sz.rw/2-sz.riw ...
frame_top-(sz.lh/2+3*sz.rih+(n_ui-1)*(sz.uh+sz.fus)+1) ...
2*sz.riw sz.rih]
hand.buttons(1) [mp(1)+mp(3)-2*sz.uh mp(2)+mp(4) sz.uh sz.uh]
hand.buttons(2) [mp(1)+mp(3)-sz.uh mp(2)+mp(4) sz.uh sz.uh]
hand.saverulerbutton [fp(3)-sz.rw/2-sz.riw ...
frame_top-(sz.lh/2+3*sz.rih+n_ui*(sz.uh+sz.fus)-3) ...
2*sz.riw sz.uh];
};
set([sizes{:,1}],{'position'},sizes(:,2))
set(hand.ruleraxes,'xlim',[0 sz.rw],'ylim',[0 fp(4)-toolbar_ht])
if popupExistFlag
rulerGroupPos = sizes{2,2};
set(ud.ruler.hand.rulerpopup,'position',...
[rulerGroupPos(1) frame_top-sz.uh-sz.lh/2+1 sz.riw*2-2 sz.uh]);
end
% 1-by-2 position vectors (for axes text)
pos = {
hand.rulerlabel [sz.rw/2 frame_top]
};
set([pos{:,1}],{'position'},pos(:,2))
pos_ruler_labels(fig,sz,ud.ruler.type,hand,xtra_ui);
% --------------------------------------------------------------------
% specify rectangles for frame borders (line objects)
% [left bottom right top]
pos = {
hand.rulerframe [sz.ffs ...
frame_top-(sz.lh/2+2*sz.rih+9*sz.fus+n_ui*sz.uh+sz.rih) ...
sz.rw-sz.ffs frame_top]
};
% convert rectangles to xdata and ydata for frame borders (line objects)
[xdata,ydata]=lfdata(pos(:,2), hand.rulerlabel, sz.lfs);
set([pos{:,1}],{'xdata'},xdata,{'ydata'},ydata)
%-----------------------------------------------------------------
% ruler('resizebtns',fig)
% move ruler buttons (1,2) to correct location
% fig - figure handle of the client, such as signal browser,
% filter viewer, or spectrum viewer
%
case 'resizebtns'
if nargin >= 2
fig = varargin{2};
else
fig = gcf;
end
ud = get(fig,'userdata');
sz = ud.sz;
mainaxes = ud.mainaxes;
mp = get(mainaxes,'position');
set(ud.ruler.hand.buttons(1),...
'position',[mp(1)+mp(3)-2*sz.uh mp(2)+mp(4) sz.uh sz.uh])
set(ud.ruler.hand.buttons(2),...
'position',[mp(1)+mp(3)-sz.uh mp(2)+mp(4) sz.uh sz.uh])
%------------------------------------------------------------------------
% ruler('setpopup',fig,str,val)
% set the string and value of the ruler popupmenu
% Inputs:
% fig - figure handle of the client
% str - ruler popupmenu string
% val - ruler popupmenu value
%
case 'setpopup'
fig = varargin{2};
str = varargin{3};
val = varargin{4};
ud = get(fig,'userdata');
set(ud.ruler.hand.rulerpopup,'string',str);
set(ud.ruler.hand.rulerpopup,'value',val);
%------------------------------------------------------------------------
% [str,val] = ruler('getpopup',fig)
% get the string and value of the ruler popupmenu
% Inputs:
% fig - figure handle of the client
% Outputs:
% str - ruler popupmenu string
% val - ruler popupmenu value
%
case 'getpopup'
fig = varargin{2};
ud = get(fig,'userdata');
varargout{1} = get(ud.ruler.hand.rulerpopup,'string');
varargout{2} = get(ud.ruler.hand.rulerpopup,'value');
%------------------------------------------------------------------------
% ruler('allowTrack',on_off,fig)
% Set allowTrack property of rulers; if set to 'off', then
% user cannot switch to track or slope modes, and the peaks and
% valleys buttons are forced off.
% When switched off, the ruler is switched to Vertical mode if it
% was previously in track or slope, and the peaks and valleys are
% turned off.
% Side effect: sets the userdata of the figure
% Inputs:
% on_off - 'on' or 'off'
% fig - figure of rulers
%
case 'allowtrack'
on_off = varargin{2};
fig = varargin{3};
ud = get(fig,'userdata');
switch on_off
case 'on'
ud.ruler.Track_and_Slope_Allowed = 'on';
set(fig,'userdata',ud);
case 'off'
ud.ruler.Track_and_Slope_Allowed = 'off';
set(fig,'userdata',ud);
switch ud.ruler.type
case {'track', 'slope'}
btndown(fig,'rulergroup',1)
btnup(fig,'rulergroup',3)
btnup(fig,'rulergroup',4)
ruler('newtype','vertical',fig)
end
ud = get(fig,'userdata');
% turn off peaks and/or valleys
if btnstate(fig,'peaksgroup',1) % peaks are on
btnup(fig,'peaksgroup',1)
ruler('peaks')
end
if btnstate(fig,'peaksgroup',2) % valleys are on
btnup(fig,'peaksgroup',2)
ruler('valleys')
end
otherwise
error('allowTrack must be ''on'' or ''off''.')
end
%------------------------------------------------------------------------
% ruler('newtype',type,fig)
% OR
% ruler('newtype',type,[x1 x2])
% type can be 'horizontal','vertical','track' or 'slope'.
% positions rulers in center of mainaxes, or if given two values
% as input uses those values.
%
case 'newtype'
type = varargin{2};
if nargin < 3
fig = gcf;
elseif length(varargin{3})==1
fig = varargin{3};
varargin{3} = [];
end
ud = get(fig,'userdata');
old_type = ud.ruler.type;
plotIndex = find(ud.mainaxes == ud.ruler.allAxesList);
if ud.pointer == 2 % help mode
if ~isequal(type,old_type)
btnup(fig,'rulergroup',ruler_btnid(type))
btndown(fig,'rulergroup',ruler_btnid(old_type))
end
spthelp('exit','ruler',type)
return
end
if strcmp(ud.ruler.Track_and_Slope_Allowed,'off') & ...
(strcmp(type,'track') | strcmp(type,'slope'))
btndown(fig,'rulergroup',1+strcmp(old_type,'horizontal'))
btnup(fig,'rulergroup',3)
btnup(fig,'rulergroup',4)
return
end
if isequal(type,old_type) % do nothing if type hasn't changed
return
end
mainaxes = ud.mainaxes;
xlim = get(mainaxes,'xlim');
ylim = get(mainaxes,'ylim');
if ~strcmp(type,'horizontal')
if ~strcmp(old_type,'horizontal')
if nargin < 3 | isempty(varargin{3})
% if both new and old ruler type are vertical,
% retain any visible values.
if (ud.ruler.value.x1 < xlim(1))|(ud.ruler.value.x1>xlim(2))
x1 = 2/3*xlim(1) + 1/3*xlim(2);
else
x1 = ud.ruler.value.x1;
end
if (ud.ruler.value.x2 < xlim(1))|(ud.ruler.value.x2>xlim(2))
x2 = 1/3*xlim(1) + 2/3*xlim(2);
else
x2 = ud.ruler.value.x2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -