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

ButtomDownFcn in Gui

 

chaplin

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2012, 12:59     Titel: ButtomDownFcn in Gui
  Antworten mit Zitat      
Hallo!

Ich habe eine Gui mit zwei Axes. In einer möchte ich eine Linie mit der Maus ziehen können, sobald der Pushbottom "choose_level" gedrückt wird. Meine Funktion für diesen Button sieht wie folgt aus:

Code:

function choose_level_Callback(hObject, eventdata, handles)
% hObject    handle to choose_level (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

aH = handles.axes_clustertree;
level = line([0 1],[0.01 0.01], 'color','red','linewidth',3,'ButtonDownFcn',{@startDragFcn,handles});
set(handles.figure1,'WindowButtonUpFcn',{@stopDragFcn,handles});

function startDragFcn(varargin)
        set(handles.figure1, 'WindowButtonMotionFcn', {@draggingFcn,handles});

   
function draggingFcn(varargin)
        pt = get(aH, 'CurrentPoint');
        set(level, 'YData', pt(1)*[1 1]);


function stopDragFcn(varargin)
        set(handles.figure1,'WindowButtonMotionFcn', ' ');
 

Leider "sehen" die funktionen startDragFcn und stopDragFcn die Struktur handles nicht. Was mache ich falsch?


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 19.07.2012, 16:16     Titel: Re: ButtomDownFcn in Gui
  Antworten mit Zitat      
Hallo chaplin,

Du übergibst zwar die handles als Input, dies bleibt aber in VARARGIN versteckt.
Code:

function startDragFcn(ObjH, EventData, handles)
        set(handles.figure1, 'WindowButtonMotionFcn', {@draggingFcn,handles});

function draggingFcn(ObjH, EventData, handles)
        pt = get(aH, 'CurrentPoint');  % aH is undefined!
        set(level, 'YData', pt(1)*[1 1]);

function stopDragFcn(ObjH, EventData, handles)
        set(handles.figure1,'WindowButtonMotionFcn', ' ');

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2012, 16:39     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für die Antwort. Das mit handles funktioniert jetzt so weit. ich habe außerdem aH durch handles.axes_clustertree ersetzt. Jedoch kommt jetzt eine Fehlermeldung, dass die Variable level (also die Linie selbst) unbekannt ist. Aber ich kann doch die line nicht innerhalb von ihr selbst übergeben, oder?

Ich habe das Beispiel eigentlich in einer extra file mal ausprobiert, da hat aller funktioniert... es muss also irgendwie mit der gui zusammenhängen!
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2012, 21:53     Titel:
  Antworten mit Zitat      
Ok, innerhalb von line bezieht sich hObject also auf line. Deswegen kann auf die line noch innerhalb von StartDragFcn zugegriffen werden, allerdings in draggingFcn nicht mehr. Deswegen muss man es eben übergeben.

Code:

axes(handles.axes_clustertree);
level = line([0 1],[0.01 0.01], 'color','red','linewidth',3,'ButtonDownFcn',{@startDragFcn,handles})
set(handles.figure1,'WindowButtonUpFcn',{@stopDragFcn,handles});

function startDragFcn(hObject, eventdata, handles)
        set(handles.figure1, 'WindowButtonMotionFcn', {@draggingFcn,handles,hObject});

   
function draggingFcn(hObject, eventdata, handles,level)
        pt = get(handles.axes_clustertree, 'CurrentPoint');
        set(level, 'YData', pt(1)*[1 1]);
       

function stopDragFcn(hObject, eventdata, handles)
        set(handles.figure1,'WindowButtonMotionFcn', ' ');

 


Allerdings habe ich jetzt das problem, dass die Linie verschwindet. Ich kann zwar sehen, dass sich ihre Koordinaten ändern beim Ziehen, aber sie wird nicht mehr angezeigt. Wieso???
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.07.2012, 07:45     Titel:
  Antworten mit Zitat      
Hallo,

Ich kann nur raten, weshalb die Linie nicht mehr sichtbar ist. Möglicherweise stimmen die Units nicht überein: Wenn der CurrentPoint in den Units des AXES-Objekts gemessen wird und diese "pixels" sind, die LINE aber in "data"-Units, wird die Linie zwar gezeichnet, aber eventuell ausserhalb der sichtbaren Fläche.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
chaplin

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2012, 10:52     Titel:
  Antworten mit Zitat      
Hm.. das ganze ist mir zu kompliziert geworden. Ich habe jetzt eine andere Lösung gefunden:

Man kann die Matlabfunktion imline mit Hilfe der Constraint function verwenden Smile
 
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.