Matlab GUI с панелью инструментов в mfile - PullRequest
2 голосов
/ 16 мая 2011

Я создаю графический интерфейс Matlab, который позволяет пользователю использовать некоторые интерактивные инструменты для обработки изображений (один m-файл без файла рис.),
, например, поворот изображения с imrotate и параметром угла и очистка пикселейс bwareaopen и параметром области.

Сначала я думал о том, чтобы нанести инструменты с моим mfile чем-то вроде

function myGUI( grayI )

h_fig = figure;
h_ax = imshow( grayI );
title('Drag line and press button to rotate image');

ImgSize = size(grayI);
h_lev = imline(gca, [ 0.2*ImgSize(2), 0.1*ImgSize(1); ...
0.8*ImgSize(2) 0.1*ImgSize(1) ] );
h_lev.addNewPositionCallback( @LineUpdateFcn );

% text for the angle
h_txt = uicontrol('Style','text','String','Angle = []', 'unit', 'norm', ...
'pos',[0 0.9 .1 .05]);

%add rotate button
h_btn = uicontrol('unit','norm','pos',[0 0.95 .1 .05]);
set(h_btn,'string','Rotate','callback',@RotateImageWithLever);

% save the elements data in figure
setappdata(h_fig,'h_lev',h_lev);
setappdata(h_fig,'h_ax',h_ax);
setappdata(h_fig,'h_txt',h_txt);

% wait for user to close figure
waitfor( h_fig );

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

Какой-нибудь совет по проектированию моей панели инструментов из одного mfile?

1 Ответ

1 голос
/ 16 мая 2011

Использование настраиваемой панели инструментов, вероятно, будет хорошим решением для инструмента, который вы описываете. Создайте панель инструментов с помощью UITOOLBAR и добавьте кнопки или переключатели с помощью UIPUSHTOOL и UITOOGLETOOL соответственно. Это легко сделать на этапе инициализации вашего m-файла с графическим интерфейсом.

Я привел простой пример ниже. Некоторые предостережения:

  1. Логика переключения между кнопкой и кнопкой не реализована правильно, поскольку инвертирование изображения, его переворачивание, а затем повторное инвертирование не даст правильного результата. Однако я просто пытаюсь показать, как кодировать кнопки панели инструментов, а не как обрабатывать изображения.
  2. Возможно, вы захотите использовать более креативные иконки, чем те, которые я дал в свойстве CData.
  3. Я поощряю объектно-ориентированный подход к этому решению, несмотря на мой процедурный пример.

Вот оно:

function myGUI(grayI)

persistent grayICopy;

%# Keep a persistent copy of the image data to be used in the toolbar tool
%# callbacks. Other possibilities here are to not store this data
%# persistently and instead read it from the plotted values or restructure
%# this whole code as a class and store the raw image data in a class
%# property.
grayICopy = grayI;

%# Create the figure window and show the image.
hFigure = figure;
hAxes = axes('Parent', hFigure);
image(grayI, 'Parent', hAxes); %# I don't have the Image processing Toolbox

%# Create toolbar
hToolbar = uitoolbar('Parent', hFigure);

%# Add a toolbar button for 90deg clockwise rotation
uipushtool('Parent', hToolbar, ...
    'ClickedCallback', @flipVertical, ...
    'CData', ...
    repmat([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; ...
    0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0; ...
    0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0; ...
    0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
    0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
    0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
    0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0; ...
    0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0; ...
    0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
    0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
    0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
    0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
    0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
    0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
    0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0; ...
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], [1 1 3]));

%# Add a toolbar toggle button for inverting image
uitoggletool('Parent', hToolbar, ...
    'OnCallback', @toggleInverseOn, ...
    'OffCallback', @toggleInverseOff, ...
    'CData', ...
    repmat([0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; ...
    0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0; ...
    0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0; ...
    0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
    0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
    0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
    0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
    0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
    0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
    0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
    0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
    0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
    0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0; ...
    0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0; ...
    0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0; ...
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], [1 1 3]));

    function flipVertical(src, eventdata)
        grayICopy = flipdim(grayICopy, 1);
        image(grayICopy, 'Parent', hAxes);
    end

    function toggleInverseOn(src, eventdata)
        image(1-grayICopy, 'Parent', hAxes);
    end

    function toggleInverseOff(src, eventdata)
        image(grayICopy, 'Parent', hAxes);
    end
end
...