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

Wie finde ich objekte (h = impoly vs. gco)+allg. Fragen

 

Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 09.02.2011, 19:03     Titel: Wie finde ich objekte (h = impoly vs. gco)+allg. Fragen
  Antworten mit Zitat      
Hallo,

Ich moechte mittels impoly verschiedene Polygone zeichnen (ROIs), wobei alle handles zu den impoly-Objekten in einer Cell gespeichert werden.
Code:

hpoly{k} = impoly;
 

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

function test

hf = figure;

for k = 1:3
    hpoly{k} = impoly;
    wait(hpoly{k}); % Warte auf Doppelklick
    setColor(hpoly{k},'red')
end
iptaddcallback(hf,'WindowButtonDownFcn',{@press,hpoly})
end

function press(varargin)
if strcmp(getfield(get(get(gco,'Parent')),'Tag'),'impoly') % nur wenn das Polygon ausgewaehlt wurde
    hpoly = varargin{3}; % alle impoly objecte

    % 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
 

Ich weiss, dass ich mit:
Code:

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
 


Eine menge Unklarheiten... Ich hoffe jemand kann mir ein wenig Licht ins Dunkel bringen. Ich bin fuer Erleuchtung Dankbar!

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen


Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 09.02.2011, 22:27     Titel:
  Antworten mit Zitat      
Hi Sco,

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'})

function press(hObj,evd,himpoly,Typ)

SelObj = ancestor(gco,{'figure','axes','hggroup'});
if ~isempty(SelObj)
    if strcmp(get(SelObj,'Tag'),'impoly vertex')
        SelObj2 = get(SelObj,'Parent');
        for n=1:length(himpoly)
            if strcmp(get(himpoly(n),'Tag'),get(SelObj2,'Tag'))
                switch Typ
                    case 'down'
                        setColor(himpoly(n),'blue')
                    case 'up'
                        setColor(himpoly(n),'red')
                end
                break;
            end
        end
    elseif ~isempty(strfind(get(SelObj,'Tag'),'impoly'))
        for n=1:length(himpoly)
            if strcmp(get(himpoly(n),'Tag'),get(SelObj,'Tag'))
                switch Typ
                    case 'down'
                        setColor(himpoly(n),'blue')
                    case 'up'
                        setColor(himpoly(n),'red')
                end
                break;
            end
        end
    end
end
 


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

MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 10.02.2011, 15:08     Titel:
  Antworten mit Zitat      
Hallo Marco,

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

function test

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

 function press(hObj,evd,himpoly,Typ)
 
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
 


Wenn es keine bessere Loesung gibt werde ich es wohl so in der Art machen muessen...

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 10.02.2011, 15:53     Titel:
  Antworten mit Zitat      
Hey,
Zitat:

jedoch weiss ich eben trotzdem nicht welches hpoly{X} es ist

Entweder hab ich ein Brett vor dem Kopf oder du Wink. 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^^...


MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 10.02.2011, 16:10     Titel:
  Antworten mit Zitat      
Hallo Marco,

Zitat:

Zitat:

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 muss doch irgendiwe funktionieren, da sowohl:
Code:

% hpoly = impoly;
delete(get(gco,'parent'))
% als auch
delete(hpoly)
 

funktioniert. --> D.h. doch, dass diese beiden Ausdruecke:
Code:

get(gco,'parent')
% und
hpoly
 

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 Smile

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 13.02.2011, 18:11     Titel:
  Antworten mit Zitat      
Hallo Marco,

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