私は、私のロボティクスチーム用のモジュラーテストモジュールの構築に取り組んでいます。これまでのところ、モジュールは次のようになります。MatlabモジュラーディスプレイをGUIにロード
それがこのテストモジュールから独立してディスプレイを設計した後、GUI画面の下部にそれらをロードすることは可能ですか?
私は、私のロボティクスチーム用のモジュラーテストモジュールの構築に取り組んでいます。これまでのところ、モジュールは次のようになります。MatlabモジュラーディスプレイをGUIにロード
それがこのテストモジュールから独立してディスプレイを設計した後、GUI画面の下部にそれらをロードすることは可能ですか?
GUI「モジュール」を個別に設計することは完全に可能です。あなたは、グラフィックオブジェクトハンドルをうまく追跡しなければならないかもしれませんが、それはとにかくどのGUIでも起こります。
私はそれを行う1つの方法を示す例を提案します(ただし、いくつかの方法があります)。この方法では、GUIをプログラムで設計する必要があります(GUIを設計したGUIに調整することはできますが、多くの面倒な作業が必要になり、推奨しません)。
基本的なアプローチは、汎用コンテナの代わりfigure
に「モジュール」(作成し、位置全てuicontrol
、axes
など...)レイアウト機能を持つことです。モジュールをロードする必要があるときは、コンテナを作成するだけです(この例ではuipanel
を使用します)。このコンテナにモジュールをロードします。アクティブなモジュールを変更する場合は、コンテナを削除してください(Matlabはすべての子オブジェクトを削除します)。新しいモジュールを新しいコンテナにロードします。または、すべてのモジュールをロードして、それらをすべて非表示にすることもできます(すべてのコンテナに'visible','off'
を設定し、使用中の現在のモジュールのみを表示します)。
例では、モジュールを定義する3つの異なる関数は同じですファイルを別のファイルに入れることもできます(私は個人的に40モジュールに近いアプリケーションを使用するので、別々のファイルに保存する方が管理しやすくなります)。
コードはちょうど次のようになります:
コード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を設計するのは、すべてのコントロールをプログラムで配置(サイズを変更)する必要があります(例のすべての位置計算を行う必要はありません)。
これをGUIDEまたはプログラムで設計していますか? – Suever
今はGUIDEを使っていますが、私が始めたばかりなので、どちらのアプローチにもオープンしています。 – Austin