为了使数据变得更加直观,通常要用到可视化技术。这里从先从G代码中分离出坐标,然后根据G1代码的含义(直线插补),采用line命令来作出路径图。
原始数据如下(保存为test.txt):
G1 X-57.636 Y0.0 Z1.18 F960.0
G1 X57.636 Y0.0 Z1.18 F960.0
G1 X57.636 Y-1.44 Z1.18 F960.0
G1 X-57.636 Y-1.44 Z1.18 F960.0
G1 X-57.636 Y-2.88 Z1.18 F960.0
G1 X57.636 Y-2.88 Z1.18 F960.0
G1 X57.636 Y-4.32 Z1.18 F960.0
G1 X-57.636 Y-4.32 Z1.18 F960.0
G1 X-57.636 Y-5.76 Z1.18 F960.0
G1 X57.636 Y-5.76 Z1.18 F960.0
G1 X57.636 Y-7.2 Z1.18 F960.0
G1 X-57.636 Y-7.2 Z1.18 F960.0
G1 X-57.636 Y-8.64 Z1.18 F960.0
G1 X57.636 Y-8.64 Z1.18 F960.0
G1 X57.636 Y-10.08 Z1.18 F960.0
G1 X-57.636 Y-10.08 Z1.18 F960.0
G1 X-57.636 Y-11.52 Z1.18 F960.0
G1 X57.636 Y-11.52 Z1.18 F960.0
G1 X57.636 Y-12.96 Z1.18 F960.0
G1 X-57.636 Y-12.96 Z1.18 F960.0
G1 X-57.636 Y-14.4 Z1.18 F960.0
G1 X57.636 Y-14.4 Z1.18 F960.0
G1 X57.636 Y-15.84 Z1.18 F960.0
G1 X-57.636 Y-15.84 Z1.18 F960.0
G1 X-57.636 Y-17.28 Z1.18 F960.0
G1 X57.636 Y-17.28 Z1.18 F960.0
G1 X57.636 Y-18.72 Z1.18 F960.0
G1 X-57.636 Y-18.72 Z1.18 F960.0
G1 X-57.636 Y-20.16 Z1.18 F960.0
G1 X57.636 Y-20.16 Z1.18 F960.0
G1 X57.636 Y-21.6 Z1.18 F960.0
G1 X-57.636 Y-21.6 Z1.18 F960.0
G1 X-57.636 Y-23.04 Z1.18 F960.0
G1 X57.636 Y-23.04 Z1.18 F960.0
G1 X57.636 Y-24.48 Z1.18 F960.0
G1 X-57.636 Y-24.48 Z1.18 F960.0
G1 X-57.636 Y-25.92 Z1.18 F960.0
G1 X57.636 Y-25.92 Z1.18 F960.0
G1 X57.636 Y-27.36 Z1.18 F960.0
G1 X-57.636 Y-27.36 Z1.18 F960.0
G1 X-57.636 Y-28.8 Z1.18 F960.0
G1 X57.636 Y-28.8 Z1.18 F960.0
G1 X57.636 Y-30.24 Z1.18 F960.0
G1 X-57.636 Y-30.24 Z1.18 F960.0
M103
G1 X-57.636 Y1.44 Z1.18 F960.0
M101
G1 X57.636 Y1.44 Z1.18 F960.0
G1 X57.636 Y2.88 Z1.18 F960.0
G1 X-57.636 Y2.88 Z1.18 F960.0
G1 X-57.636 Y4.32 Z1.18 F960.0
G1 X57.636 Y4.32 Z1.18 F960.0
G1 X57.636 Y5.76 Z1.18 F960.0
G1 X-57.636 Y5.76 Z1.18 F960.0
G1 X-57.636 Y7.2 Z1.18 F960.0
G1 X57.636 Y7.2 Z1.18 F960.0
G1 X57.636 Y8.64 Z1.18 F960.0
G1 X-57.636 Y8.64 Z1.18 F960.0
G1 X-57.636 Y10.08 Z1.18 F960.0
G1 X57.636 Y10.08 Z1.18 F960.0
G1 X57.636 Y11.52 Z1.18 F960.0
G1 X-57.636 Y11.52 Z1.18 F960.0
G1 X-57.636 Y12.96 Z1.18 F960.0
G1 X57.636 Y12.96 Z1.18 F960.0
G1 X57.636 Y14.4 Z1.18 F960.0
G1 X-57.636 Y14.4 Z1.18 F960.0
G1 X-57.636 Y15.84 Z1.18 F960.0
G1 X57.636 Y15.84 Z1.18 F960.0
G1 X57.636 Y17.28 Z1.18 F960.0
G1 X-57.636 Y17.28 Z1.18 F960.0
G1 X-57.636 Y18.72 Z1.18 F960.0
G1 X57.636 Y18.72 Z1.18 F960.0
G1 X57.636 Y20.16 Z1.18 F960.0
G1 X-57.636 Y20.16 Z1.18 F960.0
G1 X-57.636 Y21.6 Z1.18 F960.0
G1 X57.636 Y21.6 Z1.18 F960.0
G1 X57.636 Y23.04 Z1.18 F960.0
G1 X-57.636 Y23.04 Z1.18 F960.0
G1 X-57.636 Y24.48 Z1.18 F960.0
G1 X57.636 Y24.48 Z1.18 F960.0
G1 X57.636 Y25.92 Z1.18 F960.0
G1 X-57.636 Y25.92 Z1.18 F960.0
G1 X-57.636 Y27.36 Z1.18 F960.0
G1 X57.636 Y27.36 Z1.18 F960.0
G1 X57.636 Y28.8 Z1.18 F960.0
G1 X-57.636 Y28.8 Z1.18 F960.0
G1 X-57.636 Y30.24 Z1.18 F960.0
G1 X57.636 Y30.24 Z1.18 F960.0
M103
处理:
clc
clear all
close all
fid=fopen('test.txt');
n=89;%the number of line to read
for i=1:n
a{i}=fgets(fid);
end
fclose(fid);
b(1,:)=zeros(1,3);
bi=2;
air=[];
for i=1:n
lineCharacter=length(a{i});
count=0;
if(a{i}(1)=='G'&&a{i}(2)=='1')
for k=3:lineCharacter
if(isspace(a{i}(k)))
count=count+1;
end
if(a{i}(k)=='X')
kTemp=k+1;
for kTempC=1:3
str=[];
while(((a{i}(kTemp))>='0'&&(a{i}(kTemp))<='9')||(a{i}(kTemp))=='.'||(a{i}(kTemp))=='-')
str=strcat(str,a{i}(kTemp));
kTemp=kTemp+1;
end
while ~(((a{i}(kTemp))>='0'&&(a{i}(kTemp))<='9')||(a{i}(kTemp))=='.'||(a{i}(kTemp))=='-')
kTemp=kTemp+1;
end
b(bi,kTempC)=str2num(str);
end
bi=bi+1;
end
end
end
if(i~=(n-2)&&i~=(n-1)&&i~=n&&(strncmp(a{i},'M103',4)||strncmp(a{i+2},'M101',4)))
air=[air,bi];
end
end
figure;
hold on;
axis([min(b(:,1))-1,max(b(:,1))+1,min(b(:,2))-1,max(b(:,2))+1]);
for i=2:size(b,1)
% if(b(i,3)==b(1,3))
if(~ismember(i,air))
line([b(i-1,1),b(i,1)],[b(i-1,2),b(i,2)],'LineWidth',1,'Color','b');
else
line([b(i-1,1),b(i,1)],[b(i-1,2),b(i,2)],'LineWidth',4,'Color','r');
end
% end
end
结果:
代码解释:
M103表示extruder off,刀具不进行加工操作;
M101表示进行加工操作。
所以,在这两个代码之间的G01表示的是空程路径。在这里用红色表示。
蓝色则表示刀具进行加工操作的路径。
air这个变量是用来记录空程的,直接标记空程终点所在坐标即可,作图时也只是变一下颜色就搞定。这个处理得很简洁。
技术点:
- line([起点横坐标,终点横坐标],[起点纵坐标,终点纵坐标]),
- ismember(c,A,'rows')可以判断数组c是不是矩阵A中的一行
- 二维图形坐标轴范围在缺省状态下是根据数据的大小自动设置的,如欲改变,可利用axis(xmin xmax ymin ymax),函数来定义。
- line(X,Y,Z,'Color','r','LineWidth',4),注意与plot的控制方法不同。。。。有一些小问题和line的这个问题合在一起了,我找了半天才发现,十分无语。。。。