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

Löschen/Überschreiben von GUI-axes-Inhalten

 

jochma
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 79
Anmeldedatum: 25.10.07
Wohnort: Oberbayern
Version: Version 7.0.0 (R14)
     Beitrag Verfasst am: 15.02.2008, 16:19     Titel: Löschen/Überschreiben von GUI-axes-Inhalten
  Antworten mit Zitat      
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...

Besten Dank,

gruß
jochma
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 15.02.2008, 16:56     Titel:
  Antworten mit Zitat      
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.

Code:


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
if isfield(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);

%spechere handles in figure
handles.p2=p2;

guihandles(handles.MyFigureHandle,handles);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
jochma
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 79
Anmeldedatum: 25.10.07
Wohnort: Oberbayern
Version: Version 7.0.0 (R14)
     Beitrag Verfasst am: 16.02.2008, 01:14     Titel:
  Antworten mit Zitat      
Servus,

vielen Dank schon mal für die Antwort.

Leider klappts aber noch nicht ganz mit den handles...

Daher meine Fragen:

Code:

if isfield(handles,'p2')&&ishandle(handles.p2)
 

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?

Code:

delete(handles.p2);
end
 

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?

Code:

%speichere handles in figure
handles.p2=p2;
 

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?

Code:

guihandles(handles.MyFigureHandle,handles);
 

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... Rolling Eyes

gruß
jochma
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.02.2008, 21:07     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:

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:
Code:

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.
Code:

handles.p2=p2;
 

4) und speichern es zwischen den Aktion in GUI ab.
Code:

 guihandles(handles.MyFigureHandle,handles);
 



5) handles.MyFigureHandle soll die handle von Hauptfester enthalten

Hier bitte MyFigureHandle durch den Tag-Namen ihres Hauptfensters anpassen, oder man kann auch handles.MyFigureHandle durch gcf-Befehl ersetzten.

gcf -liefert handle von aktuell(oder zuletzt) angewählten Fensters.



6)

Code:


delete(handles.p2);
 

Zitat:

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.

baum.gif
 Beschreibung:

Download
 Dateiname:  baum.gif
 Dateigröße:  2.22 KB
 Heruntergeladen:  1666 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
jochma
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 79
Anmeldedatum: 25.10.07
Wohnort: Oberbayern
Version: Version 7.0.0 (R14)
     Beitrag Verfasst am: 18.02.2008, 12:11     Titel:
  Antworten mit Zitat      
Servus,

vielen Dank, Denny, für deine Bemühungen!

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
Code:

oder
Code:

guihandles(handles.axes1,handles);
 

deklariert habe folgenden Fehler aus:
Code:

??? Error using ==> guihandles
Too many input arguments.
 

Wobei ich mich frage, warum er hier diese Fehlermeldung ausgibt?
Zu viele handles oder nicht eindeutig definiert?

gruß
jochma
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 18.02.2008, 13:26     Titel:
  Antworten mit Zitat      
Embarassed 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
Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
jochma
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 79
Anmeldedatum: 25.10.07
Wohnort: Oberbayern
Version: Version 7.0.0 (R14)
     Beitrag Verfasst am: 18.02.2008, 18:18     Titel:
  Antworten mit Zitat      
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:

Code:

% Überprüfe, ob so Object existiert, dann lösche es
if isfield(handles,'p2')&& ishandle(handles.p2)
    delete(handles.p2);
end
if isfield(handles,'p3')&& ishandle(handles.p3)
    delete(handles.p3);
end
if isfield(handles,'p4')&& ishandle(handles.p4)
    delete(handles.p4);
end

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;

guidata(handles.axes1,handles);
 


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?

Besten Dank!

gruß
jochma
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 18.02.2008, 19:23     Titel:
  Antworten mit Zitat      
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

handles.my_szug=my_szug;
 


und dann speicherst du diese
wie gewohnt ab

Nun muss du aber etwas ändern:
da wir ein handle array haben liefert uns ishandle die logischen array zurück denn wir einfach so verwendet können.
Code:


if isfield(handles,'my_szug')
delete(handles.my_szug(ishandle(handles.my_szug)));
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
jochma
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 79
Anmeldedatum: 25.10.07
Wohnort: Oberbayern
Version: Version 7.0.0 (R14)
     Beitrag Verfasst am: 19.02.2008, 11:23     Titel:
  Antworten mit Zitat      
Servus,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
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.