www.gusucode.com > mbcguitools 工具箱 matlab 源码程序 > mbcguitools/@mvgraph4d/set.m
function gr=set(gr,varargin) %SET Set interface for the graph4d object % Provides a set interface to the graph4d object. % % Valid properties are: % 'Position' - 4 element position vector in pixels % 'Visible' - 'on' or 'off' % 'Data' - matrix of data with a column for each factor % 'Factors' - cell array of strings corresponding to each factor % 'Parent' - change parent figure (useful for saving a copy of graph) % 'Limits' - set explicit limits for each factor % 'Factorselection - 'exclusive' or 'normal' % 'Userange' - toggle on the range on the colormap variable % 'Type' - 'scatter', 'mesh', 'surface' % 'Backgroundcolor' - color for background patch % 'Frame' - On/off: turn bounding frame on/off % 'Callback' - Callback function called when factor is changed % % Plus a load of other properties that are visible by getting the handles % Copyright 2000-2015 The MathWorks, Inc. and Ford Global Technologies, Inc. % Bail if we've not been given a graph4d object if ~isa(gr,'mvgraph4d') error(message('mbc:mvgraph4d:InvalidObject1')) end redraws=[0 0 0 0]; % flags to signal a factorsort, graphlim, plot and cbarfaces % loop over varargin for n=1:2:(nargin-2) drawreqs=[0 0 0 0]; switch lower(varargin{n}) case 'position' newpos = varargin{n+1}; set(gr.panel, 'Position', newpos); ud = gr.DataPointer.info; oldpos = ud.position; ud.position = newpos; gr.DataPointer.info = ud; % Update position of items within the panel if required if any(oldpos(3:4)~=newpos(3:4)) [gr,drawreqs]=i_position(gr,newpos); end case 'visible' set(gr.panel, 'Visible', varargin{n+1}); mv_rotate3d(gr.axes,upper(varargin{n+1})); case {'data','value','number'} [gr,drawreqs] = i_data(gr,varargin{n+1}); case 'factors' [gr,drawreqs] = i_factors(gr,varargin{n+1}); case 'parent' set(gr.panel,'Parent',varargin{n+1}); case 'type' [gr,drawreqs] = i_type(gr,varargin{n+1}); case 'colormap' [gr,drawreqs] = i_cmap(gr,varargin{n+1}); case 'frame' [gr,drawreqs] = i_frame(gr,varargin{n+1}); case 'userange' switch lower(varargin{n+1}); case 'on' set(gr.colorbar.userange,'Value',1); case 'off' set(gr.colorbar.userange,'Value',0); end chboxcb(gr); case 'factorselection' [gr,drawreqs] = i_seltype(gr,varargin{n+1}); case 'limits' [gr,drawreqs] = i_limits(gr,varargin{n+1}); case 'backgroundcolor' [gr,drawreqs] = i_backclr(gr,varargin{n+1}); case 'datatags' [gr,drawreqs] = i_datatagtype(gr,varargin{n+1}); case 'customdatatags' [gr,drawreqs] = i_customtags(gr,varargin{n+1}); case 'callback' ud = gr.DataPointer.info; ud.callback = varargin{n+1}; gr.DataPointer.info = ud; end redraws= (redraws | drawreqs); end if redraws(1) pr_factorsort(gr); end if redraws(2) pr_graphlim(gr); end if redraws(3) pr_plot(gr); end if redraws(4) pr_cbarfaces(gr.colorbar.bar,get(gr.colorbar.bar,'FaceVertexCData')); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_position - alter position of object in figure window %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs] = i_position(gr,newpos) drawreqs=[0 0 0 0]; % Adjust rectangle to account for the border width newpos(3:4) = newpos(3:4)-2; ud = gr.DataPointer.info; mnsz = minsize(gr); if newpos(3)<mnsz(1) || newpos(4)<mnsz(2) % go to blackout mode set([gr.axes;gr.xfactor;gr.yfactor;gr.xtext;gr.ytext;gr.zfactor;gr.ztext;... gr.ctext;gr.cfactor;gr.colorbar.axes;gr.colorbar.bar;gr.surf;gr.colorbar.frame1;... gr.colorbar.frame2;gr.colorbar.minrange;gr.colorbar.midrange;gr.colorbar.maxrange;... gr.colorbar.userange],'Visible','off'); set(ud.datataghandles, 'Visible', 'off'); % need to calc position of icon impos=[max(floor(newpos(3:4).*0.5)-15, [1 1]), min([32 32],newpos(3:4))]; impos = mbcgui.util.clipRect(impos); set(gr.badim,'Position',impos,'Visible','on'); else cellpos=cell(13,1); % work out positions % axes pos(1)=70; pos(3)=max(newpos(3)-180,1); pos(2)=110; pos(4)=newpos(4)-125; cellpos{1}=mbcgui.util.clipRect(pos); % decide uiwidth uihs=70; if newpos(3)<288 uihs=(newpos(3)-8)*0.25; end halfuihs=uihs*0.5; % ui's % xtext pos(1)=newpos(3).*0.125-halfuihs; pos(2)=32; pos(3)=uihs; pos(4)=16; cellpos{2}=pos; % xfactor pos(1)=newpos(3).*0.125-halfuihs; pos(2)=10; pos(3)=uihs; pos(4)=20; cellpos{3}=pos; % ytext pos(1)=newpos(3).*0.375-halfuihs; pos(2)=32; pos(3)=uihs; pos(4)=16; cellpos{4}=pos; % yfactor pos(1)=newpos(3).*0.375-halfuihs; pos(2)=10; pos(3)=uihs; pos(4)=20; cellpos{5}=pos; % ztext pos(1)=newpos(3).*0.625-halfuihs; pos(2)=32; pos(3)=uihs; pos(4)=16; cellpos{6}=pos; % zfactor pos(1)=newpos(3).*0.625-halfuihs; pos(2)=10; pos(3)=uihs; pos(4)=20; cellpos{7}=pos; % ctext pos(1)=newpos(3).*0.875-halfuihs; pos(2)=32; pos(3)=uihs; pos(4)=16; cellpos{8}=pos; % cfactor pos(1)=newpos(3).*0.875-halfuihs; pos(2)=10; pos(3)=uihs; pos(4)=20; cellpos{9}=pos; % colorbar % axes pos(1)=newpos(3)-60; pos(2)=100; pos(3)=20; pos(4)=newpos(4)-125; cellpos{10}=mbcgui.util.clipRect(pos); drawreqs(2)=1; % bar % no resize necessary % range bars ylim=get(gr.colorbar.axes,'YLim'); clen=ylim(2)-ylim(1); delta=2*(clen)/(newpos(4)-125); barval = ud.rangepositions(1); set(gr.colorbar.minrange,'Vertices',[0 barval+delta/4; 0.5 barval+2*delta; 1 barval+delta/4;... 0 barval-delta/4; 0.5 barval-2*delta; 1 barval-delta/4]); barval = ud.rangepositions(2); set(gr.colorbar.midrange,'Vertices',[0 barval+delta/4; 0.5 barval+2*delta; 1 barval+delta/4;... 0 barval-delta/4; 0.5 barval-2*delta; 1 barval-delta/4]); barval = ud.rangepositions(3); set(gr.colorbar.maxrange,'Vertices',[0 barval+delta/4; 0.5 barval+2*delta; 1 barval+delta/4;... 0 barval-delta/4; 0.5 barval-2*delta; 1 barval-delta/4]); % extra frame bits pos(1)=newpos(3)-51; pos(2)=90; pos(3)=2; pos(4)=10; cellpos{11}=pos; pos(1)=newpos(3)-86; pos(2)=89; pos(3)=72; pos(4)=1; cellpos{12}=pos; % range checkbox pos(1)=newpos(3)-86; pos(2)=65; pos(3)=72; pos(4)=24; cellpos{13}=pos; set([gr.axes; gr.xtext; gr.xfactor; gr.ytext; gr.yfactor; gr.ztext; gr.zfactor;... gr.ctext; gr.cfactor; gr.colorbar.axes; gr.colorbar.frame1; gr.colorbar.frame2; gr.colorbar.userange],... {'Position'},cellpos); set(gr.badim, 'Visible', 'off'); hndls=[gr.axes;gr.xtext;gr.xfactor;gr.ytext;gr.yfactor;gr.ztext;gr.zfactor;... gr.ctext;gr.cfactor;gr.colorbar.axes;gr.colorbar.bar;gr.surf;gr.colorbar.frame1;... gr.colorbar.frame2;gr.colorbar.userange]; if get(gr.colorbar.userange,'Value') hndls=[hndls;gr.colorbar.minrange;gr.colorbar.midrange;gr.colorbar.maxrange]; end set(hndls,'Visible','on'); set(ud.datataghandles, 'Visible', 'on'); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_data - insert data into object %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs] = i_data(gr,data) ud = gr.DataPointer.info; ud.data = data; gr.DataPointer.info = ud; drawreqs=[1 1 1 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_factors - insert factors into object %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs] = i_factors(gr,factors) if ischar(factors) factors={factors}; end ud = gr.DataPointer.info; ud.factors = factors; gr.DataPointer.info = ud; drawreqs=[1 0 1 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_type - change type of 3d graph %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs] = i_type(gr,tp) drawreqs=[0 0 0 0]; ud = gr.DataPointer.info; if ~strcmp(tp,ud.type) % only redraw for a change of type ud.type = tp; gr.DataPointer.info = ud; drawreqs(3)=1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_cmap - insert new colormap for image view %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs] = i_cmap(gr,cmap) ud = gr.DataPointer.info; oldylim=get(gr.colorbar.axes,'YLim'); % update colorbar set(gr.colorbar.axes,'YLim',[0.5 size(cmap,1)+0.5]); pr_cbarfaces(gr.colorbar.bar,cmap); % Update range bars on colorbar cbpos=get(gr.colorbar.axes,'Position'); clen = size(cmap,1); delta = 2*(clen)/(cbpos(4)); barval = ud.rangepositions(1); barval = 0.5+(clen).*(barval-oldylim(1))./(oldylim(2)-oldylim(1)); set(gr.colorbar.minrange,'Vertices',[0 barval+delta/4; 0.5 barval+2*delta; 1 barval+delta/4;... 0 barval-delta/4; 0.5 barval-2*delta; 1 barval-delta/4]); ud.rangepositions(1) = barval; barval = ud.rangepositions(2); barval=0.5+(clen).*(barval-oldylim(1))./(oldylim(2)-oldylim(1)); set(gr.colorbar.midrange,'Vertices',[0 barval+delta/4; 0.5 barval+2*delta; 1 barval+delta/4;... 0 barval-delta/4; 0.5 barval-2*delta; 1 barval-delta/4]); ud.rangepositions(2) = barval; barval = ud.rangepositions(3); barval=0.5+(clen).*(barval-oldylim(1))./(oldylim(2)-oldylim(1)); set(gr.colorbar.maxrange,'Vertices',[0 barval+delta/4; 0.5 barval+2*delta; 1 barval+delta/4;... 0 barval-delta/4; 0.5 barval-2*delta; 1 barval-delta/4]); ud.rangepositions(3) = barval; gr.DataPointer.info = ud; drawreqs=[0 1 1 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_seltype - change behaviour of lists %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs] = i_seltype(gr,selset) drawreqs=[0 0 0 0]; ud = gr.DataPointer.info; switch lower(selset) case 'exclusive' % check settings lbls=get(gr.xfactor,'String'); if ~iscell(lbls) lmax=1; else lmax=length(lbls); end vals=get([gr.xfactor;gr.yfactor;gr.zfactor],{'Value'}); vals=cat(1,vals{:}); ch=0; used=vals(1); for n=2:3 if any(vals(n)==used) % find lowest unused srch=1:(length(used)+1); new=setxor(used,srch); new=min(new(1),lmax); vals(n)=new; ch=1; end used=[used vals(n)]; end if ch set([gr.xfactor;gr.yfactor;gr.zfactor],{'Value'},num2cell(vals)); drawreqs([2 3])=1; end ud.factorselection = 1; case 'normal' % just change flag ud.factorselection = 0; end gr.DataPointer.info = ud; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_limits - set explicit limits on the factors %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_limits(gr,lim) if iscell(lim) ud = gr.DataPointer.info; ud.limits = lim; gr.DataPointer.info = ud; end drawreqs=[0 1 1 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_backclr - change background colour %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs] = i_backclr(gr,col) drawreqs=[0 0 0 0]; ud = gr.DataPointer.info; set(gr.panel,'BackgroundColor',col); if ~ud.frame set(gr.panel,'HighlightColor',col); end set([gr.xtext;gr.ytext;gr.ztext;gr.ctext;gr.colorbar.userange],'BackgroundColor',col); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_frame - turn bounding frame on/off %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs]=i_frame(gr,state) ud = gr.DataPointer.info; if strcmp(state,'on') set(gr.panel,'HighlightColor','k'); ud.frame = 1; else set(gr.panel,'HighlightColor',get(gr.panel, 'BackgroundColor')); ud.frame = 0; end gr.DataPointer.info = ud; drawreqs=[0 0 0 0]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_datatagtype - set data tag type %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs] = i_datatagtype(gr,tagtype) ud = gr.DataPointer.info; switch lower(tagtype) case 'none' tp = 0; case 'enumerate' tp = 1; case 'custom' tp = 2; case 'coincident' tp = 3; otherwise tp = 0; end if tp~=ud.datatags ud.datatags = tp; if tp==0 delete(ud.datataghandles); ud.datataghandles = []; drawreqs = [0 0 0 0]; else drawreqs = [0 0 1 0]; end gr.DataPointer.info = ud; else drawreqs = [0 0 0 0]; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% i_customtags - set custom tag strings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [gr,drawreqs] = i_customtags(gr,sTags) if iscell(sTags) ud = gr.DataPointer.info; ud.customdatatags = sTags; gr.DataPointer.info = ud; if ud.datatags==2 drawreqs = [0 0 1 0]; else drawreqs = [0 0 0 0]; end end