Disorganization of other components when adding the HTML component in MATLAB APP DESIGNER

4 visualizzazioni (ultimi 30 giorni)
Hello everyone,
I have a small application built in MATLAB APP DESIGNER. It is divided into a 2-PANEL APP (Left and Right). In the Right PANEL, there is a TABGROUP component that contains three TABS: IMAGE; HISTOGRAM; and HELP / SUPPORT, as shown in the figure below:
Inside each TAB, there is a PANEL component, and within each PANEL, I have AXES components for the IMAGE and HISTOGRAM TABS. Everything works fine until I add an HTML component inside the PANEL of the HELP / SUPPORT TAB, which will display a page with information about the application. When I do this, the other components become disorganized, as shown in the figure below.
Below, the figures demonstrate the disorganization of the components in the IMAGE and HISTOGRAM TABS.
Attached is the application code:
classdef segmentacao_palmeiras_tab_exported < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
GridLayout matlab.ui.container.GridLayout
LeftPanel matlab.ui.container.Panel
panelInfo matlab.ui.container.Panel
btnTipoSegmentacao matlab.ui.container.ButtonGroup
optSimples matlab.ui.control.RadioButton
optEspecies matlab.ui.control.RadioButton
txt_InfoGeo matlab.ui.control.Label
lbl_InfoGeo matlab.ui.control.Label
txt_InfoDim matlab.ui.control.Label
lbl_InfoDim matlab.ui.control.Label
txt_InfoLocal matlab.ui.control.Label
lbl_InfoLocal matlab.ui.control.Label
lbl_InfoImagem matlab.ui.control.Label
logoINPA matlab.ui.control.Image
logoUDESC matlab.ui.control.Image
RightPanel matlab.ui.container.Panel
panelBotoes matlab.ui.container.Panel
btnExportar matlab.ui.control.Button
btnHistograma matlab.ui.control.Button
btnProcessar matlab.ui.control.Button
btnCarregarImg matlab.ui.control.Button
TabGroup matlab.ui.container.TabGroup
IMAGEMTab matlab.ui.container.Tab
panelImagem matlab.ui.container.Panel
plotImagem matlab.ui.control.UIAxes
HISTOGRAMATab matlab.ui.container.Tab
panelHistogram matlab.ui.container.Panel
plotHistograma matlab.ui.control.UIAxes
AJUDASUPORTETab matlab.ui.container.Tab
HTML matlab.ui.control.HTML
end
% Properties that correspond to apps with auto-reflow
properties (Access = private)
onePanelWidth = 576;
end
properties (Access = private)
ImageFile % Arquivo de imagem;
ImageFile_pad % Arquivo de imagem ajustado
C_Categorical % Resultado gerado em CATEGORICAL
C_Categorical_Simples % Resultado gerado em CATEGORICAL
C_Uint8 % Resultado gerado em UINT8
C_Uint8_Simples % Resultado gerado em UINT8
B % Overlay da Imagem com o Resultado Espécies
B_Simples % Overlay da Imagem com o Resultado Simples
H % Grafico do Histograma
NetWork % Rede Neural
ImageFile_x % Largura
ImageFile_y % Altura
ImageFile_dim % Nr. Bandas
ImageFile_format % Formato do arquivo
R % Referencia Espacial da Imagem
S % Dados Geográficos geotiffinfo
X % Dados Geográficos struct.geotiffinfo
end
methods (Access = private)
% Tela de Progresso
function d = myprogress(app)
d = uiprogressdlg(app.UIFigure,'Title','Por favor aguarde...',...
'Message','Abrindo a aplicação');
pause(.5);
d.Value = .33;
d.Message = 'Carregando os dados necessários';
pause(1);
d.Value = .67;
d.Message = 'Processando os dados';
pause(1);
d.Value = 1;
d.Message = 'Finalizando';
pause(1);
% Fecha dialog box
close(d);
end
function resetApp(app)
% Limpar as variáveis
clear;
% Limpar todas as propriedades
app.ImageFile = [];
app.ImageFile_pad = [];
app.C_Categorical = [];
app.C_Categorical_Simples = [];
app.C_Uint8 = [];
app.C_Uint8_Simples = [];
app.B = [];
app.B_Simples = [];
app.H = [];
app.NetWork = [];
app.ImageFile_x = [];
app.ImageFile_y = [];
app.ImageFile_dim = [];
app.ImageFile_format = [];
app.R = [];
app.S = [];
app.X = [];
% Limpar componentes de UI
%cla(app.plotImagem);
%cla(app.plotHistograma);
end
end
% Callbacks that handle component events
methods (Access = private)
% Code that executes after component creation
function startupFcn(app)
app.UIFigure.Position = [100 100 1100 630]; % [x y width height]
app.UIFigure.Resize = 'off';
% Especifica o diretório da exportacao
diretorio = 'export';
% Verifica se o diretório existe
if ~isfolder(diretorio)
% Se o diretório não existe, cria o diretório
mkdir(diretorio);
end
% Desabilita/Habilita os botões
app.btnCarregarImg.Enable = true;
app.btnProcessar.Enable = false;
app.btnHistograma.Enable = false;
app.btnExportar.Enable = false;
% Desabilita os tipos de segmentação
app.btnTipoSegmentacao.Enable = true;
app.optEspecies.Enable = false;
app.optSimples.Enable = false;
% Carregando a rede treinada
try
load('./net_cocao.mat','net_cocao');
app.NetWork = net_cocao;
catch ME
report = getReport(ME);
uialert(app.UIFigure,report,'Erro','Interpreter','html');
end
end
% Button pushed function: btnCarregarImg
function btnCarregarImgButtonPushed(app, event)
% Limpa a variaveis, propriedades e visualizadores.
app.resetApp();
% Desabilita/Habilita os botões
app.btnProcessar.Enable = false;
app.btnHistograma.Enable = false;
app.btnExportar.Enable = false;
% Desabilita os tipos de segmentação
app.btnTipoSegmentacao.Enable = true;
app.optSimples.Value = 0;
app.optEspecies.Enable = false;
app.optSimples.Enable = false;
% Chama a janela para carregar a imagem
% Armazena os dados da imagem do usuario
[filename,filepath] = uigetfile({'*.tif'}, 'Selecionar imagem');
fullname = [filepath, filename];
% Abre a imagem de entrada selecionada pelo usuário
app.ImageFile = imread(fullname);
app.myprogress;
% Armazena informações sobre dimensões da imagem de entrada
[app.ImageFile_x,app.ImageFile_y,app.ImageFile_dim] = size(app.ImageFile);
% Armazena as informações geográficas da Imagem carregada
[~, r] = readgeoraster(fullname);
app.R = r;
app.X = geotiffinfo(fullname);
app.S = struct([app.X.GeoTIFFTags.GeoKeyDirectoryTag]);
app.ImageFile_format = app.X.Format;
% Verifica se o formato da imagem é TIF
if (string(app.ImageFile_format) ~= 'tif')
msg = {'ATENÇÃO!','O formato da imagem deve ser TIF.'};
uialert(app.UIFigure,msg,'Warning','Icon','warning');
end
% Verifica se o numero de bandas estão
% corretos para utilizar no programa.
if (app.ImageFile_dim ~= 3)
% Para o caso da imagem I tenha mais de 3 bandas deve-se retirar deixando
% somente 3 bandas
% Isolar as bandas da imagem
B1 = app.ImageFile(:,:,1);
B2 = app.ImageFile(:,:,2);
B3 = app.ImageFile(:,:,3);
% Junta as bandas isoladas
app.ImageFile = cat(3, B1, B2, B3);
msg = {'ATENÇÃO!','A imagem de entrada deve ter 3 bandas. A imagem carregada engloba mais de 3 bandas. Foram consideradas somente as 3 primeiras bandas para o processamento.'};
uialert(app.UIFigure,msg,'Aviso','Icon','warning');
end
% Ajustar a escala da imgem para a segmentação conforme o
% treinamento feito na CNN 512x512 pixels.
PatchSize = [512, 512];
app.ImageFile = imresize(app.ImageFile,'Scale', PatchSize ./ 512);
% Apresenta a imagem no applicativo (Plot)
imshow(app.ImageFile,'Parent',app.plotImagem);
%imagesc(app.plotImagem, app.ImageFile);
% Mostra as informaçções de tamanho e dimensão da imagem
%informacoes = sprintf('Arquivo: %ssprintf('Arquivo: %s\n Tamanho (Bytes): %s\n Altura: %s\n Largula: %s\n Nr. Bandas: %s\n DATUM/Projeção: %s\n',app.X.Filename, app.X.FileSize, app.X.Height, app.X.Width, app.ImageFile_dim, app.X.PCS);\n Altura: %s\n Largula: %s\n Nr. Bandas: %s\n DATUM/Projeção: %s\n',app.X.Filename, app.X.FileSize, app.X.Height, app.X.Width, app.ImageFile_dim, app.X.PCS);
%app.txt_InfoLocal.Text = string(informacoes);
app.txt_InfoLocal.Text = string(app.X.Filename);
altura = string("Altura: " + app.X.Height);
largura = string("Largura: " + app.X.Width);
nr_dim = string("Nr. Bandas: " + app.ImageFile_dim);
tamanho = string("Tamanho (Bytes): " + app.X.FileSize);
dimensoes = [altura, largura, nr_dim, tamanho];
app.txt_InfoDim.Text = dimensoes;
app.txt_InfoGeo.Text = string(app.X.PCS);
% Desabilita/Habilita os botões
app.btnProcessar.Enable = true;
app.TabGroup.SelectedTab = app.IMAGEMTab;
end
% Button pushed function: btnProcessar
function btnProcessarButtonPushed(app, event)
% Desabilita o botão de Exportar/Carregar até o termino do processamento
app.btnCarregarImg.Enable = false;
app.btnExportar.Enable = false;
app.btnHistograma.Enable = false;
% Verifica se a GPU está disponível
useGPU = canUseGPU();
if useGPU
% Limpa a Memoria da GPU antes do processamento
D = gpuDevice();
reset(D);
end
% Cria a função para processar imagens de tamanho grandes por
% blocos
if useGPU
fun_proc_semanticseg = @(bloco)semanticseg(bloco.data, app.NetWork,ExecutionEnvironment="gpu",MiniBatchSize=16,OutputType="uint8",Acceleration="auto");
else
fun_proc_semanticseg = @(bloco)semanticseg(bloco.data, app.NetWork,ExecutionEnvironment="auto",MiniBatchSize=16,OutputType="uint8",Acceleration="auto");
end
% Redefine o tamanho do bloco para 512
tamanho_bloco = [512 512];
% Armazena o tamanho da imagem I
[height, width, ~] = size(app.ImageFile);
% Calcula o pad image para obter a dimensão que seja multiplo de tamanho do bloco
padSize(1) = tamanho_bloco(1) - mod(height, tamanho_bloco(1));
padSize(2) = tamanho_bloco(2) - mod(width, tamanho_bloco(2));
% Gera uma cópia da imagem com o tamanho adequado para o tamanho do Bloco.
% o tamanho acrestado (PAD) a imagem é preenchido com valor 0
app.ImageFile_pad = padarray(app.ImageFile, padSize, 0, 'post');
% Processa a segmentação
try
% Redefine o tamanho do bloco para 2048
tamanho_bloco = [2048 2048];
C = blockproc(app.ImageFile_pad, tamanho_bloco, fun_proc_semanticseg);
app.myprogress;
% The output is nosy, apply a median filter to remove spurious pixels.
C = medfilt2(C,[5 5]);
% Retorna o resultado para o tamanho original
C = C(1:height, 1:width);
C = changem(C,7,0);
catch ME
report = getReport(ME);
uialert(app.UIFigure,report,'Erro','Interpreter','html');
end
% Definição dos Valores e Nome das Classes (ESPECIES)
labelIDs = [1 2 3 4 5 6 7];
classes = ["Açai" "Cocão" "Jaci" "Paxiuba" "Tucuma" "Floresta" "no-data"];
% Definição dos Valores e Nome das Classes (SIMPLES)
labelIDs_Simples = [1 2 3];
classes_Simples = ["Palmeiras" "Floresta" "no-data"];
% Alterar a segmentacao de ESPECIES -> SIMPLES
C_Simples = C;
C_Simples = changem(C_Simples,3,0);
C_Simples = changem(C_Simples,1,2);
C_Simples = changem(C_Simples,1,3);
C_Simples = changem(C_Simples,1,4);
C_Simples = changem(C_Simples,1,5);
C_Simples = changem(C_Simples,2,6);
C_Simples = changem(C_Simples,3,7);
% Converte a saida da segmentação de UINT8 para Categorical
% possibilitando a exportação.
app.C_Categorical = categorical(C, labelIDs, classes);
app.C_Uint8 = C;
app.C_Categorical_Simples = categorical(C_Simples,labelIDs_Simples,classes_Simples);
app.C_Uint8_Simples = C_Simples;
app.B = labeloverlay(app.ImageFile,C);
app.B_Simples = labeloverlay(app.ImageFile,C_Simples);
% Monta a sobreposição da Imagem com o resultado gerado da
% segmentação
if app.optSimples.Value ~= 1
% Apresenta o resultado da segmentação no applicativo (Plot)
%imagesc(app.plotImagem, B);
imshow(app.B_Simples,'Parent',app.plotImagem);
%app.TabGroup.SelectedTab = app.IMAGEMTab;
else % Espécie
% Apresenta o resultado da segmentação no applicativo (Plot)
%imagesc(app.plotImagem, B);
imshow(app.B,'Parent',app.plotImagem);
%app.TabGroup.SelectedTab = app.IMAGEMTab;
end
% Habilita o botão de Exportar/Carregar até o termino do processamento
app.btnCarregarImg.Enable = true;
app.btnHistograma.Enable = true;
app.btnExportar.Enable = true;
app.btnProcessar.Enable = false;
% Habilita os tipos de segmentação
app.btnTipoSegmentacao.Enable = true;
app.optEspecies.Enable = true;
app.optSimples.Enable = true;
end
% Button pushed function: btnExportar
function btnExportarButtonPushed(app, event)
% Habilita o botão de Exportar/Carregar até o termino do processamento
app.btnCarregarImg.Enable = false;
app.btnHistograma.Enable = false;
app.btnProcessar.Enable = false;
% Processa a exportação do resultado da segmentação
try
if app.optSimples.Value ~= 1
geotiffwrite('./export/classImg.tif',app.C_Uint8_Simples,app.R,'GeoKeyDirectoryTag',app.S);
app.myprogress;
else
geotiffwrite('./export/classImg.tif',app.C_Uint8,app.R,'GeoKeyDirectoryTag',app.S);
app.myprogress;
end
message = ["Resultado Exportado!","Procure o arquivo classImg.tif na pasta export."];
uialert(app.UIFigure,message,"Sucesso", "Icon","success");
catch ME
report = getReport(ME);
uialert(app.UIFigure,report,'Erro','Interpreter','html');
end
% Habilita o botão de Exportar/Carregar até o termino do processamento
app.btnCarregarImg.Enable = true;
app.btnHistograma.Enable = true;
app.btnExportar.Enable = true;
app.btnProcessar.Enable = false;
end
% Button pushed function: btnHistograma
function btnHistogramaButtonPushed(app, event)
% Processa o histograma do resultado da segmentação
try
% histograma.
if app.optSimples.Value ~= 1
app.H = histogram(app.plotHistograma,app.C_Categorical_Simples ...
,"FaceColor",[1 0 0],"EdgeColor","none");
else % Espécie
app.H = histogram(app.plotHistograma,app.C_Categorical ...
,"FaceColor",[1 0 0],"EdgeColor","none");
end
catch ME
report = getReport(ME);
uialert(app.UIFigure,report,'Erro','Interpreter','html');
end
app.TabGroup.SelectedTab = app.HISTOGRAMATab;
end
% Selection changed function: btnTipoSegmentacao
function btnTipoSegmentacaoSelectionChanged(app, event)
% Escolheu o Tipo Simples
if app.optSimples.Value ~= 1
imshow(app.B_Simples,'Parent',app.plotImagem);
app.TabGroup.SelectedTab = app.IMAGEMTab;
% Verifica se existe o histograma
if isprop(app, 'H') && ~isempty(app.H)
app.H = histogram(app.plotHistograma, app.C_Categorical_Simples, ...
'FaceColor', [1 0 0], 'EdgeColor', 'none');
end
else % Espécies
imshow(app.B,'Parent',app.plotImagem);
app.TabGroup.SelectedTab = app.IMAGEMTab;
% Verifica se existe o histograma
if isprop(app, 'H') && ~isempty(app.H)
app.H = histogram(app.plotHistograma, app.C_Categorical, ...
'FaceColor', [1 0 0], 'EdgeColor', 'none');
end
end
end
% Changes arrangement of the app based on UIFigure width
function updateAppLayout(app, event)
currentFigureWidth = app.UIFigure.Position(3);
if(currentFigureWidth <= app.onePanelWidth)
% Change to a 2x1 grid
app.GridLayout.RowHeight = {397, 397};
app.GridLayout.ColumnWidth = {'1x'};
app.RightPanel.Layout.Row = 2;
app.RightPanel.Layout.Column = 1;
else
% Change to a 1x2 grid
app.GridLayout.RowHeight = {'1x'};
app.GridLayout.ColumnWidth = {212, '1x'};
app.RightPanel.Layout.Row = 1;
app.RightPanel.Layout.Column = 2;
end
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Get the file path for locating images
pathToMLAPP = fileparts(mfilename('fullpath'));
% Create UIFigure and hide until all components are created
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.AutoResizeChildren = 'off';
app.UIFigure.Position = [100 100 698 397];
app.UIFigure.Name = 'MATLAB App';
app.UIFigure.Resize = 'off';
app.UIFigure.SizeChangedFcn = createCallbackFcn(app, @updateAppLayout, true);
% Create GridLayout
app.GridLayout = uigridlayout(app.UIFigure);
app.GridLayout.ColumnWidth = {212, '1x'};
app.GridLayout.RowHeight = {'1x'};
app.GridLayout.ColumnSpacing = 0;
app.GridLayout.RowSpacing = 0;
app.GridLayout.Padding = [0 0 0 0];
app.GridLayout.Scrollable = 'on';
% Create LeftPanel
app.LeftPanel = uipanel(app.GridLayout);
app.LeftPanel.Layout.Row = 1;
app.LeftPanel.Layout.Column = 1;
% Create panelInfo
app.panelInfo = uipanel(app.LeftPanel);
app.panelInfo.BorderType = 'none';
app.panelInfo.Position = [7 7 200 384];
% Create logoUDESC
app.logoUDESC = uiimage(app.panelInfo);
app.logoUDESC.Position = [8 345 83 34];
app.logoUDESC.ImageSource = fullfile(pathToMLAPP, 'udesc2_logo.png');
% Create logoINPA
app.logoINPA = uiimage(app.panelInfo);
app.logoINPA.Position = [110 346 83 34];
app.logoINPA.ImageSource = fullfile(pathToMLAPP, 'inpa-acre_logo.png');
% Create lbl_InfoImagem
app.lbl_InfoImagem = uilabel(app.panelInfo);
app.lbl_InfoImagem.HorizontalAlignment = 'center';
app.lbl_InfoImagem.FontSize = 14;
app.lbl_InfoImagem.FontWeight = 'bold';
app.lbl_InfoImagem.Position = [7 315 186 22];
app.lbl_InfoImagem.Text = 'Informações da Entrada';
% Create lbl_InfoLocal
app.lbl_InfoLocal = uilabel(app.panelInfo);
app.lbl_InfoLocal.FontWeight = 'bold';
app.lbl_InfoLocal.Position = [7 287 186 22];
app.lbl_InfoLocal.Text = 'Local:';
% Create txt_InfoLocal
app.txt_InfoLocal = uilabel(app.panelInfo);
app.txt_InfoLocal.VerticalAlignment = 'top';
app.txt_InfoLocal.WordWrap = 'on';
app.txt_InfoLocal.FontSize = 9;
app.txt_InfoLocal.Position = [7 246 186 34];
app.txt_InfoLocal.Text = ' ';
% Create lbl_InfoDim
app.lbl_InfoDim = uilabel(app.panelInfo);
app.lbl_InfoDim.FontWeight = 'bold';
app.lbl_InfoDim.Position = [7 218 186 22];
app.lbl_InfoDim.Text = 'Dimensão:';
% Create txt_InfoDim
app.txt_InfoDim = uilabel(app.panelInfo);
app.txt_InfoDim.VerticalAlignment = 'top';
app.txt_InfoDim.WordWrap = 'on';
app.txt_InfoDim.FontSize = 9;
app.txt_InfoDim.Position = [7 131 186 80];
app.txt_InfoDim.Text = ' ';
% Create lbl_InfoGeo
app.lbl_InfoGeo = uilabel(app.panelInfo);
app.lbl_InfoGeo.FontWeight = 'bold';
app.lbl_InfoGeo.Position = [7 106 186 22];
app.lbl_InfoGeo.Text = 'Dados Geográficos:';
% Create txt_InfoGeo
app.txt_InfoGeo = uilabel(app.panelInfo);
app.txt_InfoGeo.VerticalAlignment = 'top';
app.txt_InfoGeo.WordWrap = 'on';
app.txt_InfoGeo.FontSize = 9;
app.txt_InfoGeo.Position = [7 65 186 34];
app.txt_InfoGeo.Text = ' ';
% Create btnTipoSegmentacao
app.btnTipoSegmentacao = uibuttongroup(app.panelInfo);
app.btnTipoSegmentacao.SelectionChangedFcn = createCallbackFcn(app, @btnTipoSegmentacaoSelectionChanged, true);
app.btnTipoSegmentacao.Title = 'Tipo de Segmentação:';
app.btnTipoSegmentacao.Position = [6 10 186 49];
% Create optEspecies
app.optEspecies = uiradiobutton(app.btnTipoSegmentacao);
app.optEspecies.Enable = 'off';
app.optEspecies.Text = 'Simples';
app.optEspecies.Position = [11 3 64 22];
app.optEspecies.Value = true;
% Create optSimples
app.optSimples = uiradiobutton(app.btnTipoSegmentacao);
app.optSimples.Enable = 'off';
app.optSimples.Text = 'Espécies';
app.optSimples.Position = [103 3 70 22];
% Create RightPanel
app.RightPanel = uipanel(app.GridLayout);
app.RightPanel.Layout.Row = 1;
app.RightPanel.Layout.Column = 2;
% Create TabGroup
app.TabGroup = uitabgroup(app.RightPanel);
app.TabGroup.AutoResizeChildren = 'off';
app.TabGroup.Position = [11 65 467 325];
% Create IMAGEMTab
app.IMAGEMTab = uitab(app.TabGroup);
app.IMAGEMTab.AutoResizeChildren = 'off';
app.IMAGEMTab.Title = 'IMAGEM';
% Create panelImagem
app.panelImagem = uipanel(app.IMAGEMTab);
app.panelImagem.AutoResizeChildren = 'off';
app.panelImagem.BorderType = 'none';
app.panelImagem.Position = [8 8 452 284];
% Create plotImagem
app.plotImagem = uiaxes(app.panelImagem);
app.plotImagem.XTick = [];
app.plotImagem.YTick = [];
app.plotImagem.ZTick = [];
app.plotImagem.Color = [0.9412 0.9412 0.9412];
app.plotImagem.Box = 'on';
app.plotImagem.Position = [6 8 437 271];
% Create HISTOGRAMATab
app.HISTOGRAMATab = uitab(app.TabGroup);
app.HISTOGRAMATab.AutoResizeChildren = 'off';
app.HISTOGRAMATab.Title = 'HISTOGRAMA';
% Create panelHistogram
app.panelHistogram = uipanel(app.HISTOGRAMATab);
app.panelHistogram.AutoResizeChildren = 'off';
app.panelHistogram.BorderType = 'none';
app.panelHistogram.Position = [8 8 452 284];
% Create plotHistograma
app.plotHistograma = uiaxes(app.panelHistogram);
title(app.plotHistograma, 'Frequência por Espécies')
xlabel(app.plotHistograma, 'Espécies de Palmeiras')
ylabel(app.plotHistograma, 'Nr. Pixels')
app.plotHistograma.Toolbar.Visible = 'off';
app.plotHistograma.Box = 'on';
app.plotHistograma.XGrid = 'on';
app.plotHistograma.YGrid = 'on';
app.plotHistograma.Position = [6 8 437 271];
% Create AJUDASUPORTETab
app.AJUDASUPORTETab = uitab(app.TabGroup);
app.AJUDASUPORTETab.AutoResizeChildren = 'off';
app.AJUDASUPORTETab.Title = 'AJUDA / SUPORTE';
% Create HTML
app.HTML = uihtml(app.AJUDASUPORTETab);
app.HTML.HTMLSource = 'suporte.html';
app.HTML.Position = [15 14 435 272];
% Create panelBotoes
app.panelBotoes = uipanel(app.RightPanel);
app.panelBotoes.BorderType = 'none';
app.panelBotoes.Position = [12 7 465 48];
% Create btnCarregarImg
app.btnCarregarImg = uibutton(app.panelBotoes, 'push');
app.btnCarregarImg.ButtonPushedFcn = createCallbackFcn(app, @btnCarregarImgButtonPushed, true);
app.btnCarregarImg.WordWrap = 'on';
app.btnCarregarImg.Position = [21 8 91 35];
app.btnCarregarImg.Text = 'Carregar Imagem...';
% Create btnProcessar
app.btnProcessar = uibutton(app.panelBotoes, 'push');
app.btnProcessar.ButtonPushedFcn = createCallbackFcn(app, @btnProcessarButtonPushed, true);
app.btnProcessar.WordWrap = 'on';
app.btnProcessar.Enable = 'off';
app.btnProcessar.Position = [132 8 91 35];
app.btnProcessar.Text = 'Processar Segmentação';
% Create btnHistograma
app.btnHistograma = uibutton(app.panelBotoes, 'push');
app.btnHistograma.ButtonPushedFcn = createCallbackFcn(app, @btnHistogramaButtonPushed, true);
app.btnHistograma.WordWrap = 'on';
app.btnHistograma.Enable = 'off';
app.btnHistograma.Position = [243 8 91 35];
app.btnHistograma.Text = 'Histograma';
% Create btnExportar
app.btnExportar = uibutton(app.panelBotoes, 'push');
app.btnExportar.ButtonPushedFcn = createCallbackFcn(app, @btnExportarButtonPushed, true);
app.btnExportar.WordWrap = 'on';
app.btnExportar.Enable = 'off';
app.btnExportar.Position = [354 8 91 35];
app.btnExportar.Text = 'Exportar Segmentação';
% Show the figure after all components are created
app.UIFigure.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = segmentacao_palmeiras_tab_exported
runningApp = getRunningApp(app);
% Check for running singleton app
if isempty(runningApp)
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
% Execute the startup function
runStartupFcn(app, @startupFcn)
else
% Focus the running singleton app
figure(runningApp.UIFigure)
app = runningApp;
end
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
Could someone please help me resolve this issue?
Best regards,
Airton Gaio Jr.

Risposta accettata

Rahul
Rahul il 12 Lug 2024
Hi Airton,
I was able to run the app on my end using the code that you have shared and reproduce the issue. I believe that the alignment of the IMAGE component and the HISTOGRAM component was getting altered when the HTML component inside the PANEL of the HELP / SUPPORT TA was being added to the app.
I have tried to change a couple of properties to fix this issue, like:
% On line 503, the 'autoresizechildren' property of tha IMAGE Tab is changed to 'on'
app.IMAGEMTab.AutoResizeChildren = 'on';
% On line 507, the 'autoresizechildren' property of tha IMAGE panel is changed to 'on'
app.panelImagem.AutoResizeChildren = 'on';
This will help fix the alignment of the IMAGE component.
% On line 520, the 'autoresizechildren' property of tha HISTOGRAM Tab is changed to 'on'
app.HISTOGRAMATab.AutoResizeChildren = 'on';
% On line 524, the 'autoresizechildren' property of tha HISTOGRAM panel is changed to 'on'
app.panelHistogram.AutoResizeChildren = 'on';
This will help fix the alignment of the HISTOGRAM component.
% On line 539, the 'autoresizechildren' property of tha HELP/SUPPORT Tab is changed to 'on'
app.AJUDASUPORTETab.AutoResizeChildren = 'on';
This will help fix the alignment of the HELP/SUPPORT component.
After making these changes, the App looks like this:
Note:
For HELP/SUPPORT component I created a 'suporte.html' file with lorem ipsum text. You can consider your own for your use case. For the IMAGE component, you can resize the 'uiaxes' of the IMAGE panel according to your own requirements.
Hope this solves the issue. Thanks!
  1 Commento
Airton Gaio Junior
Airton Gaio Junior il 12 Lug 2024
Prezado Rahul,
Obrigado pela rápida resposta! Fiz as alterações sugeridas e com a o acrescimo de um componente GRID consegui ajustar.
Grato,
Airton

Accedi per commentare.

Più risposte (2)

Mario Malic
Mario Malic il 12 Lug 2024
Hi Airton, please try to add Grid Layout component and check how your app behaves.
Posted this as an answer instead, please mark this as an answer.
Cheers.

Airton Gaio Junior
Airton Gaio Junior il 26 Lug 2024
Hello everyone,
I am experiencing an issue with the HTML file that I am loading into the HTML component of my application in MATLAB App Designer. When I click on the summary links or the return links that navigate to sections within the same file, the other components on the screen become disorganized.
Could someone assist me in resolving this issue? Please find the HTML code and images attached below. The images show the correct screen before clicking the link and how the application screen looks after the link is clicked.
Thank you in advance for your help!
Best regards,
Airton Gaio Junior
HTML Code
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<title>Manual de Uso da Aplicação: Segmentação de Palmeiras</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
margin: 0;
padding: 0;
background-color: #f4f4f9;
overflow-x: hidden; /* Evita a rolagem horizontal */
}
header {
background-color: #4CAF50;
color: white;
padding: 1rem 0;
text-align: center;
}
.container {
width: 100%; /* Ajusta a largura ao container pai */
/*max-width: none; /* Remove o limite de largura */
max-width: 900px;
margin: 20px auto;
padding: 20px;
background: white;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
h1, h2, h3 {
color: #333;
}
ul {
list-style-type: none;
padding: 0;
}
ul li {
padding: 5px 0;
}
ul li a {
text-decoration: none;
color: #4CAF50;
}
ul li a:hover {
text-decoration: underline;
}
.center {
text-align: center;
}
img {
max-width: 100%;
height: auto;
display: block;
margin: 20px auto;
}
p {
color: #555;
}
.btn-back {
display: inline-block;
margin: 20px 0;
padding: 10px 15px;
background-color: #4CAF50;
color: white;
text-decoration: none;
border-radius: 5px;
}
.btn-back:hover {
background-color: #45a049;
}
.important {
background-color: #ffcccc;
border-left: 6px solid #ff0000;
padding: 10px;
margin: 20px 0;
border-radius: 4px;
}
</style>
</head>
<body>
<header>
<h2>Manual de Uso da Aplicação: Segmentação de Palmeiras</h2>
</header>
<div class="container">
<h2 id="sumario">Sumário</h2>
<ul>
<li><a href="#introducao">Introdução</a></li>
<li><a href="#prerequisitos">Pré-requisitos</a></li>
<li><a href="#instalacao">Instalação no Windows</a></li>
<li><a href="#iniciar">Iniciar a Aplicação</a></li>
<li><a href="#carregar">Carregar Imagem</a></li>
<li><a href="#processar">Processar Segmentação</a></li>
<li><a href="#histograma">Gerar Histograma</a></li>
<li><a href="#exportar">Exportar Segmentação</a></li>
<li><a href="#resolucao-problemas">Resolução de Problemas</a></li>
<li><a href="#faq">Perguntas Frequentes (FAQ)</a></li>
<li><a href="#atualizacoes">Atualizações e Manutenção</a></li>
<li><a href="#seguranca-backup">Segurança e Backup</a></li>
<li><a href="#glossario">Glossário</a></li>
<li>Copyright e Contato do Suporte
<ul>
<li><a href="#copyright">Copyright</a></li>
<li><a href="#licenca">Licença de Uso</a></li>
<li><a href="#consideracoes">Considerações Finais</a></li>
<li><a href="#autores">Autor(es)</a></li>
</ul>
</li>
</ul>
<h2 id="introducao">Introdução</h2>
<p>Esta aplicação MATLAB foi desenvolvida para segmentar espécies de palmeiras em imagens georreferenciadas. O objetivo principal
é fornecer uma ferramenta fácil de usar para pesquisadores e especialistas em meio ambiente para analisar imagens de VANT
(Veículo Aéreo Não Tripulado) e obter informações sobre a distribuição de diferentes espécies de palmeiras.</p>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="prerequisitos">Pré-requisitos</h2>
<p>Para utilizar esta aplicação, é necessário:</p>
<ul>
<li>MATLAB R2021a ou superior</li>
<li>Toolbox de Processamento de Imagem do MATLAB</li>
<li>Bibliotecas adicionais: [Listar bibliotecas]</li>
</ul>
<p>Recomenda-se um computador com as seguintes especificações:</p>
<ul>
<li>Processador Intel Core i5 ou superior</li>
<li>8GB de RAM (16GB recomendado)</li>
<li>Placa gráfica dedicada com suporte a CUDA (opcional, mas recomendado para processamento mais rápido)</li>
</ul>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="instalacao">Instalação no Windows</h2>
<p>[Instruções de instalação aqui]</p>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="iniciar">Iniciar a Aplicação</h2>
<p>Abra a aplicação MATLAB e execute o script da aplicação para abrir a janela principal.</p>
<img src="img_doc/image002.png" alt="Tela Principal da aplicação">
<p class="center">Figura 1 Tela Principal da aplicação.</p>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="carregar">Carregar Imagem</h2>
<p>1. Clique no botão 'Carregar Imagem...'.</p>
<p>2. Na janela de diálogo, selecione uma imagem no formato TIF.</p>
<p>3. Aguarde a imagem ser carregada e exibida na aba IMAGEM. As informações da imagem serão preenchidas no painel esquerdo.</p>
<img src="img_doc/image004.png" alt="Imagem carregada na aba “IMAGEM”">
<p class="center">Figura 2 Imagem carregada na aba “IMAGEM”.</p>
<p>A rede neural convolucional deste projeto foi treinada com imagens capturadas por um VANT (Veículo Aéreo Não Tripulado) a uma
altura fixa de 120 metros acima do dossel, alcançando uma resolução espacial de 4,3 cm/<i>pixel</i>. As imagens foram coletadas
em uma área de floresta tropical com palmeiras. O resultado da aplicação é uma imagem classificada em sete classes, definidas
da seguinte maneira: 1) Açaí (<span style="background: yellow;">Euterpe oleracea</span>); 2) Cocão
(<i><span style="background: yellow;">Maximiliana maripa</span></i>); 3) Jaci
(<i><span style="background: yellow;">Attalea maripa</span></i>); 4) Paxiuba (<span
style="background: yellow;"><i>Socratea</i></span><i><span style="background: yellow;"> exorrhiza</span></i>);
5) Tucumã (<span style="background: yellow;"><i>Astrocaryum</i></span><i><span
style="background: yellow;"> aculeatum</span></i>); 6) Floresta sem Palmeiras
(<i>background</i>); e 7) Sem dados (<i>no-data</i>).</p>
<p>Para obter os melhores resultados, recomenda-se que a imagem de entrada tenha características semelhantes às descritas. No
entanto, a aplicação pode lidar com imagens que variem ligeiramente em resolução espacial, tipo de floresta e espécies presentes.</p>
<p>A aplicação aceita imagens de entrada com apenas três bandas. Se o usuário carregar uma imagem com mais de três bandas,
a aplicação considerará automaticamente apenas as três primeiras.</p>
<p class="important"><strong>IMPORTANTE:</strong> Recomendamos não utilizar imagens muito grandes, pois limitações
de hardware, como falta de memória RAM, espaço em disco, processadores mais lentos e a ausência de uma GPU dedicada,
podem impactar o desempenho da aplicação, resultando em tempos de processamento mais longos ou até mesmo no travamento do
sistema. Para áreas muito grandes, sugere-se dividir a imagem em partes menores para facilitar o processamento. A imagem de
entrada deve ter um tamanho mínimo de 2048<i>x</i>2048 <i>pixels</i>, conforme definido para o processamento em bloco.</p>
<p>A aba "IMAGEM" oferece diversos recursos ao usuário após o carregamento de uma imagem.</p>
<img src="img_doc/image006.png" alt="Menu de opções para a imagem carregada" style="width: 25%;">
<p class="center">Figura 3 Menu de opções para a imagem carregada.</p>
<p>Ao passar o mouse sobre a imagem carregada, um menu de opções localizado no canto superior direito da imagem (Figura XX) será exibido. Este menu permite as seguintes ações: <img src="img_doc/image007.png" alt="Salvar uma captura da visualização atual da imagem" style="width: 4%; display: inline;"> Salvar uma captura da visualização atual da imagem; <img src="img_doc/image008.png" alt="Coletar informações da imagem" style="width: 4%; display: inline;"> Coletar informações da imagem; <img src="img_doc/image009.png" alt="Percorrer a imagem movendo-se com o cursor" style="width: 4%; display: inline;"> Percorrer a imagem movendo-se com o cursor; <img src="img_doc/image010.png" alt="Aumentar o Zoom" style="width: 4%; display: inline;"> Aumentar o Zoom; <img src="img_doc/image011.png" alt="Diminuir o Zoom" style="width: 4%; display: inline;"> Diminuir o Zoom; <img src="img_doc/image012.png" alt="Restaurar a visualização" style="width: 4%; display: inline;"> Restaurar a visualização.</p>
<p>Para utilizar uma dessas opções, basta clicar no ícone correspondente, que mudará de cor para azul, e aplicar o recurso desejado à
imagem.</p>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="processar">Processar Segmentação</h2>
<p>1. Após carregar a imagem, clique no botão 'Processar Segmentação'.</p>
<p>2. A segmentação será processada e os resultados serão exibidos na aba IMAGEM.</p>
<p>3. A sobreposição da imagem original com os resultados da segmentação será mostrada.</p>
<img src="img_doc/image014.png" alt="Demonstração do resultado de um processamento com o tipo de segmentação ‘Espécies’" style="width: 95%;">
<p class="center">Figura 4 Demonstração do resultado de um processamento com o tipo de segmentação ‘Espécies’.</p>
<p>Neste momento, é importante aguardar até que o processamento termine. Se a imagem for muito grande, ela será dividida em
blocos de 2048<i>x</i>2048 <i>pixels</i>, e essa informação será exibida em uma pequena janela de progresso (Figura 5).</p>
<img src="img_doc/image016.png" alt="Janela de processamento em bloco" style="width: 95%;">
<p class="center">Figura 5 Janela de processamento em bloco.</p>
<p>Após o processamento, uma janela de progresso (Figura 6) aparecerá enquanto o resultado é aplicado na aba "IMAGEM".</p>
<img src="img_doc/image018.png" alt="Janela de progresso" style="width: 95%;">
<p class="center">Figura 6 Janela de progresso.</p>
<p>O resultado inicial apresentará uma segmentação simples, sem distinção entre as espécies de palmeiras, classificando a
imagem em apenas três classes: 1) Palmeiras; 2) Floresta sem Palmeiras (<i>background</i>); 3) Sem dados (no-data).</p>
<img src="img_doc/image020.png" alt="Demonstração do resultado de um processamento com o tipo de segmentação ‘Simples’" style="width: 95%;">
<p class="center">Figura 7 Demonstração do resultado de um processamento com o tipo de segmentação ‘Simples’.</p>
<p>Após a conclusão do processamento e a exibição do resultado, a caixa de opções "Tipo de Segmentação" ficará habilitada.
Isso permitirá que o usuário alterne entre a segmentação simples e a segmentação por espécies, aplicando o novo resultado
imediatamente na aba "IMAGEM".</p>
<p class="important"><strong>IMPORTANTE:</strong> Embora a aplicação tenha uma rotina interna de limpeza de memória para permitir processamentos
repetidos, recomendamos fortemente que, para cada nova imagem a ser processada, a aplicação seja fechada e reaberta. Isso
garante a liberação completa da memória utilizada no processamento anterior, evitando possíveis erros futuros e assegurando
um desempenho otimizado.</p>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="histograma">Gerar Histograma</h2>
<p>1. Com a segmentação processada, clique no botão 'Histograma'.</p>
<p>2. O histograma da distribuição das espécies será exibido na aba HISTOGRAMA.</p>
<img src="img_doc/image022.png" alt="Demonstração de um histograma com o tipo de segmentação ‘Espécies’" style="width: 95%;">
<p class="center">Figura 8 Demonstração de um histograma com o tipo de segmentação ‘Espécies’.</p>
<p>A função do histograma só estará disponível após o término do processamento. O histograma é apresentado na aba "HISTOGRAMA"
assim que o processamento é concluído. Uma janela de progresso indicará o fim do processamento e a aplicação mudará
automaticamente o foco para a aba "HISTOGRAMA".</p>
<img src="img_doc/image024.png" alt="Demonstração de um histograma com o tipo de segmentação ‘Simples’" style="width: 95%;">
<p class="center">Figura 9 Demonstração de um histograma com o tipo de segmentação ‘Simples’.</p>
<p>Para alterar o histograma, utilize as opções de ‘Tipo de Segmentação’ na parte inferior esquerda da aplicação. O histograma
é configurado como um gráfico de barras, onde o eixo X representa as classes e o eixo Y indica o número de pixels
classificados. O usuário pode obter informações detalhadas sobre a frequência absoluta de pixels posicionando o mouse
sobre o gráfico.</p>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="exportar">Exportar Segmentação</h2>
<p>1. Para exportar os resultados da segmentação, clique no botão 'Exportar Segmentação'.</p>
<p>2. Os resultados serão salvos no diretório <b>‘export</b>’ no formato GeoTIFF.</p>
<p>Durante o processamento, uma janela de progresso aparecerá enquanto a exportação está sendo realizada. Ao término da
exportação, um alerta indicará o sucesso da operação (Figura 10).</p>
<img src="img_doc/image026.png" alt="Alerta do fim de exportação" style="width: 95%;">
<p class="center">Figura 10 Alerta do fim de exportação.</p>
<p class="important"><strong>IMPORTANTE:</strong> O arquivo exportado será salvo no diretório denominado ‘<strong>export</strong>’, localizado no
mesmo local da instalação da aplicação. O nome do arquivo será o <strong>mesmo nome do arquivo fornecido como
entrada</strong> acrescentado de um sufixo ‘<strong>_Simples</strong>’ e/ou ‘<strong>_Especies</strong>’
seguido da extensão ‘<strong>TIF</strong>’. O resultado da exportação dependerá da seleção na caixa de opções "Tipo de
Segmentação".</p>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="resolucao-problemas">Resolução de Problemas</h2>
<p>Aqui estão algumas soluções para problemas comuns que você pode encontrar:</p>
<ul>
<li><strong>Erro na instalação:</strong> Verifique se todas as dependências estão instaladas e se a versão do MATLAB é compatível.</li>
<li><strong>Aplicação não inicia:</strong> Certifique-se de que o MATLAB está corretamente configurado no PATH do sistema.</li>
<li><strong>Imagem não carrega:</strong> Verifique o formato da imagem e se ela atende aos requisitos de tamanho.</li>
<li><strong>Processamento lento:</strong> Considere utilizar um computador com melhor capacidade de hardware ou dividir a imagem em partes menores.</li>
</ul>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="faq">Perguntas Frequentes (FAQ)</h2>
<p>Aqui estão algumas perguntas frequentes sobre a aplicação:</p>
<ul>
<li><strong>Posso usar imagens em formatos diferentes de TIF?</strong> Atualmente, a aplicação só suporta o formato TIF.</li>
<li><strong>Como faço para atualizar a aplicação?</strong> Verifique a seção de atualizações e manutenção para obter instruções.</li>
<li><strong>O que devo fazer se a aplicação travar?</strong> Reinicie a aplicação e tente novamente. Se o problema persistir, consulte a seção de resolução de problemas.</li>
</ul>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="atualizacoes">Atualizações e Manutenção</h2>
<p>Para atualizar a aplicação, siga os passos abaixo:</p>
<ul>
<li>Verifique o site oficial para novas versões.</li>
<li>Baixe a nova versão e substitua os arquivos antigos.</li>
<li>Reinstale as dependências, se necessário.</li>
</ul>
<p>Para manutenção preventiva:</p>
<ul>
<li>Verifique regularmente por atualizações.</li>
<li>Faça backups periódicos dos seus dados.</li>
</ul>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="seguranca-backup">Segurança e Backup</h2>
<p>Para garantir a segurança dos seus dados:</p>
<ul>
<li>Mantenha o software e dependências atualizados.</li>
<li>Faça backups regulares dos resultados da segmentação.</li>
<li>Armazene os backups em locais seguros e redundantes.</li>
</ul>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="glossario">Glossário</h2>
<p>Aqui estão alguns termos técnicos utilizados nesta documentação:</p>
<ul>
<li><strong>VANT:</strong> Veículo Aéreo Não Tripulado, também conhecido como drone.</li>
<li><strong>GeoTIFF:</strong> Formato de arquivo raster georreferenciado.</li>
<li><strong>Segmentação:</strong> Processo de dividir uma imagem em partes significativas.</li>
</ul>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h2 id="copyright">Copyright e Contato do Suporte</h2>
<h3 id="copyright">Copyright</h3>
<p>Todos os direitos autorais da aplicação são reservados ao(s) autor(es) e à Universidade do Estado de Santa Catarina
(UDESC-FAED). Qualquer redistribuição ou reprodução de parte ou de todo o conteúdo da aplicação em qualquer formato é
proibida, exceto nas seguintes condições:</p>
<p>1. <b>Uso Pessoal e Acadêmico</b>: A aplicação pode ser usada para fins pessoais e de pesquisa acadêmica, desde que seja
citada adequadamente a fonte e o(s) autor(es) originais da aplicação.</p>
<p>2. <strong>Proibição de Uso Comercial</strong>: É expressamente proibido o uso da aplicação para fins comerciais sem a
permissão explícita do(s) autor(es) e da UDESC-FAED.</p>
<p>3. <strong>Distribuição Limitada</strong>: A aplicação pode ser compartilhada com colegas de pesquisa, desde que este termo
de copyright e licença seja incluído na redistribuição e que não seja alterado ou removido.</p>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h3 id="licenca">Licença de Uso</h3>
<p>Esta aplicação foi desenvolvida utilizando o Matlab Compiler sob a Licença da Universidade do Estado de Santa Catarina -
Faculdade de Educação (UDESC-FAED). A licença de uso está descrita da seguinte forma:</p>
<p>1. <b>Uso Restrito à Pesquisa</b>: A aplicação deve ser utilizada exclusivamente para fins de pesquisa e desenvolvimento
acadêmico, conforme os objetivos estabelecidos na pesquisa de doutorado.</p>
<p>2. <strong>Reprodução e Modificação</strong>: A modificação da aplicação é permitida apenas para fins de adaptação às
necessidades específicas da pesquisa de doutorado, desde que as modificações não violem os termos de uso do Matlab
Compiler.</p>
<p>3. <strong>Distribuição de Modificações</strong>: Quaisquer modificações na aplicação devem ser compartilhadas sob a mesma
licença, garantindo que as alterações sejam acessíveis à comunidade acadêmica e respeitem os direitos autorais originais.</p>
<p>4. <strong>Limitações de Responsabilidade</strong>: A UDESC-FAED e o(s) autor(es) não se responsabilizam por quaisquer
danos diretos ou indiretos que possam resultar do uso da aplicação, incluindo, mas não se limitando a, perda de dados,
interrupção de negócios ou lucros cessantes.</p>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h3 id="consideracoes">Considerações Finais</h3>
<p>Ao utilizar esta aplicação, você concorda com os termos e condições aqui estabelecidos. O não cumprimento de qualquer parte
deste acordo pode resultar em ações legais apropriadas, de acordo com as leis de direitos autorais aplicáveis.</p>
<p>Para mais informações ou para obter permissão para usos além dos especificados nesta licença, entre em contato com a
Universidade do Estado de Santa Catarina - Faculdade de Educação (UDESC-FAED).</p>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
<h3 id="autores">Autor(es):</h3>
<p>Airton Gaio Jr.<br>
airton.gaio@edu.udesc.br<br>
</p>
<p>Rodrigo Pinheiro Ribas<br>
rodrigo.ribas@udesc.br
</p>
<p>Julho de 2025.</p>
<p class="center"><a href="#sumario" class="btn-back">Voltar ao Sumário</a></p>
</div>
</body>
</html>
  • Images: Correct Screen Before Clicking the Link
  • Images: Application Screen After Clicking the Link

Categorie

Scopri di più su Develop uifigure-Based Apps in Help Center e File Exchange

Prodotti


Release

R2024a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by