在MATLAB中更新GUI轴

时间:2010-03-24 13:33:38

标签: user-interface matlab

我正在为我创建的程序制作GUI,我需要能够沿着梁改变载荷的位置。我已正确设置轴和滑块,但我不确定如何更新轴,因为我找不到任何显示如何在互联网上执行此操作的示例。

目前,当我移动负载时,位置会正确更新,但旧位置也会保留在屏幕上,这非常烦人。

任何人都可以推荐任何展示如何做到的好例子,或者有人建议如何刷新轴吗?


这是滑块回调(我没有包含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 个答案:

答案 0 :(得分:1)

我假设您已经绘制了一个光束,当您更改滑块值时,该光束应该会弯曲。由于您可以将新位置绘制到轴中,我假设您知道如何编写回调。我进一步假设情节的某些部分应该保持不变,以及应该改变的部分。

要更改需要更改的部分,最简单的方法就是删除它们然后再重绘。要从绘图中删除特定项目,最好标记它们。因此,你的绘图就像这样

%# 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

要使GUI响应更快(如果需要),请不要删除并重新绘制,而是更改旧位置对象的“XData”和“YData”属性。

注2

如果您还没有这样做,请将绘图功能(更新绘图中的所有内容,而不仅仅是加载位置)放在一个单独的函数中,而不是放入滑块的回调中,而是改为滑块回调调用绘图函数。这样,您可以从多个按钮和滑块调用相同的绘图功能,这使代码更容易维护。

修改

我已经更新了命令。请注意,没有特殊的“标记”功能。 “标记”是每个图形对象的属性,如“单位”或“颜色”。它只是帮助您标记图形对象,以便您不需要记住句柄。

答案 1 :(得分:0)

与实际问题无关,但与项目有关:

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

这本书仍然可以在亚马逊上使用,它可能会为你节省很多材料力学的东西。我大约12年前作为本科生写过这篇文章,但我认为MATLAB代码应该仍然有用。