217 lines
5.6 KiB
C++
217 lines
5.6 KiB
C++
// CompareDwg.h: interface for the CCompareDwg class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#if !defined(AFX_COMPAREDWG_H__9909D595_BD3B_48A7_A304_F44AF2F1B673__INCLUDED_)
|
|
#define AFX_COMPAREDWG_H__9909D595_BD3B_48A7_A304_F44AF2F1B673__INCLUDED_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include <dbhatch.h>
|
|
#include <acedxref.h>
|
|
#include "DwgCompareDbMgr.h"
|
|
|
|
class TCompareEntity: public XCurveSegment
|
|
{
|
|
public:
|
|
TCompareEntity(const XCurveSegment &src)
|
|
{
|
|
m_eType = eCurve;
|
|
m_seg=src;
|
|
}
|
|
TCompareEntity(XPoint pt)
|
|
{
|
|
m_eType = ePoint;
|
|
m_ptLoc=pt;
|
|
}
|
|
TCompareEntity(XPoint p1, XPoint p2, XPoint p3, XPoint p4)
|
|
{
|
|
m_eType = eSolid;
|
|
m_p1=p1;
|
|
m_p2=p2;
|
|
m_p3=p3;
|
|
m_p4=p4;
|
|
}
|
|
TCompareEntity(XPoint p1, double dTextHeight, CString csText)
|
|
{
|
|
m_eType = eText;
|
|
m_ptLoc=p1;
|
|
m_dTextHeight=dTextHeight;
|
|
m_csText = csText;
|
|
}
|
|
//尺寸标注
|
|
TCompareEntity(XPoint p1, XPoint p2, XPoint p3, CString csText)
|
|
{
|
|
m_eType = eAlignedDimension;
|
|
m_p1=p1;
|
|
m_p2=p2;
|
|
m_p3=p3;
|
|
m_csText = csText;
|
|
}
|
|
bool operator == (const TCompareEntity &src) const
|
|
{
|
|
bool bRet = false;
|
|
switch(m_eType)
|
|
{
|
|
case eCurve:
|
|
if(m_seg == src.m_seg)
|
|
bRet = true;
|
|
break;
|
|
case ePoint:
|
|
if(m_ptLoc == src.m_ptLoc)
|
|
bRet = true;
|
|
break;
|
|
case eSolid:
|
|
if(m_p1 == src.m_p1 && m_p2 == src.m_p2 && m_p3 == src.m_p3 && m_p4 == src.m_p4)
|
|
bRet = true;
|
|
break;
|
|
case eText:
|
|
if(m_ptLoc == src.m_ptLoc && m_csText == src.m_csText && fabs(m_dTextHeight - src.m_dTextHeight) < 0.001)
|
|
bRet = true;
|
|
break;
|
|
case eAlignedDimension:
|
|
if(m_p1 == src.m_p1 && m_p2 == src.m_p2 && m_p3 == src.m_p3 && m_csText == src.m_csText)
|
|
bRet = true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return bRet;
|
|
}
|
|
|
|
enum ECmpEntType
|
|
{
|
|
eCurve = 0,//0: curve
|
|
ePoint = 1,//1: POINT
|
|
eSolid = 2,//2: solid
|
|
eText = 3,//3: TEXT
|
|
eAlignedDimension = 4,// 4:尺寸标注
|
|
};
|
|
|
|
XCurveSegment m_seg;
|
|
//int m_iType; //0: curve 1: POINT 2: solid 3: TEXT 4:尺寸标注
|
|
ECmpEntType m_eType; //实体类型
|
|
XPoint m_ptLoc; //位置
|
|
XPoint m_p1, m_p2, m_p3, m_p4;
|
|
CString m_csText;
|
|
double m_dTextHeight;
|
|
AcDbObjectId m_id; //实体id
|
|
};
|
|
//实体(图元)信息数据存储类
|
|
class CDataEntityList
|
|
{
|
|
public:
|
|
CDataEntityList();
|
|
CDataEntityList(int nCount); //m_dataDList初始添加nCount个元素
|
|
~CDataEntityList(); //释放m_dataDList中的每个DList
|
|
|
|
public:
|
|
int Length() const;
|
|
DList<TCompareEntity>& operator[](int n);
|
|
|
|
private:
|
|
std::vector< DList<TCompareEntity>* > m_dataDList;
|
|
};
|
|
|
|
class CCompareDwg
|
|
{
|
|
public:
|
|
CCompareDwg(void);
|
|
~CCompareDwg(void);
|
|
|
|
BOOL DoCompareFile();
|
|
BOOL DoCompareFile(CString csFileName1, CString csFileName2, CString csBlkName1, CString csBlkName2);
|
|
//设置是否分解块
|
|
void SetCmpBlockRef(BOOL bCmp){m_bCmpBlockRef = bCmp;}
|
|
//设置是否比对外部参照
|
|
void SetCmpXRef(BOOL bCmp){m_bCmpXref = bCmp;}
|
|
//设置分块行列数
|
|
void SetRowCol(int iRow, int iCol);
|
|
//设置是否处理图案填充
|
|
void SetCompareHatch(BOOL bCmpHatch){m_bCmpHatch = bCmpHatch;}
|
|
//设置比对类型 m_iCmpType //0,全图比对 1,局部比对 2,版本比对
|
|
void SetCmpType(int t){m_iCmpType = t;}
|
|
|
|
protected:
|
|
//对2张dwg文件进行比对
|
|
BOOL DoCompareFile(CDwgCompareDbMgr * pDbMgr1, CDwgCompareDbMgr * pDbMgr2);
|
|
//把文件导入本图,创建新块记录
|
|
AcDbObjectId InitBlockByFile(CDwgCompareDbMgr * pDbMgr);
|
|
|
|
//获取实体所在分块的下标
|
|
int GetIndexOfArea(AcDbExtents & extEnt);
|
|
|
|
//控制误差允许范围,超出范围返回:-1
|
|
virtual int GetIndexOfArea(AcDbExtents & extEnt, int iMaxValue);
|
|
|
|
//炸开后,分块处理,此时图中都是基本实体或特定类型的实体
|
|
void ProcessBlk(AcDbObjectId idBlock, int iColIdx, CDataEntityList &lstDwgRow);
|
|
//计算实体分块,设置颜色,pEnt处于打开状态
|
|
void ProcessEnt(AcDbEntity * pEnt, int iColIdx, CDataEntityList &lstData);
|
|
|
|
|
|
//炸开InitBlockByFile()导入的块,炸开后图中都是基本实体或特定类型的实体
|
|
BOOL DeepExplodeBlock(AcDbBlockTableRecord *pRec, CDwgCompareDbMgr * pDbMgr, CDataEntityList & dataList, int iColIdx);
|
|
|
|
|
|
//炸开操作,返回:1.炸开成功 0.不能炸开或不继续炸开 -1.其他情况
|
|
int ExplodeEntity(AcDbEntity* pEnt, AcDbVoidPtrArray& arpNewSet);
|
|
|
|
//最终简单图元进行比较
|
|
BOOL CompareCurve(DList<TCompareEntity> &lstDwg1, DList<TCompareEntity> &lstDwg2);
|
|
|
|
//对于图块特殊处理, 因为炸开后, 属性字不能正常显示, 这里新生成一个文字
|
|
void CreateAttributeText(AcDbBlockReference * pInsert, AcDbVoidPtrArray& arpNewSet);
|
|
|
|
//解除当前图纸所有图层关闭,冻结,锁定状态
|
|
BOOL ResetAllLayerStatus();
|
|
|
|
//计算导入后总体外包和分块单位
|
|
void SetExtent();
|
|
//局部比对外包计算
|
|
virtual void SetExtent(const AcDbExtents & ext1, const AcDbExtents & ext2);
|
|
|
|
//输出统计信息
|
|
void PrintInfo();
|
|
|
|
//比对信息写入记录文件
|
|
void WriteLogFile(double dTimeSecond);
|
|
void WriteLogFile(double dTimeSecond, CString csInfo);
|
|
|
|
protected:
|
|
int m_iRow; //行数
|
|
int m_iCol; //列数
|
|
AcDbExtents m_extBlk; //两个图纸外包之和
|
|
double m_dUnitX; //x坐标方向分割单位
|
|
double m_dUnitY; //y坐标方向分割单位
|
|
|
|
BOOL m_bCmpBlockRef; //块参照是否继续分解
|
|
BOOL m_bCmpHatch; //Hatch是否比对,Hatch炸开后的实体很多
|
|
BOOL m_bCmpXref; //是否比对外部参照,比对需要先转化外部参照
|
|
BOOL m_bAllLayer; //是否比对所有图层
|
|
std::vector< CString > m_vtLayer; //比对的图层
|
|
|
|
int m_iCmpType; //0,全图比对 1,局部比对 2,版本比对
|
|
|
|
std::map<CString, int> m_mapOtherEnt; //不能处理的实体类型
|
|
int m_iCountEnt; //超过10000个实体的区域个数
|
|
};
|
|
|
|
class CComparePartOfDwg : public CCompareDwg
|
|
{
|
|
public:
|
|
CComparePartOfDwg(void);
|
|
~CComparePartOfDwg(void);
|
|
|
|
//传入多段线,传出导出结果的文件路径
|
|
BOOL DoComparePartOfFile(Entity ent, CString & csPath);
|
|
|
|
protected:
|
|
int GetIndexOfArea(AcDbExtents & extEnt, int iMaxValue);
|
|
virtual void SetExtent(const AcDbExtents & ext1, const AcDbExtents & ext2);
|
|
};
|
|
|
|
#endif // !defined(AFX_COMPAREDWG_H__9909D595_BD3B_48A7_A304_F44AF2F1B673__INCLUDED_)
|