Verfasst am: 25.02.2009, 18:50
Titel: Rückgabe bei Callbacks
Hallo GUI-Profis!
Ich beschäftige mich erst seit gut einer Woche mit der Erstellung grafischer Benutzeroberflächen in Matlab und habe ein mittelschweres Problem, das mir schon seit drei Tagen Kopfschmerzen bereitet.
Ich habe eine Structure, in der neben hier weniger interessanten Parametern Messwerte und dazugehörige Interpolationen gespeichert sind. Diese möchte ich grafisch darstellen, dem Anwender danach aber auch noch die Gelegenheit geben, einige Interpolationsparameter zu ändern, die Auswirkungen auf die Daten auch grafisch darzustellen und diese Änderungen in der Structure zu speichern.
Dazu habe ich mir folgenden Code überlegt (gekürzt und schemenhaft):
% Plotten der Glättungskurven for indy = 1:size(yGlaet,1) plot(tGlaet,yGlaet(indy,:),'--','LineWidth',0.7,'Tag','GlaetDaten') grid on;
box on;
hold on;
end
% Plotten der Messdaten for indy = 1:size(y,1) plot(tNutz,yNutz,'*','Tag','MessDaten') end
% Erstellen der Menüs zur Bearbeitung der Plots
handle = gca;
for indy = 1:size(y,1)
MenuNeu = uicontextmenu;
% Initialisierung und Ermittlung von Versuch und Messgröße
mess_out = mess;
fig = get(h_ax,'Parent');
Zeile = str2num(get(h_ax,'Tag'));
% Ermittlung der Messpunkte und der Zeit tGlaet
h_MessDaten = findobj(h_ax,'Tag','MessDaten');
h_GlaetDaten = findobj(h_ax,'Tag','GlaetDaten');
t = get(h_MessDaten,'XData'); y = get(h_MessDaten,'YData');
tGlaet = get(h_GlaetDaten,'XData');
% Berechnung der neuen Werte
Werte = berechnung(blubs,die,boing);
% Überschreiben der alten Werte
mess_out(fig).Glaettungswerte = Werte(:,1)';
mess_out(fig).Ableitungen1 = Werte(:,2)';
mess_out(fig).Ableitungen2 = Werte(:,3)';
mess_out(fig).yGlaetParameter.P(Zeile) = P;
% Grafische Darstellung der neuen Werte set(h_GlaetDaten,'YData',Werte(:,1))
% Veränderung der Häkchen im Kontextmenü
menu_items = get(get(obj,'Parent'),'Children');
set(menu_items,'Checked','off');
set(obj,'Checked','on');
Dies führt nun allerdings zu zwei Ungereimtheiten:
1) Ich kann insgesamt nur einmal interagieren und der Graph ändert sich. Danach kann ich zwar neue Parameter auswählen und die Kreuze werden auch geändert, nur wird der set-Befehl nicht mehr ausgeführt.
2) Die Übergabe der neuen Werte funktioniert auch nicht.
Kann mir jemand helfen. Ich bin ihm dafür sehr dankbar.
Die while-Schleife am Schluss soll nun dafür sorgen, dass die Funktion so lange ausgeführt werden soll, wie mindestens eine Figure geöffnet ist.
Was genau ist sinn dieser Schleife, welche Funktion soll ausgeführt werden?
Ansonsten poste einfach ein Beispiel, welches ausführbar ist und das fehlerhafte Verhalten zeigt - dann kann man selbst ein bisschen rumspielen, was oftmals schneller zum Ziel führt, als immer Vorschläge zu machen und auf die Antwort zu warten...
zum Sinn der while-Schleife: Das Programm gibt mir die figures aus und erstellt dann die dazugehörigen Menüs. Danach springt er aber gleich wieder auf die Matlab-Ebene. Nun sollen aber nachträgliche Änderungen in der Structure aber übernommen werden, er muss sich also noch die Variablen aus dem Funktionsspeicher merken, solange noch irgendeine figure geöffnet ist. Dazu die while-Schleife.
Einerlei. Hier mal ein kleines ausführbares Beispiel, das äquivalent zu meinem Problem ist.
% Initialisierung und Ermittlung von Versuch und Messgröße
mess_out = mess;
% Ermittlung der Messpunkte und der Zeit tGlaet
h_MessDaten = findobj(h_ax,'Tag','MessDaten');
h_InterDaten = findobj(h_ax,'Tag','InterDaten');
t = get(h_MessDaten,'XData'); y = get(h_MessDaten,'YData');
tneu = get(h_InterDaten,'XData');
% Berechnung der neuen Werte
polyGrad = str2num(P);
polyKoeff = polyfit(t,y,polyGrad);
yneu = polyval(polyKoeff,tneu);
% Überschreiben der alten Werte
mess_out.PolyGrad = polyGrad;
mess_out.yneu = yneu;
% Grafische Darstellung der neuen Werte set(h_InterDaten,'YData',yneu)
% Veränderung der Häkchen im Kontextmenü
menu_items = get(get(obj,'Parent'),'Children');
set(menu_items,'Checked','off');
set(obj,'Checked','on');
Mit der grafischen Bearbeitung funktioniert alles einwandfrei, aber die Änderungen werden nicht gespeichert. Ich hoffe, die mir fehlende zündende Idee kommt.
Liebe Grüße an meine Unistadt Magdeburg,
Sebastian
Ich habe gestern doch noch einen Durchbruch erlebt und mein Programm macht jetzt, was ich von ihm verlange. Vielleicht ist meine Lösung nicht sonderlich elegant, aber es funktioniert. Sollte jemand trotzdem etwas einfacheres Funktionstüchtiges vorschlagen, würde ich mich natürlich freuen.
hier nun meine Funktion, das Skript (test_intro) bleibt gleich.
% Initialisierung und Ermittlung von Versuch und Messgröße
mess_out = mess;
fig = ancestor(obj,'figure');
h_ax = findobj(fig,'Type','axes');
% Ermittlung der Messpunkte und der Zeit tGlaet
h_MessDaten = findobj(h_ax,'Tag','MessDaten');
h_InterDaten = findobj(h_ax,'Tag','InterDaten');
t = get(h_MessDaten,'XData'); y = get(h_MessDaten,'YData');
tneu = get(h_InterDaten,'XData');
% Berechnung der neuen Werte
polyKoeff = polyfit(t,y,P);
yneu = polyval(polyKoeff,tneu);
% Überschreiben der alten Werte
mess_out.polyGrad = P;
mess_out.yneu = yneu;
% Grafische Darstellung der neuen Werte set(h_InterDaten,'YData',yneu)
% Veränderung der Häkchen im Kontextmenü
menu_items = get(get(obj,'Parent'),'Children');
set(menu_items,'Checked','off');
set(obj,'Checked','on');
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
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.