2016-08-26 5 views
0

팝업 메뉴의 결과가 다른 경우가 있습니다. 그러나, 나는 어떤 종류의 파일 (예 : .mat)에서 사례를 읽는 곳 (예 : for 루프?)을 갖고 싶습니다. 어떻게 구현할 수 있습니까?파일에서 사례 읽기

% --- Executes on selection change in hd_poweramp. 
function hd_poweramp_Callback(hObject, eventdata, handles) 
% hObject handle to hd_poweramp (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 
val = get(hObject, 'Value'); 
str = get(hObject, 'String'); 

switch str{val} 
    case '325LA Precision Acoustics' 

     if handles.transducer_index == 1; 
      handles.fgen1_voltage = (handles.fgen1_PNP*2-28.8)/0.72; % Double check that 
     else if handles.transducer_index == 2; 
      handles.fgen1_voltage = (handles.fgen1_PNP*2-28.8)/6.055; % Double check that 
      end 
     end 

    case '2100L E&I' 

     if handles.transducer_index == 1; 
      handles.fgen1_voltage = (handles.fgen1_PNP*2-10.267)/1.6; % Double check that 
     else if handles.transducer_index == 2; 
      handles.fgen1_voltage = (handles.fgen1_PNP*2-28.8)/6.055; % Double check that 
      end 
     end 
end 

guidata(hObject, handles); % Update the GUI data structure 

답변

0

균일 한 구조로 데이터를 저장하고이를 사용하여 드롭 다운 선택 사항을 생성하고 계산을 수행 할 수 있습니다.

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 

: 여기 yay

가 2 개 가장 관련성이 부분은 다음과 같습니다

는 (하단에 전체 코드) 다음 예제 GUI를 고려 각 구조체의 배열을 만들었습니다. x는 장치 및 관련 상수에 해당합니다. GUI가 생성되면 드롭 다운 목록에 모든 장치 이름이 채워지고 변환기 목록에는 장치에 사용할 수있는 변환기 수가 입력됩니다.

드롭 다운 또는 fgen1 PNP 중 하나를 변경하면 전압이 다시 계산됩니다. 재 계산 기능이 얼마나 단순한지 유의하십시오. MATLAB 방식으로 데이터 구조를 설정 했으므로 루프, 문자열 조작 또는 두려워한 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 
+0

IT는 GUI에서 직접 새로운 사례를 추가하는 것이 가능합니까? –

+0

예. 저장된 데이터 'handles.UserData'에 추가하고 필요한 경우 ui 제어 문자열을 업데이트하십시오. – excaza