Verfasst am: 12.03.2016, 11:11
Titel: Problem beim Ein-/Ausschalten eines slider Objektes
Hallo goMatlab Forum,
ich arbeite gerade an einer Funktion zur Zoom Orientierung, ähnlich der scrollplot Funktion aus dem FEX. Die Funktion fügt zu einer existierenden axes, zwei neue kleinere axes und zwei slider für die x und y Zoom Orientierung ein. Das schwarze Viereck in den kleinen axes unten und links zeigt jeweils den zoom Bereich aus der main axis. Bewegt man den slider, wird das Viereck entsprechend verschoben und der Zoombereich im main axes entsprechend geändert.
Nehmen wir mal den x-zoom Bereich, dann wird der x-slider wie folgt gesetzt:
Code:
% x-zoom Bereich im main axes
limX = get('handle main axes','XLim');
MinVal = ...% XLim(1) bei FULL view -> Werte wurden an anderer Stelle im Code ermittelt
MaxVal = ...% XLim(2) bei FULL view -> Werte wurden an anderer Stelle im Code ermittelt
% von MaxValue wird die Fensterbreite des zoom-Bereichs ( diff(limX) ) abgezogen, damit das schwarze Rechteck rechts/oben nicht über die Plotgrenzen hinaus geschoben werden kann. set('handle x-slider','Min',MinVal,'Max',Max-val - diff(limX))
Soweit funktioniert der Code auch wie gewünscht. Nun zu meinem Problem. Befindet sich die main axes in full view, darf ja der slider das schwarze Viereck nicht bewegen. Ansonsten würde er sich über die Signalgrenzen bewegen. Dafür überprüfe ich die slider Max/Min Werte mit den limits der main axes. Siehe Funktion Zeile 330ff
Code:
% check if main axes is in full view, disable slider ifget(handles.xSlider,'Min') == handles.limX(1) && get(handles.xSlider,'Max') == handles.limX(1) set(handles.xSlider,'Enable','inactive') else set(handles.xSlider,'Enable','on') end
Setze ich einen Breakpoint in die Zeile mit der Deaktivierung des Sliders, ist das Verhalten wie gewünscht. Bei full view ist der Slider gesperrt. Aber gibt es keinen Breakpoint, erhalte ich folgende Warnung und der Slider verschwindet.
Code:
Warning: 'slider' control cannot have a 'Value' outside of 'Min'-'Max' range
Control will not be rendered until all of its parameter values are valid
> In zoomOrientation at 228
In zoomTEST at 30
Ich habe den Fehler gefunden. Ich Depp habe Max,Min und Value der sliders vorher verändert, bevor ich die slider bei full view deaktiviere . Liegt Value dann außerhalb Min und Max, kommt logischweise die Fehlermeldung.
So muss die Callback aussehen:
Code:
% ActionPostCallback for mouse clicks function MouseAction(~,~)
handles = getappdata(axh,'zoomOrientation');
% get new limits
handles.limX = get(axh,'XLim');
handles.limY = get(axh,'YLim');
% check if main axes is in full view, true = disable slider if handles.limX(1) <= get(handles.xSlider,'Min') && handles.limX(1) >= (handles.dataLim(2) - diff(handles.limX)) set(handles.xSlider,'Enable','off') set(handles.ySlider,'Enable','off') else set(handles.xSlider,'Enable','on') set(handles.ySlider,'Enable','on') % update sliders set(handles.xSlider,'Max',handles.dataLim(2) - diff(handles.limX)) set(handles.ySlider,'Max',handles.dataLim(4) - diff(handles.limY)) set(handles.xSlider,'Value',handles.limX(1)) set(handles.ySlider,'Value',handles.limY(1)) end
% update x zoom window (rectangle)
pos = get(handles.hZoomXWin,'Position');
set(handles.hZoomXWin,'Position',[handles.limX(1),pos(2),diff(handles.limX),pos(4)]);
% update y zoom window (rectangle)
pos = get(handles.hZoomYWin,'Position');
set(handles.hZoomYWin,'Position',[pos(1),handles.limY(1),pos(3),diff(handles.limY)]);
% save handles setappdata(axh,'zoomOrientation',handles) end
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.