2013-03-13 3 views
0

Приветствую всех и благодарим заранее за вашу помощь.Matlab rotate3D и buttondownfcn несовместимость

В настоящее время я работаю над пользовательским интерфейсом в Matlab, который включает в себя 4 разных осяза для отображения различной информации. В основном, у меня есть данные МРТ (так 3D-данные), которые я хочу показать. Я использую 1 топор, чтобы показать 3 перпендикулярную плоскость, разделяющую данные по ее центру (axeMain) и еще 3 оси, которые показывают плоскости в отдельности (axeX, axeY и axeZ). У меня есть основной топор, в котором я хочу сделать вращения возможными (только на главной оси системы), и я хочу, чтобы иметь возможность выбирать координаты на 3 других топора (только с 1 плоскостью). Я также не могу выполнять переводы, но это выходит за рамки моей проблемы.

Итак, у меня нет проблем с выбором моих координат (с использованием buttondownfcn на моих самолетах) на всех трех осях, и у меня также нет проблем с использованием rotate3D на mainAxe. ОДНАКО, если я попытаюсь заставить обоих работать одновременно, 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); 

Так что мой вопрос поясню: почему обыкновение эти 2 функции не работают вместе и как работать вокруг этой проблемы, в идеале с минимальным изменением кода?

Спасибо.

EDIT: это экран печати моего текущего интерфейса. Я хочу, чтобы иметь возможность выбирать координаты, используя ТОЛЬКО на 3 последних осях (содержащих только 1 плоскость в каждом из них). Я также хочу, чтобы иметь возможность поворачивать изображения ТОЛЬКО на первом топе (тот, который имеет 3 плоскости). Надеюсь, это прояснится.

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

Я также хотел бы отметить следующее: после моего испытания, я обнаружил, что мышь не будет поднимать вообще, если Rotate3D активируется. Проблема заключается не в той логике, которую я использую для получения координат, но в событии клика не запускается.

Кроме того, я знаю, что событие не на поверхности, которую я пытаюсь напечатать. Фактический код выглядит так:

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

где h - ручка поверхности, и каждая поверхность обрабатывается таким образом.

ответ

0

возможно

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

Я обновил свое сообщение, чтобы сделать его более понятным. Это решение мне совсем не поможет. – Hugo

1

Я нашел точное решение!

Изучение код rotate3d(hAxe,'on'), я обнаружил, что они ключ линия getuimode(hFig,'Exploration.Rotate3d') Wich возвращает 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 
Смежные вопросы