2016-06-01 3 views
0

Я работаю над созданием модульного модуля тестирования для моей команды робототехники. До сих пор, модуль выглядит следующим образом:Matlab Загрузка модульных дисплеев в GUI

Testing module

Можно ли проектировать дисплеи независимо от этого тестового модуля, а затем загрузить их в нижнюю часть экрана GUI?

+0

Вы проектируете это с помощью GUIDE или программно? – Suever

+0

Прямо сейчас с GUIDE, но так как я только начал, я открыт для любого подхода. – Austin

ответ

1

Возможно создание GUI-модуля самостоятельно. Возможно, вам придется хорошо отслеживать графические объекты, но это все равно для любого графического интерфейса.

Я предложу пример, показывающий один способ сделать это (есть еще несколько способов). Этот способ потребовал бы программного программирования вашего графического интерфейса (вы могли бы настроить его на GUIDE GUI, но для этого потребовалось бы много возиться, и я бы не рекомендовал его).

Основной подход заключается в функции, которые лежат вне «модуль» (создание и положение всех uicontrol, axes и т.д ...) в общего контейнера вместо figure. Когда вам нужно загрузить модуль, вы можете просто создать контейнер (я использую в этом примере uipanel) и загрузить модуль в этот контейнер. Если вы хотите изменить активный модуль, вы можете просто удалить контейнер (Matlab удалит все дочерние объекты), затем загрузите новый модуль в новый контейнер. В качестве альтернативы вы можете просто загрузить все модули, скрыть их все (установите 'visible','off' на весь контейнер, а затем сделайте видимым только текущий модуль.

В этом примере три различные функции, которые определяют модуль, находятся в одном и том же (я лично использую приложение, которое имеет около 40 модулей, поэтому вы можете угадать, что их можно использовать в разных файлах).

Вот как это сделать Посмотрите, и код просто следуйте за ним: Modular GUI

Код для Modular_GUI_sample.m: (Самый интересный раздел для вас в функции Module_Selection_callback)

function h = Modular_GUI_sample 

%// The main figure 
h.figMain = figure('Name','Testing Module',... 
    'Menubar','none','Toolbar','none',... 
    'NumberTitle','off','Units','Normalized') ; 

%// The Module Selection panel 
h.ms = Create_Module_Selection_UI(h.figMain) ; 

%// save the ui object handles structure 
guidata(h.figMain , h) 


function Module_Selection_callback(hobj, ~) 
selectedModuleName = get(get(hobj , 'SelectedObject'), 'String') ; 

%// retrieve the global handle structure 
h = guidata(hobj) ; 
%// Delete old module if present 
if isfield(h,'hmod') 
    if ishandle(h.hmod.pnl) ; 
     delete(h.hmod.pnl) ; % delete the panel and children object 
     h.hmod = [] ;   % clear the structure 
    end 
end 
%// The panel which will contain the selected module 
spc = 0.05 ; % spacing value for margins 
h.hmod.pnl = uipanel('Units','Normalized','Position',[spc spc (1-2*spc) (0.7-2*spc)],'BackgroundColor','w') ; 

%// load new module 
switch selectedModuleName 
    case 'Locomotion' 
     hmod = Load_Module_Locomotion(h.hmod.pnl) ; 
    case 'Vision' 
     hmod = Load_Module_Vision(h.hmod.pnl) ; 
    case 'Localization' 
     hmod = Load_Module_Localization(h.hmod.pnl) ; 
end 
%// save the ui object handles structure 
h.mod = hmod ; 
guidata(h.figMain , h) 


function hmod = Load_Module_Locomotion(parent) 
%// main container panel 
hmod.pnl = parent ; 
spc = 0.05 ; 
hmod.list = uicontrol('Parent',parent,'Style','listbox','Units','Normalized','Position',[spc spc (1-2*spc) (1-2*spc)]) ; 
set(hmod.list,'String',{'List Item 1','List Item 2','List Item 3'},'Value',1) ; 


function hmod = Load_Module_Vision(parent) 
%// main container panel 
hmod.pnl = parent ; 
hmod.ax1 = subplot(2,2,1,'Parent',parent) ; 
hmod.ax1 = subplot(2,2,3,'Parent',parent) ; 
hmod.ax1 = subplot(2,2,[2 4],'Parent',parent) ; 


function hmod = Load_Module_Localization(parent) 
%// main container panel 
hmod.pnl = parent ; 
spc = 0.05 ; 
hmod.list = uicontrol('Parent',parent,'Style','pushbutton','String','A big push button','Units','Normalized','Position',[spc spc (1-2*spc) (1-2*spc)]) ; 


function ms = Create_Module_Selection_UI(parent) 
%// prepare position calculation helper 
spc = 0.05 ; %// spacing value for margins 
nButtons = 3 ; 
btnH = (1-(nButtons+1)*spc)/nButtons ; 
radioPos = @(k) [spc (1-(k*(spc+btnH))) (1-2*spc) btnH ] ; 

%// The main "Module Selection" panel (actually a "uibuttongroup" object) 
ms.pnl = uibuttongroup('Parent',parent,'Position',[spc 0.7 (1-2*spc) 0.3-spc],'BackgroundColor','w') ; 

%// prepare properties which will be common for this group of uicontrols 
radioProps = {'Parent',ms.pnl , 'Style','radiobutton' , 'Units','Normalized' } ; 
%// Create three radio buttons in the button group. 
k=0; 
k=k+1 ; ms.radLocomotion = uicontrol(radioProps{:} , 'Position',radioPos(k) , 'String','Locomotion') ; 
k=k+1 ; ms.radVision  = uicontrol(radioProps{:} , 'Position',radioPos(k) , 'String','Vision') ; 
k=k+1 ; ms.radLocalization = uicontrol(radioProps{:} , 'Position',radioPos(k) , 'String','Localization') ; 

%// Initialize some button group properties. 
set(ms.pnl,'SelectionChangeFcn',@Module_Selection_callback); 
set(ms.pnl,'SelectedObject',[]); % No selection 

Если вам нужно программно разработать обширный графический интерфейс, я призываю вас рассмотреть вопрос об использовании GUI Layout Toolbox из файлового обмена. Он достаточно прочный и делает разработку графического интерфейса в Matlab легким, по сравнению с тем, что он должен программно программировать (и изменять размер) все ваши элементы управления (вам не нужно будет делать все вычисления позиций, которые у меня есть в примере, например).