//-----------------------------------------------------------------------------+ // = FileName : TDocCreateLayer // = Version : ver2.0 // = Author : axc // = CreateDate : 2015-06-03 // = Description: 新建图纸时根据传进来的AcDbDatabase进行创建图层,将原来在 // Tch_UIPanelLayer里的文档编译器改成此种样式 //-----------------------------------------------------------------------------+ #ifndef __TDOCCREATELAYER_H__ #define __TDOCCREATELAYER_H__ #if _MSC_VER > 1000 #pragma once #endif #if (ADS > 16) #define UIFRAME_API __declspec( dllimport ) #endif template void deletePtr (T* &ptr) { if (!ptr) return; delete ptr; ptr = NULL; }; #define TARCH_INSTALL_DIRECTORY_INCLUDE_SYS _T("\\SYS\\") #define TARCH_LAYER_GROUP_FILE_NAME_XML _T("LayerGroup.XML") #define TARCH_LAYER_GROUP_NODE_NAME_CSTRING _T("Group") #define TARCH_LAYER_GROUP_NODE_SORT_CSTRING _T("Sort") #define TARCH_LAYER_GROUP_NODE_VALUE_CSTRING _T("name") #define TARCH_LAYER_GROUP_NODE_LAYERNAME_CSTRING _T("sKeyWord") #define TARCH_LAYER_NOT_CAEAT_STANDARD_LAYER _T("TArchNotCreat.txt") #define TARCH_CURRENT_LAYER_STANDARD_FILE_NAME _T("LAYERDEF.DAT") #define TARCH_CURRENT_LAYER_MANAGER_INIT_DATA _T("TArchLayerManagerInitData.ini") #include //图层的所有信息 struct SLayerRecord { AcDbObjectId idLayerObject; //图层ObjectId int iLayerState; //状态 0是当前层 1是使用中 2是未使用中 CString sKeyword; //图层关键字 CString sLayerName; //图层名 bool bLayerOff; //图层是否打开或关闭 bool bLayerFreeze; //图层是否冻结 bool bLayerLock; //图层是否锁定 AcCmColor cmColor; //颜色显示字符串 CString sLTypeName; //线型名字 AcDb::LineWeight iLayerLineWidth; //线宽 bool bLayerPlottable; //打印 bool bLayerNewFreeze; //新视口冻结 CString sLayerDescription; //说明 bool bIsRename; //标识是否可以重命名 bool bIsDel; //标志是否可以删除 bool bInGrp; //是否在分组里,该变量只在界面上起作用 SLayerRecord():idLayerObject(AcDbObjectId::kNull), iLayerState(2), sKeyword(_T("")), sLayerName(_T("")), bLayerOff(false), bLayerFreeze(false), bLayerLock(false), cmColor(AcCmColor()), sLTypeName(_T("Continuous")), iLayerLineWidth(AcDb::kLnWtByLwDefault), bLayerPlottable(true), bLayerNewFreeze(false), sLayerDescription(_T("")), bIsRename(true), bIsDel(true), bInGrp(false) { cmColor.setColorIndex(1); } ~SLayerRecord(){}; SLayerRecord(CString sName, AcDbObjectId idLayer = AcDbObjectId::kNull, int iState = 2, CString sWord = _T(""), bool bRename = true, bool bDel = true,bool bOpen = false, bool bFreeze = false, bool bLock = false, AcCmColor Color = AcCmColor(), CString sltypename = _T("Continuous"), AcDb::LineWeight iLineWidth = AcDb::kLnWtByLwDefault, bool bPlottable = true, bool bNewFreeze = false, CString bDescription = _T(""), bool bIn = false) { idLayerObject = idLayer; iLayerState = iState; sKeyword = sWord; bIsRename = bRename; bIsDel = bDel; sLayerName = sName; bLayerOff = bOpen; bLayerFreeze = bFreeze; bLayerLock = bLock; cmColor = Color; sLTypeName = sltypename; iLayerLineWidth = iLineWidth; bLayerPlottable = bPlottable; bLayerNewFreeze = bNewFreeze; sLayerDescription = bDescription; bInGrp = bIn; } void SetRecord(SLayerRecord* s1) { idLayerObject = s1->idLayerObject; bLayerFreeze = s1->bLayerFreeze; bLayerLock = s1->bLayerLock; bLayerNewFreeze = s1->bLayerNewFreeze; bLayerOff = s1->bLayerOff; bLayerPlottable = s1->bLayerPlottable; cmColor = s1->cmColor; iLayerLineWidth = s1->iLayerLineWidth; sLayerDescription = s1->sLayerDescription; iLayerState = s1->iLayerState; sLayerName = s1->sLayerName; sLTypeName = s1->sLTypeName; bIsRename = s1->bIsRename; bIsDel = s1->bIsDel; sKeyword = s1->sKeyword; bInGrp = s1->bInGrp; } }; //图层标准lay文件中的图层信息 struct SLayStandardRecord { CString sLayerKeyword; //图层关键字 CString sLayerName; //图层名 CString sColor; //颜色 CString sLineType; //线型 CString sDescription; //说明 SLayStandardRecord():sLayerKeyword(_T("")), sLayerName(_T("")), sColor(AcCmColor().colorNameForDisplay()), sLineType(_T("Continuous")), sDescription(_T("")){} ~SLayStandardRecord(){}; }; //记录xml文件中的图层分组结构和名字 struct SLayerGrpRecord { CString sGrpName; //显示内容 SLayerGrpRecord *pGrpParent; //父节点 std::vector arLayerGrpChild; //记录所有子节点 std::vector arContainLayerName; //记录包含的图层名 SLayerGrpRecord(): sGrpName(_T("")), pGrpParent(NULL){} SLayerGrpRecord(CString sName, SLayerGrpRecord *pParent) { sGrpName = sName; pGrpParent = pParent; } ~SLayerGrpRecord(){}; }; //记录当前文档的图层开、解冻、解锁各项的总个数 struct LayerRecordParamNum { public: int iLayerOffNum; int iLayerFreezonNum; int iLayerLockNum; LayerRecordParamNum(): iLayerOffNum(0), iLayerFreezonNum(0), iLayerLockNum(0){} ~LayerRecordParamNum(){}; }; class AcLyLayerFilter; class AcLyLayerFilterManager; class TDocCreateLayer { public: TDocCreateLayer(AcDbDatabase* pDatabase); ~TDocCreateLayer(); void DoCreateDocLayer(); protected: void InitWhetherCreatStandard(); //是否创建标准图层 void UpdateStandardLayer(); //当前图层标准切换时,修改记录的容器 void CreatNewDwgToInitLayerAndGroup(); //新建图纸要对图层和图层分组进行初始化 void InitStandardLayerData(); //读取标准lay文件中的图层信息 void InitJudgeRegistryIsWhole(); //判断注册表是否完好并获取安装文件路径 void InitNewDocToCreatStandardLayer(); //对于新建的文档,要新建出标准文件中的图层和默认图层分组 void UpdateLayerInUseStateByCAD(); void InitarSystemGrpFilterImplementationDetails(AcLyLayerFilter *pFilter);//初始化CAD系统原有的图层分组实现细节 void ReadLayerFromTextFile(CStdioFile *fp, std::vector* pLayerStandard);//读取lay文件初始化标准文件的记录容器 void InitNotCreatStandardLayer(); //读取图层标准里不新建的图层 void InitarSystemGrpFilter(); //初始化CAD系统原有的图层分组,在后续上华实现中将过滤掉 void InitFirstSetGrpFilter(); //初始化设置图层分组 void InitStandardGrpRoot(); //按照xml文件进行初始化图层分组信息 void GetCurFilterGrpNameByCAD(); //获取当前图层分组名字,为m_sCurFilterGrpName赋值 void InitDocLayerRecordParamNumMap(); //启动时初始化m_arAllDocLayerRecordParamNumHeader变量 void ChangeDocToChangeLayerRecordParamNum(); //切换文档时需要m_pCurLayerRecordParamNumHeader进行重置 void InitNewDocToCreatLayerGroup(); //对于新建的文档,要新建出上华默认图层分组 void AddLayerFilterGroupNode(AcLyLayerFilter *pFilterGroup, SLayerGrpRecord *pParent, AcLyLayerFilterManager *&pAclyMager, AcLyLayerFilter *&pFilterRoot, AcLyLayerFilter *&pCurRoot, bool bOk = false);//向CAD指定图层分组结点下添加子节点 void GetCADAcLyLayerFilterByName(CString sGrpName, AcLyLayerFilter* &pFilter, AcLyLayerFilter* &pFilterRoot, AcLyLayerFilter* &pCurRoot, bool bIsXref);//通过图层分组名字来获取CAD的图层分组结点指针 void RecursionGetCADGrpFilter(CString sGrpName, AcLyLayerFilter* pFilter, bool &bOk, AcLyLayerFilter* &pGetFilter, bool bIsXref, bool &bHaveXref); //递归查找图层分组结点 void InitCurLayerRecordHeader(); //初始化m_pCurLayerRecordHeader指针 void InitClassifyStandardLayerToGroup(); //将图层进行上华默认规则的分类到图层分组里 bool ReadLayerGrpFromXMLFile(SLayerGrpRecord *pRoot, CString sGrpXml, bool bIsSort = false); //读取xml初始化SLayerGrpRecord根节点指针 void InitClassifyStandardLayerToGroupImplementationDetails(AcLyLayerFilter *pFilterGroup, SLayerGrpRecord *pGrpRecord); //将图层进行上华默认规则的分类到图层分组里实现细节 void GetLayerObjectIDByLayerKeyWord(AcDbObjectId &layerId, CString sKeyWord); //根据图层关键字取得id private: bool m_bWhetherCreatStandardLayer; //是否创建上华标准图层 std::vector m_arStandardLayerRecord; //记录标准lay文件中的图层信息 std::vector m_arSystemGrpFilter; //CAD系统原有的图层分组,在后续上华实现中将过滤掉 std::vector m_arNotCreatStandardLayer; //图层标准里不新建的图层 std::list m_pCurLayerRecordHeader; //当前文档图层所有 //所有文档的图层的开、解锁、解冻状态记录,参数1是文档名字 std::map m_arAllDocLayerRecordParamNumHeader; //当前文档的图层的开、解锁、解冻状态记录 LayerRecordParamNum * m_pCurLayerRecordParamNumHeader; SLayerGrpRecord * m_pLayerGrpRoot; //记录xml文件中的图层分组结构 AcDbDatabase* m_pDatabase; //需要创建图层的数据库 CString m_sInstallDirectory; //上华软件安装路径 CString m_sCurFilterGrpName; //当前选定图层分组的名字 bool m_bRegistryIsExist; //注册表是否存在 bool m_bTarchLayIsExist; //上华标准图层文件是否存在 bool m_bFilterIsExist; //上华图层分组xml是否存在 bool m_bNotCreatLayer; //不新建的标准文件是否存在 bool m_bValidModify; int m_iGrpFilterSort; // 排序方式,目前只有两种,但考虑到需求变动,还是把类型定为int型, 0先按xml排序, 1直接都按拼音排序 }; #endif//__TDocCreateLayer_H__