Slider with non consecutive values

2 visualizaciones (últimos 30 días)
Moritz H
Moritz H el 16 de Jun. de 2016
Comentada: Adam el 17 de Jun. de 2016
Hey!
My problem is: I have an object with a range of ID which are not always consecutive.
[handles.trajects{1:20,1}]
ans =
Columns 1 through 9
10816049 10818824 10818825 10818826 10818827 10818828 10818829 10818830 10818831
Columns 10 through 18
10818832 10818833 10819059 10819395 10819396 10819397 10819398 10819399 10819401
Columns 19 through 20
10819402 10819403
I want the user to be able to select the ID through a slider in my GUIDE GUI. This is how its setup:
%set slider
set(handles.slider, 'Max', max([trajects{:,1}]));
set(handles.slider, 'Min', min([trajects{:,1}]));
set(handles.slider, 'Value', min([trajects{:,1}]));
handles.lastSliderValue = min([trajects{:,1}]);
set(handles.slider, 'SliderStep', [1/(max([trajects{:,1}])-min([trajects{:,1}])) 1/20]);
guidata(hObject,handles);
In this case the Min/Max are 10816049 and 12262539. I want the slider to go to the NEXT/PREVIOUS ID if the user clicks the arrows (SliderStep 1, diff=1) and to the NEAREST ID when the user slides to some other position. Here is the code to achieve this:
function slider_Callback(hObject, eventdata, handles)
disp(num2str(get(handles.slider,'Value')));
sliderValue = get(hObject, 'Value');
sliderValue = round(sliderValue);
trajects = handles.trajects;
%check if last value was 1 away
diff = sliderValue - handles.lastSliderValue;
if abs(diff) == 1
%go to next flightID
traj_idx = find([trajects{:,1}] == handles.lastSliderValue) + diff;
else
%calculate the nearest flightID
[~, traj_idx] = min(abs([trajects{:,1}] - sliderValue));
end
set(hObject, 'Value', trajects{traj_idx,1});
%make the selected ID in the plot...
%...
handles.lastSliderValue = trajects{traj_idx,1};
guidata(hObject,handles);
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
disp(num2str(get(handles.slider,'Value')));
The problem is: Lets say I am on 10818824 (handles.lastSliderValue is on 10818824). Clicking the arrow left displays 10817966 and clicking right displays 10817968. It seems the slider is stuck on 10817967 internally. Checking by clicking pushbutton7 displays the correct value 10818824. I cannot seem to find the problem :(

Respuesta aceptada

Adam
Adam el 16 de Jun. de 2016
If you have your slider values in an array then just map onto them and use the id (which is consecutive) into the array as the value in the slider. Then you can just have a min of 1, a max of 20 and index into your array of true values based on the slider value.
  2 comentarios
Moritz H
Moritz H el 17 de Jun. de 2016
This worked. Thank you for that! Actually way more intuative... What a brainfart! :D It still bothers me that I could not find out the reason why matlab behaves weird in the situation above...
Adam
Adam el 17 de Jun. de 2016
Yeah, I'm not sure exactly what was going on there, I basically jumped over it to make that suggestion as it is how I have programmed irregular sliders in the past and is much easier.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Graphics Object Programming en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by