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