Verfasst am: 15.02.2008, 15:19
Titel: Löschen/Überschreiben von GUI-axes-Inhalten
Servus,
in meiner GUI mit integrierter axes1 wird im Hintergrund ein Luftbild platziert.
Mit Drücken eines Buttons kann der Benutzer anhand dieses Luftbilds einen beliebig gewünschten Straßenzug definieren:
Code:
zoom off
pan off
[a, b]=ginput;
hold on
p2=line(a,b); set(p2,'Color','r'); set(p2,'LineWidth',2);
Ist der Benutzer aber nicht zufrieden mit seiner Auswahl, kann er den Button nochmals drücken und eine neue Auswahl tätigen.
Dies funktioniert soweit auch, nur dass die alte Auswahl im Bild gezeichnet bestehen bleibt, was natürlich stört bzw. irritiert.
Wie kann man also die alte Auswahl aus dem Bild löschen bevor die neue editiert wird?
Sollte ja eigentlich kein großes Problem darstellen, doch leider steh ich im Moment auf dem Schlauch, bzw. bin ich mit den Bereichen gca, gfa, set und get auch weniger bewandert...
Hallo,
also axes zu löschen würde auch dein Hintergrund enfernen und würde für dich nichts bringen.
du hast aber das handle von deinem Straßenzug-Linie, dann kannst du einfach dieses handle löschen.
Aber da du es über erneutes drücken der Taste enfernen möchtest, muss du es vorher abspeichern.
Ich würde wahrscheinlich so machen:
Code:
%Überprüfe, ob so Object existiert, dann lösche es
ifisfield(handles,'p2')&&ishandle(handles.p2) delete(handles.p2);
end zoom off
pan off
[a, b]=ginput;
hold on
p2=line(a,b); set(p2,'Color','r'); set(p2,'LineWidth',2);
Er überprüft also ob das Feld p2 in den handles der Grafik existiert und ob handles.p2 ein gültiges graphic-handles ist.
Muss ich aber zuvor definieren, dass er sich auf die handles der axes1 beziehen soll, oder sucht er alle ab?
Die vom Benutzer eingefügte Plotabschnitt p2 wird als Feld gespeichert. Speichert er dies auch innerhalb von axes1, oder muss dies noch definiert werden bzw. genügt es, dies lokal zu speichern?
create a structure of handles.
handles.MyFigureHandle muss aber zuvor definiert werden bzw. auf axes1 umgemünzt werden, oder?
Weil andernfalls die Fehlermeldung ausgegeben wird, dass dieses Feld nicht bekannt ist (Reference to non-existent field).
Besten Dank für die Bemühungen, leider sind mir momentan handles & co. bisher noch eher ziemlich abstrakt...
Er überprüft also ob das Feld p2 in den handles der Grafik existiert und ob handles.p2 ein gültiges graphic-handles ist.
Muss ich aber zuvor definieren, dass er sich auf die handles der axes1 beziehen soll, oder sucht er alle ab?
1) Ja es ist richtig. Zuerst wird mit isfield einfach abgefragt, ob in handles-Struktur bereits so ein Feld abgelegt ist. Dann zusätzlich vor dem Löschen wird mit ishandle überprüft, ob das Objekt (Straßenzug-Linie) noch existiert.
2) Nein, das handle (so eine art einer eindeutigen Identifikationsnummer) liefert bereits die folgende Zeile:
Dadurch weiß Matlab das Objekt, das angesprochen werden muss.
3) Um auf diese Nummer leichter zugreifen zu können, legen wir diese in handles-Struktur ab.
Als nächstes löscht er wie gewünscht das Feld p2, so dass damit gleichzeitig auch die Darstellung von p2 im Plot gelöscht wird, oder?
Ja.
Code:
Die vom Benutzer eingefügte Plotabschnitt p2 wird als Feld gespeichert. Speichert er dies auch innerhalb von axes1, oder muss dies noch definiert werden bzw. genügt es, dies lokal zu speichern?
Das handle wird automatisch in axes abgespeichert. Das Feld p2 machen nur für und, damit wir einfacheren Zugriff haben
Das handle geht nie verloren, alle GUI-Elemente eines Fenster die du erzeugst, werden in Art eines Baumes abgelegt.
so (weiß nicht ob verständlich genug ist, siehe Bild( h vor dem Wort soll verdeutlichen das es handle ist.))
So wäre es einfach ziemlich umständlich auf das handle zugreifen, aber es möglich
dann muss man richtiges handle über get(handle,'Children') suchen.
Eine (hoffentlich letzte...) Frage hätt' ich noch zur Funktion guihandles.
Wenn ich mein Figure-Objekt p2 über ginput und line definiert habe, gibt er mir für die guihandles-Funktion die ich jetzt mit
Upps hab nicht bemerkt, Fehler von mir und das 2 mal gepostet.
Peinlich, peinlich.
Tut mir leid, passiert leider, wenn man nicht aufmerksam ist.
Es soll nicht guihandles, sondern guidata
kein Problem, dafür klappts jetzt soweit! Vielen Dank!
Allerdings wär mir noch eine Frage diesbezüglich eingefallen:
Und zwar um dem Benutzer die Möglichkeit zu geben, seinen editierten Straßenzug sofort im Bild darzustellen, habe ich zwei zusätzliche Plots innerhalb von Schleifen integriert.
Folgendermaßen sieht mein Quell-Code nun aus:
ab = []; n = 0;
mou = 1; i=1;
% solange linke Maustaste gedrückt wird, wird der Straßenpolygonzug fortgesetzt % Abbruch erfolgt mit rechter Maustaste while mou == 1 % Editierung via Fkt. ginput [ai,bi,mou] = ginput(1);
p3=[];
% Plot der gewählten Eckpunkte als rote Kreise hold on; p3i=plot(ai,bi,'ro');
p3=[p3 p3i];
n = n+1;
% ab: Koordinaten der Polygonzugpunkte
ab(:,n) = [ai;bi];
[u,k]=size(ab);
% sobald bereits 2 Punkte editiert: Verbinde beide Punkte und zeichne sie if k >=2 for i=2:k
o=1;
abs=[ab(1,i-1), ab(1,i); ab(2,i-1), ab(2,i)];
% Unmittelbarer Plot des editierten Straßenzugs hold on; p4(o)=plot(abs(1,:), abs(2,:), 'r');
o=o+1;
end end end
% Plot des endgültigen Polygonzugs
p2=plot(ab(1,:),ab(2,:)); set(p2,'Color','r'); set(p2,'LineWidth',2);
% speichere handles in figure
handles.p2=p2;
handles.p3=p3;
handles.p4=p4;
Wegen der while- bzw. if-Schleife greift handles.p3 und handles.p4 nur auf den letzten editierten Punkt bzw. letzte editierte Linie zu und löscht diese dementsprechend.
Dies habe ich versucht umzugehen, indem ich p3 jeweils mit dem aktuellen Punkt p3i aufdatiere, bzw. auch p4 mit Laufindex o als Vektor erweitere.
Leider klappt dies aber nicht wie gewünscht (sondern es wird wiederum nur das letzte Grafikobjekt gelöscht).
Wie könnte ich hier also am besten auf das gesamte p3- bzw. p4-Objekt zugreifen bzw. die gestückelten p3- und p4-Objekte als ein einzelnes Objekt abspeichern?
Hallo,
ich schlage vor, dass dir noch eine variable außerhalb der while Schleife definierst
und legst einfach die handles deiner Straßenzüge in diese ab.
irgendwie so:
Code:
my_szug=[] while mou == 1
.
.
my_szug=[my_szug p3i];
.
.
end
ja, eigentlich logisch dass p3=[ ] vor der Schleife definiert werden muss, weil innerhalb der Schleife sonst p3 jeweils überschrieben wird...
Aber jetzt passts! Perfekt! Besten Dank!
gruß
jochma
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
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.