Обновление осей GUI в MATLAB - PullRequest
1 голос
/ 24 марта 2010

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

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

Кто-нибудь может порекомендовать какие-нибудь хорошие примеры, которые показывают, как это сделать, или у кого-нибудь есть предложения, как выполнить обновление осей?


Вот обратный вызов ползунка (я не включил функцию create_fcn). Кроме того, в коде много комментариев, так как я использовал функцию Guide для создания GUI.

Обратите внимание, что входной сигнал для ползунка - это пропорция общей длины луча (в виде десятичной дроби).

function PointLoadxx1posslider_Callback(hObject, eventdata, handles)
% hObject    handle to PointLoadxx1posslider (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider

PLxx1pos = get(handles.PointLoadxx1posslider,'value');

set(handles.PLxx1posedit, 'String', num2str(PLxx1pos));
l = 3000; % This is the Length of the beam

zpl1 = get(handles.PointLoadxx1posslider,'value')*l; 
  % Multiplies the position decimal by the overall length

LoadPlotter(hObject,zpl1,handles) % Sends the command to the plot plot function


guidata(hObject,handles);



function LoadPlotter(hObject,zpl1,handles)

% The following draws the beam supports as lines
SH = l/20; %Height of supports


line([0 l], [SH/2  SH/2])
line([-SH/2 SH/2], [0 0])
line([-SH/2 0], [0 SH/2])
line([0 SH/2], [SH/2 0])

line([l-SH/2 l+SH/2], [0 0])
line([l-SH/2 l], [0 SH/2])
line([l l+SH/2], [SH/2 0])


xlim([ -100 l+200])
ylim([-l/2 l/2])

%Draw Load position
% zpl1 = get(handles.PointLoadxx1posslider,'value')*l;

% zpl1 = 0.5*l;
zpl2 = 0.2*l;

PL1 = 50; 
%This is the value of the point load applied to the beam, which will 
be an input from another slider


PL1Draw = line([zpl1 zpl1],[SH/2 PL1*10]); 


% refresh(handles.axes1); 
guidata(hObject,handles);

Очевидно, что я хотел бы сохранить другие линии нарисованными, но измените PL1Draw при перемещении ползунка. Пожалуйста, вы можете объяснить, что я должен пометить для этого?

Большое спасибо заранее.

Джеймс

Ответы [ 2 ]

1 голос
/ 24 марта 2010

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

Чтобы изменить детали, которые нужно изменить, самый простой способ - просто удалить их, а затем перерисовать. Чтобы удалить определенные элементы из графика, лучше всего пометить их. Таким образом, ваш график будет выглядеть так

%# remove the old position
%# find the handle to the old position by searching among all the handles of 
%# the graphics objects that have been plotted into the axes
oldPosHandle = findall(handles.axes1,'Tag','position');
delete(oldPosHandle);

%# plot new position
PL1Draw = line([zpl1 zpl1],[SH/2 PL1*10]); 
%# add the tag so that you can find it if you want to delete it
set(PL1Draw,'Tag','position');

Примечание 1

Чтобы графический интерфейс реагировал быстрее (при необходимости), не удаляйте и не перерисовывайте, а изменяйте свойства 'XData' и 'YData' старого объекта позиции.

Примечание 2

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

EDIT

Я обновил команды. Обратите внимание, что нет специальной функции тегирования. «Тег» - это свойство каждого графического объекта, например «Единицы» или «Цвет». Это просто поможет вам пометить графические объекты, чтобы вам не нужно было помнить маркеры.

0 голосов
/ 24 марта 2010

Не относится к актуальному вопросу, но связано с проектом:

http://www.mathworks.com/matlabcentral/fileexchange/2170

Эта книга все еще доступна для использования на Amazon, она может сэкономить вам много времени для написания материалов по механике материалов. Я написал это около 12 лет назад как студент, но я думаю, что код MATLAB все еще должен быть функциональным.

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