📄 xferplot.m
字号:
else % Turn on AxisZoom: % - turn off top-level menus set(fig_data.menu.top,'vis','off'); set(hax, fig_data.main.axiszoom.on{:});end% Turn on scalar warning message, if appropriate:% ------------------------------isScalarPlot = (samples_per_channel==1) & (nframes==1);if isScalarPlot, if block_data.params.Domain==2, tstr='[Plotting single points - consider using a vector input]'; else tstr='[Plotting single points - consider increasing the display span]'; endelse tstr='';endset(get(hax,'Title'), 'String', tstr, 'color','b');% Update Frame Number display:% ----------------------------%if isOn(block_data.params.FrameNumber), % Move frame # text depending on axis zoom (on or off) % The frame handle vector contains: % .hframenum(1) = "Frame:" % .hframenum(2) = "###" % NOTE: Position of frame readout is updated in figresize % if isOn(block_data.params.AxisZoom), % Axis zoom on - x-axis is not visible ltgrayt = ones(1,3)*.6; % slightly darker for grid labels set(block_data.hframenum, ... 'verticalalignment','bottom', ... 'color',ltgrayt, 'vis','on'); else % Axis zoom off - x-axis is visible set(block_data.hframenum, ... 'verticalalignment','cap', ... 'color','k', 'vis','on'); endelse set(block_data.hframenum,'vis','off');end% Update line erase mode (Persistence):startLineEraseMode(block_name);UpdateLegend(block_name);% Manually call the resize fcn:FigResize([],[],hfig);% ---------------------------------------------------------------function UpdateLegend(blk)block_data = get_param(blk,'UserData');hlegend = block_data.hlegend;useLegend = isOn(block_data.params.AxisLegend);if ishandle(hlegend), delete(hlegend);endhlegend = [];if useLegend, hlines = block_data.hline; % Get signal names: names = getInputSignalNames(blk); % Prevent failures in legend: prop = 'ShowHiddenHandles'; old_state = get(0,prop); set(0,prop,'on'); axes(block_data.haxis); hlegend = legend(hlines, names{:}); % hlegend = legend(block_data.haxis, hlines, str{:}); set(0,prop,old_state);end% Store changes to legend handle:block_data.hlegend = hlegend;set_param(blk,'UserData',block_data);% ---------------------------------------------------------------function UpdateFrameNumPos(blk)block_data = get_param(blk,'UserData');if isOn(block_data.params.FrameNumber), if isOn(block_data.params.AxisZoom), % Axis zoom on - x-axis is not visible % % Position "Frame: #" text above the x-axis tick numbers % and to the right of the y-axis tick numbers % hgridtxt = block_data.hgridtext; grid_ext = get(hgridtxt(1),'extent'); ypos = grid_ext(2)+grid_ext(4); grid_ext = get(hgridtxt(end),'extent'); xpos = grid_ext(1)+grid_ext(3); set(block_data.hframenum(1), ... 'units','data', 'pos',[xpos ypos]); ex=get(block_data.hframenum(1),'extent'); set(block_data.hframenum(2), ... 'units','data', 'pos',[ex(1)+ex(3) ypos]); else % Axis zoom off - x-axis is visible % % Position "Frame: #" at the same y-level as the x-axis label % and flush with the start of the x-axis. hax = block_data.haxis; hxtitle = get(hax,'xlabel'); set(hxtitle','units','data'); xtpos = get(hxtitle,'pos'); xlim = get(hax,'xlim'); set(block_data.hframenum(1), 'units','data', ... 'pos',[xlim(1) xtpos(2)]); ex=get(block_data.hframenum(1),'extent'); frpos = [ex(1)+ex(3) xtpos(2)]; set(block_data.hframenum(2), 'units','data', ... 'pos',frpos); % If xlabel overlaps frame label, turn off frame label: xtitle_ex = get(hxtitle,'extent'); fr_ex = get(block_data.hframenum(2),'extent'); overlap = xtitle_ex(1) < (fr_ex(1)+fr_ex(3)); if overlap, vis='off'; else vis='on'; end set(block_data.hframenum,'vis',vis); endend% ---------------------------------------------------------------function FigResize(hcb,eventStruct,hfig)% Callback from window resize functionif nargin<3, hfig = gcbf; endfig_data = get(hfig,'UserData');if isempty(fig_data), return; endblk = fig_data.block;block_data = get_param(blk,'UserData');% Resize the axis when not in "compact display" (axis zoom) mode:if ~isOn(block_data.params.AxisZoom), fig_pos = get(hfig,'pos'); ax_pos = [60 40 max([1 1], fig_pos([3 4])-[80 60])]; set(block_data.haxis, 'pos',ax_pos);endUpdateGrid(blk); % Do this prior to repositioning frame # textUpdateFrameNumPos(blk);% Update legend, if it is on:if isOn(block_data.params.AxisLegend), legend('ResizeLegend', block_data.haxis);end% ---------------------------------------------------------------function fig_data = create_scope(block_name, params, nchans)% CREATE_SCOPE Create new scope GUI% Initialize empty settings:fig_data.main = []; % until we move things herefig_data.menu = [];hfig = figure('numbertitle', 'off', ... 'name', block_name, ... 'menubar', 'none', ... 'position', params.FigPos, ... 'nextplot', 'add', ... 'integerhandle', 'off', ... 'doublebuffer', 'off', ... 'PaperPositionMode', 'auto', ... 'ResizeFcn', @FigResize, ... 'DeleteFcn', @FigDelete, ... 'HandleVisibility', 'callback');hax = axes('Parent',hfig, ... 'DrawMode','fast', ... 'Box','on', 'ticklength',[0 0], ... 'Position', [0.1300 0.1450 0.7750 0.8000]);% Set up line for each channel:for i = 1:nchans, hline(i) = line('parent',hax, ... 'xdata',NaN, 'ydata',NaN);endhstem = line('parent',hax, ... 'xdata',NaN, 'ydata',NaN);hgrid = line('parent',hax, ... 'xdata',NaN, 'ydata',NaN, ... 'erasemode','xor', 'color',[.8 .8 .8]);% Create non-displaying line to use for color translationshcspec = line('parent',hax, ... 'xdata',nan,'ydata',nan, ... 'vis','off');% Create Frame Number texthframenum(1) = text(0,0,'','parent',hax);hframenum(2) = text(0,0,'','parent',hax);set(hframenum(1),'string','Frame: ','erase','xor','horiz','left');set(hframenum(2),'string','-','erase','xor','userdata',0,'horiz','left');% Create a context menu:mContext = uicontextmenu('parent',hfig);% Establish settings for all structure fields:fig_data.block = block_name;fig_data.hfig = hfig;fig_data.hcspec = hcspec;% Store major settings:fig_data.main.haxis = hax;fig_data.main.hline = hline;fig_data.main.hstem = hstem;fig_data.main.hgrid = hgrid;fig_data.main.hframenum = hframenum;fig_data.menu.context = mContext;% Set the non-compact display axis to pixels,% so resizing does not affect itset(hax,'units','pixels')% Store settings for axis zoom:% Cell-array contains {params, values},% where params itself is a cell-array of Units and Position% and values is a cell-array of corresponding values.p = {'Units','Position'};fig_data.main.axiszoom.off = {p, get(hax, p)};fig_data.main.axiszoom.on = {p, {'Normalized',[0 0 1 1]}};% ---------------------------------------------------------% Figure menus:% ---------------------------------------------------------%% Define FILE menu:%pcwin = strcmp(computer,'PCWIN');if pcwin, labels = {'&File', ... '&Close', ... '&Export...', ... 'Pa&ge Setup...', ... 'Print Set&up...', ... 'Print Pre&view...', ... '&Print...'};else labels = {'File', ... 'Close', ... 'Export...', ... 'Page Setup...', ... 'Print Setup...', ... 'Print Preview...', ... 'Print...'};end%mFile = uimenu(hfig,'Label',labels{1});%% submenu items:uimenu(mFile, 'label',labels{2}, ... 'accel','W', ... 'callback',{@CloseFigure, block_name});%uimenu(mFile, 'label',labels{3}, ...% 'separator','on', ...% 'callback','filemenufcn(gcbf,''FileExport'')');uimenu(mFile, 'label',labels{4}, ... 'separator','on', ... 'callback','pagesetupdlg(gcbf)');uimenu(mFile, 'label',labels{5}, ... 'callback','printdlg(''-setup'')');uimenu(mFile, 'label',labels{6}, ... 'callback','printpreview(gcbf)');uimenu(mFile, 'label',labels{7}, ... 'accel','P', ... 'callback','printdlg(gcbf)');%% Define AXES menu labels:%if pcwin, labels = {'&Axes', 'Per&sistence', '&Refresh', ... '&Autoscale', 'Show &grid', 'Compact &display', ... '&Frame #', 'Channel &legend', 'Save &position'};else labels = {'Axes', 'Persistence', 'Refresh', ... 'Autoscale', 'Show grid', 'Compact display', ... 'Frame #', 'Channel legend', 'Save position'};end%% Create figure AXIS menu%mAxes = uimenu(hfig, 'Label', labels{1}); % top-level Axes menu in figure%% submenu items:fig_data.menu.memory = uimenu(mAxes, 'label',labels{2}, ... 'callback',@Memory);fig_data.menu.refresh = uimenu(mAxes, 'label',labels{3}, ... 'callback',@FigRefresh);fig_data.menu.autoscale = uimenu(mAxes, 'label',labels{4}, ... 'separator','on', 'callback', @Autoscale);% - Create Axis Grid itemfig_data.menu.axisgrid = uimenu(mAxes, 'Label', labels{5}, ... 'Callback', @AxisGrid);% - Create Axis Zoom itemfig_data.menu.axiszoom = uimenu(mAxes, ... 'Label', labels{6}, ... 'Callback', @AxisZoom);% - Create Axis Frame Number itemfig_data.menu.framenumber = uimenu(mAxes, 'Label', labels{7}, ... 'Callback', @FrameNumber);% - Create Axis Legend itemfig_data.menu.axislegend = uimenu(mAxes, 'Label', labels{8}, ... 'Callback', @AxisLegend);% - Create Record Position itemfig_data.menu.recpos = uimenu(mAxes, 'label',labels{9}, ... 'callback', @SaveFigPos, ... 'separator','on');% Define OPTIONS menu labels:%if pcwin, % Use "&" for accelerator characters on the PC: labels = {'&Channels', '&Style', '&Marker', '&Color'};else labels = {'Channels', 'Style', 'Marker', 'Color'};end%% Create menus as if there were only ONE line in display:if nchans >= 1, mLines = uimenu(hfig, 'label',labels{1}); % top-level Lines menu in figure lsmenu = uimenu(mLines, 'label',labels{2}); lmmenu = uimenu(mLines, 'label',labels{3}); lcmenu = uimenu(mLines, 'label',labels{4}); fig_data.menu.linestyle = lsmenu; fig_data.menu.linemarker = lmmenu; fig_data.menu.linecolor = lcmenu; % Line styles submenu: uimenu(lsmenu,'label',' None', 'userdata','None', ... 'callback',@LineStyle); uimenu(lsmenu,'label',' -', 'userdata','-', ... 'callback',@LineStyle); uimenu(lsmenu,'label',' --', 'userdata','--', ... 'callback',@LineStyle); uimenu(lsmenu,'label',' :', 'userdata',':', ... 'callback',@LineStyle); uimenu(lsmenu,'label',' -.', 'userdata','-.', ... 'callback',@LineStyle); % Line markers submenu: uimenu(lmmenu,'label','None','userdata','None', ... 'callback',@LineMarker); uimenu(lmmenu,'label','+','userdata','+',... 'callback',@LineMarker); uimenu(lmmenu,'label','o','userdata','o',... 'callback',@LineMarker); uimenu(lmmenu,'label','*','userdata','*',... 'callback',@LineMarker); uimenu(lmmenu,'label','.','userdata','.',... 'callback',@LineMarker); uimenu(lmmenu,'label','x','userdata','x',... 'callback',@LineMarker); uimenu(lmmenu,'label','Square','userdata','Square',... 'callback',@LineMarker); uimenu(lmmenu,'label','Diamond','userdata','diamond',... 'callback',@LineMarker); uimenu(lmmenu,'label','Stem','userdata','stem',... 'callback',@LineMarker); % Line colors submenu: % UserData holds valid RGB triples for each entry uimenu(lcmenu,'label','Cyan','userdata',[0 1 1],... 'callback',@LineColor); uimenu(lcmenu,'label','Magenta','userdata',[1 0 1],... 'callback',@LineColor); uimenu(lcmenu,'label','Yellow','userdata',[1 1 0],... 'callback',@LineColor); uimenu(lcmenu,'label','Black','userdata',[0 0 0],... 'callback',@LineColor); uimenu(lcmenu,'label','Red','userdata',[1 0 0],... 'callback',@LineColor); uimenu(lcmenu,'label','Green','userdata',[0 1 0],... 'callback',@LineColor); uimenu(lcmenu,'label','Blue','userdata',[0 0 1],... 'callback',@LineColor); uimenu(lcmenu,'label','White','userdata',[1 1 1 ],... 'callback',@LineColor);end%% Define WINDOW menu%if pcwin, labels = {'&Window'};else labels = {'Window'};endmWindow = uimenu(hfig,'Label',labels{1}, ... 'tag','winmenu', ... 'callback', winmenu('callback'));% Help menu:mHelp = uimenu(hfig,'Label','&Help');% Help->Help Topics:uimenu('parent',mHelp, ... 'label','&Help Topics', ... 'callback', @HelpTopicsCB);% Help->What's This? submenu:%uimenu('parent',mHelp, ...% 'label','&What''s This?', ...% 'callback', @HelpWhatsThisCB);% Store all top-level menu items in one vectorfig_data.menu.top = [mFile mAxes mLines mWindow mHelp];% Recreate the figure and context menus if there are 2 or more lines%% One line menu item for each channel.% Need to position the menu items according to iif nchans==1, % Single line display: % Just to allow things to be easy, define a "visible" menu item, % but make them invisible (doesn't seem to make a lot of sense % for one channel): fig_data.menu.linedisable(1,i) = uimenu(mLines,'label','Visible',... 'callback',@LineDisable,'position'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -