📄 dxf_datas.cpp
字号:
// 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 + -