Matlab rotate3D和buttondownfcn不兼容

时间:2013-03-13 15:30:24

标签: matlab 3d rotation mouseclick-event

大家好,并提前感谢您的帮助。

我目前正在使用matlab中的UI,其中包含4个不同的轴以显示各种信息。基本上,我有想要显示的MRI数据(所以3D数据)。我使用1个轴来显示3个垂直平面,该平面将数据分割在其中心(axeMain),以及3个其他轴,分别显示平面(axeX,axeY和axeZ)。我有一个主轴,我想让旋转成为可能(仅在主轴系统上),我希望能够选择另外3个轴上的坐标(仅限1个平面的坐标)。我也无法翻译,但这超出了我的问题的范围。

基本上,我在所有3个轴上选择我的坐标(使用我的飞机上的buttondownfcn)都没有问题,而且在mainAxe上使用rotate3D也没有问题。但是,如果我试图让两者同时工作,那么buttondownfcn就不再起作用了。我不明白为什么会这样做(我有一些想法,但那是关于它)我不知道如何解决它。基本上我的这些函数的代码是这样的:

    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);

所以我的问题基本上是:为什么这两个函数不能一起工作以及如何解决这个问题,理想情况下只需要最少的代码更改?

感谢。

编辑:这是我当前界面的打印屏幕。我希望能够仅使用最后3个轴(每个轴只包含1个平面)来选择坐标。我还希望能够仅在第一个轴(具有3个平面的轴)上旋转图像。希望这澄清一下。

UI http://i46.tinypic.com/ab789j.png

我还要注意这一点:在我的测试之后,我发现如果激活rotate3D,鼠标点击根本不会升起。问题不在于我用来获取坐标本身的逻辑,而是在未被触发的click事件中。

此外,我知道该事件不是我试图打印的表面。实际代码是这样的:

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

其中h是曲面的手柄,每个曲面都以这种方式处理。

2 个答案:

答案 0 :(得分:1)

我找到了确切的解决方案!

探索rotate3d(hAxe,'on')的代码,我发现他们的关键行是getuimode(hFig,'Exploration.Rotate3d'),它返回包含uitools.uimodeButtonDownFilter方法的ModeStateData

最后我通过以下方式解决了问题:

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

其中:

  • hAxe是轴对象的句柄

  • hFig是图形对象的句柄

  • @mycallback是允许buttondownfcnrotate3d一起工作的回调,例如Matlab's help

因此,您必须标记您不想忽略的对象:

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

写下回调:

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

答案 1 :(得分:0)

也许

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