Matlab rotate3D and buttondownfcn incompatibility

三世轮回 提交于 2019-12-12 04:45:02

问题


Hi everyone and thanks in advance for all your help.

I'm currently working on a UI in matlab that includes 4 differents axes to show various info. Basicly, I have MRI data (so 3D data) that I want to show. I use 1 axe to show 3 perpendicular plane that split the data at its center (axeMain), and 3 other axes that shows the planes individually (axeX,axeY and axeZ). I have a main axe on wich I want to make rotations possible (only on the main axis system) and I want to be able to select coordinate on the 3 other axe (those with 1 plane only). I also unable translations but that is out of scope for my problem.

So basicly, I have no problem selecting my coordinates (using the buttondownfcn on my planes) on all of the 3 axes and I also have no problem using rotate3D on the mainAxe. HOWEVER, if I try to have both to work at the same time, the buttondownfcn doesn't work anymore. I don't understand why it's doing this (I have some ideas but that's about it) and I have no idea how to work around it. Basicly my code for those functions are like this :

    rotate3d(handles.axisMain);        
    %some other code, setting up other UI stuff

    %allow selection on the 3 static plains.
    set([handles.axeX,handles.axeY,handles.axeZ], 'buttondownfcn', @getCoord);

So my question is basicly : why wont those 2 functions don't work together and how to work around that problem, ideally with minimal code change?

Thanks.

EDIT : this is a print screen of my current interface. I want to be able to select coordinate using ONLY on the 3 last axes (containing only 1 plane in each of them). I also want to be able to rotate images ONLY on the first axe (the one with 3 planes). Hope this clarify.

I would also like to note this : following my tests, I found that the mouse click would not raise at all if the rotate3D is activated. The problem is not in the logic I use to get the coordinates itself, but in the click event not being fired.

Also, I am aware that the event is not on the surface that I try to print. The actual code is like this :

    set(h, 'buttondownfcn', @getCoord);
    set(h,'HitTest','on');

where h is the handle of a surface and each surfaces are processed this way.


回答1:


I have found the exact solution!

Exploring the code for rotate3d(hAxe,'on') , i have found that they key line is getuimode(hFig,'Exploration.Rotate3d') wich returns uitools.uimode that contains ButtonDownFilter and ModeStateData methods.

Finally i have solved the problem in the following way:

rotate3d(hAxe,'on')
uiMode = getuimode(hFig,'Exploration.Rotate3d');
uiMode.ButtonDownFilter = @mycallback;

where:

  • hAxe is the handle to the axes object

  • hFig is the handle to the figure object

  • @mycallback is the callback that lets buttondownfcn and rotate3d works together as in the example of Matlab's help

So, you have to tag the object that you want to not be ignored:

set(hAxe,'tag','DoNotIgnore')

And write the callback:

function [flag] = mycallback(obj,event_obj)
% If the tag of the object is 'DoNotIgnore', then return true
objTag = obj.Tag;
if strcmpi(objTag,'DoNotIgnore')
    flag = true;
else
    flag = false;
end



回答2:


maybe

set(handles.axisMain, 'buttondownfcn', @getCoord);


来源:https://stackoverflow.com/questions/15389569/matlab-rotate3d-and-buttondownfcn-incompatibility

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!