Borrar filtros
Borrar filtros

GUI apps design for newbie

5 visualizaciones (últimos 30 días)
Nurul Ainina
Nurul Ainina el 22 de Feb. de 2024
Editada: bo zhang el 16 de Mayo de 2024
Hello everyone,
I am new in using matlab, and unfamiliar with the programming language. Currently, I made a GUI using apps design that user need to insert 2 value and when click the pushbutton of CALCULATE; the value of TOTAL and MINIMUM and MAXIMUM value will automated calculate and appear. But sadly, I don't know what coding to insert in callback. Can someone help me, it seems easy but i really need someone's help because i am newbie in this field, sorry for any inconveniece. Here I paste the coding that I already generated from my developed GUI;
Thank you so much.
classdef Testing < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
CalculateButton matlab.ui.control.Button
CO2EditField matlab.ui.control.NumericEditField
CO2EditFieldLabel matlab.ui.control.Label
EditField_4 matlab.ui.control.NumericEditField
EditField_3 matlab.ui.control.NumericEditField
EditField_2 matlab.ui.control.NumericEditField
EditField matlab.ui.control.NumericEditField
MaximumLabel matlab.ui.control.Label
MinimumLabel matlab.ui.control.Label
TOTALLabel matlab.ui.control.Label
FabricationLabel matlab.ui.control.Label
MaterialLabel matlab.ui.control.Label
ParametersLabel matlab.ui.control.Label
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure and hide until all components are created
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Position = [100 100 640 480];
app.UIFigure.Name = 'MATLAB App';
% Create ParametersLabel
app.ParametersLabel = uilabel(app.UIFigure);
app.ParametersLabel.HorizontalAlignment = 'center';
app.ParametersLabel.FontWeight = 'bold';
app.ParametersLabel.Position = [56 417 70 22];
app.ParametersLabel.Text = 'Parameters';
% Create MaterialLabel
app.MaterialLabel = uilabel(app.UIFigure);
app.MaterialLabel.HorizontalAlignment = 'center';
app.MaterialLabel.FontWeight = 'bold';
app.MaterialLabel.Position = [170 417 50 22];
app.MaterialLabel.Text = 'Material';
% Create FabricationLabel
app.FabricationLabel = uilabel(app.UIFigure);
app.FabricationLabel.HorizontalAlignment = 'center';
app.FabricationLabel.FontWeight = 'bold';
app.FabricationLabel.Position = [260 417 70 22];
app.FabricationLabel.Text = 'Fabrication';
% Create TOTALLabel
app.TOTALLabel = uilabel(app.UIFigure);
app.TOTALLabel.HorizontalAlignment = 'center';
app.TOTALLabel.FontWeight = 'bold';
app.TOTALLabel.Position = [364 417 44 22];
app.TOTALLabel.Text = 'TOTAL';
% Create MinimumLabel
app.MinimumLabel = uilabel(app.UIFigure);
app.MinimumLabel.HorizontalAlignment = 'center';
app.MinimumLabel.FontWeight = 'bold';
app.MinimumLabel.Position = [442 417 58 22];
app.MinimumLabel.Text = 'Minimum';
% Create MaximumLabel
app.MaximumLabel = uilabel(app.UIFigure);
app.MaximumLabel.HorizontalAlignment = 'center';
app.MaximumLabel.FontWeight = 'bold';
app.MaximumLabel.Position = [524 417 60 22];
app.MaximumLabel.Text = 'Maximum';
% Create EditField
app.EditField = uieditfield(app.UIFigure, 'numeric');
app.EditField.Position = [250 389 80 22];
% Create EditField_2
app.EditField_2 = uieditfield(app.UIFigure, 'numeric');
app.EditField_2.Position = [346 389 80 22];
% Create EditField_3
app.EditField_3 = uieditfield(app.UIFigure, 'numeric');
app.EditField_3.Position = [431 389 80 22];
% Create EditField_4
app.EditField_4 = uieditfield(app.UIFigure, 'numeric');
app.EditField_4.Position = [514 389 80 22];
% Create CO2EditFieldLabel
app.CO2EditFieldLabel = uilabel(app.UIFigure);
app.CO2EditFieldLabel.HorizontalAlignment = 'right';
app.CO2EditFieldLabel.Position = [82 389 30 22];
app.CO2EditFieldLabel.Text = 'CO2';
% Create CO2EditField
app.CO2EditField = uieditfield(app.UIFigure, 'numeric');
app.CO2EditField.Position = [156 389 80 22];
% Create CalculateButton
app.CalculateButton = uibutton(app.UIFigure, 'push');
app.CalculateButton.Position = [515 341 82 23];
app.CalculateButton.Text = 'Calculate';
% 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 = Testing
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
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
  3 comentarios
Nurul Ainina
Nurul Ainina el 22 de Feb. de 2024
I noticed that I need to click the callback function, but the problem is I don't know what is the coding should I insert to make it auto calculate?
Nurul Ainina
Nurul Ainina el 22 de Feb. de 2024
i adding this code but when i click the calculate button there is nothing calculate and appear:
% Button pushed function: CalculateButton
function CalculateButtonPushed(app, event)
disp('CalculateButtonPushed callback executed');
% Get the values from the edit boxes
value1 = str2double(app.CO2EditField.Value);
value2 = str2double(app.EditField.Value);
disp(['Value1: ' num2str(value1)]);
disp(['Value2: ' num2str(value2)]);
% Check if the input is valid (numeric)
if isnan(value1) || isnan(value2)
% Handle the case when the input is not numeric
% You can display an error message or take other actions
disp('Invalid input. Please enter numeric values.');
return;
end
% Perform calculations
totalValue = value1 + value2;
minValue = min(value1, value2);
maxValue = max(value1, value2);
% Display the results in the text boxes
app.EditField_2.Value = totalValue;
app.EditField_3.Value = minValue;
app.EditField_4.Value = maxValue;
disp(['Total: ' num2str(totalValue)]);
disp(['Minimum: ' num2str(minValue)]);
disp(['Maximum: ' num2str(maxValue)]);
end

Iniciar sesión para comentar.

Respuesta aceptada

bo zhang
bo zhang el 22 de Feb. de 2024
Editada: bo zhang el 22 de Feb. de 2024
I notice that the EditField you used is numeric type, so the value is numeric and there is no need to str2double.
function CalculateButtonPushed(app, event)
disp('CalculateButtonPushed callback executed');
% Get the values from the edit boxes
value1 = app.CO2EditField.Value; % dont use str2double, bcs the EditField is numeric already
value2 = app.EditField.Value;
disp(['Value1: ' num2str(value1)]);
disp(['Value2: ' num2str(value2)]);
% Check if the input is valid (numeric)
if isnan(value1) || isnan(value2)
% Handle the case when the input is not numeric
% You can display an error message or take other actions
disp('Invalid input. Please enter numeric values.');
return;
end
% Perform calculations
totalValue = value1 + value2;
minValue = min(value1, value2);
maxValue = max(value1, value2);
% Display the results in the text boxes
app.EditField_2.Value = totalValue;
app.EditField_3.Value = minValue;
app.EditField_4.Value = maxValue;
disp(['Total: ' num2str(totalValue)]);
disp(['Minimum: ' num2str(minValue)]);
disp(['Maximum: ' num2str(maxValue)]);
end
  4 comentarios
bo zhang
bo zhang el 16 de Mayo de 2024
Sorry for just notice your new question.
I am not familiar with the FIS, but after reading your code, I noticed several issues: Firstly, you need to specify the membership functions for 'High', 'Low', and 'Medium', because the Rules you give metion that. Secondly, if the output variable is 'trimf', it should only have three parameters for its membership function, but you provided five parameters [0 0.25 0.5 0.75 1]. Thirdly, The ways you called the FIS functions are not in accordance with the function definition rules in MATLAB https://ww2.mathworks.cn/help/releases/R2023a/fuzzy/working-from-the-command-line.html?searchHighlight=MembershipFunctions&s_tid=doc_srchtitle. I suggest referring to the documentation for guidance. Lastly, but most importantly, the FIS should not be placed within a button's callback function. It should be defined as a property of the program within the methods section.
bo zhang
bo zhang el 16 de Mayo de 2024
Editada: bo zhang el 16 de Mayo de 2024
I have made modifications to the FIS part of the code. I defined the membership functions 'Low', 'Medium', and 'High' using gaussmf, referring the range you provided, but the standard deviation and mean values I used are not rigorous (just gave some ramdom value to test it works or not). After the modifications, the FIS should be able to run. However, the specific performance of the FIS still needs adjustments and modifications based on your actual requirements.
Here is the code (well works in MATLAB R2024a):
inputRanges = [0.0002002 0.0009065; 0.0001934 0.001008]; % Input ranges for SO2 and NOx
outputRange = [0 1]; % Output range for APMaterialindex
% Define input variable names
inputNames = {'SO2', 'NOx'};
% Define output variable name
outputName = 'APMaterialindex';
% Define membership functions for input variables
inputMFs = {
'trimf', [0.0002002 0.0005534 0.0009065]; % Membership function for SO2: Triangular
'trimf', [0.0001934 0.0006007 0.001008] % Membership function for NOx: Triangular
};
% Define membership functions for output variable
outputMFs = {
'trimf', [0 0.25 0.5 0.75 1] % Membership function for APMaterialindex: Triangular
};
% Define fuzzy rules
ruleList = [
"IF SO2 IS High AND NOx IS High THEN APMaterialindex IS Low";
"IF SO2 IS High AND NOx IS Medium THEN APMaterialindex IS Low";
"IF SO2 IS High AND NOx IS Low THEN APMaterialindex IS Medium";
"IF SO2 IS Medium AND NOx IS High THEN APMaterialindex IS Medium";
"IF SO2 IS Medium AND NOx IS Medium THEN APMaterialindex IS Medium";
"IF SO2 IS Medium AND NOx IS Low THEN APMaterialindex IS Medium";
"IF SO2 IS Low AND NOx IS High THEN APMaterialindex IS Medium";
"IF SO2 IS Low AND NOx IS Medium THEN APMaterialindex IS Medium";
"IF SO2 IS Low AND NOx IS Low THEN APMaterialindex IS High";
];
% Create FIS object
fis = mamfis;
% Add input(1) membership functions
fis = addInput(fis,inputRanges(1,:),'Name',inputNames{1}, 'MFType', inputMFs{1, 1});
x = linspace(inputRanges(1,1),inputRanges(1,2),100);
guessstd = 0.3*std(x); % give the standard deviation for gaussmf
fis = addMF(fis,inputNames{1},"gaussmf",[guessstd mean(inputMFs{1, 2}(1:2))],"Name","Low");
fis = addMF(fis,inputNames{1},"gaussmf",[guessstd inputMFs{1, 2}(2)],"Name","Medium");
fis = addMF(fis,inputNames{1},"gaussmf",[guessstd inputMFs{1, 2}(3)],"Name","High");
% Add input(2) membership functions
fis = addInput(fis,inputRanges(2,:),'Name',inputNames{2}, 'MFType', inputMFs{2, 1});
x = linspace(inputRanges(2,1),inputRanges(2,2),100);
guessstd = 0.3*std(x); % give the standard deviation for gaussmf
fis = addMF(fis,inputNames{2},"gaussmf",[guessstd mean(inputMFs{2, 2}(1:2))],"Name","Low");
fis = addMF(fis,inputNames{2},"gaussmf",[guessstd inputMFs{2, 2}(2)],"Name","Medium");
fis = addMF(fis,inputNames{2},"gaussmf",[guessstd inputMFs{2, 2}(3)],"Name","High");
% Add output(1) membership functions
fis = addOutput(fis,outputRange,'Name',outputName, 'MFType', outputMFs{1, 1});
x = linspace(outputRange(1,1),outputRange(1,2),100);
guessstd = 0.3*std(x); % give the standard deviation for gaussmf
fis = addMF(fis,outputName,"gaussmf",[guessstd 0.25],"Name","Low");
fis = addMF(fis,outputName,"gaussmf",[guessstd 0.75],"Name","Medium");
fis = addMF(fis,outputName,"gaussmf",[guessstd 1.0 ],"Name","High");
% Add fuzzy rules
fis = addRule(fis, ruleList);
% Get input data from edit fields
SO2 = 0.00055335;
NOx = 0.0006007;
input_data = [SO2, NOx];
% Perform fuzzy inference
AP_Performance = evalfis(fis,input_data); % Pass input data and FIS

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Develop uifigure-Based Apps en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by