www.gusucode.com > mbcmodels 工具箱 matlab 源码程序 > mbcmodels/xreg3dmenu.m

    function xreg3dmenu(varargin)
%XREG3DMENU 3d graph menu for MBC PEV viewer
%
%  Function to control the uimenu behaviour of mv_PEVView.

%  Copyright 2000-2014 The MathWorks, Inc. and Ford Global Technologies, Inc.

hfig=findobj(allchild(0),'flat','Tag','mvPEVView');
ud= get(hfig,'UserData');
if nargin==0
    arg='init';
else
    arg = lower(varargin{1});
end

switch arg
    case 'init'
        % Create menus

        % FILE MENU
        ud.Hand.File = uimenu(hfig,...
            'Label','&File');
        uimenu(ud.Hand.File,'Label','&Print',...
            'Accelerator','P',...
            'Tag','printmenu',...
            'Callback','mv_PEVView(''print'')');
        uimenu(ud.Hand.File,'Label','&Close',...
            'Accelerator','W',...
            'Callback','mv_PEVView(''close'')');


        % SURFACE MENU
        ud.Hand.SurfPropmenu=uimenu(hfig,...
            'Label','&View');
        %
        % Mouse mode
        %
        h_mouse=uimenu(ud.Hand.SurfPropmenu,'Label','&Mouse Mode');
        ud.Hand.MouseMode=h_mouse;

        ud.Hand.Rot3d=uimenu(h_mouse, ...
            'Label','&Rotate Axes','Checked','on',...
            'Callback',{@i_rot3d,hfig});
        ud.Hand.Orbitlight=uimenu(h_mouse, ...
            'Label','&Orbit Scenelight',...
            'Callback',{@i_orbit3d,hfig});
        ud.Setup.Rot3d='ON'; % Capitalised ON means Az/Ev doesn't appear in lower right side of figure.
        ud.Setup.Orbit3d='off';
        view(ud.Hand.Axes,3); 
        [ud.Setup.viewaz,ud.Setup.viewel] = view(ud.Hand.Axes);
        ud.Hand.Light=[];

        %
        % Scene
        %
        h_scene=uimenu(ud.Hand.SurfPropmenu,'Label','&Scene');
        ud.Hand.Scene=h_scene;

        uimenu(h_scene, ...
            'Label','Lighting &Flat','Tag','lighting', ...
            'Callback', {@i_changeprop,'lighting',ud.Hand.Axes,'flat',hfig});
        ud.Hand.lightgouraud=uimenu(h_scene, ...
            'Label','Lighting &Gouraud','Tag','lighting', ...
            'Checked','off',...
            'Callback', {@i_changeprop,'lighting',ud.Hand.Axes,'gouraud',hfig});
        set(ud.Hand.lightgouraud,'Checked','on');
        ud.Setup.lighting='gouraud';
        uimenu(h_scene, ...
            'Label','Shading Fa&ceted', 'Separator', 'on','Tag','shading',...
            'Callback', {@i_changeprop,'shading',ud.Hand.Axes,'faceted',hfig});
        uimenu(h_scene, ...
            'Label','Shading F&lat','Tag','shading',...
            'Callback', {@i_changeprop,'shading',ud.Hand.Axes,'flat',hfig});
        uimenu(h_scene, ...
            'Label','Shading &Interp','Tag','shading',...
            'Checked','on',...
            'Callback', {@i_changeprop,'shading',ud.Hand.Axes,'interp',hfig});
        ud.Setup.shading='interp';
        uimenu(h_scene, ...
            'Label','Material &Metal','Tag','material',...
            'Separator','on',...
            'Callback', {@i_changeprop,'material',ud.Hand.Axes,'metal',hfig});
        uimenu(h_scene, ...
            'Label','Material &Dull','Tag','material',...
            'Callback', {@i_changeprop,'material',ud.Hand.Axes,'dull',hfig});
        uimenu(h_scene, ...
            'Label','Material &Shiny','Tag','material',...
            'Callback', {@i_changeprop,'material',ud.Hand.Axes,'shiny',hfig});
        uimenu(h_scene, ...
            'Label','Material &Default','Tag','material',...
            'Checked','on',...
            'Callback', {@i_changeprop,'material',ud.Hand.Axes,'default',hfig});
        ud.Setup.material='default';

        uimenu(h_scene, ...
            'Label','&Clipping', 'Separator', 'on',...
            'Callback', {@i_clipping,hfig});
        ud.Setup.clipping='on';


        %
        % Axes
        %
        h_axes=uimenu(ud.Hand.SurfPropmenu,'Label','&Axes');
        uimenu(h_axes, ...
            'Label','&Visible','Checked','on', ...
            'Callback',{@i_changeaxesvisible,hfig});
        ud.Setup.Visible='on';
        ud.Hand.Box= uimenu(h_axes, ...
            'Label','Box','Checked','on', ...
            'Callback', {@i_changeaxesbox,hfig},...
            'Separator','on');
        ud.Setup.Box='on';
        ud.Hand.Ticks= uimenu(h_axes, ...
            'Label','&Ticks','Checked','on','Tag','ticks', ...
            'Callback', {@i_changeaxesticks,hfig});
        ud.Setup.Ticks='on';
        ud.Hand.Grid= uimenu(h_axes, ...
            'Label','&Grid', 'Checked','on','Tag','grid',...
            'Callback', {@i_changeaxesgrid,hfig});
        ud.Setup.Grid='on';
        ud.Hand.AxColor= uimenu(h_axes, ...
            'Label','&Color...','Separator', 'on',...
            'Callback', {@i_changeaxescolor,hfig});


        %
        % Scenelight
        %
        h_light = uimenu(ud.Hand.SurfPropmenu, ...
            'Label','&Scenelight','Checked','on', ...
            'Callback', {@i_changescenelight,hfig});
        ud.Hand.LightMenu=h_light;
        ud.Setup.Scenelight='on';

        % Set userdata
        set(hfig,'UserData',ud)


    case 'updateplot'
        set(hfig,'CurrentAxes',ud.Hand.Axes);
        mv_rotate3d(ud.Hand.Axes,ud.Setup.Rot3d);
        xregorbit3d(hfig,ud.Setup.Orbit3d);
        lighting(ud.Hand.Axes,ud.Setup.lighting);
        shading(ud.Hand.Axes,ud.Setup.shading);
        material(ud.Hand.Axes,ud.Setup.material);
        set(ud.Hand.Axes,...
            'Box',ud.Setup.Box,'Visible',ud.Setup.Visible,...
            'Clipping',ud.Setup.clipping);
        grid(ud.Hand.Axes,ud.Setup.Grid);
        ticks(ud.Setup.Ticks,ud.Hand.Axes);
        view(ud.Hand.Axes,ud.Setup.viewaz,ud.Setup.viewel);
        set(ud.Hand.Light,'Position',ud.Setup.lightpos);

    case '2dmenus'
        % change enable status to be appropriate for 2d
        set([ud.Hand.Scene, ud.Hand.MouseMode, ud.Hand.LightMenu],'Enable','off');
    case '3dmenus'
        % change enable status to be appropriate for 3d
        set([ud.Hand.Scene, ud.Hand.MouseMode, ud.Hand.LightMenu],'Enable','on');
end



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ret=toggleOnOff(h)
newval = strcmp(get(h, 'Checked'), 'off');
set(h, 'Checked', bool2OnOff(newval));
if nargout>0
    ret = newval;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ret=bool2OnOff(val)
if val
    ret = 'on';
else
    ret = 'off';
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ticks(arg,ax)
switch arg
    case 'off'
        set(ax, 'XTick', [], 'ZTick', [], 'YTick', [])
    case 'on'
        set(ax, 'XTickMode', 'auto', 'ZTickMode','auto', 'YTickMode', 'auto')
end


function i_changeprop(src,evt,fcn,ax,setting,hfig)
h = findobj(hfig,'Tag',fcn,'Checked','on');
set([h;src],{'Checked'},{'off';'on'});

ud = get(hfig,'UserData');
feval(fcn,ud.Hand.Axes,setting);
ud.Setup.(fcn) = setting;
set(hfig,'UserData',ud);



function i_rot3d(src,evt,hfig)
ud=get(hfig,'UserData');
if toggleOnOff(src)
    ud.Setup.Rot3d='ON'; % needs capitalised ON to prevent Az/El being displayed
    set(hfig,'UserData',ud);
    if strcmp(ud.Setup.Orbit3d,'on')
        i_orbit3d(ud.Hand.Orbitlight,evt,hfig);
    end
    mv_rotate3d(ud.Hand.Axes,'ON'); % needs capitalised ON to prevent Az/El being displayed
else
    mv_rotate3d(ud.Hand.Axes,'off');
    ud.Setup.Rot3d='off';
    set(hfig,'UserData',ud);
end


function i_orbit3d(src,evt,hfig)
ud=get(hfig,'UserData');
if toggleOnOff(src)
    ud.Setup.Orbit3d='on';
    set(hfig,'UserData',ud);
    if strcmp(ud.Setup.Rot3d,'ON') % needs capitalised ON to prevent Az/El being displayed
        i_rot3d(ud.Hand.Rot3d,[],hfig);
    end
    xregorbit3d(hfig,'ON');
else
    xregorbit3d(hfig,'off');
    ud.Setup.Orbit3d='off';
    set(hfig,'UserData',ud);
end


function i_clipping(src,evt,hfig)
ud=get(hfig,'UserData');
Clip = mbconoff(toggleOnOff(src));

ud.Setup.clipping= Clip;
h = findobj(ud.Hand.Axes);
for i=1:length(h)
    hc= mbcgui.hgclassesutil.toHandle(h(i));
    if ~isempty(findprop(hc,'Clipping'))
        hc.Clipping = Clip;
    end
end
set(hfig,'UserData',ud);



function i_changeaxescolor(src,evt,hfig)
ud=get(hfig,'UserData');
set(ud.Hand.Axes, 'Color', uisetcolor(get(ud.Hand.Axes,'Color')));


function i_changeaxesvisible(src,evt,hfig)
ud=get(hfig,'UserData');
toggleOnOff(src);
set(ud.Hand.Axes,'Visible',get(src,'Checked'));
ud.Setup.Visible=get(src, 'Checked');
if strcmp(ud.Setup.Visible,'on')
    set([ud.Hand.Box, ud.Hand.Ticks, ud.Hand.Grid, ud.Hand.AxColor],'Enable','on');
else
    set([ud.Hand.Box, ud.Hand.Ticks, ud.Hand.Grid, ud.Hand.AxColor],'Enable','off');
end
set(hfig,'UserData',ud);


function i_changeaxesbox(src,evt,hfig)
ud=get(hfig,'UserData');
toggleOnOff(src);
ud.Setup.Box=get(src, 'Checked');
set(ud.Hand.Axes,'Box',get(src, 'Checked'));
set(hfig,'UserData',ud);


function i_changeaxesgrid(src,evt,hfig)
ud=get(hfig,'UserData');
toggleOnOff(src);
grid(ud.Hand.Axes,get(src, 'Checked'));
ud.Setup.Grid=get(src, 'Checked');
set(hfig,'UserData',ud);


function i_changeaxesticks(src,evt,hfig)
ud=get(hfig,'UserData');
toggleOnOff(src);
ticks(get(src, 'Checked'),ud.Hand.Axes)
ud.Setup.Ticks=get(src, 'Checked');

if strcmp(ud.Setup.Ticks,'on')
    set(ud.Hand.Grid,'Enable','on');
else
    set(ud.Hand.Grid,'Enable','off');
end
set(hfig,'UserData',ud);


function i_changescenelight(src,evt,hfig)
ud=get(hfig,'UserData');
if isgraphics(ud.Hand.Light)
    if toggleOnOff(src)
        set(ud.Hand.Light,'Visible','on');
        ud.Setup.Scenelight='on';
        set(ud.Hand.Orbitlight,'Enable','on');
        set(hfig,'UserData',ud);
    else
        set(ud.Hand.Orbitlight,'Enable','off');
        set(ud.Hand.Light,'Visible','off');
        ud.Setup.Scenelight='off';
        set(hfig,'UserData',ud);
        if strcmp(ud.Setup.Orbit3d,'on');
            % stop orbit mouse motion
            i_orbit3d(ud.Hand.Orbitlight,[],hfig);
        end
    end
end