0

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

我目前正在 matlab 中开发一个 UI,其中包括 4 个不同的轴来显示各种信息。基本上,我有想要显示的 MRI 数据(即 3D 数据)。我使用 1 个 ax 来显示 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 个平面的斧头)上旋转图像。希望这澄清。

用户界面

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

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

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

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

4

2 回答 2

1

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

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

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

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

在哪里:

  • hAxe是坐标区对象的句柄

  • hFig是图形对象的句柄

  • @mycallback是让buttondownfcnrotate3d协同工作的回调,如Matlab 的帮助示例

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

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
于 2016-05-25T10:44:38.910 回答
0

也许

set(handles.axisMain, 'buttondownfcn', @getCoord);
于 2013-03-13T15:40:54.787 回答