|
cheepy |
Forum-Anfänger
|
|
Beiträge: 36
|
|
|
|
Anmeldedatum: 16.02.10
|
|
|
|
Wohnort: Emden
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 31.01.2011, 09:19
Titel: PNG Über axes darstellen
|
|
|
|
|
Hallo,
ich hänge schon seit paar Tagen an mein Problem und hoffe dass ihr mir weiter helfen könnt. Ich beschäftige mich momentan mit GUI-Programmierung und kenne mich noch nicht so gut damit aus. Also ich habe folgendes Szenario: Es soll ein Bild in axes angezeigt werden, weiterhin soll das Bild immer wieder bei bestimmten Ereignissen ausgetauscht werden.
Über StartFcn rufe ich folgendes auf, damit ich meine GUI ständig aktualisieren kann und meine Outports in GUI darstellen kann:
In updategui.m wird der das Ereignis abgefragt und dementsprechend wird das Bild ausgetauscht.
Bei diese IF-Abfrage bekomme ich folgende Fehler:
??? Error using ==> axes
Invalid object handle
Error in ==> updategui at 24
axes(statestxt_axes2);
Weitere IF-Abfrage zum austausch des Bildes
Bei zweite IF-Abfrage bekomme ich folgende Fehlermeldung
Warning: Error occurred while evaluating listener callback.
??? Error using ==> axes
Invalid object handle
Error in ==> updategui at 34
axes(statestxt_axes2);
Beide Bilder werden nicht angezeigt.
Ich bin für jede Rückmeldung sehr dankbar.
Lieben Gruß, Shanna
|
|
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 31.01.2011, 12:49
Titel: Re: PNG Über axes darstellen
|
|
Hallo cheepy,
Da sind eine Menge Fehler in Deinem Code. Ich kann nicht nachvollziehen, ob es nur Tippfehler von Abschreiben ins Forum sind.
Zitat: |
Bei diese IF-Abfrage bekomme ich folgende Fehler:
??? Error using ==> axes
Invalid object handle
Error in ==> updategui at 24
axes(statestxt_axes2); |
NUn, die Fehlermeldung ist ja eindeutig: Das Objekt mit dem Handle in statestxt_axes2 ist kein AXES Objekt. Wie hast Du den entrpechenden HAndle denn erzeugt? Nutze doch mal den Debugger:
Und lasse Dir dann z.B. per "get(statestxt_axes2)" anzeigen, auf welches Objekt der Handle überhaupt zeigt.
Gruß, Jan
|
|
|
cheepy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 36
|
|
|
|
Anmeldedatum: 16.02.10
|
|
|
|
Wohnort: Emden
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 31.01.2011, 16:22
Titel:
|
|
Ja das ist Tippfehler.
Vielen danke erstmal für schnelle Reaktion.
Ich habe den Debbuger ausprobiert und habe das Verhalten dabei beobachtet. Mir ist aufgefallen, dass beim ersten Durchlauf mit dem Befehl get(statestxt_axes2) bekomme ich eine Ausgabe mit allen Informationen, auch das Bild wird erstellt und kein Fehler. Ab den zweiten Durchlaufe(ein Durchschauf ist 1 Simulationszeit), kommt der Compiler bis zu stelle axes(statestxt_axes2) und gibt Fehlermeldung (siehe oben) aus. Könnte evtl sein, dass ich den Fehler bekomme, weil ich den axes schon was zugewiesen habe und weise dem beim zweiten Durchlaufe noch mal? Wenn ja wie kann ich es anderes lösen?
Das Programm habe ich einwenig modifiziert und habe folgendes raus:
In der m-datei, in welche GUI implementiert ist, habe ich folgendes stehen:
Eigentlich dachte ich, dass es vollkommen ausreicht mit dem befehl axes(statestxt_axes2); axes aufzurufen. Oder? Muss ich was anderes erzeugen?[/code]
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 31.01.2011, 21:57
Titel:
|
|
Hallo cheepy,
Zitat: |
Könnte evtl sein, dass ich den Fehler bekomme, weil ich den axes schon was zugewiesen habe und weise dem beim zweiten Durchlaufe noch mal? |
Nein, das kann nicht sein. Die Fehlermeldung sagt eindeutig, dass statestxt_axes2 beim fehlerhaften Aufruf kein AXES Handle ist. Also hast Du irgendwo die Variable statestxt_axes2 überschrieben. Bitte lasse Dir den Wert dieser Variablen anzeigen und auf welches Objekt dieser Handle zeigt.
Gruß, Jan
|
|
|
denny |
Supporter
|
|
Beiträge: 3.853
|
|
|
|
Anmeldedatum: 14.02.08
|
|
|
|
Wohnort: Ulm
|
|
|
|
Version: R2012b
|
|
|
|
|
|
Verfasst am: 01.02.2011, 01:01
Titel:
|
|
Hallo, wie hast du denn deine AXES erstellt? Über GUIDE?
Jedenfalls findet FINDOBJ keine AXES mit diesem Tag und liefert Leeres Array zurück
|
|
|
cheepy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 36
|
|
|
|
Anmeldedatum: 16.02.10
|
|
|
|
Wohnort: Emden
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 04.02.2011, 15:37
Titel:
|
|
Hallo,
ja ich habe über GUIDE mein axes erstellt. Aber wenn ich mir das ausgeben lasse, dann bekomme ich schon ein Wert.
statestxt_axes2 =
6.3380e+003
Ist das nicht richtig? Ich kenne mich leider noch nicht so gut aus und bin neu in der Thematik.
Also ich habe jetzt einwenig modifiziert und rufe nur einmal auf:
Problem ist, dass ich beim nächsten durchlaufe aktualisiere mit den neuen Bild in selben axes:
Und das funktioniert nicht bzw. es wird in falschen figure angezeigt. Mein Problem ist, dass ich den noch sagen muss, in welchen axes soll das Bild aktualisiert werden.
Wie kann ich den bestimmten axes neues Bild zuweisen?
Lieben Gruß, Cheepy
[/code][/code]
|
|
|
cheepy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 36
|
|
|
|
Anmeldedatum: 16.02.10
|
|
|
|
Wohnort: Emden
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 04.02.2011, 17:12
Titel:
|
|
Tatsächlich, wenn ich zweites Mal die Funktion aufrufe, bekomme ich leere Matrix
Hat jemand eine Idee, wie ich mein Problem lösen kann? Sitze schon ne weile dran und habe immer noch kein Ergebnis.
|
|
|
Sco |
Forum-Meister
|
|
Beiträge: 699
|
|
|
|
Anmeldedatum: 15.08.10
|
|
|
|
Wohnort: Dundee
|
|
|
|
Version: 2008a, 2010a
|
|
|
|
|
|
Verfasst am: 04.02.2011, 17:25
Titel:
|
|
Hallo,
ich denke ohne den gesamten Code zu kennen wird dir wohl keiner helfen koennen. Woher sollen wir denn Wissen was du alles so mit dem axes-Tag waehrend deines Prohrammablaufes anstellst?
Wenn das Program keine 1000de Zeilen hat, dann haeng doch einfach mal deine fig-file + mat-file an einen Post dran. Hoffentlich wird es dann klarer.
MFG
Sco
|
|
|
cheepy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 36
|
|
|
|
Anmeldedatum: 16.02.10
|
|
|
|
Wohnort: Emden
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 04.02.2011, 18:18
Titel:
|
|
|
|
|
Ja das ist viel zu groß und viel zuviel. Ich versuche den Sachverhalt noch mal zu beschreiben und füge meine Funktion, wo ich mit axes arbeite.
Ich habe ein Simulink-Modell, von den ich meine Ergebnisse lese und in meine GUI über die Funktion updategui-Funktion aktualisiere. In Simulink habe ich eine Callbacks StartFcn, in der ich meine Funktion updategui aufrufe. In der updategui werden meine Ergebnisse in der GUI aktualisiert, sobald neuer Wert kommt. Dort rufe ich auch meine axes auf, in welche meine Bilder aingefügt werden sollen.
Im Anhang ist die updategui-Funktion. Ich möchte wenn count 0 ist, das bild on.png einfügen. Wenn count 1 ist dann off.png. Wenn aber später count wieder auf 0 wechselt, soll wieder on.png in axes eingefügt werden.
Ich hoffe, es ist einigermaßen verständlich.
Beschreibung: |
|
Download |
Dateiname: |
gui_screen.png |
Dateigröße: |
12.74 KB |
Heruntergeladen: |
540 mal |
Beschreibung: |
Datei aktualiert GUI, sobald ein Wert in Simulink sein Zustand verändert hat. |
|
Download |
Dateiname: |
updategui.m |
Dateigröße: |
1.1 KB |
Heruntergeladen: |
390 mal |
|
|
|
Sco |
Forum-Meister
|
|
Beiträge: 699
|
|
|
|
Anmeldedatum: 15.08.10
|
|
|
|
Wohnort: Dundee
|
|
|
|
Version: 2008a, 2010a
|
|
|
|
|
|
Verfasst am: 04.02.2011, 19:41
Titel:
|
|
Hallo,
...aber ich dachte du hasst 2 Axes und willst dort irgendwie wechseln, weil in deinem Beispiel ist ja nur eine Axes (Tag:axes2) vorhanden? Ich kann dir leider nicht sagen woran es liegt, aber bei:
suchst du ja nicht das axes-handle und machst deine "axes2" zur aktuellen axis:
Ansonsten, was bekommst du denn raus wenn du:
ausfuehrst (z.B. fuer die ersten 5 Durchgaenge)?
MFG
Sco
|
|
|
cheepy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 36
|
|
|
|
Anmeldedatum: 16.02.10
|
|
|
|
Wohnort: Emden
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 04.02.2011, 20:39
Titel:
|
|
|
|
|
Als erste vielen Dank für die Rückmeldung und Unterstützung.
Ich habe eine axes (axes2), die im Bild (GUIDE-Editor) zu sehen ist, dort möchte ich in Abhängigkeit des Zustandes von Variable str_people_count Bilder abwechseln anzeigen. Wenn die Variable den Zustand 1 hat, bzw. den Wert 1, dann soll off.png geladen werden, wenn die Variable den Zustand 0 hat, soll on.png Bild anzeigen. Das Ganze soll in eine und der selbst axes (axes2) ausgegeben werden.
Parallel dazu, gebe ich ein Video aus dem Simulink im Video Viewer aus. Hier ist das Problem, das die Bilder on.png und off.png durch folgendem Ausdruck vermutlich in falschen Fenster angezeigt werde.
Ich denke, dass ich dem sagen soll, in welchen axes soll mein Bild angezeigt werden. Momentan ist das so, er holt sich einen axes, die grade aktive ist und weist somit nicht, da der(Compiler) nicht weist in welche axes soll das Bild ausgegeben werden. Das merke ich, wenn ich mit der Maus auf Video Viewer klicke und da erscheint das Bild (onpng, off.png). Auch wenn ich während Simulation auf richtiges axes (also axes2) klicke, da wo tatsächlich erscheinen soll, wird durch die Maus sozusagen aktiviert und das richtige Bild wird angezeigt.
Jetzt ist die Frage, wie kann ich in einem und den selben axes, in diesem fall axes2, Bilder in Abhängigkeit des Zustandes der Variable str_people_count abwechseln anzeigen. Und wie kann ich dem richtige Axes zuweisen?
Durch Eingabe des get-Funktion in folgendem Ausdruck
bekomme ich in der erste IF-Abfrage(diese wird dierekt am Anfang ausgeführt, danach nicht mehr) folgendes:
ob_axes2_ =
200.0012
ActivePositionProperty = position
ALim = [0 1]
ALimMode = auto
AmbientLightColor = [1 1 1]
Box = off
CameraPosition = [0.5 0.5 9.16025]
CameraPositionMode = auto
CameraTarget = [0.5 0.5 0.5]
CameraTargetMode = auto
CameraUpVector = [0 1 0]
CameraUpVectorMode = auto
CameraViewAngle = [6.60861]
CameraViewAngleMode = auto
CLim = [0 1]
CLimMode = auto
Color = [1 1 1]
CurrentPoint = [ (2 by 3) double array]
ColorOrder = [ (7 by 3) double array]
DataAspectRatio = [1 1 1]
DataAspectRatioMode = auto
DrawMode = normal
FontAngle = normal
FontName = Helvetica
FontSize = [10]
FontUnits = points
FontWeight = normal
GridLineStyle = :
Layer = bottom
LineStyleOrder = -
LineWidth = [0.5]
MinorGridLineStyle = :
NextPlot = replace
OuterPosition = [56.878 2.21231 48.365 12.3877]
PlotBoxAspectRatio = [1 1 1]
PlotBoxAspectRatioMode = auto
Projection = orthographic
Position = [69.8 3.76923 26 9.76923]
TickLength = [0.01 0.025]
TickDir = in
TickDirMode = auto
TightInset = [4.4 1.30769 1 0.615385]
Title = [201.001]
Units = characters
View = [0 90]
XColor = [0 0 0]
XDir = normal
XGrid = off
XLabel = [202.001]
XAxisLocation = bottom
XLim = [0 1]
XLimMode = auto
XMinorGrid = off
XMinorTick = off
XScale = linear
XTick = [0 0.5 1]
XTickLabel =
0
0.5
1
XTickLabelMode = auto
XTickMode = auto
YColor = [0 0 0]
YDir = normal
YGrid = off
YLabel = [203.001]
YAxisLocation = left
YLim = [0 1]
YLimMode = auto
YMinorGrid = off
YMinorTick = off
YScale = linear
YTick = [0 0.5 1]
YTickLabel =
0
0.5
1
YTickLabelMode = auto
YTickMode = auto
ZColor = [0 0 0]
ZDir = normal
ZGrid = off
ZLabel = [204.001]
ZLim = [0 1]
ZLimMode = auto
ZMinorGrid = off
ZMinorTick = off
ZScale = linear
ZTick = [0 0.5 1]
ZTickLabel =
ZTickLabelMode = auto
ZTickMode = auto
BeingDeleted = off
ButtonDownFcn =
Children = [ (4 by 1) double array]
Clipping = on
CreateFcn = [ (1 by 1) function_handle array]
DeleteFcn =
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent = [199.001]
Selected = off
SelectionHighlight = on
Tag = axes2
Type = axes
UIContextMenu = []
UserData = []
Visible = off
Im nächsten Durchlauf muss der Compiler in die Zeile if (controll ~= 0) reinspringen und durch dem Aufruf get-Funktion erscheint ein Fehler:
??? Undefined function or variable "ob_axes2_".
Error in ==> updategui at 18
get(ob_axes2_)
das heißt, der kennt diese Variable nicht mehr. Weil die wahrscheinlich nicht mehr existiert.
PS: ob_axes2 musste ich in ob_axes2_ unbenennen, weil sonst Fehler wegen dem Namen.
|
|
|
cheepy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 36
|
|
|
|
Anmeldedatum: 16.02.10
|
|
|
|
Wohnort: Emden
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 07.02.2011, 15:03
Titel:
|
|
Hat jemand eine Idee, wie ich mein Problem lösen könnte?
|
|
|
Sco |
Forum-Meister
|
|
Beiträge: 699
|
|
|
|
Anmeldedatum: 15.08.10
|
|
|
|
Wohnort: Dundee
|
|
|
|
Version: 2008a, 2010a
|
|
|
|
|
|
Verfasst am: 07.02.2011, 15:28
Titel:
|
|
|
|
|
Hallo,
leider kann ich dir bei deinem speziellen Code nicht helfen. Ausserdem speicherst du Variablen aus Funktionen im Workspace (assignin), verwendest eval um sie wieder zu laden... all dies macht es sehr schwer es nachzuvollziehen und fast immer kann (und sollte) auf Befehle wie eval, assignin oder glabale Variablen verzichtet werden!
Ich habe dir ein Minimalbeispiel erstellt und angehaengt, welches 2 Bilder abwechselnd in einer Achses darstellt. Das musst du dann nur noch auf deinen Code ummuenzen.
Beachte im Code, dass Speichern der benoetigten Daten (Bilder,Colormaps, sowie dein controll) in der handles-Struktur anstatt sie ueber assignin, eval in und aus dem Workspace zu laden (in der Creation-function). Auch das Suchen des Axeshandles ist ueberfluessig, da du es einfach mit handles.axes1 ansprechen kannst.
MFG
Sco
Beschreibung: |
|
Download |
Dateiname: |
untitled1.m |
Dateigröße: |
3.62 KB |
Heruntergeladen: |
396 mal |
Beschreibung: |
|
Download |
Dateiname: |
untitled1.fig |
Dateigröße: |
4.34 KB |
Heruntergeladen: |
388 mal |
|
|
|
cheepy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 36
|
|
|
|
Anmeldedatum: 16.02.10
|
|
|
|
Wohnort: Emden
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 08.02.2011, 16:33
Titel:
|
|
|
|
|
Erstmal Vielen Dank! Ich habe versucht nach deinem Beispiel meine GUI umzusetzen, leider habe ich nach wie vor gleiches Problem. Es wird nicht in der richtige axes angezeigt.
Im Anhang habe ich ein Beispiel geladen, den ich mal gefunden habe und verwendetet demselben Konzept für meine GUI.
Im Prinzip gehts darum, dass die Bilder in Abhängigkeit der Werte aus Simulink angezeigt werden. Wenn im Fenster current State negativer Wert ist, wird clown geladen, wenn positive dann mandrill. Den Beispiel habe ich jetzt so ähnlich gemacht, wie mein System arbeitet.
Es gibt in diesem Beispiel zwei axes und mein Ziel ist, dass nur in axes1 Bilder angezeige. Wie kann ich in mein Programm zuweisen, dass nur in axes1 Bild angezeigt wird?
Control-Variable lade ich vor Simulation control=0. Ist noch nicht die schönste Lösung, muss noch anders ons Workspace geladen.
Habe schon alles ausprobiert, aber so langsam komme ich in Verzweifeln.
Beschreibung: |
update-Funktion wird jedes mal aufgerufen, wenn in Simulink das Ergebnis sich verändert wurde. Das heißt, mit diese Funktion wird GUI in Abhängigkeit der Simulink-Ergebnisse zur Laufzeit aktualisiert. |
|
Download |
Dateiname: |
updategui.m |
Dateigröße: |
1003 Bytes |
Heruntergeladen: |
387 mal |
Beschreibung: |
Simulink-Modell, welches ausgeführt wird. In Abhängigkeit der Ergebnissen, sollen Bilder ausgetauscht. Zusätzlich ist eine Callback StartFnc implementiert, um die Werte in Abhängigkeit der Ergebnisse in GUI zu aktualisieren. |
|
Download |
Dateiname: |
mytestmdl.mdl |
Dateigröße: |
21.49 KB |
Heruntergeladen: |
416 mal |
Beschreibung: |
|
Download |
Dateiname: |
mytestgui.m |
Dateigröße: |
5.82 KB |
Heruntergeladen: |
377 mal |
Beschreibung: |
|
Download |
Dateiname: |
mytestgui.fig |
Dateigröße: |
6.79 KB |
Heruntergeladen: |
378 mal |
|
|
|
Sco |
Forum-Meister
|
|
Beiträge: 699
|
|
|
|
Anmeldedatum: 15.08.10
|
|
|
|
Wohnort: Dundee
|
|
|
|
Version: 2008a, 2010a
|
|
|
|
|
|
Verfasst am: 09.02.2011, 00:12
Titel:
|
|
|
|
|
Hallo,
also prinzipiell ist das Problem, dass die handles in deiner updategui-Funktion gar nicht vorhanden sind bzw. nicht mit uebergeben werden. Da ich leider keine Erfahrung mit Simulink habe (ich war schon froh dein Programm erstmal zum laufen zu bringen, da das GUI nie das Simulinkmodel fand) kann ich dir auch nicht sagen wie du dieser Funktion die handles vom GUI übergeben kannst.
Weiterhin ist deine "control"-Variable nicht vorhanden gewesen, so dass das Program nie bis zu den axes Befehlen gelangte. Ich habe control einfach mal 1 oder 0 zugewisen, aber dann ist er fast nie in die if-clauses gesprungen, ich habe halt auch keinen blassen Schimmer was du da machen möchtest. Lange Rede kurzer Sinn ich habe zu Testzwecken einfach die if-clauses herausgenommen, so dass die "control"-Variable nicht mehr gebraucht wird (dies ist ja auch nicht für dein gepostetest Problem von Bedeutung).
Der entscheidente Teil der updategui- Funktion sieht so aus:
Nun bleibt noch das Problem der Handlesübergabe. Ich habe dies für Testzwecke zunächst einmal mit dem:
Befehlen gelöst. Hierfür habe ich die gesamte handles-Struktur beim Starten des GUIs (pushbuttonstart_Callback) im root object abgespeichert:
und in der updategui-Funktion wieder geladen:
Vielleicht kann dir ja noch jemand sagen wie man die handles "geschickter" übergeben kann. Es hat aber erstmal das getan was du wolltest, naemlich die Änderung des Bildes in axes1 je nach "current-state" (mandrill für cs>0 und clown für cs<0)
MFG
Sco
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
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.
|
|