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

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__