|
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 | + |
0 commit comments