|
| 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