Verfasst am: 05.10.2012, 10:42
Titel: Cursor Linie im Plot setzen
Hi Leute,
ich habe ein Plot mit einem Zeitsignal. Ich moechte nun zwei Cursor Linien im Plot setzen um so z.B. den Abstand zu messen. Linie im Plot setzen geht mit folgendem Befehl:
Nun zu meinem Problem. Wie kann ich Linien im Plot angepasst setzen?
Beispiel: Ich oeffne mein GUI. Lasse die Daten plotten. Das funktioniert soweit. Jetzt zoome ich in das Signal hineien bis ich z.B. nur noch drei Perioden einer Sinusschwingung betrachten kann. Ich druecke auf den erstellten Cursor Button und jetzt soll eine Linie in der Mitte erscheinen die ich dann bewegen kann. Wie lese ich also nach dem Zoom die Xmin,Xmax bzw. Ymin,Ymax aus?
ich verstehe zwar noch nicht ganz genau was du machen willst, aber hier ist ein Code um bewegte Linien in einem Plot zu realisieren.
Code:
function moveLine
%
main = figure('HandleVisibility','on');
set(main,'WindowButtonMotionFcn',@local_fcn_mouse_action);
ah = axes('Tag','ah','parent',main);
set(ah,'YLim',[110],'XLim',[110]);
%axis([110110]) for i=1:4 line([i+1 i+1],[010],'Tag',strcat('line',num2str(i)),'ButtonDownFcn',@init,'UserData',i);
end
function init(src,evnt)
f = src;
lineT = get(gco,'Tag');
lineH = findobj(f, 'tag', lineT);
set(lineH,'color','r','erasemode', 'xor');
set(gcbf,'WindowButtonMotionFcn',@move) set(gcbf,'WindowButtonUpFcn',@stop)
setptr(gcbf,'closedhand');
end
function move(src,evnt)
f = src;
lineT = get(gco,'Tag');
lineH = findobj(f, 'tag', lineT);
cp = get(ah,'CurrentPoint');
xdat = [cp(1,1),cp(1,1)];
set(lineH,'XData',xdat);
setptr(gcbf,'closedhand');
end
function stop(src,evnt)
f = src;
lineT = get(gco,'Tag');
lineH = findobj(f, 'tag', lineT);
set(lineH,'Color','b','erasemode', 'normal');
set(gcbf,...
'WindowButtonMotionFcn',@local_fcn_mouse_action) set(gcbf,...
'WindowButtonUpFcn','')
setptr(gcbf,'hand');
end
function local_fcn_mouse_action(eventSrc,eventData)
obj = hittest(eventSrc);
switchget(obj,'Tag') case 'line1'
setptr(eventSrc,'hand');
case 'line2'
setptr(eventSrc,'hand');
case 'line3'
setptr(eventSrc,'hand');
case 'line4'
setptr(eventSrc,'hand');
otherwise
setptr(eventSrc,'arrow');
end end end
OK. Muss ich mir genauer angucken. So wie ich das verstanden hab ist die 'WindowButtonDownFcn' Reaktion auf die gedrueckte Maus Taste... usw. Wie heisst aber der Handle nur auf mein Plot? Sprich wenn ich mit der Maus auf mein Plot komme, soll eine bestimmte Funktion ausgefuehrt werden.
Wenn du mit Plot dein Axes-Objekt meinst, also dein Koordinatensystem in dem du plottest, dann ergänze die letzte Funktion.
Im Beispiel wird nun "Mein Axes" im Workspace ausgegeben, sobald du mit der Maus über das Axes-Objekt fährst.
Code:
function local_fcn_mouse_action(eventSrc,eventData)
obj = hittest(eventSrc);
switchget(obj,'Tag') case 'line1'
setptr(eventSrc,'hand');
case 'line2'
setptr(eventSrc,'hand');
case 'line3'
setptr(eventSrc,'hand');
case 'line4'
setptr(eventSrc,'hand');
case 'ah'
display('mein Axes');
otherwise
setptr(eventSrc,'arrow');
end end
function local_fcn_mouse_action(eventSrc,eventData)
obj = hittest(eventSrc);
switchget(obj,'Tag') case 'ah'
setptr(eventSrc,'hand');
otherwise
setptr(eventSrc,'arrow');
end end end
ja ich mein mein Axes - Objekt. Nicht ganz was ich brauche. Auf jeden Fall veranlasst deine Code Ergaenzung eine Reaktion auf eine Maus Bewegung auf dem Axes - Objekt. Was ich brauche ist, wenn ich mit dem Mauszeiger auf mein Axes - Objekt fahre, dass ich dann in eine bestimmte Funktion springe. Wie kann ich das in meinem GUI Code realisieren? Axes1 ist der Tag meines Axes - Objekt. Kann ich also sowas in der Art schreiben um auf ne bestimmte Funktion zugreifen sobald ich auf mein Axes - Obekt fahre:
function axes1_Callback(hObject, eventdata, handles)
was eleganteres fällt mir im Moment nicht ein außer so:
Funktion für die figure und axes:
Code:
function moveLine
%
main = figure('HandleVisibility','on','tag','main');
set(main,'WindowButtonMotionFcn',@local_fcn_mouse_axes);
ah = axes('Tag','Axes1','parent',main);
set(ah,'YLim',[110],'XLim',[110]);
function local_fcn_mouse_axes(eventSrc,eventData)
obj = hittest(eventSrc);
switchget(obj,'Tag') case 'Axes1'
function_irgendwas();
set(main,'WindowButtonMotionFcn',@local_fcn_mouse_figure);
end end function local_fcn_mouse_figure(eventSrc,eventData)
obj = hittest(eventSrc);
switchget(obj,'Tag') case 'main'
set(main,'WindowButtonMotionFcn',@local_fcn_mouse_axes);
end end end
das Problem ist, dein Code ist ein Script mit verschachtelten Funktionen. Was ich bracuhe ist eine Callback Funktion sobald ich mit der Maus auf mein Axes - Objekt fahre.
switch action
case 'on'
set(fig,'WindowButtonMotionFcn',@local_fcn_mouse_axes);
end
function local_fcn_mouse_axes(eventSrc,eventData)
obj = hittest(eventSrc);
switchget(obj,'Tag') case 'Axes1'
function_irgendwas();
set(fig,'WindowButtonMotionFcn',@local_fcn_mouse_figure);
end end
function local_fcn_mouse_figure(eventSrc,eventData)
obj = hittest(eventSrc);
switchget(obj,'Tag') case 'main'
set(fig,'WindowButtonMotionFcn',@local_fcn_mouse_axes);
end end
Erstmal danke dir fuer deine Zeit und deine Antworten. Ich glaube wir reden an einander vorbei
Es gibt ja fuer jedes Objekt das man mit dem GUIDE erstellt eine Callback funktion. Wenn ich nun ein Button erstelle, habe ich in meinem GUI m - File folgende Funktion:
function pushbutton1_Callback(hObject, eventdata, handles)
....(Anweisungen).....
Nun wollte ich wissen ob es eine Callback Funktion gibt, wenn ich mit der Maus auf mein Axes - Obejkt fahre. Anscheinend ist dies die 'WindowButtonMotionFcn'. Wie binde ich diese aber in mein GUI m - File ein? Ich kann ja nicht schreiben:
function axes1_Callback(hObject, eventdata, handles)
oder
function axes1_WindowButtonMotionFcn(hObject, eventdata, handles)
sorry war kurz weg.
Da ich nicht mit guide arbeite hat es nun etwas gedauert.
Hoffe nun ist es so wie du willst.
figure mit guide erstellt.
windowbuttonmotionfcn gestetzt (ist die maus_action.m)
dort wird überprüft ob du auf deinem Axes-Object bist und wenn ja die Funktion irgendwas 1mal ausgeführt.
perfekt! Ich danke dir vielmals fuer die schnelle Antwort. Das Programm funktioniert einwandfrei, genau was ich wollte. Jetzt kann ich drauf aufbauen. Danke nochmal!
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.