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

ButtonDownFcn wird nicht ausgeführt

 

Flutsch
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.03.10
Wohnort: Rostock
Version: ---
     Beitrag Verfasst am: 14.07.2013, 15:12     Titel: ButtonDownFcn wird nicht ausgeführt
  Antworten mit Zitat      
moin,

ich habe mir mithilfe von GUIDE ein GUI erstellt. In diesem ist u.a. ein axes vorhanden in die ein Bild mittels
Code:
imagesc(handles.gtSegments, 'Parent', handles.axesSegments)

geplottet wird.

Außerdem habe ich noch eine ButtonGrp mit 3 Radiobuttons, welche steuern sollen welche Aktion bei einem Mausklick innerhalb der Axes ausgeführt wird. Die 3 Aktionen sind:
    1) zoom
    2) pan
    3) getCoordinates


Implementiert habe ich das über die selectionChangedFcn der ButtonGrp
Code:
function uipanelAxesControl_SelectionChangeFcn(hObject, eventdata, handles)

switch get(eventdata.NewValue,'Tag') % Get Tag of selected object.
    case 'radiobuttonPan'
        pan on
        zoom off
        handles.imgAxesMode = 'pan';
    case 'radiobuttonZoom'
        zoom on
        pan off;
        handles.imgAxesMode = 'zoom';
    case 'radiobuttonSelectSegments'
        zoom off
        pan off
        set(handles.axesImg, 'ButtonDownFcn', @axesImg_ButtonDownFcn);
        handles.imgAxesMode = 'select';
    otherwise
        % Code for when there is no match.
end

% update
%handles.segmentIdxToProcess = segmentIdxToProcess;
guidata(hObject, handles);


Allerdings wird die Funktion axesImg_ButtonDownFcn nie aufgerufen und ich verstehe nicht warum?

zuvor hatte ich für das getCoordinates die Funktion ginput verwendet, was auch funktioniert hat, jedoch entspricht es nicht ganz meinen Ansprüchen. Das Problem ist nämlich, dass ich abhängige von den Koordinaten in einem weiteren Plot eine Aktion ausführe und diese auch sofort dargestellt werden soll. Nutze ich hierzu ginput kann ich leider nur
    a) einen Punkt auswählen und die Aktion ausführen
    b) mehrere Punkte "sammeln" und anschließend die Aktion ausführen


Ich möchte aber einen Punkt auswählen, die Aktion ausführen, nächsten Punkt auswählen, Aktion ausführen usw.

Achso das
Code:
set(handles.axesImg, 'ButtonDownFcn', @axesImg_ButtonDownFcn);


habe ich mit hineingenommen um sicherzugehen, dass axesImg die ButtonDownFcn auch noch erkennt wenn ich ein neues Bild mittels
Code:
imagesc(handles.gtSegments, 'Parent', handles.axesSegments)

eingeladen habe. Es sieht aber momentan so aus, als ob axesImg die ButtonDownFcn gar nicht kennt, da sie überhaupt nicht aufgerufen wird, obwohl der entsprechende radiobutton aktiviert ist...

Würde mich freuen, wenn jemand eine Idee hat...

Gruß,
Flutsch
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.07.2013, 22:05     Titel: Re: ButtonDownFcn wird nicht ausgeführt
  Antworten mit Zitat      
Hallo Flutsch,

IMAGESC setzt fast alle Properties des AXES-Objektes zurück und dazugehört auch die ButtonDownFcn:
Code:
AxesH = axes('ButtonDownFcn', 'disp(clock)');
get(AxesH, 'ButtonDownFcn')
% >> disp(clock)

imagesc(rand(10, 10, 3));
get(AxesH, 'ButtonDownFcn')
% >> ''
 

Es hilft, das Einfügen neuer Objekte explizit so einzufügen, dass sie vorhgerige nicht ersetzen:
Code:
AxesH = axes('ButtonDownFcn', 'disp(clock)', 'NextPlot', 'add');

Nun löscht IMAGESC nicht mehr vorherige andere Objekte im AXES. Wenn das aber gewünscht ist, muss dies dann explizit gemacht werden.

Das gleiche Bertifft übrigens auch andere High-Level-Grafik-Funktionen wie PLOT. Low-Level-Funktionen wie IMAGE und LINE sind dagegen weniger smart, haben dafür aber auch weniger unerwartete Seiteneffekte.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Flutsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.03.10
Wohnort: Rostock
Version: ---
     Beitrag Verfasst am: 15.07.2013, 00:07     Titel:
  Antworten mit Zitat      
hallo Jan,
erstmal danke für die Antwort.
Das Imagesc das Axes-Object zurücksetzt hatte ich auch schon gelesen und versucht in der selectionChangedFcn zu korrigieren, indem ich dort mittels
Code:

set(handles.axesImg, 'ButtonDownFcn', @axesImg_ButtonDownFcn);
 

die ButtonDownFcn immer wieder neu setze, allerdings hatte das keine Wirkung, weshalb ich den Fehler irgendwo anders vermutet habe...
Nichtsdestotrtz habe ich jetzt meinen Code soweit umgeschrieben, dass ich nach dem ersten aufruf von imagesc() das Axes-Object wie von dir vorgeschlagen konfiguriere und die ButtonDownFcn registriere
Code:

set(handles.axesImg, 'NextPlot', 'add');
set(handles.axesImg, 'ButtonDownFcn', @axesImg_ButtonDownFcn);
 

allerdings funktioniert die ButtonDownFcn trotzdem nicht, sprich mein dortiger Breakpoint wird nie erreicht...

Gruß,
Flutsch
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.07.2013, 09:41     Titel:
  Antworten mit Zitat      
Hallo Flutsch,

So weit ich das sehe, kann ich die Ursache dafür nicht wissen, da nicht Dein gesamter Code bekannt ist. Eventuell liegt es an uipanelAxesControl_SelectionChangeFcn.

Zitat:
... nach dem ersten aufruf von imagesc() das Axes-Object wie von dir vorgeschlagen konfiguriere

Wieso nicht vor dem ersten Aufruf?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Flutsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.03.10
Wohnort: Rostock
Version: ---
     Beitrag Verfasst am: 15.07.2013, 09:58     Titel:
  Antworten mit Zitat      
weil das Bild dann nicht korrekt dargestellt wurde und ich vermeiden wollte die axes manuell so zu konfigurieren, dass es korrekt dargestellt wird...
ich erstelle gerade ein kurzes Minimalbeispiel, damit ich das Problem mal komplett als Code aufzeigen kann.
Private Nachricht senden Benutzer-Profile anzeigen
 
Flutsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.03.10
Wohnort: Rostock
Version: ---
     Beitrag Verfasst am: 15.07.2013, 11:08     Titel:
  Antworten mit Zitat      
ich hab emal das Minimalbeispiel angehängt

wenn man bei den Radiobuttons 'select' angewählt hat ist zwar anscheinend der Callback des Axes-Objects gesetzt, allerdings wird er niemal ausgeführt...

Gruß,
Flutsch

minimalExample.m
 Beschreibung:

Download
 Dateiname:  minimalExample.m
 Dateigröße:  4.2 KB
 Heruntergeladen:  429 mal
minimalExample.fig
 Beschreibung:

Download
 Dateiname:  minimalExample.fig
 Dateigröße:  4.74 KB
 Heruntergeladen:  404 mal
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.07.2013, 11:39     Titel:
  Antworten mit Zitat      
Hallo zusammen

das Problem liegt eigentlich an einer anderen Stelle. Image ist für sich ein Objekt und hat eine eigene ButtonDownFcn. Da aber Image oberhalb der Axes liegt wird wohl die ButtonDownFcn der Axes nie erreicht.

Also sollte man hier die ButtonDownFcn der Image so initialisieren, dass die ButtonDownFcn der Axes aufgerufen wird.


schaue aber die Lösung hier:
http://www.mathworks.de/support/solutions/en/data/1-1B03X/

Zuletzt bearbeitet von denny am 15.07.2013, 14:47, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.07.2013, 13:49     Titel:
  Antworten mit Zitat      
Hallo denny,

Genau! Ich dachte zwar, ich hätte schon vorgeschlagen, 'HitTest' des IMAGE-Objektes auf 'off' zu stellen, das war dann aber doch ein anderer Thread un ein PATCH Objekt, um genau zu sein.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Flutsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.03.10
Wohnort: Rostock
Version: ---
     Beitrag Verfasst am: 15.07.2013, 16:51     Titel:
  Antworten mit Zitat      
danke, die HitTest-Property auf off zu stellen war des rätsels Lösung....

Allerdings hat sich nun ein neues Problem aufgetan:
in ButtonDownFcn möchte/muss ich auf die handles-struct zugreifen, allerdings wird diese nicht mit übergeben, obwohl sie mit in der Argumentenliste von ButtonDownFcn steht...

hat dazu jemand eine Idee? ich könnte die benötigten Variablen als global deklarieren, allerdings finde ich das eher unschön....

ich habe das Minimalbeispiel mal diesbezüglich aktualisiert.

Gruß,
Flutsch

minimalExample.m
 Beschreibung:

Download
 Dateiname:  minimalExample.m
 Dateigröße:  4.44 KB
 Heruntergeladen:  405 mal
minimalExample.fig
 Beschreibung:

Download
 Dateiname:  minimalExample.fig
 Dateigröße:  4.74 KB
 Heruntergeladen:  411 mal
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.07.2013, 17:08     Titel:
  Antworten mit Zitat      
Hallo

Nach Definition werden bei allen Callbacks, ButtonDownFcn usw.
Nur 2 Parameter übergeben, also das GUI-Objekt, welcher die Action ausgelöst hat und event, falls spezifiziert(z.B. TimerFcn).

Alle anderen Parameter muss du explizit übergeben, und zwar so

Code:

set(handles.axesImg, 'ButtonDownFcn', {@axesImg_ButtonDownFcn, handles});
 


ich würde, dass aber nicht empfehlen, da sonst die handles, nicht up to date sind, sondern beinhalten die Information zu dem Zeitpunkt der Übergabe

also besserer Weg ist nur das Handle des Hauptfensters zu übergeben und dann in der ButtondownFcn über GUIDATA die handles holen:

Code:

set(handles.axesImg, 'ButtonDownFcn', {@axesImg_ButtonDownFcn, handels.hMainWindow});

 


später in der ButtondownFcn:
Code:

function axesImg_ButtonDownFcn(hObject, event, hMainWindow )
handles = guidata(hMainWindow);

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Flutsch
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.03.10
Wohnort: Rostock
Version: ---
     Beitrag Verfasst am: 15.07.2013, 18:24     Titel:
  Antworten mit Zitat      
danke, das hat geklappt. allerdings heißt ( zumindest bei mir) das hMainWindow --> figure1...

gruß,
Flutsch
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.