www.gusucode.com > mbcguitools 工具箱 matlab 源码程序 > mbcguitools/@mvgraph3d/set.m

    function gr=set(gr,varargin)
%SET   Set interface for graph3d objects
%   Provides a set interface to the graph3d 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)
%     'Type'      -  set to 'scatter', 'mesh', 'surface'
%     'Colormap'  -  define colormap for object
%     'Grid'      -  turn the grid on/off on the axes
%     'XGrid'    \
%     'YGrid'     -  turn the grid on/off for each direction
%     'ZGrid'    /
%     'Factorselection' - 'exclusive'/'normal'
%     'Limits'    -  explicitly set limits for each variable
%     'Backgroundcolor' - color for background patch
%     'Frame'     -  On/off: turn the bounding frame on or 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 graph2d object
if ~isa(gr,'mvgraph3d')
    error(message('mbc:mvgraph3d:InvalidObject'))
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 'currentxfactor'
            [gr,drawreqs]=i_select(gr,varargin{n+1},'x');
        case 'currentyfactor'
            [gr,drawreqs]=i_select(gr,varargin{n+1},'y');
        case 'currentzfactor'
            [gr,drawreqs]=i_select(gr,varargin{n+1},'z');
        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 'grid'
            [gr,drawreqs] = i_grid(gr,'xyz',varargin{n+1});
        case 'xgrid'
            [gr,drawreqs] = i_grid(gr,'x',varargin{n+1});
        case 'ygrid'
            [gr,drawreqs] = i_grid(gr,'y',varargin{n+1});
        case 'zgrid'
            [gr,drawreqs] = i_grid(gr,'z',varargin{n+1});
        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 'frame'
            [gr,drawreqs] = i_frame(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;

% if position is too small, display an image indicating this
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.colorbar.axes;gr.colorbar.bar;gr.surf],'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(8,1);
    % work out positions
    
    % axes
    pos(1)=70;
    pos(3)=newpos(3)-180;
    pos(2)=110;
    pos(4)=newpos(4)-125;
    cellpos{1}= mbcgui.util.clipRect(pos);
    
    % decide ui size
    uihs=70;
    if newpos(3)<216
        uihs=floor((newpos(3)-6)./3); 
    end
    halfuihs=0.5.*uihs;
    
    % ui's
    % xtext
    pos(1)=newpos(3)/6-halfuihs;  
    pos(2)=32;
    pos(3)=uihs;
    pos(4)=16;
    cellpos{2}=pos;
    
    % xfactor
    pos(1)=newpos(3)/6-halfuihs;   
    pos(2)=10;
    pos(3)=uihs;
    pos(4)=20;
    cellpos{3}=pos;
    
    % ytext
    pos(1)=newpos(3)/2-halfuihs;  
    pos(2)=32;
    pos(3)=uihs;
    pos(4)=16;
    cellpos{4}=pos;
    
    % yfactor
    pos(1)=newpos(3)/2-halfuihs;   
    pos(2)=10;
    pos(3)=uihs;
    pos(4)=20;
    cellpos{5}=pos;
    
    % ztext
    pos(1)=5*newpos(3)/6-halfuihs;  
    pos(2)=32;
    pos(3)=uihs;
    pos(4)=16;
    cellpos{6}=pos;
    
    % zfactor
    pos(1)=5*newpos(3)/6-halfuihs;   
    pos(2)=10;
    pos(3)=uihs;
    pos(4)=20;
    cellpos{7}=pos;
    
    % colorbar
    % axes
    pos(1)=newpos(3)-60;
    pos(2)=90;
    pos(3)=20;
    pos(4)=newpos(4)-115;
    cellpos{8}= mbcgui.util.clipRect(pos);
    
    set([gr.axes; gr.xtext; gr.xfactor; gr.ytext; ...
        gr.yfactor; gr.ztext; gr.zfactor; gr.colorbar.axes],{'Position'},cellpos);
    
    drawreqs(2)=1;
    
    set(gr.badim, 'Visible', 'off');
    hndls=[gr.axes;gr.xtext;gr.xfactor;gr.ytext; ...
        gr.yfactor;gr.ztext;gr.zfactor;gr.colorbar.axes;gr.colorbar.bar;gr.surf];
    set(hndls,'Visible','on');
    set(ud.datataghandles, 'Visible', 'on');
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%  i_data  -  insert data into object
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [gr,drawreqs] = i_data(gr,data)
if size(data,1)==1
    % replicate to ensure point is drawn
    data = [data;data;data];
elseif size(data,1)==2
    data(end+1,:) = data(1,:);
end
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)
    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)
% update colorbar
set(gr.colorbar.axes,'YLim',[0.5 size(cmap,1)+0.5]);
pr_cbarfaces(gr.colorbar.bar,cmap);
drawreqs=[0 1 1 0];


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%  i_grid  -  turn grid on/off
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [gr,drawreqs]=i_grid(gr,dir,grd)
drawreqs=[0 0 0 0];

% parse out dir string to get axes to turn grid on in.
if ~isempty(strfind(dir,'x'))
    set(gr.axes,'XGrid',grd);
end
if ~isempty(strfind(dir,'y'))
    set(gr.axes,'YGrid',grd);
end
if ~isempty(strfind(dir,'z'))
    set(gr.axes,'ZGrid',grd);
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%  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])=0;
        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],'BackgroundColor',col);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%  i_frame  -  turn bounding frame on/off
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [gr,drawreqs]=i_frame(gr,state)
drawreqs=[0 0 0 0];
ud = gr.DataPointer.info;
if strcmp(state,'on')
    ud.frame = 1;
    set(gr.panel,'HighlightColor','k');
else
    ud.frame = 0;
    set(gr.panel,'HighlightColor',get(gr.panel, 'BackgroundColor'));
end
gr.DataPointer.info = ud;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%  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


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%  i_select  -  change factor selection
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [gr,drawreqs]=i_select(gr,sel,ax)
switch ax
    case 'x'
        obj=gr.xfactor;
    case 'y'
        obj=gr.yfactor;
    case 'z'
        obj=gr.zfactor;
end
set(obj,'Value',sel);
% redraw limits and plots
drawreqs=[0 1 1 0];