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

📄 dxffile.cpp

📁 演示vc与专业控制器的连接
💻 CPP
字号:
// DxfFile.cpp : implementation file
//

#include "stdafx.h"
#include "MPC2810Demo.h"
#include "DxfFile.h"
#include "DXF_CurveHandle.h"
#include "DXF_Datas.h"
#include "DXF_Graph.h"
#include "MPC08A.H"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int g_nMovesign;
int g_nNum;
int g_nTimes=0;

/////////////////////////////////////////////////////////////////////////////
// CDxfFile

IMPLEMENT_DYNCREATE(CDxfFile, CFormView)

CDxfFile::CDxfFile()
	: CFormView(CDxfFile::IDD)
{
	//{{AFX_DATA_INIT(CDxfFile)
	m_sLineAccel = _T("");
	m_sLineHighSpeed = _T("");
	m_sLineRate = _T("");
	m_sCommand = _T("");
	//}}AFX_DATA_INIT
}

CDxfFile::~CDxfFile()
{
}

void CDxfFile::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDxfFile)
	DDX_Text(pDX, IDC_EDIT_LINEACCEL, m_sLineAccel);
	DDX_Text(pDX, IDC_EDIT_LINEHIGHSPD, m_sLineHighSpeed);
	DDX_Text(pDX, IDC_EDIT_LINERATE, m_sLineRate);
	DDX_Text(pDX, IDC_EDITDXF_COMMAND, m_sCommand);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDxfFile, CFormView)
	//{{AFX_MSG_MAP(CDxfFile)
	ON_BN_CLICKED(IDC_BTN_DXFPAUSE, OnBtnDxfpause)
	ON_BN_CLICKED(IDC_BTN_DXFRESUME, OnBtnDxfresume)
	ON_BN_CLICKED(IDC_BTN_DXFRUN, OnBtnDxfrun)
	ON_BN_CLICKED(IDC_BTN_DXFSTOP, OnBtnDxfstop)
	ON_BN_CLICKED(IDC_BTN_FILEOPEN, OnBtnFileopen)
	ON_WM_PAINT()
	ON_WM_TIMER()
	ON_WM_SHOWWINDOW()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDxfFile diagnostics

#ifdef _DEBUG
void CDxfFile::AssertValid() const
{
	CFormView::AssertValid();
}

void CDxfFile::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDxfFile message handlers

void CDxfFile::OnInitialUpdate() 
{
	CFormView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	m_dberrorx = 0;
	m_dberrory = 0;
	m_sLineRate = "20";
	m_sLineHighSpeed = "400";
	m_sLineAccel = "20";
	GetDlgItem(IDC_EDIT_LINERATE)->SetWindowText(m_sLineRate);
	GetDlgItem(IDC_EDIT_LINEHIGHSPD)->SetWindowText(m_sLineHighSpeed);
	GetDlgItem(IDC_EDIT_LINEACCEL)->SetWindowText(m_sLineAccel);
	get_unit(&m_dbunit);
	g_nMovesign = 0;
	GetDlgItem(IDC_GRAPSHOW)->GetWindowRect(&m_rect);
	ScreenToClient(&m_rect);
	m_cDXF_Graph.SetWindowRange(m_rect);
	m_cDXF_Graph.Init();

}


BOOL CDxfFile::DestroyWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CFormView::DestroyWindow();
}

void CDxfFile::OnBtnDxfpause() 
{
	// TODO: Add your control notification handler code here
	g_nMovesign=0;
   g_nTimes=1;
	
}

void CDxfFile::OnBtnDxfresume() 
{
	// TODO: Add your control notification handler code here
	move_resume(1);
	move_resume(2);
	move_resume(3);
	move_resume(4);
	g_nMovesign=1;
	
}

void CDxfFile::OnBtnDxfrun() 
{
	// TODO: Add your control notification handler code here
	set_unit_flag(0);
	g_nNum=0;
	g_nMovesign=1;
	
	SetTimer(4,50,NULL);
	set_arc_precision(1);
	set_ellipse_ratio(1);

	m_dbLastX=m_dbCurLastX;
	m_dbLastY=m_dbCurLastY;

	Invalidate(TRUE);
	
}

void CDxfFile::OnBtnDxfstop() 
{
	// TODO: Add your control notification handler code here
	g_nMovesign=0;
	for(int i=0;i<4;i++)
	{
		sudden_stop(i);
	}
	
}

void CDxfFile::OnBtnFileopen() 
{
	// TODO: Add your control notification handler code here
	CString m_szFilePath;
	CFileDialog ofn(TRUE,"*.DXF","*.DXF",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
						"DXF文件(*.DXF)|*.DXF|All Files(*.*)|*.*||");
	if(ofn.DoModal()!=IDOK)
		return;	
	m_szFilePath=ofn.GetPathName();
	GF_Init();
	m_nOpenFlag=GF_LoadDXFFile(m_szFilePath.GetBuffer(0));
	if(m_nOpenFlag==1)
	{
		m_dbMaxx=GF_GetXMax();
		m_dbMaxy=GF_GetYMax();
		m_dbMinx=GF_GetXMin();
		m_dbMiny=GF_GetYMin();
		m_cDataInfArray.RemoveAll();
		int j=0;
		do 
		{
			int i;
			unsigned int *Data;
			double *getSPlineX;
			double *getSPlineY;
			
			i=GF_GetCurDataLen();
			Data=new unsigned int [i];
			getSPlineX=new double [i];
			getSPlineY=new double [i];
			GF_GetCurData(Data,getSPlineX,getSPlineY);
			if(Data[0]==0x00030001)
			{
				m_cDataInf.dwType=Data[0];
				m_cDataInf.dwSign=Data[1];
				m_cDataInf.x=*((float *)(&Data[2]));
				m_cDataInf.y=*((float *)(&Data[3]));
				m_cDataInf.fAngle1=0;
				m_cDataInf.fAngle2=0;
				m_cDataInf.r=0;
				m_cDataInfArray.Add(m_cDataInf);
			}
			if(Data[0]==0x00060002)
			{
				m_cDataInf.dwType=Data[0];
				m_cDataInf.dwSign=Data[1];
				m_cDataInf.x=*((float *)(&Data[2]));
				m_cDataInf.y=*((float *)(&Data[3]));
				m_cDataInf.fAngle1=*((float *)(&Data[4]));
				m_cDataInf.fAngle2=*((float *)(&Data[5]));
				m_cDataInf.r=*((float *)(&Data[6]));
				m_cDataInfArray.Add(m_cDataInf);
			}
			if(Data[0]==0x00090001)
			{
				m_cDataInf.dwType=Data[0];
				m_cDataInf.dwSign=Data[1];
				m_cDataInf.nSpNum=*((int *)(&Data[2]));
				m_cDataInf.pBSplineX=new double [i];
				m_cDataInf.pBSplineY=new double [i];
				for (int k=0;k<=i-1;k++)
				{
					m_cDataInf.pBSplineX[k]=getSPlineX[k];
					m_cDataInf.pBSplineY[k]=getSPlineY[k];
				}
				m_cDataInfArray.Add(m_cDataInf);
			}
			delete Data;
			delete getSPlineX;
			delete getSPlineY;
			j=GF_MoveNext();
		}
		while (j!=-2);
		if(j==-2)
		{
			GF_Release();//释放动态连接库内部的内存空间
			double pi=3.1415926/180;
			m_cDataInf=m_cDataInfArray.GetAt(0);
			if(m_cDataInf.dwType==0x00030001)
			{
				m_dbLastX=m_cDataInf.x;
				m_dbTCurX=m_cDataInf.x;
				m_dbTLastX=m_dbTCurX;
				
				m_dbLastY=m_cDataInf.y;
				m_dbTCurY=m_cDataInf.y;
				m_dbTLastY=m_dbTCurY;
			}
			if(m_cDataInf.dwType==0x00060002)
			{
				m_dbLastX=m_cDataInf.x+m_cDataInf.r*cos(m_cDataInf.fAngle1*pi);
				m_dbLastY=m_cDataInf.y+m_cDataInf.r*sin(m_cDataInf.fAngle1*pi);
				m_dbTCurX=m_cDataInf.x+m_cDataInf.r*cos(m_cDataInf.fAngle1*pi);
				m_dbTCurY=m_cDataInf.y+m_cDataInf.r*sin(m_cDataInf.fAngle1*pi);
				m_dbTLastX=m_dbTCurX;
				m_dbTLastY=m_dbTCurY;
			}
			if(m_cDataInf.dwType==0x00090001)
			{
				m_dbLastX=m_cDataInf.pBSplineX[0];
				m_dbLastY=m_cDataInf.pBSplineY[0];
				m_dbTCurX=m_cDataInf.pBSplineX[0];
				m_dbTCurY=m_cDataInf.pBSplineY[0];
				m_dbTLastX=m_dbTCurX;
				m_dbTLastY=m_dbTCurY;
			}
			MessageBox("文件载入成功!");
		}
	}
	else MessageBox("文件载入失败!");
	m_bShow=TRUE;
	OnPaint();
	m_dbCurLastX=m_dbLastX;
	m_dbCurLastY=m_dbLastY;
	
}

void CDxfFile::OnPaint() 
{

	CFormView::OnPaint();
	CDC *pDC;
	pDC=GetDC();
	m_cDXF_Graph.SetDCObject(pDC);
	m_cDXF_Graph.SetBackColor(RGB(0,0,0));
	m_cDXF_Graph.SetAxisColor(RGB(0,255,0));
	m_cDXF_Graph.SetAxisText("X","Y");
	m_cDXF_Graph.SetGrid(30,30);
	ReleaseDC(pDC);

	if(m_bShow==TRUE)
	{
		DrawVGraph();
	}
	
	// TODO: Add your message handler code here
	
	// Do not call CFormView::OnPaint() for painting messages
}

void CDxfFile::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	UpdateData();
	double dbPosx,dbPosy;
	double dbUnit;
    int Num,k,z[4];
	Num=m_cDataInfArray.GetSize();
	m_dbdlinerate=atof(m_sLineRate);
	m_dbdarcrate=atof(m_sLineAccel);
	m_ndmnum=atoi(m_sLineHighSpeed);

	get_unit(&dbUnit);
	set_maxspeed(1,m_dbdlinerate/dbUnit);
	set_maxspeed(2,m_dbdlinerate/dbUnit);

	get_abs_pos(1,&dbPosx);
	get_abs_pos(2,&dbPosy);
	LineToPoint(dbPosx*dbUnit,dbPosy*dbUnit);

	double x,y;


	DWORD type;
	CString str0,str1,str2;

	int repairx,repairy;
	
	set_vector_conspeed(m_dbdlinerate/dbUnit);

	if(g_nMovesign==1)
	{
		for(k=0;k<4;k++)
		{
			z[k]=check_done(k+1);
		}
		if(z[0]==0 && z[1]==0 && z[2]==0 && z[3]==0)
		{
			if(g_nNum<Num)
			{
			m_cDataInf=m_cDataInfArray.GetAt(g_nNum);
			
			type=m_cDataInf.dwType;
			
			if(type==0x00030001)
			{
				x=m_cDataInf.x;
				y=m_cDataInf.y;
				m_dberrorx=(x-m_dbLastX)/dbUnit-(int)((x-m_dbLastX)/dbUnit);
				m_dberrory=(y-m_dbLastY)/dbUnit-(int)((y-m_dbLastY)/dbUnit);
				if(m_dberrorx>1&&m_dberrory>1)
				{
					repairx=1;
					repairy=1;
					m_dberrorx=m_dberrorx-1;
					m_dberrory=m_dberrory-1;

				}
				else if(m_dberrorx>1&&m_dberrory<1)
				{
					repairx=1;
					repairy=0;
					m_dberrorx=m_dberrorx-1;
				}
				else if(m_dberrorx<1&&m_dberrory>1)
				{
					repairx=0;
					repairy=1;
					m_dberrory=m_dberrory-1;
				}
				else
				{
					repairx=0;
					repairy=0;
				}
				
				con_line2(1,(x-m_dbLastX)/dbUnit+repairx,2,(y-m_dbLastY)/dbUnit+repairy);
				m_dbLastX=x;
				m_dbLastY=y;
			}
			if(type==0x00060002)
			{
			
				double angle3;
				double pi=3.1415926/180;
				if(m_cDataInf.dwSign==0x00000003)
				{
					if(m_cDataInf.fAngle1>m_cDataInf.fAngle2)
					{
						angle3=360-(m_cDataInf.fAngle1-m_cDataInf.fAngle2);
					}
					else
					{
						angle3=m_cDataInf.fAngle2-m_cDataInf.fAngle1;
					}
				arc_center(1,2,(m_cDataInf.x-m_dbLastX)/dbUnit,(m_cDataInf.y-m_dbLastY)/dbUnit,0-angle3);
			
				}
				else if(m_cDataInf.dwSign==0x00000001)
				{
					if(m_cDataInf.fAngle2>m_cDataInf.fAngle1)
					{
						angle3=360-(m_cDataInf.fAngle2-m_cDataInf.fAngle1);
					}
					else
					{
						angle3=m_cDataInf.fAngle1-m_cDataInf.fAngle2;
					}
                 
					arc_center(1,2,(m_cDataInf.x-m_dbLastX)/dbUnit,(m_cDataInf.y-m_dbLastY)/dbUnit,angle3);
			
				}
				m_dbLastX=m_cDataInf.x+m_cDataInf.r*cos(m_cDataInf.fAngle2*pi);
				m_dbLastY=m_cDataInf.y+m_cDataInf.r*sin(m_cDataInf.fAngle2*pi);
		
			}
			
	
			g_nNum++;
			if(g_nNum==Num)
		{
			g_nMovesign=0;
			if(g_nTimes==0)
			{
			OnBtnDxfrun() ;
			}

		}
		str0=str2+str0;
		GetDlgItem(IDC_EDITDXF_COMMAND)->SetWindowText(str0);
			}
		}
	}
	
	CFormView::OnTimer(nIDEvent);
}

void CDxfFile::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CFormView::OnShowWindow(bShow, nStatus);
	
	// TODO: Add your message handler code here
		OnInitialUpdate();
}
void CDxfFile::DrawVGraph()
{
	CString str;
	double dbCurFactor;
	UpdateData();
    CDC *pDC;
	pDC=GetDC();
	m_cDXF_Graph.SetDCObject(pDC);
	 dbCurFactor=m_cDXF_Graph.GetGTrackRange(m_dbMinx,m_dbMaxx,m_dbMiny,m_dbMaxy);
	int i,Num=m_cDataInfArray.GetSize();
	float x,y,r,angle1,angle2;
	int number;
	for(i=0;i<=(Num-1);i++)
	{
		m_cDataInf=m_cDataInfArray.GetAt(i);
		if(m_cDataInf.dwType==0x00030001)
		{
			if(m_cDataInf.dwSign==0x00000003)
			{
				x=m_cDataInf.x;
				y=m_cDataInf.y;
				m_cDXF_Graph.MoveToPoint(x,y);
			}
			if(m_cDataInf.dwSign==0x00000004)
			{
				x=m_cDataInf.x;
				y=m_cDataInf.y;
				m_cDXF_Graph.LineToPoint(x,y,RGB(255,0,0),0x00030001);
			}
		}
		if(m_cDataInf.dwType==0x00090001)
		{
			unsigned int *Data;
			Data=new unsigned int [2];
			Data[0]=m_cDataInf.dwType;
			Data[1]=m_cDataInf.dwSign;
			VG_Init(Data,m_cDataInf.nSpNum,m_cDataInf.pBSplineX,m_cDataInf.pBSplineY);
		    int nFlag;
			float *spDatas;
			spDatas=new float [2];
			nFlag=VG_SpLineHandle(spDatas);
			x=*((float *)(&spDatas[0]));
			y=*((float *)(&spDatas[1]));
			m_cDXF_Graph.MoveToPoint(x,y);
			do {
				float *Datas;
			    Datas=new float [2];           			    
			    nFlag=VG_SpLineHandle(Datas);
			    x=*((float *)(&Datas[0]));
			    y=*((float *)(&Datas[1]));
			    m_cDXF_Graph.LineToPoint(x,y,RGB(255,0,0),0x00090001);
			    delete Datas;
			} while(nFlag!=0);
			
			delete Data;
		}
		if(m_cDataInf.dwType==0x00060002)
		{
			r = m_cDataInf.r;
			angle1 = m_cDataInf.fAngle1;
			angle2 = m_cDataInf.fAngle2;
			if(angle1<angle2)
			{
				number = (int)(angle2-angle1);
			}
			else number = (int)(angle1-angle2);
			unsigned int *Data;
			Data=new unsigned int [7];
			Data[0] = m_cDataInf.dwType;
			Data[1] = m_cDataInf.dwSign;
			Data[2] = *((unsigned int *)(&m_cDataInf.x));
	        Data[3] = *((unsigned int *)(&m_cDataInf.y));		
	        Data[4] = *((unsigned int *)(&m_cDataInf.fAngle1));
		    Data[5] = *((unsigned int *)(&m_cDataInf.fAngle2));
		    Data[6] = *((unsigned int *)(&m_cDataInf.r));

		    VG_Init(Data);
			VG_SetPrecision(number);//按一度对应的弧长拆分
            int m_flagOFCHandle;
            float *ProDatas;
			ProDatas=new float [2];           			    
			m_flagOFCHandle=VG_CurveHandle(ProDatas);
			x=*((float *)(&ProDatas[0]));
			y=*((float *)(&ProDatas[1]));
			m_cDXF_Graph.MoveToPoint(x,y);
			delete ProDatas;
			
            do 
			{           
			    float *Datas;
			    Datas=new float [2];           			    
			    m_flagOFCHandle = VG_CurveHandle(Datas);
			    x = *((float *)(&Datas[0]));
			    y = *((float *)(&Datas[1]));
			    m_cDXF_Graph.LineToPoint(x,y,RGB(255,0,0));
			    delete Datas;
			}
			while(m_flagOFCHandle!=0);			
			delete Data;
		}
	}
	ReleaseDC(pDC);

}
void CDxfFile::LineToPoint(double x, double y)
{
	UpdateData();
    CDC *pDC;
	pDC=GetDC();
	m_cDXF_Graph.SetDCObject(pDC);   
	m_cDXF_Graph.GetGTrackRange(m_dbMinx,m_dbMaxx,m_dbMiny,m_dbMaxy);

	m_cDXF_Graph.MoveToPoint((float)(m_dbTLastX),(float)(m_dbTLastY));
	m_dbTLastX = x+m_dbTCurX;
	m_dbTLastY = y+m_dbTCurY;
	m_cDXF_Graph.LineToPoint((float)(m_dbTLastX),(float)(m_dbTLastY),RGB(0,255,0));
	
	ReleaseDC(pDC);
}

⌨️ 快捷键说明

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