📄 cameratoolbar2.m
字号:
'Separator', 'on');
props.ClickedCallback = 'cameratoolbar(''setprojection'', ''orthographic'')';
props.ToolTip = 'Orthographic Projection';
props.CData = camtoolbarimages.ortho;
u(end+1) = uipushtool(props,...
'Separator', 'on');
props.ClickedCallback = 'cameratoolbar(''setprojection'', ''perspective'')';
props.ToolTip = 'Perspective Projection';
props.CData = camtoolbarimages.perspective;
u(end+1) = uipushtool(props);
props.ClickedCallback = 'cameratoolbar(''resetcameraandscenelight'')';
props.ToolTip = 'Reset Camera and Scene Light';
props.CData = camtoolbarimages.reset;
u(end+1) = uipushtool(props,...
'Separator', 'on');
u = [];
props.ClickedCallback = 'cameratoolbar(''stopmoving'')';
props.ToolTip = 'Stop Camera/Light Motion';
props.CData = camtoolbarimages.stop;
u(end+1) = uipushtool(props);
Udata.stopMovingHandle = u;
set(Udata.mainToolbarHandle, 'tag', 'cameratoolbar', 'visible', 'off','serializable','off');
setUdata(Udata)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function updateToolbar(hfig)
Udata = getUdata;
set(Udata.ModeHandles, 'state', 'off')
set(findall(Udata.ModeHandles, 'tag', Udata.mode), 'state', 'on');
set(Udata.PrincipalAxisHandles, 'state', 'off', 'enable', 'on')
if ~isempty(Udata.mode) & strmatch(Udata.mode, {'orbit' 'pan' 'walk'})
set(findall(Udata.PrincipalAxisHandles, 'tag', Udata.coordsys), 'state', 'on');
else
set(Udata.PrincipalAxisHandles, 'enable', 'off');
end
if ~isempty(Udata.mode)
initWindowCallbacks(hfig);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function Udata = getUdata
[hfig,haxes]=currenthandles;
Udata = getappdata(hfig, 'ctb200jaz');
% Since the camera toolbar IS NOT serialized by design, Udata
% will have an invalid toolbar handle when opening a fig file
% since the figure object, which IS serialized, stores the Udata.
if ~isempty(Udata) & isfield(Udata,'mainToolbarHandle') & ~ishandle(Udata.mainToolbarHandle)
Udata = [];
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function setUdata(Udata)
[hfig,haxes]=currenthandles;
setappdata(hfig, 'ctb200jaz', Udata);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function initUdata
Udata = getUdata;
Udata.mode = '';
Udata.coordsys = 'z';
%Udata.optimizeaxesmode = 'ask';
Udata.buttondown = 0;
Udata.moving = 0;
Udata.time = clock;
Udata.defaultAz = 30;
Udata.defaultEl = 30;
Udata.scenelights = struct('ax', {}, 'h', {}, 'on', {}, 'az', {}, 'el', {});
setUdata(Udata);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function updateScenelightPosition(haxes)
Udata = getUdata;
sl = Udata.scenelights;
ax = haxes;
index = find([sl.ax]==ax);
sl = sl(index);
if sl.on
camlight(sl.h, sl.az, sl.el, 'infinite')
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function updateScenelightOnOff(haxes,val)
Udata = getUdata;
sl = Udata.scenelights;
ax = haxes;
index = find([sl.ax]==ax);
sl(index).on = val;
set(sl(index).h, 'vis', bool2OnOff(val))
Udata.scenelights = sl;
setUdata(Udata);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function validateScenelights(haxes)
Udata = getUdata;
sl = Udata.scenelights;
index = ~ishandle([sl.ax]); sl(index) = [];
index = ~ishandle([sl.h]); sl(index) = [];
ax = haxes;
if isempty(sl)
index = [];
else
index = find([sl.ax]==ax);
end
if isempty(index)
index = prod(size(sl))+1;
sl(index) = struct('ax', ax, 'h', -1, 'on', 0, ...
'az', Udata.defaultAz, 'el', Udata.defaultEl);
end
if ~ishandle(sl(index).h)
h = light('parent',haxes);
sl(index).h = h;
set(h, 'visible', 'off', 'HandleVisibility', 'off', ...
'tag', 'CameraToolBarScenelight')
end
Udata.scenelights = sl;
setUdata(Udata)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function resetScenelight(haxes)
validateScenelights(haxes)
Udata = getUdata;
sl = Udata.scenelights;
ax = haxes;
index = find([sl.ax]==ax);
sl(index).az = Udata.defaultAz;
sl(index).el = Udata.defaultEl;
Udata.scenelights = sl;
setUdata(Udata)
updateScenelightPosition(haxes);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function dlgShown=showInfoDlg(haxes)
persistent CameratoolbarInfoDialogShown
if isempty(CameratoolbarInfoDialogShown)
CameratoolbarInfoDialogShown=0;
end
if ~CameratoolbarInfoDialogShown
ax=haxes;
[selectedButton,dlgShown]=uigetpref('cameratoolbar','donotshowinfodlg',...
'Aspect Ratio Adjustment',...
{'Plots may change appearance so that aspect ratios remain'
'unchanged during 3D rotation. Check the "Auto aspect'
'ratio" context menu item to have the axes reshape to fit'
'the figure.'},...
{'OK'},...
'DefaultButton','OK',...
'HelpString','Help',...
'HelpFcn','helpview(fullfile(docroot,''mapfiles'',''visualize.map''), ''axes_aspect_ratio'');');
CameratoolbarInfoDialogShown=1;
else
dlgShown=0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function initWindowCallbacks(hfig)
set(hfig, 'windowbuttondownfcn', 'cameratoolbar(''down'')')
set(hfig, 'windowbuttonupfcn', '')
set(hfig, 'windowbuttonmotionfcn', '')
set(hfig, 'keypressfcn', 'cameratoolbar(''keypress'')');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ret = getWindowCallBacks(hfig)
ret{1} = get(hfig, 'windowbuttondownfcn' );
ret{2} = get(hfig, 'windowbuttonmotionfcn' );
ret{3} = get(hfig, 'windowbuttonupfcn' );
ret{4} = get(hfig, 'keypressfcn' );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ret = restoreWindowCallbacks(hfig,cb)
set(hfig, 'windowbuttondownfcn', cb{1});
set(hfig, 'windowbuttonmotionfcn', cb{2});
set(hfig, 'windowbuttonupfcn', cb{3});
set(hfig, 'keypressfcn', cb{4});
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ret = getWindowCursor(hfig)
ret{1} = get(hfig, 'pointer' );
ret{2} = get(hfig, 'pointershapecdata' );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ret = restoreWindowCursor(hfig,cursor)
set(hfig, 'pointer' , cursor{1});
set(hfig, 'pointershapecdata', cursor{2});
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ret=bool2OnOff(val)
if val
ret = 'on';
else
ret = 'off';
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% simple cross product
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function c=crossSimple(a,b)
c(1) = b(3)*a(2) - b(2)*a(3);
c(2) = b(1)*a(3) - b(3)*a(1);
c(3) = b(2)*a(1) - b(1)*a(2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function resetCameraProps(haxes)
camva(haxes,'auto'); campos(haxes,'auto'); camtarget(haxes,'auto'); daspect(haxes,'auto'); camup(haxes,'auto');
view(haxes,3);
daspect(haxes,daspect(haxes)); camva(haxes,camva(haxes));
axis(haxes,'tight');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function h=postContextMenu(hfig,haxes)
menuTag='CameratoolbarContextMenu';
h = findall(hfig,'type','uicontextmenu','tag',menuTag);
if isempty(h)
h=uicontextmenu('parent',hfig,...
'HandleVisibility','off',...
'tag',menuTag);
menus={...
'Camera &Motion', 'CameraMotionMode', '',
'>&Orbit Camera', 'CameraMode_orbit', 'cameratoolbar setmodegui orbit',
'>Orbit Scene &Light', 'CameraMode_orbitscenelight','cameratoolbar setmodegui orbitscenelight',
'>&Pan - Turn/Tilt', 'CameraMode_pan', 'cameratoolbar setmodegui pan',
'>Move - &Horizontally/Vertically','CameraMode_dollyhv', 'cameratoolbar setmodegui dollyhv',
'>Move - &Forward/Back', 'CameraMode_dollyfb', 'cameratoolbar setmodegui dollyfb',
'>&Zoom', 'CameraMode_zoom', 'cameratoolbar setmodegui zoom',
'>&Roll', 'CameraMode_roll', 'cameratoolbar setmodegui roll',
'>&Walk', 'CameraMode_walk', 'cameratoolbar setmodegui walk',
'Camera A&xis', 'CameraPAx', '',
'>&X Principal Axis', 'CameraAxis_x', 'cameratoolbar setcoordsys x',
'>&Y Principal Axis', 'CameraAxis_y', 'cameratoolbar setcoordsys y',
'>&Z Principal Axis', 'CameraAxis_z', 'cameratoolbar setcoordsys z',
'>&No Principal Axis', 'CameraAxis_none', 'cameratoolbar setcoordsys none',
'Camera Re&set', 'CameraReset_parent', '',
'>Reset &Camera && Scene Light', 'CameraReset_', 'cameratoolbar(''resetcameraandscenelight'');',
'>Reset &Target Point', 'CameraReset_cameralight', 'cameratoolbar(''resettarget'')',
'>Reset &Scene Light', 'CameraReset_targetpoint', 'cameratoolbar(''resetscenelight'');',
'-------', 'CameraReset_scenelight', '',
'&Projection', 'CameraProj', '',
'>&Orthographic', 'CameraProj_orthographic', 'cameratoolbar(''setprojection'', ''orthographic'')',
'>&Perspective', 'CameraProj_perspective', 'cameratoolbar(''setprojection'', ''perspective'')',
'&Auto aspect ratio', 'CameraBash', 'cameratoolbar(''setaspectratio'', ''normal'')',
};
makemenu(h,str2mat(menus{:,1}),str2mat(menus{:,3}),str2mat(menus{:,2}));
else
h=h(1);
end
%initialize camera motion mode check
hCameraMotion=findobj(h,'tag','CameraMotionMode');
hCameraMotionChildren=get(hCameraMotion,'children');
set(hCameraMotionChildren,'checked','off');
hCameraMotionTarget=findobj(hCameraMotionChildren,'tag',['CameraMode_' cameratoolbar('getmode')]);
set(hCameraMotionTarget,'checked','on');
%initialize camera principal axis check
paxParent=findall(h,'tag','CameraPAx');
paxItems=allchild(paxParent);
offon={'off','on'};
isActive=ismember(cameratoolbar('getmode'), {'orbit' 'pan' 'walk'});
set(paxItems,'checked','off','enable',offon{isActive+1});
if isActive
currPAx=cameratoolbar('getcoordsys');
activeItem=findall(paxItems,'tag',['figMenuAxis_' currPAx]);
set(activeItem,'Checked','on');
end
%initialize projection
projParent = findall(h,'tag','CameraProj');
projItems=allchild(projParent);
set(projItems,'checked','off');
activeItem=findall(projItems,'tag',['CameraProj_' get(haxes,'projection')]);
set(activeItem,'Checked','on');
%initialize axis vis3d item
if strcmp(get(haxes,'warptofill'),'off')
check='off';
cbk='cameratoolbar(''setaspectratio'', ''normal'')'; %'axis(haxes,normal)';
else
check='on';
cbk='cameratoolbar(''setaspectratio'', ''vis3d'')'; %'axis(haxes,vis3d)';
end
vis3dItem=findall(h,'tag','CameraBash');
set(vis3dItem,'checked',check,'callback',cbk);
%post menu==========================
set(h,...
'Position',get(hfig,'CurrentPoint'),...
'Visible','on')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function removeContextMenu(hfig)
menuTag='CameratoolbarContextMenu';
h = findall(hfig,'type','uicontextmenu','tag',menuTag);
delete(h);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function val=iscameraobj(haxes)
% Checking if the selected axes is for a valid object to perform camera functions on.
if ~isempty(haxes)
if ~isa(handle(haxes),'graph2d.legend') & ~isa(handle(haxes),'graph3d.colorbar')
val = logical(1);
else
val = logical(0);
end
else
val = logical(0);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [hfig,haxes]=currenthandles
% Obtaining the correct handle to the current figure and axes in all cases:
% handlevisibility ON-gcbf; OFF-gcbf/gcf.
% if ~isempty(gcbf)
% hfig=gcbf;
% haxes=get(gcbf,'CurrentAxes');
% else
hfig=gcf;
haxes=get(hfig,'CurrentAxes');
% end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -