Context menu rotate3d works once !
    4 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
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 comentario
  derboo
 el 14 de Jul. de 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
Respuestas (1)
  Will Jackson
    
 el 21 de Jul. de 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
0 comentarios
Ver también
Categorías
				Más información sobre Interactive Control and Callbacks en Help Center y File Exchange.
			
	Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


