分享

Matlab?的可视化界面设计

 无疆zg 2011-01-13

Matlab 的可视化界面设计(上)

一个可发布的应用程序通常都需要具备一个友好的图形界面(比如,我们开课时或给学生上课而使用课件时,我们一般就会用到可视化界面)。这样用户不需要知道应用程序究竟是怎样执行各种命令的, 而只需要了解可见界面组件的使用方法用户也不需要知道命令是如何执行, 只要通过与界面交互就可以使指定行为得以正确执行。
MATLAB可视化界面的设计, 一般有两种方法, 一是直接通过编辑M脚本文件产生GUI(这个方法就是我们在前面学习过的如何编写、调用M文件), 二是通过MATLAB图形用户界面开发环境GUIDE(Graphical User Interface Development Environment)来形成相应文件。这里只讲述在GUIDE环境中利用控件实现可视化界面功能, 不探讨直接通过编辑脚本文件实现可视化界面的方法。


MATLAB软件GUIDE为用户提供了一个方便高效的集成环境, 所有GUI支持的用户控件都集成在这个环境中, 并提供界面外观、属性和行为响应方式的设置方法。GUIDE将用户保存设计好的GUI界面保存在一个FIG资源文件中, 同时自动生成包含GUI初始化和组件界面布局控制代码的M文件, 为实现回调函数提供了一个参考框架。


下面以一个具体实例来说明GUIDE的开发使用以下所讲解的关于各控件的使用, 我们以MATLAB7.0版本为调试环境, 如果版本的环境和版本略有不同,但基本思想和方法一致。为了方便大家学习,此处提供二个版本(即文字和视频,文字的即为下面的叙述,视频请点击此处。)

实例要完成的功能如下:

首先运行M文件后,出现一个主画面

Matlab <wbr>的可视化界面设计(上)



当分别点击按钮“螺旋线”、“内摆线”、“圆旋转成圆环”和“退出”命令按钮时,分别出现如下列图示的动态、静态的结果。

lxx

螺旋线图

nbx

内摆线图

yuan

圆动成环图

tuichu

退出信息图

下面看具体的操作步骤:

1)启动Matlab并进入GUIDE环境:在Command Window下输入“guide”,进入GUIDE环境。出现如下图所示的界面(写到这里,发现文字叙述很繁琐,但还得写,要命)。这里Matlab提供了一个新建空白界面及三个样本界面,它们分别是:GUI with Uicontrols;GUI with Axes and Menu;Modal Question Dialog;当然还有一个标签是用来打开已经编写好的GUI的。一般来说,我们会用Blank GUI,即空白的界面来写自己的东西。进入后,Matlab就新建了一个fig文件(默认名是untitled.fig),同时得到如下的编辑窗口:

fig

从上图我们可以看出Matlab 的Guide环境可以分为三个部分即菜单栏和工具栏、用户控件集、用户界面编辑窗口。菜单栏,暂时不作介绍,我们主要使用用户控件集(其它软件一般称为工具箱),用户控件集主要有命令按钮(Push Button)、切换按钮(Toggle Button)、单选按钮(Radio Button)、复选框按钮(Checkbox)、编辑框(Edit Button)、静态文本框(Static Button)
、滚动杆(Slider)、列表框(Listbox)、弹出式菜单(Pop-menu)、坐标轴(Axes)等。严格地讲, 坐标轴不能算控件的范畴。用户界面编辑窗口用于对受控的图形窗口进行编辑, 比如添加按钮、静态文本框等。

2)在用户界面编辑窗口添加相应控件(终于可以做具体的事了,这个就简单了,哈哈)
 
 

首先,在用户界面编辑窗口添加4个命令按钮(显示是OK的用个PUSH BUTTON),再如下图所示添加5个静态文本框(Static Text)、5个编辑文本框(Edit Text)和一个坐标系(Axes)

shili1

其次,按下表设置每个控件的属性值(具体操作是:右击要设置属性的控件——property inspector 命令——在弹出的属性窗口中找到相应的属性名称——将该属性的值修改成自己需要的值)

 

控件名 属性 属性修改值
PushButton1 FontSize 16
String 螺旋线
Tag pushbuttonLxx
PushButton2 FontSize 16
String 内摆线
Tag pushbuttonNBX
PushButton3 FontSize 16
String 圆旋转成圆环
Tag pushbuttonCtoC
PushButton4 FontSize 16
String 退出
Tag pushbuttonExit
Static Text1 String 大圆半径
Static Text2 String 小圆半径
Static Text3 String 修正值
Static Text4 String 圆半径
Static Text5 String 离转轴的距离
Edit Text1 String 空或设置成一个适定值,如10
Tag editBCR
Edit Text2 String 空或设置成一个适定值,如2
Tag editSCR
Edit Text3 String 空或设置成一个适定值,如1
Tag editXZZ
Edit Text4 String 空或设置成一个适定值,如4
Tag editCR
Edit Text5 String 空或设置成一个适定值,如10
Tag editBExit

 

注:上面控件名称的编号,比如1,2之类,在界面上是没有的,只是我按照从上到下的次序,为方便叙述而编写的。

最后,添加程序(在添加程序前,最好先将文件保存一下,比如以Exp8.m为文件名保存),添加程序的常用方法是:单击菜单命令view——M-file Editor,此时,得到下面的程序:

function varargout = Exp8(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @Exp8_OpeningFcn, ...
                   'gui_OutputFcn',  @Exp8_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
%上面的是系统初始化代码,绝对不要去修改它们。


function Exp8_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;

guidata(hObject, handles);

%上面的代码,告诉我们,一般的用户界面的自己设置的初始化状态应添加在这个函数内。

function varargout = Exp8_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;

%上面的函数返回的量直接到命令窗口。

function pushbuttonLxx_Callback(hObject, eventdata, handles)
%上面的函数是点击螺旋线按钮时,执行的代码,即可以在此处添加有关螺旋线的程序代码。

function pushbuttonNBX_Callback(hObject, eventdata, handles)
%上面的函数是点击内摆线按钮时,执行的代码,即可以在此处添加有关内摆线的程序代码。


% --- Executes on button press in pushbuttonExit.
function pushbuttonExit_Callback(hObject, eventdata, handles)
%上面的函数是点击退出按钮时,执行的代码,即可以在此处添加退出时的程序代码。

function editBCR_Callback(hObject, eventdata, handles)
%上面的函数是 editBCR这个编辑文本按钮回调时,执行的代码。

BigCircleRadial=str2double(get(hObject,'String'));

function editBCR_CreateFcn(hObject, eventdata, handles)
if ispc
    set(hObject,'BackgroundColor','white');
else
    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end

 %上面的函数用来在程序中设置editBCR的属性值。

 

function editSCR_Callback(hObject, eventdata, handles)
%上面的函数是editSCR这个编辑文本按钮回调时,执行的代码。

function editSCR_CreateFcn(hObject, eventdata, handles)
if ispc
    set(hObject,'BackgroundColor','white');
else
    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end

 %上面的函数用来在程序中设置editSCR的属性值。

 

function editXZZ_Callback(hObject, eventdata, handles)
%上面的函数是editXZZ这个编辑文本按钮回调时,执行的代码。


function editXZZ_CreateFcn(hObject, eventdata, handles)
if ispc
    set(hObject,'BackgroundColor','white');
else
    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end

 %上面的函数用来在程序中设置editXZZ的属性值。


function pushbuttonCtoC_Callback(hObject, eventdata, handles)
%上面的函数是点击圆旋转成圆环按钮时,执行的代码,即可以在此处添加圆旋转成圆环时的程序代码。

function editCR_Callback(hObject, eventdata, handles)
%上面的函数是editCR这个编辑文本按钮回调时,执行的代码。

function editCR_CreateFcn(hObject, eventdata, handles)
if ispc
    set(hObject,'BackgroundColor','white');
else
    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end

 %上面的函数用来在程序中设置editCR的属性值。

function editDist_Callback(hObject, eventdata, handles)

function editDist_CreateFcn(hObject, eventdata, handles)
if ispc
    set(hObject,'BackgroundColor','white');
else
    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
 %上面的函数用来在程序中设置editDist的属性值。

下面真正添加自己的程序,最后成的程序如下:自己添加的程序用红色表示。

function varargout = Exp8(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @Exp8_OpeningFcn, ...
                   'gui_OutputFcn',  @Exp8_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
%上面的是系统初始化代码,绝对不要去修改它们。


function Exp8_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;

guidata(hObject, handles);

%这里选择了一个图片文件,作为初始画面,具体的图片可以选择自己喜欢的。
map1=imread('Water lilies.jpg');
image(map1)

%上面的代码,告诉我们,一般的用户界面的自己设置的初始化状态应添加在这个函数内。

function varargout = Exp8_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;

%上面的函数返回的量直接到命令窗口。

function pushbuttonLxx_Callback(hObject, eventdata, handles)
%上面的函数是点击螺旋线按钮时,执行的代码,即可以在此处添加有关螺旋线的程序代码。

axes(handles.axes1)
cla
v=2;
alf=pi/6;
omg=pi/5;
t=0:0.01:100;
x=v*sin(alf).*cos(omg*t).*t;
y=v*sin(alf).*sin(omg*t).*t;
z=v*cos(alf).*t;
%plot3(x,y,z)
axis([-100 100 -100 100 0 160])
grid on
axis equal on
comet3(x,y,z)

%上面的程序是“一质点,沿着已知圆锥面的一条直母线自圆锥的顶点起,作等速直线运动,另一方面这一条母线在圆锥面上,过圆锥的顶点绕圆锥的轴(旋转轴)作等速的转动,这时质点在圆锥面上的轨迹”的动态形成过程。

function pushbuttonNBX_Callback(hObject, eventdata, handles)
%上面的函数是点击内摆线按钮时,执行的代码,即可以在此处添加有关内摆线的程序代码。

axes(handles.axes1)
cla
a=str2double(get(handles.editBCR,'String'));
b=str2double(get(handles.editSCR,'String'));
k=str2double(get(handles.editXZZ,'String'));
axis([-a-2 a+2 -a-2 a+2 0 a+2])
line([-a-2,a+2],[0,0]);

hold on
line([0,0],[-a-2,a+2
u=0:pi/30:2*pi;
x=a*cos(u);
y=a*sin(u);
plot(x,y)
x=b*cos(u)+a-b;
y=b*sin(u);
plot(x,y)
axis equal on
grid on
theta=0:pi/1800:k*a*pi;
x=(a-b)*cos(b/a*theta)+b*cos((a-b)/a*theta);
y=(a-b)*sin(b/a*theta)-b*sin((a-b)/a*theta);
comet(x,y)

%上面的程序是内摆线的动态的形成过程


% --- Executes on button press in pushbuttonExit.
function pushbuttonExit_Callback(hObject, eventdata, handles)
%上面的函数是点击退出按钮时,执行的代码,即可以在此处添加退出时的程序代码。

ss=questdlg('你真的要退出吗?','退出信息窗口!','不,我还想看看!','是的,我要退出!','是的,我要退出!');
switch ss
    case '是的,我要退出!'
        delete(handles.figure1);
end

%上面的程序是退出程序时信息窗口

function editBCR_Callback(hObject, eventdata, handles)
%上面的函数是 editBCR这个编辑文本按钮回调时,执行的代码。

function editBCR_CreateFcn(hObject, eventdata, handles)
if ispc
    set(hObject,'BackgroundColor','white');
else
    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end

 %上面的函数用来在程序中设置editBCR的属性值。

 

function editSCR_Callback(hObject, eventdata, handles)
%上面的函数是editSCR这个编辑文本按钮回调时,执行的代码。

function editSCR_CreateFcn(hObject, eventdata, handles)
if ispc
    set(hObject,'BackgroundColor','white');
else
    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end

 %上面的函数用来在程序中设置editSCR的属性值。

 

function editXZZ_Callback(hObject, eventdata, handles)
%上面的函数是editXZZ这个编辑文本按钮回调时,执行的代码。


function editXZZ_CreateFcn(hObject, eventdata, handles)
if ispc
    set(hObject,'BackgroundColor','white');
else
    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end

 %上面的函数用来在程序中设置editXZZ的属性值。


function pushbuttonCtoC_Callback(hObject, eventdata, handles)
%上面的函数是点击圆旋转成圆环按钮时,执行的代码,即可以在此处添加圆旋转成圆环时的程序代码。

axes(handles.axes1)
cla
%a=4;
%b=10;
a=str2double(get(handles.editCR,'String'));
b=str2double(get(handles.editDist,'String'));
u=0:pi/30:2*pi;
y=a.*cos(u)+b;
z=a.*sin(u);
n=length(u);
x=0*ones(1,n);
if a<b
axis([-b-2 b+2 -b-2 b+2 -a-2 a+2])
else
axis([-a-2 a+2 -a-2 a+2 -b-2 b+2])
end
plot3(x,y,z)
pause(1)
for t=0:pi/60:2*pi
    x=y.*sin(t);
    y1=y.*cos(t);
    plot3(x,y1,z)
    pause(0.1)
    grid on
    hold on
    %axis equal on
    %view([-20,0])
end

%上面的程序是圆旋转成圆环的动态的形成过程

function editCR_Callback(hObject, eventdata, handles)
%上面的函数是editCR这个编辑文本按钮回调时,执行的代码。

function editCR_CreateFcn(hObject, eventdata, handles)
if ispc
    set(hObject,'BackgroundColor','white');
else
    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end

 %上面的函数用来在程序中设置editCR的属性值。

function editDist_Callback(hObject, eventdata, handles)

function editDist_CreateFcn(hObject, eventdata, handles)
if ispc
    set(hObject,'BackgroundColor','white');
else
    set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
 %上面的函数用来在程序中设置editDist的属性值。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多