Anschliessend soll der User auf eines der gezeichneten Polygone klicken und das Programm soll dem Anwender ausgeben in welcher Spalte von hpoly{k} das handle von dem angeklickten impoly objekt sich befindet. In dem angehaengten Code handelt es sich nur um ein Minimalbeispiel, so dass im realen Fall z.B. das handle des 1. gezeichnete Polygons sich auch in der 5. Spalte befinden kann.
Mein Problem ist nun, dass ich nicht weiss wie ich herausfinden kann in welcher Spalte von hpoly{k} sich nun das handle vom angeklickten Polygon befindet, um dann beispielsweise die Farbe dieses Polygons zu aendern. Wenn es moeglich ist moechte ich nicht irgendwas in z.B. die "UserDaten" schreiben und dann dies im nachhinein irgendwie nach Uebereinstimmung durchsuchen. Hier der dazugehoerige Code:
for k = 1:3
hpoly{k} = impoly;
wait(hpoly{k}); % Warte auf Doppelklick
setColor(hpoly{k},'red') end
iptaddcallback(hf,'WindowButtonDownFcn',{@press,hpoly}) end
% hier weiss ich nicht weiter, suche etwas in dieser Art: % numcol = "Spalte im Vektor hpoly welches das impoly object des geklickten Polygons beinhaltet"
msgbox(['Die zum angeklickten Objekt korrespondierende Spalte im Vektor "hpoly" ist: ' num2str(numcol)]);
% setColor(???,'green') end end
das handle des angeklickten Polygons bekomme. Jedoch kann ich damit nix anfangen, da ich ja das Objekt brauche um z.B. die Farbe (mit setColore) zu aendern.
Weiterhin:
Um das Polygon zu loeschen oder die Farbe zu aendern kann ich nur mit dem Objekt arbeiten, dass handle kann hierfuer nicht verwendet werden. Verstehe ich auch nicht ganz warum dies so ist?
Code:
delete(gco)% funktioniert nicht delete(hpoly{1})% funktioniert
setColor(gco,'green')% funktioniert nicht
setColor(hpoly{1},'green')% funktioniert
ja verstehe ich auch nicht ganz. findobj funst ja auch nicht.
Ne Lösung wäre so
Code:
function Test
hf=figure; imshow('pout.tif');
for n=1:3
h(n) = impoly;
set(h(n),'Tag',sprintf('impoly%.f',n))
wait(h(n));
setColor(h(n),'red');
end set(hf,'WindowButtonDownFcn',{@press,h,'down'}) set(hf,'WindowButtonUpFcn',{@press,h,'up'})
Du kannst die handles auch in ein handlearray Speichern. Ich habe im Beispiel kein Cell benutzt. Da gibs bestimmt noch ne bessere Lösung aber die kenne ich im Augenblick nicht...
zunaechst vielen Dank fuer deine Antowrt. Allerdings habe ich es bisher etwa in dieser Art geloest, anstatt das Tag zu aendern habe ich einfach die Polygon-Nummer in die UserDatas geschrieben. Aber es muss doch moeglich sein ueber "gco" auch auf das dazugehoerige Objekt (hpoly{X}) zuzugreifen ohne zusaetzlich Informationen in bst. Felder des Objektes zu schreiben (z.B. in Userdata)?
Ansonsten ist dein Program auch ein wenig einfacher und kuerzer umzusetzten, vorallem ohne die Schleifen und Unterteilung von "impoly vertex" und "impoly", da get(gco,'Parent') immer das Objekt ergibt, so dass deleteget(gco,'Parent') beispielsweise auch funktioniert (jedoch weiss ich eben trotzdem nicht welches hpoly{X} es ist)!
Nur der Vollstaendigkeit halber dein gekuerztes Beispiel:
hf=figure; imshow('pout.tif');
for n=1:1
h(n) = impoly;
set(h(n),'Tag',sprintf('impoly%.f',n))
wait(h(n));
setColor(h(n),'red');
end set(hf,'WindowButtonDownFcn',{@press,h,'down'}) set(hf,'WindowButtonUpFcn',{@press,h,'up'}) end
SelObj = get(gco,'Parent');
Tag = get(SelObj,'Tag');
if and(~isempty(SelObj),strfind(Tag,'impoly'))
numpoly = str2double(regexp(Tag,'\d','match'));
switch Typ
case 'down'
setColor(himpoly(numpoly),'blue') case 'up'
setColor(himpoly(numpoly),'red') end end end
jedoch weiss ich eben trotzdem nicht welches hpoly{X} es ist
Entweder hab ich ein Brett vor dem Kopf oder du . Ich habe oben die Schleifen benutzt damit das Array himpoly welches die 3 Objecte beinhaltet nach dem aktuellen Ausgewählten Object durchsucht wird. Also hat man doch dann die Position im Array an der sich das aktuell Ausgewählte impoly befindet... Oder verstehe ich das falsch?? Oder suchst du etwas anderes...?!
Zitat:
ohne zusaetzlich Informationen in bst. Felder des Objektes zu schreiben (z.B. in Userdata)
Ja das finde ich auch sehr umständlich. Aber ich denke mal mit Workarounds kennen sich Matlabbenutzer ganz gut aus^^...
jedoch weiss ich eben trotzdem nicht welches hpoly{X} es ist
Entweder hab ich ein Brett vor dem Kopf oder du. Ich habe oben die Schleifen benutzt damit das Array himpoly welches die 3 Objecte beinhaltet nach dem aktuellen Ausgewählten Object durchsucht wird
Natuerlich funktioniert dies mit der Schleife oder eben meiner Code-Zeile mit dem regexp-Befehl, wir erhalten beide den korrespondierenden Index in hpoly, JEDOCH nur wenn wir zuvor zusaetliche Eintraege im Objekt machen (Tag: impoly1...impoly10, oder eben in UserData). Ich suchte eben eine Moeglichkeit wie diese:
Code:
find(hpoly == get(gco,'parent')); % funktioniert leider nicht
das selbe sind, oder sehe ich da etwas falsch? Also muss es doch irgendwie auch moeglich sein den Index von hpoly (vom aktuellen Polygon) zu ermitteln (ohne vorherige Aenderungen im Objekt).
Falls du noch ne Idee haettest, ich bin fuer einen Gedankenaustauch allzeit offen
leider musste ich auch feststellen, dass mit dem von dir geposteten Code das nachträgliche Einfügen von Vertexen (a+Mausklick auf Line des Polygons) nicht mehr funktioniert, da Matlab natürlich auf den Callback der "WindowButtonDownFcn" zurückgreift.
Was gibt es denn dafür für ein Workround, ausser vielleicht genau bei diesen Fall (a+Mausklick) den "WindowButtonDownFcn" Callback irgendwie davor zu löschen (iptremovecallback).
Über Hilfe von andere würde ich mich natürlich auch freuen (die Fragen aus vorherigen Post sind leider auch immer noch offen)!
MFG
Sco
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.