WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Button Group mit Radio Buttons

 

Peedschee
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 21.10.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 30.12.2013, 07:07     Titel: Button Group mit Radio Buttons
  Antworten mit Zitat      
Hallo liebe Matlab-Freunde,

ich habe da ein Problem mit meinem GUI. Ich möchte Ordner mit Textdateien einlesen und das mache ich mit Hilfe eines Pushbuttons mit:
Code:
folder_name = uigetdir(' ', 'Please select directory'); % Ordner wählen
fullpath = fullfile(folder_name);

set(handles.filepath,'String',fullpath); % Pfad anzeigen

liste = dir(fullfile(fullpath,'*.txt')); % Anzahl der Textdateien ermitteln

nDateien = length(liste) - sum([liste.isdir]);

set(handles.anzahlfiles,'String',nDateien); % Anzahl Textdateien anzeigen

files = {liste.name};
data = cell(size(files));

for k = 1:numel(files)  % Alle Textdateien einlesen
    if ~isdir(files{k})
        fileID = fopen(fullfile(fullpath,files{k}),'r');
        data{k} = textscan(fileID,'%f %f %f %f %f','delimiter','\t','headerlines',4);
        data{k} = cell2mat(data{k});  % Cell in Matrix konvertieren
        fclose(fileID);
    end
end;
 


Die Dateien werden auch eingelesen und die Anzahl der Dateien angezeigt. So weit so gut.

Jetzt möchte ich mittels Radiobuttons in einer Button Group (SelectionChangeFcn ist erstellt) auf die jeweiligen Dateien zugreifen und bestimmt Werte plotten bzw. in einer Tabelle darstellen. Mit Radiobutton1 sollen also Werte aus Datei 1, mit Radiobutton2 Werte aus Datei 2... usw. verarbeitet werden. Mein bisheriger Code dafür ist:
Code:
% --- Executes when selected object is changed in datasetsbuttongroup.
function datasetsbuttongroup_SelectionChangeFcn(hObject, eventdata, handles)
% hObject    handle to the selected object in datasetsbuttongroup
% eventdata  structure with the following fields (see UIBUTTONGROUP)
%   EventName: string 'SelectionChanged' (read only)
%   OldValue: handle of the previously selected object or empty if none was selected
%   NewValue: handle of the currently selected object
% handles    structure with handles and user data (see GUIDATA)

if(get(handles.radiobutton1,'Value')==1)
   
    for k = 1
        set(handles.datatable,'Data',data{k});
        axes(handles.dataplot);
        x = data{k}(:,1);
        y = data{k}(:,2);
        scatter(x,y);
        title('Kraft-Weg-Kurve');
        ylabel('Load [µN]');
        xlabel('Depth [nm]');
        grid on;
    end

end;
 


Leider funktioniert das so nicht um beim Klicken des Radiobuttons kommt folgende Fehlermeldung:

Undefined variable data.

Error in
indenter1>datasetsbuttongroup_SelectionChangeFcn (line
741)
set(handles.datatable,'Data',data{k});

Error in gui_mainfcn (line 96)
feval(varargin{:});

Error in indenter1 (line 43)
gui_mainfcn(gui_State, varargin{:});

Error in
@(hObject,eventdata)indenter1('datasetsbuttongroup_SelectionChangeFcn',get(hObject,'SelectedObject'),eventdata,guidata(get(hObject,'SelectedObject')))


Error in hgfeval (line 63)
feval(fcn{1},varargin{:},fcn{2:end});

Error in
uitools.uibuttongroup/childAddedCbk>manageButtons
(line 79)
hgfeval(cbk, source, evdata);

Error while evaluating uicontrol Callback


Die Variable "data" bzw. "data{k}" habe ich doch schon in der Callback-Funktion des Pushbuttons definiert.? Muss ich die für die Radiobuttons dann erneut definieren?
Ich hoffe, mir kann da jemand von euch weiterhelfen! Kommt gut ins neue Jahr!
Viele Grüße,

Peedschee
Private Nachricht senden Benutzer-Profile anzeigen


Peedschee
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 21.10.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 30.12.2013, 10:57     Titel:
  Antworten mit Zitat      
Ich habe es jetzt so gelöst:
Code:
% --- Executes on button press in browsebutton.
function browsebutton_Callback(hObject, eventdata, handles)
% hObject    handle to browsebutton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


folder_name = uigetdir(' ', 'Please select directory'); % Ordner wählen
fullpath = fullfile(folder_name);

set(handles.filepath,'String',fullpath); % Pfad anzeigen

liste = dir(fullfile(fullpath,'*.txt')); % Anzahl der Textdateien ermitteln

nDateien = length(liste) - sum([liste.isdir]);

set(handles.anzahlfiles,'String',nDateien); % Anzahl Textdateien anzeigen

files = {liste.name};
data = cell(size(files));

for k = 1:numel(files)  % Alle Textdateien einlesen
    if ~isdir(files{k})
        fileID = fopen(fullfile(fullpath,files{k}),'r');
        data{k} = textscan(fileID,'%f %f %f %f %f','delimiter','\t','headerlines',4);
        data{k} = cell2mat(data{k});  % Cell in Matrix konvertieren
        fclose(fileID);
    end
end;

handles.data{1} = data{1};
handles.data{2} = data{2};
handles.data{3} = data{3};
handles.data{4} = data{4};
handles.data{5} = data{5};
handles.data{6} = data{6};
handles.data{7} = data{7};
handles.data{8} = data{8};
handles.data{9} = data{9};
handles.data{10} = data{10};
handles.data{11} = data{11};
handles.data{12} = data{12};

guidata(hObject,handles);
 


und:
Code:
% --- Executes when selected object is changed in datasetsbuttongroup.
function datasetsbuttongroup_SelectionChangeFcn(hObject, eventdata, handles)
% hObject    handle to the selected object in datasetsbuttongroup
% eventdata  structure with the following fields (see UIBUTTONGROUP)
%   EventName: string 'SelectionChanged' (read only)
%   OldValue: handle of the previously selected object or empty if none was selected
%   NewValue: handle of the currently selected object
% handles    structure with handles and user data (see GUIDATA)

data{1} = handles.data{1};
data{2} = handles.data{2};
data{3} = handles.data{3};
data{4} = handles.data{4};
data{5} = handles.data{5};
data{6} = handles.data{6};
data{7} = handles.data{7};
data{8} = handles.data{8};
data{9} = handles.data{9};
data{10} = handles.data{10};
data{11} = handles.data{11};
data{12} = handles.data{12};

N = get(hObject,'String');

switch N
    case '1'
        set(handles.datatable,'Data',data{1});
        axes(handles.dataplot);
        x = data{1}(:,1);
        y = data{1}(:,2);
        scatter(x,y);
        title('Kraft-Weg-Kurve');
        ylabel('Load [µN]');
        xlabel('Depth [nm]');
        grid on;
    case '2'
        set(handles.datatable,'Data',data{2});
        axes(handles.dataplot);
        x = data{2}(:,1);
        y = data{2}(:,2);
        scatter(x,y);
        title('Kraft-Weg-Kurve');
        ylabel('Load [µN]');
        xlabel('Depth [nm]');
        grid on;  
end;

guidata(hObject,handles);
 


Ich habe in meinen Ordnern immer so um die 60 Dateien und mit meiner bisherigen Vorgehensweise müsste ich ja dann alle in separaten Handels abspeichern, wodurch mein Skript recht ausgedehnt und unübersichtlich wird. Gibt es da vielleicht eine elegantere Lösung?

Viele Grüße,

Peedschee
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 31.12.2013, 19:50     Titel:
  Antworten mit Zitat      
Hallo Peedschee,

Code:
folder_name = uigetdir(' ', 'Please select directory'); % Ordner wählen
% fullpath = fullfile(folder_name);  % Überflüssig

Code:
handles.data{1} = data{1};
handles.data{2} = data{2};...
handles.data{12} = data{12};

% Hübscher:
handles.data = data(1:12);

Code:
% Und später:
data = handles.data;

% Statt_
data{1} = handles.data{1};
data{2} = handles.data{2};
...data{12} = handles.data{12};

Dann statt der Switch-Branches:
Code:
N = get(hObject,'String');
Index = sscanf(N, '%d');

set(handles.datatable,'Data',data{Index});
axes(handles.dataplot);
x = data{Index}(:,1);
y = data{Index}(:,2);
scatter(x,y);
title('Kraft-Weg-Kurve');
ylabel('Load [µN]');
xlabel('Depth [nm]');
grid on;


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Peedschee
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 21.10.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 03.01.2014, 13:38     Titel:
  Antworten mit Zitat      
Vielen, vielen Dank Jan!
Du hast mir damit wahnsinnig geholfen! Klappt nun alles wunderbar!

Gruß und ein frohes neues Jahr!

Peedschee
Private Nachricht senden Benutzer-Profile anzeigen
 
Peedschee
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 21.10.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 07.01.2014, 14:31     Titel:
  Antworten mit Zitat      
Servus,

ich hätte da nochmal eine Rückfrage. Und zwar klappt das mit den Radiobuttons nun wunderbar, jedoch habe ich zu jedem Radiobutton auch noch eine Checkbox. Die Checkboxes (insgesamt 60) besitzen in meinem Skript jeweils einen eigenen Callback, da diese nicht als Buttongroup zusammenzuführen sind (oder?). Die Checkboxes dienen dazu, dass der User auswählen kann, welche der Dateien auch wirklich im nächsten Schritt bearbeitet und ausgewertet werden sollen. D. h. ich möchte, dass wenn die Box aktiviert ist, die Werte gespeichert und an ein neues GUI übergeben werden. Ich hätte gedacht es funktioniert so:
Code:
% --- Executes on button press in next1.
function next1_Callback(hObject, eventdata, handles)
% hObject    handle to next1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

data = handles.data;

for l = 1:length(data)
   checkboxvalue = get(handles.(['checkbox' num2str(l)]),’Value’)
   
   if checkboxvalue == 1
        setappdata(0,'indenter1',data); % Datenübergabe
    end
end;

handles.data = data;

guidata(hObject,handles);

set(handles.next,'Visible','on');
set(handles.output,'Visible','off');
 


Es kommt keine Fehlermeldung, aber es werden alle Daten übergeben, auch die, wo die Checkbox nicht gecheckt ist... Was mache ich falsch?
Muss ich in die einzelnen Callbacks der Checkboxes auch noch etwas einfügen?

Viele Grüße und danke für eure Hilfe,

Peedschee
Private Nachricht senden Benutzer-Profile anzeigen
 
Peedschee
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 21.10.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 10.01.2014, 11:24     Titel:
  Antworten mit Zitat      
Keiner eine Idee? Hänge immer noch an der Stelle mit der Übergabe der "gecheckten" Daten... und habe auch im Rest des Internets keine Hilfe finden können...

Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.01.2014, 01:01     Titel:
  Antworten mit Zitat      
Hallo Peedschee,

Ich verstehe den Zweck des Codes nicht.
Was bedeutet "es werde alle Daten übergeben"? Du schreibst ja "data" in die ApplicationData des Root-Objektes, und das hängt gar nicht davon ab, welche Checkbox ausgewählt wurde.

Du brauchst GUIDATA nicht, da die Variable "handles" nicht geändert wurde.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Peedschee
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 21.10.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 12.01.2014, 10:07     Titel:
  Antworten mit Zitat      
Guten Morgen Jan (und auch natürlich an alle anderen Cool ),

ich bin noch Anfänger was das Arbeiten mit Matlab betrifft und muss mich für meine Diplomarbeit da erst richtig einarbeiten... Das Programm ist wirklich genial, aber ich muss sagen, dass ich ohne euch wahrscheinlich aufgeschmissen wäre...

Aber nun zum Problem: Ich lade mir also mit
Code:
folder_name = uigetdir(' ', 'Please select directory'); % Ordner wählen
fullpath = fullfile(folder_name);

set(handles.filepath,'String',fullpath); % Pfad anzeigen

liste = dir(fullfile(fullpath,'*.txt')); % Anzahl der Textdateien ermitteln

nDateien = length(liste) - sum([liste.isdir]);

set(handles.anzahlfiles,'String',nDateien); % Anzahl Textdateien anzeigen

files = {liste.name};
data = cell(size(files));

for k = 1:numel(files)  % Alle Textdateien einlesen
    if ~isdir(files{k})
        fileID = fopen(fullfile(fullpath,files{k}),'r');
        data{k} = textscan(fileID,'%f %f %f %f %f','delimiter','\t','headerlines',4);
        data{k} = cell2mat(data{k});  % Cell in Matrix konvertieren
        fclose(fileID);
    end
end;


eine je Ordner unterschiedliche Anzahl von .txt - Dateien in mein GUI. Das klappt auch, und dank deiner Hilfe, Jan, werden mir die Messergebnisse - es sind Kraft-Weg-Kurven - per Radiobutton-Klick für jede vorhandene Datei angezeigt. Mit den Checkboxes möchte ich nun selektieren, welche Datei bzw. welcher Datensatz zur weiteren Auswertung an ein folgendes GUI übergeben wird. D. h. ich möchte die Variable "data" so anpassen, dass sie nur die data der Messreihen enthält, für die die Checkbox gecheckt ist. Alternativ wäre es natürlich auch möglich, dass eine neue Variable mit den "gecheckten" Datensätzen erstellt wird.

Ich hoffe, mein Problem und der Zweck meines Codes wird damit ein wenig deutlicher.

Vielen Dank im Voraus für deine/eure Hilfe!

Gruß,
Peedschee
Private Nachricht senden Benutzer-Profile anzeigen
 
Peedschee
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 21.10.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 17.01.2014, 12:21     Titel:
  Antworten mit Zitat      
Servus,

also ich habe mein Problem jetzt folgendermaßen gelöst:
Code:
% --- Executes on button press in next1.
function next1_Callback(hObject, eventdata, handles)
% hObject    handle to next1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

data = handles.data;

deletedcells = false(length(data), 1);

for k = 1:length(data)
    A = get(handles.(['checkbox' num2str(k)]), 'Value');
    if A == 0
        deletedcells(k) = true;
    end
end;

data(deletedcells) = [];

setappdata(0,'data',data) % Datenübergabe

set(handles.next,'Visible','on');
set(handles.output,'Visible','off');

handles.data = data;
guidata(hObject,handles);
 


Die cells werden auch wie gewünscht aus dem Array gelöscht. Wie müsste ich den code modifizieren, wenn ich die cells nur clearen will, sodass der Array seine ursprüngliche Größe behält? Mit
Code:
data{deletedcells} = [];

bekomme ich eine Fehlermeldung...

Viele Grüße,
Peedschee
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.01.2014, 00:14     Titel:
  Antworten mit Zitat      
Hallo Peedschee,
Zitat:
bekomme ich eine Fehlermeldung...

Bitte poste immer die Meldung, wenn Du einen Ratschlag suchst, sie zu beheben.

Code:
data(deletedcells) = {[]};

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Peedschee
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 21.10.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 23.01.2014, 14:14     Titel:
  Antworten mit Zitat      
Vielen Dank, Jan!
Funktioniert wunderbar!

Grüße,
Peedschee
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.