⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nccodeparse.cpp

📁 用VC++开发了一个数控加工的三维仿真程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
						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 + -