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

XLim YLim nach zoom anpassen

 

Gusa
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 05.10.12
Wohnort: Freising
Version: ---
     Beitrag Verfasst am: 09.10.2012, 15:00     Titel: XLim YLim nach zoom anpassen
  Antworten mit Zitat      
Hi Leute,

ich habe ein Plot in dem ich durch druecken auf den erstellten Cursor Button in eine Funktion springe und zwei Linien plotten lasse. Danke an estorilblau fuer den code. Die Linien positionieren sich in der Mitte des Plots. Ich realisier das mit YLim XLim. Nun habe ich das Problem, dass ich nach einem Zoom in (oder Zoom out) die Cursor sich nicht mehr in der Mitte positionieren und sogar gar nicht mehr funktionieren wenn ich auf die urspruengliche Groesse wieder rauszoom. Wie kann ich das Problem loesen?

VG
Andi

Code:


function cursor(xh,yh)
%
%main = figure('HandleVisibility','on');
set(gcf,'WindowButtonMotionFcn',@local_fcn_mouse_action);
%ah = axes('Tag','ah','parent',main);
%set(ah,'YLim',[1 10],'XLim',[1 10]);
%axis ([1 10 1 10])

x=xlim;

for i=1:2
    line([x(2)/2 x(2)/2],ylim,'Tag',strcat('line',num2str(i)),'ButtonDownFcn',@init,'UserData',i);
end

%disp(xlim/2);



  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(gca,'CurrentPoint');
    xdat = [cp(1,1),cp(1,1)];
    set(lineH,'XData',xdat);
    setptr(gcbf,'closedhand');
    set(xh,'String',cp(1, 1));
    set(yh,'String',cp(1, 2));
  end
   
  function stop(src,evnt)
    f = src;
    lineT = get(gco,'Tag');
    lineH = findobj(f, 'tag', lineT);
    set(lineH,'Color','b','erasemode', 'xor');
    set(gcbf,...
        'WindowButtonMotionFcn',@local_fcn_mouse_action)
    set(gcbf,...
        'WindowButtonUpFcn','')
    setptr(gcbf,'hand');
  end

    function local_fcn_mouse_action(eventSrc,eventData)
      obj = hittest(eventSrc);
      switch get(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
Private Nachricht senden Benutzer-Profile anzeigen


estorilblau
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 01.10.12
Wohnort: München
Version: R2006a, R2007b, R2010b
     Beitrag Verfasst am: 09.10.2012, 21:59     Titel:
  Antworten mit Zitat      
Hallo,

du musst nach dem zoomen die 'WindowButtonMotionFcn' der figure wieder neu setzen.
Code:
set(main,'WindowButtonMotionFcn',@local_fcn_mouse_action);
 


Sollte reichen.
_________________

Viele Grüße

estorilblau
Private Nachricht senden Benutzer-Profile anzeigen
 
Gusa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 05.10.12
Wohnort: Freising
Version: ---
     Beitrag Verfasst am: 10.10.2012, 09:23     Titel:
  Antworten mit Zitat      
Hi,

aber das ich mach ja in dem ich nochmal auf "Cursor" klicke. Dann wird die Funktion nochmal aufgerufen und alles neue gesetzt. Ich glaube das Problem ist, dass nach dem ich die zoom funktion benutzt habe, mein current object nicht mehr meine axes ist. Wie aendere ich das? Ich hab schon danach gegoogelt und denke das hat mit hittest on bzw. off zu tun. Weiss aber nicht wie ich diese einstellung zu der zoom funktion finde.

VG
Andi
Private Nachricht senden Benutzer-Profile anzeigen
 
estorilblau
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 01.10.12
Wohnort: München
Version: R2006a, R2007b, R2010b
     Beitrag Verfasst am: 10.10.2012, 11:58     Titel:
  Antworten mit Zitat      
Hallo,

wenn dein code oben so aufgerufen wird, erstellst du glaube ich jedem Aufruf der cursor Funktion ein neues Axes-Object.
Das vorhandene Axes-Object sprichst du mit
Code:
set(gcf,'CurrentAxes',deinaxes);

an.

Hoffe das hilft.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gusa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 05.10.12
Wohnort: Freising
Version: ---
     Beitrag Verfasst am: 10.10.2012, 16:19     Titel:
  Antworten mit Zitat      
Hi,

vielen Dank! Bin schon mal ein Schritt weiter. Anscheinend hat die Funktion die axes nicht mehr als current axes gesehen. Dank deiner Ergaenzung kann ich durch erneutes Aufrufen der cursor function, und zwar nach dem bedienen der zoom funktion, die linien wieder ziehen! Hab aber trotzdem noch n kleines problem. Wenn ich in eine bestimmten bereich gezoomt habe und die cursor funktion aufrufe, setzt er mir die linie nicht in die mitte vom plot. Also muss man ylim,xlim auch irgendwie updaten oder?

VG
Andi
Private Nachricht senden Benutzer-Profile anzeigen
 
estorilblau
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 01.10.12
Wohnort: München
Version: R2006a, R2007b, R2010b
     Beitrag Verfasst am: 10.10.2012, 16:25     Titel:
  Antworten mit Zitat      
Hallo,

Auslesen der neuen Werte:
Code:
get(gca,'XLim');
get(gca,'YLim');


Diese Werte dann in der Cursor Funktion angepasst an die Linie setzen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gusa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 05.10.12
Wohnort: Freising
Version: ---
     Beitrag Verfasst am: 11.10.2012, 12:51     Titel:
  Antworten mit Zitat      
Hi,

hab ich auch in meinem code drin. Funktioniert aber nicht.

VG
Andi
Private Nachricht senden Benutzer-Profile anzeigen
 
Gusa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 05.10.12
Wohnort: Freising
Version: ---
     Beitrag Verfasst am: 11.10.2012, 13:05     Titel:
  Antworten mit Zitat      
Der Fehler liegt in der Anweisung:

line([(x_lim(2)/2) (x_lim(2)/2)],...)

Denn wenn ich schreibe:

line(xlim,ylim,...)

Mach der das ohne Probleme nach dem zoomen.

Meine Idee war: nimm xmax, teile durch 2. Dann muesste die Linie ja in die Mitte gesetzt werden. Mach er aber nicht nach dem zoomen. Wenn ich noch nicht reingezoomt habe, ist es keine Problem. Wie kann ich anders programmieren, dass die Linie in die Mitte gesetzt wird?

VG
Andi
Private Nachricht senden Benutzer-Profile anzeigen
 
Gusa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 05.10.12
Wohnort: Freising
Version: ---
     Beitrag Verfasst am: 11.10.2012, 13:12     Titel:
  Antworten mit Zitat      
also ich meine vertikal in die Mitte vom Plot.....
Private Nachricht senden Benutzer-Profile anzeigen
 
Gusa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 05.10.12
Wohnort: Freising
Version: ---
     Beitrag Verfasst am: 11.10.2012, 14:14     Titel:
  Antworten mit Zitat      
Ok, ich habs. Man muss natuerlich nach dem zoomen den Offset dazu addieren!

line([((x_lim(2)-x_lim(1))/2)+x_lim(1)
((x_lim(2)-x_lim(1))/2)+x_lim(1)],y_lim

jetzt wird die Linie ungefaehr in die Mitte gesetzt! Very Happy

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