|
|
xlim nach jedem Klick im Zoom-Modus abfragen |
|
LarsVegas |

Forum-Anfänger
|
 |
Beiträge: 21
|
 |
|
 |
Anmeldedatum: 12.07.13
|
 |
|
 |
Wohnort: Almería
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 13:06
Titel: xlim nach jedem Klick im Zoom-Modus abfragen
|
 |
|
 |
|
Hallo zusammen,
ich bin gerade dabei Daten zu plotten, genauer gesagt habe ich axes in eine mit GUIDE erstellte GUI eingefügt (deshalb bin ich auch nicht ganz sicher, ob diese Frage eher in den GUI-Bereich gehört). Die Funktion zoom wird per Klick auf einen push button aufgerufen, danach funktioniert dann ja eigentlich alles genauso wie beim normalen Plotten.
Nun zum eigentlichen Problem: Wie schaffe ich es, nach jedem vom Benutzer ausgeführten Mausklick im Zoom-Modus die aktuellen X-Achsen-Limits abzufragen? Klar, mit get(gca,'xlim') erhalte ich die gewünschten Werte, allerdings muss dieser Befehl ja erstmal aufgerufen werden und ich möchte die Werte ja nicht nur dann abfragen, wenn der Zoom-Modus beendet wird, sondern jedes Mal wenn der User klickt und die Grafik weiter vergrößert.
Oftmals nähert man sich ja erst mit mehreren Klicks dem gewünschten Bereich an, ich brauche allerdings die Werte nach jedem einzelnen Zwischenschritt.
Könnt ihr mir vielleicht helfen?
Grüße
Lars
|
|
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 13:48
Titel: Re: xlim nach jedem Klick im Zoom-Modus abfragen
|
 |
Hallo LarsVegas,
Du kannst Callbacks and die Zoom-Funktion anhängen, siehe "Zoom Mode Callbacks" unter "doc zoom" oder auf http://www.mathworks.com/help/matlab/ref/zoom.html .
Es ist sehr sehr oft hilfreich bei Fragen zu einem bestimmten Befehl, die entsprechende Dokumentation durchzulesen. Auch in den "See also"-Hinweisen findet man oft hilfreiches, wenn der Befehl doch nicht ganz genau passt.
Gruß, Jan
|
|
|
LarsVegas |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 21
|
 |
|
 |
Anmeldedatum: 12.07.13
|
 |
|
 |
Wohnort: Almería
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 14:45
Titel:
|
 |
Hallo Jan,
die Hilfe habe ich natürlich angeschaut bevor ich hier gepostet habe und auch sonst habe ich das Internet nach einer Lösung durchforstet, allerdings nichts Brauchbares finden können. Zugegebenermaßen lag die Lösung wohl die ganze Zeit vor meiner Nase (in den Beispielen hätte ich es finden sollen). Danke, dass du mich trotzdem darauf gestoßen hast!
ABER: Ich kann immer noch nicht so damit umgehen, dass ich es für meine Zwecke verwenden kann. Will ich die neuen x-Limits nicht als Message ausgeben, sondern anschließend in der Hauptfunktion verwenden, muss ich diese ja irgendwie zurückgeben, allerdings verweigert sich set(...) da ein bisschen:
So funktioniert es jedenfalls nicht! Übersehe ich wieder das Offensichtliche?
Grüße
Lars
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 15:12
Titel:
|
 |
Hallo LarsVegas,
Was bedeutet "so funktioniert es nicht" genau? Es lohnt sich immer die vollständige Fehlermeldung, bzw. den Unterschied zwischen Erwartungen und Ergebnissen genau zu erklären.
Callbacks haben keinen Output, wohin sollte er auch weitergereicht werden? Was bedeutet dann "anschließend in der Hauptfunktion verwenden"? Die Hauptfunktion läuft wahrscheinlich gar nicht, wenn der Zoom-Callback ausgelöst wird. Dann müsste man also einen Aufruf der Hauptfunktion (was immer das genau auch ist) in den Callback einfügen.
Gruß, Jan
|
|
|
LarsVegas |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 21
|
 |
|
 |
Anmeldedatum: 12.07.13
|
 |
|
 |
Wohnort: Almería
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 15:42
Titel:
|
 |
|
 |
|
Also ich werde mal versuchen systematisch die von dir genannten Punkte zu beantworten:
"Funktioniert nicht" bedeutet, dass ich die folgende Error-Meldung erhalte:
One or more output arguments not assigned during call to "set".
Error in TestFile1 (line 11)
newLim = set(h,'ActionPostCallback',@mypostcallback);
Da ich ja das Minimalbeispiel gepostet hatte, dachte ich, dass diese Fehlermeldung einfach reproduzierbar sei und habe sie deshalb nicht auch noch aufgeführt. Nächstes Mal mache ich es besser.
Was ich erwartet habe? Nun ja, zumindest gehofft hatte ich, dass die post-callback-Funktion einen Output liefert, der dann von set(...) in newLim geschrieben wird. Ich verstehe deinen Einwand allerdings nicht: " wohin soll er auch weitergereicht werden". Er soll in den Parameter newLim geschrieben werden.
Zur Hauptfunktion: Die spätere Anwendung ist recht komplex, daher kann ich hier nicht alles posten, aber im Prinzip reicht es doch zu wissen, dass ich eine GUI erstellt habe, deren m-File ich hier als Hauptfunktion bezeichnet habe. Hier steht ein callback für einen push button welcher den Befehl zoom ausführt. An dieser Stelle würde ich dann gerne einsteigen und die aktuell im Graphen der GUI angezeigten x-Limits abfragen. Ich würde sie dann in die handles-Struktur schreiben. Aber eigentlich ist das ja gar nicht so wichtig, wichtig wäre nur zu wissen, wie ich in einer post-callback-Funktion berechnete Werte zurückgeben bzw. weitergeben kann, sodass sie dort zur Verfügung stehen, wo die post-callback-Funktion aufgerufen wird.
Ich hoffe nun wird mein Problem verständlicher?
|
|
|
LarsVegas |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 21
|
 |
|
 |
Anmeldedatum: 12.07.13
|
 |
|
 |
Wohnort: Almería
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 16:44
Titel:
|
 |
Ich denke, dass ich eine Lösung finden konnte:
In der m-File zu meiner GUI habe ich folgende callback-Funktion für einen eigens erstellten Zoom-Knopf:
In der Funktion actxlims mache ich dann Folgendes:
Ich denke so geht es. Wenn irgendwelche Gründe gegen diese Lösung sprechen, lasst es mich bitte wissen.
|
|
|
LarsVegas |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 21
|
 |
|
 |
Anmeldedatum: 12.07.13
|
 |
|
 |
Wohnort: Almería
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 17:12
Titel:
|
 |
Ich editiere meinen letzten Eintrag nun noch einmal, da bei mir einiges durcheinander gelaufen ist und ich daher, so glaube ich, wirres Zeug geschrieben habe. Neuer Versuch:
Knopfdrücken in GUI führt zu:
updatexlims sieht so aus:
Das nächste Problem: Wenn ich das so mache kommt folgende Meldung:
Warning: An error occurred during the mode callback.
> In uitools.uimode.fireActionPostCallback at 14
In C:\Program Files (x86)\MATLAB\R2012b\toolbox\matlab\graph2d\zoom.p>local2DButtonUpFcn at 1341
In hgfeval at 63
In uitools.uimode.modeWindowButtonUpFcn at 46
In uitools.uimode.setCallbackFcn>localModeWindowButtonUpFcn at 54
Damit kann ich leider nicht wirklich etwas anfangen...
Kann es sein, dass ich einen Fehler mache, wenn ich
benutze? Ich dachte, dass handles.figure1 das handle zu der eigentlichen GUI ist. Ist dem nicht so? Wie beziehe ich mich sonst auf das richtige figure handle? Ist verständlich was ich meine?
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 01.08.2013, 18:19
Titel:
|
 |
Hallo LarsVegas,
Aber hier ist "handles" ja gar nicht bekannt. Woher soll diese Variable denn kommen?
Du könntest sie z.B. beim Definieren des Callbacks mitgeben:
Dann würde sie als 3. Input-Argument in updatexlims erscheinen.
Gruß, Jan
|
|
|
LarsVegas |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 21
|
 |
|
 |
Anmeldedatum: 12.07.13
|
 |
|
 |
Wohnort: Almería
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 02.08.2013, 09:49
Titel:
|
 |
Guten Morgen Jan,
guter Einwand, leuchtet mir ein. Nun übergebe ich also die handles-Struktur der GUI an die Action-Post-Callback-Funktion, was auch super funktioniert. Dann füge ich ein Feld hinzu, was die aktuellen xlim-Werte enthält. Klappt alles. Aber ein entscheidender Schritt fehlt nun noch: Wie bekomme ich die in der Action-Post-Callback-Funktion aktualisierte handles-Struktur nun in die aufrufende Funktion, also meine zur GUI gehörende m-File, zurück? Rückgabewerte gibt es ja nicht.
|
|
|
LarsVegas |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 21
|
 |
|
 |
Anmeldedatum: 12.07.13
|
 |
|
 |
Wohnort: Almería
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 02.08.2013, 10:35
Titel:
|
 |
|
 |
|
Ich habe nun im Internet eine interessante Diskussion zu einem ähnlichen Problem gefunden und versucht, mich an die Lösung zu halten - allerdings mit wenig Erfolg! Vielleicht hast du diese Lösung sogar verfasst, Jan?
http://www.mathworks.com/matlabcent.....from-an-external-function
Ich zitiere mal die für mich interessanteste Stelle:
Zitat: |
Yes, of course, this is the expected behavior. Inside myFunction you update the handles struct and store it in the figure afterwards. Then after returned to Simulate_Callback, you use the local copy of handles with its value before calling myFunction() and overwrite the changes from inside this function. A suggestion for improvements:
And inside myFunction(hObject, handles) I do:
|
Der größte Unterschied zu meinem Problem sollte eigentlich sein, dass hier myFunction aus der openingfcn aufgerufen wird und bei mir nicht. So wie ich das verstehe, kann ich mich also nicht einfach auf hObject beziehen. Hier also mein Versuch:
und dann in der Action-Post-Callback-Funktion:
Es folgt aber wieder:
Warning: An error occurred during the mode callback.
> In uitools.uimode.fireActionPostCallback at 14
In C:\Program Files (x86)\MATLAB\R2012b\toolbox\matlab\graph2d\zoom.p>local2DButtonUpFcn at 1341
In hgfeval at 63
In uitools.uimode.modeWindowButtonUpFcn at 46
In uitools.uimode.setCallbackFcn>localModeWindowButtonUpFcn at 54
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 02.08.2013, 10:35
Titel:
|
 |
|
 |
|
Hallo LarsVegas,
Zitat: |
Wie bekomme ich die in der Action-Post-Callback-Funktion aktualisierte handles-Struktur nun in die aufrufende Funktion, also meine zur GUI gehörende m-File, zurück? Rückgabewerte gibt es ja nicht. |
Das geht ganz einfach, nämlich gar nicht. Man kann keine Daten an "ein M-file" liefern und auch eine Weitergabe an die entsprechende "Funktion" ist nichts was programmiertechnisch logisch wäre. Eine Funktion könnte ja auch nur dann etwas mit Daten anfangen, wenn sie läuft. Insofern hat auch ein Callbakc keine "aufrufende Funktion", es sei denn Du meinst den in Java laufenden Event-Disptach-Thread. Der weiß aber gar nichts über Deine Daten, sondern ist nur ein Schedular, der die Rechenzeit verteilt.
Also muss Du die Daten als Inputs an eine andere Funktion weiter geben, z.B. das M-file der GUI geeigent aufrufen. Praktisch ist es dabei, alle zu einer GUI gehörenden Daten im handles-Struct zu speichern:
Dabei ist ObjectH ein Handle irgendeines zum GUI gehörenden Grafik-Objekts, z.B. der Figure-Handle selbst. Der in den Inputs mitgelieferte "handles" struct hat den Wert, den er bei der Erstellung des Callbacks hatte. Der wird also nicht automatisch upgedated!
Damit hätte man also die geänderten Daten in den ApplicationData des GUIs gespeichert (siehe SourceCode: "edit guidata"). Nun muss der Zoom-Callback noch einen entsprechenden Callback des GUIs aufrufen, damit dies geeignet reagieren kann.
Eigentlich ist es ganz einfach, wenn man sie die Figures, Buttons, Zoom-Funktion als Personen vorstellt, die Nachrichten austauschen und bei bestimmten Events Callbacks ausführen. Wenn Herr Z.C. (Zoom Callback) neue Informationen hat, wird der Figure Chef diese nicht einfach an seine Mitarbeiter, die UI Controls, weitergeben. Er muss schon zunächst informiert werden. Er bekommt dann entweder die neuen Daten als Aktenorder (Input-Argumente von Z.C.), oder Z.C. hinterlegt sie im Postfach der Figure (ApplicationData per "guidata" Interface) und teilt Figure Chef mit, dass er mal seine Post erledigen soll.
Gruß, Jan
|
|
|
LarsVegas |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 21
|
 |
|
 |
Anmeldedatum: 12.07.13
|
 |
|
 |
Wohnort: Almería
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 02.08.2013, 11:13
Titel:
|
 |
Hi Jan,
danke für die anschauliche Beschreibung, so kann man sich das in der Tat besser vorstellen. Ich weiß nicht, ob du gesehen hast, dass wir zeitgleich gepostet haben. In meinem letzten Beitrag hatte ich, glaube ich, schon vieles von dem drin, was du nun auch erwähnt hast. Allerdings klappt es ja immer noch nicht. Ich denke für mich sind zwei Dinge Problematisch:
Zitat: |
Nun muss der Zoom-Callback noch einen entsprechenden Callback des GUIs aufrufen, damit dies geeignet reagieren kann. |
Was wäre denn hier der "entsprechende" Callback des GUIs? Wennn ich nun die GUI nochmal aufrufe, wird dann nicht ein zweites Fenster geöffnet?
Wie teile ich Figure Chef mit, "seine Post zu erledigen"?
Danke!
Grüße
Lars
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 02.08.2013, 15:46
Titel:
|
 |
Hallo LarsVegas,
Zitat: |
Wie teile ich Figure Chef mit, "seine Post zu erledigen"? |
Dafür benötigt das M-File eine entsprechende Unterfunktion. Während der Erstellung des GUIs kann man den Function-Handle speichern, am besten wenn man die Zoom-Funktion initialisiert:
Der Zoom-Callback kann dann den Handle der aufzurufenden Funktion wieder aus dem handles Struct auslesen und aufrufen. Leichter wäre es noch, wenn alle Unterfunktionen im gleichen M-File stehen, dann kann der Zoom-Callback direkt UpdateAfterZoom aufrufen.
Gruß, Jan
|
|
|
LarsVegas |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 21
|
 |
|
 |
Anmeldedatum: 12.07.13
|
 |
|
 |
Wohnort: Almería
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 05.08.2013, 14:40
Titel:
|
 |
Hallo Jan,
danke für deine hilfreichen Infos, die haben mich schon ein gutes Stück weiter gebracht!
Grüße
Lars
|
|
|
LarsVegas |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 21
|
 |
|
 |
Anmeldedatum: 12.07.13
|
 |
|
 |
Wohnort: Almería
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 12.08.2013, 09:41
Titel:
|
 |
Hallo Jan,
es hat sich beim Weiterarbeiten noch ein Folgeproblem ergeben, welches aber in sich geschlossen ist, sodass ich einen neuen Thread dafür eröffnet habe. Du hast mir so gut geholfen, vielleicht könntest du bei Gelegenheit da ja auch mal einen Blick drauf werfen?
Grüße
Lars
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|