Skip to content

Commit c5ac15d

Browse files
authored
Matlab GUI interaction interface
I've developed a simple GUI software interaction interface. Before you run the GUI_DEV.exe ,Verify the MATLAB Runtime is installed and ensure you have installed version 9.2 (R2017a).
1 parent a81d1e7 commit c5ac15d

15 files changed

+1065
-459
lines changed

GUI_DEV.exe

1.39 MB
Binary file not shown.

GUI_DEV.fig

89.9 KB
Binary file not shown.

GUI_DEV.m

Lines changed: 519 additions & 0 deletions
Large diffs are not rendered by default.

infill_outline.m

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
function [Crossing_Point_of_each_Slice]= infill_outline(Crossing_Point_of_All_Slices,Number_of_Slice)
2-
% [Crossing_Poin_of_each_Slice(:,1),Crossing_Poin_of_each_Slice(:,2)]表示该切片层所有交点的XY坐标值
3-
Crossing_Point_of_each_Slice = Crossing_Point_of_All_Slices{Number_of_Slice}; % 通过for循环 逐个提取元胞子矩阵 到矩阵Crossing_Poin_of_each_Slice中
4-
if ~isempty(Crossing_Point_of_each_Slice)
5-
% fill(X,Y,C) 根据 X 和 Y 中的数据创建填充的多边形(顶点颜色由 C 指定)。
6-
% fill 可将最后一个顶点与第一个顶点相连以闭合多边形。X 和 Y 的值可以是数字、日期时间、持续时间或类别值。
7-
X = (Crossing_Point_of_each_Slice(:,1))';
8-
Y = (Crossing_Point_of_each_Slice(:,2))';
9-
fill(X,Y,'w')
10-
end
11-
rotate3d on
1+
function [Crossing_Point_of_each_Slice]= infill_outline(Crossing_Point_of_All_Slices,Number_of_Slice)
2+
% [Crossing_Poin_of_each_Slice(:,1),Crossing_Poin_of_each_Slice(:,2)]表示该切片层所有交点的XY坐标值
3+
Crossing_Point_of_each_Slice = Crossing_Point_of_All_Slices{Number_of_Slice}; % 通过for循环 逐个提取元胞子矩阵 到矩阵Crossing_Poin_of_each_Slice中
4+
if ~isempty(Crossing_Point_of_each_Slice)
5+
% fill(X,Y,C) 根据 X 和 Y 中的数据创建填充的多边形(顶点颜色由 C 指定)。
6+
% fill 可将最后一个顶点与第一个顶点相连以闭合多边形。X 和 Y 的值可以是数字、日期时间、持续时间或类别值。
7+
X = (Crossing_Point_of_each_Slice(:,1))';
8+
Y = (Crossing_Point_of_each_Slice(:,2))';
9+
fill(X,Y,'w')
10+
end
11+
rotate3d on
1212
end

license.txt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
Coperight(c)2018, Zhao Zhichao All rights reserved. From the Maker Studio of Zhengzhou University of Light Industry (ZZULI)
2+
3+
Copyright (c) 2018, Sunil Bhandari
4+
All rights reserved.
5+
6+
Redistribution and use in source and binary forms, with or without
7+
modification, are permitted provided that the following conditions are
8+
met:
9+
10+
* Redistributions of source code must retain the above copyright
11+
notice, this list of conditions and the following disclaimer.
12+
* Redistributions in binary form must reproduce the above copyright
13+
notice, this list of conditions and the following disclaimer in
14+
the documentation and/or other materials provided with the distribution
15+
16+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26+
POSSIBILITY OF SUCH DAMAGE.

main.m

Lines changed: 121 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -1,120 +1,121 @@
1-
%**********************************************************
2-
% 该脚本调用了所有当前文件夹下的子程序
3-
% 该程序在 Matlab 2017a 版本上编译成功
4-
% 该程序必须在Matlab 2015b 及以上版本上运行
5-
% 测试用的模型在Test_Models文件夹下,输出的G代码在Show_Result
6-
%**********************************************************
7-
%清除所有变量数据、清楚所有命令行、关闭所有绘图窗口
8-
clc; clearvars; close all;
9-
%% 绘制二进制或者ASCII格式的stl模型原始图像
10-
% read_binary_or_ascii_stl函数可以读取ASCII或者二进制的STL模型文件,
11-
% 并返回包含两个字段的结构矩阵fv,该函数由MATLAB团队编写
12-
% fv包含第一个字段面法矢量faces和第二个字段顶点坐标vertices坐标值
13-
fv = read_binary_or_ascii_stl('Test_Models\femur_half_bone_like.stl');
14-
% 这个模型通过PATCH图像函数进行润色,添加了一些动态光源
15-
% 并且调整了材料属性以改变模型的光泽
16-
figure('Name','STL原始模型与切片','NumberTitle','off');
17-
subplot(121)
18-
pause(10)
19-
title('STL原始模型');
20-
xlabel('X');ylabel('Y');zlabel('Z');
21-
patch(fv,'FaceColor', [0.8 0.8 1.0], ...
22-
'EdgeColor', 'none', ...
23-
'FaceLighting', 'gouraud', ...
24-
'AmbientStrength', 0.15);
25-
rotate3d on
26-
% 增加相机光源,并且调整反光强度
27-
camlight('headlight');
28-
material('dull');
29-
% 设定查看角度 使图形适合窗口大小显示
30-
axis('image');
31-
view([-135 40]);
32-
%% 查看旋转模型
33-
i = 1;
34-
t = 0:1:30;
35-
for i = 2:length(t)
36-
view(-135-t(i),40);
37-
pause(0.1) %设定旋转动态延时时间
38-
end
39-
%% 读取ASCII格式的STL文件
40-
% 当需要读取ASCII格式的STL文件时,请用read_ascii_stl_file函数读取stl文件,
41-
% [triangles] = read_ascii_stl_file('femur_O.stl',1)
42-
% 第二输入参数header_lines_num表示stl文件开头占用的行数,
43-
% 标准的ASCII格式的stl文件开头占一行
44-
45-
%% 读取二进制binary的stl文件
46-
% 返回值triangles是具有12列的矩阵,每一行表示一个三角面片,
47-
% 前9列表示三个顶点的坐标值,最后3列表示面片的法向量坐标
48-
% 可以表述为 (x1, y1, z1),(x2, y2, z2),(x3, y3, z3),(n1, n2, n3)
49-
% 返回值numTriangles表示三角面片的总个数
50-
[numTriangles,triangles] = read_binary_stl_file...
51-
('Test_Models\femur_half_bone_like.stl');
52-
53-
%% 创建模型的切片轮廓曲线 slice_stl_create_path
54-
%设置切片厚度 slice_height
55-
slice_height = 0.2;
56-
%计时器
57-
tic;
58-
% 函数返回值 Crossing_Point_of_All_Slices元胞矩阵,包含所有切平面与三角面片的交点的坐标值
59-
% 函数返回值 z_slices 表示所有切平面的Z轴坐标值,切平面坐标的两个极端值,最高最低位置均穿过三角面片的顶点
60-
% 函数返回值 triangles_new 是一个14列矩阵,后两列包含三角面片的最低顶点(第13列)和最高顶点(第14列)
61-
[Crossing_Point_of_All_Slices,z_slices,model_height,triangles_new] = ...
62-
slice_stl_create_path(triangles, slice_height);
63-
%读取tic计时器的数据,并显示,用于评估程序计算的效率
64-
toc;
65-
66-
%% 绘制分层截面轮廓
67-
subplot(122)
68-
title('模型分层与轮廓提取')
69-
70-
xlabel('X');ylabel('Y');zlabel('Z');
71-
view(-135,40);
72-
axis([-Inf Inf -Inf Inf z_slices(1) z_slices(end)])
73-
%% 轨迹动画绘制分层与截面轮廓
74-
plot_slices_3D(Crossing_Point_of_All_Slices,z_slices,0.0);
75-
rotate3d on
76-
% 设定需要显示的切片层的编号
77-
Number_of_Slice = 50;
78-
figure('Name','二维切片绘图','NumberTitle','off');
79-
title('骨状多孔结构填充与切片');
80-
axis([0 40 0 55]);
81-
plot_slices_2D(Crossing_Point_of_All_Slices,Number_of_Slice,0.005);
82-
83-
%% 查看旋转模型
84-
t = 0:1:30;
85-
for j = 2:length(t)
86-
view(-135-t(j),40);
87-
pause(0.1)
88-
end
89-
90-
%% 对指定层进行填充
91-
% 定义切片层的编号number
92-
% z_slices是1X39维度的矩阵,每一列表示切平面所在的Z轴坐标值
93-
% 但是Crossing_Point_of_All_Slices元胞矩阵的元胞个数比z_slices的列数小1,
94-
% 故需要减去1
95-
96-
% 设定需要显示的切片层的编号
97-
Number_of_Slice = 50;
98-
figure('Name','绘制切片填充','NumberTitle','off');
99-
% 切片编号只能在这一范围内 Number_of_Slice = 1:1:size(z_slices,2)-1;
100-
[Crossing_Point_of_each_Slice] = infill_outline...
101-
(Crossing_Point_of_All_Slices,Number_of_Slice);
102-
title(['绘制第',num2str(Number_of_Slice),'层截面轮廓'])
103-
104-
%% G代码的输出
105-
Extrude_Speed = 0.01485; %挤出机挤出速度 单位mm/s
106-
Move_Speed_G1 = 1800; %挤出机XY方向移动速度 单位mm/s
107-
% slice_height = 0.4; %切片高度已经在上方定义过
108-
Move_Speed_G0 = 3600; %挤出机快速定位移动速度 单位mm/s
109-
% 设定初始层高0.3,之后的层高均是0.4
110-
z_slices(1)=0.3;
111-
% G代码生成函数
112-
generate_gcode(Crossing_Point_of_All_Slices,z_slices,...
113-
Extrude_Speed,Move_Speed_G0,Move_Speed_G1,slice_height);
114-
115-
116-
117-
118-
119-
120-
1+
%**********************************************************
2+
% 该脚本调用了所有当前文件夹下的子程序
3+
% 该程序在 Matlab 2017a 版本上编译成功
4+
% 该程序必须在Matlab 2015b 及以上版本上运行
5+
% 测试用的模型在Test_Models文件夹下,输出的G代码在Show_Result
6+
%**********************************************************
7+
%清除所有变量数据、清楚所有命令行、关闭所有绘图窗口
8+
clc; clearvars; close all;
9+
%% 绘制二进制或者ASCII格式的stl模型原始图像
10+
% read_binary_or_ascii_stl函数可以读取ASCII或者二进制的STL模型文件,
11+
% 并返回包含两个字段的结构矩阵fv,该函数由MATLAB团队编写
12+
% fv包含第一个字段面法矢量faces和第二个字段顶点坐标vertices坐标值
13+
fv = read_binary_or_ascii_stl('Test_Models\femur_O.stl');
14+
% 这个模型通过PATCH图像函数进行润色,添加了一些动态光源
15+
% 并且调整了材料属性以改变模型的光泽
16+
figure('Name','STL原始模型与切片','NumberTitle','off');
17+
subplot(121)
18+
pause(10)
19+
title('STL原始模型');
20+
xlabel('X');ylabel('Y');zlabel('Z');
21+
patch(fv,'FaceColor', [0.8 0.8 1.0], ...
22+
'EdgeColor', 'none', ...
23+
'FaceLighting', 'gouraud', ...
24+
'AmbientStrength', 0.15);
25+
rotate3d on
26+
% 增加相机光源,并且调整反光强度
27+
camlight('headlight');
28+
material('dull');
29+
% 设定查看角度 使图形适合窗口大小显示
30+
axis('image');
31+
view([-135 40]);
32+
%% 查看旋转模型
33+
i = 1;
34+
t = 0:1:30;
35+
for i = 2:length(t)
36+
view(-135-t(i),40);
37+
pause(0.1) %设定旋转动态延时时间
38+
end
39+
%% 读取ASCII格式的STL文件
40+
% 当需要读取ASCII格式的STL文件时,请用read_ascii_stl_file函数读取stl文件,
41+
% [triangles] = read_ascii_stl_file('femur_O.stl',1)
42+
% 第二输入参数header_lines_num表示stl文件开头占用的行数,
43+
% 标准的ASCII格式的stl文件开头占一行
44+
45+
%% 读取二进制binary的stl文件
46+
% 返回值triangles是具有12列的矩阵,每一行表示一个三角面片,
47+
% 前9列表示三个顶点的坐标值,最后3列表示面片的法向量坐标
48+
% 可以表述为 (x1, y1, z1),(x2, y2, z2),(x3, y3, z3),(n1, n2, n3)
49+
% 返回值numTriangles表示三角面片的总个数
50+
[numTriangles,triangles] = read_binary_stl_file...
51+
('Test_Models\femur_O.stl');
52+
53+
%% 创建模型的切片轮廓曲线 slice_stl_create_path
54+
%设置切片厚度 slice_height
55+
slice_height = 0.2;
56+
%计时器
57+
tic;
58+
% 函数返回值 Crossing_Point_of_All_Slices元胞矩阵,包含所有切平面与三角面片的交点的坐标值
59+
% 函数返回值 z_slices 表示所有切平面的Z轴坐标值,切平面坐标的两个极端值,最高最低位置均穿过三角面片的顶点
60+
% 函数返回值 triangles_new 是一个14列矩阵,后两列包含三角面片的最低顶点(第13列)和最高顶点(第14列)
61+
62+
[Crossing_Point_of_All_Slices,z_slices,model_height,triangles_new] = ...
63+
slice_stl_create_path(triangles, slice_height);
64+
%读取tic计时器的数据,并显示,用于评估程序计算的效率
65+
toc;
66+
67+
%% 绘制分层截面轮廓
68+
subplot(122)
69+
title('模型分层与轮廓提取')
70+
71+
xlabel('X');ylabel('Y');zlabel('Z');
72+
view(-135,40);
73+
axis([-Inf Inf -Inf Inf z_slices(1) z_slices(end)])
74+
%% 轨迹动画绘制分层与截面轮廓
75+
plot_slices_3D(Crossing_Point_of_All_Slices,z_slices,0.0);
76+
rotate3d on
77+
% 设定需要显示的切片层的编号
78+
Number_of_Slice = 50;
79+
figure('Name','二维切片绘图','NumberTitle','off');
80+
title('骨状多孔结构填充与切片');
81+
axis([0 40 0 55]);
82+
plot_slices_2D(Crossing_Point_of_All_Slices,Number_of_Slice,0.005);
83+
84+
%% 查看旋转模型
85+
t = 0:1:30;
86+
for j = 2:length(t)
87+
view(-135-t(j),40);
88+
pause(0.1)
89+
end
90+
91+
%% 对指定层进行填充
92+
% 定义切片层的编号number
93+
% z_slices是1X39维度的矩阵,每一列表示切平面所在的Z轴坐标值
94+
% 但是Crossing_Point_of_All_Slices元胞矩阵的元胞个数比z_slices的列数小1,
95+
% 故需要减去1
96+
97+
% 设定需要显示的切片层的编号
98+
Number_of_Slice = 50;
99+
figure('Name','绘制切片填充','NumberTitle','off');
100+
% 切片编号只能在这一范围内 Number_of_Slice = 1:1:size(z_slices,2)-1;
101+
[Crossing_Point_of_each_Slice] = infill_outline...
102+
(Crossing_Point_of_All_Slices,Number_of_Slice);
103+
title(['绘制第',num2str(Number_of_Slice),'层截面轮廓'])
104+
105+
%% G代码的输出
106+
Extrude_Speed = 0.01485; %挤出机挤出速度 单位mm/s
107+
Move_Speed_G1 = 1800; %挤出机XY方向移动速度 单位mm/s
108+
slice_height = 0.2; %切片高度已经在上方定义过
109+
Move_Speed_G0 = 3600; %挤出机快速定位移动速度 单位mm/s
110+
% 设定初始层高0.3,之后的层高均是0.4
111+
z_slices(1)=0.1;
112+
% G代码生成函数
113+
generate_gcode(Crossing_Point_of_All_Slices,z_slices,...
114+
Extrude_Speed,Move_Speed_G0,Move_Speed_G1,slice_height);
115+
116+
117+
118+
119+
120+
121+

orient_stl.m

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
function [rotated] = orient_stl(tri, ax)
2+
%%%orients the stl file in either x, y or z axis. input is oriented in x
3+
%%%axis
4+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5+
%%%%Author: Sunil Bhandari%%%%%%%%
6+
%%%%Date: Mar 12, 2018 %%%%%%%%%%%
7+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8+
9+
if ax == 'x'
10+
rotated = tri;
11+
elseif ax == 'y'
12+
rotated = [tri(:,2),tri(:,1),tri(:,3), tri(:,5),tri(:,4),tri(:,6),tri(:,8),tri(:,7),tri(:,9),tri(:,10:12)];
13+
elseif ax == 'z'
14+
rotated = [tri(:,3:-1:1),tri(:,6:-1:4),tri(:,9:-1:7),tri(:,10:12)];
15+
else
16+
error('ax needs to be x, y or z');
17+
end
18+
19+
end
20+
21+
22+

plot_slices_2D.m

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
1-
function []= plot_slices_2D(Crossing_Point_of_All_Slices,Number_of_Slice,delay)
2-
% 动态绘制二维截面轮廓
3-
%hold on保持连续绘图
4-
hold on
5-
Crossing_Point_of_each_Slice = Crossing_Point_of_All_Slices{Number_of_Slice}; % 通过for循环 逐个提取元胞子矩阵 到矩阵Crossing_Poin_of_each_Slice中
6-
if delay >0 %判断是,进行延时绘图操作
7-
if ~isempty(Crossing_Point_of_each_Slice)
8-
for j = 1:size(Crossing_Point_of_each_Slice,1)-1 % size(mlst_all,1)表示元胞子矩阵的行数
9-
% plot3(X1,Y1,Z1,LineSpec)在三维空间绘制一个或者多个曲线。
10-
% 这些线条穿过坐标为 X1、Y1 和 Z1 的元素的点。X1、Y1 和 Z1 的值可以是数值、日期时间、持续时间或类别值。
11-
% LineSpec控制线形和颜色
12-
plot(Crossing_Point_of_each_Slice(j:j+1,1),Crossing_Point_of_each_Slice(j:j+1,2),'k','LineWidth',0.1)
13-
% pause()表示绘制延时,函数的输入参数已经进行了定义s
14-
pause(delay)
15-
16-
end
17-
end
18-
% [Crossing_Poin_of_each_Slice(:,1),Crossing_Poin_of_each_Slice(:,2)]表示相交线的顶点的XY坐标值
19-
% plot3()中的第三个变量是Z轴方向切平面的坐标值
20-
else %判断否,不进行延时绘图操作,计算完成后一次性将图形全部显示
21-
if ~isempty(Crossing_Point_of_each_Slice)
22-
plot(Crossing_Point_of_each_Slice(:,1),Crossing_Point_of_each_Slice(:,2),'k','LineWidth',0.1)
23-
end
24-
end
25-
end
1+
function []= plot_slices_2D(Crossing_Point_of_All_Slices,Number_of_Slice,delay)
2+
% 动态绘制二维截面轮廓
3+
%hold on保持连续绘图
4+
hold on
5+
Crossing_Point_of_each_Slice = Crossing_Point_of_All_Slices{Number_of_Slice}; % 通过for循环 逐个提取元胞子矩阵 到矩阵Crossing_Poin_of_each_Slice中
6+
if delay >0 %判断是,进行延时绘图操作
7+
if ~isempty(Crossing_Point_of_each_Slice)
8+
for j = 1:size(Crossing_Point_of_each_Slice,1)-1 % size(mlst_all,1)表示元胞子矩阵的行数
9+
% plot3(X1,Y1,Z1,LineSpec)在三维空间绘制一个或者多个曲线。
10+
% 这些线条穿过坐标为 X1、Y1 和 Z1 的元素的点。X1、Y1 和 Z1 的值可以是数值、日期时间、持续时间或类别值。
11+
% LineSpec控制线形和颜色
12+
plot(Crossing_Point_of_each_Slice(j:j+1,1),Crossing_Point_of_each_Slice(j:j+1,2),'k','LineWidth',0.1)
13+
% pause()表示绘制延时,函数的输入参数已经进行了定义s
14+
pause(delay)
15+
16+
end
17+
end
18+
% [Crossing_Poin_of_each_Slice(:,1),Crossing_Poin_of_each_Slice(:,2)]表示相交线的顶点的XY坐标值
19+
% plot3()中的第三个变量是Z轴方向切平面的坐标值
20+
else %判断否,不进行延时绘图操作,计算完成后一次性将图形全部显示
21+
if ~isempty(Crossing_Point_of_each_Slice)
22+
plot(Crossing_Point_of_each_Slice(:,1),Crossing_Point_of_each_Slice(:,2),'k','LineWidth',0.1)
23+
end
24+
end
25+
end

0 commit comments

Comments
 (0)