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