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

Auslesen eines dropdown Menüs und übergeben einer Funktion

 

Semmeljoke
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 15.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.09.2013, 15:54     Titel: Auslesen eines dropdown Menüs und übergeben einer Funktion
  Antworten mit Zitat      
Hallo zusammen,

ich versuche schon länger ein (wahrscheinlich leichtes) Problem in Matlab zu lösen. Leider bin ich weder programmiertechnisch begabt, noch habe ich Erfahrungen mit Matlab und anderen Programmiersprachen. Vielleicht könnt ihr mir ein wenig weiterhelfen das Prinzip zu verstehen.

Ich programmiere im GUI ein einfaches Programm, das werte aus einem Textfeld ausliest und bei Betätigung eines Pushbuttons drei Funktionen plotet. Dabei kann man außerdem für 3 versch. Fälle die Randbedingungen mittels popup Menü auswählen. Und genau hier komme ich nicht weiter.

Wie lese ich richtig das ausgewählte dropdown menü aus und wie übergebe ich dann die richtige Funktion?

Folgenden Code habe ich bis jetzt geschrieben:

Code:

function keine_Einspannung
X=[q*l/2-q.*x; q*l/2.*x-q.*x.^2/2; 1/(E*I*10^-4)*(q.*x.^4/24-q*l/12.*x.^3+q*l^3/24.*x)];


function rechts_Einspannung
X=[3*q*l/8-q.*x; 3*q*l/8.*x-q.*x.^2/2; 1/(E*I*10^-4)*(q.*x.^4/24-q*l/16.*x.^3+q*l^3/48.*x)];


function beide_Einspannung
X=[q*l/2-q.*x; -q*l^2/12+q*l/2.*x-q.*x.^2/2; 1/(E*I*10^-4)*(q.*x.^4/24-q*l/12.*x.^3+q*l^2/24.*x.^2)];




function plotten_Callback(hObject, eventdata, handles)

% Lese für die Werte E-Modul, Trägheitsmoment I, Trägerlänge l und Gleichlast q die String-Eigenschaft
% der Edit-Felder e_modul, traegheitsmoment, traegerlaenge und gleichlast mit get aus
% und wandle sie in Zahlen um
    E = str2num(get(handles.e_modul,'String'));            
    I = str2num(get(handles.traegheitsmoment,'String'));
    l = str2num(get(handles.traegerlaenge,'String'));
    q = str2num(get(handles.gleichlast,'String'));


% x-Werte, Unterteilung des Intervalls [0,l]
x = linspace(0,l,501);  

% Fallunterscheidung und auslesen der richtigen Matrix für den jeweiligen
% Fall

einspannung_auslesen = get(handles.einspannung, 'String');

contents = cellstr(einspannung_auslesen);
if strcmp(contents{get(hObject,'Value')},'keine Einspannung') == 1
    get(keine_Einspannung)
   
elseif strcmp(contents{get(hObject,'Value')},'rechts Einspannung') == 1
    get(rechts_Einspannung)
   
else
    get(beide_Einspannung)
end  

%Plotten der drei verschiedenen Funktionen in ein eigenes Fenster
subplot(3,1,1)
plot(x,X(1,:))
set(gca,'YDir','reverse');
title('Querkraft [kN]')
xlabel('x [m]')
ylabel('Q(x) [kN]')
hold on

subplot(3,1,2)
plot(x,X(2,:))
set(gca,'YDir','reverse');
title('Moment [kNm]')
xlabel('x [m]')
ylabel('M(x) [kNm]')

subplot(3,1,3)
plot(x,X(3,:))
set(gca,'YDir','reverse');
title('Biegelinie')
xlabel('x [m]')
ylabel('w(x) [m]')
hold off
Private Nachricht senden Benutzer-Profile anzeigen


markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 15.09.2013, 16:34     Titel:
  Antworten mit Zitat      
Ich hoffe ich verstehe dich richtig.

Angenommen
Code:
function DAS_Callback(hObject, eventdata, handles)

ist dein Pulldown Menü.

Dann musst du dir einmal die Strings und einmal den Wert holen (in dem pushbutton callback)

Code:

DAS.cell=get(handles.DAS,'String'); % Liest alle hinterlegten Strings deines PopDown Menüs aus
DAS.value=get(handles.DAS,'Value'); % Liest den aktuellen Wert des PopDown Menüs aus. Wenn der Wert = 1 ist, ist der erste String selektiert etc.
DAS.string=sprintf('%s', DAS.cell{DAS.value}); % Damit holst du dir nur den selektierten String
 


Anschließend kannst du mit

Code:

if 1 == strcmp(DAS.string,'Plot A') % Wenn z.B. "Plot A" in dem Pulldown Menü steht
   ... %irgendeine funktion
else
  ...
end
 


entsprechend agieren.
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Semmeljoke
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 15.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2013, 21:35     Titel:
  Antworten mit Zitat      
Leider funktioniert diese Variante nicht. Es wird immer nur der else - Teil ausgegeben. Die anderen Fälle sind nicht auswählbar. Es gibt auch diesbezüglich keine Fehlermeldung.
Woran könnte das liegen?
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 18.09.2013, 21:57     Titel:
  Antworten mit Zitat      
Vielleicht reden wir auch aneinander vorbei?

Hier ein kurzes Demo Video in ziemlich schlechter Qualität: http://p.osuv.de/index.php/JjU/ (wird in 5 Tagen automatisch gelöscht).
Und im Anhang hab ich noch die beiden Dateien (fig und m file) gezipped hochgeladen.

gomatlab.zip
 Beschreibung:

Download
 Dateiname:  gomatlab.zip
 Dateigröße:  4.07 KB
 Heruntergeladen:  335 mal

_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Semmeljoke
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 15.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2013, 22:16     Titel:
  Antworten mit Zitat      
Ja, ich glaube wir reden aneinander vorbei. ^^

Mir geht es darum. Wenn der Pushbutton gedrückt wird, dann wird aus dem dropdown menu der ausgewählte Fall ausgelesen. Je nach Fall soll dann eine Matrix ausgewählt werden.

Code:

einspannung.cell = get(handles.einspannung,'String');
einspannung.value = get(handles.einspannung, 'Value');
einspannung.string = sprintf('%s', einspannung.cell{einspannung.value});

if (1 == strcmp(einspannung.string,'keine Einspannung'))
    X=[q*l/2-q.*x; q*l/2.*x-q.*x.^2/2; 1/(E*I*10^-4)*(q.*x.^4/24-q*l/12.*x.^3+q*l^3/24.*x)];
 
elseif (1 == strcmp(einspannung.string,'rechts Einspannung'))
    X=[3*q*l/8-q.*x; 3*q*l/8.*x-q.*x.^2/2; 1/(E*I*10^-4)*(q.*x.^4/24-q*l/16.*x.^3+q*l^3/48.*x)];

else
    X=[q*l/2-q.*x; -q*l^2/12+q*l/2.*x-q.*x.^2/2; 1/(E*I*10^-4)*(q.*x.^4/24-q*l/12.*x.^3+q*l^2/24.*x.^2)];
   
end  
 


mit diesen Matrizen kann ich dann in einem weiteren Schritt etwas plotten.
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 18.09.2013, 22:18     Titel:
  Antworten mit Zitat      
Ja gut, dann seh ich das Problem nicht Very Happy
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Semmeljoke
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 15.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.09.2013, 19:25     Titel:
  Antworten mit Zitat      
Habe eine Lösung von meinem Problem.

Um das ausgewählte Element des dropdown Menü auszulesen muss man ganz einfach

Code:
str = get(handles.einspannung, 'String');
val = get(handles.einspannung, 'Value');

switch str{val};
    case 'keine Einspannung'
        X=[q*l/2-q.*x; q*l/2.*x-q.*x.^2/2; 1/(E*I*10^-4)*(q.*x.^4/24-q*l/12.*x.^3+q*l^3/24.*x)];
    case 'rechts Einspannung'
        X=[3*q*l/8-q.*x; 3*q*l/8.*x-q.*x.^2/2; 1/(E*I*10^-4)*(q.*x.^4/24-q*l/16.*x.^3+q*l^3/48.*x)];
    otherwise
        X=[q*l/2-q.*x; -q*l^2/12+q*l/2.*x-q.*x.^2/2; 1/(E*I*10^-4)*(q.*x.^4/24-q*l/12.*x.^3+q*l^2/24.*x.^2)];
end
 


schreiben und dann kann man auch gleich die richtige Matrix benutzen.

Was noch recht seltsam war, war dass beim Vergleich des Ausgelesenen mit z.B.: 'keine Einspannung' Matlab entschieden hat einen Zeilenumbruch einzufügen. Aus diesem Grund war natürlich nie eine Übereinstimmung gegeben und es wurde immer nur otherwise geplotet.

Habe dann einfach beim zugehörigen dorpdown Menü

Code:
set(hObject,'String',{'keine Einspannung';'rechts Einspannung';'beidseitige Einspannung'});


manuell noch einmal bestimmt.
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 - 2025 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.