Can someone run this function and give the results as I have 2017 version and I believe there are some functions that work in latest versions
1 view (last 30 days)
Show older comments
%% INPUT
%% Example truss
% Nodal x and y coordinates
nodeXY = [ 0 0; 10 5; 10 0; 20 8;20 0; 30 9;
30 0; 40 8; 40 0; 50 5; 50 0; 60 0];
% Each row represents an element - the columns are nodal indices
% E.g., 1 3 represents an element connecting node 1 (0, 0) and
% node 3 (10, 0) from the above list
elemNodes = [ 1 3; 3 5; 5 7; 7 9; 9 11; 11 12;
1 2; 2 4; 4 6; 6 8; 8 10; 10 12;
2 3; 4 5; 6 7; 8 9; 10 11; 2 5; 4 7; 7 8; 9 10];
% Function to plot and visualize the truss structure
plot_plane_truss(nodeXY, elemNodes)
%% THE FUNCTION
function [] = plot_plane_truss(nodeCrds, elemNodes)
% Check if the inputs have the correct dimensions
dims1 = size(nodeCrds);
dims2 = size(elemNodes);
if dims1(2) ~= 2 || dims2(2) ~= 2
error("Error: The arguments each should have two columns!")
end
% Separate x and y coordinates into different vectors
xCrds = nodeCrds(:, 1);
yCrds = nodeCrds(:, 2);
% Create a new figure which contains all the plots
figure
set(gcf, 'Position', [500, 500, 1200, 800]);
hold on
numElems = dims2(1); % Number of elements
elemMPXCrds = zeros(numElems, 1); % Stores element midpoint x-coordinates
elemMPYCrds = zeros(numElems, 1); % Stores element midpoint y-coordinates
% Loop over the input element connectivity matrix to plot each
% individual element separately
for e = 1:1:numElems
node1Idx = elemNodes(e, 1);
node2Idx = elemNodes(e, 2);
elemXCrds = [xCrds(node1Idx) xCrds(node2Idx)];
elemYCrds = [yCrds(node1Idx) yCrds(node2Idx)];
plot(elemXCrds, elemYCrds, '-k', 'LineWidth', 2);
elemMPXCrds(e) = mean(elemXCrds);
elemMPYCrds(e) = mean(elemYCrds);
end
% Node markers in red
nodeMarkerHandle = plot(xCrds, yCrds, 'ok', 'MarkerSize', 6, 'MarkerFaceColor', 'r');
nodeMarkerHandle.Visible = 'off';
% Setting the aspect ratio and extent of the plots
xLen = max(xCrds) - min(xCrds);
yLen = max(yCrds) - min(yCrds);
pbaspect([xLen yLen 1])
offset = min(yLen, xLen)/2;
xlim([min(xCrds) - offset, max(xCrds) + offset]);
ylim([min(yCrds) - offset, max(yCrds) + offset]);
% Button to toggle the visibility of nodal position markers
tb1 = uicontrol;
tb1.Style = 'togglebutton';
tb1.String = {'Nodes On'};
tb1.Callback = @buttonCallback1;
tb1.Position = [100 200 100 20];
function buttonCallback1(src, event)
button_state = get(src, 'Value');
if button_state
nodeMarkerHandle.Visible = 'on';
tb1.String = {'Nodes Off'};
else
nodeMarkerHandle.Visible = 'off';
tb1.String = {'Nodes On'};
end
end
% Text labels for nodes
offset = 0.07*min(xLen, yLen);
nodeLblxCrds = xCrds - offset;
nodeLblyCrds = yCrds + offset;
numNodes = dims1(1);
nodeLbls = text(nodeLblxCrds, nodeLblyCrds, string([1:1:numNodes]), 'BackgroundColor', 'w', 'FontWeight', 'bold');
set(nodeLbls, 'Color', 'none');
% Button to toggle node labels
tb2 = uicontrol;
tb2.Style = 'togglebutton';
tb2.String = {'Node Labels On'};
tb2.Callback = @buttonCallback2;
tb2.Position = [220 200 100 20];
function buttonCallback2(src, event)
button_state = get(src, 'Value');
if button_state
set(nodeLbls, 'Color', 'b');
tb2.String = {'Node Labels Off'};
else
set(nodeLbls, 'Color', 'none');
tb2.String = {'Node Labels On'};
end
end
% Text labels for elements
offset = 0.*min(xLen, yLen);
elemLblxCrds = elemMPXCrds - offset;
elemLblyCrds = elemMPYCrds + offset;
elemLbls = text(elemLblxCrds, elemLblyCrds, string([1:1:numElems]), 'BackgroundColor', 'w', 'FontWeight', 'bold');
set(elemLbls, 'Color', 'none');
% Button to toggle element labels
tb3 = uicontrol;
tb3.Style = 'togglebutton';
tb3.String = {'Element Labels On'};
tb3.Callback = @buttonCallback3;
tb3.Position = [340 200 100 20];
function buttonCallback3(src, event)
button_state = get(src, 'Value');
if button_state
set(elemLbls, 'Color', 'r');
tb3.String = {'Element Labels Off'};
else
set(elemLbls, 'Color', 'none');
tb3.String = {'Element Labels On'};
end
end
end
0 Comments
Accepted Answer
Voss
on 19 May 2022
It appears to run ok in R2017b. I guess that means you have R2017a.
Here's the result:
openfig('untitled.fig');
If I had to guess which function is causing the problem, my first guess would be string. If that's the one, you can change
string([1:1:numNodes])
to
sprintfc('%d',1:numNodes)
and similarly for the other place where string is used.
If that's not the function causing the problem, how about you state what the problem is?
4 Comments
More Answers (1)
David Hill
on 19 May 2022
Edited: David Hill
on 19 May 2022
Yes, code runs. All three buttons work properly.
nodeXY = [ 0 0; 10 5; 10 0; 20 8;20 0; 30 9;
30 0; 40 8; 40 0; 50 5; 50 0; 60 0];
% Each row represents an element - the columns are nodal indices
% E.g., 1 3 represents an element connecting node 1 (0, 0) and
% node 3 (10, 0) from the above list
elemNodes = [ 1 3; 3 5; 5 7; 7 9; 9 11; 11 12;
1 2; 2 4; 4 6; 6 8; 8 10; 10 12;
2 3; 4 5; 6 7; 8 9; 10 11; 2 5; 4 7; 7 8; 9 10];
% Function to plot and visualize the truss structure
plot_plane_truss(nodeXY, elemNodes)
function [] = plot_plane_truss(nodeCrds, elemNodes)
% Check if the inputs have the correct dimensions
dims1 = size(nodeCrds);
dims2 = size(elemNodes);
if dims1(2) ~= 2 || dims2(2) ~= 2
error("Error: The arguments each should have two columns!")
end
% Separate x and y coordinates into different vectors
xCrds = nodeCrds(:, 1);
yCrds = nodeCrds(:, 2);
% Create a new figure which contains all the plots
figure
set(gcf, 'Position', [500, 500, 1200, 800]);
hold on
numElems = dims2(1); % Number of elements
elemMPXCrds = zeros(numElems, 1); % Stores element midpoint x-coordinates
elemMPYCrds = zeros(numElems, 1); % Stores element midpoint y-coordinates
% Loop over the input element connectivity matrix to plot each
% individual element separately
for e = 1:1:numElems
node1Idx = elemNodes(e, 1);
node2Idx = elemNodes(e, 2);
elemXCrds = [xCrds(node1Idx) xCrds(node2Idx)];
elemYCrds = [yCrds(node1Idx) yCrds(node2Idx)];
plot(elemXCrds, elemYCrds, '-k', 'LineWidth', 2);
elemMPXCrds(e) = mean(elemXCrds);
elemMPYCrds(e) = mean(elemYCrds);
end
% Node markers in red
nodeMarkerHandle = plot(xCrds, yCrds, 'ok', 'MarkerSize', 6, 'MarkerFaceColor', 'r');
nodeMarkerHandle.Visible = 'off';
% Setting the aspect ratio and extent of the plots
xLen = max(xCrds) - min(xCrds);
yLen = max(yCrds) - min(yCrds);
pbaspect([xLen yLen 1])
offset = min(yLen, xLen)/2;
xlim([min(xCrds) - offset, max(xCrds) + offset]);
ylim([min(yCrds) - offset, max(yCrds) + offset]);
% Button to toggle the visibility of nodal position markers
tb1 = uicontrol;
tb1.Style = 'togglebutton';
tb1.String = {'Nodes On'};
tb1.Callback = @buttonCallback1;
tb1.Position = [100 200 100 20];
function buttonCallback1(src, event)
button_state = get(src, 'Value');
if button_state
nodeMarkerHandle.Visible = 'on';
tb1.String = {'Nodes Off'};
else
nodeMarkerHandle.Visible = 'off';
tb1.String = {'Nodes On'};
end
end
% Text labels for nodes
offset = 0.07*min(xLen, yLen);
nodeLblxCrds = xCrds - offset;
nodeLblyCrds = yCrds + offset;
numNodes = dims1(1);
nodeLbls = text(nodeLblxCrds, nodeLblyCrds, string([1:1:numNodes]), 'BackgroundColor', 'w', 'FontWeight', 'bold');
set(nodeLbls, 'Color', 'none');
% Button to toggle node labels
tb2 = uicontrol;
tb2.Style = 'togglebutton';
tb2.String = {'Node Labels On'};
tb2.Callback = @buttonCallback2;
tb2.Position = [220 200 100 20];
function buttonCallback2(src, event)
button_state = get(src, 'Value');
if button_state
set(nodeLbls, 'Color', 'b');
tb2.String = {'Node Labels Off'};
else
set(nodeLbls, 'Color', 'none');
tb2.String = {'Node Labels On'};
end
end
% Text labels for elements
offset = 0.*min(xLen, yLen);
elemLblxCrds = elemMPXCrds - offset;
elemLblyCrds = elemMPYCrds + offset;
elemLbls = text(elemLblxCrds, elemLblyCrds, string([1:1:numElems]), 'BackgroundColor', 'w', 'FontWeight', 'bold');
set(elemLbls, 'Color', 'none');
% Button to toggle element labels
tb3 = uicontrol;
tb3.Style = 'togglebutton';
tb3.String = {'Element Labels On'};
tb3.Callback = @buttonCallback3;
tb3.Position = [340 200 100 20];
function buttonCallback3(src, event)
button_state = get(src, 'Value');
if button_state
set(elemLbls, 'Color', 'r');
tb3.String = {'Element Labels Off'};
else
set(elemLbls, 'Color', 'none');
tb3.String = {'Element Labels On'};
end
end
end
0 Comments
See Also
Categories
Find more on Structural Analysis in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!