205 lines
8.8 KiB
C++
205 lines
8.8 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// = 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 <class T>
|
|
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 <list>
|
|
//图层的所有信息
|
|
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<SLayerGrpRecord*> arLayerGrpChild; //记录所有子节点
|
|
std::vector<CString> 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<SLayStandardRecord*>* 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<SLayStandardRecord*> m_arStandardLayerRecord; //记录标准lay文件中的图层信息
|
|
std::vector<CString> m_arSystemGrpFilter; //CAD系统原有的图层分组,在后续上华实现中将过滤掉
|
|
std::vector<CString> m_arNotCreatStandardLayer; //图层标准里不新建的图层
|
|
std::list<SLayerRecord*> m_pCurLayerRecordHeader; //当前文档图层所有
|
|
//所有文档的图层的开、解锁、解冻状态记录,参数1是文档名字
|
|
std::map<CString, LayerRecordParamNum*> 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__
|