Files
envi-code/SourceCode/Code2026/tg_shs/inc/Mep/CompareDwg.h
T
2026-09-28 15:28:50 +08:00

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_)