📄 nccodeparse.cpp
字号:
x_iStep+=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("X+");
}
else
{
Fm=Fm+2*abs(z_iStep)+1;
z_iStep-=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Z-");
}
// char a[200];
// sprintf(a,"%d,%d,%d",x_iStep,y_iStep,Fm);
// AfxMessageBox(_T(a));
}
break;
case 4:
if(iStartPointQuadrant==4 && iEndPointQuadrant!=4)
{
nStep = (fabs(kStart_r_o)+(fRadius-iStart_r_o))/m_fScale;
}
if(iStartPointQuadrant!=4 && iEndPointQuadrant==4)
{
nStep = (xEnd_r_o+(fRadius-fabs(zEnd_r_o)))/m_fScale;
}
if(iStartPointQuadrant==4 && iEndPointQuadrant==4)
{
if(nCrossAxis==0)
nStep = ((xEnd_r_o-iStart_r_o)+(zEnd_r_o-kStart_r_o))/m_fScale;
else
{
if(i==0)
{
nStep = (fabs(kStart_r_o)+(fRadius-iStart_r_o))/m_fScale;
}
else
{
nStep = (xEnd_r_o+(fRadius-fabs(zEnd_r_o)))/m_fScale;
}
}
}
if(iStartPointQuadrant!=4 && iEndPointQuadrant!=4)
{
nStep = 2*fRadius/m_fScale;
}
// 第四象限插补计算.
for(int i=0;i<nStep;i++)
{
if(Fm>=0)
{
Fm=Fm-2*abs(z_iStep)+1;
z_iStep+=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Z+");
}
else
{
Fm=Fm+2*abs(x_iStep)+1;
x_iStep+=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("X+");
}
// char a[200];
// sprintf(a,"%d,%d,%d",x_iStep,y_iStep,Fm);
// AfxMessageBox(_T(a));
}
break;
}
}
}
// 如果是YZ平面.
if(m_strFuncGroup[3]==_T("G19"))
{
fRadius=sqrt(jStart_r_o*jStart_r_o+kStart_r_o*kStart_r_o);
// 确定插补时跨坐标轴的次数.
if(jStart_r_o>0 && kStart_r_o>=0) iStartPointQuadrant=1;
if(jStart_r_o<=0 && kStart_r_o>0) iStartPointQuadrant=2;
if(jStart_r_o<0 && kStart_r_o<=0) iStartPointQuadrant=3;
if(jStart_r_o>=0 && kStart_r_o<0) iStartPointQuadrant=4;
if(yEnd_r_o>0 && zEnd_r_o>=0) iEndPointQuadrant=1;
if(yEnd_r_o<=0 && zEnd_r_o>0) iEndPointQuadrant=2;
if(yEnd_r_o<0 && zEnd_r_o<=0) iEndPointQuadrant=3;
if(yEnd_r_o>=0 && zEnd_r_o<0) iEndPointQuadrant=4;
nCrossAxis = iEndPointQuadrant - iStartPointQuadrant;
if(nCrossAxis<0)
nCrossAxis += 4;
if((iStartPointQuadrant==iEndPointQuadrant && iStartPointQuadrant==1 && jStart_r_o<=yEnd_r_o)||
(iStartPointQuadrant==iEndPointQuadrant && iStartPointQuadrant==2 && jStart_r_o<=yEnd_r_o)||
(iStartPointQuadrant==iEndPointQuadrant && iStartPointQuadrant==3 && jStart_r_o>=yEnd_r_o)||
(iStartPointQuadrant==iEndPointQuadrant && iStartPointQuadrant==4 && jStart_r_o>=yEnd_r_o))
nCrossAxis=4;
int x_iStep,y_iStep,z_iStep; // 动点的坐标(步数坐标).
x_iStep=iStart_r_o/m_fScale,y_iStep=jStart_r_o/m_fScale,z_iStep=kStart_r_o/m_fScale;
// 开始插补计算出坐标值.
for(int i=0;i<=nCrossAxis;i++)
{
int nNowQuadrantAt = iStartPointQuadrant + i;
if(nNowQuadrantAt>4)
nNowQuadrantAt -= 4;
int nStep = 0; // 在各个分象限中的进给步数.
int Fm=0; // 在各个分象限中插补中的偏差值.
int xe,ye,ze; // 各坐标的终点总步数.
switch(nNowQuadrantAt)
{
case 1:
// 计算进给步数.
if(iStartPointQuadrant==1 && iEndPointQuadrant!=1)
{
nStep = (jStart_r_o+(fRadius-kStart_r_o))/m_fScale;
}
if(iStartPointQuadrant!=1 && iEndPointQuadrant==1)
{
nStep = ((fRadius-yEnd_r_o)+zEnd_r_o)/m_fScale;
}
if(iStartPointQuadrant==1 && iEndPointQuadrant==1)
{
if(nCrossAxis==0)
nStep = ((jStart_r_o-yEnd_r_o)+(zEnd_r_o-kStart_r_o))/m_fScale;
else
{
if(i==0)
{
nStep = (jStart_r_o+(fRadius-kStart_r_o))/m_fScale;
}
else
{
nStep = ((fRadius-yEnd_r_o)+zEnd_r_o)/m_fScale;
}
}
}
if(iStartPointQuadrant!=1 && iEndPointQuadrant!=1)
{
nStep = 2*fRadius/m_fScale;
}
// 第一象限插补计算.
for(int i=0;i<nStep;i++)
{
if(Fm>=0)
{
Fm=Fm-2*y_iStep+1;
y_iStep-=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Y-");
}
else
{
Fm=Fm+2*z_iStep+1;
z_iStep+=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Z+");
}
// char a[200];
// sprintf(a,"%d,%d,%d",x_iStep,y_iStep,Fm);
// AfxMessageBox(_T(a));
}
break;
case 2:
if(iStartPointQuadrant==2 && iEndPointQuadrant!=2)
{
nStep = ((fRadius-fabs(jStart_r_o))+kStart_r_o)/m_fScale;
}
if(iStartPointQuadrant!=2 && iEndPointQuadrant==2)
{
nStep = ((fRadius-zEnd_r_o)+fabs(yEnd_r_o))/m_fScale;
}
if(iStartPointQuadrant==2 && iEndPointQuadrant==2)
{
if(nCrossAxis==0)
nStep = ((kStart_r_o-zEnd_r_o)+(jStart_r_o-yEnd_r_o))/m_fScale;
else
{
if(i==0)
{
nStep = ((fRadius-fabs(jStart_r_o))+kStart_r_o)/m_fScale;
}
else
{
nStep = ((fRadius-zEnd_r_o)+fabs(yEnd_r_o))/m_fScale;
}
}
}
if(iStartPointQuadrant!=2 && iEndPointQuadrant!=2)
{
nStep = 2*fRadius/m_fScale;
}
// 第二象限插补计算.
for(int i=0;i<nStep;i++)
{
if(Fm>=0)
{
Fm=Fm-2*abs(z_iStep)+1;
z_iStep-=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Z-");
}
else
{
Fm=Fm+2*abs(y_iStep)+1;
y_iStep-=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Y-");
}
// char a[200];
// sprintf(a,"%d,%d,%d",x_iStep,y_iStep,Fm);
// AfxMessageBox(_T(a));
}
break;
case 3:
if(iStartPointQuadrant==3 && iEndPointQuadrant!=3)
{
nStep = (fabs(jStart_r_o)+(fRadius-fabs(kStart_r_o)))/m_fScale;
}
if(iStartPointQuadrant!=3 && iEndPointQuadrant==3)
{
nStep = (fabs(zEnd_r_o)+(fRadius-fabs(yEnd_r_o)))/m_fScale;
}
if(iStartPointQuadrant==3 && iEndPointQuadrant==3)
{
if(nCrossAxis==0)
nStep = ((fabs(zEnd_r_o)-fabs(kStart_r_o))+(fabs(jStart_r_o)-fabs(yEnd_r_o)))/m_fScale;
else
{
if(i==0)
{
nStep = (fabs(jStart_r_o)+(fRadius-fabs(kStart_r_o)))/m_fScale;
}
else
{
nStep = (fabs(zEnd_r_o)+(fRadius-fabs(yEnd_r_o)))/m_fScale;
}
}
}
if(iStartPointQuadrant!=3 && iEndPointQuadrant!=3)
{
nStep = 2*fRadius/m_fScale;
}
// 第三象限插补计算.
for(int i=0;i<nStep;i++)
{
if(Fm>=0)
{
Fm=Fm-2*abs(y_iStep)+1;
y_iStep+=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Y+");
}
else
{
Fm=Fm+2*abs(z_iStep)+1;
z_iStep-=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Z-");
}
// char a[200];
// sprintf(a,"%d,%d,%d",x_iStep,y_iStep,Fm);
// AfxMessageBox(_T(a));
}
break;
case 4:
if(iStartPointQuadrant==4 && iEndPointQuadrant!=4)
{
nStep = (fabs(kStart_r_o)+(fRadius-jStart_r_o))/m_fScale;
}
if(iStartPointQuadrant!=4 && iEndPointQuadrant==4)
{
nStep = (yEnd_r_o+(fRadius-fabs(zEnd_r_o)))/m_fScale;
}
if(iStartPointQuadrant==4 && iEndPointQuadrant==4)
{
if(nCrossAxis==0)
nStep = ((yEnd_r_o-jStart_r_o)+(zEnd_r_o-kStart_r_o))/m_fScale;
else
{
if(i==0)
{
nStep = (fabs(kStart_r_o)+(fRadius-jStart_r_o))/m_fScale;
}
else
{
nStep = (yEnd_r_o+(fRadius-fabs(zEnd_r_o)))/m_fScale;
}
}
}
if(iStartPointQuadrant!=4 && iEndPointQuadrant!=4)
{
nStep = 2*fRadius/m_fScale;
}
// 第四象限插补计算.
for(int i=0;i<nStep;i++)
{
if(Fm>=0)
{
Fm=Fm-2*abs(z_iStep)+1;
z_iStep+=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Z+");
}
else
{
Fm=Fm+2*abs(y_iStep)+1;
y_iStep+=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Y+");
}
// char a[200];
// sprintf(a,"%d,%d,%d",x_iStep,y_iStep,Fm);
// AfxMessageBox(_T(a));
}
break;
}
}
}
return false;
}
// 顺时针圆弧插补.
bool CNCCodeParse::ClockwiseInterpolation(double xEnd_relative, double yEnd_relative, double zEnd_relative, double iStart_relative, double jStart_relative, double kStart_relative, CArray<CString,CString>& m_ArrayForwardDirection_CodeLineInterpolation)
{
int iStartPointQuadrant,iEndPointQuadrant,nCrossAxis;
iStartPointQuadrant=1,iEndPointQuadrant=1,nCrossAxis=0;
// 计算圆弧插补起始点相对于圆心的坐标.
double xEnd_r_o,yEnd_r_o,zEnd_r_o,iStart_r_o,jStart_r_o,kStart_r_o,fRadius;
iStart_r_o=iStart_relative,jStart_r_o=jStart_relative,kStart_r_o=kStart_relative;
xEnd_r_o=xEnd_relative+iStart_relative,yEnd_r_o=yEnd_relative+jStart_relative,zEnd_r_o=zEnd_relative+kStart_relative;
// 如果是XY平面.
if(m_strFuncGroup[3]==_T("G17") || m_strFuncGroup[3]==_T(""))
{
fRadius=sqrt(iStart_r_o*iStart_r_o+jStart_r_o*jStart_r_o);
// 确定插补时跨坐标轴的次数.
if(iStart_r_o>0 && jStart_r_o>=0) iStartPointQuadrant=1;
if(iStart_r_o<=0 && jStart_r_o>0) iStartPointQuadrant=2;
if(iStart_r_o<0 && jStart_r_o<=0) iStartPointQuadrant=3;
if(iStart_r_o>=0 && jStart_r_o<0) iStartPointQuadrant=4;
if(xEnd_r_o>0 && yEnd_r_o>=0) iEndPointQuadrant=1;
if(xEnd_r_o<=0 && yEnd_r_o>0) iEndPointQuadrant=2;
if(xEnd_r_o<0 && yEnd_r_o<=0) iEndPointQuadrant=3;
if(xEnd_r_o>=0 && yEnd_r_o<0) iEndPointQuadrant=4;
nCrossAxis = iStartPointQuadrant - iEndPointQuadrant;
if(nCrossAxis<0)
nCrossAxis += 4;
if((iStartPointQuadrant==iEndPointQuadrant && iStartPointQuadrant==1 && iStart_r_o>=xEnd_r_o)||
(iStartPointQuadrant==iEndPointQuadrant && iStartPointQuadrant==2 && iStart_r_o>=xEnd_r_o)||
(iStartPointQuadrant==iEndPointQuadrant && iStartPointQuadrant==3 && iStart_r_o<=xEnd_r_o)||
(iStartPointQuadrant==iEndPointQuadrant && iStartPointQuadrant==4 && iStart_r_o<=xEnd_r_o))
nCrossAxis=4;
int x_iStep,y_iStep,z_iStep; // 动点的坐标(步数坐标).
x_iStep=iStart_r_o/m_fScale,y_iStep=jStart_r_o/m_fScale,z_iStep=kStart_r_o/m_fScale;
// 开始插补计算出坐标值.
for(int i=0;i<=nCrossAxis;i++)
{
int nNowQuadrantAt = iStartPointQuadrant - i;
if(nNowQuadrantAt<=0)
nNowQuadrantAt += 4;
int nStep = 0; // 在各个分象限中的进给步数.
int Fm=0; // 在各个分象限中插补中的偏差值.
int xe,ye,ze; // 各坐标的终点总步数.
switch(nNowQuadrantAt)
{
case 1:
// 计算进给步数.
if(iStartPointQuadrant==1 && iEndPointQuadrant!=1)
{
nStep = ((fRadius-iStart_r_o)+jStart_r_o)/m_fScale;
}
if(iStartPointQuadrant!=1 && iEndPointQuadrant==1)
{
nStep = (xEnd_r_o+(fRadius-yEnd_r_o))/m_fScale;
}
if(iStartPointQuadrant==1 && iEndPointQuadrant==1)
{
if(nCrossAxis==0)
nStep = ((xEnd_r_o-iStart_r_o)+(jStart_r_o-yEnd_r_o))/m_fScale;
else
{
if(i==0)
{
nStep = ((fRadius-iStart_r_o)+jStart_r_o)/m_fScale;
}
else
{
nStep = (xEnd_r_o+(fRadius-yEnd_r_o))/m_fScale;
}
}
}
if(iStartPointQuadrant!=1 && iEndPointQuadrant!=1)
{
nStep = 2*fRadius/m_fScale;
}
// 第一象限插补计算.
for(int i=0;i<nStep;i++)
{
if(Fm>=0)
{
Fm=Fm-2*y_iStep+1;
y_iStep-=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Y-");
}
else
{
Fm=Fm+2*x_iStep+1;
x_iStep+=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("X+");
}
// char a[200];
// sprintf(a,"%d,%d,%d",x_iStep,y_iStep,Fm);
// AfxMessageBox(_T(a));
}
break;
case 2:
if(iStartPointQuadrant==2 && iEndPointQuadrant!=2)
{
nStep = (fabs(iStart_r_o)+(fRadius-jStart_r_o))/m_fScale;
}
if(iStartPointQuadrant!=2 && iEndPointQuadrant==2)
{
nStep = ((fRadius-fabs(xEnd_r_o))+yEnd_r_o)/m_fScale;
}
if(iStartPointQuadrant==2 && iEndPointQuadrant==2)
{
if(nCrossAxis==0)
nStep = ((xEnd_r_o-iStart_r_o)+(yEnd_r_o-jStart_r_o))/m_fScale;
else
{
if(i==0)
{
nStep = (fabs(iStart_r_o)+(fRadius-jStart_r_o))/m_fScale;
}
else
{
nStep = ((fRadius-fabs(xEnd_r_o))+yEnd_r_o)/m_fScale;
}
}
}
if(iStartPointQuadrant!=2 && iEndPointQuadrant!=2)
{
nStep = 2*fRadius/m_fScale;
}
// 第二象限插补计算.
for(int i=0;i<nStep;i++)
{
if(Fm>=0)
{
Fm=Fm-2*abs(x_iStep)+1;
x_iStep+=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("X+");
}
else
{
Fm=Fm+2*abs(y_iStep)+1;
y_iStep+=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Y+");
}
// char a[200];
// sprintf(a,"%d,%d,%d",x_iStep,y_iStep,Fm);
// AfxMessageBox(_T(a));
}
break;
case 3:
if(iStartPointQuadrant==3 && iEndPointQuadrant!=3)
{
nStep = ((fRadius-fabs(iStart_r_o))+fabs(jStart_r_o))/m_fScale;
}
if(iStartPointQuadrant!=3 && iEndPointQuadrant==3)
{
nStep = (fabs(xEnd_r_o)+(fRadius-fabs(yEnd_r_o)))/m_fScale;
}
if(iStartPointQuadrant==3 && iEndPointQuadrant==3)
{
if(nCrossAxis==0)
nStep = ((fabs(xEnd_r_o)-fabs(iStart_r_o))+(fabs(jStart_r_o)-fabs(yEnd_r_o)))/m_fScale;
else
{
if(i==0)
{
nStep = ((fRadius-fabs(iStart_r_o))+fabs(jStart_r_o))/m_fScale;
}
else
{
nStep = (fabs(xEnd_r_o)+(fRadius-fabs(yEnd_r_o)))/m_fScale;
}
}
}
if(iStartPointQuadrant!=3 && iEndPointQuadrant!=3)
{
nStep = 2*fRadius/m_fScale;
}
// 第三象限插补计算.
for(int i=0;i<nStep;i++)
{
if(Fm>=0)
{
Fm=Fm-2*abs(y_iStep)+1;
y_iStep+=1;
m_ArrayForwardDirection_CodeLineInterpolation.Add("Y+");
}
else
{
Fm=Fm+2*abs(x_iStep)+1;
x_iStep-=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -