La domanda è "un po' vecchia", ma forse la risposta può essere utile a qualcuno.
Una possibilità per selezionare in modo dinamico i canali da rappresentare graficamente potrebbe essere:
[*] creare una
listbox nella quale inserire gli identificativi dei possibili elementi (canali) che l'utente può selezionare.
La "
listbox" deve essere creata in modo da consentire la "
selezione multipla"
[*] creare tanti "
subplot" quanti sono i possibili elementi (nel caso specifico della domanda, otto)
[*] creare un "
pushbutton" che attivi il plot degli elementi selezionati
La GUI può poi essere ulteriormente dotata di funzionalità aggiuntive per, esempio, la cancellazione dei singoli grafici oppure di tutti.
Una alternativa potrebbe consistere nel creare solo il numero di "
subplot" necessari al plot degli elementi selezionati.
Gli script che seguono implementano il primo approccio (creazione di tutti i "
subplot" contemporaneamente.
La GUI che viene creata è molto semplice (poco "
professionale"), ma il suo scopo è solo quello di mostrare "
il concetto".
Nello script i segnali da plottare sono definiti come semplici valori di funzioni (calcolati nel "main script), se la GUI oggetto della domanda deve rappresentare segnali acquisiti da una fonte esterna, gli script devono essere opportunamente modificati.
Main script per la creazione della GUI
%
% Generazione dati di esempio
%
x=0:.1:2*pi;
y=[];
y(1,:)=sin(x);
y(2,:)=sin(2*x);
y(3,:)=sin(3*x);
y(4,:)=sin(4*x);
y(5,:)=sin(5*x);
y(6,:)=sin(6*x);
y(7,:)=sin(7*x);
y(8,:)=sin(8*x);
%
% Creazione "figura"
%
fig_h=figure;
%
% Inizializzazione vettore per memorizzazione handle dei vari grafici
%
plt_h=zeros(1,8);
%
% Loop creazione 8 assi cartesiani (8 subplot) e relativo pushbutton per
% cancellazione grafico. La callback per la cancellazione del singolo
% grafico è definita direttamente all'interno della funzione "uicontrol"
%
for i=1:8
ax_list(i)=subplot(8,1,i);
grid on
tmp_pos=get(ax_list(i),'position');
set(ax_list(i),'position',[.43 tmp_pos(2) .47 tmp_pos(4)], ...
'fontsize',6,'fontweight','bold');
%
% Creazione Clear CH PUSHBUTTON
%
c_pb_h(i)=uicontrol('style','pushbutton', ...
'unit','normalized', ...
'position',[.90 tmp_pos(2) .1 .05], ...
'enable','off', ...
'tag',['clear_pb_' num2str(i)], ...
'callback',['delete(plt_h(' num2str(i) '));set(c_pb_h(' num2str(i) '),''enable'',''off'');plt_h(' num2str(i) ')=0.0;'], ...
'string','Clear');
end
%
% Creazione LIST BOX: alla listbox non è associata nessuna callback
%
lb_h=uicontrol('style','listbox', ...
'unit','normalized', ...
'position',[.07 .6 .3 .3], ...
'max', 8, ...
'callback','');
%
% Creazione Plot Selected CH pushbutton; la callback è definita nel file
% "plot_sel_ch.m" ed attiva il plot dei grafici selezionati nella listbox
%
p_pb_h=uicontrol('style','pushbutton', ...
'unit','normalized', ...
'position',[.07 .3 .2 .05], ...
'callback', 'plot_sel_ch', ...
'string','Plot Selected CH');
%
% Creazione Clear All pushbutton; la callback è definita nel file
% "clear_all_ch.m" e cancella tutti i grafici
%
c_all_pb_h=uicontrol('style','pushbutton', ...
'unit','normalized', ...
'position',[.07 .2 .2 .05], ...
'callback','clear_all_ch', ...
'enable','off', ...
'string','Clear All');
%
% Creazione della lista contenente gli elementi che possono essere plottati
%
lista{1}='sin(x)';
lista{2}='sin(2*x)';
lista{3}='sin(3*x)';
lista{4}='sin(4*x)';
lista{5}='sin(5*x)';
lista{6}='sin(6*x)';
lista{7}='sin(7*x)';
lista{8}='sin(8*x)';
%
% Assegnazione della lista alla LIST BOX
%
set(lb_h,'string',lista)
Script della callback "clear_all_ch"
%
% Callback "clear_all_ch" associata al pushbutton creato nello script
% "multi_canale.m". Loop su tutti i "subplot" per la cancellazione dei
% grafici I pushbutton per la cancellazione dei singoli grafici e quello
% per la cancellazione di tutti i grafici vengono disabilitati
%
for i=1:8
%
% Individuazione della presenza di un grafico nell'i-esimo asse
% (l'handle viene assegnato in "plot_sel_ch"
%
if(plt_h(i) ~= 0)
%
% Cancellazione del grafico
%
delete(plt_h(i));
%
% Disabilitazione dei pushbuttons per la cancellazione dei singoli
% grafici e di quello per la cancellazione di tutti i grafici
%
set(c_pb_h(i),'enable','off');
set(c_all_pb_h,'enable','off');
plt_h(i)=0;
end
end
Script della callback "plot_sel_ch
% Callback "plot_sel_ch" associata al pushbutton creato nello script
% "multi_canale.m"
%
% Indentificazione degli elementi selezionati nella listbox
%
sel_ch=get(lb_h,'value');
%
% Loop sugli elementi selezionati nella listbox
%
for i=1:length(sel_ch)
curr_ch=sel_ch(i);
%
% Selezione dell'asse cartesiano corrispondente all'elemento selezionato
% e plot della funzione
%
axes(ax_list(curr_ch))
plt_h(curr_ch)=plot(x,y(curr_ch,:));
set(gca,'fontsize',6,'fontweight','bold');
grid on
%
% Abilitazione del pushbutton per la canccellazione del garfico e di
% quello per la cancellazione di tutti i grafici
%
set(c_pb_h(curr_ch),'enable','on');
set(c_all_pb_h,'enable','on')
end
Hope this helps.
Allegati: