Skip to content

Commit f917c5d

Browse files
committed
main.m
Add main.m
1 parent 8e8932c commit f917c5d

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

main.m

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,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_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+

0 commit comments

Comments
 (0)