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

📄 dxf_datas.cpp

📁 DXF数据提取
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DXF_Datas.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include "DXF_Datas.h"



/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "math.h"
class CPointInf{
public:
	double x;
	double y;
};

class CSingleGraph{
public:
	CString NAME;
	int LWPOLYLINE_NUM;
	float x,x1;
	float y,y1;
	float z,z1;
	float r;
};

class CNodeInf{
public :
	CString NAME;
	int dir;
	int SPNum;
	double x,x1;
	double y,y1;
	double z,z1;
	double r;
	double angle1;
	double angle2;
	double *BSplineX;
	double *BSplineY;
};

class CNode{
public :
	DWORD NAME;
	int dir;
	int SPNum;
	double x,x1;
	double y,y1;
	double z,z1;
	double r;
	double angle1;
	double angle2;
	double *BSplineX;
	double *BSplineY;
};
class CInf{
public :
	DWORD type,sign;
	int SPNum;
	float x,y,r,angle1,angle2;
	double *BSplineX;
	double *BSplineY;
};
#include <afxtempl.h>

	CSingleGraph m_cSingleGh;
	CArray<CSingleGraph,CSingleGraph&> m_cSingleGhArray;
    CNodeInf m_cNodeInf;
	CArray<CNodeInf,CNodeInf&> m_cNodeInfArray;
    CNode m_cNode;
    CArray<CNode,CNode&> m_cNodeArray;
	CPointInf m_cPointInf;
	CArray<CPointInf,CPointInf&> m_cPointInfArray;
	CInf m_cInf;
    CArray<CInf,CInf&> m_cInfArray;
	double m_Endx,m_Endy,m_Maxx,m_Maxy,m_Minx,m_Miny;
	int m_nFlag;     //数据单元顺序优化标记
	int m_nDatasNum;
	int m_nCurNum;   //当前数据单元标记
//	int m_nSingleGFCurNum;
	DWORD type,sign;
	float x,y,angle;
	int sp_flag;     //样条曲线标记
	BOOL m_bSingleGraph; //单一闭合图形标记

    void ChangeGradation(double x0, double y0);

int GF_Init()
{
	sp_flag=0;
    m_nCurNum=0;
	m_bSingleGraph = FALSE;
//	m_nSingleGFCurNum=0;
	return 0;
}

int GF_LoadDXFFile(char* FileName)
{
	CStdioFile m_cDXF;
	int Num,i,flag=0;    //falg--文件读取跳出标记
	CString stri;
	m_cNodeInfArray.RemoveAll();  //该链表保存全部数据单元(数据单元顺序没有优化)
	m_cPointInfArray.RemoveAll(); //该链表保存各数据单元的边界点数据,用于取得能包
	                              //含全部图形的最小矩形区域的边界参数
	m_cSingleGhArray.RemoveAll(); //该链表保存单一图形数据,如:圆,多边形
	if (FileName==NULL)
	{
		return 0;
	}
	if (FileName!=NULL)
	{
		m_cDXF.Open(FileName,CFile::modeRead);
	    do
		{
	       m_cDXF.ReadString(stri);
		}
	    while(stri!="ENTITIES");
	    for(;;)
		{
	       do
		   {
	 	     m_cDXF.ReadString(stri);
	         if(stri=="ENDSEC")
			 {
		        flag=1;
		        break;
			 }
		   }
	       while (stri!="LINE" && stri!="ARC" && stri!="SPLINE" 
				  && stri!="CIRCLE" && stri!="LWPOLYLINE");
	       if(flag==1)
		   {
		      break;
		   }
		   ///////////////////////////////////////////////////////////////////////
		   //单一图形处理保存(圆,多边形)
		   if (stri=="CIRCLE")
		   {
			   double x,y;
			   m_cSingleGh.NAME=stri;
			   m_cSingleGh.LWPOLYLINE_NUM=0;
			   do
			   {
				   m_cDXF.ReadString(stri);
			   }
			   while (stri!="AcDbCircle");
			   for (i=1;i<=2;i++)
			   {
				   m_cDXF.ReadString(stri);
			   }
			   m_cSingleGh.x=(float)atof(stri);
 			   x=atof(stri);
			   for (i=1;i<=2;i++)
			   {
				   m_cDXF.ReadString(stri);
			   }
			   m_cSingleGh.y=(float)atof(stri);
			   y=atof(stri);
			   for (i=1;i<=2;i++)
			   {
				   m_cDXF.ReadString(stri);
			   }
			   m_cSingleGh.z=(float)atof(stri);
			   for (i=1;i<=2;i++)
			   {
				   m_cDXF.ReadString(stri);
			   }
			   m_cSingleGh.r=(float)atof(stri);
			   m_cPointInf.x=atof(stri)+x;
			   m_cPointInf.y=atof(stri)+y;
			   m_cPointInfArray.Add(m_cPointInf);
			   m_cPointInf.x=-atof(stri)+x;
			   m_cPointInf.y=-atof(stri)+y;
			   m_cPointInfArray.Add(m_cPointInf);
			   m_cPointInf.x=-atof(stri)+x;
			   m_cPointInf.y=atof(stri)+y;
			   m_cPointInfArray.Add(m_cPointInf);
			   m_cPointInf.x=atof(stri)+x;
			   m_cPointInf.y=-atof(stri)+y;
			   m_cPointInfArray.Add(m_cPointInf);
			   m_cSingleGh.x1=0;
			   m_cSingleGh.y1=0;
			   m_cSingleGh.z1=0;
			   m_cSingleGhArray.Add(m_cSingleGh);
		   }
		   
		   if (stri=="LWPOLYLINE")
		   {
			   int i,j,t;
			   float fFirstX,fFirstY;
			   m_cSingleGh.NAME=stri;
			   do
			   {
				   m_cDXF.ReadString(stri);
			   }
			   while (stri!="AcDbPolyline");
			   for (i=1;i<=2;i++)
			   {
				   m_cDXF.ReadString(stri);
			   }
			   stri.TrimLeft(' ');
//			   AfxMessageBox("多边形边数:"+stri);
			   j = atoi(stri);
			   m_cSingleGh.LWPOLYLINE_NUM=j;
			   for (i=1;i<=4;i++)
			   {
				   m_cDXF.ReadString(stri);
			   }
			   for (i=1;i<=2;i++)
			   {
				   m_cDXF.ReadString(stri);
			   }
			   m_cSingleGh.x=(float)atof(stri);
			   fFirstX = m_cSingleGh.x;
			   m_cPointInf.x=atof(stri);
			   for (i=1;i<=2;i++)
			   {
				   m_cDXF.ReadString(stri);
			   }
			   m_cSingleGh.y=(float)atof(stri);
			   fFirstY = m_cSingleGh.y;
			   m_cPointInf.y=atof(stri);
			   m_cPointInfArray.Add(m_cPointInf);
			   m_cSingleGhArray.Add(m_cSingleGh);
			   for (t=1;t<j;t++)
			   {
				   for (i=1;i<=2;i++)
				   {
					   m_cDXF.ReadString(stri);
				   }
				   m_cSingleGh.x=(float)atof(stri);
				   m_cPointInf.x=atof(stri);
				   for (i=1;i<=2;i++)
				   {
					   m_cDXF.ReadString(stri);
				   }
				   m_cSingleGh.y=(float)atof(stri);
				   m_cPointInf.y=atof(stri);
				   m_cPointInfArray.Add(m_cPointInf);
				   m_cSingleGh.z=0;
				   m_cSingleGh.x1=0;
				   m_cSingleGh.y1=0;
				   m_cSingleGh.z1=0;
				   m_cSingleGh.r=0;
				   m_cSingleGhArray.Add(m_cSingleGh);
			   }
			   m_cSingleGh.x = fFirstX;
			   m_cSingleGh.y = fFirstY;
			   m_cSingleGhArray.Add(m_cSingleGh);
		   }
		   //以上为单一图形处理保存(圆,多边形)
		   ///////////////////////////////////////////////////////////////////////
		   if (stri=="LINE")
		   {
		     m_cNodeInf.NAME=stri;
		     m_cNodeInf.dir=0;
             do
			 {
			    m_cDXF.ReadString(stri);
			 }
		     while (stri!="AcDbLine");
		     for (i=1;i<=2;i++)
			 {
               m_cDXF.ReadString(stri);
			 }
		     m_cNodeInf.x=atof(stri);
			 m_cPointInf.x=atof(stri);
		     for (i=1;i<=2;i++)
			 {
                m_cDXF.ReadString(stri);
			 }
		     m_cNodeInf.y=atof(stri);
			 m_cPointInf.y=atof(stri);
			 m_cPointInfArray.Add(m_cPointInf);
		     for (i=1;i<=2;i++)
			 {
                m_cDXF.ReadString(stri);
			 }
		     m_cNodeInf.z=atof(stri);
		     for (i=1;i<=2;i++)
			 {
                m_cDXF.ReadString(stri);
			 }
		     m_cNodeInf.x1=atof(stri);
			 m_cPointInf.x=atof(stri);
		     for (i=1;i<=2;i++)
			 {
                m_cDXF.ReadString(stri);
			 }
		     m_cNodeInf.y1=atof(stri);
			 m_cPointInf.y=atof(stri);
			 m_cPointInfArray.Add(m_cPointInf);
		     for (i=1;i<=2;i++)
			 {
                m_cDXF.ReadString(stri);
			 }
		     m_cNodeInf.z1=atof(stri);
		     m_cNodeInf.angle1=0;
		     m_cNodeInf.angle2=0;
		     m_cNodeInf.r=0;
		     m_cNodeInfArray.Add(m_cNodeInf);
		   }
	       if (stri=="ARC")
		   {
			 double x,y;
             m_cNodeInf.NAME=stri;
		     m_cNodeInf.dir=1;
             do
			 {
			    m_cDXF.ReadString(stri);
			 }
		     while (stri!="AcDbCircle");
		     for (i=1;i<=2;i++)
			 {
                m_cDXF.ReadString(stri);
			 }
		     m_cNodeInf.x=atof(stri);
			 x=atof(stri);
		     for (i=1;i<=2;i++)
			 {
                m_cDXF.ReadString(stri);
			 }
		     m_cNodeInf.y=atof(stri);
			 y=atof(stri);
		     for (i=1;i<=2;i++)
			 {
                m_cDXF.ReadString(stri);
			 }
		     m_cNodeInf.z=atof(stri);
		     for (i=1;i<=2;i++)
			 {
                m_cDXF.ReadString(stri);
			 }
		     m_cNodeInf.r=atof(stri);
			 m_cPointInf.x=atof(stri)+x;
		     m_cPointInf.y=atof(stri)+y;
		     m_cPointInfArray.Add(m_cPointInf);
		     m_cPointInf.x=-atof(stri)+x;
		     m_cPointInf.y=-atof(stri)+y;
		     m_cPointInfArray.Add(m_cPointInf);
		     for (i=1;i<=4;i++)
			 {
                m_cDXF.ReadString(stri);
			 }
		     m_cNodeInf.angle1=atof(stri);
		     for (i=1;i<=2;i++)
			 {
                m_cDXF.ReadString(stri);
			 }
		     m_cNodeInf.angle2=atof(stri);
             m_cNodeInf.x1=0;
		     m_cNodeInf.y1=0;
		     m_cNodeInf.z1=0;
		     m_cNodeInfArray.Add(m_cNodeInf);
		   }
/////////////////////////////////    SPLINE    ////////////////////////////////
		   if (stri=="SPLINE")
		   {
			   sp_flag=1;
			   int ItemNum,z;
			   double itemX,itemY;
			   m_cNodeInf.NAME=stri;
			   m_cNodeInf.dir=0;
			   do
			   {
			       m_cDXF.ReadString(stri);
			   }
		       while (stri!="AcDbSpline");
			   for (i=1;i<=14;i++)
			   {
                   m_cDXF.ReadString(stri);
			   }
               for(i=0;i<=5;i++)
			   {
	               if(stri.GetAt(i)!=' ')
		           break;               
			   }
	           stri=stri.Right(6-i);
			   m_cNodeInf.SPNum=atoi(stri);//取得控制点数目
			   ItemNum=atoi(stri);
			   m_cNodeInf.BSplineX=new double [ItemNum];
			   m_cNodeInf.BSplineY=new double [ItemNum];
               do
			   {
               	   m_cDXF.ReadString(stri);
               } while(stri!=" 10");
			   m_cDXF.ReadString(stri);
			   m_cPointInf.x=atof(stri);
			   itemX=atof(stri);
			   m_cNodeInf.BSplineX[0]=*((double*)(&itemX));
			   for (i=1;i<=2;i++)
			   {
                   m_cDXF.ReadString(stri);
			   }
			   m_cPointInf.y=atof(stri);
               m_cPointInfArray.Add(m_cPointInf);
			   itemY=atof(stri);
			   m_cNodeInf.BSplineY[0]=*((double*)(&itemY));
			   for (i=1;i<=2;i++)
			   {
                   m_cDXF.ReadString(stri);
			   }
			   for (i=1;i<=ItemNum-1;i++)
			   {
				   for (z=1;z<=2;z++)
				   {
                       m_cDXF.ReadString(stri);
				   }
				   m_cPointInf.x=atof(stri);
				   itemX=atof(stri);
			       m_cNodeInf.BSplineX[i]=*((double*)(&itemX));
				   for (z=1;z<=2;z++)
				   {
                       m_cDXF.ReadString(stri);
				   }
				   m_cPointInf.y=atof(stri);
				   m_cPointInfArray.Add(m_cPointInf);
				   itemY=atof(stri);
			       m_cNodeInf.BSplineY[i]=*((double*)(&itemY));
				   for (z=1;z<=2;z++)
				   {
                       m_cDXF.ReadString(stri);
				   }
			   }
			   m_cNodeInfArray.Add(m_cNodeInf);
		   }
		  //**********************************************************// 
		}//for(;;)
		m_cDXF.Close();

		if(m_cNodeInfArray.GetSize())
		{
			m_bSingleGraph = TRUE;
			//取得多段线闭合图形起始单元的结束点
			double pi=3.1415926/180;
			m_cNodeArray.RemoveAll();  //该链表保存顺序优化后的全部单元数据
			
									   /*先取得第一个数据单元的结束点信息,将该点与下一个数据单元的起始点进行比较,如果
									   两点相同或差值不大于0.01,则将该数据单元作为新链表的第二个单元,依次类推,优化数
			据单元顺序*/
			m_cNodeInf=m_cNodeInfArray.GetAt(0);
			if (m_cNodeInf.NAME=="LINE")
			{
				m_cNode.NAME=0x00030001;
			}
			if (m_cNodeInf.NAME=="ARC")
			{
				m_cNode.NAME=0x00060002;
			}
			if (m_cNodeInf.NAME=="SPLINE")
			{
				m_cNode.NAME=0x00090001;
				m_cNode.BSplineX=new double [m_cNodeInf.SPNum];
				m_cNode.BSplineY=new double [m_cNodeInf.SPNum];
				for(int k=0;k<=m_cNodeInf.SPNum-1;k++)
				{
					m_cNode.BSplineX[k]=m_cNodeInf.BSplineX[k];
					m_cNode.BSplineY[k]=m_cNodeInf.BSplineY[k];
				}
			}
			m_cNode.dir=m_cNodeInf.dir;
			m_cNode.SPNum=m_cNodeInf.SPNum;
			m_cNode.angle1=m_cNodeInf.angle1;
			m_cNode.angle2=m_cNodeInf.angle2;
			m_cNode.x=m_cNodeInf.x;
			m_cNode.x1=m_cNodeInf.x1;
			m_cNode.y=m_cNodeInf.y;
			m_cNode.y1=m_cNodeInf.y1;
			m_cNode.z=m_cNodeInf.z;
			m_cNode.z1=m_cNodeInf.z1;
			m_cNode.r=m_cNodeInf.r;
			m_cNodeArray.Add(m_cNode);
			m_nFlag=0;
			if (m_cNodeInf.NAME=="ARC")
			{
				m_Endx=m_cNodeInf.x+m_cNodeInf.r*cos(m_cNodeInf.angle2*pi);
				m_Endy=m_cNodeInf.y+m_cNodeInf.r*sin(m_cNodeInf.angle2*pi);
			}
			if (m_cNodeInf.NAME=="LINE")
			{
				m_Endx=m_cNodeInf.x1;
				m_Endy=m_cNodeInf.y1;
			}
			if (m_cNodeInf.NAME=="SPLINE")
			{
				m_Endx=*((double *)(&m_cNodeInf.BSplineX[m_cNodeInf.SPNum-1]));
				m_Endy=*((double *)(&m_cNodeInf.BSplineY[m_cNodeInf.SPNum-1]));
			}
			Num=m_cNodeInfArray.GetSize();
			for (i=1;i<=(Num-1);i++)
			{
				ChangeGradation(m_Endx, m_Endy);  //优化顺序
			}
			if (sp_flag==1)
			{
				delete m_cNodeInf.BSplineX;
				delete m_cNodeInf.BSplineY;
			}
			
			//数据格式转换
			
			int CNodeNum,l;
			m_cInfArray.RemoveAll();/*将优化后的数据按约定的格式保存到该链表中*/
			CNodeNum=m_cNodeArray.GetSize();
			for (l=0;l<=(CNodeNum-1);l++)
			{
				m_cNode=m_cNodeArray.GetAt(l);
				if(m_cNode.NAME==0x00030001)
				{
					m_cInf.type=m_cNode.NAME;
					m_cInf.sign=0x00000003;
					m_cInf.x=(float)(m_cNode.x);
					m_cInf.y=(float)(m_cNode.y);
					m_cInf.angle1=0;
					m_cInf.angle2=0;
					m_cInf.r=0;
					m_cInfArray.Add(m_cInf);
					m_cInf.type=m_cNode.NAME;
					m_cInf.sign=0x00000004;
					m_cInf.x=(float)(m_cNode.x1);
					m_cInf.y=(float)(m_cNode.y1);
					m_cInf.angle1=0;
					m_cInf.angle2=0;
					m_cInf.r=0;
					m_cInfArray.Add(m_cInf);
				}
				if(m_cNode.NAME==0x00090001)

⌨️ 快捷键说明

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