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

📄 nccodeparse.cpp

📁 用VC++开发了一个数控加工的三维仿真程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
						m_ArrayForwardDirection_CodeLineInterpolation.Add("X-");
					}
//					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 = (iStart_r_o+(fRadius-fabs(jStart_r_o)))/m_fScale;
				}
				if(iStartPointQuadrant!=4 && iEndPointQuadrant==4)
				{
					nStep = ((fRadius-xEnd_r_o)+fabs(yEnd_r_o))/m_fScale;
				}
				if(iStartPointQuadrant==4 && iEndPointQuadrant==4)
				{
					if(nCrossAxis==0)
						nStep = ((iStart_r_o-xEnd_r_o)+(jStart_r_o-yEnd_r_o))/m_fScale;
					else
					{
						if(i==0)
						{
							nStep = (iStart_r_o+(fRadius-fabs(jStart_r_o)))/m_fScale;
						}
						else
						{
							nStep = ((fRadius-xEnd_r_o)+fabs(yEnd_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(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;			
			}
		}
	}

	// 如果是ZX平面.
	if(m_strFuncGroup[3]==_T("G18"))
	{
		fRadius=sqrt(iStart_r_o*iStart_r_o+kStart_r_o*kStart_r_o);

		// 确定插补时跨坐标轴的次数.
		if(iStart_r_o>0 && kStart_r_o>=0) iStartPointQuadrant=1;
		if(iStart_r_o<=0 && kStart_r_o>0) iStartPointQuadrant=2;
		if(iStart_r_o<0 && kStart_r_o<=0) iStartPointQuadrant=3;
		if(iStart_r_o>=0 && kStart_r_o<0) iStartPointQuadrant=4;

		if(xEnd_r_o>0 && zEnd_r_o>=0) iEndPointQuadrant=1;
		if(xEnd_r_o<=0 && zEnd_r_o>0) iEndPointQuadrant=2;
		if(xEnd_r_o<0 && zEnd_r_o<=0) iEndPointQuadrant=3;
		if(xEnd_r_o>=0 && zEnd_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)+kStart_r_o)/m_fScale;	
				}
				if(iStartPointQuadrant!=1 && iEndPointQuadrant==1)
				{
					nStep = (xEnd_r_o+(fRadius-zEnd_r_o))/m_fScale;
				}
				if(iStartPointQuadrant==1 && iEndPointQuadrant==1)
				{
					if(nCrossAxis==0)
						nStep = ((xEnd_r_o-iStart_r_o)+(kStart_r_o-zEnd_r_o))/m_fScale;
					else
					{
						if(i==0)
						{
							nStep = ((fRadius-iStart_r_o)+kStart_r_o)/m_fScale;	
						}
						else
						{
							nStep = (xEnd_r_o+(fRadius-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*z_iStep+1;
						z_iStep-=1;
						m_ArrayForwardDirection_CodeLineInterpolation.Add("Z-");
					}
					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-kStart_r_o))/m_fScale;
				}
				if(iStartPointQuadrant!=2 && iEndPointQuadrant==2)
				{
					nStep = ((fRadius-fabs(xEnd_r_o))+zEnd_r_o)/m_fScale;
				}
				if(iStartPointQuadrant==2 && iEndPointQuadrant==2)
				{
					if(nCrossAxis==0)
						nStep = ((xEnd_r_o-iStart_r_o)+(zEnd_r_o-kStart_r_o))/m_fScale;
					else
					{
						if(i==0)
						{
							nStep = (fabs(iStart_r_o)+(fRadius-kStart_r_o))/m_fScale;
						}
						else
						{
							nStep = ((fRadius-fabs(xEnd_r_o))+zEnd_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(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 3:
				if(iStartPointQuadrant==3 && iEndPointQuadrant!=3)
				{
					nStep = ((fRadius-fabs(iStart_r_o))+fabs(kStart_r_o))/m_fScale;
				}
				if(iStartPointQuadrant!=3 && iEndPointQuadrant==3)
				{
					nStep = (fabs(xEnd_r_o)+(fRadius-fabs(zEnd_r_o)))/m_fScale;
				}
				if(iStartPointQuadrant==3 && iEndPointQuadrant==3)
				{
					if(nCrossAxis==0)
						nStep = ((fabs(xEnd_r_o)-fabs(iStart_r_o))+(fabs(kStart_r_o)-fabs(zEnd_r_o)))/m_fScale;
					else
					{
						if(i==0)
						{
							nStep = ((fRadius-fabs(iStart_r_o))+fabs(kStart_r_o))/m_fScale;
						}
						else
						{
							nStep = (fabs(xEnd_r_o)+(fRadius-fabs(zEnd_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(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;
			case 4:
				if(iStartPointQuadrant==4 && iEndPointQuadrant!=4)
				{
					nStep = (iStart_r_o+(fRadius-fabs(kStart_r_o)))/m_fScale;
				}
				if(iStartPointQuadrant!=4 && iEndPointQuadrant==4)
				{
					nStep = ((fRadius-xEnd_r_o)+fabs(zEnd_r_o))/m_fScale;
				}
				if(iStartPointQuadrant==4 && iEndPointQuadrant==4)
				{
					if(nCrossAxis==0)
						nStep = ((iStart_r_o-xEnd_r_o)+(kStart_r_o-zEnd_r_o))/m_fScale;
					else
					{
						if(i==0)
						{
							nStep = (iStart_r_o+(fRadius-fabs(kStart_r_o)))/m_fScale;
						}
						else
						{
							nStep = ((fRadius-xEnd_r_o)+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(x_iStep)+1;
						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;			
			}
		}	
	}

	// 如果是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 = iStartPointQuadrant - iEndPointQuadrant;
		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<=0)
				nNowQuadrantAt += 4;
			
			int nStep = 0;					// 在各个分象限中的进给步数.
			int Fm=0;						// 在各个分象限中插补中的偏差值.
			int xe,ye,ze;					// 各坐标的终点总步数.
			
			switch(nNowQuadrantAt)
			{
			case 1:
				// 计算进给步数.
				if(iStartPointQuadrant==1 && iEndPointQuadrant!=1)
				{
					nStep = ((fRadius-jStart_r_o)+kStart_r_o)/m_fScale;	
				}
				if(iStartPointQuadrant!=1 && iEndPointQuadrant==1)
				{
					nStep = (yEnd_r_o+(fRadius-zEnd_r_o))/m_fScale;
				}
				if(iStartPointQuadrant==1 && iEndPointQuadrant==1)
				{
					if(nCrossAxis==0)
						nStep = ((yEnd_r_o-jStart_r_o)+(kStart_r_o-zEnd_r_o))/m_fScale;
					else
					{
						if(i==0)
						{
							nStep = ((fRadius-jStart_r_o)+kStart_r_o)/m_fScale;	
						}
						else
						{
							nStep = (yEnd_r_o+(fRadius-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*z_iStep+1;
						z_iStep-=1;
						m_ArrayForwardDirection_CodeLineInterpolation.Add("Z-");
					}
					else
					{
						Fm=Fm+2*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 2:
				if(iStartPointQuadrant==2 && iEndPointQuadrant!=2)
				{
					nStep = (fabs(jStart_r_o)+(fRadius-kStart_r_o))/m_fScale;
				}
				if(iStartPointQuadrant!=2 && iEndPointQuadrant==2)
				{
					nStep = ((fRadius-fabs(yEnd_r_o))+zEnd_r_o)/m_fScale;
				}
				if(iStartPointQuadrant==2 && iEndPointQuadrant==2)
				{
					if(nCrossAxis==0)
						nStep = ((yEnd_r_o-jStart_r_o)+(zEnd_r_o-kStart_r_o))/m_fScale;
					else
					{
						if(i==0)
						{
							nStep = (fabs(jStart_r_o)+(fRadius-kStart_r_o))/m_fScale;
						}
						else
						{
							nStep = ((fRadius-fabs(yEnd_r_o))+zEnd_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(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 3:
				if(iStartPointQuadrant==3 && iEndPointQuadrant!=3)
				{
					nStep = ((fRadius-fabs(jStart_r_o))+fabs(kStart_r_o))/m_fScale;
				}
				if(iStartPointQuadrant!=3 && iEndPointQuadrant==3)
				{
					nStep = (fabs(yEnd_r_o)+(fRadius-fabs(zEnd_r_o)))/m_fScale;
				}
				if(iStartPointQuadrant==3 && iEndPointQuadrant==3)
				{
					if(nCrossAxis==0)
						nStep = ((fabs(yEnd_r_o)-fabs(jStart_r_o))+(fabs(kStart_r_o)-fabs(zEnd_r_o)))/m_fScale;
					else
					{
						if(i==0)
						{
							nStep = ((fRadius-fabs(jStart_r_o))+fabs(kStart_r_o))/m_fScale;
						}
						else
						{
							nStep = (fabs(yEnd_r_o)+(fRadius-fabs(zEnd_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(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 4:
				if(iStartPointQuadrant==4 && iEndPointQuadrant!=4)
				{
					nStep = (jStart_r_o+(fRadius-fabs(kStart_r_o)))/m_fScale;
				}
				if(iStartPointQuadrant!=4 && iEndPointQuadrant==4)
				{
					nStep = ((fRadius-yEnd_r_o)+fabs(zEnd_r_o))/m_fScale;
				}
				if(iStartPointQuadrant==4 && iEndPointQuadrant==4)
				{
					if(nCrossAxis==0)
						nStep = ((jStart_r_o-yEnd_r_o)+(kStart_r_o-zE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -