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

Variablen aus einem gespeicherten figure auslesen

 

pait

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2010, 15:21     Titel: Variablen aus einem gespeicherten figure auslesen
  Antworten mit Zitat      
Hallo,

ich habe eine gespeicherte figure und möchte die Parameter nun mit einer eigenen GUI bearbeiten.
Ich lade eine *.fig datei dann wird ein plot geöffnet.
In dem plot hat man die möglichkeit durch klicken in den plot ein neues plot Fenster zu öffnen.
Wenn ich das mache wird die entsprechende Callback Funktion der "Hauptfunktion" mit der das Fenster erstellt wurde aufgerufen. In dieser Callback Funktion stehen nun die Variablen zur Verfügung die ich benötige, aber nur dort.

Gibt es eine Möglichkeit auf diese Variablen irgendwie zuzugreifen? Sie müssen ja in der *.fig datei mit gespeichert sein, Weil sie im 'base' Workspace nicht mehr existieren.

ps: Das Ziel ist die ursprüngliche Funktion so zu belassen wie sie ist. Deshalb kann ich dort nicht mit dem Callback arbeiten.

Schon einmal ein Danke für jede Hilfe.

grüße


pait

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2010, 12:15     Titel:
  Antworten mit Zitat      
Also ich bin einen kleinen Schritt weiter gekommen.
Unter dem Stichwort "nested functions".
Die Variablen sind quasi als lokale Variablen gespeichert.

Nur was ich noch nicht herausgefunden habe ist, ob ich von ausserhalb auf die internen Variablen zugreifen kann.
Ich komme an die handles und function_handles heran, aber nicht an die Variablen.
Hat da jmd vielleicht schon mal Erfahrung mit gesammelt?

Ich fürchte fast, dass ich da nicht ran komme.

grüße
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.08.2010, 12:33     Titel:
  Antworten mit Zitat      
Hallo,

Ich weiß nicht, wie du es meinst mit Variablen, sie werden doch nicht in Figure mit abgespeichert.

Du kannst aber auf die Werte der Plots zugreifen
behilflich wäre dazu FINDOBJ

Code:

h=figure
plot(1:10)

ph = findobj(h,'Type','line')
get(ph,'XData')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
pait

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2010, 13:07     Titel:
  Antworten mit Zitat      
Die Variablen werden im Workspace der Funtion gespeichert die die Figure erstellt hat.

Also z.B. stark vereinfacht:
Code:

function plot_data(data_in)
% erzeuge figure mit plot aus Daten

  set(gcf, 'WindowButtonUpFcn', @test_callback);

  function test_callback(hObject, eventdata)
    data2=data_in;
  end
end
 


Ich habe hier mal das drum herum weggelassen. Das wichtigste ist, dass wenn ich die erzeugte figure speichere und dann wieder lade, wird das Callback natürlich wieder ausgeführt und "data_in" steht wieder zur Verfügung. Nur kann ich auf die nicht von aussen zugreifen.

Danke für den Vorschlag aber leider hilft mir der Vorschlag von denny nicht weiter da "data_in" ein struct (mit jeder menge zusätzlicher Parameter) ist und die Daten die ich mit "get" bekomme reichen leider nicht aus.

Wie gesagt ich soll an der Funktion die die figure erzeugt nichts ändern und eine separate basteln, die die ursprünglichen parameter einlesen und gegebenenfalls abändern soll.
 
pait

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2010, 13:57     Titel:
  Antworten mit Zitat      
Also ich hätte da eine Idee.
Ich könnte das struct welches ich brauche mit SETAPPDATA speichern und dann könnte ich es mit GETAPPDATA extern aufrufen.

Ist es irgendwie möglich eine Funktion die in einem anderen m-File steht als nested function einer anderen Funktion (in einem anderen file) zu deklarieren?
Dann müsste das ganze Funktionieren

grüße
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.08.2010, 14:01     Titel:
  Antworten mit Zitat      
Hallo

Wie wird die Figure gespeichert?
Wie wird die gespeicherte Figure aufgemacht?

TEST_CALLBACK kennt nur deswegen data_in, weil es Unterfunktion von PLOT_DATA ist. Damit kommt gleich die Frage, woher kennt die PLOT_DATA data_in? Wie bekommt die Funktion die Daten aus abgespeicherten Figure?

Das musst unbedingt klären, weil mir scheint, dass mit Aufmachen der gespeicherter Figure betrügt euch selbst.
Denn es wurde Callback in Figure zwar abgespeichert, aber Callback liefert ja keine data_in, also muss es so sein dass data_in noch in Speicher vorhanden ist.

Versuch mal folgendes, öffne die abgespeicherte Figure in frisch gestartetem Matlab was passiert dann?

GUIDATA speichert ja temporär in Figure die Variablen.
Man kann mit HGSAVE diese auch mit in Figure abspeichern.
Und beim Nächsten Aufmachen von Figure auf diese zugreifen.
Code:

h= figure;

v.a = 10;
v.b= 10;
guidata(h,v);
hgsave(h,'mytest.fig');
delete(h);
clear v;
h2 = openfig('mytest.fig')
v= guidata(h2)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
pait

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2010, 14:42     Titel:
  Antworten mit Zitat      
Die Figure wurde über HGSAVE gespeichert und über OPENFIG wieder geöffnet.
Ich hatte Rechner schon neugestartet und nach dem neustart und laden der Figure blieben die Variablen im Callback zugänglich.

Zitat:
TEST_CALLBACK kennt nur deswegen data_in, weil es Unterfunktion von PLOT_DATA ist. Damit kommt gleich die Frage, woher kennt die PLOT_DATA data_in? Wie bekommt die Funktion die Daten aus abgespeicherten Figure?

Genau das ist die Frage. Das versteh ich auch nicht so ganz, weil ich dazu auch noch nichts auf den einschlägigen Matlab Seiten gefunden habe.

Hier mal die genaue Zeile wie das Callback eingebunden ist.
Code:
set(gcf, 'WindowButtonMotionFcn', {@ft_select_channel, 'multiple', true, 'callback', {@select_singleplotER, cfg, varargin{:}}, 'event', 'WindowButtonMotionFcn'});


select_singleplotER ist die Callback-Funktion ft_select_channel ist eine externe Funktion. Allerdings wird nur die select_singleplotER als Callback ausgeführt.
Die Syntax habe ich noch nicht so wirklich durchschaut, aber nach denny' s letztem Post könnte es sein, dass dort die Variable cfg an das Callback übergeben wird?
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.08.2010, 11:49     Titel:
  Antworten mit Zitat      
Hallo

Der Syntax ist der Tat, etwas komplex, aber sehr ausgefeilt.
Externer Funktion ft_select_channel einfach Callback select_singleplotER übergeben. Da spart man sich FEVAL.

Und cfg könnte wirklich eine feste Variable sein, welche ihren Wert durch Callback nicht verändert. Ich meine jedes Mal, wenn cfg=5, dann wird bei jedem auslösen des Callback cfg =5 sein.

Wir in Funktionen GUIDATA verwendet, dann kannst du doch auch in deiner Funktion nutzen
Private Nachricht senden Benutzer-Profile anzeigen
 
pait

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2010, 13:10     Titel:
  Antworten mit Zitat      
GUIDATA wird für diese Variable leider nicht verwendet. Sie wird lediglich an das Callback weiter gereicht.

Gibt es nicht eine Möglichkeit das Callback "umzuleiten". Das anstatt dem original Callback meine Funktion ausgeführt wird?.
Wenn ich mir mit get die Eigenschaften der Figure ansehe gibt es dort Felder für die entsprechenden Aktionen. Also z.B. WindowButtonDownFcn
Nun kann ich dort auch eine neue Funktion hineinschreiben, die auch aufgerufen wird. Nun steht mir dort allerdings wieder nicht die Variable zur Verfügung.
So langsam glaub ich, dass das nichts wird so wie ich mir das vorgestellt hab.

grüße
 
pait

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2010, 13:30     Titel:
  Antworten mit Zitat      
Juhu!

Ich hab's gefunden!

wie im letzten Post beschrieben kann ich mir die properties ansehen und dort (stark verschachtelt) ist dann auch die Variable, die ich benötige enthalten. (Weil sie mit an das Callback übergeben wurde.)

Ich danke dir für deine Hilfe!

grüße
 
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.