Похоже, что вы пытаетесь создать панель радиокнопок способом, аналогичным в этом учебном примере на 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);