Использование панели переключателей для выбора различных графических параметров - PullRequest
1 голос
/ 20 июля 2009

Я пытаюсь создать графический интерфейс, который будет принимать несколько входов и выполнять их через несколько функций. Я хочу использовать панель переключателей для переключения между различными графиками, но я просто не могу заставить ее работать. Вот пример моего кода.

switch get(eventdata.NewValue,'Tag')   % Get Tag of selected object
    case 'button1'
        status1 = str2double(get(handles.button1,'Value'));
        if status1 == 1;
            axes(handles.axes1)

            grid on;
            plot(x1,y1)

        end
    case 'button2'
        status2 = str2double(get(handles.button2,'Value'));
        if status2 == 1;
            axes(handles.axes1)

            grid on;
            plot(x2,y2)
        end

    case 'button3'
        status3 = str2double(get(handles.button3,'Value'));
        if status3 ==1
            plot(x3,y3)
        end

    otherwise
        % Code for when there is no match.

end

Ответы [ 2 ]

1 голос
/ 21 июля 2009

Похоже, что вы пытаетесь создать панель радиокнопок способом, аналогичным в этом учебном примере на blinkdagger.com . В частности, я считаю, что вы пытаетесь создать SelectionChangeFcn , чтобы определить, как переключатели изменяют ваш графический интерфейс. Я бы предложил следующее:

Во-первых, вместо того, чтобы заново планировать линию при каждом выборе радиокнопки, я бы посоветовал вам построить все свои линии при создании графического интерфейса, а затем настроить свойство «Видимые» линий на «Вкл» или «Выкл» в зависимости от того, какая кнопка выбрана. Когда вы создаете GUI, вы можете добавить эти строки где-нибудь в вашем коде (после того, как оси созданы и помещены в переменную handles):

handles = guidata(hObject);  % Retrieve handles structure for GUI
set(handles.axes1,'NextPlot','add');  % Set axes to allow multiple plots
lineHandles = [plot(handles.axes1,x1,y1,'Visible','off') ...
               plot(handles.axes1,x2,y2,'Visible','off') ...
               plot(handles.axes1,x3,y3,'Visible','off')];
handles.lineHandles = lineHandles;  % Update handles structure
guidata(hObject,handles);  % Save handles structure

Это построит три набора линий на одной оси. Эти линии изначально не видны, а маркеры каждой построенной линии собраны в векторную переменную lineHandles. Последние две строки выше добавляют дескрипторы строк к структуре дескрипторов и обновляют данные GUI (hObject должен быть дескриптором окна рисунка GUI!).

Теперь вы можете использовать для SelectionChangeFcn следующее:

handles = guidata(hObject);  % Retrieve handles structure for GUI
buttonTags = {'button1' 'button2' 'button3'};
if ~isempty(eventdata.OldValue),          % Check for an old selected object
  oldTag = get(eventdata.OldValue,'Tag'),   % Get Tag of old selected object
  index = strcmp(oldTag,buttonTags);     % Find index of match in buttonTags
  set(handles.lineHandles(index),'Visible','off');       % Turn old line off
end
newTag = get(eventdata.NewValue,'Tag'),   % Get Tag of new selected object
index = strcmp(newTag,buttonTags);     % Find index of match in buttonTags
set(handles.lineHandles(index),'Visible','on');         % Turn new line on
guidata(hObject,handles);  % Save handles structure

ПРИМЕЧАНИЕ: Если вы когда-нибудь захотите изменить какую-либо из трех построенных линий, вы можете просто установить свойства 'XData' и 'YData' одного из дескрипторов линии. Например, это обновляет первую построенную линию новыми данными x и y:

set(handles.lineHandles(1),'XData',xNew,'YData',yNew);
0 голосов
/ 21 июля 2009

Если у вас нет веских причин поступить иначе, я думаю, вы должны поместить код построения внутри обратного вызова для каждой радиокнопки.

Не нужно делать этот большой коммутатор.

% --- Executes on button press in radiobutton1.
function radiobutton1_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of radiobutton1
%%
%get the values of x y into this callback as you see fit
plot(x,y)

Кроме того, «значение», которое выходит из кнопки, уже является двойным для переключателей. Не нужно конвертировать, как вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...