Как использовать «ButtonDownFcn» в населенных пунктах с графическим интерфейсом? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть очень простой графический интерфейс, созданный в руководстве, где у меня есть функция графика, инициируемая кнопкой, которая строит график рассеяния по осям (называемый Method1axes1):

handles.plot = scatter(X,Y, 'parent', handles.Method1axes1);

Теперь я хочу, чтобы пользователь былв состоянии щелкнуть оси (сюжет), чтобы получить новую большую фигуруЯ попробовал приведенный ниже код, который работает, если я не строю графики на осях в первую очередь.Как только я запускаю функцию plot, график рассеяния появляется в Method1axes1, но я больше не могу щелкнуть по цифре.

% --- Executes on mouse press over axes background.
function Method1axes1_ButtonDownFcn(hObject, eventdata, handles)
figure
scatter(X,Y);

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Это особый случай для MATLAB, и он не очень хорошо документирован.

Вам нужно учесть 2 вещи:

  • 1) Самая очевидная часть.Когда вы рисуете что-то в своем axes, график находится на переднем плане.Поэтому, когда вы нажимаете на axes, верхний график перехватывает этот щелчок и пытается его обработать.Вам необходимо отключить захват щелчка мышью на объектах plot / scatter / image, которые есть в вашем axes.Для этого вам нужно установить свойство HitTest вашего разбросанного объекта равным 'off'.(последние версии MATLAB изменили имя этого свойства, теперь оно называется PickableParts).

  • 2) Гораздо менее очевидно и задокументировано.Раньше он был в документе для обратного вызова axes ButtonDownFcn, но больше не объясняется (хотя поведение сохраняется).Вот что я мог найти на старых форумах:

Когда вы вызываете PLOT, если свойство axes NextPlot установлено в 'replace' (что по умолчанию)большинство свойств axes (включая ButtonDownFcn) сбрасываются на значения по умолчанию.

Измените свойство axes NextPlot на 'replacechildren', чтобы избежать этого, или установите ButtonDownFcn после вызова PLOT или использования функции LINE низкого уровня вместо функции PLOT более высокого уровня.

Это также обсуждается и объясняется здесь: Почему функция обратного вызова ButtonDownFcn моих осейобъект перестает работать после печати чего-либо?


В вашем случае я попытался set(axe_handle,'NextPlot','replacechildren'), и он работает нормально, чтобы позволить щелчку мыши достичь ButtonDownFcn, но, к сожалению, он создает хаос сaxes limit и LimitModes ... поэтому я выбрал второе решение, которое заключается в переопределении обратного вызова для ButtonDownFcn после каждого графика в axes.


Итак, в итоге, вашкод для pushbutton1_Callback должен быть:

function pushbutton1_Callback(hObject, eventdata, handles)
    % Whatever stuff you do before plotting
    % ...
    % Plot your data
    handles.plot = scatter(X,Y, 'parent', handles.Method1axes1);
    % Disable mouse click events for the "scatterplot" object
    set(handles.plot,'HitTest','off') ;
    % re-set the "ButtonDownFcn" callback
    set(handles.Method1axes1,'ButtonDownFcn',@(s,e) Method1axes1_ButtonDownFcn(s,e,handles) )

и дляВаше axes событие щелчка мышью, вы также можете сохранить дескриптор новых сгенерированных объектов:

function Method1axes1_ButtonDownFcn(hObject, eventdata, handles)
    handles.newfig    = figure ;
    handles.axes1copy = copyobj( handles.Method1axes1 , handles.newfig ) ;

Обратите внимание, что вместо построения нового набора я просто использую *Функция 1060 *, очень удобная для воспроизведения сюжета.


Иллюстрация:

enter image description here

0 голосов
/ 17 декабря 2018

Если вы хотите настроить увеличение или уменьшение рисунка / графика при прокрутке / щелчке мыши, просто задайте свойство масштабирования требуемых осей в OpeningFcn в файле m.

Например, в пределах OpeningFcn в файле графического интерфейса пользователя, поместите следующий код.Убедитесь, что вы поместили приведенный ниже код в функцию OpeningFcn .

h1 = zoom(handles.Method1axes1);
h1.Enable = 'on';

Теперь, при каждом прокрутке / щелчке мыши вы сможете увеличивать / уменьшать графики.

Ниже приведен пример снимка экрана opensFcn для графического интерфейса с именем ZoomAxesDemo.

enter image description here

...