📄 nccodeparse.cpp
字号:
// NCCodeParse.cpp : 实现文件
//
#include "stdafx.h"
#include "NCSimulaSys.h"
#include "NCCodeParse.h"
// CNCCodeParse
IMPLEMENT_DYNAMIC(CNCCodeParse, CWnd)
CNCCodeParse::CNCCodeParse()
{
for(int i=0;i<=26;i++)
m_strFuncGroup[i] = '\0';
m_iCoolingFluid = 0;
m_iChangeTools = 0;
m_xBefore_absolute=0,m_yBefore_absolute=0,m_zBefore_absolute=0;
m_xAfter_absolute=0,m_yAfter_absolute=0,m_zAfter_absolute=0;
m_x_r=0,m_y_r=0,m_z_r=0;
m_fScale=1;
}
CNCCodeParse::~CNCCodeParse()
{
}
// 该函数以行为单位解析NC代码,如果判断是需要返回坐标的代码,则将坐标保存在主调函数传来参数的引用上.
bool CNCCodeParse::CodeLineParse(CString strLine,bool willreturnabsolutecoordinate,CArray<CString,CString> &m_ArrayForwardDirection_CodeLineInterpolation)
{
// 将代码全部转换为大写.
strLine.MakeUpper();
// 去掉该行代码中的所有空格.
strLine.Remove(' ');
// 寻找功能字.
for(int i=0;i<strLine.GetLength();i++)
{
if(strLine[i]=='G')
{
// 如果判断是G00(点定位).
if(strLine[i+1]=='0'&&strLine[i+2]=='0')
{}
// 下列指令是需要插补的指令.
// 如果判断是G01(直线插补).
if(strLine[i+1]=='0'&&strLine[i+2]=='1')
{
double xEnd_relative,yEnd_relative,zEnd_relative;
// 先默认计算相对坐标,然后判断当前j状态标志位是"绝对尺寸"还是"增量尺寸",如果判断为绝对坐标,则用相对坐标+前绝对坐标=终点绝对坐标.
// 获取直线插补的终点坐标.
// x坐标.
int xPos = strLine.Find('X');
if(xPos == -1)
{
xEnd_relative = 0;
}
else
{
CString strX;
for(int j=xPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strX.AppendChar(strLine[j]);
}
else
break;
}
xEnd_relative = atof(strX);
}
// y坐标.
int yPos = strLine.Find('Y');
if(yPos == -1)
{
yEnd_relative = 0;
}
else
{
CString strY;
for(int j=yPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strY.AppendChar(strLine[j]);
}
else
break;
}
yEnd_relative = atof(strY);
}
// z坐标.
int zPos = strLine.Find('Z');
if(zPos == -1)
{
zEnd_relative = 0;
}
else
{
CString strZ;
for(int j=zPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strZ.AppendChar(strLine[j]);
}
else
break;
}
zEnd_relative = atof(strZ);
}
if(m_strFuncGroup[10]=="G90")
{
m_xAfter_absolute = xEnd_relative;
m_yAfter_absolute = yEnd_relative;
m_zAfter_absolute = zEnd_relative;
}
else
{
m_xAfter_absolute = m_xBefore_absolute + xEnd_relative;
m_yAfter_absolute = m_yBefore_absolute + yEnd_relative;
m_zAfter_absolute = m_zBefore_absolute + zEnd_relative;
}
LineInterpolation(xEnd_relative,yEnd_relative,zEnd_relative,m_ArrayForwardDirection_CodeLineInterpolation);
return true;
}
// 如果判断是G02(顺时针圆弧插补).
if(strLine[i+1]=='0'&&strLine[i+2]=='2')
{
double xEnd_relative,yEnd_relative,zEnd_relative,iStart_relative,jStart_relative,kStart_relative;
// 先默认计算相对坐标,然后判断当前j状态标志位是"绝对尺寸"还是"增量尺寸",如果判断为绝对坐标,则用相对坐标+前绝对坐标=终点绝对坐标.
// 获取直线插补的终点坐标.
// x坐标.
int xPos = strLine.Find('X');
if(xPos == -1)
{
xEnd_relative = 0;
}
else
{
CString strX;
for(int j=xPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strX.AppendChar(strLine[j]);
}
else
break;
}
xEnd_relative = atof(strX);
}
// y坐标.
int yPos = strLine.Find('Y');
if(yPos == -1)
{
yEnd_relative = 0;
}
else
{
CString strY;
for(int j=yPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strY.AppendChar(strLine[j]);
}
else
break;
}
yEnd_relative = atof(strY);
}
// z坐标.
int zPos = strLine.Find('Z');
if(zPos == -1)
{
zEnd_relative = 0;
}
else
{
CString strZ;
for(int j=zPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strZ.AppendChar(strLine[j]);
}
else
break;
}
zEnd_relative = atof(strZ);
}
// i坐标.
int iPos = strLine.Find('I');
if(iPos == -1)
{
iStart_relative = 0;
}
else
{
CString strI;
for(int j=iPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strI.AppendChar(strLine[j]);
}
else
break;
}
iStart_relative = atof(strI);
}
// j坐标.
int jPos = strLine.Find('J');
if(jPos == -1)
{
jStart_relative = 0;
}
else
{
CString strJ;
for(int j=jPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strJ.AppendChar(strLine[j]);
}
else
break;
}
jStart_relative = atof(strJ);
}
// k坐标.
int kPos = strLine.Find('K');
if(kPos == -1)
{
kStart_relative = 0;
}
else
{
CString strK;
for(int j=kPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strK.AppendChar(strLine[j]);
}
else
break;
}
kStart_relative = atof(strK);
}
// char a[200];
// sprintf(a,"%f,%f,%f,%f,%f,%f",xEnd_relative,yEnd_relative,zEnd_relative,iStart_relative,jStart_relative,kStart_relative);
// AfxMessageBox(_T(a));
ClockwiseInterpolation(xEnd_relative,yEnd_relative,zEnd_relative,iStart_relative,jStart_relative,kStart_relative,m_ArrayForwardDirection_CodeLineInterpolation);
return true;
}
// 如果判断是G03(逆时针圆弧插补).
if(strLine[i+1]=='0'&&strLine[i+2]=='3')
{
double xEnd_relative,yEnd_relative,zEnd_relative,iStart_relative,jStart_relative,kStart_relative;
// 先默认计算相对坐标,然后判断当前j状态标志位是"绝对尺寸"还是"增量尺寸",如果判断为绝对坐标,则用相对坐标+前绝对坐标=终点绝对坐标.
// 获取直线插补的终点坐标.
// x坐标.
int xPos = strLine.Find('X');
if(xPos == -1)
{
xEnd_relative = 0;
}
else
{
CString strX;
for(int j=xPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strX.AppendChar(strLine[j]);
}
else
break;
}
xEnd_relative = atof(strX);
}
// y坐标.
int yPos = strLine.Find('Y');
if(yPos == -1)
{
yEnd_relative = 0;
}
else
{
CString strY;
for(int j=yPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strY.AppendChar(strLine[j]);
}
else
break;
}
yEnd_relative = atof(strY);
}
// z坐标.
int zPos = strLine.Find('Z');
if(zPos == -1)
{
zEnd_relative = 0;
}
else
{
CString strZ;
for(int j=zPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strZ.AppendChar(strLine[j]);
}
else
break;
}
zEnd_relative = atof(strZ);
}
// i坐标.
int iPos = strLine.Find('I');
if(iPos == -1)
{
iStart_relative = 0;
}
else
{
CString strI;
for(int j=iPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strI.AppendChar(strLine[j]);
}
else
break;
}
iStart_relative = atof(strI);
}
// j坐标.
int jPos = strLine.Find('J');
if(jPos == -1)
{
jStart_relative = 0;
}
else
{
CString strJ;
for(int j=jPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strJ.AppendChar(strLine[j]);
}
else
break;
}
jStart_relative = atof(strJ);
}
// k坐标.
int kPos = strLine.Find('K');
if(kPos == -1)
{
kStart_relative = 0;
}
else
{
CString strK;
for(int j=kPos+1;j<strLine.GetLength();j++)
{
if((strLine[j]>='0'&&strLine[j]<='9')||strLine[j]=='.'||strLine[j]=='-')
{
strK.AppendChar(strLine[j]);
}
else
break;
}
kStart_relative = atof(strK);
}
// char a[200];
// sprintf(a,"%f,%f,%f,%f,%f,%f",xEnd_relative,yEnd_relative,zEnd_relative,iStart_relative,jStart_relative,kStart_relative);
// AfxMessageBox(_T(a));
AnticlockwiseArcInterpolation(xEnd_relative,yEnd_relative,zEnd_relative,iStart_relative,jStart_relative,kStart_relative,m_ArrayForwardDirection_CodeLineInterpolation);
return true;
}
// 下列指令是控制状态的指令.
// 如果判断是G17(XY平面选择).
if(strLine[i+1]=='1'&&strLine[i+2]=='7')
{}
// 如果判断是G18(ZX平面选择).
if(strLine[i+1]=='1'&&strLine[i+2]=='8')
{
m_strFuncGroup[3]=_T("G18");
}
// 如果判断是G19(YZ平面选择).
if(strLine[i+1]=='1'&&strLine[i+2]=='9')
{
m_strFuncGroup[3]=_T("G19");
}
// 如果判断是G40(刀具补偿/刀具偏置注销).
if(strLine[i+1]=='4'&&strLine[i+2]=='0')
{}
// 如果判断是G41(刀具补偿-左).
if(strLine[i+1]=='4'&&strLine[i+2]=='1')
{}
// 如果判断是G42(刀具补偿-右).
if(strLine[i+1]=='4'&&strLine[i+2]=='2')
{}
// 如果判断是G90(绝对尺寸).
if(strLine[i+1]=='9'&&strLine[i+2]=='0')
{}
// 如果判断是G91(增量尺寸).
if(strLine[i+1]=='9'&&strLine[i+2]=='1')
{}
// 如果判断是G92(预置寄存).
if(strLine[i+1]=='9'&&strLine[i+2]=='2')
{}
m_xBefore_absolute = m_xAfter_absolute;
m_yBefore_absolute = m_yAfter_absolute;
m_zBefore_absolute = m_zAfter_absolute;
}
if(strLine[i]=='M')
{}
if(strLine[i]=='T')
{}
}
return 0;
}
// 直线插补计算.
bool CNCCodeParse::LineInterpolation(double xEnd_relative, double yEnd_relative, double zEnd_relative, CArray<CString,CString> &m_ArrayForwardDirection_CodeLineInterpolation)
{
int JP1,JP2; //JP1为XY平面的误差,JP2为XZ平面的偏差.
int JE; //JE为插补总步数.
int x_iStep,y_iStep,z_iStep; //动点的坐标(步数坐标).
int xe,ye,ze; //各坐标的终点总步数.
double x_fStep,y_fStep,z_fStep; //动点的实数坐标.
JP1=0,JP2=0;
xe=xEnd_relative/m_fScale,ye=yEnd_relative/m_fScale,ze=zEnd_relative/m_fScale;
JE = abs(xe) + abs(ye) + abs(ze);
x_iStep=0,y_iStep=0,z_iStep=0;
x_fStep=0,y_fStep=0,z_fStep=0;
if(xe==0 && ye==0 && ze==0)
{
return 0;
}
bool bHaveInterpolation = false;
// 当x轴为长轴时.
if(abs(xe)>=abs(ye) && abs(xe)>=abs(ze))
{
bHaveInterpolation = true;
begin_x:
if(JP1>=0)
{
if(JP2<0)
{
//z轴方向进给.
if(ze>0)
{
z_iStep+=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Z+");
}
if(ze<0)
{
z_iStep-=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Z-");
}
//计算偏差.
if(ze != 0)
{
JE--;
JP2 += abs(xe);
// x_fStep = m_fScale*x_iStep;
// y_fStep = m_fScale*y_iStep;
// z_fStep = m_fScale*z_iStep;
// char a[120];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -