www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/wavelet/dynvzaxe.m

    function dynvzaxe(option,fig,varargin)
%DYNVZAXE Dynamic visualization tool (View Axes).
%   DYNVZAXE(OPTION,FIG,VARARGIN)

%   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 29-May-97.
%   Last Revision: 10-Jun-2013.
%   Copyright 1995-2013 The MathWorks, Inc.
%   $Revision: 1.13.4.13 $ $Date: 2013/07/05 04:30:11 $

% Tag property of objects.
%------------------------
tag_figzaxe = 'Fig_Zaxe';

switch option
    case 'ini'
        % varargin{1} = pos_gra_area.
        % varargin{2} = Tog_View_Axes
        %----------------------------
        oldFig = hdlFigZaxe(fig,tag_figzaxe);
        togBtn = varargin{2};
        if ~isempty(oldFig)
            dynvzaxe('close',oldFig,'direct'); return;
        end
        pos_gra = varargin{1};
        ax = wfindobj(fig,'Type','axes','Visible','on');
        cb = wfindobj(fig,'Type','colorbar','Visible','on');
        ax = [ax;cb];
        
        axPar = get(ax,'Parent');
        axPar = cat(1,axPar{:});
        idxNoFig = find(axPar~=fig);
        par_Not_Vis = [];
        for k=1:length(idxNoFig)
            j = idxNoFig(k);
            if isequal(get(axPar(j),'Visible'),'off')
                par_Not_Vis = [par_Not_Vis,j];
            end           
        end
        ax(par_Not_Vis)   = [];
        axPar(par_Not_Vis) = [];
        
        nb_axes = length(ax);
        if nb_axes<1 , set(togBtn,'Value',0); return; end
        
        pos_ax = get(ax,'Position');
        if nb_axes>1
            pos_ax  = cat(1,pos_ax{:});
            [pos_ax,ind] = sortrows(pos_ax,[2 1]);
            ax  = ax(ind);
            axPar = axPar(ind);
        end

        % Hide 1.
        %--------
        HideNoZoom = 1;
        axNoZoom = [];
        if HideNoZoom
            indHide = [];
            for k=1:length(ax)
                ud = get(ax(k),'UserData');
                if isstruct(ud)
                    if isfield(ud,'dynvzaxe')
                        if isequal(lower(ud.dynvzaxe.enable),'off')
                            indHide = [indHide k]; %#ok<*AGROW>
                        end
                    end
                end
            end
			idxSET = setdiff((1:length(ax)),indHide);
            for k=idxSET
                ud = getappdata(ax(k),'WTBX_UserData');
                if isstruct(ud)
                    if isfield(ud,'dynvzaxe')
                        if isequal(lower(ud.dynvzaxe.enable),'off')
                            indHide = [indHide k];
                        end
                    end
                end
            end
            if ~isempty(indHide)
                axNoZoom    = wfindobj(ax(indHide),'Visible','on');
                ax(indHide) = [];
                pos_ax(indHide,:) = [];
                axPar(indHide) = [];
                nb_axes = nb_axes-length(indHide);
            end
        end

        % Hide 2.
        %--------
        ax2Hide = [];
        rapp = pos_ax(:,3)./pos_ax(:,4);
        maxr = 15;
        r    = find(rapp<1/maxr | rapp>maxr);
        lr   = length(r);
        if lr>0
            pos_ax(r,:) = [];
            ax2Hide = wfindobj(ax(r),'Visible','on');
            ax(r)   = [];
            axPar(r) = [];
            nb_axes = nb_axes-lr;
            if nb_axes<1, set(togBtn,'Value',0); return; end
        end
        
        % Built zooming figure command.
        %------------------------------
		pos_ax_btn = pos_ax;
        idxNoFig = find(axPar~=fig);
        posPar   = get(axPar,'Position');
        if iscell(posPar) , posPar   = cat(1,posPar{:}); end
        
        for j = 1:length(idxNoFig)
            k = idxNoFig(j);
            pos_ax_btn(k,1:2) = pos_ax_btn(k,1:2).* posPar(k,3:4);
            pos_ax_btn(k,3:4) = pos_ax_btn(k,3:4).* posPar(k,3:4);
            pos_ax_btn(k,1:2) = pos_ax_btn(k,1:2) + posPar(k,1:2);
        end
        
        valmin = min(pos_ax_btn,[],1);
        xmin = valmin(1);
        xmax = max(pos_ax_btn(:,1)+pos_ax_btn(:,3));
        ymin = valmin(2);
        ymax = max(pos_ax_btn(:,2)+pos_ax_btn(:,4));
        x0 = 0.025; x1 = 0.975; y0 = 0.025; y1 = 0.975;
        kx = (x1-x0)/(xmax-xmin); ky = (y1-y0)/(ymax-ymin);
        pos_btn = [...
                    kx*(pos_ax_btn(:,1)-xmin)+x0 , ...
                    ky*(pos_ax_btn(:,2)-ymin)+y0 , ...
                    kx*pos_ax_btn(:,3)           , ...
                    ky*pos_ax_btn(:,4)];
                
        pos_fig = [0.02 0.5 0.15 0.20];
        win_units = 'normalized';
        % numFigSTR = handle2str(fig);
        numFigSTR = int2str(fix(double(fig)));
        figName = getWavMSG('Wavelet:divGUIRF:DynV_ViewAxes',numFigSTR);
        locfig = wfigmngr('init', ...
                     'Name',figName,...
                     'Visible','Off', ...
                     'Units',win_units,...
                     'Position',pos_fig...
                     );
        wfigmngr('extfig',locfig,'ExtFig_DynV');
        strnumfig = handle2str(locfig);

        % Find UiMenus and UiControls to Disable.
        %-----------------------------------------
        try
            uimACT = wfigmngr('get_activeHDL',fig,'uimenu');
        catch ME  %#ok<NASGU>
            uimACT = [];
        end
        uim = wfindobj(fig,'Type','uimenu','Enable','on');
        a   = wcommon(double(uim),double(uimACT));
        uim = uim(~a);

        [closeBTN,closeUIM] = wfigmngr('get_activeHDL',fig,'close');
        uic     = wfindobj(fig,'Type','uicontrol','Enable','on');
        
        Keep_DynV_Enabled = wtbxappdata('get',fig,'Keep_DynV_Enabled');
        if ~isempty(Keep_DynV_Enabled)
            uic = setdiff(uic,Keep_DynV_Enabled);
        end
        
        uicDYNV = dynvtool('handles',fig,'Array');
        try
            uicCOLM = utcolmap('handles',fig,'cell');
        catch ME  %#ok<NASGU>
            uicCOLM = [];
        end
        if iscell(uicCOLM) , uicCOLM = cat(1,uicCOLM{:}); end
        a   = wcommon(double(uic), ...
            [double(closeBTN);double(uicDYNV(:));double(uicCOLM(:))]);
        uic = uic(~a);
        txt = findobj(uic,'Style','text');
        a   = wcommon(double(uic),double(txt));

        ud.caller       = fig;
        ud.callTog      = togBtn;
        ud.axHdl        = ax;
        ud.savpos       = pos_ax;
        ud.zoompos      = pos_gra + [0.05 0.05 -0.1 -0.1];
        ud.oldpos       = [];
        ud.newpos       = [];
        ud.act          = [];
        ud.hide         = [axNoZoom ; ax2Hide ; getHide(fig,pos_gra)];
        ud.savClose.btn = closeBTN;
        ud.savClose.uim = closeUIM;
        ud.savClose.val = get(fig,'CloseRequestFcn');
        ud.hdlOff       = [uim ; uic(~a)];
        ud.axeTMP       = [];
        ud.parAXE       = fig;
        new_CloseFcn    = ['delete(' strnumfig ');' ud.savClose.val];
        SetCloseFcn(ud,new_CloseFcn)

        surfBtn   = prod(pos_btn(:,[3 4]),2);
        [~,ind] = sort(surfBtn);
        
        [strBtn,cdataBtn] = setToggle(0);
        for j = nb_axes:-1:1
            k = ind(j);
            cb_tog = [mfilename '(''select'',' strnumfig ',' int2str(k) ');'];
            uicontrol(...
                    'Parent',locfig,        ...
                    'Style','togglebutton', ...
                    'Units','normalized',   ...
                    'Position',pos_btn(k,:),...
                    'FontWeight','bold', ...
                    'String',strBtn, ...
                    'Value',0, ...
                    'CData',cdataBtn,...
                    'UserData',k, ...
                    'Callback',cb_tog);
        end
        wfigmngr('attach_close',locfig,mfilename);

        % Computing figure position.
        %---------------------------
        [xpixl,ypixl] = wfigutil('prop_size',locfig,1,1);
        wok  = 60*xpixl;
        hok  = 20*ypixl;
        rx   = 1/3;
        ry   = 2/3;
        wmin = min(pos_btn(:,3));
        hmin = min(pos_btn(:,4));
        xmul = wok/wmin;
        ymul = hok/hmin;
        if xmul>1  , pos_fig(3) = pos_fig(3)*xmul; end
        if xmul<rx , pos_fig(3) = pos_fig(3)*rx;   end
        if ymul>1  , pos_fig(4) = pos_fig(4)*ymul; end
        if ymul<ry , pos_fig(4) = pos_fig(4)*ry;   end
        widthmax = 0.20;
        heighmax = 0.35;
        if pos_fig(3)>widthmax
            mulx = widthmax/pos_fig(3);
        else
            mulx = 1;
        end
        if pos_fig(4)>heighmax
            muly = heighmax/pos_fig(4);
        else
            muly = 1;
        end
        if muly>3*mulx , muly = 3*mulx; end
        pos_fig = pos_fig.*[1 1 mulx muly];

        caller_pos = get(fig,'Position');
        pos_fig(1) = caller_pos(1)-pos_fig(3)-0.0075;
        if pos_fig(1)<0 , pos_fig(1) = 0.005; end
        pos_fig(2) = caller_pos(2)+caller_pos(4)-pos_fig(4);
        if pos_fig(2)<0 , pos_fig(2) = 0.005; end
        set(locfig,'Position',pos_fig);

        % Disable UiMenus and UiControls.
        %---------------------------------
        set(ud.hdlOff,'Enable','off');
        set(locfig,...
                'Visible','On',   ...
                'UserData',ud,    ...
                'Tag',tag_figzaxe ...
                );

    case 'zoom'
        if OKCloseFIG(fig) , return ; end
        num_btn = varargin{1};
        ud     = get(fig,'UserData');
        act    = ud.act;
        hdl    = ud.axHdl;
        savpos = ud.savpos;
        p_axe  = get(hdl,'position');
        nb_axe = size(p_axe,1);
        if nb_axe> 1 , p_axe = cat(1,p_axe{:}); end
        i_axe = setdiff((1:nb_axe),num_btn);
        parAxe  = get(hdl(num_btn),'Parent');
        old_parAXE = ud.parAXE;
        % if isempty(act) || ~isequal(num_btn,act)
        if ~isequal(num_btn,act)
            if ~isequal(get(parAxe,'Type'),'figure')
                ud.parAXE = parAxe;
                set(hdl(num_btn),'Parent',ud.caller);
            else
                ud.parAXE = ud.caller;
            end
        end
        if ~isempty(act) && ~isequal(get(old_parAXE,'Type'),'figure')
            set(hdl(act),'Parent',old_parAXE);
        end

        if isempty(act)            
            hdl_btn = GetHdlPUS(fig,num_btn);
            setToggle(1,hdl_btn);
            oldpos  = savpos(num_btn,:);
            newpos  = ud.zoompos;
            act     = num_btn;
            visHide = 'off';
            ud.axeTMP = wfindobj(hdl(i_axe),'Visible','on');
            set(ud.axeTMP,'Visible',visHide);

        elseif num_btn==act
            hdl_btn = GetHdlPUS(fig,num_btn);
            setToggle(0,hdl_btn);
            act     = [];
            oldpos  = ud.newpos;
            newpos  = ud.oldpos;
            visHide = 'on';
            tmp = ud.axeTMP;          
            tmp = tmp(ishandle(tmp));
            set(tmp,'Visible',visHide);
            ud.axeTMP = [];
            
        else
            hdl_btn_new = GetHdlPUS(fig,num_btn);
            hdl_btn_old = GetHdlPUS(fig,act);
            setToggle(0,hdl_btn_old);
            setToggle(1,hdl_btn_new);
            oldpos  = ud.newpos;
            newpos  = ud.oldpos;
            p_axe   = getPos(p_axe,newpos,oldpos);
            oldpos  = savpos(num_btn,:);
            newpos  = ud.zoompos;
            act     = num_btn;
            visHide = 'off';
            tmp = ud.axeTMP;
            tmp = tmp(ishandle(tmp));
            set(tmp,'Visible','On');
            ud.axeTMP = wfindobj(hdl(i_axe),'Visible','on');
            set(ud.axeTMP,'Visible',visHide);
        end
        set(ud.hide(ishandle(ud.hide)),'Visible',visHide);
        p_axe = getPos(p_axe,newpos,oldpos);
        for k=1:length(hdl)
            set(hdl(k),'position',p_axe(k,:));
        end
        ud.act    = act;
        ud.oldpos = oldpos;
        ud.newpos = newpos;
        set(fig,'UserData',ud);

    case 'select'
        if OKCloseFIG(fig) , return ; end
        num_btn = varargin{1};
        if ~isempty(num_btn)
            refresh(fig);
            dynvzaxe('zoom',fig,num_btn);
        end

    case 'close'
        % in3 = flag for direct closing
        %-------------------------------
        ud = get(fig,'UserData');
        %%HG2 Problem
        if ~isempty(ud) && ishandle(ud.caller)
            act = ud.act;
            if ~isempty(act) , dynvzaxe('zoom',fig,act); end
            set(ud.hdlOff,'Enable','on');
            SetCloseFcn(ud)
            togBtn = ud.callTog;
            if ishandle(togBtn)
                set(togBtn,'Value',0);
            end
        end
        if nargin>2 ,  delete(fig); end

    case 'stop'
        figZaxe = wfindobj(0,'Type','figure','Tag',tag_figzaxe);
        caller  = [];
        if ~isempty(figZaxe)
            nbCaller = length(figZaxe);
            caller = zeros(1,nbCaller);
            for k = 1:nbCaller
               ud = get(figZaxe(k),'UserData');
               caller(k) = ud.caller;
            end
        end
        [~,indCaller] = intersect(caller,fig);
        delete(figZaxe(indCaller));
        
    case 'exclude'
        currentAxes = varargin{1};
        ud.dynvzaxe.enable = 'off';							
        setappdata(currentAxes,'WTBX_UserData',ud);				
end


%=========================================================================%
% INTERNAL FUNCTIONS
%=========================================================================%
%-------------------------------------------------------------------------%
function [st,x] = setToggle(select,hdl)
st = '';
s = [8 8];
if select,
   x = {ones(s),zeros(s),zeros(s)};
else
   x = {0.6*ones(s),zeros(s),zeros(s)};
end
x = cat(3,x{:});
if nargin>1
    set(hdl,'String',st,'Value',select,'CData',x);
end
%-------------------------------------------------------------------------%
function hdlFig = hdlFigZaxe(fig,tag)

hdlFig  = [];
figZaxe = wfindobj(0,'Type','figure','Tag',tag);
if ~isempty(figZaxe)
    for k = 1:length(figZaxe)
        ud = get(figZaxe(k),'UserData');
        try
          if isequal(fig,ud.caller)
              hdlFig = figZaxe(k); break;
          end
        catch ME  %#ok<NASGU>
        end
    end
end
%-------------------------------------------------------------------------%
function pos_axe = getPos(pos_axe,newpos,oldpos)

diltrans = newpos(3:4)./oldpos(3:4);
diltrans = [newpos(1:2)-oldpos(1:2).*diltrans diltrans];
for k=1:size(pos_axe,1);
    pos_axe(k,1:2) = pos_axe(k,1:2).*diltrans(3:4)+diltrans(1:2);
    pos_axe(k,3:4) = pos_axe(k,3:4).*diltrans(3:4);
end
%-------------------------------------------------------------------------%
function hideHdl = getHide(fig,pos_gra)

% ax      = wfindobj(get(fig,'Children'),'flat','Type','axes','Visible','off');
ax      = wfindobj(fig,'Type','axes','Visible','off');
hideHdl = wfindobj(ax,'Visible','on');
% uic     = wfindobj(fig,'Type','uicontrol','Visible','on');
uic     = wfindobj(fig,'Parent',fig,'Type','uicontrol','Visible','on');
pan     = wfindobj(fig,'Parent',fig,'Type','uipanel','Visible','on'); 
uic     = [uic;pan];
pos_uic = get(uic,'Position');
pos_uic = cat(1,pos_uic{:});
bool    = zeros(size(pos_uic,1),1);

pos_gra = [ pos_gra(1) pos_gra(1)+pos_gra(3) ...
            pos_gra(2) pos_gra(2)+pos_gra(4) ...
            ];
bool = bool+pinrect(pos_uic(:,1:2),pos_gra);
bool = bool + ...
    pinrect([pos_uic(:,1)+pos_uic(:,3),pos_uic(:,2)+pos_uic(:,4)],pos_gra);
bool = bool + ...
    pinrect([pos_uic(:,1)+pos_uic(:,3)/2,pos_uic(:,2)+pos_uic(:,4)/2],pos_gra);
hideHdl = [hideHdl; uic(bool>0)];
%-------------------------------------------------------------------------%
function bool = pinrect(pts,rect)
%PINRECT Determine if points lie in or on rectangle.
%   Inputs:
%     pts  - n-by-2 array of [x,y] data
%     rect - 1-by-4 vector of [xlim ylim] for the rectangle
%   Outputs:
%     bool - length n binary vector 

bool = (pts(:,1)<rect(1)) | (pts(:,1)>rect(2)) |...
       (pts(:,2)<rect(3)) | (pts(:,2)>rect(4));
bool = ~bool;
bool(isnan(pts)) = 0;
%--------------------------------------------------------------------------%
function hdlPUS = GetHdlPUS(fig,num)

btn = wfindobj(fig,'Style','togglebutton');
for k =1:length(btn)
    nn = get(btn(k),'UserData');
    if isequal(nn,num) , hdlPUS = btn(k); break; end
end
%-------------------------------------------------------------------------%
function SetCloseFcn(ud,CloseFcn)

if nargin<2 , CloseFcn = ud.savClose.val; end
set(ud.savClose.btn,'Callback',CloseFcn);
set(ud.savClose.uim,'Callback',CloseFcn);
set(ud.caller,'CloseRequestFcn',CloseFcn);
%-------------------------------------------------------------------------%
function ok = OKCloseFIG(fig)

ud     = get(fig,'UserData');
caller = ud.caller;
if ~ishandle(caller)
    ud.act    = [];
    ud.caller = [];
    set(fig,'UserData',ud);
    dynvzaxe('close',fig,'direct');
    ok = 1;
else
    ok = 0;
end
%-------------------------------------------------------------------------%
%=========================================================================%