大家好,并提前感谢您的帮助。
我目前正在使用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是曲面的手柄,每个曲面都以这种方式处理。
答案 0 :(得分:1)
我找到了确切的解决方案!
探索rotate3d(hAxe,'on')
的代码,我发现他们的关键行是getuimode(hFig,'Exploration.Rotate3d')
,它返回包含uitools.uimode
和ButtonDownFilter
方法的ModeStateData
。
最后我通过以下方式解决了问题:
rotate3d(hAxe,'on')
uiMode = getuimode(hFig,'Exploration.Rotate3d');
uiMode.ButtonDownFilter = @mycallback;
其中:
hAxe
是轴对象的句柄
hFig
是图形对象的句柄
@mycallback
是允许buttondownfcn
和rotate3d
一起工作的回调,例如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);