RBC / MATLAB /app.m
algorembrant's picture
Upload 16 files
7c60059 verified
classdef BeamAnalysisApp < matlab.apps.AppBase
% BeamAnalysisApp - Interactive Analysis of Nominal Moment Strength (Mn)
% Based on Example 4-1 and 4-1M from ACI 318 Provisions
%
% Variables from Example:
% fc' - Concrete compressive strength
% fy - Steel yield strength
% Es - Modulus of elasticity of steel
% b - Beam width
% h - Total beam depth
% d - Effective depth (to centroid of tension steel)
% As - Total area of tension steel
% beta1 - Stress block factor (0.85 for fc' <= 4000 psi)
% epsilon_cu - Ultimate concrete strain (0.003)
%
% Calculated:
% T - Tension force in steel
% a - Depth of equivalent stress block
% c - Neutral axis depth
% epsilon_y - Yield strain of steel
% epsilon_s - Strain in steel at ultimate
% Mn - Nominal moment strength
% As_min - Minimum steel area per ACI
properties (Access = public)
UIFigure matlab.ui.Figure
MainGrid matlab.ui.container.GridLayout
% Panels
InputPanel matlab.ui.container.Panel
DiagramPanel matlab.ui.container.Panel
ResultsPanel matlab.ui.container.Panel
EquationsPanel matlab.ui.container.Panel
% Inputs - Material
UnitSwitch matlab.ui.control.Switch
EditFc matlab.ui.control.NumericEditField
EditFy matlab.ui.control.NumericEditField
EditEs matlab.ui.control.NumericEditField
EditBeta1 matlab.ui.control.NumericEditField
EditEpsCu matlab.ui.control.NumericEditField
% Inputs - Geometry
EditB matlab.ui.control.NumericEditField
EditH matlab.ui.control.NumericEditField
EditD matlab.ui.control.NumericEditField
% Inputs - Reinforcement
EditBars matlab.ui.control.NumericEditField
EditBarArea matlab.ui.control.NumericEditField
% Visualization Axes
AxSection matlab.ui.control.UIAxes
AxStrain matlab.ui.control.UIAxes
AxStress matlab.ui.control.UIAxes
AxEquations matlab.ui.control.UIAxes
% Results
ResultsText matlab.ui.control.TextArea
end
properties (Access = private)
Units struct
% Color scheme
Colors struct
end
methods (Access = private)
function updateApp(app, ~)
% === 1. GET INPUTS ===
is_imperial = strcmp(app.UnitSwitch.Value, 'Imperial');
fc = app.EditFc.Value;
fy = app.EditFy.Value;
Es = app.EditEs.Value;
beta1 = app.EditBeta1.Value;
epsilon_cu = app.EditEpsCu.Value;
b = app.EditB.Value;
h = app.EditH.Value;
d = app.EditD.Value;
n_bars = app.EditBars.Value;
bar_A = app.EditBarArea.Value;
As = n_bars * bar_A;
% Set units
if is_imperial
app.Units = struct('len', 'in', 'area', 'in2', 'force', 'lb', ...
'stress', 'psi', 'moment', 'lb-in', 'moment_k', 'k-in', 'moment_alt', 'k-ft');
else
app.Units = struct('len', 'mm', 'area', 'mm2', 'force', 'N', ...
'stress', 'MPa', 'moment', 'N-mm', 'moment_k', 'N-mm', 'moment_alt', 'kN-m');
end
u = app.Units;
clr = app.Colors;
% === 2. CALCULATIONS ===
T = As * fy;
a = (As * fy) / (0.85 * fc * b);
c = a / beta1;
epsilon_y = fy / Es;
epsilon_s = epsilon_cu * (d - c) / c;
if epsilon_s >= epsilon_y
yield_check = true;
fs = fy;
else
yield_check = false;
fs = epsilon_s * Es;
end
Mn = As * fs * (d - a/2);
if is_imperial
Mn_disp = Mn / 12000;
T_disp = T / 1000;
Mn_k = Mn / 1000;
else
Mn_disp = Mn / 1e6;
T_disp = T / 1000;
Mn_k = Mn;
end
if is_imperial
term1 = (3 * sqrt(fc) / fy) * b * d;
term2 = (200 / fy) * b * d;
else
term1 = (0.25 * sqrt(fc) / fy) * b * d;
term2 = (1.4 / fy) * b * d;
end
As_min = max(term1, term2);
As_check = As >= As_min;
% === 3. CROSS SECTION DIAGRAM ===
ax = app.AxSection;
cla(ax); hold(ax, 'on');
% Concrete beam
rectangle(ax, 'Position', [0, 0, b, h], ...
'FaceColor', clr.concrete, 'EdgeColor', clr.outline, 'LineWidth', 1.5);
% Compression zone
patch(ax, [0, b, b, 0], [h, h, h-a, h-a], clr.compression, ...
'EdgeColor', 'none', 'FaceAlpha', 0.6);
% Neutral axis line
plot(ax, [0, b], [h-c, h-c], '--', 'Color', clr.neutral, 'LineWidth', 1.2);
% Steel bars
bar_r = sqrt(bar_A/pi) * 0.7;
steel_y = h - d;
if n_bars == 1
cx = b/2;
else
cx = linspace(b*0.12, b*0.88, n_bars);
end
for i = 1:n_bars
rectangle(ax, 'Position', [cx(i)-bar_r, steel_y-bar_r, 2*bar_r, 2*bar_r], ...
'FaceColor', clr.steel, 'EdgeColor', [0.1 0.1 0.1], 'Curvature', [1 1], 'LineWidth', 0.5);
end
% Dimension: h
xh = b + b*0.08;
plot(ax, [xh, xh], [0, h], 'k-', 'LineWidth', 0.8);
plot(ax, [b, xh+b*0.02], [0, 0], 'k-', 'LineWidth', 0.8);
plot(ax, [b, xh+b*0.02], [h, h], 'k-', 'LineWidth', 0.8);
text(ax, xh+b*0.04, h/2, sprintf('h=%.1f', h), 'FontSize', 9, 'FontName', 'Arial');
% Dimension: d
xd = b + b*0.22;
plot(ax, [xd, xd], [steel_y, h], 'Color', clr.dimension, 'LineWidth', 0.8);
text(ax, xd+b*0.04, (h+steel_y)/2, sprintf('d=%.1f', d), 'FontSize', 9, 'Color', clr.dimension, 'FontName', 'Arial');
% Dimension: a
xa = -b*0.08;
plot(ax, [xa, xa], [h-a, h], 'Color', clr.compression_line, 'LineWidth', 1.5);
text(ax, xa-b*0.15, h-a/2, sprintf('a=%.2f', a), 'FontSize', 9, 'Color', clr.compression_line, 'FontName', 'Arial');
% Dimension: b
text(ax, b/2, -h*0.06, sprintf('b=%.1f', b), 'HorizontalAlignment', 'center', 'FontSize', 9, 'FontName', 'Arial');
% c label (neutral axis depth)
text(ax, b+b*0.04, h-c, sprintf('c=%.2f', c), 'FontSize', 8, 'Color', clr.neutral, 'FontName', 'Arial');
axis(ax, 'equal');
ax.XLim = [-b*0.25, b*1.4];
ax.YLim = [-h*0.12, h*1.08];
ax.XTick = []; ax.YTick = [];
ax.XColor = 'none'; ax.YColor = 'none';
title(ax, 'Cross Section', 'FontWeight', 'bold', 'FontSize', 11, 'FontName', 'Arial');
% === 4. STRAIN DIAGRAM ===
ax = app.AxStrain;
cla(ax); hold(ax, 'on');
strain_w = 0.4;
% Beam outline (reference)
plot(ax, [0, 0], [0, h], 'Color', [0.7 0.7 0.7], 'LineWidth', 1);
% Strain profile fill
x_top = epsilon_cu * strain_w / 0.003;
x_bot = epsilon_s * strain_w / 0.003;
patch(ax, [0, x_top, x_bot, 0], [h, h, steel_y, steel_y], clr.strain, ...
'EdgeColor', clr.strain_edge, 'LineWidth', 1.2, 'FaceAlpha', 0.5);
% Neutral axis
plot(ax, [-0.05, strain_w*1.2], [h-c, h-c], '--', 'Color', clr.neutral, 'LineWidth', 1);
text(ax, -0.03, h-c, sprintf('c=%.2f', c), 'FontSize', 8, 'HorizontalAlignment', 'right', 'Color', clr.neutral, 'FontName', 'Arial');
% Labels
text(ax, x_top+0.02, h, sprintf('ecu=%.4f', epsilon_cu), 'FontSize', 9, 'Color', clr.strain_edge, 'FontName', 'Arial');
text(ax, x_bot+0.02, steel_y, sprintf('es=%.5f', epsilon_s), 'FontSize', 9, 'Color', clr.strain_edge, 'FontName', 'Arial');
ax.XLim = [-0.1, strain_w*1.5];
ax.YLim = [-h*0.12, h*1.08];
ax.XTick = []; ax.YTick = [];
ax.XColor = 'none'; ax.YColor = 'none';
title(ax, 'Strain Distribution', 'FontWeight', 'bold', 'FontSize', 11, 'FontName', 'Arial');
% === 5. STRESS/FORCE DIAGRAM ===
ax = app.AxStress;
cla(ax); hold(ax, 'on');
stress_w = 0.5;
% Compression block
patch(ax, [0, stress_w, stress_w, 0], [h, h, h-a, h-a], clr.compression, ...
'EdgeColor', clr.compression_line, 'LineWidth', 1.2, 'FaceAlpha', 0.7);
text(ax, stress_w/2, h-a/2, '0.85fc''', 'HorizontalAlignment', 'center', 'FontSize', 9, 'FontName', 'Arial');
% Compression force arrow
quiver(ax, stress_w+0.05, h-a/2, 0.2, 0, 0, 'Color', clr.compression_line, 'LineWidth', 2, 'MaxHeadSize', 0.8);
text(ax, stress_w+0.28, h-a/2, sprintf('C=%.0f k', T_disp), 'FontSize', 9, 'Color', clr.compression_line, 'FontName', 'Arial');
% Steel location
plot(ax, [0, stress_w*0.3], [steel_y, steel_y], 'Color', clr.steel, 'LineWidth', 2);
% Tension force arrow
quiver(ax, 0, steel_y, 0.25, 0, 0, 'Color', clr.tension, 'LineWidth', 2, 'MaxHeadSize', 0.8);
text(ax, 0.28, steel_y, sprintf('T=%.0f k', T_disp), 'FontSize', 9, 'Color', clr.tension, 'FontName', 'Arial');
% Neutral axis
plot(ax, [-0.05, stress_w+0.3], [h-c, h-c], '--', 'Color', clr.neutral, 'LineWidth', 1);
% Moment arm
xa_arm = stress_w + 0.45;
plot(ax, [xa_arm, xa_arm], [h-a/2, steel_y], 'Color', clr.moment_arm, 'LineWidth', 1.5);
plot(ax, [xa_arm-0.02, xa_arm+0.02], [h-a/2, h-a/2], 'Color', clr.moment_arm, 'LineWidth', 1.5);
plot(ax, [xa_arm-0.02, xa_arm+0.02], [steel_y, steel_y], 'Color', clr.moment_arm, 'LineWidth', 1.5);
text(ax, xa_arm+0.03, (h-a/2+steel_y)/2, 'd-a/2', 'FontSize', 9, 'Color', clr.moment_arm, 'FontName', 'Arial');
ax.XLim = [-0.1, stress_w+0.65];
ax.YLim = [-h*0.12, h*1.08];
ax.XTick = []; ax.YTick = [];
ax.XColor = 'none'; ax.YColor = 'none';
title(ax, 'Stress Block & Forces', 'FontWeight', 'bold', 'FontSize', 11, 'FontName', 'Arial');
% === 6. EQUATIONS PANEL ===
ax = app.AxEquations;
cla(ax); hold(ax, 'on');
axis(ax, 'off');
ax.XLim = [0 1]; ax.YLim = [0 1];
y = 0.92;
dy = 0.115;
fs = 10;
% Header
text(ax, 0.01, y, 'STEP-BY-STEP CALCULATIONS', 'FontWeight', 'bold', 'FontSize', 12, 'FontName', 'Arial');
y = y - dy*0.7;
% Step 1
eq1 = sprintf('$$A_s = n \\times A_{bar} = %.0f \\times %.3f = %.3f \\; \\mathrm{%s}$$', n_bars, bar_A, As, u.area);
text(ax, 0.01, y, eq1, 'Interpreter', 'latex', 'FontSize', fs);
y = y - dy*0.6;
eq2 = sprintf('$$T = A_s \\cdot f_y = %.3f \\times %.0f = %.0f \\; \\mathrm{%s} \\;\\; (%.1f \\; \\mathrm{kips})$$', As, fy, T, u.force, T_disp);
text(ax, 0.01, y, eq2, 'Interpreter', 'latex', 'FontSize', fs);
y = y - dy;
% Step 2
eq3 = sprintf('$$a = \\frac{A_s f_y}{0.85 f''_c b} = \\frac{%.0f}{0.85 \\times %.0f \\times %.1f} = %.4f \\; \\mathrm{%s}$$', T, fc, b, a, u.len);
text(ax, 0.01, y, eq3, 'Interpreter', 'latex', 'FontSize', fs);
y = y - dy*0.6;
eq4 = sprintf('$$c = \\frac{a}{\\beta_1} = \\frac{%.4f}{%.3f} = %.4f \\; \\mathrm{%s}$$', a, beta1, c, u.len);
text(ax, 0.01, y, eq4, 'Interpreter', 'latex', 'FontSize', fs);
y = y - dy;
% Step 3
eq5 = sprintf('$$\\varepsilon_y = \\frac{f_y}{E_s} = \\frac{%.0f}{%.0f} = %.6f$$', fy, Es, epsilon_y);
text(ax, 0.01, y, eq5, 'Interpreter', 'latex', 'FontSize', fs);
eq6 = sprintf('$$\\varepsilon_s = \\left(\\frac{d-c}{c}\\right)\\varepsilon_{cu} = \\left(\\frac{%.2f-%.2f}{%.2f}\\right)(%.4f) = %.6f$$', d, c, c, epsilon_cu, epsilon_s);
text(ax, 0.45, y, eq6, 'Interpreter', 'latex', 'FontSize', fs);
if yield_check
text(ax, 0.92, y, '[OK]', 'FontSize', 10, 'Color', clr.ok, 'FontWeight', 'bold', 'FontName', 'Arial');
else
text(ax, 0.92, y, '[NG]', 'FontSize', 10, 'Color', clr.ng, 'FontWeight', 'bold', 'FontName', 'Arial');
end
y = y - dy;
% Step 4
eq7 = sprintf('$$M_n = A_s f_y \\left(d - \\frac{a}{2}\\right) = %.0f \\left(%.2f - \\frac{%.4f}{2}\\right) = %.0f \\; \\mathrm{%s}$$', T, d, a, Mn_k, u.moment_k);
text(ax, 0.01, y, eq7, 'Interpreter', 'latex', 'FontSize', fs);
y = y - dy*0.6;
result_txt = sprintf('Mn = %.1f %s', Mn_disp, u.moment_alt);
text(ax, 0.01, y, result_txt, 'FontSize', 13, 'Color', clr.result, 'FontWeight', 'bold', 'FontName', 'Arial');
y = y - dy;
% Step 5
if is_imperial
eq9 = sprintf('$$A_{s,min} = \\max\\left(\\frac{3\\sqrt{f''_c}}{f_y}b_wd,\\;\\frac{200}{f_y}b_wd\\right) = %.4f \\; \\mathrm{%s}$$', As_min, u.area);
else
eq9 = sprintf('$$A_{s,min} = \\max\\left(\\frac{0.25\\sqrt{f''_c}}{f_y}b_wd,\\;\\frac{1.4}{f_y}b_wd\\right) = %.1f \\; \\mathrm{%s}$$', As_min, u.area);
end
text(ax, 0.01, y, eq9, 'Interpreter', 'latex', 'FontSize', fs);
if As_check
text(ax, 0.75, y, sprintf('As >= As,min [OK]'), 'FontSize', 10, 'Color', clr.ok, 'FontWeight', 'bold', 'FontName', 'Arial');
else
text(ax, 0.75, y, sprintf('As < As,min [NG]'), 'FontSize', 10, 'Color', clr.ng, 'FontWeight', 'bold', 'FontName', 'Arial');
end
% === 7. RESULTS TEXT ===
if yield_check
yield_str = 'Yes (Steel Yields)';
else
yield_str = 'No (Steel Elastic)';
end
if As_check
asmin_str = 'OK';
else
asmin_str = 'NOT OK';
end
results_str = sprintf([...
'RESULTS SUMMARY\n' ...
'================\n\n' ...
'Steel Area:\n' ...
' As = %.4f %s\n\n' ...
'Forces:\n' ...
' T = C = %.2f kips\n\n' ...
'Geometry:\n' ...
' a = %.4f %s\n' ...
' c = %.4f %s\n\n' ...
'Strain Check:\n' ...
' ey = %.6f\n' ...
' es = %.6f\n' ...
' Yield: %s\n\n' ...
'NOMINAL MOMENT:\n' ...
' Mn = %.1f %s\n\n' ...
'Min Steel Check:\n' ...
' As,min = %.4f %s\n' ...
' Status: %s'], ...
As, u.area, T_disp, a, u.len, c, u.len, ...
epsilon_y, epsilon_s, yield_str, ...
Mn_disp, u.moment_alt, As_min, u.area, asmin_str);
app.ResultsText.Value = results_str;
end
function switchUnits(app, ~)
if strcmp(app.UnitSwitch.Value, 'Imperial')
app.EditFc.Value = 4000;
app.EditFy.Value = 60000;
app.EditEs.Value = 29000000;
app.EditBeta1.Value = 0.85;
app.EditEpsCu.Value = 0.003;
app.EditB.Value = 12;
app.EditH.Value = 20;
app.EditD.Value = 17.5;
app.EditBars.Value = 4;
app.EditBarArea.Value = 0.79;
else
app.EditFc.Value = 20;
app.EditFy.Value = 420;
app.EditEs.Value = 200000;
app.EditBeta1.Value = 0.85;
app.EditEpsCu.Value = 0.003;
app.EditB.Value = 250;
app.EditH.Value = 565;
app.EditD.Value = 500;
app.EditBars.Value = 3;
app.EditBarArea.Value = 510;
end
updateApp(app);
end
end
methods (Access = public)
function app = BeamAnalysisApp()
createComponents(app);
initializeColors(app);
updateApp(app);
registerApp(app, app.UIFigure);
if nargout == 0
clear app
end
end
function delete(app)
delete(app.UIFigure);
end
end
methods (Access = private)
function initializeColors(app)
% Professional color scheme
app.Colors = struct(...
'concrete', [0.88 0.88 0.86], ...
'outline', [0.3 0.3 0.3], ...
'compression', [0.85 0.55 0.55], ...
'compression_line', [0.7 0.2 0.2], ...
'tension', [0.2 0.4 0.7], ...
'steel', [0.25 0.25 0.3], ...
'neutral', [0.4 0.4 0.4], ...
'dimension', [0.2 0.5 0.7], ...
'strain', [0.7 0.85 0.95], ...
'strain_edge', [0.2 0.4 0.6], ...
'moment_arm', [0.2 0.6 0.3], ...
'result', [0.1 0.3 0.6], ...
'ok', [0.1 0.5 0.2], ...
'ng', [0.7 0.15 0.15], ...
'bg', [0.97 0.97 0.97], ...
'panel_bg', [1 1 1]);
end
function createComponents(app)
% === MAIN FIGURE ===
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Position = [80 60 1400 800];
app.UIFigure.Name = 'Beam Analysis - Nominal Moment Strength (ACI 318)';
app.UIFigure.Color = [0.94 0.94 0.94];
app.UIFigure.Resize = 'on';
% === MAIN GRID ===
app.MainGrid = uigridlayout(app.UIFigure);
app.MainGrid.ColumnWidth = {'0.18x', '0.82x'};
app.MainGrid.RowHeight = {'1x'};
app.MainGrid.Padding = [8 8 8 8];
app.MainGrid.ColumnSpacing = 8;
% === LEFT: INPUT PANEL ===
app.InputPanel = uipanel(app.MainGrid);
app.InputPanel.Layout.Row = 1;
app.InputPanel.Layout.Column = 1;
app.InputPanel.Title = 'INPUT PARAMETERS';
app.InputPanel.FontWeight = 'bold';
app.InputPanel.FontSize = 11;
app.InputPanel.BackgroundColor = [1 1 1];
inpGrid = uigridlayout(app.InputPanel);
inpGrid.ColumnWidth = {'1.3x', '1x'};
inpGrid.RowHeight = repmat({'fit'}, 1, 16);
inpGrid.RowSpacing = 4;
inpGrid.Padding = [8 8 8 8];
% Unit Switch
lbl = uilabel(inpGrid); lbl.Text = 'Unit System'; lbl.FontWeight = 'bold';
app.UnitSwitch = uiswitch(inpGrid, 'slider');
app.UnitSwitch.Items = {'Imperial', 'SI'};
app.UnitSwitch.ValueChangedFcn = createCallbackFcn(app, @switchUnits, true);
% Separator - Materials
lbl = uilabel(inpGrid); lbl.Text = 'MATERIALS'; lbl.FontWeight = 'bold'; lbl.FontColor = [0.3 0.3 0.5];
uilabel(inpGrid);
% fc
lbl = uilabel(inpGrid); lbl.Text = 'fc'' (Concrete)';
app.EditFc = uieditfield(inpGrid, 'numeric');
app.EditFc.ValueChangedFcn = createCallbackFcn(app, @updateApp, true);
% fy
lbl = uilabel(inpGrid); lbl.Text = 'fy (Steel Yield)';
app.EditFy = uieditfield(inpGrid, 'numeric');
app.EditFy.ValueChangedFcn = createCallbackFcn(app, @updateApp, true);
% Es
lbl = uilabel(inpGrid); lbl.Text = 'Es (Modulus)';
app.EditEs = uieditfield(inpGrid, 'numeric');
app.EditEs.ValueChangedFcn = createCallbackFcn(app, @updateApp, true);
% beta1
lbl = uilabel(inpGrid); lbl.Text = 'Beta1';
app.EditBeta1 = uieditfield(inpGrid, 'numeric');
app.EditBeta1.ValueChangedFcn = createCallbackFcn(app, @updateApp, true);
% epsilon_cu
lbl = uilabel(inpGrid); lbl.Text = 'ecu (Ult. Strain)';
app.EditEpsCu = uieditfield(inpGrid, 'numeric');
app.EditEpsCu.ValueDisplayFormat = '%.4f';
app.EditEpsCu.ValueChangedFcn = createCallbackFcn(app, @updateApp, true);
% Separator - Geometry
lbl = uilabel(inpGrid); lbl.Text = 'GEOMETRY'; lbl.FontWeight = 'bold'; lbl.FontColor = [0.3 0.3 0.5];
uilabel(inpGrid);
% b
lbl = uilabel(inpGrid); lbl.Text = 'b (Width)';
app.EditB = uieditfield(inpGrid, 'numeric');
app.EditB.ValueChangedFcn = createCallbackFcn(app, @updateApp, true);
% h
lbl = uilabel(inpGrid); lbl.Text = 'h (Total Depth)';
app.EditH = uieditfield(inpGrid, 'numeric');
app.EditH.ValueChangedFcn = createCallbackFcn(app, @updateApp, true);
% d
lbl = uilabel(inpGrid); lbl.Text = 'd (Eff. Depth)';
app.EditD = uieditfield(inpGrid, 'numeric');
app.EditD.ValueChangedFcn = createCallbackFcn(app, @updateApp, true);
% Separator - Reinforcement
lbl = uilabel(inpGrid); lbl.Text = 'REINFORCEMENT'; lbl.FontWeight = 'bold'; lbl.FontColor = [0.3 0.3 0.5];
uilabel(inpGrid);
% Bars
lbl = uilabel(inpGrid); lbl.Text = 'Number of Bars';
app.EditBars = uieditfield(inpGrid, 'numeric');
app.EditBars.ValueDisplayFormat = '%.0f';
app.EditBars.ValueChangedFcn = createCallbackFcn(app, @updateApp, true);
% Bar Area
lbl = uilabel(inpGrid); lbl.Text = 'Bar Area (each)';
app.EditBarArea = uieditfield(inpGrid, 'numeric');
app.EditBarArea.ValueChangedFcn = createCallbackFcn(app, @updateApp, true);
% === RIGHT PANEL ===
rightGrid = uigridlayout(app.MainGrid);
rightGrid.Layout.Row = 1;
rightGrid.Layout.Column = 2;
rightGrid.ColumnWidth = {'1x', '1x', '1x', '0.6x'};
rightGrid.RowHeight = {'1.2x', '1.5x'};
rightGrid.Padding = [0 0 0 0];
rightGrid.ColumnSpacing = 6;
rightGrid.RowSpacing = 6;
% --- Diagram Panels ---
% Section
sectionPanel = uipanel(rightGrid);
sectionPanel.Layout.Row = 1;
sectionPanel.Layout.Column = 1;
sectionPanel.BackgroundColor = [1 1 1];
sectionPanel.BorderType = 'line';
secGrid = uigridlayout(sectionPanel);
secGrid.ColumnWidth = {'1x'};
secGrid.RowHeight = {'1x'};
secGrid.Padding = [2 2 2 2];
app.AxSection = uiaxes(secGrid);
app.AxSection.Layout.Row = 1;
app.AxSection.Layout.Column = 1;
% Strain
strainPanel = uipanel(rightGrid);
strainPanel.Layout.Row = 1;
strainPanel.Layout.Column = 2;
strainPanel.BackgroundColor = [1 1 1];
strainPanel.BorderType = 'line';
strGrid = uigridlayout(strainPanel);
strGrid.ColumnWidth = {'1x'};
strGrid.RowHeight = {'1x'};
strGrid.Padding = [2 2 2 2];
app.AxStrain = uiaxes(strGrid);
app.AxStrain.Layout.Row = 1;
app.AxStrain.Layout.Column = 1;
% Stress
stressPanel = uipanel(rightGrid);
stressPanel.Layout.Row = 1;
stressPanel.Layout.Column = 3;
stressPanel.BackgroundColor = [1 1 1];
stressPanel.BorderType = 'line';
stressGrid = uigridlayout(stressPanel);
stressGrid.ColumnWidth = {'1x'};
stressGrid.RowHeight = {'1x'};
stressGrid.Padding = [2 2 2 2];
app.AxStress = uiaxes(stressGrid);
app.AxStress.Layout.Row = 1;
app.AxStress.Layout.Column = 1;
% Results
app.ResultsPanel = uipanel(rightGrid);
app.ResultsPanel.Layout.Row = 1;
app.ResultsPanel.Layout.Column = 4;
app.ResultsPanel.Title = 'Results';
app.ResultsPanel.FontWeight = 'bold';
app.ResultsPanel.BackgroundColor = [0.98 0.98 0.95];
resGrid = uigridlayout(app.ResultsPanel);
resGrid.ColumnWidth = {'1x'};
resGrid.RowHeight = {'1x'};
resGrid.Padding = [4 4 4 4];
app.ResultsText = uitextarea(resGrid);
app.ResultsText.Layout.Row = 1;
app.ResultsText.Layout.Column = 1;
app.ResultsText.FontName = 'Consolas';
app.ResultsText.FontSize = 9;
app.ResultsText.Editable = 'off';
app.ResultsText.BackgroundColor = [0.98 0.98 0.95];
% --- Equations Panel ---
app.EquationsPanel = uipanel(rightGrid);
app.EquationsPanel.Layout.Row = 2;
app.EquationsPanel.Layout.Column = [1 4];
app.EquationsPanel.Title = 'Calculation Procedure (ACI 318)';
app.EquationsPanel.FontWeight = 'bold';
app.EquationsPanel.BackgroundColor = [1 1 1];
eqGrid = uigridlayout(app.EquationsPanel);
eqGrid.ColumnWidth = {'1x'};
eqGrid.RowHeight = {'1x'};
eqGrid.Padding = [4 4 4 4];
app.AxEquations = uiaxes(eqGrid);
app.AxEquations.Layout.Row = 1;
app.AxEquations.Layout.Column = 1;
app.AxEquations.XTick = [];
app.AxEquations.YTick = [];
app.AxEquations.XColor = 'none';
app.AxEquations.YColor = 'none';
% === SET INITIAL VALUES ===
app.EditFc.Value = 4000;
app.EditFy.Value = 60000;
app.EditEs.Value = 29000000;
app.EditBeta1.Value = 0.85;
app.EditEpsCu.Value = 0.003;
app.EditB.Value = 12;
app.EditH.Value = 20;
app.EditD.Value = 17.5;
app.EditBars.Value = 4;
app.EditBarArea.Value = 0.79;
app.UIFigure.Visible = 'on';
end
end
end