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

Rückgabe bei Callbacks

 

hoederer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2009, 19:50     Titel: Rückgabe bei Callbacks
  Antworten mit Zitat      
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):
Code:

function messPlot = glaetPlot(mess)

% mehrere Versuchsreihen
for indVersuch = 1:size(mess,2)
    messAkt = mess(indVersuch);
    yGlaet = messAkt.Glaettungswerte;
    y = messAkt.y;
    tGlaet = messAkt.tGlaet;
       
    figure
    fig(indVersuch) = gcf;
    hold on;
    grid on;
   
%     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;
       
        DatenMenu = uimenu(MenuNeu,'Tag','DatenMenu',...
            'Label','Datenvorverarbeitung');
       
%         Polynomgrad
        PolyMenu = uimenu(DatenMenu,'Tag','PolyMenu',...
            'Label','Polynomgrad der Wichtung');
       
        PolyGrad = .5:.5:3;
        on_off_str = {'off','on'};
        for i = 1:length(PolyGrad)
            PolyGradWahl = ...
                isequal(mess(gcf).yGlaetParameter.P(indy),PolyGrad(i));
            uimenu(PolyMenu,'Tag',['P = ' num2str(PolyGrad(i))],...
                'Checked',on_off_str{1+PolyGradWahl},...
                'Label',num2str(PolyGrad(i)),...
                'Callback',{@poly_cb,mess,gca,num2str(PolyGrad(i))});
        end        
    end
    set(handle, 'UIContextMenu', MenuNeu);
end
while any(ishandle(fig))
    pause(1)
end
messPlot = mess;
 


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.

Meine Callback-Funktion sieht dabei folgendermaßen aus:
Code:

function mess_out = poly_cb(obj,data,mess,h_ax,P)

% 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.

Liebe Grüße,
Sebastian


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 26.02.2009, 09:38     Titel:
  Antworten mit Zitat      
Moin,

hoederer hat Folgendes geschrieben:
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...

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
hoederer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2009, 10:53     Titel:
  Antworten mit Zitat      
Hallo Alex,

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.

Code:

% test_intro

clear, close all, clc

mess.t = 0:2:20;
mess.y = rand(1,11);

mess.tneu = 0:.5:20;
mess.polyGrad = 1;
polyKoeff = polyfit(mess.t,mess.y,mess.polyGrad);
mess.yneu = polyval(polyKoeff,mess.tneu);

messtest = testPlot(mess);
 


und dazu die Funktionen:
Code:

function messPlot = testPlot(mess)

figure
fig = gcf;

h(1) = line('XData',mess.t,'YData',mess.y,...
    'LineStyle','x','Tag','MessDaten');
h(2) = line('XData',mess.tneu,'YData',mess.yneu,'Tag','InterDaten');
grid on;

handle = gca;
MenuNeu = uicontextmenu;

PolyMenu = uimenu(MenuNeu,'Tag','PolyMenu','Label','Polynomgrad der Wichtung');

PolyGrad = 1:5;
on_off_str = {'off','on'};
for i = 1:length(PolyGrad)
    PolyGradWahl = ...
        isequal(mess.polyGrad,PolyGrad(i));
    uimenu(PolyMenu,'Tag',['P = ' num2str(PolyGrad(i))],...
        'Checked',on_off_str{1+PolyGradWahl},...
        'Label',num2str(PolyGrad(i)),...
        'Callback',{@poly_cb,mess,gca,num2str(PolyGrad(i))});
end
set(handle,'UIContextMenu',MenuNeu)
while ishandle(fig)
    pause(1)
end
messPlot = mess;

function mess_out = poly_cb(obj,data,mess,h_ax,P)

% 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
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 26.02.2009, 11:19     Titel:
  Antworten mit Zitat      
Ich bekomme bei mir allerdings kein ContextMenu, wo ich was verändern könnte...

test.jpg
 Beschreibung:
Nur ein plot ohne Eingabe-Möglichkeiten...

Download
 Dateiname:  test.jpg
 Dateigröße:  30.69 KB
 Heruntergeladen:  594 mal

_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2009, 11:27     Titel:
  Antworten mit Zitat      
Komisch, bei mir schon, wenn ich mit der rechten Maustaste in die Grafik gehe.
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 26.02.2009, 11:29     Titel:
  Antworten mit Zitat      
So viel zum Thema "Was ist ein ContextMenu?!" Embarassed
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
hoederer

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2009, 10:44     Titel: Eine Lösung
  Antworten mit Zitat      
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.

Code:

function messPlot = testPlot(varargin)

if isstruct(varargin{1})
    mess = varargin{1};
    assignin('base','temp',mess);
   
    figure
    fig = gcf;

    h(1) = line('XData',mess.t,'YData',mess.y,...
        'LineStyle','x','Tag','MessDaten');
    h(2) = line('XData',mess.tneu,'YData',mess.yneu,'Tag','InterDaten');
    grid on;

    handle = gca;
    MenuNeu = uicontextmenu;

    PolyMenu = uimenu(MenuNeu,'Tag','PolyMenu','Label','Polynomgrad der Wichtung');

    PolyGrad = 1:5;
    on_off_str = {'off','on'};
    for i = 1:length(PolyGrad)
        PolyGradWahl = ...
            isequal(mess.polyGrad,PolyGrad(i));
        uimenu(PolyMenu,'Tag',['P = ' num2str(PolyGrad(i))],...
            'Checked',on_off_str{1+PolyGradWahl},...
            'Label',num2str(PolyGrad(i)),...
            'Callback',[mfilename '(''poly_cb'',temp,gcbo,' ...
            num2str(PolyGrad(i)) ')']);
    end
    set(handle,'UIContextMenu',MenuNeu)
    while ishandle(fig)
        pause(1)
    end
    messPlot = evalin('base','temp');
else
    fun_h = eval(['@' varargin{1} ';']);
    messPlot = feval(fun_h,varargin{2:end});
    assignin('base','temp',messPlot);
end

function mess_out = poly_cb(mess,obj,P)

% 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');
 


Liebe Grüße,
Sebastian
 
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.