📄 dxffile.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 + -