// 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 #include #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& operator[](int n); private: std::vector< DList* > 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 &lstDwg1, DList &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 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_)