Context menu rotate3d works once !

2 views (last 30 days)
Alain
Alain on 31 Jul 2014
Answered: Will Jackson on 21 Jul 2016
Hello,
I'm working with MatlabR2012b and uicontrols.
I'm trying to activate a contextual menu into an axe to
  • swap between rotate3d / zoom / save picture
  • Axe is into a figure (that will contain uicontrols).
- For FUNCTION (here: ctx_save) and ZOOM : everything is correct
- For ROTATE3D : it works only ONCE !!!
(code is below)
Scenario : run my function context_menu_rotate_zoom
(other function ctx_save, ctx_rotate, ctx_zoom will be in seperate files)
  • right button into the fig : context menu appears (Rotation/zoom/save)
  • right button into the axe : context menu appears (Rotation/zoom/save)
  • right button on the surface : nothing but it's ok as hittest is on
== 1/ right button and select context menu zoom : (pop up window+zoom on) : it's OK
You can zoom using left button
You can click on right button context menu to zoom and save several times.. it's OK
right button into the figure : Nothing !
QUESTION 1 >> Does "ZOOM ON" desactivate context menu for parent ?
== 2.1/ right button and select in context menu ROTATION: (pop up window+rotate on) : it's OK you can rotate the picture
== 2.2/ right button and select a second time on context menu ROTATION: (pop up window+rotate on) : it's OK
== 2.3/ right button... The rotate3d context menu appears with :reset to original view/Goto X-Z...
QUESTION 2 >> How can I overwrite Context menu for ROTATE3D the same way it works for ZOOM ?
Thank you for your help ! Alain
==============================================================
% -------------------------------
function context_menu_rotate_zoom
% -------------------------------
% Creation of axe into figure
myfig=figure('MenuBar','None');
myaxe = axes;
% Plot something
axes(myaxe);
axis vis3d;
[X,Y] = meshgrid(-5:0.1:5,-5:0.1:5);
pp=plot3(X,Y,X.*X+Y.*Y);
% creation of callback
var_Rotation = strcat('ctx_Rotation(',num2str(myaxe,'%.16f'),');');
var_Zoom = strcat('ctx_Zoom(',num2str(myaxe,'%.16f'),');');
var_Save = strcat('ctx_Save(',num2str(myaxe,'%.16f'),');');
%
% Creation of context menu for the fig
cmenu_fig = uicontextmenu;
uimenu(cmenu_fig,'label','Rotation','Callback',var_Rotation);
uimenu(cmenu_fig,'label','Zoom','Callback',var_Zoom);
uimenu(cmenu_fig,'label','Save','Callback',var_Save);
set(myfig,'uicontextmenu',cmenu_fig);
% Creation of context menu for the axe...
cmenu_axe = uicontextmenu;
uimenu(cmenu_axe,'label','Rotation','Callback',var_Rotation);
uimenu(cmenu_axe,'label','Zoom','Callback',var_Zoom);
uimenu(cmenu_axe,'label','Save','Callback',var_Save);
set(myaxe,'uicontextmenu',cmenu_axe);
end
% ----------------------------
function ctx_Zoom(monaxe)
% ----------------------------
% creation of callback
var_Rotation = strcat('ctx_Rotation(',num2str(monaxe,'%.16f'),');');
var_Zoom = strcat('ctx_Zoom(',num2str(monaxe,'%.16f'),');');
var_Save = strcat('ctx_Save(',num2str(monaxe,'%.16f'),');');
% Creation contextuel menu for zoom
cmenu_zoom = uicontextmenu;
uimenu(cmenu_zoom,'label','Rotation','Callback',var_Rotation);
uimenu(cmenu_zoom,'label','Zoom','Callback',var_Zoom);
uimenu(cmenu_zoom,'label','Save','Callback',var_Save);
%set(monaxe,'uicontextmenu',cmenu);
% overwrite context menu for zoom
hZoom = zoom;
zoom('off') % cannot change context if zoom on !
set(hZoom,'UIContextMenu',cmenu_zoom);
zoom('on')
msgbox('Context menu in Zoom');
end
% ----------------------------
function ctx_Rotation(monaxe)
% ----------------------------
% creation of callback
var_Rotation = strcat('ctx_Rotation(',num2str(monaxe,'%.16f'),');');
var_Zoom = strcat('ctx_Zoom(',num2str(monaxe,'%.16f'),');');
var_Save = strcat('ctx_Save(',num2str(monaxe,'%.16f'),');');
% Creation of contextuel menu
cmenu_rot = uicontextmenu;
uimenu(cmenu_rot,'label','Rotation','Callback',var_Rotation);
uimenu(cmenu_rot,'label','Zoom','Callback',var_Zoom);
uimenu(cmenu_rot,'label','Save','Callback',var_Save);
% overwrite context menu for rotate3d
hrotate = rotate3d;
rotate3d('off')
set(hrotate,'UIContextMenu',cmenu_rot);
rotate3d('on')
msgbox('Context menu in Rotation');
end
% ----------------------------
function ctx_Save(monaxe)
% ----------------------------
% creation of callback
var_Rotation = strcat('ctx_Rotation(',num2str(monaxe,'%.16f'),');');
var_Zoom = strcat('ctx_Zoom(',num2str(monaxe,'%.16f'),');');
var_Save = strcat('ctx_Save(',num2str(monaxe,'%.16f'),');');
% Creation contextuel menu for axe
cmenu_axe = uicontextmenu;
uimenu(cmenu_axe,'label','Rotation','Callback',var_Rotation);
uimenu(cmenu_axe,'label','Zoom','Callback',var_Zoom);
uimenu(cmenu_axe,'label','Save','Callback',var_Save);
set(monaxe,'uicontextmenu',cmenu_axe);
msgbox('Context menu in save the image');
end
end
  1 Comment
derboo
derboo on 14 Jul 2016
Hey Alain,
I know it's been a long time since you ask this question, but I'm facing the same problem now.
When I create an UIContextMenu with one menu entry for rotation, I can overwrite the standard rotation UIContextMenu. Everything looks fine, when I click on this menu - rotation mode is activated. When I right click again, I also find my UIContextMenu and can deactivate rotation again. But when I rotate an axes and I try to open my context menu again, my context menu has been reseted with the standard rotate3d context menu with :reset to original view/Goto X-Z
You also described this behaviour in your question.
Have you or anyone else found a solution for this? (I'm using Matlab 2013b)
Thanks for your help, Jan

Sign in to comment.

Answers (1)

Will Jackson
Will Jackson on 21 Jul 2016
Hello,
This is a bug in MATLAB that was fixed in R2014a. As you say, after rotating, rotate would reset some user set values before the next rotation.
Will

Categories

Find more on Interactive Control and Callbacks in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!