我正在为我创建的程序制作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。请你能解释一下我应该做什么标记吗?
非常感谢提前。
詹姆斯
答案 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代码应该仍然有用。