Matlab GUI with activexcontrol Drop Down updates with Push button

2 ビュー (過去 30 日間)
Sarah Crimi
Sarah Crimi 2018 年 9 月 28 日
編集済み: Sarah Crimi 2018 年 9 月 28 日
Hello, I am having such a hard time with getting an activexcontrol GUI to work. I am trying to make it so that a drop down selects from different items in a struct. This part is working. I am able to add an additional entry into the struct by pressing a button, but I don't really understand the code I made (edited several different example codes together). Also, the struct is not reloading into the popupbox when the button is pressed? Thanks, Sarah
function [] = GUI_22()
%Load transducer data and permute to correct form.
load transducer.mat
transducercell = struct2cell(transducer);
%Get the different categories of data seperately
names = permute(transducercell(1,:,:),[3 2 1])
bandwidth = permute(transducercell(2,:,:),[3 2 1])
numpts = permute(transducercell(3,:,:),[3 2 1])
low_freq = permute(transducercell(4,:,:),[3 2 1])
high_freq = permute(transducercell(5,:,:),[3 2 1])
names = names';
bandwidth = bandwidth';
numpts = numpts';
low_freq = low_freq';
high_freq = high_freq';
%Define the GUI figure.
S.fh = figure('units','pixels',...
'position',[600 650 600 600],...
'menubar','none',...
'name','GUI_22',...
'numbertitle','off',...
'resize','off');
%Define the popup Menu with prepopulated items from the transducer struct.
S.pop = uicontrol('style','pop',...
'units','pixels',...
'position',[100 100 260 40],...
'string',names);
%Define the edit boxes that will display the items in the struct that go with each transducer type.
S.ed = uicontrol('style','edit',...
'units','pix',...
'position',[50 300 260 30],...
'fontsize',16,'string','');
S.ed2 = uicontrol('style','edit',...
'units','pix',...
'position',[250 300 260 30],...
'fontsize',16,'string','');
S.ed3 = uicontrol('style','edit',...
'units','pix',...
'position',[50 250 260 30],...
'fontsize',16,'string','');
S.ed4 = uicontrol('style','edit',...
'units','pix',...
'position',[ 250 250 260 30],...
'fontsize',16,'string','');
S.ed5 = uicontrol('style','edit',...
'units','pix',...
'position',[ 50 200 260 30],...
'fontsize',16,'string','');
%Define the pushbutton to update the struct
S.pushbutton1 = uicontrol('style','pushbutton',...
'units','pix',...
'position',[ 50 150 260 30],...
'fontsize',16,'string','New Transducer Type');
set([S.pop,S.ed],{'callback'},{{@pp_call,S};{@ed_call_2,S}});
set([S.pop,S.ed2],{'callback'},{{@pp_call,S};{@ed_call_2,S}});
set([S.pop,S.ed3],{'callback'},{{@pp_call,S};{@ed_call_2,S}});
set([S.pop,S.ed4],{'callback'},{{@pp_call,S};{@ed_call_2,S}});
set([S.pop,S.ed5],{'callback'},{{@pp_call,S};{@ed_call,S}});
set([S.pop,S.pusbutton1],{'callback'},{{@pp_call,S};{@pushbutton1_call,S}});
function [] = pp_call(varargin)
% Callback for the popup.
S = varargin{3}; % Get the structure.
P = get(S.pop,{'string','val'}); % Get the users choice.
p_var = P{1,2}
load transducer.mat
transducercell = struct2cell(transducer);
%Get the different categories of data seperately
names = permute(transducercell(1,:,:),[3 2 1])
bandwidth = permute(transducercell(2,:,:),[3 2 1])
numpts = permute(transducercell(3,:,:),[3 2 1])
low_freq = permute(transducercell(4,:,:),[3 2 1])
high_freq = permute(transducercell(5,:,:),[3 2 1])
names = names';
bandwidth = bandwidth';
numpts = numpts';
low_freq = low_freq';
high_freq = high_freq';
bandwidth = bandwidth;
numpts = numpts;
names = names;
low_freq = low_freq;
high_freq = high_freq;
names_selection = names{1,p_var}
num_pts_selection = numpts{1,p_var}
bandwidth_selection = bandwidth{1,p_var}
low_freq_selection = low_freq{1,p_var}
high_freq_selection = high_freq{1,p_var}
numpts_selection = numpts{1,p_var}
set(S.ed,'string',P{1}{P{2}}); % Assign the user's choice to the edit.
set(S.ed2,'string',bandwidth_selection); % Assign the user's choice to the edit.
set(S.ed3,'string',low_freq_selection); % Assign the user's choice to the edit.
set(S.ed4,'string',high_freq_selection); % Assign the user's choice to the edit.
set(S.ed5,'string',numpts_selection ); % Assign the user's choice to the edit.
function [] = ed_call(varargin)
% Callback for the edit.
S = varargin{3}; % Get the structure.
E = get(S.ed,'string'); % Get the string from the edit.
P = get(S.pop,{'string','value'}); % Get the users choice.
% Check if edit string is found in pop-up list.
tmp = strmatch(E,P{1});
if ~isempty(tmp)
set(S.pop,'value',tmp) % Set the pop-up to match the edit.
else
% We could add the new element to the popup string at either the top or
% the bottom. Both methods are shown below. Only uncomment one of
% these at a time!
%Get the different categories of data seperately
load transducer.mat
transducercell = struct2cell(transducer);
names = permute(transducercell(1,:,:),[3 2 1])
bandwidth = permute(transducercell(2,:,:),[3 2 1])
numpts = permute(transducercell(3,:,:),[3 2 1])
low_freq = permute(transducercell(4,:,:),[3 2 1])
high_freq = permute(transducercell(5,:,:),[3 2 1])
names = names';
bandwidth = bandwidth';
numpts = numpts';
low_freq = low_freq';
high_freq = high_freq';
bandwidth = bandwidth;
numpts = numpts;
names = names;
low_freq = low_freq;
high_freq = high_freq;
%First add the new row to the struct
num = length(names)
num_plus_1 = num +1
%Get the edit boxes info
e1 = get(S.ed,{'string','val'})
e2 = get(S.ed2,{'string','val'})
e3 = get(S.ed3,{'string','val'})
e4 = get(S.ed4,{'string','val'})
e5 = get(S.ed5,{'string','val'})
S = guidata(gcbf); % Get the structure.
%set(S.tx,'str',get(S.ed,'string'));
S.STR = [];
guidata(gcbf,S)
%Update the transducer struct and resave the transducer struct.
transducer(num_plus_1).name = e1{1,1}
transducer(num_plus_1).bandwidth = e2{1,1}
transducer(num_plus_1).low_freq = e3{1,1}
transducer(num_plus_1).high_freq = e4{1,1}
transducer(num_plus_1).numpts = e5{1,1}
save('transducer.mat','transducer');
load transducer.mat
set(S.pop,'string',{P{1}{:},E},'value',length(P{1})+1) % Bottom
end
% %
function [] = ed2_call(varargin)
% Callback for editbox.
S = guidata(gcbf); % Get the structure.
set(S.tx,'str',get(S.ed2,'string'));
S.STR = [];
guidata(gcbf,S)
function [] = ed3_call(varargin)
% Callback for editbox.
S = guidata(gcbf); % Get the structure.
set(S.tx,'str',get(S.ed3,'string'));
S.STR = [];
guidata(gcbf,S)
function [] = ed4_call(varargin)
% Callback for editbox.
S = guidata(gcbf); % Get the structure.
set(S.tx,'str',get(S.ed4,'string'));
S.STR = [];
guidata(gcbf,S)
function [] = ed5_call(varargin)
% Callback for editbox.
S = guidata(gcbf); % Get the structure.
set(S.tx,'str',get(S.ed5,'string'));
S.STR = [];
guidata(gcbf,S)
function [] = ed_kpfcn(H,E)
% Keypressfcn for editbox
S = guidata(gcbf); % Get the structure.
if strcmp(E.Key,'backspace')
S.STR = S.STR(1:end-1);
elseif isempty(E.Character)
return
else
S.STR = [S.STR E.Character];
end
set(S.tx,'string',S.STR)
guidata(gcbf,S)
function [] = pushbutton_call(varargin)
% Callback for the popup.
S = varargin{3}; % Get the structure.
P = get(S.pop,{'string','val'}); % Get the users choice.
p_var = P{1,2}
load transducer.mat
transducercell = struct2cell(transducer);
%Get the different categories of data seperately
names = permute(transducercell(1,:,:),[3 2 1])
bandwidth = permute(transducercell(2,:,:),[3 2 1])
numpts = permute(transducercell(3,:,:),[3 2 1])
low_freq = permute(transducercell(4,:,:),[3 2 1])
high_freq = permute(transducercell(5,:,:),[3 2 1])
names = names';
bandwidth = bandwidth';
numpts = numpts';
low_freq = low_freq';
high_freq = high_freq';
bandwidth = bandwidth;
numpts = numpts;
names = names;
low_freq = low_freq;
high_freq = high_freq;
num_pts_selection = numpts{1,p_var}
bandwidth_selection = bandwidth{1,p_var}
low_freq_selection = low_freq{1,p_var}
high_freq_selection = high_freq{1,p_var}
numpts_selection = numpts{1,p_var}
set(S.ed,'string',P{1}{P{2}}); % Assign the user's choice to the edit.
set(S.ed2,'string',bandwidth_selection); % Assign the user's choice to the edit.
set(S.ed3,'string',low_freq_selection); % Assign the user's choice to the edit.
set(S.ed4,'string',high_freq_selection); % Assign the user's choice to the edit.
set(S.ed5,'string',numpts_selection ); % Assign the user's choice to the edit.
function [] = pushbutton1_call(varargin)
% Callback for the edit.
S = varargin{3}; % Get the structure.
E = get(S.ed,'string'); % Get the string from the edit.
P = get(S.pop,{'string','value'}); % Get the users choice.
% Check if edit string is found in pop-up list.
tmp = strmatch(E,P{1});
% set(S.ed,'str',get(S.ed,'string'));
% set(S.ed2,'str',get(S.ed2,'string'));
% set(S.ed3,'str',get(S.ed3,'string'));
% set(S.ed4,'str',get(S.ed4,'string'));
% set(S.ed5,'str',get(S.ed5,'string'));
if ~isempty(tmp)
set(S.pop,'value',tmp) % Set the pop-up to match the edit.
else
% We could add the new element to the popup string at either the top or
% the bottom. Both methods are shown below. Only uncomment one of
% these at a time!
%Get the different categories of data seperately
load transducer.mat
transducercell = struct2cell(transducer);
names = permute(transducercell(1,:,:),[3 2 1])
bandwidth = permute(transducercell(2,:,:),[3 2 1])
numpts = permute(transducercell(3,:,:),[3 2 1])
low_freq = permute(transducercell(4,:,:),[3 2 1])
high_freq = permute(transducercell(5,:,:),[3 2 1])
names = names';
bandwidth = bandwidth';
numpts = numpts';
low_freq = low_freq';
high_freq = high_freq';
%First add the new row to the struct
num = length(names)
num_plus_1 = num +1
%Get the edit boxes info
e1 = get(S.ed,{'string','val'})
e2 = get(S.ed2,{'string','val'})
e3 = get(S.ed3,{'string','val'})
e4 = get(S.ed4,{'string','val'})
e5 = get(S.ed5,{'string','val'})
S = guidata(gcbf); % Get the structure.
%set(S.tx,'str',get(S.ed,'string'));
S.STR = [];
guidata(gcbf,S)
%Update the transducer struct and resave the transducer struct.
transducer(num_plus_1).name = e1
transducer(num_plus_1).bandwidth = e2
transducer(num_plus_1).low_freq = e3
transducer(num_plus_1).high_freq = e4
transducer(num_plus_1).numpts = e5
save('transducer.mat','transducer');
load transducer.mat
set(S.pop,'string',{P{1}{:},E},'value',length(P{1})+1) % Bottom
% set(S.pop,'string',{E,P{1}{:}},'value',1) % Top
end

回答 (0 件)

カテゴリ

Help Center および File ExchangeStructures についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by