📄 sigbrowse.m
字号:
ud.sigs(i).label = s(ind(i)).label;
set(fig,'userdata',ud)
sptlegend('setstring',{ud.sigs.label},{ud.lines.columns},fig,1)
set(get(ud.mainaxes,'title'),'string',sbtitle(fig,ud.sigs,'auto',''))
break
end
end
case 'Fs'
for i=1:length(ind)
if ~isequal(ud.sigs(i).Fs,s(ind(i)).Fs)
% change Fs of ud.sigs(i)
newFs = s(ind(i)).Fs;
oldFs = ud.sigs(i).Fs;
xd = (0:length(s(ind(i)).data)-1)/newFs;
ud.sigs(i).Fs = newFs;
ud.lines(i).Fs = newFs;
set(ud.lines(i).h,'xdata',xd)
if ud.prefs.tool.panner
set(ud.lines(i).ph,'xdata',xd)
end
sbzoomout(ud,0,1)
set(get(ud.mainaxes,'title'),'string',sbtitle(fig,ud.sigs,'auto',''))
break
end
end
case 'clear'
deletedStruc = sptool('changedStruc',sptoolfig);
if ~strcmp(deletedStruc.SPTIdentifier.type,'Signal')
% do nothing
elseif isempty(ind)
sigbrowse('update',fig,s,ind,sptoolfig,msg)
else
% first find out which one was deleted
rmInd = length(ud.sigs);
for i = 1:length(ind)
if ~strcmp(s(ind(i)).label,ud.sigs(i).label)
rmInd = i;
break % found it
end
end
delete(ud.lines(rmInd).h)
if ud.prefs.tool.panner
delete(ud.lines(rmInd).ph)
end
ud.sigs(rmInd) = [];
ud.lines(rmInd) = [];
ud.SPToolIndices = ind;
set(fig,'userdata',ud)
sptlegend('setstring',{ud.sigs.label},{ud.lines.columns},fig,1)
if ud.focusIndex == rmInd
% shift focus to first signal
ud.focusIndex = 1;
% save the focusline handle in the userdata struct:
focusLineInfo = ud.sigs(ud.focusIndex).lineinfo;
ud.focusline = ud.lines(ud.focusIndex).h(focusLineInfo.columns(1));
sbzoomout(ud,0,0) % saves userdata
ud = get(fig,'userdata');
pickfcn('noMouse',ud.focusIndex,1,fig)
else
if ud.focusIndex > rmInd
ud.focusIndex = ud.focusIndex - 1;
end
sbzoomout(ud,0,0) % saves userdata
if ud.prefs.tool.ruler
ruler('showlines',fig)
end
ud = get(fig,'userdata');
end
end % if isempty(ind)
end % switch msg
end % if ~isempty(fig)
varargout{1} = enable;
%------------------------------------------------------------------------
% enable = sigbrowse('action',action,selection)
% respond to button push in SPTool
% possible actions are
% 'view'
case 'action'
sptoolfig = gcf;
fig = findobj('type','figure','tag','sigbrowse');
if isempty(fig)
sigbrowse(sptoolfig)
fig = gcf;
else
figure(fig)
end
ud = get(fig,'userdata');
[s,ind] = sptool('Signals',1,sptoolfig);
if ~isequal(ud.sigs,s(ind))
sigbrowse('update',fig,s,ind,sptoolfig,'new')
end
%------------------------------------------------------------------------
% sigbrowse('SPTclose',action)
% Signal Browser close request function
% This function is called when a browser window is closed.
% action will be: 'view'
case 'SPTclose'
fig = findobj('type','figure','tag','sigbrowse');
if ~isempty(fig)
ud = get(fig,'userdata');
if ~isempty(ud.tabfig)
delete(ud.tabfig)
end
delete(fig)
end
%------------------------------------------------------------------------
% errstr = sigbrowse('setprefs',panelName,p)
% Set preferences for the panel with name panelName
% Inputs:
% panelName - string; must be either 'ruler','color', or 'sigbrowse'
% (see sptprefreg for definitions)
% p - preference structure for this panel
case 'setprefs'
errstr = '';
panelName = varargin{2};
p = varargin{3};
switch panelName
case 'ruler'
rc = evalin('base',p.rulerColor,'-1');
if rc == -1
errstr = 'The Ruler Color you entered cannot be evaluated.';
elseif ~iscolor(rc)
errstr = 'The Ruler Color you entered is not a valid color.';
end
if isempty(errstr)
ms = evalin('base',p.markerSize,'-1');
if ms == -1
errstr = 'The Marker Size you entered cannot be evaluated.';
elseif all(size(ms)~=1) | ms<=0
errstr = 'The Marker Size you entered must be a real scalar.';
end
end
case 'color'
co = evalin('base',p.colorOrder,'-1');
if co == -1
errstr = 'The Color Order that you entered cannot be evaluated.';
else
if ~iscell(co)
co = num2cell(co,[3 2]); % convert to cell array
end
for i = 1:length(co)
if ~iscolor(co{i})
errstr = 'The Color Order that you entered is invalid.';
break
end
end
end
if isempty(errstr)
lso = evalin('base',p.linestyleOrder,'-1');
if lso == -1
errstr = 'The Line Style Order that you entered cannot be evaluated.';
else
if ~iscell(lso)
lso = num2cell(lso,[3 2]); % convert to cell array
end
for i = 1:length(lso)
if isempty(findcstr({'-' '--' ':' '-.'},lso{i}))
errstr = 'The Line Style Order that you entered is invalid.';
break
end
end
end
end
case 'sigbrowse'
end
varargout{1} = errstr;
if ~isempty(errstr)
return
end
fig = findobj('type','figure','tag','sigbrowse');
if ~isempty(fig)
ud = get(fig,'userdata');
newprefs = ud.prefs;
switch panelName
case 'ruler'
markerStr = { '+' 'o' '*' '.' 'x' ...
'square' 'diamond' 'v' '^' '>' '<' 'pentagram' 'hexagram'}';
newprefs.ruler.color = p.rulerColor;
newprefs.ruler.marker = markerStr{p.rulerMarker};
newprefs.ruler.markersize = p.markerSize;
if ud.prefs.tool.ruler
rc = evalin('base',newprefs.ruler.color);
set(ud.ruler.lines,'color',rc);
set(ud.ruler.markers,'color',rc,'marker',newprefs.ruler.marker,...
'markersize',evalin('base',newprefs.ruler.markersize))
end
case 'color'
newprefs.colororder = p.colorOrder;
newprefs.linestyleorder = p.linestyleOrder;
ud.colororder = num2cell(evalin('base',newprefs.colororder),2);
ud.linestyleorder = num2cell(evalin('base',newprefs.linestyleorder),2);
case 'sigbrowse'
newprefs.xaxis.label = p.xlabel;
newprefs.yaxis.label = p.ylabel;
newprefs.tool.ruler = p.rulerEnable;
newprefs.tool.panner = p.pannerEnable;
newprefs.tool.zoompersist = p.zoomFlag;
set(get(ud.mainaxes,'xlabel'),'string',p.xlabel)
set(get(ud.mainaxes,'ylabel'),'string',p.ylabel)
% resize flags
rbrowse = 0;
rpanner = 0;
% enable / disable ruler
if ud.prefs.tool.ruler~=newprefs.tool.ruler
if newprefs.tool.ruler
% turn ruler on
rulerPrefs = sptool('getprefs','ruler');
typeStr = {'vertical','horizontal','track','slope'};
ud.prefs.ruler.type = typeStr{rulerPrefs.initialType};
set(fig,'userdata',ud)
ruler('init',fig)
ruler('showlines',fig)
ruler('newlimits',fig)
ruler('newsig',fig)
else
ruler('close',fig)
end
ud = get(fig,'userdata');
rbrowse = 1;
if newprefs.tool.panner, rpanner = 1; end
end
% enable / disable panner
if ud.prefs.tool.panner~=newprefs.tool.panner
if newprefs.tool.panner
panner('init',fig)
ud = get(fig,'userdata');
for i=1:length(ud.lines)
ud.lines.ph = copyobj(ud.lines.h,ud.panner.panaxes);
set(ud.lines.ph,'buttondownfcn','sbswitch(''pandown'',1)')
end
else
panner('close',fig)
ud = get(fig,'userdata');
end
rbrowse = 1;
end
% resize objects if necessary:
if rbrowse,
sbresize(0,fig)
if newprefs.tool.ruler
ruler('resizebtns',fig)
end
end
if rpanner, panner('resize',0,fig), end
end
ud.prefs = newprefs;
set(fig,'userdata',ud)
end
%------------------------------------------------------------------------
% sigbrowse('help')
% Callback of help button in toolbar
case 'help'
fig = gcf;
ud = get(fig,'userdata');
if ud.pointer ~= 2 % if not in help mode
% enter help mode
saveEnableControls = [ ud.hand.arraybutton
ud.hand.complexpopup
ud.legend.legendpopup
ud.legend.legendbutton];
ax = [ud.mainaxes ud.toolbar.toolbar];
if ud.prefs.tool.ruler
ax = [ax ud.ruler.hand.ruleraxes];
end
if ud.prefs.tool.panner
ax = [ax ud.panner.panaxes];
end
titleStr = 'Signal Browser Help';
helpFcn = 'sbhelpstr';
spthelp('enter',fig,saveEnableControls,ax,titleStr,helpFcn)
else
spthelp('exit')
end
%------------------------------------------------------------------------
% default
otherwise
if isstr(varargin{1})
disp(sprintf('Sigbrowse: action ''%s'' not recognized',varargin{1}))
else
disp(sprintf('Sigbrowse: takes no arguments',varargin{1}))
end
end
function sbzoomout(ud,xflag,rulerFlag)
% reset limits of mainaxes, and set Full View limits (ud.limits field)
% Inputs:
% ud - userdata struct
% xflag - 1 ==> zoom out in x
% 0 ==> keep xlimits the same
% rulerFlag (optional) - 1 ==> update rulers (default)
% 0 ==> don't update rulers
% CAUTION: Sets figure userdata !!!!!
if nargin < 3
rulerFlag = 1;
end
fig = get(ud.mainaxes,'parent');
% turn off rulers for limits calculation:
if ud.prefs.tool.ruler
h = [ud.ruler.lines(:); ud.ruler.markers(:)];
set(h,'visible','off')
end
% zoom out
set(ud.mainaxes,'ylimmode','auto')
if isempty(ud.sigs)
xlim = get(ud.mainaxes,'xlim');
ylim = get(ud.mainaxes,'ylim');
elseif xflag % FULL VIEW
x2 = 0;
for i=1:length(ud.sigs)
x2 = max(x2,(size(ud.sigs(i).data,1)-1)/ud.sigs(i).Fs);
end
if x2 <= 0
x2 = max(1./[ud.sigs.Fs]);
end
xlim = [0 x2];
ud.limits.xlim = xlim;
set(ud.mainaxes,'xlim',xlim)
ylim = get(ud.mainaxes,'ylim');
ud.limits.ylim = ylim;
else % only zoom out Y, but update ud.limits to FULL VIEW
xlim = get(ud.mainaxes,'xlim');
x2 = 0;
for i=1:length(ud.sigs)
x2 = max(x2,(size(ud.sigs(i).data,1)-1)/ud.sigs(i).Fs);
end
if x2 <= 0
x2 = max(1./[ud.sigs.Fs]);
end
ud.limits.xlim = [0 x2];
set(ud.mainaxes,'xlim',ud.limits.xlim)
ud.limits.ylim = get(ud.mainaxes,'ylim');
set(ud.mainaxes,'xlim',xlim)
ylim = get(ud.mainaxes,'ylim');
end
xlim = inbounds(xlim,ud.limits.xlim);
set(ud.mainaxes,'xlim',xlim,'ylim',ylim)
set(fig,'userdata',ud)
if ud.prefs.tool.panner
set(ud.panner.panaxes,'xlim',ud.limits.xlim,'ylim',ud.limits.ylim)
panner('update',fig)
end
if ud.prefs.tool.ruler & rulerFlag
ruler('showlines',fig)
ruler('newlimits',fig)
ruler('newsig',fig)
end
function data = sbcomplexfcn(data,cv,cf)
%SBCOMPLEXFCN Signal Browser complex number conversion function.
% Inputs:
% data - matrix to be converted
% cv - complex value (1=real,2=imag,3=mag,4=angle)
% cf - complex flag (0 = no, 1 = yes)
% Outputs:
% data - converted input data
if cf
switch cv
case 1 % real
data = real(data);
case 2 % imaginary
data = imag(data);
case 3 % magnitude
data = abs(data);
case 4 % angle
data = angle(data);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -