データを一様な構造で保存し、それを使用してドロップダウン選択を生成し、計算を駆動することができます。
function makedummydata(mydatafile)
cases(1).Name = '325LA Precision Acoustics';
cases(1).ntransducers = 2;
cases(1).TransducerConstant1(1) = 28.8;
cases(1).TransducerConstant1(2) = 28.8;
cases(1).TransducerConstant2(1) = 0.72;
cases(1).TransducerConstant2(2) = 6.055;
cases(2).Name = '2100L E&I';
cases(2).ntransducers = 2;
cases(2).TransducerConstant1(1) = 10.267;
cases(2).TransducerConstant1(2) = 28.8;
cases(2).TransducerConstant2(1) = 1.6;
cases(2).TransducerConstant2(2) = 6.055;
save(mydatafile, 'cases');
end
、ここで
function recalc(hObj, ~)
handles = guidata(hObj);
deviceID = handles.devicedd.Value;
transducerID = handles.transducerdd.Value;
fgen1_PNP = str2double(handles.fgen1_PNP.String);
TransducerConstant1 = handles.UserData(deviceID).TransducerConstant1(transducerID);
TransducerConstant2 = handles.UserData(deviceID).TransducerConstant2(transducerID);
voltage = (fgen1_PNP*2 - TransducerConstant1)/TransducerConstant2;
handles.resultsbox.String = voltage;
end
:ここ
2つの、最も関連性の高い部分である:
は、(下にフルコード)次の例のGUIを検討します私は構造の配列を作成しました。そこでは、それぞれのトップレベルのinde xはデバイスとそれに関連する定数に対応します。 GUIが生成されると、ドロップダウンリストにすべてのデバイス名が入力され、トランスデューサリストにはデバイスで使用可能なトランスデューサの数が入力されます。
ドロップダウンメニューまたはfgen1 PNPのいずれかを変更すると、電圧が再計算されます。再計算機能がどのくらい簡単か注意してください。データ構造をMATLAB-icの方法で設定するので、ループ、文字列操作、または恐ろしいeval
を必要とせずに、関連するすべての部分に簡単にアクセスできます。
完全なGUIコード:
function testcode
% Set up sample data
mydatafile = 'mydevices.mat';
makedummydata(mydatafile);
buildGUI(mydatafile);
end
function recalc(hObj, ~)
handles = guidata(hObj);
deviceID = handles.devicedd.Value;
transducerID = handles.transducerdd.Value;
fgen1_PNP = str2double(handles.fgen1_PNP.String);
TransducerConstant1 = handles.UserData(deviceID).TransducerConstant1(transducerID);
TransducerConstant2 = handles.UserData(deviceID).TransducerConstant2(transducerID);
voltage = (fgen1_PNP*2 - TransducerConstant1)/TransducerConstant2;
handles.resultsbox.String = voltage;
end
function makedummydata(mydatafile)
cases(1).Name = '325LA Precision Acoustics';
cases(1).ntransducers = 2;
cases(1).TransducerConstant1(1) = 28.8;
cases(1).TransducerConstant1(2) = 28.8;
cases(1).TransducerConstant2(1) = 0.72;
cases(1).TransducerConstant2(2) = 6.055;
cases(2).Name = '2100L E&I';
cases(2).ntransducers = 2;
cases(2).TransducerConstant1(1) = 10.267;
cases(2).TransducerConstant1(2) = 28.8;
cases(2).TransducerConstant2(1) = 1.6;
cases(2).TransducerConstant2(2) = 6.055;
save(mydatafile, 'cases');
end
function buildGUI(mydatafile)
% Generate GUI
h.f = figure('MenuBar', 'none', 'ToolBar', 'none', 'NumberTitle', 'off');
cases = load(mydatafile, 'cases');
h.UserData = cases.cases; % Remove extra layer
h.lbl(1) = uicontrol('Parent', h.f, 'Style', 'Text', ...
'Units', 'Normalized', 'Position', [0.1 0.7 0.6 0.1], ...
'FontSize', 12, 'HorizontalAlignment', 'left', 'String', 'Device Thing');
h.devicedd = uicontrol('Parent', h.f, 'Style', 'popupmenu', ...
'Units', 'Normalized', 'Position', [0.1 0.55 0.6 0.2], ...
'String', {h.UserData(:).Name}, 'Callback', @recalc);
h.lbl(2) = uicontrol('Parent', h.f, 'Style', 'Text', ...
'Units', 'Normalized', 'Position', [0.1 0.5 0.6 0.1], ...
'FontSize', 12, 'HorizontalAlignment', 'left', 'String', 'Transducer Thing');
h.transducerdd = uicontrol('Parent', h.f, 'Style', 'popupmenu', ...
'Units', 'Normalized', 'Position', [0.1 0.35 0.6 0.2], ...
'String', 1:h.UserData(1).ntransducers, 'Callback', @recalc);
h.lbl(3) = uicontrol('Parent', h.f, 'Style', 'Text', ...
'Units', 'Normalized', 'Position', [0.1 0.3 0.3 0.1], ...
'FontSize', 12, 'HorizontalAlignment', 'left', 'String', 'fgen1 PNP Thing');
h.fgen1_PNP = uicontrol('Parent', h.f, 'Style', 'edit', ...
'Units', 'Normalized', 'Position', [0.1 0.25 0.25 0.1], ...
'String', 1);
h.lbl(4) = uicontrol('Parent', h.f, 'Style', 'Text', ...
'Units', 'Normalized', 'Position', [0.5 0.3 0.3 0.1], ...
'FontSize', 12, 'HorizontalAlignment', 'left', 'String', 'Result');
h.resultsbox = uicontrol('Parent', h.f, 'Style', 'edit', ...
'Units', 'Normalized', 'Position', [0.5 0.25 0.25 0.1]);
guidata(h.f, h);
recalc(h.f, 'hi'); % Fire first calc
end
は、GUIから直接、新しいケースを追加することも可能ですか? –
はい。この場合、格納されたデータ 'handles.UserData'に追加し、必要に応じてui制御文字列を更新します。 – excaza