Basicamente, a interface visual se baseia em um arquivo do tipo figura (*.fig) que irá operar em conjunto com o código desenvolvido em um arquivo *.m. Usualmente, o desenvolvedor somente necessita implementar as funções de resposta aos eventos desencadeados pelos objetos da figura (como botões e caixas de texto). A maioria do código que cria o objeto figura e dispõe os objetos gráficos é automaticamente criada pelo MATLAB em conjunto com o GUIDE. Isso faz com que se tenha grande nível de abstração, focando apenas nas atividades desencadeadas pelas ações do usuário na interface.
Além da estrutura básica do código, o GUIDE fornece templates prontos para as funções de resposta, o que facilita e agiliza muito o desenvolvimento da aplicação.
O GUIDE também fornece uma ferramenta que permite o desenvolvimento de menus para a aplicação (como as abas: Arquivo, Editar, Ajuda em programas visuais), o que com certeza torna a aplicação versátil e poderosa.
Para iniciar a ferramenta GUIDE, basta escrever guide na janela de comandos. A janela
abaixo será apresentada.
Nesta janela é possível utilizar templates prontos de GUI (Graphical User Interface - Interface Gráfica de Usuário). Ou inclusive abrir uma interface já existente. Para nosso primeiro exemplo, selecione Blank GUI. E pressione OK.
Nesta janela, a interface gráfica será desenvolvida (projetada). Na barra da esquerda, estão dispostos os vários objetos gráficos que podem ser utilizados para criar as mais diversas aplicações. Esses objetos são apresentados na imagem abaixo, com exceção dos controles ActiveX.
Nessa janela é possível modificar algumas propriedades da interface, como permitir ou não redimensionamento a janela. No momento, aconselha-se que outras propriedades não sejam modificadas, mantendo as opções como na figura acima.
O GUIDE possui uma barra de ferramentas muito útil para desenvolvimento de menus e para adicionar uma barra de ferramentas para a própria aplicação, como será visto adiante.
Da esquerda para a direita:
Nova Figura; Abrir; Salvar; Recortar; Copiar; Colar; Desfazer; Refazer; Alinhar Objetos; Editor de Menus; Editor da Ordem do botão Tab; Editor da Barra de Ferramentas; Editor do M-File; Inspetor de Propriedades; Navegador de Objetos; Rodar Figura.
Algumas ferramentas são auto-explicativas. Uma menção especial ao Editor de Menus e ao Editor de Ferramentas, os quais permitem inserir menus e uma barra de ferramentas às aplicações, e serão estudados em pormenor nas próximas aulas.
Para entender como desenvolver uma aplicação gráfica e como o MATLAB fornece meios para manipular os objetos no código, desenvolveremos uma aplicação extremamente simples, que imprime no terminal uma frase quando um botão é pressionado.
Para iniciar, crie uma pasta para salvar os arquivos da aplicação, e selecione-a como a pasta corrente. Após, abra o GUIDE e crie uma nova figura como abaixo, adicionando apenas um botão na janela. É possível modificar o nome do botão, manipulando as propriedades através do inspetor de propriedades .
Perceba agora uma diferença fundamental: O objeto botão adicionado possui nome
pushbutton1, enquanto o texto apresentado ao usuário na aplicação é dado pela propriedade String do objeto. Modifique algumas propriedades utilizando o inspetor de propriedades.
Após terminar a figura, salve-a com o nome teste.fig.
Perceba que ao salvar a figura, um código foi automaticamente gerado em um arquivo .m com o nome da figura (no caso, teste.m é gerado na pasta corrente). Esse código (é uma função) será responsável por criar o objeto figura além de executar as funções de resposta aos eventos disparados pelos objetos da figura, que nesse caso é apenas um botão. Verifique isso clicando na ferramenta Object Browser .
No código gerado, atente para:
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
Trata-se da função de callback do evento associado ao ato de pressionar o botão na interface criada. O nome da função é gerada automaticamente, e sempre terá o nome do objeto seguido pela palavra Callback separadas pelo caractere underline. Existem outras callbacks associadas aos objetos que possuem outros nomes, como veremos adiante.
Os argumentos da função é que possibilitam a manipulação de toda a interface gráfica. • hObject é o objeto fonte da interrupção. No caso, o botão pushbutton1.
• eventdata trás informações sobre o evento acionado.
• handles é uma estrutura que contém referencias a todas os objetos utilizados na figura. Isso obviamente permite alteração das propriedades de qualquer objeto em tempo de execução. O usuário pode adicionar outras variáveis à estrutura
handles, o que permite que callbacks diferentes tenham acesso à essas
GUIDE - Continuação
Nesta aula veremos exemplos rápidos de como construir interfaces modais que retornam informação ao processo chamador. Por exemplo, como vimos há algumas aulas, o MATLAB possui janelas para questionamento (questdlg), porém, a própria janela aberta com essa função
apresenta limitações quanto ao número de botões que contém (no caso, somente três).
O guide possui um template pronto para janelas desse tipo, porém, faremos nossa janela
a partir de uma interface em branco. Isso tornará os exemplos mais simples.
Deve-se lembrar aqui a diferença entre uma figura modal e uma não-modal. Uma interface modal não permite a manipulação de outras janelas enquanto o usuário não atender à solicitação da janela corrente. Isso não significa que a execução do programa será interrompida. Vale lembrar que para tanto deve-se utilizar a função uiwait, que interrompe a execução normal do código.
Outro ponto que deve ser lembrado é que o guide faz uso de uma estrutura para que
informação seja passada entre as funções de retorno no tratamento dos eventos. Essa estrutura recebe o nome de handles. Vale salientar que a estrutura handles pode ser modificada de
maneira e inserir as variáveis necessárias para a aplicação, bastando adicionar o nome da variável concatenada ao nome de estrutura, por exemplo, handles.minha_variavel.
Com essas informações em mente, é possível continuar com nossas explicações.
Vale uma atenção especial à duas funções da interface gráfica. Quando a função é executada, usualmente a figura é carregada e a função OpeningFcn é executada, de modo a
preparar a inteface gráfica para o usuário.
Em uma aplicação não-modal e que não espera a resposta do usuário, a função
OutputFcn é executada logo após OpeningFcn. Lembre-se que a janela trabalha em conjunto
com as funções no arquivo .m com o mesmo nome, invocando as callbacks do arquivo quando
necessário. Observe que a janela de comando está acessível na execução de uma interface não-modal e que não utiliza a função uiwait. Note que a função OutputFcn utiliza varargout, um
vetor de células para que handles.output (variável padrão) seja retornada. É possível alterar o valor de handles.output ou ainda criar uma nova variável de saída.
Para melhor compreender o mecanismo, crie uma interface com apenas um botão (como a na figura abaixo) e salve-a em uma pasta.
Na função de saída, escreva o código:
function varargout = retorno_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
handles.output = toc(handles.tempo); %altera saída para verificar tempo % Get default command line output from handles structure
disp('Função de saída foi executada'); varargout{1} = handles.output
Note que a vírgula é omitida na última linha. Execute a aplicação e verifique a saída. Perceba que a função de saída é executada logo após a aplicação ser carregada.
Trata-se de uma aplicação não-modal que não aguarda que o usuário responda à solicitação do diálogo.
Para fazer com que a aplicação aguarde o comando do usuário, deve-se adicionar no final da função de abertura OpeningFcn o comando:
uiwait(handles.figure1); E deve-se utilizar o comando
uiresume(handles.figure1);
Para se retomar a execução normal da função associada à figura. Modifique a função de abertura como abaixo:
function retorno_OpeningFcn(hObject, eventdata, handles, varargin)
handles.tempo = tic; clc guidata(hObject, handles); uiwait(handles.figure1);
Para retomar a execução normal, adicione o código abaixo na função de callback do botão:
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) uiresume(handles.figure1);
Perceba que a aplicação apenas retornou quando a função uiresume foi executada.
É possível fazer a figura modal, bastando adicionar à função de abertura: set(handles.figure1,'WindowStyle','modal')
Note que a figura não é automaticamente fechada. Isso pode ser realizado mediante o comando delete. Altere a função de saída para o código abaixo:
function varargout = retorno_OutputFcn(hObject, eventdata, handles)
handles.output = toc(handles.tempo); disp('Função de saída foi executada'); varargout{1} = handles.output
delete(handles.figure1)
Outras callbaks que valem a pena serem estudadas são: KeyPressFcn, KeyReleaseFcn e CloseRequestFcn. A primeira é executada quando uma tecla do teclado é
pressionada, a segunda quando a tecla e solta e última quando o usuário tenta fechar a janela. Observe a interface abaixo, cujas funções estão dispostas na seqüência.
function teste_OpeningFcn(hObject, eventdata, handles, varargin)
handles.x = 0;
plot(handles.axes1,handles.x,0,'Marker','x');
set(handles.axes1,'Xlim',[-1.1 1.1],'Visible','off'); drawnow;
handles.output = hObject; guidata(hObject, handles);
set(handles.figure1,'WindowStyle','modal')
function varargout = teste_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
drawnow;
guidata(hObject,handles);
function figure1_KeyPressFcn(hObject, eventdata, handles)
if isequal(get(hObject,'CurrentKey'),'leftarrow') if handles.x > -1
handles.x = handles.x - 0.1; end
plot(handles.axes1,handles.x,0,'Marker','x');
set(handles.axes1,'Xlim',[-1.1 1.1],'Visible','off'); drawnow;
elseif isequal(get(hObject,'CurrentKey'),'rightarrow')
if handles.x < 1
handles.x = handles.x + 0.1; end
plot(handles.axes1,handles.x,0,'Marker','x');
set(handles.axes1,'Xlim',[-1.1 1.1],'Visible','off'); drawnow;
end
guidata(hObject, handles)
Atente que a função figure1_KeyPressFcn, pode ser criada através do inspetor de propriedades:
E
XERCÍCIOSExercício 1 Desenvolva uma interface de diálogo com 5 opções para responder à pergunta: O que você achou da disciplina? As opções são: Péssima, Ruim, Medíocre, Boa, Ótima. Faça com que a interface retorne o texto do botão.
Exercício 2 Considerando a função de transferência de segunda ordem apresentada abaixo:
𝐺𝐺(𝑠𝑠) = 𝑠𝑠2+ 2𝜉𝜉𝜔𝜔𝜔𝜔𝑛𝑛2
𝑛𝑛𝑠𝑠 + 𝜔𝜔𝑛𝑛2
A equação de magnitude da função de transferência em função da freqüência ω é dada pela equação:
|𝐺𝐺(𝑗𝑗𝜔𝜔)| = 𝜔𝜔𝑛𝑛2
�(𝜔𝜔𝑛𝑛2− 𝜔𝜔2)2+ (2𝜉𝜉𝜔𝜔𝑛𝑛𝜔𝜔)2
A magnitude é calculada em decibéis, fazendo:
20log(|𝐺𝐺(𝑗𝑗𝜔𝜔)|)
Trace um gráfico com a magnitude em decibéis em função da freqüência ω. Desenvolva uma interface gráfica que permita ao usuário manipular o fator de amortecimento (0.001 até 10) e a freqüência natural de ressonância de 0.1 até 10, observando o impacto de cada uma das variáveis no gráfico.