Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Fachkräfte:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Popupmenu-String mit Exceldateinamen füllen

 

DerThomas
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 04.01.2011, 17:22     Titel: Popupmenu-String mit Exceldateinamen füllen
  Antworten mit Zitat      
Hallo,

ich habe folgendes Problem:
Ich habe in meinem GUI ein Popupmenu erstellt und würde gerne als String verschiedene Excel-Dateinamen anzeigen lassen. Dazu habe ich einen Ordner der später mal eine unbekannte Anzahl an Excel-Dateien enthält (beispielsweise: M1.xls, M2.xls, M3.xls, ... ). In meinem Popupmenu möchte ich gerne diese Dateinamen M1, M2, M3, usw. gerne aufgelistet bekommen.

Gibt es diese Möglichkeit? Wäre sehr dankbar, wenn mir da jemand weiterhelfen könnte Smile

Gruß
Thomas
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 19.198
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 04.01.2011, 19:14     Titel:
  Antworten mit Zitat      
Hallo,

sicher geht das. Ein paar Hinweise:
uigetdir - Wahl des Verzeichnisses
dir('*.xls') - eine Liste der Exceldateien als Struktur
set(... , 'String', ...) - setzt die String-Eigenschaft.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DerThomas
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 05.01.2011, 12:46     Titel:
  Antworten mit Zitat      
Vielen Dank für die schnelle Antwort Harald!
Habe versucht das nun umzusetzen.
Habe anstelle des "uigetdir" allerdings "cd" verwendet, um kein popupfenster zu erhalten, bei dem der User von Hand das Verzeichnis bestätigen muss.

Leider bin ich dabei auch noch auf das Problem gestoßen, dass sich so eine Struktur nicht direkt durch den set-Befehl als String anzeigen lässt.
Matlab bringt dann den Fehler:
"error: mxArray must be double, char oder cell"

Wie könnte ich denn dafür sorgen, dass er es dennoch macht?
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 05.01.2011, 13:21     Titel:
  Antworten mit Zitat      
Hey,
z.B. einfach das struct in ein cell umwandeln
Code:

d = dir('*.xls')
c = struct2cell(d);
namen = c(1,:);
set(handles.popupmenu,'String',namen)
 


MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.712
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.01.2011, 15:01     Titel:
  Antworten mit Zitat      
Hallo Thomas,

Zitat:
Leider bin ich dabei auch noch auf das Problem gestoßen, dass sich so eine Struktur nicht direkt durch den set-Befehl als String anzeigen lässt.

Was genau ist "so eine Struktur"? Meinst Du die Ausgabe des DIR-Kommandos? Dann:
Code:
FileDir = dir;
FileName = {FileDir.name};

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 05.01.2011, 16:10     Titel:
  Antworten mit Zitat      
Danke, der Beitrag von Marco hat mir schon weitergeholfen!
Find's klasse, dass einem hier so schnell kompetent geholfen wird Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.712
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.01.2011, 16:43     Titel:
  Antworten mit Zitat      
Hallo Thomas,
Zitat:
Danke, der Beitrag von Marco hat mir schon weitergeholfen!

Ja, aber:
Code:
c = struct2cell(d);
namen = c(1,:);

setzt voraus, dass "name" das erste Feld ist. Ich erwarte zwar nicht, dass sich das ändert, aber es ist auch nicht explizit dokumentiert. Ich bin dagegen sicher, dass {d.name} auch auf dem Mac mit Matlab 5.1 korrekt funktioniert.

Ausserdem denke ich grundsätzlich bei jeder Implementierung an die Anwendung auf größere Datensätze: Wenn Dein Ordner 1.000.000 Files enthält, ist {d.name} spürbar schneller als struct2cell(d).

Aber für nicht-pathologische Fälle, bewirken beide Methoden natürlich genau das gleiche.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 05.01.2011, 17:05     Titel:
  Antworten mit Zitat      
Ja, ich glaub ich verstehe was du meinst. Werds noch ändern Smile


Mein nächstes Problem ist etwas komplexer. Ich hoff ihr könnt mir auch hier so gut helfen:

Ich habe nun ein Popupmenu bei dem eine undefinierte Anzahl von Dateinamen angezeigt werden. Je nachdem wie viele Excel-Dateien in einem bestimmten Ordner sind.
Mein Ziel ist es nun mit der Callbackfunktion eine dieser Dateien auszuwählen und aus dieser den Wert aus der Zelle A2 auszulesen und ihn "parameter(19)" zu nennen.
Das Problem hierbei ist, dass ich nicht weiß, wie ich Matlab beibringe mir den Wert aus dem richtigen Excelblatt zu liefern. Vor allem weil die Anzahl der "Value" des Popupmenus variiert werden kann.
Ich denke das geht bestimmt irgendwie mit einer for-Schleife, leider scheitert es bei mir an der Umsetzung.
Hat da jemand eine Idee für eine Programmierstruktur?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 10.712
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.01.2011, 19:21     Titel:
  Antworten mit Zitat      
Hallo Thomas,

Zitat:
Das Problem hierbei ist, dass ich nicht weiß, wie ich Matlab beibringe mir den Wert aus dem richtigen Excelblatt zu liefern.

Was meinst Du mit "Blatt"? Haben die Files mehrere Sheets?

Zitat:
Mein Ziel ist es nun mit der Callbackfunktion eine dieser Dateien auszuwählen und aus dieser den Wert aus der Zelle A2 auszulesen und ihn "parameter(19)" zu nennen.

Wo wirst Du "parameter(19)" speichern?

Die Frage ist recht allgemein. Es wäre hilfreich, wenn Du zumindest ein paar Details vorgibst (Source code), damit wir ein paar Dinge auffüllen können. Wenn wir alles erfinden, passt es möglicherweise gar nicht zu Deinem Programm.

Aber ins Blaue reingeraten:
Code:
PopH = uicontrol('Style', 'popupmenu', ...
   'String', ListOfFileNames, ...
   'Callback', @popCallback);

function popCallback(ObjH, EventData)
DlgH = ancestor(ObjH, 'figure');
ListOfFileNames = get(ObjH, 'String');
Value = get(ObjH, 'Value');
File = ListOfFileNames{Value};
...
 

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 06.01.2011, 12:52     Titel:
  Antworten mit Zitat      
Hallo Jan,

die Excel-files haben nur ein sheet, welches relevant ist und das ist immer gleich das erste.

Den "parameter(19)" gibt es schon im "base"-Workspace und soll nur durch einen Wert vom Excelblatt überschrieben werden.

Ich habe dank deiner Hilfe das nun mal so umgesetzt:

Code:

% Popup-Menü zur Wahl des Motorvolllastkennlinie
       pm1h = uicontrol(p1h,'Style','popupmenu',...
            'String',{''},...
            'Backgroundcolor', 'white',...
            'Callback', @hpopupcallbackmotorkennlinie,...
            'Value',1,'Position',[10 400 190 20]);
 
       
      cd([...]\Eigene Dateien\MATLAB\Getriebe\Motorvolllastkennlinien');
      d = dir('*.xls');
      c = struct2cell(d);
      motoren = c(1,:);
      set(pm1h, 'String', motoren);
      assignin('base','motoren',motoren);      
      cd('[...]\Eigene Dateien\MATLAB\Getriebe');



function hpopupcallbackmotorkennlinie(hObject, eventdata)
     
     parameter=evalin('base','parameter');
     cd('[...]\Eigene Dateien\MATLAB\Getriebe\Motorvolllastkennlinien');    
     DlgH = ancestor(hObject, 'figure');
     motoren = get(hObject, 'String');
     Value = get (hObject, 'Value');
     File = motoren{Value};
           
     parameter(19) = xlsread(File, 1, 'A1');
     parameter(20) = xlsread(File, 1, 'B1');
     parameter(21) = xlsread(File, 1, 'A2');
     parameter(22) = xlsread(File, 1, 'B2');
     parameter(23) = xlsread(File, 1, 'A3');                  
     parameter(24) = xlsread(File, 1, 'B3');
     parameter(25) = xlsread(File, 1, 'A4');
     parameter(26) = xlsread(File, 1, 'B4');
     parameter(27) = xlsread(File, 1, 'A5');
     parameter(28) = xlsread(File, 1, 'B5');
     parameter(29) = xlsread(File, 1, 'A6');
     parameter(30) = xlsread(File, 1, 'B6');
     parameter(31) = xlsread(File, 1, 'A7');
     parameter(32) = xlsread(File, 1, 'B7');
     parameter(33) = xlsread(File, 1, 'A8');
     parameter(34) = xlsread(File, 1, 'B8');
     parameter(35) = xlsread(File, 1, 'A9');
     parameter(36) = xlsread(File, 1, 'B9');
     parameter(37) = xlsread(File, 1, 'A10');                  
     parameter(38) = xlsread(File, 1, 'B10');
     parameter(39) = xlsread(File, 1, 'A11');
     parameter(40) = xlsread(File, 1, 'B11');
     parameter(41) = xlsread(File, 1, 'A12');
     parameter(42) = xlsread(File, 1, 'B12');
     parameter(43) = xlsread(File, 1, 'A13');
     parameter(44) = xlsread(File, 1, 'B13');
     parameter(45) = xlsread(File, 1, 'A14');
     parameter(46) = xlsread(File, 1, 'B14');
     parameter(47) = xlsread(File, 1, 'A15');
     parameter(48) = xlsread(File, 1, 'B15');
     parameter(49) = xlsread(File, 1, 'A16');
     parameter(50) = xlsread(File, 1, 'B16');
     parameter(51) = xlsread(File, 1, 'A17');                  
     parameter(52) = xlsread(File, 1, 'B17');
     parameter(53) = xlsread(File, 1, 'A18');
     parameter(54) = xlsread(File, 1, 'B18');
     parameter(55) = xlsread(File, 1, 'A19');
     parameter(56) = xlsread(File, 1, 'B19');
     parameter(57) = xlsread(File, 1, 'A20');
     parameter(58) = xlsread(File, 1, 'B20');
 
     assignin('base','parameter',parameter);
     cd('[...]\Eigene Dateien\MATLAB\Getriebe');
     
 end
 


Geht sicher auch eleganter, aber keine Ahnung wie Very Happy

Wünschenswert wäre, dass ich nicht den Befehl "cd" verwenden muss, da ich eigentlich im gleichen Verzeichnis bleiben will und nur die Daten aus einem der Ordner brauche. D.H. der Ordner ist im selben Verzeichnis und trägt den Namen "Motorvolllastkennlinien". Gibt es die Möglichkeit das bei mir genannte "File" irgendwie um "\Motorvollastkennlinie\" zu erweitern?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 19.198
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 06.01.2011, 13:37     Titel:
  Antworten mit Zitat      
Hallo,

insbesondere das einzelne Einlesen von Zellen aus der Excel-Datei ist schlimm anzusehen. Das alles kann auch ersetzt werden durch:

Code:
data = xlsread(File, 1, 'A1:B20');
parameter(19:58) = reshape(data', 1, []);


Auf meinem Rechner ist das zudem rund 30 Mal schneller, da keine unnötige Zeit mit mehrmaligem Öffnen und Schließen von Excel verschwendet wird.

Das Verwenden des base Workspace als Zwischenspeicher ist auch keine gute Programmierpraxis. Schau dir dazu mal setappdata/getappdata an.

Du kannst bei xlsread bzw. in deiner Variable File auch den vollständigen Pfad angeben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DerThomas
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 06.01.2011, 14:09     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke, dachte mir schon dass das irgendwie auch besser geht.
allerdings hab ich bei deiner Umsetzung des Einlesen der Zellen das Problem, dass die Reihenfolge eine andere ist.
Ich würde gern die Parameter der Reihenfolge nach so einlesen:

A1 - B1 - A2 - B2 - A3 - ...

bei deiner Variante sieht es dann allerdings so aus:
A1 - A2 - A3 - ... - A20 - B1 - B2 - ...

Da die Reihenfolge leider relevant ist, kann ich das so nicht umsetzen.


Das mit setappdata, werde ich auch versuchen umzusetzen Smile.


Damit wäre dann erstmal nur noch die Frage offen wie ich in:
data = xlsread(File, 1, 'A1:B20');

den Pfad von "File" um "\Motorvolllastkennlinie\" erweitern kann, damit er im richtigen Ordner die Datei findet. ich hoffe mit dem vorigen Beitrag wird klar was ich mein Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 19.198
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 06.01.2011, 15:27     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Da die Reihenfolge leider relevant ist, kann ich das so nicht umsetzen.

Zum einen: das sollte durch eine geringfügige Modifikation hinzubekommen sein.
Zum anderen: ich habe es an einer Beispieldatei probiert und dieselben Ergebnisse bekommen. Meine Vermutung: das ' nach data ist irgendwie abhanden gekommen.

Der einzige Grund, warum ich mir vorstellen könnte, dass es nicht funktioniert, wären andere Dimensionen des existierenden parameter Vektors, aber da habe ich meine Zweifel.

Zitat:
wie ich den Pfad von "File" um "\Motorvolllastkennlinie\" erweitern kann


Wie gesagt: in der Definition der Variable File den kompletten Pfad angeben.
Am einfachsten wenn auch nicht sonderlich robust:
Code:
File = [pfad, motoren{Value}];

(pfad muss mit \ enden)

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DerThomas
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 50
Anmeldedatum: 04.01.11
Wohnort: Ludwigsburg
Version: R2010a
     Beitrag Verfasst am: 10.01.2011, 10:45     Titel:
  Antworten mit Zitat      
Vielen Dank an euch!

Habt mir enorm weitergeholfen! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Mister_Q
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 11.09.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2018, 09:42     Titel:
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein ähnliches Problem was das Popup Menü betrifft, allerdings helfen mir die gefundenen Lösungsansätze nicht weiter bzw. fällt es mir schwer, diese auf meinen Fall anzuwenden und ich drehe mich hier mittlerweile im Kreis.

Es geht um folgendes:
Ich habe eine Excel-Tabelle, in welcher innerhalb einer Spalte (ab der 3. Zeile) Namen aufgelistet sind. Die Länge der Spalte und damit auch die Anzahl der Namen (sowie die Namen selbst) varriiert von Fall zu Fall. Ich habe im Guide ein Popup Fenster eingefügt und dafür über den Property Inspector eine Callback- und CreateFcn-Verknüpfung zu meiner Matlabfunktion erstellt. Den Tag des Popup habe ich "Lastfall" genannt.

Die Namen aus der Excel-Tabelle lese ich innerhalb der CreateFcn ein:

Code:
function Lastfall_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
[~,txt,~] = xlsread('\input\input_data.xlsx');
lc_name   = txt(3:end,2);
set(handles.Lastfall,'String',lc_name);


Die Callback-Funktion sieht dann wie folgt aus:

Code:
function Lastfall_Callback(hObject, eventdata, handles)
    % Startwert setzen
    % Pop up Menü
    get(handles.Lastfall,'String',lc_name);
    Value = get(handles.Lastfall,'Value');
    n_Lastfall = Value;


Wenn ich dann die Funktion ausführe und sich nach der Berechnung das GUI öffnet, bleibt das Popup Menü allerdings leer. Eine Fehlermeldung erscheint nicht.

Daher nun meine Frage: Weiß jemand, was ich in meiner Umsetzung falsch mache? Ich habe im Property Inspector (des verwendeten Popup) das Feld für String leer gelassen, da sowohl die Namen als auch deren Anzahl wie bereits erwähnt varriiert. Muss in diesem Feld eventl. noch eine Definition eingefügt werden?

Ich hoffe ich konnte mein Problem verständlich erläutern und wäre sehr dankbar, wenn mir hierbei jemand helfen könnte!

Gruß Mister_Q
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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
.



goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2018 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.