2016-06-01 5 views
0

私は、私のロボティクスチーム用のモジュラーテストモジュールの構築に取り組んでいます。これまでのところ、モジュールは次のようになります。MatlabモジュラーディスプレイをGUIにロード

Testing module

それがこのテストモジュールから独立してディスプレイを設計した後、GUI画面の下部にそれらをロードすることは可能ですか?

+0

これをGUIDEまたはプログラムで設計していますか? – Suever

+0

今はGUIDEを使っていますが、私が始めたばかりなので、どちらのアプローチにもオープンしています。 – Austin

答えて

1

GUI「モジュール」を個別に設計することは完全に可能です。あなたは、グラフィックオブジェクトハンドルをうまく追跡しなければならないかもしれませんが、それはとにかくどのGUIでも起こります。

私はそれを行う1つの方法を示す例を提案します(ただし、いくつかの方法があります)。この方法では、GUIをプログラムで設計する必要があります(GUIを設計したGUIに調整することはできますが、多くの面倒な作業が必要になり、推奨しません)。

基本的なアプローチは、汎用コンテナの代わりfigureに「モジュール」(作成し、位置全てuicontrolaxesなど...)レイアウト機能を持つことです。モジュールをロードする必要があるときは、コンテナを作成するだけです(この例ではuipanelを使用します)。このコンテナにモジュールをロードします。アクティブなモジュールを変更する場合は、コンテナを削除してください(Matlabはすべての子オブジェクトを削除します)。新しいモジュールを新しいコンテナにロードします。または、すべてのモジュールをロードして、それらをすべて非表示にすることもできます(すべてのコンテナに'visible','off'を設定し、使用中の現在のモジュールのみを表示します)。

例では、モジュールを定義する3つの異なる関数は同じですファイルを別のファイルに入れることもできます(私は個人的に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を設計する必要がある場合、私は、ファイル交換からGUI Layout Toolboxの使用を検討することをお勧めします。これは非常に堅牢であり、MatlabでGUIを設計するのは、すべてのコントロールをプログラムで配置(サイズを変更)する必要があります(例のすべての位置計算を行う必要はありません)。